openapi: 3.0.0
info:
title: PeerTube
- version: 4.0.0
+ version: 5.1.0
contact:
name: PeerTube Community
url: https://joinpeertube.org
- [Go](https://framagit.org/framasoft/peertube/clients/go)
- [Kotlin](https://framagit.org/framasoft/peertube/clients/kotlin)
- See the [REST API quick start](https://docs.joinpeertube.org/api-rest-getting-started) for a few
+ See the [REST API quick start](https://docs.joinpeertube.org/api/rest-getting-started) for a few
examples of using the PeerTube API.
# Authentication
## Roles
Accounts are given permissions based on their role. There are three roles on
- PeerTube: Administrator, Moderator, and User. See the [roles guide](https://docs.joinpeertube.org/admin-managing-users?id=roles) for a detail of their permissions.
+ PeerTube: Administrator, Moderator, and User. See the [roles guide](https://docs.joinpeertube.org/admin/managing-users#roles) for a detail of their permissions.
# Errors
| `/api/*` |
| `/download/*` |
| `/lazy-static/*` |
- | `/live/segments-sha256/*` |
| `/.well-known/webfinger` |
In addition, all routes serving ActivityPub are CORS-enabled for all origins.
information across its social graph by posting activities to actors' inbox
endpoints.
externalDocs:
- url: https://docs.joinpeertube.org/admin-following-instances?id=instances-follows
+ url: https://docs.joinpeertube.org/admin/following-instances#instances-follows
- name: Instance Redundancy
description: >
Redundancy is part of the inter-server solidarity that PeerTube fosters.
to the policy of video selection of your choice. Note that you have a similar functionality
to mirror individual videos, see [video mirroring](#tag/Video-Mirroring).
externalDocs:
- url: https://docs.joinpeertube.org/admin-following-instances?id=instances-redundancy
+ url: https://docs.joinpeertube.org/admin/following-instances#instances-redundancy
- name: Plugins
description: >
Managing plugins installed from a local path or from NPM, or search for new ones.
externalDocs:
- url: https://docs.joinpeertube.org/api-plugins
+ url: https://docs.joinpeertube.org/api/plugins
- name: Abuses
description: |
Abuses deal with reports of local or remote videos/comments/accounts alike.
### Import
- _URL_-based: where the URL points to any service supported by [youtube-dl](https://ytdl-org.github.io/youtube-dl/)
- - _magnet_-based: where the URI resolves to a BitTorrent ressource containing a single supported video file
- - _torrent_-based: where the metainfo file resolves to a BitTorrent ressource containing a single supported video file
+ - _magnet_-based: where the URI resolves to a BitTorrent resource containing a single supported video file
+ - _torrent_-based: where the metainfo file resolves to a BitTorrent resource containing a single supported video file
The import function is practical when the desired video/audio is available online. It makes PeerTube
download it for you, saving you as much bandwidth and avoiding any instability or limitation your network might have.
- name: Video Imports
description: Operations dealing with listing, adding and removing video imports.
+ - name: Channels Sync
+ description: Operations dealing with synchronizing PeerTube user's channel with channels of other platforms
- name: Video Captions
description: Operations dealing with listing, adding and removing closed captions of a video.
- name: Video Channels
description: Operations on video files
- name: Video Transcoding
description: Video transcoding related operations
- - name: Feeds
- description: Server syndication feeds
+ - name: Video Stats
+ description: Video statistics
+ - name: Video Feeds
+ description: Server syndication feeds of videos
- name: Search
description: |
The search helps to find _videos_ or _channels_ from within the instance and beyond.
PeerTube instances can mirror videos from one another, and help distribute some videos.
For importing videos as your own, refer to [video imports](#operation/importVideo).
+ - name: Stats
+ description: |
+ Statistics
+ - name: Runner Registration Token
+ description: |
+ Manage runner registration token
+
x-tagGroups:
+ - name: Static endpoints
+ tags:
+ - Static Video Files
+ - name: Feeds
+ tags:
+ - Video Feeds
- name: Auth
tags:
- Register
- Video Comments
- Video Rates
- Video Playlists
+ - Video Stats
- Video Ownership Change
- Video Mirroring
- Video Files
- Video Transcoding
- Live Videos
- - Feeds
+ - Channels Sync
- name: Search
tags:
- Search
- - name: Custom pages
- tags:
- - Homepage
- name: Moderation
tags:
- Abuses
- Video Blocks
- Account Blocks
- Server Blocks
- - name: Instance Configuration
+ - name: Instance
tags:
- Config
+ - Homepage
- Instance Follows
- Instance Redundancy
- Plugins
- - name: Jobs
- tags:
+ - Stats
+ - Logs
- Job
+ - name: Remote Jobs
+ tags:
+ - Runner Registration Token
+ - Runner Jobs
+ - Runners
+
paths:
- '/accounts/{name}':
+ '/static/webseed/{filename}':
get:
tags:
- - Accounts
- summary: Get an account
- operationId: getAccount
+ - Static Video Files
+ summary: Get public WebTorrent video file
parameters:
- - $ref: '#/components/parameters/name'
+ - $ref: '#/components/parameters/staticFilename'
responses:
'200':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Account'
'404':
- description: account not found
-
- '/accounts/{name}/videos':
+ description: not found
+ '/static/webseed/private/{filename}':
get:
tags:
- - Accounts
- - Video
- summary: 'List videos of an account'
- operationId: getAccountVideos
+ - Static Video Files
+ summary: Get private WebTorrent video file
parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/staticFilename'
+ - $ref: '#/components/parameters/videoFileToken'
+ security:
+ - OAuth2: []
responses:
'200':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- x-codeSamples:
- - 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: |
- ## DEPENDENCIES: jq
- curl -s https://peertube2.cpy.re/api/v1/accounts/{name}/videos | jq
- - lang: Ruby
- source: |
- require 'net/http'
- require 'json'
-
- uri = URI.parse("https://peertube2.cpy.re/api/v1/accounts/{name}/videos")
-
- http = Net::HTTP.new(uri.host, uri.port)
- http.use_ssl = true
-
- response = http.get(uri.request_uri)
-
- puts JSON.parse(response.read_body)
- - lang: Python
- source: |
- import requests
-
- r = requests.get("https://peertube2.cpy.re/api/v1//accounts/{name}/videos")
- json = r.json()
-
- print(json)
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
- '/accounts/{name}/followers':
+ '/static/streaming-playlists/hls/{filename}':
get:
tags:
- - Accounts
- summary: 'List followers of an account'
+ - Static Video Files
+ summary: Get public HLS video file
+ parameters:
+ - $ref: '#/components/parameters/staticFilename'
security:
- OAuth2: []
- operationId: getAccountFollowers
- parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/followersSort'
- - $ref: '#/components/parameters/search'
responses:
'200':
description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
-
- /accounts:
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
+ '/static/streaming-playlists/hls/private/{filename}':
get:
tags:
- - Accounts
- summary: List accounts
- operationId: getAccounts
+ - Static Video Files
+ summary: Get private HLS video file
parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/staticFilename'
+ - $ref: '#/components/parameters/videoFileToken'
+ - $ref: '#/components/parameters/reinjectVideoFileToken'
+ security:
+ - OAuth2: []
responses:
'200':
description: successful operation
- content:
- 'application/json':
- schema:
- type: array
- items:
- $ref: '#/components/schemas/Account'
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
- /config:
+
+ '/feeds/video-comments.{format}':
get:
tags:
- - Config
- summary: Get instance public configuration
- operationId: getConfig
+ - Video Feeds
+ summary: List comments on videos
+ operationId: getSyndicatedComments
+ parameters:
+ - name: format
+ in: path
+ required: true
+ description: 'format expected (we focus on making `rss` the most featureful ; 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 to a specific video'
+ schema:
+ type: string
+ - 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:
- '200':
+ '204':
description: successful operation
+ headers:
+ Cache-Control:
+ schema:
+ type: string
+ default: 'max-age=900' # 15 min cache
content:
- application/json:
+ application/xml:
schema:
- $ref: '#/components/schemas/ServerConfig'
+ $ref: '#/components/schemas/VideoCommentsForXML'
examples:
nightly:
- externalValue: https://peertube2.cpy.re/api/v1/config
-
- /config/about:
- get:
- summary: Get instance "About" information
- operationId: getAbout
- tags:
- - Config
- responses:
- '200':
- description: successful operation
- content:
- application/json:
+ externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
+ application/rss+xml:
schema:
- $ref: '#/components/schemas/ServerConfigAbout'
+ $ref: '#/components/schemas/VideoCommentsForXML'
examples:
nightly:
- externalValue: https://peertube2.cpy.re/api/v1/config/about
-
- /config/custom:
- get:
- summary: Get instance runtime configuration
- operationId: getCustomConfig
- tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- content:
+ externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?filter=local
+ text/xml:
+ schema:
+ $ref: '#/components/schemas/VideoCommentsForXML'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
+ application/atom+xml:
+ schema:
+ $ref: '#/components/schemas/VideoCommentsForXML'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?filter=local
application/json:
schema:
- $ref: '#/components/schemas/ServerConfigCustom'
- put:
- summary: Set instance runtime configuration
- operationId: putCustomConfig
- tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
+ type: object
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/video-comments.json?filter=local
'400':
x-summary: field inconsistencies
description: >
Arises when:
- - the emailer is disabled and the instance is open to registrations
- - webtorrent and hls are disabled with transcoding enabled - you need at least one enabled
- delete:
- summary: Delete instance runtime configuration
- operationId: delCustomConfig
+ - videoId filter is mixed with a channel filter
+ '404':
+ description: video, video channel or account not found
+ '406':
+ description: accept header unsupported
+
+ '/feeds/videos.{format}':
+ get:
tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
-
- /custom-pages/homepage/instance:
- get:
- summary: Get instance custom homepage
- tags:
- - Homepage
+ - Video Feeds
+ summary: List videos
+ operationId: getSyndicatedVideos
+ parameters:
+ - name: format
+ in: path
+ required: true
+ description: 'format expected (we focus on making `rss` the most featureful ; 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/hasWebtorrentFiles'
responses:
- '404':
- description: No homepage set
- '200':
+ '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'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
+ application/rss+xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/videos.rss?filter=local
+ text/xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
+ application/atom+xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/videos.atom?filter=local
application/json:
schema:
- $ref: '#/components/schemas/CustomHomepage'
- put:
- summary: Set instance custom homepage
- tags:
- - Homepage
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- content:
- type: string
- description: content of the homepage, that will be injected in the client
- responses:
- '204':
- description: successful operation
-
- /jobs/pause:
- post:
- summary: Pause job queue
- security:
- - OAuth2:
- - admin
- tags:
- - Job
- responses:
- '204':
- description: successful operation
-
- /jobs/resume:
- post:
- summary: Resume job queue
- security:
- - OAuth2:
- - admin
- tags:
- - Job
- responses:
- '204':
- description: successful operation
+ type: object
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/feeds/videos.json?filter=local
+ '404':
+ description: video channel or account not found
+ '406':
+ description: accept header unsupported
- /jobs/{state}:
+ '/feeds/subscriptions.{format}':
get:
- summary: List instance jobs
- operationId: getJobs
- security:
- - OAuth2:
- - admin
tags:
- - Job
+ - Video Feeds
+ summary: List videos of subscriptions tied to a token
+ operationId: getSyndicatedSubscriptionVideos
parameters:
- - name: state
+ - name: format
in: path
required: true
- description: The state of the job ('' for for no filter)
+ description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))'
schema:
type: string
enum:
- - ''
- - active
- - completed
- - failed
- - waiting
- - delayed
- - $ref: '#/components/parameters/jobType'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
+ - 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/hasWebtorrentFiles'
responses:
- '200':
+ '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
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/Job'
+ '406':
+ description: accept header unsupported
- /server/followers:
+ '/api/v1/accounts/{name}':
get:
tags:
- - Instance Follows
- summary: List instances following the server
+ - Accounts
+ summary: Get an account
+ operationId: getAccount
parameters:
- - $ref: '#/components/parameters/followState'
- - $ref: '#/components/parameters/actorType'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/name'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
+ $ref: '#/components/schemas/Account'
+ '404':
+ description: account not found
- '/server/followers/{nameWithHost}':
- delete:
- summary: Remove or reject a follower to your server
- security:
- - OAuth2:
- - admin
+ '/api/v1/accounts/{name}/videos':
+ get:
tags:
- - Instance Follows
+ - Accounts
+ - Video
+ summary: 'List videos of an account'
+ operationId: getAccountVideos
parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
+ - $ref: '#/components/parameters/name'
+ - $ref: '#/components/parameters/categoryOneOf'
+ - $ref: '#/components/parameters/isLive'
+ - $ref: '#/components/parameters/tagsOneOf'
+ - $ref: '#/components/parameters/tagsAllOf'
+ - $ref: '#/components/parameters/licenceOneOf'
+ - $ref: '#/components/parameters/languageOneOf'
+ - $ref: '#/components/parameters/nsfw'
+ - $ref: '#/components/parameters/isLocal'
+ - $ref: '#/components/parameters/include'
+ - $ref: '#/components/parameters/privacyOneOf'
+ - $ref: '#/components/parameters/hasHLSFiles'
+ - $ref: '#/components/parameters/hasWebtorrentFiles'
+ - $ref: '#/components/parameters/skipCount'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/excludeAlreadyWatched'
responses:
- '204':
+ '200':
description: successful operation
- '404':
- description: follower not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoListResponse'
+ x-codeSamples:
+ - 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: |
+ ## DEPENDENCIES: jq
+ curl -s https://peertube2.cpy.re/api/v1/accounts/{name}/videos | jq
+ - lang: Ruby
+ source: |
+ require 'net/http'
+ require 'json'
- '/server/followers/{nameWithHost}/reject':
- post:
- summary: Reject a pending follower to your server
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
- responses:
- '204':
- description: successful operation
- '404':
- description: follower not found
+ uri = URI.parse("https://peertube2.cpy.re/api/v1/accounts/{name}/videos")
- '/server/followers/{nameWithHost}/accept':
- post:
- summary: Accept a pending follower to your server
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
- responses:
- '204':
- description: successful operation
- '404':
- description: follower not found
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = true
+
+ response = http.get(uri.request_uri)
+
+ puts JSON.parse(response.read_body)
+ - lang: Python
+ source: |
+ import requests
+
+ r = requests.get("https://peertube2.cpy.re/api/v1//accounts/{name}/videos")
+ json = r.json()
- /server/following:
+ print(json)
+
+ '/api/v1/accounts/{name}/followers':
get:
tags:
- - Instance Follows
- summary: List instances followed by the server
+ - Accounts
+ summary: 'List followers of an account'
+ security:
+ - OAuth2: []
+ operationId: getAccountFollowers
parameters:
- - $ref: '#/components/parameters/followState'
- - $ref: '#/components/parameters/actorType'
+ - $ref: '#/components/parameters/name'
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/followersSort'
+ - $ref: '#/components/parameters/search'
responses:
'200':
description: successful operation
type: array
items:
$ref: '#/components/schemas/Follow'
- post:
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- summary: Follow a list of actors (PeerTube instance, channel or account)
- responses:
- '204':
- description: successful operation
- '500':
- description: cannot follow a non-HTTPS server
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- hosts:
- type: array
- items:
- type: string
- format: hostname
- uniqueItems: true
- handles:
- type: array
- items:
- type: string
- uniqueItems: true
- '/server/following/{hostOrHandle}':
- delete:
- summary: Unfollow an actor (PeerTube instance, channel or account)
- security:
- - OAuth2:
- - admin
+ /api/v1/accounts:
+ get:
tags:
- - Instance Follows
+ - Accounts
+ summary: List accounts
+ operationId: getAccounts
parameters:
- - name: hostOrHandle
- in: path
- required: true
- description: The hostOrHandle to unfollow
- schema:
- type: string
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
responses:
- '204':
+ '200':
description: successful operation
- '404':
- description: host or handle not found
+ content:
+ 'application/json':
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Account'
- /users:
- post:
- summary: Create a user
- operationId: addUser
- security:
- - OAuth2:
- - admin
+ /api/v1/config:
+ get:
tags:
- - Users
+ - Config
+ summary: Get instance public configuration
+ operationId: getConfig
responses:
'200':
- description: user created
+ description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/AddUserResponse'
- links:
- # GET /users/{id}
- GetUser:
- operationId: getUser
- parameters:
- id: '$response.body#/user/id'
- # PUT /users/{id}
- PutUser:
- operationId: putUser
- parameters:
- id: '$response.body#/user/id'
- # DELETE /users/{id}
- DelUser:
- operationId: delUser
- parameters:
- id: '$response.body#/user/id'
- '403':
- description: insufficient authority to create an admin or moderator
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AddUser'
- description: |
- If the smtp server is configured, you can leave the password empty and an email will be sent
- asking the user to set it first.
- required: true
+ $ref: '#/components/schemas/ServerConfig'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/config
+
+ /api/v1/config/about:
get:
- summary: List users
- operationId: getUsers
- security:
- - OAuth2:
- - admin
+ summary: Get instance "About" information
+ operationId: getAbout
tags:
- - Users
- parameters:
- - $ref: '#/components/parameters/usersSearch'
- - $ref: '#/components/parameters/usersBlocked'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/usersSort'
+ - Config
responses:
'200':
description: successful operation
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/User'
+ $ref: '#/components/schemas/ServerConfigAbout'
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/config/about
- '/users/{id}':
- parameters:
- - $ref: '#/components/parameters/id'
- delete:
- summary: Delete a user
+ /api/v1/config/custom:
+ get:
+ summary: Get instance runtime configuration
+ operationId: getCustomConfig
+ tags:
+ - Config
security:
- OAuth2:
- admin
- tags:
- - Users
- operationId: delUser
responses:
- '204':
+ '200':
description: successful operation
- get:
- summary: Get a user
- security:
- - OAuth2: []
- tags:
- - Users
- operationId: getUser
- parameters:
- - name: withStats
- in: query
- description: include statistics about the user (only available as a moderator/admin)
- schema:
- type: boolean
- responses:
- '200':
- x-summary: successful operation
- description: |
- As an admin/moderator, you can request a response augmented with statistics about the user's
- moderation relations and videos usage, by using the `withStats` parameter.
content:
application/json:
schema:
- oneOf:
- - $ref: '#/components/schemas/User'
- - $ref: '#/components/schemas/UserWithStats'
+ $ref: '#/components/schemas/ServerConfigCustom'
put:
- summary: Update a user
- security:
- - OAuth2: []
+ summary: Set instance runtime configuration
+ operationId: putCustomConfig
tags:
- - Users
- operationId: putUser
+ - Config
+ security:
+ - OAuth2:
+ - admin
responses:
- '204':
+ '200':
description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UpdateUser'
- required: true
-
- /oauth-clients/local:
- get:
- summary: Login prerequisite
- description: You need to retrieve a client id and secret before [logging in](#operation/getOAuthToken).
- operationId: getOAuthClient
+ '400':
+ x-summary: field inconsistencies
+ description: >
+ Arises when:
+ - the emailer is disabled and the instance is open to registrations
+ - webtorrent and hls are disabled with transcoding enabled - you need at least one enabled
+ delete:
+ summary: Delete instance runtime configuration
+ operationId: delCustomConfig
tags:
- - Session
+ - Config
+ security:
+ - OAuth2:
+ - admin
responses:
'200':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/OAuthClient'
- links:
- UseOAuthClientToLogin:
- operationId: getOAuthToken
- parameters:
- client_id: '$response.body#/client_id'
- client_secret: '$response.body#/client_secret'
- x-codeSamples:
- - lang: Shell
- source: |
- API="https://peertube2.cpy.re/api/v1"
-
- ## AUTH
- curl -s "$API/oauth-clients/local"
- /users/token:
- post:
- summary: Login
- operationId: getOAuthToken
- description: With your [client id and secret](#operation/getOAuthClient), you can retrieve an access and refresh tokens.
+ /api/v1/custom-pages/homepage/instance:
+ get:
+ summary: Get instance custom homepage
tags:
- - Session
- requestBody:
- content:
- application/x-www-form-urlencoded:
- schema:
- oneOf:
- - $ref: '#/components/schemas/OAuthToken-password'
- - $ref: '#/components/schemas/OAuthToken-refresh_token'
- discriminator:
- propertyName: grant_type
- mapping:
- password: '#/components/schemas/OAuthToken-password'
- refresh_token: '#/components/schemas/OAuthToken-refresh_token'
+ - Homepage
responses:
+ '404':
+ description: No homepage set
'200':
description: successful operation
content:
application/json:
schema:
- type: object
- properties:
- token_type:
- type: string
- example: Bearer
- access_token:
- type: string
- example: 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0
- description: valid for 1 day
- refresh_token:
- type: string
- example: 2e0d675df9fc96d2e4ec8a3ebbbf45eca9137bb7
- description: valid for 2 weeks
- expires_in:
- type: integer
- minimum: 0
- example: 14399
- refresh_token_expires_in:
- type: integer
- minimum: 0
- example: 1209600
- '400':
- x-summary: client or credentials are invalid
- description: |
- Disambiguate via `type`:
- - `invalid_client` for an unmatched `client_id`
- - `invalid_grant` for unmatched credentials
- '401':
- x-summary: token expired
- description: |
- Disambiguate via `type`:
- - default value for a regular authentication failure
- - `invalid_token` for an expired token
- x-codeSamples:
- - lang: Shell
- source: |
- ## DEPENDENCIES: jq
- API="https://peertube2.cpy.re/api/v1"
- USERNAME="<your_username>"
- PASSWORD="<your_password>"
-
- ## AUTH
- client_id=$(curl -s "$API/oauth-clients/local" | jq -r ".client_id")
- client_secret=$(curl -s "$API/oauth-clients/local" | jq -r ".client_secret")
- curl -s "$API/users/token" \
- --data client_id="$client_id" \
- --data client_secret="$client_secret" \
- --data grant_type=password \
- --data username="$USERNAME" \
- --data password="$PASSWORD" \
- | jq -r ".access_token"
-
- /users/revoke-token:
- post:
- summary: Logout
- description: Revokes your access token and its associated refresh token, destroying your current session.
- operationId: revokeOAuthToken
+ $ref: '#/components/schemas/CustomHomepage'
+ put:
+ summary: Set instance custom homepage
tags:
- - Session
+ - Homepage
security:
- - OAuth2: []
- responses:
- '200':
- description: successful operation
-
- /users/register:
- post:
- summary: Register a user
- operationId: registerUser
- tags:
- - Users
- - Register
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RegisterUser'
- required: true
-
- /users/{id}/verify-email:
- post:
- summary: Verify a user
- operationId: verifyUser
- description: |
- Following a user registration, the new user will receive an email asking to click a link
- containing a secret.
- tags:
- - Users
- - Register
- parameters:
- - $ref: '#/components/parameters/id'
+ - OAuth2:
+ - admin
requestBody:
content:
application/json:
schema:
type: object
properties:
- verificationString:
+ content:
type: string
- format: url
- isPendingEmail:
- type: boolean
- required:
- - verificationString
+ description: content of the homepage, that will be injected in the client
responses:
'204':
description: successful operation
- '403':
- description: invalid verification string
- '404':
- description: user not found
- /users/ask-send-verify-email:
+ /api/v1/jobs/pause:
post:
- summary: Resend user verification link
- operationId: resendEmailToVerifyUser
- tags:
- - Users
- - Register
- responses:
- '204':
- description: successful operation
-
- /users/me:
- get:
- summary: Get my user information
- operationId: getUserInfo
+ summary: Pause job queue
security:
- OAuth2:
- - user
+ - admin
tags:
- - My User
+ - Job
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/User'
- put:
- summary: Update my user information
- operationId: putUserInfo
+
+ /api/v1/jobs/resume:
+ post:
+ summary: Resume job queue
security:
- OAuth2:
- - user
+ - admin
tags:
- - My User
+ - Job
responses:
'204':
description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UpdateMe'
- required: true
- /users/me/videos/imports:
+ /api/v1/jobs/{state}:
get:
- summary: Get video imports of my user
+ summary: List instance jobs
+ operationId: getJobs
security:
- OAuth2:
- - user
+ - admin
tags:
- - Videos
- - My User
+ - Job
parameters:
+ - name: state
+ in: path
+ required: true
+ description: The state of the job ('' for for no filter)
+ schema:
+ type: string
+ enum:
+ - ''
+ - active
+ - completed
+ - failed
+ - waiting
+ - delayed
+ - $ref: '#/components/parameters/jobType'
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/sort'
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoImportsList'
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ maxItems: 100
+ items:
+ $ref: '#/components/schemas/Job'
- /users/me/video-quota-used:
+ /api/v1/server/followers:
get:
- summary: Get my user used quota
- security:
- - OAuth2:
- - user
tags:
- - My User
+ - Instance Follows
+ summary: List instances following the server
+ parameters:
+ - $ref: '#/components/parameters/followState'
+ - $ref: '#/components/parameters/actorType'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
responses:
'200':
description: successful operation
schema:
type: object
properties:
- videoQuotaUsed:
- type: number
- description: The user video quota used so far in bytes
- example: 16810141515
- videoQuotaUsedDaily:
- type: number
- description: The user video quota used today in bytes
- example: 1681014151
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Follow'
- '/users/me/videos/{videoId}/rating':
- get:
- summary: Get rate of my user for a video
+ '/api/v1/server/followers/{nameWithHost}':
+ delete:
+ summary: Remove or reject a follower to your server
security:
- - OAuth2: []
+ - OAuth2:
+ - admin
tags:
- - My User
- - Video Rates
+ - Instance Follows
parameters:
- - name: videoId
+ - name: nameWithHost
in: path
required: true
- description: The video id
+ description: The remote actor handle to remove from your followers
schema:
- $ref: '#/components/schemas/Video/properties/id'
+ type: string
+ format: email
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetMeVideoRating'
+ '404':
+ description: follower not found
- /users/me/videos:
- get:
- summary: Get videos of my user
+ '/api/v1/server/followers/{nameWithHost}/reject':
+ post:
+ summary: Reject a pending follower to your server
security:
- OAuth2:
- - user
+ - admin
tags:
- - My User
- - Videos
+ - Instance Follows
parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - name: nameWithHost
+ in: path
+ required: true
+ description: The remote actor handle to remove from your followers
+ schema:
+ type: string
+ format: email
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
+ '404':
+ description: follower not found
- /users/me/subscriptions:
- get:
- summary: Get my user subscriptions
+ '/api/v1/server/followers/{nameWithHost}/accept':
+ post:
+ summary: Accept a pending follower to your server
security:
- OAuth2:
- - user
+ - admin
tags:
- - My Subscriptions
+ - Instance Follows
+ parameters:
+ - name: nameWithHost
+ in: path
+ required: true
+ description: The remote actor handle to remove from your followers
+ schema:
+ type: string
+ format: email
+ responses:
+ '204':
+ description: successful operation
+ '404':
+ description: follower not found
+
+ /api/v1/server/following:
+ get:
+ tags:
+ - Instance Follows
+ summary: List instances followed by the server
parameters:
+ - $ref: '#/components/parameters/followState'
+ - $ref: '#/components/parameters/actorType'
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/sort'
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoChannelList'
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Follow'
post:
- tags:
- - My Subscriptions
- summary: Add subscription to my user
security:
- OAuth2:
- - user
+ - admin
+ tags:
+ - Instance Follows
+ summary: Follow a list of actors (PeerTube instance, channel or account)
+ responses:
+ '204':
+ description: successful operation
+ '500':
+ description: cannot follow a non-HTTPS server
requestBody:
content:
application/json:
schema:
type: object
properties:
- uri:
- type: string
- format: uri
- description: uri of the video channels to subscribe to
- required:
- - uri
- examples:
- default:
- value:
- uri: 008a0e54-375d-49d0-8379-143202e24152@video.lqdn.fr
- responses:
- '200':
- description: successful operation
-
- /users/me/subscriptions/exist:
- get:
- summary: Get if subscriptions exist for my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionsUris'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
+ hosts:
+ type: array
+ items:
+ type: string
+ format: hostname
+ uniqueItems: true
+ handles:
+ type: array
+ items:
+ type: string
+ uniqueItems: true
- /users/me/subscriptions/videos:
- get:
- summary: List videos of subscriptions of my user
+ '/api/v1/server/following/{hostOrHandle}':
+ delete:
+ summary: Unfollow an actor (PeerTube instance, channel or account)
security:
- OAuth2:
- - user
+ - admin
tags:
- - My Subscriptions
- - Videos
+ - Instance Follows
parameters:
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
+ - name: hostOrHandle
+ in: path
+ required: true
+ description: The hostOrHandle to unfollow
+ schema:
+ type: string
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
+ '404':
+ description: host or handle not found
- '/users/me/subscriptions/{subscriptionHandle}':
- get:
- summary: Get subscription of my user
+ /api/v1/users:
+ post:
+ summary: Create a user
+ operationId: addUser
security:
- OAuth2:
- - user
+ - admin
tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionHandle'
+ - Users
responses:
'200':
- description: successful operation
+ description: user created
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoChannel'
- delete:
- summary: Delete subscription of my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionHandle'
- responses:
- '200':
- description: successful operation
-
- /users/me/notifications:
+ $ref: '#/components/schemas/AddUserResponse'
+ links:
+ # GET /users/{id}
+ GetUser:
+ operationId: getUser
+ parameters:
+ id: '$response.body#/user/id'
+ # PUT /users/{id}
+ PutUser:
+ operationId: putUser
+ parameters:
+ id: '$response.body#/user/id'
+ # DELETE /users/{id}
+ DelUser:
+ operationId: delUser
+ parameters:
+ id: '$response.body#/user/id'
+ '403':
+ description: insufficient authority to create an admin or moderator
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AddUser'
+ description: |
+ If the smtp server is configured, you can leave the password empty and an email will be sent
+ asking the user to set it first.
+ required: true
get:
- summary: List my notifications
+ summary: List users
+ operationId: getUsers
security:
- - OAuth2: []
+ - OAuth2:
+ - admin
tags:
- - My Notifications
+ - Users
parameters:
- - name: unread
- in: query
- description: only list unread notifications
- schema:
- type: boolean
+ - $ref: '#/components/parameters/usersSearch'
+ - $ref: '#/components/parameters/usersBlocked'
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/usersSort'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/NotificationListResponse'
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
- /users/me/notifications/read:
- post:
- summary: Mark notifications as read by their id
+ '/api/v1/users/{id}':
+ parameters:
+ - $ref: '#/components/parameters/id'
+ delete:
+ summary: Delete a user
security:
- - OAuth2: []
+ - OAuth2:
+ - admin
tags:
- - My Notifications
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- ids:
- type: array
- description: ids of the notifications to mark as read
- items:
- type: integer
- required:
- - ids
+ - Users
+ operationId: delUser
responses:
'204':
description: successful operation
-
- /users/me/notifications/read-all:
- post:
- summary: Mark all my notification as read
+ get:
+ summary: Get a user
security:
- OAuth2: []
tags:
- - My Notifications
+ - Users
+ operationId: getUser
+ parameters:
+ - name: withStats
+ in: query
+ description: include statistics about the user (only available as a moderator/admin)
+ schema:
+ type: boolean
responses:
- '204':
- description: successful operation
-
- /users/me/notification-settings:
+ '200':
+ x-summary: successful operation
+ description: |
+ As an admin/moderator, you can request a response augmented with statistics about the user's
+ moderation relations and videos usage, by using the `withStats` parameter.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/User'
+ - $ref: '#/components/schemas/UserWithStats'
put:
- summary: Update my notification settings
+ summary: Update a user
security:
- OAuth2: []
tags:
- - My Notifications
+ - Users
+ operationId: putUser
+ responses:
+ '204':
+ description: successful operation
requestBody:
content:
application/json:
schema:
- type: object
- properties:
- newVideoFromSubscription:
- $ref: '#/components/schemas/NotificationSettingValue'
- newCommentOnMyVideo:
- $ref: '#/components/schemas/NotificationSettingValue'
- abuseAsModerator:
- $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
+ $ref: '#/components/schemas/UpdateUser'
+ required: true
- /users/me/history/videos:
+ /api/v1/oauth-clients/local:
get:
- summary: List watched videos history
- security:
- - OAuth2: []
+ summary: Login prerequisite
+ description: You need to retrieve a client id and secret before [logging in](#operation/getOAuthToken).
+ operationId: getOAuthClient
tags:
- - My History
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/search'
+ - Session
responses:
'200':
description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoListResponse'
+ $ref: '#/components/schemas/OAuthClient'
+ links:
+ UseOAuthClientToLogin:
+ operationId: getOAuthToken
+ parameters:
+ client_id: '$response.body#/client_id'
+ client_secret: '$response.body#/client_secret'
+ x-codeSamples:
+ - lang: Shell
+ source: |
+ API="https://peertube2.cpy.re/api/v1"
- /users/me/history/videos/{videoId}:
- delete:
- summary: Delete history element
- security:
- - OAuth2: []
- tags:
- - My History
- parameters:
- - name: videoId
- in: path
- required: true
- schema:
- $ref: '#/components/schemas/Video/properties/id'
- responses:
- '204':
- description: successful operation
+ ## AUTH
+ curl -s "$API/oauth-clients/local"
- /users/me/history/videos/remove:
+ /api/v1/users/token:
post:
- summary: Clear video history
- security:
- - OAuth2: []
+ summary: Login
+ operationId: getOAuthToken
+ description: With your [client id and secret](#operation/getOAuthClient), you can retrieve an access and refresh tokens.
tags:
- - My History
+ - Session
requestBody:
content:
- multipart/form-data:
+ application/x-www-form-urlencoded:
schema:
- type: object
- properties:
- beforeDate:
- description: history before this date will be deleted
- type: string
- format: date-time
- responses:
- '204':
- description: successful operation
-
- /users/me/avatar/pick:
- post:
- summary: Update my user avatar
- security:
- - OAuth2: []
- tags:
- - My User
+ oneOf:
+ - $ref: '#/components/schemas/OAuthToken-password'
+ - $ref: '#/components/schemas/OAuthToken-refresh_token'
+ discriminator:
+ propertyName: grant_type
+ mapping:
+ password: '#/components/schemas/OAuthToken-password'
+ refresh_token: '#/components/schemas/OAuthToken-refresh_token'
responses:
'200':
description: successful operation
schema:
type: object
properties:
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- '413':
- description: image file too large
- headers:
- X-File-Maximum-Size:
- schema:
- type: string
- format: Nginx size
- description: Maximum file size for the avatar
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- avatarfile:
- description: The file to upload
- type: string
- format: binary
- encoding:
- avatarfile:
- contentType: image/png, image/jpeg
-
- /users/me/avatar:
- delete:
- summary: Delete my avatar
- security:
- - OAuth2: []
- tags:
- - My User
- responses:
- '204':
- description: successful operation
+ token_type:
+ type: string
+ example: Bearer
+ access_token:
+ type: string
+ example: 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0
+ description: valid for 1 day
+ refresh_token:
+ type: string
+ example: 2e0d675df9fc96d2e4ec8a3ebbbf45eca9137bb7
+ description: valid for 2 weeks
+ expires_in:
+ type: integer
+ minimum: 0
+ example: 14399
+ refresh_token_expires_in:
+ type: integer
+ minimum: 0
+ example: 1209600
+ '400':
+ x-summary: client or credentials are invalid
+ description: |
+ Disambiguate via `type`:
+ - `invalid_client` for an unmatched `client_id`
+ - `invalid_grant` for unmatched credentials
+ '401':
+ x-summary: token expired
+ description: |
+ Disambiguate via `type`:
+ - default value for a regular authentication failure
+ - `invalid_token` for an expired token
+ x-codeSamples:
+ - lang: Shell
+ source: |
+ ## DEPENDENCIES: jq
+ API="https://peertube2.cpy.re/api/v1"
+ USERNAME="<your_username>"
+ PASSWORD="<your_password>"
- /videos/ownership:
- get:
- summary: List video ownership changes
+ ## AUTH
+ client_id=$(curl -s "$API/oauth-clients/local" | jq -r ".client_id")
+ client_secret=$(curl -s "$API/oauth-clients/local" | jq -r ".client_secret")
+ curl -s "$API/users/token" \
+ --data client_id="$client_id" \
+ --data client_secret="$client_secret" \
+ --data grant_type=password \
+ --data username="$USERNAME" \
+ --data password="$PASSWORD" \
+ | jq -r ".access_token"
+
+ /api/v1/users/revoke-token:
+ post:
+ summary: Logout
+ description: Revokes your access token and its associated refresh token, destroying your current session.
+ operationId: revokeOAuthToken
tags:
- - Video Ownership Change
+ - Session
security:
- OAuth2: []
responses:
'200':
description: successful operation
- '/videos/ownership/{id}/accept':
+ /api/v1/users/ask-send-verify-email:
post:
- summary: Accept ownership change request
+ summary: Resend user verification link
+ operationId: resendEmailToVerifyUser
tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - Users
+ - Register
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ email:
+ type: string
+ description: User email
+ required:
+ - email
responses:
'204':
description: successful operation
- '403':
- description: cannot terminate an ownership change of another user
- '404':
- description: video ownership change not found
- '/videos/ownership/{id}/refuse':
+ /api/v1/users/registrations/ask-send-verify-email:
post:
- summary: Refuse ownership change request
+ summary: Resend verification link to registration email
+ operationId: resendEmailToVerifyRegistration
tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - Register
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ email:
+ type: string
+ description: Registration email
+ required:
+ - email
responses:
'204':
description: successful operation
- '403':
- description: cannot terminate an ownership change of another user
- '404':
- description: video ownership change not found
- '/videos/{id}/give-ownership':
+ /api/v1/users/{id}/verify-email:
post:
- summary: Request ownership change
+ summary: Verify a user
+ operationId: verifyUser
+ description: |
+ Following a user registration, the new user will receive an email asking to click a link
+ containing a secret.
+ This endpoint can also be used to verify a new email set in the user account.
tags:
- - Video Ownership Change
- security:
- - OAuth2: []
+ - Users
+ - Register
parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - $ref: '#/components/parameters/id'
requestBody:
- required: true
content:
- application/x-www-form-urlencoded:
+ application/json:
schema:
type: object
properties:
- username:
+ verificationString:
type: string
+ format: url
+ isPendingEmail:
+ type: boolean
required:
- - username
+ - verificationString
responses:
'204':
description: successful operation
- '400':
- description: changing video ownership to a remote account is not supported yet
+ '403':
+ description: invalid verification string
'404':
- description: video not found
+ description: user not found
- /videos:
- get:
- summary: List videos
- operationId: getVideos
+ /api/v1/users/registrations/{registrationId}/verify-email:
+ post:
+ summary: Verify a registration email
+ operationId: verifyRegistrationEmail
+ description: |
+ Following a user registration request, the user will receive an email asking to click a link
+ containing a secret.
tags:
- - Video
+ - Register
parameters:
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/registrationId'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ verificationString:
+ type: string
+ format: url
+ required:
+ - verificationString
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
+ '403':
+ description: invalid verification string
+ '404':
+ description: registration not found
- /videos/categories:
- get:
- summary: List available video categories
- operationId: getCategories
+ /api/v1/users/{id}/two-factor/request:
+ post:
+ summary: Request two factor auth
+ operationId: requestTwoFactor
+ description: Request two factor authentication for a user
tags:
- - Video
+ - Users
+ parameters:
+ - $ref: '#/components/parameters/id'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ currentPassword:
+ type: string
+ description: Password of the currently authenticated user
responses:
'200':
description: successful operation
schema:
type: array
items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/categories
+ $ref: '#/components/schemas/RequestTwoFactorResponse'
+ '403':
+ description: invalid password
+ '404':
+ description: user not found
- /videos/licences:
- get:
- summary: List available video licences
- operationId: getLicences
+ /api/v1/users/{id}/two-factor/confirm-request:
+ post:
+ summary: Confirm two factor auth
+ operationId: confirmTwoFactorRequest
+ description: Confirm a two factor authentication request
tags:
- - Video
+ - Users
+ parameters:
+ - $ref: '#/components/parameters/id'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ requestToken:
+ type: string
+ description: Token to identify the two factor request
+ otpToken:
+ type: string
+ description: OTP token generated by the app
+ required:
+ - requestToken
+ - otpToken
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
+ '403':
+ description: invalid request token or OTP token
+ '404':
+ description: user not found
+
+ /api/v1/users/{id}/two-factor/disable:
+ post:
+ summary: Disable two factor auth
+ operationId: disableTwoFactor
+ description: Disable two factor authentication of a user
+ tags:
+ - Users
+ parameters:
+ - $ref: '#/components/parameters/id'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ currentPassword:
type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/licences
+ description: Password of the currently authenticated user
+ responses:
+ '204':
+ description: successful operation
+ '403':
+ description: invalid password
+ '404':
+ description: user not found
- /videos/languages:
+ /api/v1/users/me:
get:
- summary: List available video languages
- operationId: getLanguages
+ summary: Get my user information
+ operationId: getUserInfo
+ security:
+ - OAuth2:
+ - user
tags:
- - Video
+ - My User
responses:
'200':
description: successful operation
schema:
type: array
items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/languages
-
- /videos/privacies:
- get:
- summary: List available video privacy policies
- operationId: getPrivacyPolicies
- tags:
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/privacies
-
- '/videos/{id}':
+ $ref: '#/components/schemas/User'
put:
- summary: Update a video
- operationId: putVideo
+ summary: Update my user information
+ operationId: putUserInfo
security:
- - OAuth2: []
+ - OAuth2:
+ - user
tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - My User
responses:
'204':
description: successful operation
requestBody:
content:
- multipart/form-data:
+ application/json:
schema:
- type: object
- properties:
- thumbnailfile:
- description: Video thumbnail file
- type: string
- format: binary
- previewfile:
- description: Video preview file
- type: string
- format: binary
- category:
- $ref: '#/components/schemas/VideoCategorySet'
- licence:
- $ref: '#/components/schemas/VideoLicenceSet'
- language:
- $ref: '#/components/schemas/VideoLanguageSet'
- privacy:
- $ref: '#/components/schemas/VideoPrivacySet'
- description:
- description: Video description
- type: string
- waitTranscoding:
- description: Whether or not we wait transcoding before publish the video
- type: string
- support:
- description: A text tell the audience how to support the video creator
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- type: string
- nsfw:
- description: Whether or not this video contains sensitive content
- type: boolean
- name:
- description: Video name
- type: string
- minLength: 3
- maxLength: 120
- tags:
- description: Video tags (maximum 5 tags each between 2 and 30 characters)
- type: array
- minItems: 1
- maxItems: 5
- items:
- type: string
- minLength: 2
- maxLength: 30
- commentsEnabled:
- description: Enable or disable comments for this video
- type: boolean
- downloadEnabled:
- description: Enable or disable downloading for this video
- type: boolean
- originallyPublishedAt:
- description: Date when the content was originally published
- type: string
- format: date-time
- scheduleUpdate:
- $ref: '#/components/schemas/VideoScheduledUpdate'
- encoding:
- thumbnailfile:
- contentType: image/jpeg
- previewfile:
- contentType: image/jpeg
+ $ref: '#/components/schemas/UpdateMe'
+ required: true
+
+ /api/v1/users/me/videos/imports:
get:
- summary: Get a video
- operationId: getVideo
+ summary: Get video imports of my user
+ security:
+ - OAuth2:
+ - user
tags:
- - Video
+ - Videos
+ - My User
parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
+ -
+ name: targetUrl
+ in: query
+ required: false
+ description: Filter on import target URL
+ schema:
+ type: string
+ -
+ name: videoChannelSyncId
+ in: query
+ required: false
+ description: Filter on imports created by a specific channel synchronization
+ schema:
+ type: number
+ -
+ name: search
+ in: query
+ required: false
+ description: Search in video names
+ schema:
+ type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoDetails'
- delete:
- summary: Delete a video
- operationId: delVideo
+ $ref: '#/components/schemas/VideoImportsList'
+
+ /api/v1/users/me/video-quota-used:
+ get:
+ summary: Get my user used quota
+ security:
+ - OAuth2:
+ - user
+ tags:
+ - My User
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ videoQuotaUsed:
+ type: number
+ description: The user video quota used so far in bytes
+ example: 16810141515
+ videoQuotaUsedDaily:
+ type: number
+ description: The user video quota used today in bytes
+ example: 1681014151
+
+ '/api/v1/users/me/videos/{videoId}/rating':
+ get:
+ summary: Get rate of my user for a video
security:
- OAuth2: []
tags:
- - Video
+ - My User
+ - Video Rates
parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - name: videoId
+ in: path
+ required: true
+ description: The video id
+ schema:
+ $ref: '#/components/schemas/Video/properties/id'
responses:
- '204':
+ '200':
description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetMeVideoRating'
- '/videos/{id}/description':
+ /api/v1/users/me/videos:
get:
- summary: Get complete video description
- operationId: getVideoDesc
+ summary: Get videos of my user
+ security:
+ - OAuth2:
+ - user
tags:
- - Video
+ - My User
+ - Videos
parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- nullable: true
- type: string
- minLength: 3
- maxLength: 10000
- example: |
- **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n**Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)**
+ $ref: '#/components/schemas/VideoListResponse'
- '/videos/{id}/views':
- post:
- summary: Add a view to a video
- operationId: addView
+ /api/v1/users/me/subscriptions:
+ get:
+ summary: Get my user subscriptions
+ security:
+ - OAuth2:
+ - user
tags:
- - Video
+ - My Subscriptions
parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
responses:
- '204':
+ '200':
description: successful operation
-
- '/videos/{id}/watching':
- put:
- summary: Set watching progress of a video
- operationId: setProgress
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoChannelList'
+ post:
tags:
- - Video
+ - My Subscriptions
+ summary: Add subscription to my user
security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
+ - OAuth2:
+ - user
requestBody:
content:
application/json:
schema:
- $ref: '#/components/schemas/UserWatchingVideo'
- required: true
+ type: object
+ properties:
+ uri:
+ type: string
+ format: uri
+ description: uri of the video channels to subscribe to
+ required:
+ - uri
+ examples:
+ default:
+ value:
+ uri: 008a0e54-375d-49d0-8379-143202e24152@video.lqdn.fr
responses:
- '204':
+ '200':
description: successful operation
- /videos/upload:
- post:
- summary: Upload a video
- description: Uses a single request to upload a video.
- operationId: uploadLegacy
+ /api/v1/users/me/subscriptions/exist:
+ get:
+ summary: Get if subscriptions exist for my user
security:
- - OAuth2: []
+ - OAuth2:
+ - user
tags:
- - Video
- - Video Upload
+ - My Subscriptions
+ parameters:
+ - $ref: '#/components/parameters/subscriptionsUris'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/VideoUploadResponse'
- '403':
- description: video didn't pass upload filter
+ type: object
+
+ /api/v1/users/me/subscriptions/videos:
+ get:
+ summary: List videos of subscriptions of my user
+ security:
+ - OAuth2:
+ - user
+ tags:
+ - My Subscriptions
+ - Videos
+ parameters:
+ - $ref: '#/components/parameters/categoryOneOf'
+ - $ref: '#/components/parameters/isLive'
+ - $ref: '#/components/parameters/tagsOneOf'
+ - $ref: '#/components/parameters/tagsAllOf'
+ - $ref: '#/components/parameters/licenceOneOf'
+ - $ref: '#/components/parameters/languageOneOf'
+ - $ref: '#/components/parameters/nsfw'
+ - $ref: '#/components/parameters/isLocal'
+ - $ref: '#/components/parameters/include'
+ - $ref: '#/components/parameters/privacyOneOf'
+ - $ref: '#/components/parameters/hasHLSFiles'
+ - $ref: '#/components/parameters/hasWebtorrentFiles'
+ - $ref: '#/components/parameters/skipCount'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/excludeAlreadyWatched'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoListResponse'
+
+ '/api/v1/users/me/subscriptions/{subscriptionHandle}':
+ get:
+ summary: Get subscription of my user
+ security:
+ - OAuth2:
+ - user
+ tags:
+ - My Subscriptions
+ parameters:
+ - $ref: '#/components/parameters/subscriptionHandle'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoChannel'
+ delete:
+ summary: Delete subscription of my user
+ security:
+ - OAuth2:
+ - user
+ tags:
+ - My Subscriptions
+ parameters:
+ - $ref: '#/components/parameters/subscriptionHandle'
+ responses:
+ '200':
+ description: successful operation
+
+ /api/v1/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'
+
+ /api/v1/users/me/notifications/read:
+ post:
+ summary: Mark notifications as read by their id
+ security:
+ - OAuth2: []
+ tags:
+ - My Notifications
+ requestBody:
+ content:
+ application/json:
+ 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
+
+ /api/v1/users/me/notifications/read-all:
+ post:
+ summary: Mark all my notification as read
+ security:
+ - OAuth2: []
+ tags:
+ - My Notifications
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/me/notification-settings:
+ put:
+ summary: Update my notification settings
+ security:
+ - OAuth2: []
+ tags:
+ - My Notifications
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ newVideoFromSubscription:
+ $ref: '#/components/schemas/NotificationSettingValue'
+ newCommentOnMyVideo:
+ $ref: '#/components/schemas/NotificationSettingValue'
+ abuseAsModerator:
+ $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
+
+ /api/v1/users/me/history/videos:
+ get:
+ summary: List watched videos history
+ security:
+ - OAuth2: []
+ tags:
+ - My History
+ parameters:
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/search'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoListResponse'
+
+ /api/v1/users/me/history/videos/{videoId}:
+ delete:
+ summary: Delete history element
+ security:
+ - OAuth2: []
+ tags:
+ - My History
+ parameters:
+ - name: videoId
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/Video/properties/id'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/me/history/videos/remove:
+ post:
+ summary: Clear video history
+ security:
+ - OAuth2: []
+ tags:
+ - My History
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ beforeDate:
+ description: history before this date will be deleted
+ type: string
+ format: date-time
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/me/avatar/pick:
+ post:
+ summary: Update my user avatar
+ security:
+ - OAuth2: []
+ tags:
+ - My User
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ avatars:
+ type: array
+ items:
+ $ref: '#/components/schemas/ActorImage'
+ '413':
+ description: image file too large
+ headers:
+ X-File-Maximum-Size:
+ schema:
+ type: string
+ format: Nginx size
+ description: Maximum file size for the avatar
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ avatarfile:
+ description: The file to upload
+ type: string
+ format: binary
+ encoding:
+ avatarfile:
+ contentType: image/png, image/jpeg
+
+ /api/v1/users/me/avatar:
+ delete:
+ summary: Delete my avatar
+ security:
+ - OAuth2: []
+ tags:
+ - My User
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/register:
+ post:
+ summary: Register a user
+ operationId: registerUser
+ description: Signup has to be enabled and signup approval is not required
+ tags:
+ - Register
+ responses:
+ '204':
+ description: successful operation
+ '400':
+ description: request error
+ '403':
+ description: user registration is not enabled, user limit is reached, registration is not allowed for the ip, requires approval or blocked by a plugin
+ '409':
+ description: 'a user with this username, channel name or email already exists'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegisterUser'
+ required: true
+
+ /api/v1/users/registrations/request:
+ post:
+ summary: Request registration
+ description: Signup has to be enabled and require approval on the instance
+ operationId: requestRegistration
+ tags:
+ - Register
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserRegistration'
+ '400':
+ description: request error or signup approval is not enabled on the instance
+ '403':
+ description: user registration is not enabled, user limit is reached, registration is not allowed for the ip or blocked by a plugin
+ '409':
+ description: 'a user or registration with this username, channel name or email already exists'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserRegistrationRequest'
+
+ /api/v1/users/registrations/{registrationId}/accept:
+ post:
+ security:
+ - OAuth2:
+ - admin
+ - moderator
+ summary: Accept registration
+ operationId: acceptRegistration
+ tags:
+ - Register
+ parameters:
+ - $ref: '#/components/parameters/registrationId'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserRegistrationAcceptOrReject'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/registrations/{registrationId}/reject:
+ post:
+ security:
+ - OAuth2:
+ - admin
+ - moderator
+ summary: Reject registration
+ operationId: rejectRegistration
+ tags:
+ - Register
+ parameters:
+ - $ref: '#/components/parameters/registrationId'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserRegistrationAcceptOrReject'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/registrations/{registrationId}:
+ delete:
+ security:
+ - OAuth2:
+ - admin
+ - moderator
+ summary: Delete registration
+ description: 'Delete the registration entry. It will not remove the user associated with this registration (if any)'
+ operationId: deleteRegistration
+ tags:
+ - Register
+ parameters:
+ - $ref: '#/components/parameters/registrationId'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/users/registrations:
+ get:
+ security:
+ - OAuth2:
+ - admin
+ - moderator
+ summary: List registrations
+ operationId: listRegistrations
+ tags:
+ - Register
+ parameters:
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - name: search
+ in: query
+ required: false
+ schema:
+ type: string
+ - name: sort
+ in: query
+ required: false
+ schema:
+ type: string
+ enum:
+ - -createdAt
+ - createdAt
+ - state
+ - -state
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/UserRegistration'
+
+ /api/v1/videos/ownership:
+ get:
+ summary: List video ownership changes
+ tags:
+ - Video Ownership Change
+ security:
+ - OAuth2: []
+ responses:
+ '200':
+ description: successful operation
+
+ '/api/v1/videos/ownership/{id}/accept':
+ post:
+ summary: Accept ownership change request
+ tags:
+ - Video Ownership Change
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '204':
+ description: successful operation
+ '403':
+ description: cannot terminate an ownership change of another user
+ '404':
+ description: video ownership change not found
+
+ '/api/v1/videos/ownership/{id}/refuse':
+ post:
+ summary: Refuse ownership change request
+ tags:
+ - Video Ownership Change
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '204':
+ description: successful operation
+ '403':
+ description: cannot terminate an ownership change of another user
+ '404':
+ description: video ownership change not found
+
+ '/api/v1/videos/{id}/give-ownership':
+ post:
+ summary: Request ownership change
+ tags:
+ - Video Ownership Change
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ requestBody:
+ required: true
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ type: object
+ properties:
+ username:
+ type: string
+ required:
+ - username
+ responses:
+ '204':
+ description: successful operation
+ '400':
+ description: changing video ownership to a remote account is not supported yet
+ '404':
+ description: video not found
+
+ '/api/v1/videos/{id}/token':
+ post:
+ summary: Request video token
+ operationId: requestVideoToken
+ description: Request special tokens that expire quickly to use them in some context (like accessing private static files)
+ tags:
+ - Video
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoTokenResponse'
+ '400':
+ description: incorrect parameters
+ '404':
+ description: video not found
+
+ /api/v1/videos/{id}/studio/edit:
+ post:
+ summary: Create a studio task
+ tags:
+ - Video Transcoding
+ - Video
+ description: Create a task to edit a video (cut, add intro/outro etc)
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ requestBody:
+ required: true
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ $ref: '#/components/schemas/VideoStudioCreateTask'
+ responses:
+ '204':
+ description: successful operation
+ '400':
+ description: incorrect parameters
+ '404':
+ description: video not found
+
+ /api/v1/videos:
+ get:
+ summary: List videos
+ operationId: getVideos
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/categoryOneOf'
+ - $ref: '#/components/parameters/isLive'
+ - $ref: '#/components/parameters/tagsOneOf'
+ - $ref: '#/components/parameters/tagsAllOf'
+ - $ref: '#/components/parameters/licenceOneOf'
+ - $ref: '#/components/parameters/languageOneOf'
+ - $ref: '#/components/parameters/nsfw'
+ - $ref: '#/components/parameters/isLocal'
+ - $ref: '#/components/parameters/include'
+ - $ref: '#/components/parameters/privacyOneOf'
+ - $ref: '#/components/parameters/hasHLSFiles'
+ - $ref: '#/components/parameters/hasWebtorrentFiles'
+ - $ref: '#/components/parameters/skipCount'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/excludeAlreadyWatched'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoListResponse'
+
+ /api/v1/videos/categories:
+ get:
+ summary: List available video categories
+ operationId: getCategories
+ tags:
+ - Video
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/videos/categories
+
+ /api/v1/videos/licences:
+ get:
+ summary: List available video licences
+ operationId: getLicences
+ tags:
+ - Video
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/videos/licences
+
+ /api/v1/videos/languages:
+ get:
+ summary: List available video languages
+ operationId: getLanguages
+ tags:
+ - Video
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/videos/languages
+
+ /api/v1/videos/privacies:
+ get:
+ summary: List available video privacy policies
+ operationId: getVideoPrivacyPolicies
+ tags:
+ - Video
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+ examples:
+ nightly:
+ externalValue: https://peertube2.cpy.re/api/v1/videos/privacies
+
+ '/api/v1/videos/{id}':
+ put:
+ summary: Update a video
+ operationId: putVideo
+ security:
+ - OAuth2: []
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '204':
+ description: successful operation
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ thumbnailfile:
+ description: Video thumbnail file
+ type: string
+ format: binary
+ previewfile:
+ description: Video preview file
+ type: string
+ format: binary
+ category:
+ $ref: '#/components/schemas/VideoCategorySet'
+ licence:
+ $ref: '#/components/schemas/VideoLicenceSet'
+ language:
+ $ref: '#/components/schemas/VideoLanguageSet'
+ privacy:
+ $ref: '#/components/schemas/VideoPrivacySet'
+ description:
+ description: Video description
+ type: string
+ waitTranscoding:
+ description: Whether or not we wait transcoding before publish the video
+ type: string
+ support:
+ description: A text tell the audience how to support the video creator
+ example: Please support our work on https://soutenir.framasoft.org/en/ <3
+ type: string
+ nsfw:
+ description: Whether or not this video contains sensitive content
+ type: boolean
+ name:
+ description: Video name
+ type: string
+ minLength: 3
+ maxLength: 120
+ tags:
+ description: Video tags (maximum 5 tags each between 2 and 30 characters)
+ type: array
+ minItems: 1
+ maxItems: 5
+ items:
+ type: string
+ minLength: 2
+ maxLength: 30
+ commentsEnabled:
+ description: Enable or disable comments for this video
+ type: boolean
+ downloadEnabled:
+ description: Enable or disable downloading for this video
+ type: boolean
+ originallyPublishedAt:
+ description: Date when the content was originally published
+ type: string
+ format: date-time
+ scheduleUpdate:
+ $ref: '#/components/schemas/VideoScheduledUpdate'
+ encoding:
+ thumbnailfile:
+ contentType: image/jpeg
+ previewfile:
+ contentType: image/jpeg
+ get:
+ summary: Get a video
+ operationId: getVideo
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoDetails'
+ delete:
+ summary: Delete a video
+ operationId: delVideo
+ security:
+ - OAuth2: []
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '204':
+ description: successful operation
+
+ '/api/v1/videos/{id}/description':
+ get:
+ summary: Get complete video description
+ operationId: getVideoDesc
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ nullable: true
+ type: string
+ minLength: 3
+ maxLength: 10000
+ example: |
+ **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n**Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)**
+
+ '/api/v1/videos/{id}/source':
+ post:
+ summary: Get video source file metadata
+ operationId: getVideoSource
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoSource'
+
+ '/api/v1/videos/{id}/views':
+ post:
+ summary: Notify user is watching a video
+ description: Call this endpoint regularly (every 5-10 seconds for example) to notify the server the user is watching the video. After a while, PeerTube will increase video's viewers counter. If the user is authenticated, PeerTube will also store the current player time.
+ operationId: addView
+ tags:
+ - Video
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserViewingVideo'
+ required: true
+ responses:
+ '204':
+ description: successful operation
+
+ '/api/v1/videos/{id}/watching':
+ put:
+ summary: Set watching progress of a video
+ deprecated: true
+ description: This endpoint has been deprecated. Use `/videos/{id}/views` instead
+ tags:
+ - Video
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserViewingVideo'
+ required: true
+ responses:
+ '204':
+ description: successful operation
+
+ '/api/v1/videos/{id}/stats/overall':
+ get:
+ summary: Get overall stats of a video
+ tags:
+ - Video Stats
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ - name: startDate
+ in: query
+ description: Filter stats by start date
+ schema:
+ type: string
+ format: date-time
+ - name: endDate
+ in: query
+ description: Filter stats by end date
+ schema:
+ type: string
+ format: date-time
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoStatsOverall'
+
+ '/api/v1/videos/{id}/stats/retention':
+ get:
+ summary: Get retention stats of a video
+ tags:
+ - Video Stats
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoStatsRetention'
+
+ '/api/v1/videos/{id}/stats/timeseries/{metric}':
+ get:
+ summary: Get timeserie stats of a video
+ tags:
+ - Video Stats
+ security:
+ - OAuth2: []
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ -
+ name: metric
+ in: path
+ required: true
+ description: The metric to get
+ schema:
+ type: string
+ enum:
+ - 'viewers'
+ - 'aggregateWatchTime'
+ - name: startDate
+ in: query
+ description: Filter stats by start date
+ schema:
+ type: string
+ format: date-time
+ - name: endDate
+ in: query
+ description: Filter stats by end date
+ schema:
+ type: string
+ format: date-time
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoStatsTimeserie'
+
+ /api/v1/videos/upload:
+ post:
+ summary: Upload a video
+ description: Uses a single request to upload a video.
+ operationId: uploadLegacy
+ security:
+ - OAuth2: []
+ tags:
+ - Video
+ - Video Upload
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoUploadResponse'
+ '403':
+ description: video didn't pass upload filter
'408':
description: upload has timed out
'413':
x-summary: video file too large, due to quota or max body size limit set by the reverse-proxy
description: |
If the response has no body, it means the reverse-proxy didn't let it through. Otherwise disambiguate via `type`:
- - `quota_reached` for quota limits wether daily or global
+ - `quota_reached` for quota limits whether daily or global
headers:
X-File-Maximum-Size:
schema:
--form channelId=$CHANNEL_ID \
--form name="$NAME"
- /videos/upload-resumable:
+ /api/v1/videos/upload-resumable:
post:
summary: Initialize the resumable upload of a video
description: Uses [a resumable protocol](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) to initialize the upload of a video
in: query
required: true
description: |
- Created session id to proceed with. If you didn't send chunks in the last 12 hours, it is
+ Created session id to proceed with. If you didn't send chunks in the last hour, it is
not valid anymore and you need to initialize a new upload.
schema:
type: string
description: |
Size of the chunk that the request is sending.
- The chunk size __must be a multiple of 256 KB__, and unlike [Google Resumable](https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol)
- doesn't mandate for chunks to have the same size throughout the upload sequence.
-
Remember that larger chunks are more efficient. PeerTube's web client uses chunks varying from
1048576 bytes (~1MB) and increases or reduces size depending on connection health.
requestBody:
'404':
description: upload not found
- /videos/imports:
+ /api/v1/videos/imports:
post:
summary: Import a video
description: Import a torrent or magnetURI or HTTP resource (if enabled by the instance administrator)
'409':
description: HTTP or Torrent/magnetURI import not enabled
- /videos/imports/{id}/cancel:
+ /api/v1/videos/imports/{id}/cancel:
post:
summary: Cancel video import
description: Cancel a pending video import
'204':
description: successful operation
- /videos/imports/{id}:
+ /api/v1/videos/imports/{id}:
delete:
summary: Delete video import
description: Delete ended video import
'204':
description: successful operation
- /videos/live:
+ /api/v1/videos/live:
post:
summary: Create a live
operationId: addLive
type: integer
saveReplay:
type: boolean
+ replaySettings:
+ $ref: '#/components/schemas/LiveVideoReplaySettings'
permanentLive:
description: User can stream multiple times in a permanent live
type: boolean
previewfile:
contentType: image/jpeg
- /videos/live/{id}:
+ /api/v1/videos/live/{id}:
get:
summary: Get information about a live
operationId: getLiveId
description: bad parameters or trying to update a live that has already started
'403':
description: trying to save replay of the live but saving replay is not enabled on the instance
+ /api/v1/videos/live/{id}/sessions:
+ get:
+ summary: List live sessions
+ description: List all sessions created in a particular live
+ security:
+ - OAuth2: []
+ tags:
+ - Live Videos
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/LiveVideoSessionResponse'
+ /api/v1/videos/{id}/live-session:
+ get:
+ summary: Get live session of a replay
+ description: If the video is a replay of a live, you can find the associated live session using this endpoint
+ security:
+ - OAuth2: []
+ tags:
+ - Live Videos
+ parameters:
+ - $ref: '#/components/parameters/idOrUUID'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LiveVideoSessionResponse'
- /users/me/abuses:
+ /api/v1/users/me/abuses:
get:
summary: List my abuses
operationId: getMyAbuses
items:
$ref: '#/components/schemas/Abuse'
- /abuses:
+ /api/v1/abuses:
get:
summary: List abuses
operationId: getAbuses
'400':
description: incorrect request parameters
- '/abuses/{abuseId}':
+ '/api/v1/abuses/{abuseId}':
put:
summary: Update an abuse
security:
'404':
description: block not found
- '/abuses/{abuseId}/messages':
+ '/api/v1/abuses/{abuseId}/messages':
get:
summary: List messages of an abuse
security:
'400':
description: incorrect request parameters
- '/abuses/{abuseId}/messages/{abuseMessageId}':
+ '/api/v1/abuses/{abuseId}/messages/{abuseMessageId}':
delete:
summary: Delete an abuse message
security:
'204':
description: successful operation
- '/videos/{id}/blacklist':
+ '/api/v1/videos/{id}/blacklist':
post:
summary: Block a video
operationId: addVideoBlock
'404':
description: block not found
- /videos/blacklist:
+ /api/v1/videos/blacklist:
get:
tags:
- Video Blocks
items:
$ref: '#/components/schemas/VideoBlacklist'
- /videos/{id}/captions:
+ /api/v1/videos/{id}/captions:
get:
summary: List captions of a video
operationId: getVideoCaptions
items:
$ref: '#/components/schemas/VideoCaption'
- /videos/{id}/captions/{captionLanguage}:
+ /api/v1/videos/{id}/captions/{captionLanguage}:
put:
summary: Add or replace a video caption
operationId: addVideoCaption
'404':
description: video or language or caption for that language not found
- /video-channels:
+ /api/v1/video-channels:
get:
summary: List video channels
operationId: getVideoChannels
tags:
- Video Channels
responses:
- '204':
+ '200':
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/VideoChannelCreate'
- '/video-channels/{channelHandle}':
+ '/api/v1/video-channels/{channelHandle}':
get:
summary: Get a video channel
operationId: getVideoChannel
'204':
description: successful operation
- '/video-channels/{channelHandle}/videos':
+ '/api/v1/video-channels/{channelHandle}/videos':
get:
summary: List videos of a video channel
operationId: getVideoChannelVideos
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/videosSort'
+ - $ref: '#/components/parameters/excludeAlreadyWatched'
responses:
'200':
description: successful operation
schema:
$ref: '#/components/schemas/VideoListResponse'
- '/video-channels/{channelHandle}/followers':
+ '/api/v1/video-channels/{channelHandle}/video-playlists':
+ get:
+ summary: List playlists of a channel
+ tags:
+ - Video Playlists
+ - Video Channels
+ parameters:
+ - $ref: '#/components/parameters/channelHandle'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/videoPlaylistType'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/VideoPlaylist'
+
+ '/api/v1/video-channels/{channelHandle}/followers':
get:
tags:
- Video Channels
items:
$ref: '#/components/schemas/Follow'
- '/video-channels/{channelHandle}/avatar/pick':
+ '/api/v1/video-channels/{channelHandle}/avatar/pick':
post:
summary: Update channel avatar
security:
avatarfile:
contentType: image/png, image/jpeg
- '/video-channels/{channelHandle}/avatar':
+ '/api/v1/video-channels/{channelHandle}/avatar':
delete:
summary: Delete channel avatar
security:
'204':
description: successful operation
- '/video-channels/{channelHandle}/banner/pick':
+ '/api/v1/video-channels/{channelHandle}/banner/pick':
post:
summary: Update channel banner
security:
bannerfile:
contentType: image/png, image/jpeg
- '/video-channels/{channelHandle}/banner':
+ '/api/v1/video-channels/{channelHandle}/banner':
delete:
summary: Delete channel banner
security:
'204':
description: successful operation
- /video-playlists/privacies:
+ '/api/v1/video-channels/{channelHandle}/import-videos':
+ post:
+ summary: Import videos in channel
+ description: Import a remote channel/playlist videos into a channel
+ security:
+ - OAuth2: []
+ tags:
+ - Video Channels
+ - Channels Sync
+ parameters:
+ - $ref: '#/components/parameters/channelHandle'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ImportVideosInChannelCreate'
+ responses:
+ '204':
+ description: successful operation
+
+ '/api/v1/video-channel-syncs':
+ post:
+ summary: Create a synchronization for a video channel
+ operationId: addVideoChannelSync
+ security:
+ - OAuth2: []
+ tags:
+ - Channels Sync
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VideoChannelSyncCreate'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ videoChannelSync:
+ $ref: "#/components/schemas/VideoChannelSync"
+
+ '/api/v1/video-channel-syncs/{channelSyncId}':
+ delete:
+ summary: Delete a video channel synchronization
+ operationId: delVideoChannelSync
+ security:
+ - OAuth2: []
+ tags:
+ - Channels Sync
+ parameters:
+ - $ref: '#/components/parameters/channelSyncId'
+ responses:
+ '204':
+ description: successful operation
+
+ '/api/v1/video-channel-syncs/{channelSyncId}/sync':
+ post:
+ summary: Triggers the channel synchronization job, fetching all the videos from the remote channel
+ operationId: triggerVideoChannelSync
+ security:
+ - OAuth2: []
+ tags:
+ - Channels Sync
+ parameters:
+ - $ref: '#/components/parameters/channelSyncId'
+ responses:
+ '204':
+ description: successful operation
+
+
+ /api/v1/video-playlists/privacies:
get:
summary: List available playlist privacy policies
operationId: getPlaylistPrivacyPolicies
nightly:
externalValue: https://peertube2.cpy.re/api/v1/video-playlists/privacies
- /video-playlists:
+ /api/v1/video-playlists:
get:
summary: List video playlists
operationId: getPlaylists
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/videoPlaylistType'
responses:
'200':
description: successful operation
thumbnailfile:
contentType: image/jpeg
- /video-playlists/{playlistId}:
+ /api/v1/video-playlists/{playlistId}:
get:
summary: Get a video playlist
tags:
'204':
description: successful operation
- /video-playlists/{playlistId}/videos:
+ /api/v1/video-playlists/{playlistId}/videos:
get:
summary: 'List videos of a playlist'
operationId: getVideoPlaylistVideos
required:
- videoId
- /video-playlists/{playlistId}/videos/reorder:
+ /api/v1/video-playlists/{playlistId}/videos/reorder:
post:
summary: 'Reorder a playlist'
operationId: reorderVideoPlaylist
- startPosition
- insertAfterPosition
- /video-playlists/{playlistId}/videos/{playlistElementId}:
+ /api/v1/video-playlists/{playlistId}/videos/{playlistElementId}:
put:
summary: Update a playlist element
operationId: putVideoPlaylistVideo
'204':
description: successful operation
- '/users/me/video-playlists/videos-exist':
+ '/api/v1/users/me/video-playlists/videos-exist':
get:
summary: Check video exists in my playlists
security:
format: seconds
stopTimestamp:
type: integer
- format: seconds
- '/accounts/{name}/video-channels':
+ '/api/v1/accounts/{name}/video-playlists':
+ get:
+ summary: List playlists of an account
+ tags:
+ - Video Playlists
+ - Accounts
+ parameters:
+ - $ref: '#/components/parameters/name'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/search'
+ - $ref: '#/components/parameters/videoPlaylistType'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/VideoPlaylist'
+
+ '/api/v1/accounts/{name}/video-channels':
get:
summary: List video channels of an account
tags:
- $ref: '#/components/parameters/name'
- name: withStats
in: query
- description: include view statistics for the last 30 days (only if authentified as the account user)
+ description: include daily view statistics for the last 30 days and total views (only if authentified as the account user)
schema:
type: boolean
- $ref: '#/components/parameters/start'
schema:
$ref: '#/components/schemas/VideoChannelList'
- '/accounts/{name}/ratings':
+ '/api/v1/accounts/{name}/video-channel-syncs':
+ get:
+ summary: List the synchronizations of video channels of an account
+ tags:
+ - Video Channels
+ - Channels Sync
+ - Accounts
+ 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/VideoChannelSyncList'
+
+ '/api/v1/accounts/{name}/ratings':
get:
summary: List ratings of an account
security:
items:
$ref: '#/components/schemas/VideoRating'
- '/videos/{id}/comment-threads':
+ '/api/v1/videos/{id}/comment-threads':
get:
summary: List threads of a video
tags:
required:
- text
- '/videos/{id}/comment-threads/{threadId}':
+ '/api/v1/videos/{id}/comment-threads/{threadId}':
get:
summary: Get a thread
tags:
schema:
$ref: '#/components/schemas/VideoCommentThreadTree'
- '/videos/{id}/comments/{commentId}':
+ '/api/v1/videos/{id}/comments/{commentId}':
post:
summary: Reply to a thread of a video
security:
'409':
description: comment is already deleted
- '/videos/{id}/rate':
+ '/api/v1/videos/{id}/rate':
put:
summary: Like/dislike a video
security:
'404':
description: video does not exist
- '/videos/{id}/hls':
+ '/api/v1/videos/{id}/hls':
delete:
summary: Delete video HLS files
security:
description: successful operation
'404':
description: video does not exist
- '/videos/{id}/webtorrent':
+ '/api/v1/videos/{id}/webtorrent':
delete:
summary: Delete video WebTorrent files
security:
'404':
description: video does not exist
- '/videos/{id}/transcoding':
+ '/api/v1/videos/{id}/transcoding':
post:
summary: Create a transcoding job
security:
'404':
description: video does not exist
- /search/videos:
+ /api/v1/search/videos:
get:
tags:
- Search
- $ref: '#/components/parameters/isLocal'
- $ref: '#/components/parameters/include'
- $ref: '#/components/parameters/privacyOneOf'
+ - $ref: '#/components/parameters/uuids'
- $ref: '#/components/parameters/hasHLSFiles'
- $ref: '#/components/parameters/hasWebtorrentFiles'
- $ref: '#/components/parameters/skipCount'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/searchTarget'
- $ref: '#/components/parameters/videosSearchSort'
+ - $ref: '#/components/parameters/excludeAlreadyWatched'
- name: startDate
in: query
description: Get videos that are published after this date
'500':
description: search index unavailable
- /search/video-channels:
+ /api/v1/search/video-channels:
get:
tags:
- Search
'500':
description: search index unavailable
- /search/video-playlists:
+ /api/v1/search/video-playlists:
get:
tags:
- Search
'500':
description: search index unavailable
- /blocklist/status:
+ /api/v1/blocklist/status:
get:
tags:
- Account Blocks
schema:
$ref: '#/components/schemas/BlockStatus'
- /server/blocklist/accounts:
+ /api/v1/server/blocklist/accounts:
get:
tags:
- Account Blocks
'409':
description: self-blocking forbidden
- '/server/blocklist/accounts/{accountName}':
+ '/api/v1/server/blocklist/accounts/{accountName}':
delete:
tags:
- Account Blocks
required: true
description: account to unblock, in the form `username@domain`
schema:
- type: string
+ type: string
+ responses:
+ '201':
+ description: successful operation
+ '404':
+ description: account or account block does not exist
+
+ /api/v1/server/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:
+ host:
+ type: string
+ format: hostname
+ description: server domain to block
+ required:
+ - host
+ responses:
+ '204':
+ description: successful operation
+ '409':
+ description: self-blocking forbidden
+
+ '/api/v1/server/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
+ format: hostname
+ responses:
+ '204':
+ description: successful operation
+ '404':
+ description: account block does not exist
+
+ /api/v1/server/redundancy/{host}:
+ put:
+ tags:
+ - Instance Redundancy
+ summary: Update a server redundancy policy
+ security:
+ - OAuth2:
+ - admin
+ parameters:
+ - name: host
+ in: path
+ required: true
+ description: server domain to mirror
+ schema:
+ type: string
+ format: hostname
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ redundancyAllowed:
+ type: boolean
+ description: allow mirroring of the host's local videos
+ required:
+ - redundancyAllowed
+ responses:
+ '204':
+ description: successful operation
+ '404':
+ description: server is not already known
+
+ /api/v1/server/redundancy/videos:
+ get:
+ tags:
+ - Video Mirroring
+ summary: List videos being mirrored
+ operationId: getMirroredVideos
+ security:
+ - OAuth2:
+ - admin
+ parameters:
+ - name: target
+ in: query
+ required: true
+ description: direction of the mirror
+ schema:
+ type: string
+ enum:
+ - my-videos
+ - remote-videos
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/videoRedundanciesSort'
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/VideoRedundancy'
+ post:
+ tags:
+ - Video Mirroring
+ summary: Mirror a video
+ operationId: putMirroredVideo
+ security:
+ - OAuth2:
+ - admin
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ videoId:
+ $ref: '#/components/schemas/Video/properties/id'
+ required:
+ - videoId
+ responses:
+ '204':
+ description: successful operation
+ '400':
+ description: cannot mirror a local video
+ '404':
+ description: video does not exist
+ '409':
+ description: video is already mirrored
+
+ /api/v1/server/redundancy/videos/{redundancyId}:
+ delete:
+ tags:
+ - Video Mirroring
+ summary: Delete a mirror done on a video
+ operationId: delMirroredVideo
+ security:
+ - OAuth2:
+ - admin
+ parameters:
+ - name: redundancyId
+ in: path
+ required: true
+ description: id of an existing redundancy on a video
+ schema:
+ type: string
+ responses:
+ '204':
+ description: successful operation
+ '404':
+ description: video redundancy not found
+
+ /api/v1/server/stats:
+ get:
+ tags:
+ - Stats
+ summary: Get instance stats
+ description: Get instance public statistics. This endpoint is cached.
+ operationId: getInstanceStats
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ServerStats'
+
+ /api/v1/server/logs/client:
+ post:
+ tags:
+ - Logs
+ summary: Send client log
+ operationId: sendClientLog
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SendClientLog'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/server/logs:
+ get:
+ tags:
+ - Logs
+ summary: Get instance logs
+ operationId: getInstanceLogs
+ security:
+ - OAuth2:
+ - admin
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+
+ /api/v1/server/audit-logs:
+ get:
+ tags:
+ - Logs
+ summary: Get instance audit logs
+ operationId: getInstanceAuditLogs
+ security:
+ - OAuth2:
+ - admin
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: string
+
+ /api/v1/plugins:
+ get:
+ tags:
+ - Plugins
+ summary: List plugins
+ operationId: getPlugins
+ security:
+ - OAuth2:
+ - admin
+ parameters:
+ - name: pluginType
+ in: query
+ schema:
+ type: integer
+ - name: uninstalled
+ in: query
+ schema:
+ type: boolean
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/sort'
responses:
- '201':
+ '200':
description: successful operation
- '404':
- description: account or account block does not exist
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PluginResponse'
- /server/blocklist/servers:
+ /api/v1/plugins/available:
get:
tags:
- - Server Blocks
- summary: List server blocks
+ - Plugins
+ summary: List available plugins
+ operationId: getAvailablePlugins
security:
- OAuth2:
- admin
parameters:
+ - name: search
+ in: query
+ schema:
+ type: string
+ - name: pluginType
+ in: query
+ schema:
+ type: integer
+ - name: currentPeerTubeEngine
+ in: query
+ schema:
+ type: string
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- $ref: '#/components/parameters/sort'
responses:
'200':
description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PluginResponse'
+ '503':
+ description: plugin index unavailable
+
+ /api/v1/plugins/install:
post:
tags:
- - Server Blocks
- summary: Block a server
+ - Plugins
+ summary: Install a plugin
+ operationId: addPlugin
security:
- OAuth2:
- admin
content:
application/json:
schema:
- type: object
- properties:
- host:
- type: string
- format: hostname
- description: server domain to block
- required:
- - host
+ oneOf:
+ - type: object
+ properties:
+ npmName:
+ type: string
+ example: peertube-plugin-auth-ldap
+ required:
+ - npmName
+ additionalProperties: false
+ - type: object
+ properties:
+ path:
+ type: string
+ required:
+ - path
+ additionalProperties: false
responses:
'204':
description: successful operation
- '409':
- description: self-blocking forbidden
+ '400':
+ description: should have either `npmName` or `path` set
- '/server/blocklist/servers/{host}':
- delete:
+ /api/v1/plugins/update:
+ post:
tags:
- - Server Blocks
- summary: Unblock a server by its domain
+ - Plugins
+ summary: Update a plugin
+ operationId: updatePlugin
security:
- OAuth2:
- admin
- parameters:
- - name: host
- in: path
- required: true
- description: server domain to unblock
- schema:
- type: string
- format: hostname
+ requestBody:
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ npmName:
+ type: string
+ example: peertube-plugin-auth-ldap
+ required:
+ - npmName
+ additionalProperties: false
+ - type: object
+ properties:
+ path:
+ type: string
+ required:
+ - path
+ additionalProperties: false
responses:
'204':
description: successful operation
+ '400':
+ description: should have either `npmName` or `path` set
'404':
- description: account block does not exist
+ description: existing plugin not found
- /server/redundancy/{host}:
- put:
+ /api/v1/plugins/uninstall:
+ post:
tags:
- - Instance Redundancy
- summary: Update a server redundancy policy
+ - Plugins
+ summary: Uninstall a plugin
+ operationId: uninstallPlugin
security:
- OAuth2:
- admin
- parameters:
- - name: host
- in: path
- required: true
- description: server domain to mirror
- schema:
- type: string
- format: hostname
requestBody:
content:
application/json:
schema:
type: object
properties:
- redundancyAllowed:
- type: boolean
- description: allow mirroring of the host's local videos
+ npmName:
+ type: string
+ description: name of the plugin/theme in its package.json
+ example: peertube-plugin-auth-ldap
required:
- - redundancyAllowed
+ - npmName
responses:
'204':
description: successful operation
'404':
- description: server is not already known
+ description: existing plugin not found
- /server/redundancy/videos:
+ /api/v1/plugins/{npmName}:
get:
tags:
- - Video Mirroring
- summary: List videos being mirrored
- operationId: getMirroredVideos
+ - Plugins
+ summary: Get a plugin
+ operationId: getPlugin
security:
- OAuth2:
- admin
parameters:
- - name: target
- in: query
- required: true
- description: direction of the mirror
- schema:
- type: string
- enum:
- - my-videos
- - remote-videos
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videoRedundanciesSort'
+ - $ref: '#/components/parameters/npmName'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/VideoRedundancy'
- post:
+ $ref: '#/components/schemas/Plugin'
+ '404':
+ description: plugin not found
+
+ /api/v1/plugins/{npmName}/settings:
+ put:
tags:
- - Video Mirroring
- summary: Mirror a video
- operationId: putMirroredVideo
+ - Plugins
+ summary: Set a plugin's settings
security:
- OAuth2:
- admin
+ parameters:
+ - $ref: '#/components/parameters/npmName'
requestBody:
content:
application/json:
schema:
type: object
properties:
- videoId:
- $ref: '#/components/schemas/Video/properties/id'
- required:
- - videoId
- responses:
- '204':
- description: successful operation
- '400':
- description: cannot mirror a local video
- '404':
- description: video does not exist
- '409':
- description: video is already mirrored
-
- /server/redundancy/videos/{redundancyId}:
- delete:
- tags:
- - Video Mirroring
- summary: Delete a mirror done on a video
- operationId: delMirroredVideo
- security:
- - OAuth2:
- - admin
- parameters:
- - name: redundancyId
- in: path
- required: true
- description: id of an existing redundancy on a video
- schema:
- type: string
+ settings:
+ type: object
+ additionalProperties: true
responses:
'204':
description: successful operation
'404':
- description: video redundancy not found
-
- '/feeds/video-comments.{format}':
- get:
- tags:
- - Feeds
- summary: List comments on videos
- operationId: getSyndicatedComments
- parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; 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 to a specific video'
- schema:
- type: string
- - 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
+ description: plugin not found
+
+ /api/v1/plugins/{npmName}/public-settings:
+ get:
+ tags:
+ - Plugins
+ summary: Get a plugin's public settings
+ parameters:
+ - $ref: '#/components/parameters/npmName'
responses:
- '204':
+ '200':
description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
content:
- application/xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?filter=local
- text/xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?filter=local
application/json:
schema:
type: object
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.json?filter=local
- '400':
- x-summary: field inconsistencies
- description: >
- Arises when:
- - videoId filter is mixed with a channel filter
+ additionalProperties: true
'404':
- description: video, video channel or account not found
- '406':
- description: accept header unsupported
+ description: plugin not found
- '/feeds/videos.{format}':
+ /api/v1/plugins/{npmName}/registered-settings:
get:
tags:
- - Feeds
- summary: List videos
- operationId: getSyndicatedVideos
+ - Plugins
+ summary: Get a plugin's registered settings
+ security:
+ - OAuth2:
+ - admin
parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; 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/hasWebtorrentFiles'
+ - $ref: '#/components/parameters/npmName'
responses:
- '204':
+ '200':
description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
content:
- application/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.rss?filter=local
- text/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.atom?filter=local
application/json:
schema:
type: object
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.json?filter=local
+ additionalProperties: true
'404':
- description: video channel or account not found
- '406':
- description: accept header unsupported
+ description: plugin not found
- '/feeds/subscriptions.{format}':
- get:
+ /api/v1/metrics/playback:
+ post:
+ summary: Create playback metrics
+ description: These metrics are exposed by OpenTelemetry metrics exporter if enabled.
tags:
- - Feeds
- - Account
- summary: List videos of subscriptions tied to a token
- operationId: getSyndicatedSubscriptionVideos
+ - Stats
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaybackMetricCreate'
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/runners/registration-tokens/generate:
+ post:
+ summary: Generate registration token
+ description: Generate a new runner registration token
+ security:
+ - OAuth2:
+ - admin
+ tags:
+ - Runner Registration Token
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/runners/registration-tokens/{registrationTokenId}:
+ delete:
+ summary: Remove registration token
+ description: Remove a registration token. Runners that used this token for their registration are automatically removed.
+ security:
+ - OAuth2:
+ - admin
+ tags:
+ - Runner Registration Token
parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; 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/hasWebtorrentFiles'
+ - $ref: '#/components/parameters/registrationTokenId'
responses:
'204':
description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
+
+ /api/v1/runners/registration-tokens:
+ get:
+ summary: List registration tokens
+ security:
+ - OAuth2:
+ - admin
+ tags:
+ - Runner Registration Token
+ parameters:
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/registrationTokenSort'
+ responses:
+ '200':
+ description: successful operation
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:
+ application/json:
schema:
- $ref: '#/components/schemas/VideosForXML'
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/RunnerRegistrationToken'
+
+ /api/v1/runners/register:
+ post:
+ summary: Register a new runner
+ description: API used by PeerTube runners
+ tags:
+ - Runners
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ registrationToken:
+ type: string
+ name:
+ type: string
+ description:
+ type: string
+ required:
+ - registrationToken
+ - name
+ responses:
+ '200':
+ description: successful operation
+ content:
application/json:
schema:
type: object
- '406':
- description: accept header unsupported
+ properties:
+ id:
+ type: integer
+ description: Runner id
+ runnerToken:
+ type: string
- /plugins:
- get:
+ /api/v1/runners/unregister:
+ post:
+ summary: Unregister a runner
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: List plugins
- operationId: getPlugins
+ - Runners
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ required:
+ - runnerToken
+ responses:
+ '204':
+ description: successful operation
+
+ /api/v1/runners/{runnerId}:
+ delete:
+ summary: Delete a runner
security:
- OAuth2:
- admin
+ tags:
+ - Runners
parameters:
- - name: pluginType
- in: query
- schema:
- type: integer
- - name: uninstalled
- in: query
- schema:
- type: boolean
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/runnerId'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ required:
+ - runnerToken
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PluginResponse'
- /plugins/available:
+ /api/v1/runners:
get:
- tags:
- - Plugins
- summary: List available plugins
- operationId: getAvailablePlugins
+ summary: List runners
security:
- OAuth2:
- admin
+ tags:
+ - Runners
parameters:
- - name: search
- in: query
- schema:
- type: string
- - name: pluginType
- in: query
- schema:
- type: integer
- - name: currentPeerTubeEngine
- in: query
- schema:
- type: string
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
+ - $ref: '#/components/parameters/runnerSort'
responses:
'200':
description: successful operation
content:
application/json:
schema:
- $ref: '#/components/schemas/PluginResponse'
- '503':
- description: plugin index unavailable
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Runner'
+
- /plugins/install:
+ /api/v1/runners/jobs/request:
post:
+ summary: Request a new job
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: Install a plugin
- operationId: addPlugin
- security:
- - OAuth2:
- - admin
+ - Runner Jobs
requestBody:
content:
application/json:
schema:
- oneOf:
- - type: object
- properties:
- npmName:
- type: string
- example: peertube-plugin-auth-ldap
- required:
- - npmName
- additionalProperties: false
- - type: object
- properties:
- path:
- type: string
- required:
- - path
- additionalProperties: false
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ required:
+ - runnerToken
responses:
- '204':
+ '200':
description: successful operation
- '400':
- description: should have either `npmName` or `path` set
-
- /plugins/update:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ availableJobs:
+ type: array
+ items:
+ type: object
+ properties:
+ uuid:
+ $ref: '#/components/schemas/UUIDv4'
+ type:
+ $ref: '#/components/schemas/RunnerJobType'
+ payload:
+ $ref: '#/components/schemas/RunnerJobPayload'
+
+ /api/v1/runners/jobs/{jobUUID}/accept:
post:
+ summary: Accept job
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: Update a plugin
- operationId: updatePlugin
- security:
- - OAuth2:
- - admin
+ - Runner Jobs
+ parameters:
+ - $ref: '#/components/parameters/jobUUID'
requestBody:
content:
application/json:
schema:
- oneOf:
- - type: object
- properties:
- npmName:
- type: string
- example: peertube-plugin-auth-ldap
- required:
- - npmName
- additionalProperties: false
- - type: object
- properties:
- path:
- type: string
- required:
- - path
- additionalProperties: false
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ required:
+ - runnerToken
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ job:
+ allOf:
+ - $ref: '#/components/schemas/RunnerJob'
+ - type: object
+ properties:
+ jobToken:
+ type: string
+
+ /api/v1/runners/jobs/{jobUUID}/abort:
+ post:
+ summary: Abort job
+ description: API used by PeerTube runners
+ tags:
+ - Runner Jobs
+ parameters:
+ - $ref: '#/components/parameters/jobUUID'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ jobToken:
+ type: string
+ reason:
+ type: string
+ description: Why the runner aborts this job
+ required:
+ - runnerToken
+ - jobToken
+ - reason
responses:
'204':
description: successful operation
- '400':
- description: should have either `npmName` or `path` set
- '404':
- description: existing plugin not found
- /plugins/uninstall:
+ /api/v1/runners/jobs/{jobUUID}/update:
post:
+ summary: Update job
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: Uninstall a plugin
- operationId: uninstallPlugin
- security:
- - OAuth2:
- - admin
+ - Runner Jobs
+ parameters:
+ - $ref: '#/components/parameters/jobUUID'
requestBody:
content:
application/json:
schema:
type: object
properties:
- npmName:
+ runnerToken:
type: string
- description: name of the plugin/theme in its package.json
- example: peertube-plugin-auth-ldap
+ jobToken:
+ type: string
+ progress:
+ type: integer
+ description: Update job progression percentage (optional)
+ payload:
+ anyOf:
+ - type: object
+ description: Provide live transcoding chunks update
+ properties:
+ type:
+ type: string
+ enum:
+ - 'add-chunk'
+ - 'remove-chunk'
+ masterPlaylistFile:
+ type: string
+ format: binary
+ resolutionPlaylistFile:
+ type: string
+ format: binary
+ resolutionPlaylistFilename:
+ type: string
+ videoChunkFile:
+ type: string
+ format: binary
+ videoChunkFilename:
+ type: string
required:
- - npmName
+ - runnerToken
+ - jobToken
responses:
'204':
description: successful operation
- '404':
- description: existing plugin not found
- /plugins/{npmName}:
- get:
+ /api/v1/runners/jobs/{jobUUID}/error:
+ post:
+ summary: Post job error
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: Get a plugin
- operationId: getPlugin
- security:
- - OAuth2:
- - admin
+ - Runner Jobs
parameters:
- - $ref: '#/components/parameters/npmName'
+ - $ref: '#/components/parameters/jobUUID'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ runnerToken:
+ type: string
+ jobToken:
+ type: string
+ message:
+ type: string
+ description: Why the runner failed to process this job
+ required:
+ - runnerToken
+ - jobToken
+ - message
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Plugin'
- '404':
- description: plugin not found
- /plugins/{npmName}/settings:
- put:
+ /api/v1/runners/jobs/{jobUUID}/success:
+ post:
+ summary: Post job success
+ description: API used by PeerTube runners
tags:
- - Plugins
- summary: Set a plugin's settings
- security:
- - OAuth2:
- - admin
+ - Runner Jobs
parameters:
- - $ref: '#/components/parameters/npmName'
+ - $ref: '#/components/parameters/jobUUID'
requestBody:
content:
application/json:
schema:
type: object
properties:
- settings:
- type: object
- additionalProperties: true
+ runnerToken:
+ type: string
+ jobToken:
+ type: string
+ payload:
+ anyOf:
+ - type: object
+ title: VOD web video transcoding
+ properties:
+ videoFile:
+ type: string
+ format: binary
+ - type: object
+ title: VOD HLS transcoding
+ properties:
+ videoFile:
+ type: string
+ format: binary
+ resolutionPlaylistFile:
+ type: string
+ format: binary
+ - type: object
+ title: VOD audio merge transcoding
+ properties:
+ videoFile:
+ type: string
+ format: binary
+ - type: object
+ title: Live RTMP to HLS transcoding
+ required:
+ - runnerToken
+ - jobToken
+ - payload
responses:
'204':
description: successful operation
- '404':
- description: plugin not found
- /plugins/{npmName}/public-settings:
+ /api/v1/runners/jobs/{jobUUID}/cancel:
get:
+ summary: Cancel a job
+ security:
+ - OAuth2:
+ - admin
tags:
- - Plugins
- summary: Get a plugin's public settings
+ - Runner Jobs
parameters:
- - $ref: '#/components/parameters/npmName'
+ - $ref: '#/components/parameters/jobUUID'
responses:
- '200':
+ '204':
description: successful operation
- content:
- application/json:
- schema:
- type: object
- additionalProperties: true
- '404':
- description: plugin not found
- /plugins/{npmName}/registered-settings:
+ /api/v1/runners/jobs:
get:
- tags:
- - Plugins
- summary: Get a plugin's registered settings
+ summary: List jobs
security:
- OAuth2:
- admin
+ tags:
+ - Runner Jobs
parameters:
- - $ref: '#/components/parameters/npmName'
+ - $ref: '#/components/parameters/start'
+ - $ref: '#/components/parameters/count'
+ - $ref: '#/components/parameters/runnerJobSort'
+ - $ref: '#/components/parameters/search'
responses:
'200':
description: successful operation
application/json:
schema:
type: object
- additionalProperties: true
- '404':
- description: plugin not found
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/RunnerJobAdmin'
servers:
- - url: 'https://peertube2.cpy.re/api/v1'
+ - url: 'https://peertube2.cpy.re'
description: Live Test Server (live data - latest nightly version)
- - url: 'https://peertube3.cpy.re/api/v1'
+ - url: 'https://peertube3.cpy.re'
description: Live Test Server (live data - latest RC version)
- - url: 'https://peertube.cpy.re/api/v1'
+ - url: 'https://peertube.cpy.re'
description: Live Test Server (live data - stable version)
components:
parameters:
name: sort
in: query
required: false
- description: Sort videos by criteria
schema:
type: string
enum:
- - name
- - -duration
- - -createdAt
- - -publishedAt
- - -views
- - -likes
- - -trending
- - -hot
+ - name
+ - -duration
+ - -createdAt
+ - -publishedAt
+ - -views
+ - -likes
+ - -trending
+ - -hot
+ - -best
+ description: >
+ Sort videos by criteria (prefixing with `-` means `DESC` order):
+ * `hot` - Adaptation of Reddit "hot" algorithm taking into account video views, likes, dislikes and comments and publication date
+ * `best` - Same than `hot`, but also takes into account user video history
+ * `trending` - Sort videos by recent views ("recent" is defined by the admin)
+ * `views` - Sort videos using their `views` counter
+ * `publishedAt` - Sort by video publication date (when it became publicly available)
videosSearchSort:
name: sort
in: query
required: false
- description: Sort videos by criteria
+ description: >
+ Sort videos by criteria (prefixing with `-` means `DESC` order):
schema:
type: string
enum:
type: string
enum:
- createdAt
+ registrationTokenSort:
+ name: sort
+ in: query
+ required: false
+ description: Sort registration tokens by criteria
+ schema:
+ type: string
+ enum:
+ - createdAt
+ runnerSort:
+ name: sort
+ in: query
+ required: false
+ description: Sort runners by criteria
+ schema:
+ type: string
+ enum:
+ - createdAt
+ runnerJobSort:
+ name: sort
+ in: query
+ required: false
+ description: Sort runner jobs by criteria
+ schema:
+ type: string
+ enum:
+ - updatedAt
+ - createdAt
+ - priority
+ - state
+ - progress
+
name:
name: name
in: path
description: Entity id
schema:
$ref: '#/components/schemas/id'
+ registrationId:
+ name: registrationId
+ in: path
+ required: true
+ description: Registration ID
+ schema:
+ $ref: '#/components/schemas/id'
idOrUUID:
name: id
in: path
schema:
type: string
example: my_username | my_username@example.com
+ channelSyncId:
+ name: channelSyncId
+ in: path
+ required: true
+ description: Channel Sync id
+ schema:
+ $ref: '#/components/schemas/Abuse/properties/id'
subscriptionHandle:
name: subscriptionHandle
in: path
schema:
$ref: '#/components/schemas/VideoPrivacySet'
description: '**PeerTube >= 4.0** Display only videos in this specific privacy/privacies'
+ excludeAlreadyWatched:
+ name: excludeAlreadyWatched
+ in: query
+ description: Whether or not to exclude videos that are in the user's video history
+ schema:
+ type: boolean
+ uuids:
+ name: uuids
+ in: query
+ required: false
+ schema:
+ items:
+ type: string
+ description: 'Find videos with specific UUIDs'
include:
name: include
in: query
- activitypub-refresher
- video-redundancy
- video-live-ending
+ - video-channel-import
followState:
name: state
in: query
- Group
- Service
- Organization
+ staticFilename:
+ name: filename
+ in: path
+ required: true
+ description: Filename
+ schema:
+ type: string
+ videoFileToken:
+ name: videoFileToken
+ in: query
+ required: false
+ description: Video file token [generated](#operation/requestVideoToken) by PeerTube so you don't need to provide an OAuth token in the request header.
+ schema:
+ type: string
+ reinjectVideoFileToken:
+ name: reinjectVideoFileToken
+ in: query
+ required: false
+ description: Ask the server to reinject videoFileToken in URLs in m3u8 playlist
+ schema:
+ type: boolean
+ videoPlaylistType:
+ name: playlistType
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/VideoPlaylistTypeSet'
+ registrationTokenId:
+ name: registrationTokenId
+ in: path
+ required: true
+ schema:
+ type: integer
+ runnerId:
+ name: runnerId
+ in: path
+ required: true
+ schema:
+ type: integer
+ jobUUID:
+ name: jobUUID
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/UUIDv4'
+
securitySchemes:
OAuth2:
description: |
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
+ [Generate]: https://docs.joinpeertube.org/api/rest-getting-started
type: oauth2
flows:
password:
moderator: Moderator scope
user: User scope
schemas:
- # Resuable core properties
+ # Reusable core properties
id:
type: integer
minimum: 1
- 1
- 2
- 3
- description: Video playlist privacy policy (see [/video-playlists/privacies])
+ description: Video playlist privacy policy (see [/video-playlists/privacies](#operation/getPlaylistPrivacyPolicies))
VideoPlaylistPrivacyConstant:
properties:
id:
- 2
- 3
- 4
- description: privacy id of the video (see [/videos/privacies](#operation/getPrivacyPolicies))
+ description: privacy id of the video (see [/videos/privacies](#operation/getVideoPrivacyPolicies))
VideoPrivacyConstant:
properties:
id:
- 1
- 2
- 3
- description: 'The live latency mode (Default = `1`, HIght latency = `2`, Small Latency = `3`)'
+ description: 'The live latency mode (Default = `1`, High latency = `2`, Small Latency = `3`)'
+
+ LiveVideoReplaySettings:
+ type: object
+ properties:
+ privacy:
+ # description: Video playlist privacy policy (see [../video-playlists/privacies])
+ $ref: '#/components/schemas/VideoPrivacySet'
+
VideoStateConstant:
properties:
- 1
- 2
- 3
- description: 'The video state (Published = `1`, to transcode = `2`, to import = `3`)'
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ description: |
+ The video state:
+ - `1`: Published
+ - `2`: To transcode
+ - `3`: To import
+ - `4`: Waiting for live stream
+ - `5`: Live ended
+ - `6`: To move to an external storage (object storage...)
+ - `7`: Transcoding failed
+ - `8`: Moving to an external storage failed
+ - `9`: To edit using studio edition feature
label:
type: string
VideoFile:
readOnly: true
properties:
+ id:
+ $ref: '#/components/schemas/id'
magnetUri:
type: string
format: uri
$ref: '#/components/schemas/VideoConstantString-Language'
captionPath:
type: string
+ VideoSource:
+ properties:
+ filename:
+ type: string
ActorImage:
properties:
path:
description:
type: string
description: text or bio displayed on the account's profile
- UserWatchingVideo:
+ UserViewingVideo:
+ required:
+ - currentTime
properties:
currentTime:
type: integer
format: seconds
description: timestamp within the video, in seconds
example: 5
+ viewEvent:
+ type: string
+ enum:
+ - seek
+ description: >
+ Event since last viewing call:
+ * `seek` - If the user seeked the video
+
+ VideoStatsOverall:
+ properties:
+ averageWatchTime:
+ type: number
+ totalWatchTime:
+ type: number
+ viewersPeak:
+ type: number
+ viewersPeakDate:
+ type: string
+ format: date-time
+ countries:
+ type: array
+ items:
+ type: object
+ properties:
+ isoCode:
+ type: string
+ viewers:
+ type: number
+
+ VideoStatsRetention:
+ properties:
+ data:
+ type: array
+ items:
+ type: object
+ properties:
+ second:
+ type: number
+ retentionPercent:
+ type: number
+
+ VideoStatsTimeserie:
+ properties:
+ data:
+ type: array
+ items:
+ type: object
+ properties:
+ date:
+ type: string
+ value:
+ type: number
+
ServerConfig:
properties:
instance:
properties:
enabled:
type: boolean
+ videoChannelSynchronization:
+ type: object
+ properties:
+ enabled:
+ type: boolean
autoBlacklist:
type: object
properties:
enabled:
type: boolean
+ SendClientLog:
+ properties:
+ message:
+ type: string
+ url:
+ type: string
+ description: URL of the current user page
+ level:
+ enum:
+ - error
+ - warn
+ stackTrace:
+ type: string
+ description: Stack trace of the error if there is one
+ userAgent:
+ type: string
+ description: User agent of the web browser that sends the message
+ meta:
+ type: string
+ description: Additional information regarding this log
+ required:
+ - message
+ - url
+ - level
+
+ ServerStats:
+ properties:
+ totalUsers:
+ type: number
+ totalDailyActiveUsers:
+ type: number
+ totalWeeklyActiveUsers:
+ type: number
+ totalMonthlyActiveUsers:
+ type: number
+ totalLocalVideos:
+ type: number
+ totalLocalVideoViews:
+ type: number
+ description: Total video views made on the instance
+ totalLocalVideoComments:
+ type: number
+ description: Total comments made by local users
+ totalLocalVideoFilesSize:
+ type: number
+ totalVideos:
+ type: number
+ totalVideoComments:
+ type: number
+ totalLocalVideoChannels:
+ type: number
+ totalLocalDailyActiveVideoChannels:
+ type: number
+ totalLocalWeeklyActiveVideoChannels:
+ type: number
+ totalLocalMonthlyActiveVideoChannels:
+ type: number
+ totalLocalPlaylists:
+ type: number
+ totalInstanceFollowers:
+ type: number
+ totalInstanceFollowing:
+ type: number
+ videosRedundancy:
+ type: array
+ items:
+ type: object
+ properties:
+ strategy:
+ type: string
+ totalSize:
+ type: number
+ totalUsed:
+ type: number
+ totalVideoFiles:
+ type: number
+ totalVideos:
+ type: number
+ totalActivityPubMessagesProcessed:
+ type: number
+ totalActivityPubMessagesSuccesses:
+ type: number
+ totalActivityPubMessagesErrors:
+ type: number
+
+ activityPubMessagesProcessedPerSecond:
+ type: number
+ totalActivityPubMessagesWaiting:
+ type: number
+
ServerConfigAbout:
properties:
instance:
properties:
enabled:
type: boolean
+ video_channel_synchronization:
+ type: object
+ properties:
+ enabled:
+ type: boolean
autoBlacklist:
type: object
properties:
- videos-views-stats
- activitypub-refresher
- video-redundancy
+ - video-channel-import
data:
type: object
additionalProperties: true
properties:
comment:
$ref: '#/components/schemas/VideoComment'
+ VideoTokenResponse:
+ properties:
+ files:
+ type: object
+ properties:
+ token:
+ type: string
+ expires:
+ type: string
+ format: date-time
VideoListResponse:
properties:
total:
nsfwPolicy:
$ref: '#/components/schemas/NSFWPolicy'
role:
- $ref: '#/components/schemas/UserRole'
- roleLabel:
- type: string
- enum:
- - User
- - Moderator
- - Administrator
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/UserRole'
+ label:
+ type: string
+ enum:
+ - User
+ - Moderator
+ - Administrator
theme:
type: string
description: Theme enabled by this user
- username
- password
- email
- - videoQuota
- - videoQuotaDaily
- role
UpdateUser:
properties:
required:
- video
- rating
+
RegisterUser:
properties:
username:
description: email of the user, used for login or service communications
displayName:
type: string
- description: editable name of the user, displayed in its representations
- minLength: 1
- maxLength: 120
- channel:
+ description: editable name of the user, displayed in its representations
+ minLength: 1
+ maxLength: 120
+ channel:
+ type: object
+ description: channel base information used to create the first channel of the user
+ properties:
+ name:
+ $ref: '#/components/schemas/usernameChannel'
+ displayName:
+ type: string
+ required:
+ - username
+ - password
+ - email
+
+ UserRegistrationRequest:
+ allOf:
+ - $ref: '#/components/schemas/RegisterUser'
+ - type: object
+ properties:
+ registrationReason:
+ type: string
+ description: reason for the user to register on the instance
+ required:
+ - registrationReason
+
+ UserRegistrationAcceptOrReject:
+ type: object
+ properties:
+ moderationResponse:
+ type: string
+ description: Moderation response to send to the user
+ preventEmailDelivery:
+ type: boolean
+ description: Set it to true if you don't want PeerTube to send an email to the user
+ required:
+ - moderationResponse
+
+ UserRegistration:
+ properties:
+ id:
+ $ref: '#/components/schemas/id'
+ state:
+ type: object
+ properties:
+ id:
+ type: integer
+ enum:
+ - 1
+ - 2
+ - 3
+ description: 'The registration state (Pending = `1`, Rejected = `2`, Accepted = `3`)'
+ label:
+ type: string
+ registrationReason:
+ type: string
+ moderationResponse:
+ type: string
+ nullable: true
+ username:
+ type: string
+ email:
+ type: string
+ format: email
+ emailVerified:
+ type: boolean
+ accountDisplayName:
+ type: string
+ channelHandle:
+ type: string
+ channelDisplayName:
+ type: string
+ createdAt:
+ type: string
+ format: date-time
+ updatedAt:
+ type: string
+ format: date-time
+ user:
type: object
- description: channel base information used to create the first channel of the user
+ nullable: true
+ description: If the registration has been accepted, this is a partial user object created by the registration
properties:
- name:
- $ref: '#/components/schemas/usernameChannel'
- displayName:
- type: string
- required:
- - username
- - password
- - email
+ id:
+ $ref: '#/components/schemas/id'
OAuthClient:
properties:
type: integer
uuid:
$ref: '#/components/schemas/UUIDv4'
+
+ VideoChannelEdit:
+ properties:
+ displayName:
+ description: Channel display name
+ description:
+ description: Channel description
+ support:
+ description: How to support/fund the channel
+
VideoChannelCreate:
allOf:
- - $ref: '#/components/schemas/VideoChannel'
+ - $ref: '#/components/schemas/VideoChannelEdit'
- properties:
name:
description: username of the channel to create
- displayName
VideoChannelUpdate:
allOf:
- - $ref: '#/components/schemas/VideoChannel'
+ - $ref: '#/components/schemas/VideoChannelEdit'
- properties:
bulkVideosSupportUpdate:
type: boolean
description: Update the support field for all videos of this channel
+
VideoChannelList:
properties:
total:
- $ref: '#/components/schemas/VideoChannel'
- $ref: '#/components/schemas/Actor'
+ ImportVideosInChannelCreate:
+ type: object
+ properties:
+ externalChannelUrl:
+ type: string
+ example: https://youtube.com/c/UC_myfancychannel
+ videoChannelSyncId:
+ type: integer
+ description: If part of a channel sync process, specify its id to assign video imports to this channel synchronization
+ required:
+ - 'externalChannelUrl'
+
+ VideoChannelSync:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/id'
+ state:
+ type: object
+ properties:
+ id:
+ type: integer
+ example: 2
+ label:
+ type: string
+ example: PROCESSING
+ externalChannelUrl:
+ type: string
+ example: 'https://youtube.com/c/UC_myfancychannel'
+ createdAt:
+ type: string
+ format: date-time
+ lastSyncAt:
+ type: string
+ format: date-time
+ nullable: true
+ channel:
+ $ref: '#/components/schemas/VideoChannel'
+ VideoChannelSyncList:
+ type: object
+ properties:
+ total:
+ type: integer
+ example: 1
+ data:
+ type: array
+ items:
+ allOf:
+ - $ref: '#/components/schemas/VideoChannelSync'
+ VideoChannelSyncCreate:
+ type: object
+ properties:
+ externalChannelUrl:
+ type: string
+ example: https://youtube.com/c/UC_myfancychannel
+ videoChannelId:
+ $ref: '#/components/schemas/id'
MRSSPeerLink:
type: object
xml:
NotificationSettingValue:
type: integer
description: >
- Notification type
+ Notification type. One of the following values, or a sum of multiple values:
- `0` NONE
- `1` WEB
- `2` EMAIL
- enum:
- - 0
- - 1
- - 2
Notification:
properties:
id:
properties:
saveReplay:
type: boolean
+ replaySettings:
+ $ref: '#/components/schemas/LiveVideoReplaySettings'
permanentLive:
description: User can stream multiple times in a permanent live
type: boolean
properties:
rtmpUrl:
type: string
+ description: Included in the response if an appropriate token is provided
rtmpsUrl:
type: string
+ description: Included in the response if an appropriate token is provided
streamKey:
type: string
- description: RTMP stream key to use to stream into this live video
+ description: RTMP stream key to use to stream into this live video. Included in the response if an appropriate token is provided
saveReplay:
type: boolean
+ replaySettings:
+ $ref: '#/components/schemas/LiveVideoReplaySettings'
permanentLive:
description: User can stream multiple times in a permanent live
type: boolean
description: User can select live latency mode if enabled by the instance
$ref: '#/components/schemas/LiveVideoLatencyMode'
+ RequestTwoFactorResponse:
+ properties:
+ otpRequest:
+ type: object
+ properties:
+ requestToken:
+ type: string
+ description: The token to send to confirm this request
+ secret:
+ type: string
+ description: The OTP secret
+ uri:
+ type: string
+ description: The OTP URI
+
+ VideoStudioCreateTask:
+ type: array
+ items:
+ anyOf:
+ -
+ title: cut
+ type: object
+ properties:
+ name:
+ type: string
+ enum:
+ - 'cut'
+ options:
+ type: object
+ properties:
+ start:
+ type: integer
+ end:
+ type: integer
+ -
+ title: add-intro
+ type: object
+ properties:
+ name:
+ type: string
+ enum:
+ - 'add-intro'
+ options:
+ type: object
+ properties:
+ file:
+ type: string
+ format: binary
+ -
+ title: add-outro
+ type: object
+ properties:
+ name:
+ type: string
+ enum:
+ - 'add-outro'
+ options:
+ type: object
+ properties:
+ file:
+ type: string
+ format: binary
+ -
+ title: add-watermark
+ type: object
+ properties:
+ name:
+ type: string
+ enum:
+ - 'add-watermark'
+ options:
+ type: object
+ properties:
+ file:
+ type: string
+ format: binary
+
+ LiveVideoSessionResponse:
+ properties:
+ id:
+ type: integer
+ startDate:
+ type: string
+ format: date-time
+ description: Start date of the live session
+ endDate:
+ type: string
+ format: date-time
+ nullable: true
+ description: End date of the live session
+ error:
+ type: integer
+ enum:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ nullable: true
+ description: >
+ Error type if an error occurred during the live session:
+ - `1`: Bad socket health (transcoding is too slow)
+ - `2`: Max duration exceeded
+ - `3`: Quota exceeded
+ - `4`: Quota FFmpeg error
+ - `5`: Video has been blacklisted during the live
+ replayVideo:
+ type: object
+ description: Video replay information
+ properties:
+ id:
+ type: number
+ uuid:
+ $ref: '#/components/schemas/UUIDv4'
+ shortUUID:
+ $ref: '#/components/schemas/shortUUID'
+
+ PlaybackMetricCreate:
+ properties:
+ playerMode:
+ type: string
+ enum:
+ - 'p2p-media-loader'
+ - 'webtorrent'
+ resolution:
+ type: number
+ description: Current player video resolution
+ fps:
+ type: number
+ description: Current player video fps
+ resolutionChanges:
+ type: number
+ description: How many resolution changes occured since the last metric creation
+ errors:
+ type: number
+ description: How many errors occured since the last metric creation
+ downloadedBytesP2P:
+ type: number
+ description: How many bytes were downloaded with P2P since the last metric creation
+ downloadedBytesHTTP:
+ type: number
+ description: How many bytes were downloaded with HTTP since the last metric creation
+ uploadedBytesP2P:
+ type: number
+ description: How many bytes were uploaded with P2P since the last metric creation
+ videoId:
+ oneOf:
+ - $ref: '#/components/schemas/id'
+ - $ref: '#/components/schemas/UUIDv4'
+ - $ref: '#/components/schemas/shortUUID'
+ required:
+ - playerMode
+ - resolutionChanges
+ - errors
+ - downloadedBytesP2P
+ - downloadedBytesHTTP
+ - uploadedBytesP2P
+ - videoId
+
+ RunnerRegistrationToken:
+ properties:
+ id:
+ type: integer
+ registrationToken:
+ type: string
+ createdAt:
+ type: string
+ format: date-time
+ updatedAt:
+ type: string
+ format: date-time
+ registeredRunnersCount:
+ type: integer
+
+ Runner:
+ properties:
+ id:
+ type: integer
+ name:
+ type: string
+ description:
+ type: string
+ ip:
+ type: string
+ updatedAt:
+ type: string
+ format: date-time
+ createdAt:
+ type: string
+ format: date-time
+ lastContact:
+ type: string
+ format: date-time
+
+ RunnerJobType:
+ type: string
+ enum:
+ - vod-web-video-transcoding
+ - vod-hls-transcoding
+ - vod-audio-merge-transcoding
+ - live-rtmp-hls-transcoding
+
+ RunnerJobState:
+ type: integer
+ enum:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ description: >
+ The runner job state:
+ - `1` Pending
+ - `2` Processing
+ - `3` Completed
+ - `4` Errored
+ - `5` Waiting for a parent job
+ - `6` Cancelled
+ - `7` Parent had an error
+ - `8` Parent has been cancelled
+
+ RunnerJobStateConstant:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/RunnerJobState'
+ label:
+ type: string
+ example: 'Processing'
+
+ RunnerJobPayload:
+ anyOf:
+ - type: object
+ title: VOD web video transcoding
+ properties:
+ input:
+ type: object
+ properties:
+ videoFileUrl:
+ type: string
+ output:
+ type: object
+ properties:
+ resolution:
+ type: number
+ fps:
+ type: number
+ - type: object
+ title: VOD HLS transcoding
+ properties:
+ input:
+ type: object
+ properties:
+ videoFileUrl:
+ type: string
+ output:
+ type: object
+ properties:
+ resolution:
+ type: number
+ fps:
+ type: number
+ - type: object
+ title: VOD audio merge transcoding
+ properties:
+ input:
+ type: object
+ properties:
+ audioFileUrl:
+ type: string
+ previewFileUrl:
+ type: string
+ output:
+ type: object
+ properties:
+ resolution:
+ type: number
+ fps:
+ type: number
+
+ RunnerJob:
+ properties:
+ uuid:
+ $ref: '#/components/schemas/UUIDv4'
+ type:
+ $ref: '#/components/schemas/RunnerJobType'
+ state:
+ $ref: '#/components/schemas/RunnerJobStateConstant'
+ payload:
+ $ref: '#/components/schemas/RunnerJobPayload'
+ failures:
+ type: integer
+ description: Number of times a remote runner failed to process this job. After too many failures, the job in "error" state
+ error:
+ nullable: true
+ type: string
+ description: Error message if the job is errored
+ progress:
+ type: integer
+ description: Percentage progress
+ priority:
+ type: integer
+ description: Job priority (less has more priority)
+ updatedAt:
+ type: string
+ format: date-time
+ createdAt:
+ type: string
+ format: date-time
+ startedAt:
+ type: string
+ format: date-time
+ finishedAt:
+ type: string
+ format: date-time
+ parent:
+ nullable: true
+ description: If job has a parent job
+ type: object
+ properties:
+ type:
+ $ref: '#/components/schemas/RunnerJobType'
+ state:
+ $ref: '#/components/schemas/RunnerJobStateConstant'
+ uuid:
+ $ref: '#/components/schemas/UUIDv4'
+ runner:
+ nullable: true
+ description: If job is associated to a runner
+ properties:
+ id:
+ type: number
+ name:
+ type: string
+ description:
+ type: string
+
+ RunnerJobAdmin:
+ allOf:
+ - $ref: '#/components/schemas/RunnerJob'
+ - type: object
+ properties:
+ privatePayload:
+ type: object
+
callbacks:
searchIndex:
'https://search.example.org/api/v1/search/videos':