add notifications to the openapi spec
[oweals/peertube.git] / support / doc / api / openapi.yaml
index 6197a431faba4a0276b685bd37f07c3c49b2eae8..0afa5870988346cb706383419409037c8da87fda 100644 (file)
@@ -1,7 +1,7 @@
 openapi: 3.0.0
 info:
   title: PeerTube
-  version: 2.1.1
+  version: 2.2.0
   contact:
     name: PeerTube Community
     url: 'https://joinpeertube.org'
@@ -15,10 +15,13 @@ info:
     # Introduction
 
     The PeerTube API is built on HTTP(S) and is RESTful. You can use your favorite
-    HTTP/REST library for your programming language to use PeerTube. No official
-    SDK is currently provided, but the spec API is fully compatible with
+    HTTP/REST library for your programming language to use PeerTube. The spec API is fully compatible with
     [openapi-generator](https://github.com/OpenAPITools/openapi-generator/wiki/API-client-generator-HOWTO)
-    which generates a client SDK in the language of your choice.
+    which generates a client SDK in the language of your choice - we generate some client SDKs automatically:
+
+    - [Python](https://framagit.org/framasoft/peertube/clients/python)
+    - [Go](https://framagit.org/framasoft/peertube/clients/go)
+    - [Kotlin](https://framagit.org/framasoft/peertube/clients/kotlin)
 
     See the [Quick Start guide](https://docs.joinpeertube.org/#/api-rest-getting-started) so you can play with the PeerTube API.
 
@@ -71,10 +74,13 @@ tags:
       Operations dealing with listing, uploading, fetching or modifying videos.
   - name: Search
     description: |
-      The search helps to find _videos_ from within the instance and beyond.
+      The search helps to find _videos_ or _channels_ from within the instance and beyond.
       Videos from other instances federated by the instance (that is, instances
       followed by the instance) can be found via keywords and other criteria of
       the advanced search.
+
+      Administrators can also enable the use of a remote search system, indexing
+      videos and channels not could be not federated by the instance.
   - name: Video Comments
     description: >
       Operations dealing with comments to a video. Comments are organized in
@@ -85,15 +91,17 @@ tags:
       and/or channels.
   - name: Video Channels
     description: >
-      Operations dealing with creation, modification and video listing of a
-      user's channels.
-  - name: Video Blacklist
+      Operations dealing with the creation, modification and listing of videos within a channel.
+  - name: Video Blocks
     description: >
-      Operations dealing with blacklisting videos (removing them from view and
+      Operations dealing with blocking videos (removing them from view and
       preventing interactions).
   - name: Video Rates
     description: >
       Like/dislike a video.
+  - name: Feeds
+    description: >
+      Server syndication feeds
 x-tagGroups:
   - name: Accounts
     tags:
@@ -101,23 +109,26 @@ x-tagGroups:
       - Users
       - My User
       - My Subscriptions
+      - My Notifications
   - name: Videos
     tags:
       - Video
       - Video Caption
       - Video Channels
       - Video Comments
-      - Video Following
       - Video Rates
       - Video Playlists
       - Video Ownership Change
+      - Feeds
   - name: Search
     tags:
       - Search
   - name: Moderation
     tags:
       - Video Abuses
-      - Video Blacklist
+      - Video Blocks
+      - Account Blocks
+      - Server Blocks
   - name: Instance Configuration
     tags:
       - Config
@@ -140,6 +151,8 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/Account'
+        '404':
+          description: account not found
   '/accounts/{name}/videos':
     get:
       tags:
@@ -148,6 +161,17 @@ paths:
       summary: 'List videos of an account'
       parameters:
         - $ref: '#/components/parameters/name'
+        - $ref: '#/components/parameters/categoryOneOf'
+        - $ref: '#/components/parameters/tagsOneOf'
+        - $ref: '#/components/parameters/tagsAllOf'
+        - $ref: '#/components/parameters/licenceOneOf'
+        - $ref: '#/components/parameters/languageOneOf'
+        - $ref: '#/components/parameters/nsfw'
+        - $ref: '#/components/parameters/filter'
+        - $ref: '#/components/parameters/skipCount'
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/videosSort'
       responses:
         '200':
           description: successful operation
@@ -303,7 +327,7 @@ paths:
     delete:
       security:
         - OAuth2:
-            - admin
+          - admin
       tags:
         - Instance Follows
       summary: Unfollow a server
@@ -339,8 +363,25 @@ paths:
     get:
       tags:
         - Instance Follows
-      summary: List instance followings
+      summary: List instances followed by the server
       parameters:
+        - name: state
+          in: query
+          schema:
+            type: string
+            enum:
+              - pending
+              - accepted
+        - name: actorType
+          in: query
+          schema:
+            type: string
+            enum:
+              - Person
+              - Application
+              - Group
+              - Service
+              - Organization
         - $ref: '#/components/parameters/start'
         - $ref: '#/components/parameters/count'
         - $ref: '#/components/parameters/sort'
@@ -363,11 +404,19 @@ paths:
       responses:
         '204':
           description: successful operation
+        '500':
+          description: cannot follow a non-HTTPS server
       requestBody:
         content:
           application/json:
             schema:
-              $ref: '#/components/schemas/Follow'
+              type: object
+              properties:
+                hosts:
+                  type: array
+                  items:
+                    type: string
+                  uniqueItems: true
   /users:
     post:
       summary: Create a user
@@ -630,9 +679,17 @@ paths:
         - My Subscriptions
         - Videos
       parameters:
+        - $ref: '#/components/parameters/categoryOneOf'
+        - $ref: '#/components/parameters/tagsOneOf'
+        - $ref: '#/components/parameters/tagsAllOf'
+        - $ref: '#/components/parameters/licenceOneOf'
+        - $ref: '#/components/parameters/languageOneOf'
+        - $ref: '#/components/parameters/nsfw'
+        - $ref: '#/components/parameters/filter'
+        - $ref: '#/components/parameters/skipCount'
         - $ref: '#/components/parameters/start'
         - $ref: '#/components/parameters/count'
-        - $ref: '#/components/parameters/sort'
+        - $ref: '#/components/parameters/videosSort'
       responses:
         '200':
           description: successful operation
@@ -669,6 +726,102 @@ paths:
       responses:
         '200':
           description: successful operation
+  /users/me/notifications:
+    get:
+      summary: List my notifications
+      security:
+        - OAuth2: []
+      tags:
+        - My Notifications
+      parameters:
+        - name: unread
+          in: query
+          description: only list unread notifications
+          schema:
+            type: boolean
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/sort'
+      responses:
+        '200':
+          description: successful operation
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/NotificationListResponse'
+  /users/me/notifications/read:
+    post:
+      summary: Mark notifications as read by their id
+      security:
+        - OAuth2: []
+      tags:
+        - My Notifications
+      requestBody:
+        content:
+          multipart/form-data:
+            schema:
+              type: object
+              properties:
+                ids:
+                  type: array
+                  description: ids of the notifications to mark as read
+                  items:
+                    type: integer
+              required:
+                - ids
+      responses:
+        '204':
+          description: successful operation
+  /users/me/notifications/read-all:
+    post:
+      summary: Mark all my notification as read
+      security:
+        - OAuth2: []
+      tags:
+        - My Notifications
+      responses:
+        '204':
+          description: successful operation
+  /users/me/notification-settings:
+    put:
+      summary: Update my notification settings
+      security:
+        - OAuth2: []
+      tags:
+        - My Notifications
+      requestBody:
+        content:
+          multipart/form-data:
+            schema:
+              type: object
+              properties:
+                newVideoFromSubscription:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                newCommentOnMyVideo:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                videoAbuseAsModerator:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                videoAutoBlacklistAsModerator:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                blacklistOnMyVideo:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                myVideoPublished:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                myVideoImportFinished:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                newFollow:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                newUserRegistration:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                commentMention:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                newInstanceFollower:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+                autoInstanceFollowing:
+                  $ref: '#/components/schemas/NotificationSettingValue'
+      responses:
+        '204':
+          description: successful operation
   /users/me/avatar/pick:
     post:
       summary: Update my user avatar
@@ -718,6 +871,10 @@ paths:
       responses:
         '204':
           description: successful operation
+        '403':
+          description: cannot terminate an ownership change of another user
+        '404':
+          description: video owneship change not found
   '/videos/ownership/{id}/refuse':
     post:
       summary: Refuse ownership change request
@@ -730,6 +887,10 @@ paths:
       responses:
         '204':
           description: successful operation
+        '403':
+          description: cannot terminate an ownership change of another user
+        '404':
+          description: video owneship change not found
   '/videos/{id}/give-ownership':
     post:
       summary: Request ownership change
@@ -754,7 +915,9 @@ paths:
         '204':
           description: successful operation
         '400':
-          description: 'Changing video ownership to a remote account is not supported yet'
+          description: changing video ownership to a remote account is not supported yet
+        '404':
+          description: video not found
   /videos:
     get:
       summary: List videos
@@ -768,6 +931,7 @@ paths:
         - $ref: '#/components/parameters/languageOneOf'
         - $ref: '#/components/parameters/nsfw'
         - $ref: '#/components/parameters/filter'
+        - $ref: '#/components/parameters/skipCount'
         - $ref: '#/components/parameters/start'
         - $ref: '#/components/parameters/count'
         - $ref: '#/components/parameters/videosSort'
@@ -1007,7 +1171,7 @@ paths:
                   format: binary
                 channelId:
                   description: Channel id that will contain this video
-                  type: number
+                  type: integer
                 thumbnailfile:
                   description: Video thumbnail file
                   type: string
@@ -1047,6 +1211,7 @@ paths:
                   type: array
                   minItems: 1
                   maxItems: 5
+                  uniqueItems: true
                   items:
                     type: string
                     minLength: 2
@@ -1105,13 +1270,6 @@ paths:
         - OAuth2: []
       tags:
         - Video
-      responses:
-        '200':
-          description: successful operation
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/VideoUploadResponse'
       requestBody:
         content:
           multipart/form-data:
@@ -1130,7 +1288,7 @@ paths:
                   type: string
                 channelId:
                   description: Channel id that will contain this video
-                  type: number
+                  type: integer
                 thumbnailfile:
                   description: Video thumbnail file
                   type: string
@@ -1189,13 +1347,24 @@ paths:
                 contentType: image/jpeg
               previewfile:
                 contentType: image/jpeg
+      responses:
+        '200':
+          description: successful operation
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/VideoUploadResponse'
+        '409':
+          description: HTTP or Torrent/magnetURI import not enabled
+        '400':
+          description: '`magnetUri` or `targetUrl` or a torrent file missing'
   /videos/abuse:
     get:
       summary: List video abuses
       security:
         - OAuth2:
-            - admin
-            - moderator
+          - admin
+          - moderator
       tags:
         - Video Abuses
       parameters:
@@ -1222,6 +1391,7 @@ paths:
       parameters:
         - $ref: '#/components/parameters/idOrUUID'
       requestBody:
+        required: true
         content:
           application/json:
             schema:
@@ -1230,6 +1400,28 @@ paths:
                 reason:
                   description: Reason why the user reports this video
                   type: string
+                predefinedReasons:
+                  description: Reason categories that help triage reports
+                  type: array
+                  items:
+                    type: string
+                    enum:
+                    - violentOrAbusive
+                    - hatefulOrAbusive
+                    - spamOrMisleading
+                    - privacy
+                    - rights
+                    - serverRules
+                    - thumbnails
+                    - captions
+                startAt:
+                  type: integer
+                  description: Timestamp in the video that marks the beginning of the report
+                endAt:
+                  type: integer
+                  description: Timestamp in the video that marks the ending of the report
+              required:
+                - reason
       responses:
         '204':
           description: successful operation
@@ -1245,6 +1437,8 @@ paths:
       responses:
         '204':
           description: successful operation
+        '404':
+          description: video abuse not found
       parameters:
         - $ref: '#/components/parameters/idOrUUID'
         - $ref: '#/components/parameters/abuseId'
@@ -1270,46 +1464,50 @@ paths:
       responses:
         '204':
           description: successful operation
+        '404':
+          description: block not found
       parameters:
         - $ref: '#/components/parameters/idOrUUID'
         - $ref: '#/components/parameters/abuseId'
 
   '/videos/{id}/blacklist':
     post:
-      summary: Blacklist a video
+      summary: Block a video
       security:
         - OAuth2:
             - admin
             - moderator
       tags:
-        - Video Blacklist
+        - Video Blocks
       parameters:
         - $ref: '#/components/parameters/idOrUUID'
       responses:
         '204':
           description: successful operation
     delete:
-      summary: Delete an entry of the blacklist of a video by its id
+      summary: Unblock a video by its id
       security:
         - OAuth2:
             - admin
             - moderator
       tags:
-        - Video Blacklist
+        - Video Blocks
       parameters:
         - $ref: '#/components/parameters/idOrUUID'
       responses:
         '204':
           description: successful operation
+        '404':
+          description: block not found
   /videos/blacklist:
     get:
-      summary: List blacklisted videos
+      tags:
+        - Video Blocks
+      summary: List video blocks
       security:
         - OAuth2:
             - admin
             - moderator
-      tags:
-        - Video Blacklist
       parameters:
         - $ref: '#/components/parameters/start'
         - $ref: '#/components/parameters/count'
@@ -1368,6 +1566,8 @@ paths:
       responses:
         '204':
           description: successful operation
+        '404':
+          description: video or language not found
     delete:
       summary: Delete a video caption
       tags:
@@ -1378,6 +1578,8 @@ paths:
       responses:
         '204':
           description: successful operation
+        '404':
+          description: video or language or caption for that language not found
   /video-channels:
     get:
       summary: List video channels
@@ -1459,6 +1661,17 @@ paths:
         - Video Channels
       parameters:
         - $ref: '#/components/parameters/channelHandle'
+        - $ref: '#/components/parameters/categoryOneOf'
+        - $ref: '#/components/parameters/tagsOneOf'
+        - $ref: '#/components/parameters/tagsAllOf'
+        - $ref: '#/components/parameters/licenceOneOf'
+        - $ref: '#/components/parameters/languageOneOf'
+        - $ref: '#/components/parameters/nsfw'
+        - $ref: '#/components/parameters/filter'
+        - $ref: '#/components/parameters/skipCount'
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/videosSort'
       responses:
         '200':
           description: successful operation
@@ -1519,7 +1732,7 @@ paths:
                     type: object
                     properties:
                       id:
-                        type: number
+                        type: integer
                       uuid:
                         type: string
       requestBody:
@@ -1542,7 +1755,7 @@ paths:
                   type: string
                 videoChannelId:
                   description: Video channel in which the playlist will be published
-                  type: number
+                  type: integer
               required:
                 - displayName
 
@@ -1592,7 +1805,7 @@ paths:
                   type: string
                 videoChannelId:
                   description: Video channel in which the playlist will be published
-                  type: number
+                  type: integer
     delete:
       summary: Delete a video playlist
       security:
@@ -1641,7 +1854,7 @@ paths:
                     type: object
                     properties:
                       id:
-                        type: number
+                        type: integer
       requestBody:
         content:
           application/json:
@@ -1649,13 +1862,13 @@ paths:
               type: object
               properties:
                 videoId:
-                  type: number
+                  type: integer
                   description: 'Video to add in the playlist'
                 startTimestamp:
-                  type: number
+                  type: integer
                   description: 'Start the video at this specific timestamp (in seconds)'
                 stopTimestamp:
-                  type: number
+                  type: integer
                   description: 'Stop the video at this specific timestamp (in seconds)'
               required:
                 - videoId
@@ -1679,19 +1892,22 @@ paths:
               type: object
               properties:
                 startPosition:
-                  type: number
-                  description: 'Start position of the element to reorder (starts from 1)'
+                  type: integer
+                  description: 'Start position of the element to reorder'
+                  minimum: 1
                 insertAfterPosition:
-                  type: number
-                  description: 'New position for the block to reorder (starts from 0, to add the block before the first element)'
+                  type: integer
+                  description: 'New position for the block to reorder, to add the block before the first element'
+                  minimum: 0
                 reorderLength:
-                  type: number
-                  description: 'How many element from startPosition to reorder (minimum length is 1)'
+                  type: integer
+                  description: 'How many element from `startPosition` to reorder'
+                  minimum: 1
               required:
                 - startPosition
                 - insertAfterPosition
 
-  /video-playlists/{id}/videos/:playlistElementId:
+  /video-playlists/{id}/videos/{playlistElementId}:
     put:
       summary: 'Update a playlist element'
       security:
@@ -1711,10 +1927,10 @@ paths:
               type: object
               properties:
                 startTimestamp:
-                  type: number
+                  type: integer
                   description: 'Start the video at this specific timestamp (in seconds)'
                 stopTimestamp:
-                  type: number
+                  type: integer
                   description: 'Stop the video at this specific timestamp (in seconds)'
     delete:
       summary: 'Delete an element from a playlist'
@@ -1729,6 +1945,44 @@ paths:
         '204':
           description: successful operation
 
+  '/users/me/video-playlists/videos-exist':
+    get:
+      summary: 'Check video exists in my playlists'
+      security:
+        - OAuth2: []
+      tags:
+        - Video Playlists
+      parameters:
+        - name: videoIds
+          in: query
+          required: true
+          description: The video ids to check
+          schema:
+            type: array
+            items:
+              type: integer
+      responses:
+        '200':
+          description: successful operation
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  videoId:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        playlistElementId:
+                          type: integer
+                        playlistId:
+                          type: integer
+                        startTimestamp:
+                          type: integer
+                        stopTimestamp:
+                          type: integer
+
   '/accounts/{name}/video-channels':
     get:
       summary: List video channels of an account
@@ -1808,6 +2062,18 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/CommentThreadPostResponse'
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                text:
+                  type: string
+                  description: 'Text comment'
+              required:
+                - text
+
   '/videos/{id}/comment-threads/{threadId}':
     get:
       summary: Get a thread
@@ -1840,6 +2106,18 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/CommentThreadPostResponse'
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                text:
+                  type: string
+                  description: 'Text comment'
+              required:
+                - text
+
     delete:
       summary: Delete a comment or a reply
       security:
@@ -1870,15 +2148,67 @@ paths:
         - Search
       summary: Search videos
       parameters:
+        - $ref: '#/components/parameters/categoryOneOf'
+        - $ref: '#/components/parameters/tagsOneOf'
+        - $ref: '#/components/parameters/tagsAllOf'
+        - $ref: '#/components/parameters/licenceOneOf'
+        - $ref: '#/components/parameters/languageOneOf'
+        - $ref: '#/components/parameters/nsfw'
+        - $ref: '#/components/parameters/filter'
+        - $ref: '#/components/parameters/skipCount'
         - $ref: '#/components/parameters/start'
         - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/searchTarget'
         - $ref: '#/components/parameters/videosSearchSort'
         - name: search
           in: query
           required: true
-          description: String to search
+          description: >
+            String to search. If the user can make a remote URI search, and the string is an URI then the
+            PeerTube instance will fetch the remote object and add it to its database. Then,
+            you can use the REST API to fetch the complete video information and interact with it.
+          schema:
+            type: string
+        - name: startDate
+          in: query
+          required: true
+          description: Get videos that are published after this date
+          schema:
+            type: string
+            format: date-time
+        - name: endDate
+          in: query
+          required: true
+          description: Get videos that are published before this date
+          schema:
+            type: string
+            format: date-time
+        - name: originallyPublishedStartDate
+          in: query
+          required: true
+          description: Get videos that are originally published after this date
+          schema:
+            type: string
+            format: date-time
+        - name: originallyPublishedEndDate
+          in: query
+          required: true
+          description: Get videos that are originally published before this date
           schema:
             type: string
+            format: date-time
+        - name: durationMin
+          in: query
+          required: true
+          description: Get videos that have this minimum duration
+          schema:
+            type: integer
+        - name: durationMax
+          in: query
+          required: true
+          description: Get videos that have this maximum duration
+          schema:
+            type: integer
       responses:
         '200':
           description: successful operation
@@ -1886,72 +2216,369 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/VideoListResponse'
-servers:
-  - url: 'https://peertube.cpy.re/api/v1'
-    description: Live Test Server (live data - stable version)
-  - url: 'https://peertube2.cpy.re/api/v1'
-    description: Live Test Server (live data - latest nighlty version)
-  - url: 'https://peertube3.cpy.re/api/v1'
-    description: Live Test Server (live data - latest RC version)
-components:
-  parameters:
-    start:
-      name: start
-      in: query
-      required: false
-      description: Offset
-      schema:
-        type: number
-    count:
-      name: count
-      in: query
-      required: false
-      description: Number of items
-      schema:
-        type: number
-    sort:
-      name: sort
-      in: query
-      required: false
-      description: Sort column (-createdAt for example)
-      schema:
-        type: string
-    videosSort:
-      name: sort
-      in: query
-      required: false
-      description: Sort videos by criteria
-      schema:
-        type: string
-        enum:
-        - -name
-        - -duration
-        - -createdAt
-        - -publishedAt
-        - -views
-        - -likes
-        - -trending
-    videosSearchSort:
-      name: sort
-      in: query
-      required: false
-      description: Sort videos by criteria
-      schema:
-        type: string
-        enum:
-        - -name
-        - -duration
-        - -createdAt
-        - -publishedAt
-        - -views
-        - -likes
-        - -match
-    commentsSort:
-      name: sort
-      in: query
-      required: false
-      description: Sort comments by criteria
-      schema:
+  /search/video-channels:
+    get:
+      tags:
+        - Search
+      summary: Search channels
+      parameters:
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/searchTarget'
+        - $ref: '#/components/parameters/sort'
+        - name: search
+          in: query
+          required: true
+          description: >
+            String to search. If the user can make a remote URI search, and the string is an URI then the
+            PeerTube instance will fetch the remote object and add it to its database. Then,
+            you can use the REST API to fetch the complete channel information and interact with it.
+          schema:
+            type: string
+      responses:
+        '200':
+          description: successful operation
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/VideoChannel'
+  /blocklist/accounts:
+    get:
+      tags:
+        - Account Blocks
+      summary: List account blocks
+      security:
+        - OAuth2:
+          - admin
+      parameters:
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/sort'
+      responses:
+        '200':
+          description: successful operation
+    post:
+      tags:
+        - Account Blocks
+      summary: Block an account
+      security:
+        - OAuth2:
+          - admin
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                accountName:
+                  type: string
+                  description: account to block, in the form `username@domain`
+              required:
+                - accountName
+      responses:
+        '200':
+          description: successful operation
+        '409':
+          description: self-blocking forbidden
+  '/blocklist/accounts/{accountName}':
+    delete:
+      tags:
+        - Account Blocks
+      summary: Unblock an account by its handle
+      security:
+        - OAuth2:
+          - admin
+      parameters:
+        - name: accountName
+          in: path
+          required: true
+          description: account to unblock, in the form `username@domain`
+          schema:
+            type: string
+      responses:
+        '201':
+          description: successful operation
+        '404':
+          description: account or account block does not exist
+  /blocklist/servers:
+    get:
+      tags:
+        - Server Blocks
+      summary: List server blocks
+      security:
+        - OAuth2:
+          - admin
+      parameters:
+        - $ref: '#/components/parameters/start'
+        - $ref: '#/components/parameters/count'
+        - $ref: '#/components/parameters/sort'
+      responses:
+        '200':
+          description: successful operation
+    post:
+      tags:
+        - Server Blocks
+      summary: Block a server
+      security:
+        - OAuth2:
+          - admin
+      requestBody:
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                accountName:
+                  type: string
+                  description: server domain to block
+              required:
+                - accountName
+      responses:
+        '200':
+          description: successful operation
+        '409':
+          description: self-blocking forbidden
+  '/blocklist/servers/{host}':
+    delete:
+      tags:
+        - Server Blocks
+      summary: Unblock a server by its domain
+      security:
+        - OAuth2:
+          - admin
+      parameters:
+        - name: host
+          in: path
+          required: true
+          description: server domain to unblock
+          schema:
+            type: string
+      responses:
+        '201':
+          description: successful operation
+        '404':
+          description: account block does not exist
+  '/feeds/video-comments.{format}':
+    get:
+      tags:
+        - Feeds
+      summary: List comments on videos
+      servers:
+        - url: 'https://peertube2.cpy.re'
+          description: Live Test Server (live data - latest nightly version)
+        - url: 'https://peertube3.cpy.re'
+          description: Live Test Server (live data - latest RC version)
+        - url: 'https://peertube.cpy.re'
+          description: Live Test Server (live data - stable version)
+      parameters:
+        - name: format
+          in: path
+          required: true
+          description: 'format expected (we focus on making `rss` the most featureful ; it serves Media RSS)'
+          schema:
+            type: string
+            enum:
+              - xml
+              - rss
+              - rss2
+              - atom
+              - atom1
+              - json
+              - json1
+        - name: videoId
+          in: query
+          description: 'limit listing to a specific video'
+          schema:
+            type: string
+      responses:
+        '204':
+          description: successful operation
+          headers:
+            Cache-Control:
+              schema:
+                type: string
+                default: 'max-age=900' # 15 min cache
+          content:
+            application/xml:
+              schema:
+                $ref: '#/components/schemas/VideoCommentsForXML'
+            application/rss+xml:
+              schema:
+                $ref: '#/components/schemas/VideoCommentsForXML'
+            text/xml:
+              schema:
+                $ref: '#/components/schemas/VideoCommentsForXML'
+            application/atom+xml:
+              schema:
+                $ref: '#/components/schemas/VideoCommentsForXML'
+            application/json:
+              schema:
+                type: object
+        '406':
+          description: accept header unsupported
+  '/feeds/videos.{format}':
+    get:
+      tags:
+        - Feeds
+      summary: List videos
+      servers:
+        - url: 'https://peertube2.cpy.re'
+          description: Live Test Server (live data - latest nightly version)
+        - url: 'https://peertube3.cpy.re'
+          description: Live Test Server (live data - latest RC version)
+        - url: 'https://peertube.cpy.re'
+          description: Live Test Server (live data - stable version)
+      parameters:
+        - name: format
+          in: path
+          required: true
+          description: 'format expected (we focus on making `rss` the most featureful ; it serves Media RSS)'
+          schema:
+            type: string
+            enum:
+              - xml
+              - rss
+              - rss2
+              - atom
+              - atom1
+              - json
+              - json1
+        - name: accountId
+          in: query
+          description: 'limit listing to a specific account'
+          schema:
+            type: string
+        - name: accountName
+          in: query
+          description: 'limit listing to a specific account'
+          schema:
+            type: string
+        - name: videoChannelId
+          in: query
+          description: 'limit listing to a specific video channel'
+          schema:
+            type: string
+        - name: videoChannelName
+          in: query
+          description: 'limit listing to a specific video channel'
+          schema:
+            type: string
+      responses:
+        '204':
+          description: successful operation
+          headers:
+            Cache-Control:
+              schema:
+                type: string
+                default: 'max-age=900' # 15 min cache
+          content:
+            application/xml:
+              schema:
+                $ref: '#/components/schemas/VideosForXML'
+            application/rss+xml:
+              schema:
+                $ref: '#/components/schemas/VideosForXML'
+            text/xml:
+              schema:
+                $ref: '#/components/schemas/VideosForXML'
+            application/atom+xml:
+              schema:
+                $ref: '#/components/schemas/VideosForXML'
+            application/json:
+              schema:
+                type: object
+        '406':
+          description: accept header unsupported
+servers:
+  - url: 'https://peertube2.cpy.re/api/v1'
+    description: Live Test Server (live data - latest nightly version)
+  - url: 'https://peertube3.cpy.re/api/v1'
+    description: Live Test Server (live data - latest RC version)
+  - url: 'https://peertube.cpy.re/api/v1'
+    description: Live Test Server (live data - stable version)
+components:
+  parameters:
+    start:
+      name: start
+      in: query
+      required: false
+      description: Offset used to paginate results
+      schema:
+        type: integer
+    count:
+      name: count
+      in: query
+      required: false
+      description: "Number of items to return"
+      schema:
+        type: integer
+        maximum: 100
+        minimum: 1
+    sort:
+      name: sort
+      in: query
+      required: false
+      description: Sort column (`-createdAt` for example)
+      schema:
+        type: string
+    searchTarget:
+      name: searchTarget
+      in: query
+      required: false
+      description: >
+        If the administrator enabled search index support, you can override the default search target.
+
+
+        **Warning**: If you choose to make an index search, PeerTube will get results from a third party service.
+        It means the instance may not know the objects you fetched. If you want to load video/channel information:
+          * If the current user has the ability to make a remote URI search (this information is available in the config endpoint),
+          then reuse the search API to make a search using the object URI so PeerTube instance fetches the remote object and fill its database.
+          After that, you can use the classic REST API endpoints to fetch the complete object or interact with it
+          * If the current user has not the ability to make a remote URI search, then redirect the user on the origin instance or fetch
+          the data from the origin instance API
+      schema:
+        type: string
+        enum:
+          - 'local'
+          - 'search-index'
+    videosSort:
+      name: sort
+      in: query
+      required: false
+      description: Sort videos by criteria
+      schema:
+        type: string
+        enum:
+        - -name
+        - -duration
+        - -createdAt
+        - -publishedAt
+        - -views
+        - -likes
+        - -trending
+    videosSearchSort:
+      name: sort
+      in: query
+      required: false
+      description: Sort videos by criteria
+      schema:
+        type: string
+        enum:
+        - -name
+        - -duration
+        - -createdAt
+        - -publishedAt
+        - -views
+        - -likes
+        - -match
+    commentsSort:
+      name: sort
+      in: query
+      required: false
+      description: Sort comments by criteria
+      schema:
         type: string
         enum:
         - -createdAt
@@ -1999,7 +2626,7 @@ components:
       in: path
       required: true
       description: >-
-        The name of the account (chocobozzz or chocobozzz@peertube.cpy.re for
+        The name of the account (`chocobozzz` or `chocobozzz@example.org` for
         example)
       schema:
         type: string
@@ -2009,7 +2636,7 @@ components:
       required: true
       description: The user id
       schema:
-        type: number
+        type: integer
     idOrUUID:
       name: id
       in: path
@@ -2023,14 +2650,14 @@ components:
       required: true
       description: Playlist element id
       schema:
-        type: number
+        type: integer
     abuseId:
       name: abuseId
       in: path
       required: true
       description: Video abuse id
       schema:
-        type: number
+        type: integer
     captionLanguage:
       name: captionLanguage
       in: path
@@ -2058,25 +2685,25 @@ components:
       required: true
       description: The thread id (root comment id)
       schema:
-        type: number
+        type: integer
     commentId:
       name: commentId
       in: path
       required: true
       description: The comment id
       schema:
-        type: number
+        type: integer
     categoryOneOf:
       name: categoryOneOf
       in: query
       required: false
-      description: category id of the video
+      description: category id of the video (see /videos/categories)
       schema:
         oneOf:
-        - type: number
+        - type: integer
         - type: array
           items:
-            type: number
+            type: integer
       style: form
       explode: false
     tagsOneOf:
@@ -2109,7 +2736,7 @@ components:
       name: languageOneOf
       in: query
       required: false
-      description: language id of the video
+      description: language id of the video (see /videos/languages). Use `_unknown` to filter on videos that don't have a video language
       schema:
         oneOf:
         - type: string
@@ -2122,15 +2749,26 @@ components:
       name: licenceOneOf
       in: query
       required: false
-      description: licence id of the video
+      description: licence id of the video (see /videos/licences)
       schema:
         oneOf:
-        - type: number
+        - type: integer
         - type: array
           items:
-            type: number
+            type: integer
       style: form
       explode: false
+    skipCount:
+      name: skipCount
+      in: query
+      required: false
+      description: if you don't need the `total` in the response
+      schema:
+        type: string
+        enum:
+          - 'true'
+          - 'false'
+        default: 'false'
     nsfw:
       name: nsfw
       in: query
@@ -2190,7 +2828,7 @@ components:
     VideoConstantNumber:
       properties:
         id:
-          type: number
+          type: integer
         label:
           type: string
     VideoConstantString:
@@ -2206,7 +2844,7 @@ components:
         - 1
         - 2
         - 3
-      description: 'The video playlist privacy (Public = 1, Unlisted = 2, Private = 3)'
+      description: 'The video playlist privacy (Public = `1`, Unlisted = `2`, Private = `3`)'
     VideoPlaylistPrivacyConstant:
       properties:
         id:
@@ -2219,7 +2857,7 @@ components:
       enum:
         - 1
         - 2
-      description: 'The video playlist type (Regular = 1, Watch Later = 2)'
+      description: 'The video playlist type (Regular = `1`, Watch Later = `2`)'
     VideoPlaylistTypeConstant:
       properties:
         id:
@@ -2234,7 +2872,7 @@ components:
         - 2
         - 3
         - 4
-      description: 'The video privacy (Public = 1, Unlisted = 2, Private = 3, Internal = 4)'
+      description: 'The video privacy (Public = `1`, Unlisted = `2`, Private = `3`, Internal = `4`)'
     VideoPrivacyConstant:
       properties:
         id:
@@ -2242,6 +2880,21 @@ components:
         label:
           type: string
 
+    NSFWPolicy:
+      type: string
+      enum:
+        - display
+        - blur
+        - do_not_list
+
+    UserRole:
+      type: integer
+      enum:
+        - 0
+        - 1
+        - 2
+      description: 'The user role (Admin = `0`, Moderator = `1`, User = `2`)'
+
     VideoStateConstant:
       properties:
         id:
@@ -2250,7 +2903,7 @@ components:
             - 1
             - 2
             - 3
-          description: 'The video state (Published = 1, to transcode = 2, to import = 3)'
+          description: 'The video state (Published = `1`, to transcode = `2`, to import = `3`)'
         label:
           type: string
 
@@ -2260,13 +2913,26 @@ components:
         - 1
         - 2
         - 3
-      description: 'The video playlist privacy (Pending = 1, Rejected = 2, Accepted = 3)'
+      description: 'The video playlist privacy (Pending = `1`, Rejected = `2`, Accepted = `3`)'
     VideoAbuseStateConstant:
       properties:
         id:
           $ref: '#/components/schemas/VideoAbuseStateSet'
         label:
           type: string
+    VideoAbusePredefinedReasons:
+      type: array
+      items:
+        type: string
+        enum:
+        - violentOrAbusive
+        - hatefulOrAbusive
+        - spamOrMisleading
+        - privacy
+        - rights
+        - serverRules
+        - thumbnails
+        - captions
 
     VideoResolutionConstant:
       properties:
@@ -2288,7 +2954,7 @@ components:
     AccountSummary:
       properties:
         id:
-          type: number
+          type: integer
         name:
           type: string
         displayName:
@@ -2304,7 +2970,7 @@ components:
     VideoChannelSummary:
       properties:
         id:
-          type: number
+          type: integer
         name:
           type: string
         displayName:
@@ -2320,11 +2986,11 @@ components:
     PlaylistElement:
       properties:
         position:
-          type: number
+          type: integer
         startTimestamp:
-          type: number
+          type: integer
         stopTimestamp:
-          type: number
+          type: integer
         video:
           nullable: true
           allOf:
@@ -2336,7 +3002,7 @@ components:
         resolution:
           $ref: '#/components/schemas/VideoResolutionConstant'
         size:
-          type: number
+          type: integer
           description: 'Video file size in bytes'
         torrentUrl:
           type: string
@@ -2348,19 +3014,25 @@ components:
           type: string
         fps:
           type: number
+        metadataUrl:
+          type: string
     VideoStreamingPlaylists:
       properties:
         id:
-          type: number
+          type: integer
         type:
-          type: number
+          type: integer
           enum:
             - 1
-          description: 'Playlist type (HLS = 1)'
+          description: 'Playlist type (HLS = `1`)'
         playlistUrl:
           type: string
         segmentsSha256Url:
           type: string
+        files:
+          type: array
+          items:
+            $ref: '#/components/schemas/VideoFile'
         redundancies:
           type: array
           items:
@@ -2368,10 +3040,18 @@ components:
             properties:
               baseUrl:
                 type: string
+    VideoInfo:
+      properties:
+        id:
+          type: integer
+        uuid:
+          type: string
+        name:
+          type: string
     Video:
       properties:
         id:
-          type: number
+          type: integer
         uuid:
           type: string
         createdAt:
@@ -2393,7 +3073,7 @@ components:
         description:
           type: string
         duration:
-          type: number
+          type: integer
         isLocal:
           type: boolean
         name:
@@ -2405,11 +3085,11 @@ components:
         embedPath:
           type: string
         views:
-          type: number
+          type: integer
         likes:
-          type: number
+          type: integer
         dislikes:
-          type: number
+          type: integer
         nsfw:
           type: boolean
         waitTranscoding:
@@ -2436,7 +3116,7 @@ components:
           type: object
           properties:
             currentTime:
-              type: number
+              type: integer
     VideoDetails:
       allOf:
         - $ref: '#/components/schemas/Video'
@@ -2478,13 +3158,13 @@ components:
             - 1
             - 2
             - 3
-          description: 'The video import state (Pending = 1, Success = 2, Failed = 3)'
+          description: 'The video import state (Pending = `1`, Success = `2`, Failed = `3`)'
         label:
           type: string
     VideoImport:
       properties:
         id:
-          type: number
+          type: integer
         targetUrl:
           type: string
         magnetUri:
@@ -2509,9 +3189,11 @@ components:
     VideoAbuse:
       properties:
         id:
-          type: number
+          type: integer
         reason:
           type: string
+        predefinedReasons:
+          $ref: '#/components/schemas/VideoAbusePredefinedReasons'
         reporterAccount:
           $ref: '#/components/schemas/Account'
         state:
@@ -2522,7 +3204,7 @@ components:
           type: object
           properties:
             id:
-              type: number
+              type: integer
             name:
               type: string
             uuid:
@@ -2532,9 +3214,9 @@ components:
     VideoBlacklist:
       properties:
         id:
-          type: number
+          type: integer
         videoId:
-          type: number
+          type: integer
         createdAt:
           type: string
         updatedAt:
@@ -2546,13 +3228,13 @@ components:
         description:
           type: string
         duration:
-          type: number
+          type: integer
         views:
-          type: number
+          type: integer
         likes:
-          type: number
+          type: integer
         dislikes:
-          type: number
+          type: integer
         nsfw:
           type: boolean
     VideoChannel:
@@ -2567,13 +3249,13 @@ components:
           type: object
           properties:
             id:
-              type: number
+              type: integer
             uuid:
               type: string
     VideoPlaylist:
       properties:
         id:
-          type: number
+          type: integer
         createdAt:
           type: string
         updatedAt:
@@ -2587,7 +3269,7 @@ components:
         isLocal:
           type: boolean
         videoLength:
-          type: number
+          type: integer
         thumbnailPath:
           type: string
         privacy:
@@ -2601,25 +3283,25 @@ components:
     VideoComment:
       properties:
         id:
-          type: number
+          type: integer
         url:
           type: string
         text:
           type: string
         threadId:
-          type: number
+          type: integer
         inReplyToCommentId:
-          type: number
+          type: integer
         videoId:
-          type: number
+          type: integer
         createdAt:
           type: string
         updatedAt:
           type: string
         totalRepliesFromVideoAuthor:
-          type: number
+          type: integer
         totalReplies:
-          type: number
+          type: integer
         account:
           $ref: '#/components/schemas/Account'
     VideoCommentThreadTree:
@@ -2644,10 +3326,26 @@ components:
           type: string
         updatedAt:
           type: string
+    ActorInfo:
+      properties:
+        id:
+          type: integer
+        name:
+          type: string
+        displayName:
+          type: string
+        host:
+          type: string
+        avatar:
+          nullable: true
+          type: object
+          properties:
+            path:
+              type: string
     Actor:
       properties:
         id:
-          type: number
+          type: integer
         url:
           type: string
         name:
@@ -2655,9 +3353,9 @@ components:
         host:
           type: string
         followingCount:
-          type: number
+          type: integer
         followersCount:
-          type: number
+          type: integer
         createdAt:
           type: string
         updatedAt:
@@ -2677,22 +3375,26 @@ components:
     User:
       properties:
         id:
-          type: number
+          type: integer
         username:
           type: string
         email:
           type: string
-        displayNSFW:
+        theme:
+          type: string
+          description: 'Theme enabled by this user'
+        emailVerified:
+          type: boolean
+          description: 'Has the user confirmed their email address?'
+        nsfwPolicy:
+          $ref: '#/components/schemas/NSFWPolicy'
+        webtorrentEnabled:
           type: boolean
         autoPlayVideo:
           type: boolean
+          description: 'Automatically start playing the video on the watch page'
         role:
-          type: integer
-          enum:
-            - 0
-            - 1
-            - 2
-          description: 'The user role (Admin = 0, Moderator = 1, User = 2)'
+          $ref: '#/components/schemas/UserRole'
         roleLabel:
           type: string
           enum:
@@ -2700,9 +3402,27 @@ components:
             - Moderator
             - Administrator
         videoQuota:
-          type: number
+          type: integer
         videoQuotaDaily:
-          type: number
+          type: integer
+        videosCount:
+          type: integer
+        videoAbusesCount:
+          type: integer
+        videoAbusesAcceptedCount:
+          type: integer
+        videoAbusesCreatedCount:
+          type: integer
+        videoCommentsCount:
+          type: integer
+        noInstanceConfigWarningModal:
+          type: boolean
+        noWelcomeModal:
+          type: boolean
+        blocked:
+          type: boolean
+        blockedReason:
+          type: string
         createdAt:
           type: string
         account:
@@ -2714,7 +3434,7 @@ components:
     UserWatchingVideo:
       properties:
         currentTime:
-          type: number
+          type: integer
     ServerConfig:
       properties:
         instance:
@@ -2800,7 +3520,7 @@ components:
             enabledResolutions:
               type: array
               items:
-                type: number
+                type: integer
         import:
           type: object
           properties:
@@ -2838,7 +3558,7 @@ components:
                   type: object
                   properties:
                     max:
-                      type: number
+                      type: integer
             extensions:
               type: array
               items:
@@ -2857,7 +3577,7 @@ components:
                   type: object
                   properties:
                     max:
-                      type: number
+                      type: integer
             file:
               type: object
               properties:
@@ -2875,7 +3595,7 @@ components:
                   type: object
                   properties:
                     max:
-                      type: number
+                      type: integer
                 extensions:
                   type: array
                   items:
@@ -2884,9 +3604,9 @@ components:
           type: object
           properties:
             videoQuota:
-              type: number
+              type: integer
             videoQuotaDaily:
-              type: number
+              type: integer
         trending:
           type: object
           properties:
@@ -2894,7 +3614,7 @@ components:
               type: object
               properties:
                 intervalDays:
-                  type: number
+                  type: integer
         tracker:
           type: object
           properties:
@@ -2972,19 +3692,19 @@ components:
               type: object
               properties:
                 size:
-                  type: number
+                  type: integer
             captions:
               type: object
               properties:
                 size:
-                  type: number
+                  type: integer
         signup:
           type: object
           properties:
             enabled:
               type: boolean
             limit:
-              type: number
+              type: integer
             requiresEmailVerification:
               type: boolean
         admin:
@@ -3001,9 +3721,9 @@ components:
           type: object
           properties:
             videoQuota:
-              type: number
+              type: integer
             videoQuotaDaily:
-              type: number
+              type: integer
         transcoding:
           type: object
           properties:
@@ -3014,7 +3734,7 @@ components:
             allowAudioFiles:
               type: boolean
             threads:
-              type: number
+              type: integer
             resolutions:
               type: object
               properties:
@@ -3075,7 +3795,7 @@ components:
     Follow:
       properties:
         id:
-          type: number
+          type: integer
         follower:
           $ref: '#/components/schemas/Actor'
         following:
@@ -3094,7 +3814,7 @@ components:
     Job:
       properties:
         id:
-          type: number
+          type: integer
         state:
           type: string
           enum:
@@ -3118,7 +3838,7 @@ components:
     AddUserResponse:
       properties:
         id:
-          type: number
+          type: integer
         uuid:
           type: string
     VideoUploadResponse:
@@ -3127,13 +3847,13 @@ components:
           type: object
           properties:
             id:
-              type: number
+              type: integer
             uuid:
               type: string
     CommentThreadResponse:
       properties:
         total:
-          type: number
+          type: integer
         data:
           type: array
           items:
@@ -3145,7 +3865,7 @@ components:
     VideoListResponse:
       properties:
         total:
-          type: number
+          type: integer
         data:
           type: array
           items:
@@ -3154,26 +3874,25 @@ components:
       properties:
         username:
           type: string
-          description: 'The user username '
+          description: 'The user username'
+          minLength: 1
+          maxLength: 50
         password:
           type: string
-          description: 'The user password. If the smtp server is configured, you can leave empty and an email will be sent '
+          description: 'The user password. If the smtp server is configured, you can leave empty and an email will be sent'
+          minLength: 6
+          maxLength: 255
         email:
           type: string
-          description: 'The user email '
+          description: 'The user email. MUST be in the format of an email address.'
         videoQuota:
           type: string
-          description: 'The user videoQuota '
+          description: 'The user video quota'
         videoQuotaDaily:
           type: string
-          description: 'The user daily video quota '
+          description: 'The user daily video quota'
         role:
-          type: integer
-          enum:
-            - 0
-            - 1
-            - 2
-          description: 'The user role (Admin = 0, Moderator = 1, User = 2)'
+          $ref: '#/components/schemas/UserRole'
       required:
         - username
         - password
@@ -3185,23 +3904,18 @@ components:
       properties:
         id:
           type: string
-          description: 'The user id '
+          description: 'The user id'
         email:
           type: string
-          description: 'The updated email of the user '
+          description: 'The updated email of the user'
         videoQuota:
           type: string
-          description: 'The updated videoQuota of the user '
+          description: 'The updated video quota of the user'
         videoQuotaDaily:
           type: string
-          description: 'The updated daily video quota of the user '
+          description: 'The updated daily video quota of the user'
         role:
-          type: integer
-          enum:
-            - 0
-            - 1
-            - 2
-          description: 'The user role (Admin = 0, Moderator = 1, User = 2)'
+          $ref: '#/components/schemas/UserRole'
       required:
         - id
         - email
@@ -3212,16 +3926,16 @@ components:
       properties:
         password:
           type: string
-          description: 'Your new password '
+          description: 'Your new password'
         email:
           type: string
-          description: 'Your new email '
+          description: 'Your new email'
         displayNSFW:
           type: string
-          description: 'Your new displayNSFW '
+          description: 'Your new displayNSFW'
         autoPlayVideo:
           type: string
-          description: 'Your new autoPlayVideo '
+          description: 'Your new autoPlayVideo'
       required:
         - password
         - email
@@ -3231,10 +3945,10 @@ components:
       properties:
         id:
           type: string
-          description: 'Id of the video '
+          description: 'Id of the video'
         rating:
           type: number
-          description: 'Rating of the video '
+          description: 'Rating of the video'
       required:
         - id
         - rating
@@ -3252,13 +3966,13 @@ components:
       properties:
         username:
           type: string
-          description: 'The username of the user '
+          description: 'The username of the user'
         password:
           type: string
-          description: 'The password of the user '
+          description: 'The password of the user'
         email:
           type: string
-          description: 'The email of the user '
+          description: 'The email of the user'
         displayName:
           type: string
           description: 'The user display name'
@@ -3267,10 +3981,10 @@ components:
           properties:
             name:
               type: string
-              description: 'The default channel name'
+              description: 'The name for the default channel'
             displayName:
               type: string
-              description: 'The default channel display name'
+              description: 'The display name for the default channel'
 
       required:
         - username
@@ -3286,6 +4000,7 @@ components:
           type: string
         support:
           type: string
+          description: 'A text shown by default on all videos of this channel, to tell the audience how to support it'
       required:
         - name
         - displayName
@@ -3297,7 +4012,324 @@ components:
           type: string
         support:
           type: string
+          description: 'A text shown by default on all videos of this channel, to tell the audience how to support it'
         bulkVideosSupportUpdate:
           type: boolean
-          description: 'Update all videos support field of this channel'
+          description: 'Update the support field for all videos of this channel'
 
+    MRSSPeerLink:
+      type: object
+      xml:
+        name: 'media:peerLink'
+      properties:
+        href:
+          type: string
+          xml:
+            attribute: true
+        type:
+          type: string
+          enum:
+            - application/x-bittorrent
+          xml:
+            attribute: true
+    MRSSGroupContent:
+      type: object
+      xml:
+        name: 'media:content'
+      properties:
+        url:
+          type: string
+          xml:
+            attribute: true
+        fileSize:
+          type: integer
+          xml:
+            attribute: true
+        type:
+          type: string
+          xml:
+            attribute: true
+        framerate:
+          type: integer
+          xml:
+            attribute: true
+        duration:
+          type: integer
+          xml:
+            attribute: true
+        height:
+          type: integer
+          xml:
+            attribute: true
+        lang:
+          type: string
+          xml:
+            attribute: true
+    VideoCommentsForXML:
+      type: array
+      xml:
+        wrapped: true
+        name: 'channel'
+      items:
+        type: object
+        xml:
+          name: 'item'
+        properties:
+          link:
+            type: string
+          guid:
+            type: string
+          pubDate:
+            type: string
+            format: date-time
+          'content:encoded':
+            type: string
+          'dc:creator':
+            type: string
+    VideosForXML:
+      type: array
+      xml:
+        wrapped: true
+        name: 'channel'
+      items:
+        type: object
+        xml:
+          name: 'item'
+        properties:
+          link:
+            type: string
+            description: video watch page URL
+          guid:
+            type: string
+            description: video canonical URL
+          pubDate:
+            type: string
+            format: date-time
+            description: video publication date
+          description:
+            type: string
+            description: video description
+          'content:encoded':
+            type: string
+            description: video description
+          'dc:creator':
+            type: string
+            description: publisher user name
+          'media:category':
+            type: integer
+            description: video category (MRSS)
+          'media:community':
+            type: object
+            description: see [media:community](https://www.rssboard.org/media-rss#media-community) (MRSS)
+            properties:
+              'media:statistics':
+                type: object
+                properties:
+                  views:
+                    type: integer
+                    xml:
+                      attribute: true
+          'media:embed':
+            type: object
+            properties:
+              url:
+                type: string
+                description: video embed path, relative to the canonical URL domain (MRSS)
+                xml:
+                  attribute: true
+          'media:player':
+            type: object
+            properties:
+              url:
+                type: string
+                description: video watch path, relative to the canonical URL domain (MRSS)
+                xml:
+                  attribute: true
+          'media:thumbnail':
+            type: object
+            properties:
+              url:
+                type: string
+                xml:
+                  attribute: true
+              height:
+                type: integer
+                xml:
+                  attribute: true
+              width:
+                type: integer
+                xml:
+                  attribute: true
+          'media:title':
+            type: string
+            description: see [media:title](https://www.rssboard.org/media-rss#media-title) (MRSS). We only use `plain` titles.
+          'media:description':
+            type: string
+          'media:rating':
+            type: string
+            enum:
+              - nonadult
+              - adult
+            description: see [media:rating](https://www.rssboard.org/media-rss#media-rating) (MRSS)
+          'enclosure':
+            type: object
+            description: main streamable file for the video
+            properties:
+              url:
+                type: string
+                xml:
+                  attribute: true
+              type:
+                type: string
+                enum:
+                  - application/x-bittorrent
+                xml:
+                  attribute: true
+              length:
+                type: integer
+                xml:
+                  attribute: true
+          'media:group':
+            type: array
+            description: list of streamable files for the video. see [media:peerLink](https://www.rssboard.org/media-rss#media-peerlink) and [media:content](https://www.rssboard.org/media-rss#media-content) or  (MRSS)
+            items:
+              anyOf:
+                - $ref: '#/components/schemas/MRSSPeerLink'
+                - $ref: '#/components/schemas/MRSSGroupContent'
+    NotificationSettingValue:
+      type: integer
+      description: >
+        Notification type
+        - `0` NONE
+        - `1` WEB
+        - `2` EMAIL
+      enum:
+        - 0
+        - 1
+        - 3
+    Notification:
+      properties:
+        id:
+          type: integer
+        type:
+          type: integer
+          description: >
+            Notification type, following the `UserNotificationType` enum:
+            - `1` NEW_VIDEO_FROM_SUBSCRIPTION
+            - `2` NEW_COMMENT_ON_MY_VIDEO
+            - `3` NEW_VIDEO_ABUSE_FOR_MODERATORS
+            - `4` BLACKLIST_ON_MY_VIDEO
+            - `5` UNBLACKLIST_ON_MY_VIDEO
+            - `6` MY_VIDEO_PUBLISHED
+            - `7` MY_VIDEO_IMPORT_SUCCESS
+            - `8` MY_VIDEO_IMPORT_ERROR
+            - `9` NEW_USER_REGISTRATION
+            - `10` NEW_FOLLOW
+            - `11` COMMENT_MENTION
+            - `12` VIDEO_AUTO_BLACKLIST_FOR_MODERATORS
+            - `13` NEW_INSTANCE_FOLLOWER
+            - `14` AUTO_INSTANCE_FOLLOWING
+        read:
+          type: boolean
+        video:
+          nullable: true
+          allOf:
+            - $ref: '#/components/schemas/VideoInfo'
+            - type: object
+              properties:
+                channel:
+                  $ref: '#/components/schemas/ActorInfo'
+        videoImport:
+          nullable: true
+          type: object
+          properties:
+            id:
+              type: integer
+            video:
+              nullable: true
+              $ref: '#/components/schemas/VideoInfo'
+            torrentName:
+              type: string
+              nullable: true
+            magnetUri:
+              type: string
+              nullable: true
+            targetUri:
+              type: string
+              nullable: true
+        comment:
+          nullable: true
+          type: object
+          properties:
+            id:
+              type: integer
+            threadId:
+              type: integer
+            video:
+              $ref: '#/components/schemas/VideoInfo'
+            account:
+              $ref: '#/components/schemas/ActorInfo'
+        videoAbuse:
+          nullable: true
+          type: object
+          properties:
+            id:
+              type: integer
+            video:
+              allOf:
+                - $ref: '#/components/schemas/VideoInfo'
+        videoBlacklist:
+          nullable: true
+          type: object
+          properties:
+            id:
+              type: integer
+            video:
+              allOf:
+                - $ref: '#/components/schemas/VideoInfo'
+        account:
+          nullable: true
+          allOf:
+            - $ref: '#/components/schemas/ActorInfo'
+        actorFollow:
+          type: object
+          nullable: true
+          properties:
+            id:
+              type: integer
+            follower:
+              $ref: '#/components/schemas/ActorInfo'
+            state:
+              type: string
+              enum:
+                - pending
+                - accepted
+            following:
+              type: object
+              properties:
+                type:
+                  type: string
+                  enum:
+                    - account
+                    - channel
+                    - instance
+                name:
+                  type: string
+                displayName:
+                  type: string
+                host:
+                  type: string
+        createdAt:
+          type: string
+          format: date-time
+        updatedAt:
+          type: string
+          format: date-time
+    NotificationListResponse:
+      properties:
+        total:
+          type: integer
+        data:
+          type: array
+          items:
+            $ref: '#/components/schemas/Notification'
\ No newline at end of file