openapi: 3.0.0 info: title: PeerTube version: 1.1.0-alpha.2 contact: name: PeerTube Community url: 'https://joinpeertube.org' license: name: AGPLv3.0 url: 'https://github.com/Chocobozzz/PeerTube/blob/master/LICENSE' x-logo: url: 'https://joinpeertube.org/img/brand.png' description: | # Introduction The PeerTube API is built on HTTP(S). Our API is RESTful. It has predictable resource URLs. It returns HTTP response codes to indicate errors. It also accepts and returns JSON in the HTTP body. You can use your favorite HTTP/REST library for your programming language to use PeerTube. No official SDK is currently provided. # Authentication When you sign up for an account, you are given the possibility to generate sessions, and authenticate using this session token. One session token can currently be used at a time. tags: - name: Accounts description: > Using some features of PeerTube require authentication, for which Accounts provide different levels of permission as well as associated user information. Accounts also encompass remote accounts discovered across the federation. - name: Config description: > Each server exposes public information regarding supported videos and options. - name: Feeds description: | Feeds of videos and feeds of comments allow to see updates and get them in an aggregator or script of your choice. - name: Job description: > Jobs are long-running tasks enqueued and processed by the instance itself. No additional worker registration is currently available. - name: ServerFollowing description: > Managing servers which the instance interacts with is crucial to the concept of federation in PeerTube and external video indexation. The PeerTube server then deals with inter-server ActivityPub operations and propagates information across its social graph by posting activities to actors' inbox endpoints. - name: VideoAbuse description: | Video abuses deal with reports of local or remote videos alike. - name: Video description: | Operations dealing with listing, uploading, fetching or modifying videos. - name: Search description: | The search helps to find _videos_ 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. - name: VideoComment description: > Operations dealing with comments to a video. Comments are organized in threads. - name: VideoChannel description: > Operations dealing with creation, modification and video listing of a user's channels. paths: '/accounts/{name}': get: tags: - Accounts summary: Get the account by name parameters: - $ref: '#/components/parameters/name' - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Account' '/accounts/{name}/videos': get: tags: - Accounts - Video summary: 'Get videos for an account, provided the name of that account' parameters: - $ref: '#/components/parameters/name' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Video' x-code-samples: - lang: JavaScript source: | fetch('https://peertube2.cpy.re/api/v1/accounts/{name}/videos') .then(function(response) { return response.json() }).then(function(data) { console.log(data) }) - lang: Shell source: | # pip install httpie http -b GET https://peertube2.cpy.re/api/v1/accounts/{name}/videos /accounts: get: tags: - Accounts summary: Get all accounts responses: '200': description: successful operation content: 'application/json': schema: type: array items: $ref: '#/components/schemas/Account' /config: get: tags: - Config summary: Get the configuration of the server responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/ServerConfig' '/feeds/videos.{format}': get: summary: >- Get the feed of videos for the server, with optional filter by account name or id tags: - Feeds parameters: - name: format in: path required: true description: >- The format expected (xml defaults to RSS 2.0, atom to ATOM 1.0 and json to JSON FEED 1.0 schema: type: string enum: - xml - atom - json default: xml - name: accountId in: query required: false description: >- The id of the local account to filter to (beware, users IDs and not actors IDs which will return empty feeds schema: type: number - name: accountName in: query required: false description: The name of the local account to filter to schema: type: string responses: '200': description: successful operation /jobs: get: summary: Get list of jobs security: - OAuth2: - admin tags: - Job parameters: - name: state in: path required: true description: The state of the job schema: type: string - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Job' '/server/following/{host}': delete: security: - OAuth2: - admin tags: - ServerFollowing summary: Unfollow a server by hostname parameters: - name: host in: path required: true description: 'The host to unfollow ' schema: type: string responses: '201': description: successful operation /server/followers: get: tags: - ServerFollowing summary: Get followers of the server parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Follow' /server/following: get: tags: - ServerFollowing summary: Get servers followed by the server parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Follow' post: security: - OAuth2: - admin tags: - ServerFollowing summary: Follow a server responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' requestBody: content: application/json: schema: $ref: '#/components/schemas/Follow' /users: post: summary: Creates user security: - OAuth2: - admin tags: - User responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/AddUserResponse' requestBody: content: application/json: schema: $ref: '#/components/schemas/AddUser' description: User to create required: true get: summary: Get a list of users security: - OAuth2: [] tags: - User parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/User' '/users/{id}': delete: summary: Delete a user by its id security: - OAuth2: - admin tags: - User parameters: - $ref: '#/components/parameters/id' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' get: summary: Get user by its id security: - OAuth2: [] tags: - User parameters: - $ref: '#/components/parameters/id' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/User' put: summary: Update user profile by its id security: - OAuth2: [] tags: - User parameters: - $ref: '#/components/parameters/id' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateUser' required: true /users/me: get: summary: Get current user information security: - OAuth2: [] tags: - User responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/User' put: summary: Update current user information security: - OAuth2: [] tags: - User responses: '204': description: Successful operation requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateMe' required: true /users/me/video-quota-used: get: summary: Get current user used quota security: - OAuth2: [] tags: - User responses: '200': description: successful operation content: application/json: schema: type: number '/users/me/videos/{videoId}/rating': get: summary: 'Get rating of video by its id, among those of the current user' security: - OAuth2: [] tags: - User parameters: - name: videoId in: path required: true description: 'The video id ' schema: type: string responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/GetMeVideoRating' /users/me/videos: get: summary: Get videos of the current user security: - OAuth2: [] tags: - User parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Video' /users/register: post: summary: Register a user tags: - User responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' requestBody: content: application/json: schema: $ref: '#/components/schemas/RegisterUser' required: true /users/me/avatar/pick: post: summary: Update current user avatar security: - OAuth2: [] tags: - User responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Avatar' requestBody: content: multipart/form-data: schema: type: object properties: avatarfile: description: The file to upload. type: string format: binary encoding: profileImage: # only accept png/jpeg contentType: image/png, image/jpeg /videos: get: summary: Get list of videos tags: - Video parameters: - name: category in: query required: false description: category id of the video schema: type: number - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Video' /videos/categories: get: summary: Get list of video licences known by the server tags: - Video responses: '200': description: successful operation content: application/json: schema: type: array items: type: string /videos/licences: get: summary: Get list of video licences known by the server tags: - Video responses: '200': description: successful operation content: application/json: schema: type: array items: type: string /videos/languages: get: summary: Get list of languages known by the server tags: - Video responses: '200': description: successful operation content: application/json: schema: type: array items: type: string /videos/privacies: get: summary: Get list of privacy policies supported by the server tags: - Video responses: '200': description: successful operation content: application/json: schema: type: array items: type: string '/videos/{id}': put: summary: Update metadata for a video by its id security: - OAuth2: [] tags: - Video parameters: - $ref: '#/components/parameters/id2' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Video' requestBody: content: multipart/form-data: schema: type: object properties: thumbnailfile: description: Video thumbnail file type: string previewfile: description: Video preview file type: string category: description: Video category type: string licence: description: Video licence type: string language: description: Video language type: string description: description: Video description type: string waitTranscoding: description: Whether or not we wait transcoding before publish the video type: string support: description: Text describing how to support the video uploader type: string nsfw: description: Whether or not this video contains sensitive content type: string name: description: Video name type: string tags: description: Video tags type: string commentsEnabled: description: Enable or disable comments for this video type: string scheduleUpdate: &ref_0 type: object properties: privacy: type: string enum: - Public - Unlisted description: Video privacy target updateAt: type: string format: date description: When to update the video required: - updateAt get: summary: Get a video by its id tags: - Video parameters: - $ref: '#/components/parameters/id2' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Video' delete: summary: Delete a video by its id security: - OAuth2: [] tags: - Video parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' '/videos/{id}/description': get: summary: Get a video description by its id tags: - Video parameters: - $ref: '#/components/parameters/id2' responses: '200': description: successful operation content: application/json: schema: type: string '/videos/{id}/views': post: summary: Add a view to the video by its id tags: - Video parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' /videos/upload: post: summary: Upload a video file with its metadata security: - OAuth2: [] tags: - Video responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/VideoUploadResponse' requestBody: content: multipart/form-data: schema: type: object properties: videofile: description: Video file type: string format: binary channelId: description: Channel id that will contain this video type: number thumbnailfile: description: Video thumbnail file type: string previewfile: description: Video preview file type: string privacy: $ref: '#/components/schemas/VideoPrivacy' category: description: Video category type: string licence: description: Video licence type: string language: description: Video language type: string description: description: Video description type: string waitTranscoding: description: Whether or not we wait transcoding before publish the video type: string support: description: Text describing how to support the video uploader type: string nsfw: description: Whether or not this video contains sensitive content type: string name: description: Video name type: string tags: description: Video tags type: string commentsEnabled: description: Enable or disable comments for this video type: string scheduleUpdate: *ref_0 required: - videofile - channelId - name - privacy x-code-samples: - lang: Shell source: | ## DEPENDENCIES: httpie, jq # pip install httpie USERNAME="" PASSWORD="" FILE_PATH="" CHANNEL_ID="" PRIVACY="1" # public: 1, unlisted: 2, private: 3 NAME="" API_PATH="https://peertube2.cpy.re/api/v1" ## AUTH client_id=$(http -b GET "$API_PATH/oauth-clients/local" | jq -r ".client_id") client_secret=$(http -b GET "$API_PATH/oauth-clients/local" | jq -r ".client_secret") token=$(http -b --form POST "$API_PATH/users/token" \ client_id="$client_id" client_secret="$client_secret" grant_type=password response_type=code \ username=$USERNAME \ password=$PASSWORD \ | jq -r ".access_token") ## VIDEO UPLOAD http -b --form POST "$API_PATH/videos/upload" \ videofile@$FILE_PATH \ channelId=$CHANNEL_ID \ name=$NAME \ privacy=$PRIVACY \ "Authorization:Bearer $token" /videos/abuse: get: summary: Get list of reported video abuses security: - OAuth2: [] tags: - VideoAbuse parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/VideoAbuse' '/videos/{id}/abuse': post: summary: 'Report an abuse, on a video by its id' security: - OAuth2: [] tags: - VideoAbuse parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' '/videos/{id}/blacklist': post: summary: Put on blacklist a video by its id security: - OAuth2: - admin - moderator tags: - VideoBlacklist parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' delete: summary: Delete an entry of the blacklist of a video by its id security: - OAuth2: - admin - moderator tags: - VideoBlacklist parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' /videos/blacklist: get: summary: Get list of videos on blacklist security: - OAuth2: - admin - moderator tags: - VideoBlacklist parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/VideoBlacklist' /video-channels: get: summary: Get list of video channels tags: - VideoChannel parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/VideoChannel' post: summary: Creates a video channel for the current user security: - OAuth2: [] tags: - VideoChannel responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' requestBody: $ref: '#/components/requestBodies/VideoChannelInput' '/video-channels/{id}': get: summary: Get a video channel by its id tags: - VideoChannel parameters: - $ref: '#/components/parameters/id3' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/VideoChannel' put: summary: Update a video channel by its id security: - OAuth2: [] tags: - VideoChannel parameters: - $ref: '#/components/parameters/id3' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' requestBody: $ref: '#/components/requestBodies/VideoChannelInput' delete: summary: Delete a video channel by its id security: - OAuth2: [] tags: - VideoChannel parameters: - $ref: '#/components/parameters/id3' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' '/video-channels/{id}/videos': get: summary: Get videos of a video channel by its id tags: - VideoChannel parameters: - $ref: '#/components/parameters/id3' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/Video' '/accounts/{name}/video-channels': get: summary: Get video channels of an account by its name tags: - VideoChannel parameters: - $ref: '#/components/parameters/name' responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/VideoChannel' '/videos/{id}/comment-threads': get: summary: Get the comment threads of a video by its id tags: - VideoComment parameters: - $ref: '#/components/parameters/id2' - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/CommentThreadResponse' post: summary: 'Creates a comment thread, on a video by its id' security: - OAuth2: [] tags: - VideoComment parameters: - $ref: '#/components/parameters/id2' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/CommentThreadPostResponse' '/videos/{id}/comment-threads/{threadId}': get: summary: 'Get the comment thread by its id, of a video by its id' tags: - VideoComment parameters: - $ref: '#/components/parameters/id2' - name: threadId in: path required: true description: The thread id (root comment id) schema: type: number responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/VideoCommentThreadTree' '/videos/{id}/comments/{commentId}': post: summary: 'Creates a comment in a comment thread by its id, of a video by its id' security: - OAuth2: [] tags: - VideoComment parameters: - $ref: '#/components/parameters/id2' - $ref: '#/components/parameters/commentId' responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/CommentThreadPostResponse' delete: summary: 'Delete a comment in a comment therad by its id, of a video by its id' security: - OAuth2: [] tags: - VideoComment parameters: - $ref: '#/components/parameters/id2' - $ref: '#/components/parameters/commentId' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' '/videos/{id}/rate': put: summary: Vote for a video by its id security: - OAuth2: [] tags: - VideoRate parameters: - $ref: '#/components/parameters/id2' responses: '204': $ref: '#/paths/~1users~1me/put/responses/204' /search/videos: get: tags: - Search summary: Get the videos corresponding to a given query parameters: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' - name: search in: query required: true description: String to search schema: type: string responses: '200': description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Video' servers: - url: 'https://peertube2.cpy.re/api/v1' description: Live Server 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 name: name: name in: path required: true description: >- The name of the account (chocobozzz or chocobozzz@peertube.cpy.re for example) schema: type: string id: name: id in: path required: true description: The user id schema: type: number id2: name: id in: path required: true description: The video id or uuid schema: type: string id3: name: id in: path required: true description: The video channel id or uuid schema: type: string commentId: name: threadId in: path required: true description: The comment id schema: type: number requestBodies: VideoChannelInput: content: application/json: schema: $ref: '#/components/schemas/VideoChannelInput' securitySchemes: OAuth2: description: > In the header: *Authorization: Bearer * Authenticating via OAuth requires the following steps: - Have an account with sufficient authorization levels - [Generate](https://docs.joinpeertube.org/lang/en/devdocs/rest.html) a Bearer Token - Make Authenticated Requests type: oauth2 flows: password: tokenUrl: 'https://peertube.example.com/api/v1/users/token' scopes: admin: Admin scope moderator: Moderator scope user: User scope schemas: VideoConstantNumber: properties: id: type: number label: type: string VideoConstantString: properties: id: type: string label: type: string VideoPrivacy: type: string enum: - Public - Unlisted - Private Video: properties: id: type: number uuid: type: string createdAt: type: string publishedAt: type: string updatedAt: type: string category: $ref: '#/components/schemas/VideoConstantNumber' licence: $ref: '#/components/schemas/VideoConstantNumber' language: $ref: '#/components/schemas/VideoConstantString' privacy: $ref: '#/components/schemas/VideoPrivacy' description: type: string duration: type: number isLocal: type: boolean name: type: string thumbnailPath: type: string previewPath: type: string embedPath: type: string views: type: number likes: type: number dislikes: type: number nsfw: type: boolean account: type: object properties: name: type: string displayName: type: string url: type: string host: type: string avatar: $ref: '#/components/schemas/Avatar' VideoAbuse: properties: id: type: number reason: type: string reporterAccount: $ref: '#/components/schemas/Account' video: type: object properties: id: type: number name: type: string uuid: type: string url: type: string createdAt: type: string VideoBlacklist: properties: id: type: number videoId: type: number createdAt: type: string updatedAt: type: string name: type: string uuid: type: string description: type: string duration: type: number views: type: number likes: type: number dislikes: type: number nsfw: type: boolean VideoChannel: properties: displayName: type: string description: type: string isLocal: type: boolean ownerAccount: type: object properties: id: type: number uuid: type: string VideoComment: properties: id: type: number url: type: string text: type: string threadId: type: number inReplyToCommentId: type: number videoId: type: number createdAt: type: string updatedAt: type: string totalReplies: type: number account: $ref: '#/components/schemas/Account' VideoCommentThreadTree: properties: comment: $ref: '#/components/schemas/VideoComment' children: type: array items: $ref: '#/components/schemas/VideoCommentThreadTree' Avatar: properties: path: type: string createdAt: type: string updatedAt: type: string Actor: properties: id: type: number uuid: type: string url: type: string name: type: string host: type: string followingCount: type: number followersCount: type: number createdAt: type: string updatedAt: type: string avatar: $ref: '#/components/schemas/Avatar' Account: allOf: - $ref: '#/components/schemas/Actor' - properties: displayName: type: string User: properties: id: type: number username: type: string email: type: string displayNSFW: type: boolean autoPlayVideo: type: boolean role: type: string enum: - User - Moderator - Administrator videoQuota: type: number createdAt: type: string account: $ref: '#/components/schemas/Account' videoChannels: type: array items: $ref: '#/components/schemas/VideoChannel' ServerConfig: properties: signup: type: object properties: allowed: type: boolean transcoding: type: object properties: enabledResolutions: type: array items: type: number avatar: type: object properties: file: type: object properties: size: type: object properties: max: type: number extensions: type: array items: type: string video: type: object properties: file: type: object properties: extensions: type: array items: type: string Follow: properties: id: type: number follower: $ref: '#/components/schemas/Actor' following: $ref: '#/components/schemas/Actor' score: type: number state: type: string enum: - pending - accepted createdAt: type: string updatedAt: type: string Job: properties: id: type: number state: type: string enum: - pending - processing - error - success category: type: string enum: - transcoding - activitypub-http handlerName: type: string handlerInputData: type: string createdAt: type: string updatedAt: type: string AddUserResponse: properties: id: type: number uuid: type: string VideoUploadResponse: properties: video: type: object properties: id: type: number uuid: type: string CommentThreadResponse: properties: total: type: number data: type: array items: $ref: '#/components/schemas/VideoComment' CommentThreadPostResponse: properties: comment: $ref: '#/components/schemas/VideoComment' AddUser: properties: username: type: string description: 'The user username ' password: type: string description: 'The user password ' email: type: string description: 'The user email ' videoQuota: type: string description: 'The user videoQuota ' role: type: string description: 'The user role ' required: - username - password - email - videoQuota - role UpdateUser: properties: id: type: string description: 'The user id ' email: type: string description: 'The updated email of the user ' videoQuota: type: string description: 'The updated videoQuota of the user ' role: type: string description: 'The updated role of the user ' required: - id - email - videoQuota - role UpdateMe: properties: password: type: string description: 'Your new password ' email: type: string description: 'Your new email ' displayNSFW: type: string description: 'Your new displayNSFW ' autoPlayVideo: type: string description: 'Your new autoPlayVideo ' required: - password - email - displayNSFW - autoPlayVideo GetMeVideoRating: properties: id: type: string description: 'Id of the video ' rating: type: number description: 'Rating of the video ' required: - id - rating RegisterUser: properties: username: type: string description: 'The username of the user ' password: type: string description: 'The password of the user ' email: type: string description: 'The email of the user ' required: - username - password - email VideoChannelInput: properties: name: type: string description: type: string