openapi: 3.0.3 info: title: PeerTube Abuses Video Feeds API version: 8.1.0 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 altText: PeerTube Project Homepage description: "The PeerTube API is built on HTTP(S) and is RESTful. You can use your favorite\nHTTP/REST library for your programming language to use PeerTube.\n\nSee the [REST API quick start](https://docs.joinpeertube.org/api/rest-getting-started) for a few\nexamples of using the PeerTube API.\n\n# Authentication\n\nWhen you sign up for an account on a PeerTube instance, you are given the possibility\nto generate sessions on it, and authenticate there using an access token. Only __one\naccess token can currently be used at a time__.\n\n## Roles\n\nAccounts are given permissions based on their role. There are three roles on\nPeerTube: Administrator, Moderator, and User. See the [roles guide](https://docs.joinpeertube.org/admin/managing-users#roles) for a detail of their permissions.\n\n# Errors\n\nThe API uses standard HTTP status codes to indicate the success or failure\nof the API call, completed by a [RFC7807-compliant](https://tools.ietf.org/html/rfc7807) response body.\n\n```\nHTTP 1.1 404 Not Found\nContent-Type: application/problem+json; charset=utf-8\n\n{\n \"detail\": \"Video not found\",\n \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n \"status\": 404,\n \"title\": \"Not Found\",\n \"type\": \"about:blank\"\n}\n```\n\nWe provide error `type` (following RFC7807) and `code` (internal PeerTube code) values for [a growing number of cases](https://github.com/Chocobozzz/PeerTube/blob/develop/packages/models/src/server/server-error-code.enum.ts),\nbut it is still optional. Types are used to disambiguate errors that bear the same status code\nand are non-obvious:\n\n```\nHTTP 1.1 403 Forbidden\nContent-Type: application/problem+json; charset=utf-8\n\n{\n \"detail\": \"Cannot get this video regarding follow constraints\",\n \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n \"status\": 403,\n \"title\": \"Forbidden\",\n \"type\": \"https://docs.joinpeertube.org/api-rest-reference.html#section/Errors/does_not_respect_follow_constraints\"\n}\n```\n\nHere a 403 error could otherwise mean that the video is private or blocklisted.\n\n### Validation errors\n\nEach parameter is evaluated on its own against a set of rules before the route validator\nproceeds with potential testing involving parameter combinations. Errors coming from validation\nerrors appear earlier and benefit from a more detailed error description:\n\n```\nHTTP 1.1 400 Bad Request\nContent-Type: application/problem+json; charset=utf-8\n\n{\n \"detail\": \"Incorrect request parameters: id\",\n \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n \"instance\": \"/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180\",\n \"invalid-params\": {\n \"id\": {\n \"location\": \"params\",\n \"msg\": \"Invalid value\",\n \"param\": \"id\",\n \"value\": \"9c9de5e8-0a1e-484a-b099-e80766180\"\n }\n },\n \"status\": 400,\n \"title\": \"Bad Request\",\n \"type\": \"about:blank\"\n}\n```\n\nWhere `id` is the name of the field concerned by the error, within the route definition.\n`invalid-params..location` can be either 'params', 'body', 'header', 'query' or 'cookies', and\n`invalid-params..value` reports the value that didn't pass validation whose `invalid-params..msg`\nis about.\n\n### Deprecated error fields\n\nSome fields could be included with previous versions. They are still included but their use is deprecated:\n- `error`: superseded by `detail`\n\n# Rate limits\n\nWe are rate-limiting all endpoints of PeerTube's API. Custom values can be set by administrators:\n\n| Endpoint (prefix: `/api/v1`) | Calls | Time frame |\n|------------------------------|---------------|--------------|\n| `/*` | 50 | 10 seconds |\n| `POST /users/token` | 15 | 5 minutes |\n| `POST /users/register` | 2* | 5 minutes |\n| `POST /users/ask-send-verify-email` | 3 | 5 minutes |\n\nDepending on the endpoint, *failed requests are not taken into account. A service\nlimit is announced by a `429 Too Many Requests` status code.\n\nYou can get details about the current state of your rate limit by reading the\nfollowing headers:\n\n| Header | Description |\n|-------------------------|------------------------------------------------------------|\n| `X-RateLimit-Limit` | Number of max requests allowed in the current time period |\n| `X-RateLimit-Remaining` | Number of remaining requests in the current time period |\n| `X-RateLimit-Reset` | Timestamp of end of current time period as UNIX timestamp |\n| `Retry-After` | Seconds to delay after the first `429` is received |\n\n# CORS\n\nThis API features [Cross-Origin Resource Sharing (CORS)](https://fetch.spec.whatwg.org/),\nallowing cross-domain communication from the browser for some routes:\n\n| Endpoint |\n|------------------------- ---|\n| `/api/*` |\n| `/download/*` |\n| `/lazy-static/*` |\n| `/.well-known/webfinger` |\n\nIn addition, all routes serving ActivityPub are CORS-enabled for all origins.\n" 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) tags: - name: Video Feeds description: Server syndication feeds of videos paths: /feeds/video-comments.{format}: get: tags: - Video Feeds summary: Comments on videos feeds operationId: getSyndicatedComments parameters: - name: format in: path required: true description: format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/media-rss)) schema: type: string enum: - xml - rss - rss2 - atom - atom1 - json - json1 - name: videoId in: query description: limit listing comments to a specific video schema: type: string - name: accountId in: query description: limit listing comments to videos of a specific account schema: type: string - name: accountName in: query description: limit listing comments to videos of a specific account schema: type: string - name: videoChannelId in: query description: limit listing comments to videos of a specific video channel schema: type: string - name: videoChannelName in: query description: limit listing comments to videos of a specific video channel schema: type: string responses: '200': description: successful operation headers: Cache-Control: schema: type: string default: max-age=900 content: application/xml: schema: $ref: '#/components/schemas/VideoCommentsForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?scope=local application/rss+xml: schema: $ref: '#/components/schemas/VideoCommentsForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?scope=local text/xml: schema: $ref: '#/components/schemas/VideoCommentsForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?scope=local application/atom+xml: schema: $ref: '#/components/schemas/VideoCommentsForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?scope=local application/json: schema: type: object examples: nightly: externalValue: https://peertube2.cpy.re/feeds/video-comments.json?scope=local '400': x-summary: field inconsistencies description: "Arises when:\n - videoId filter is mixed with a channel filter\n" '404': description: video, video channel or account not found '406': description: accept header unsupported /feeds/videos.{format}: get: tags: - Video Feeds summary: Common videos feeds operationId: getSyndicatedVideos parameters: - name: format in: path required: true description: format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/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 - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/nsfw' - $ref: '#/components/parameters/isLocal' - $ref: '#/components/parameters/include' - $ref: '#/components/parameters/privacyOneOf' - $ref: '#/components/parameters/hasHLSFiles' - $ref: '#/components/parameters/hasWebVideoFiles' responses: '200': description: successful operation headers: Cache-Control: schema: type: string default: max-age=900 content: application/xml: schema: $ref: '#/components/schemas/VideosForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/videos.xml?scope=local application/rss+xml: schema: $ref: '#/components/schemas/VideosForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/videos.rss?scope=local text/xml: schema: $ref: '#/components/schemas/VideosForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/videos.xml?scope=local application/atom+xml: schema: $ref: '#/components/schemas/VideosForXML' examples: nightly: externalValue: https://peertube2.cpy.re/feeds/videos.atom?scope=local application/json: schema: type: object examples: nightly: externalValue: https://peertube2.cpy.re/feeds/videos.json?scope=local '404': description: video channel or account not found '406': description: accept header unsupported /feeds/subscriptions.{format}: get: tags: - Video Feeds summary: Videos of subscriptions feeds operationId: getSyndicatedSubscriptionVideos parameters: - name: format in: path required: true description: format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/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 required: true - name: token in: query description: private token allowing access schema: type: string required: true - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/nsfw' - $ref: '#/components/parameters/isLocal' - $ref: '#/components/parameters/include' - $ref: '#/components/parameters/privacyOneOf' - $ref: '#/components/parameters/hasHLSFiles' - $ref: '#/components/parameters/hasWebVideoFiles' responses: '200': description: successful operation headers: Cache-Control: schema: type: string default: max-age=900 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 /feeds/podcast/videos.xml: get: tags: - Video Feeds summary: Videos podcast feed operationId: getVideosPodcastFeed parameters: - name: videoChannelId in: query description: Limit listing to a specific video channel required: true schema: type: string responses: '200': description: successful operation headers: Cache-Control: schema: type: string default: max-age=900 '404': description: video channel not found components: parameters: hasHLSFiles: name: hasHLSFiles in: query required: false schema: type: boolean description: '**PeerTube >= 4.0** Display only videos that have HLS files' privacyOneOf: name: privacyOneOf in: query required: false schema: $ref: '#/components/schemas/VideoPrivacySet' description: '**PeerTube >= 4.0** Display only videos in this specific privacy/privacies' nsfw: name: nsfw in: query required: false description: whether to include nsfw videos, if any schema: type: string enum: - 'true' - 'false' hasWebVideoFiles: name: hasWebVideoFiles in: query required: false schema: type: boolean description: '**PeerTube >= 6.0** Display only videos that have Web Video files' include: name: include in: query required: false schema: type: integer enum: - 0 - 1 - 2 - 4 - 8 - 16 - 32 description: '**Only administrators and moderators can use this parameter** Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE ' sort: name: sort in: query required: false description: Sort column schema: type: string example: -createdAt isLocal: name: isLocal in: query required: false schema: type: boolean description: '**PeerTube >= 4.0** Display only local or remote objects' schemas: VideoPrivacySet: type: integer enum: - 1 - 2 - 3 - 4 - 5 description: privacy id of the video (see [/videos/privacies](#operation/getVideoPrivacyPolicies)) VideosForXML: type: array xml: wrapped: true name: channel items: type: object xml: name: item properties: link: type: string format: url 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 format: url description: video embed path, relative to the canonical URL domain (MRSS) xml: attribute: true media:player: type: object properties: url: type: string format: url description: video watch path, relative to the canonical URL domain (MRSS) xml: attribute: true media:thumbnail: type: object properties: url: type: string format: url 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 format: url 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' MRSSPeerLink: type: object xml: name: media:peerLink properties: href: type: string xml: attribute: true type: type: string enum: - application/x-bittorrent xml: attribute: true VideoCommentsForXML: type: array xml: wrapped: true name: channel items: type: object xml: name: item properties: link: type: string format: url guid: type: string pubDate: type: string format: date-time content:encoded: type: string dc:creator: type: string MRSSGroupContent: type: object xml: name: media:content properties: url: type: string format: url 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 securitySchemes: OAuth2: description: 'Authenticating via OAuth requires the following steps: - Have an activated account - [Generate] an access token for that account at `/api/v1/users/token`. - Make requests with the *Authorization: Bearer * header - Profit, depending on the role assigned to the account Note that the __access token is valid for 1 day__ and is given along with a __refresh token valid for 2 weeks__. [Generate]: https://docs.joinpeertube.org/api/rest-getting-started ' type: oauth2 flows: password: tokenUrl: /api/v1/users/token scopes: admin: Admin scope moderator: Moderator scope user: User scope externalDocs: url: https://docs.joinpeertube.org/api-rest-reference.html x-tagGroups: - name: Static endpoints tags: - Static Video Files - name: Download tags: - Video Download - name: Feeds tags: - Video Feeds - name: Auth tags: - Register - Session - name: Accounts tags: - Accounts - Users - User Exports - User Imports - My User - My Subscriptions - My Notifications - My History - name: Videos tags: - Video - Video Upload - Video Imports - Video Captions - Video Chapters - Video Channels - Video Comments - Video Rates - Video Playlists - Video Stats - Ownership Change - Video Mirroring - Video Files - Video Transcoding - Live Videos - Channels Sync - Video Passwords - Video Embed Privacy - name: Search tags: - Search - name: Moderation tags: - Abuses - Video Blocks - Account Blocklist - Server Blocklist - Automatic Tags - Watched Words - name: Instance tags: - Config - Client Config - Homepage - Instance Follows - Instance Redundancy - Plugins - Stats - Logs - Job - name: Remote Jobs tags: - Runner Registration Token - Runner Jobs - Runners