| `/api/*` |
| `/download/*` |
| `/lazy-static/*` |
- | `/live/segments-sha256/*` |
| `/.well-known/webfinger` |
In addition, all routes serving ActivityPub are CORS-enabled for all origins.
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: Video transcoding related operations
- name: Video stats
description: Video statistics
- - name: Feeds
- description: Server syndication feeds
+ - 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
+
x-tagGroups:
+ - name: Static endpoints
+ tags:
+ - Static Video Files
+ - name: Feeds
+ tags:
+ - Video Feeds
- name: Auth
tags:
- Register
- 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
paths:
- '/accounts/{name}':
+ '/static/webseed/{filename}':
+ get:
+ tags:
+ - Static Video Files
+ summary: Get public WebTorrent video file
+ parameters:
+ - $ref: '#/components/parameters/staticFilename'
+ responses:
+ '200':
+ description: successful operation
+ '404':
+ description: not found
+ '/static/webseed/private/{filename}':
+ get:
+ tags:
+ - Static Video Files
+ summary: Get private WebTorrent video file
+ parameters:
+ - $ref: '#/components/parameters/staticFilename'
+ - $ref: '#/components/parameters/videoFileToken'
+ security:
+ - OAuth2: []
+ responses:
+ '200':
+ description: successful operation
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
+
+ '/static/streaming-playlists/hls/{filename}':
+ get:
+ tags:
+ - Static Video Files
+ summary: Get public HLS video file
+ parameters:
+ - $ref: '#/components/parameters/staticFilename'
+ security:
+ - OAuth2: []
+ responses:
+ '200':
+ description: successful operation
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
+ '/static/streaming-playlists/hls/private/{filename}':
+ get:
+ tags:
+ - Static Video Files
+ summary: Get private HLS video file
+ parameters:
+ - $ref: '#/components/parameters/staticFilename'
+ - $ref: '#/components/parameters/videoFileToken'
+ security:
+ - OAuth2: []
+ responses:
+ '200':
+ description: successful operation
+ '403':
+ description: invalid auth
+ '404':
+ description: not found
+
+
+ '/feeds/video-comments.{format}':
+ get:
+ tags:
+ - 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:
+ '204':
+ description: successful operation
+ headers:
+ Cache-Control:
+ schema:
+ type: string
+ default: 'max-age=900' # 15 min cache
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/VideoCommentsForXML'
+ 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
+ '404':
+ description: video, video channel or account not found
+ '406':
+ description: accept header unsupported
+
+ '/feeds/videos.{format}':
+ get:
+ tags:
+ - 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:
+ '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:
+ 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
+
+ '/feeds/subscriptions.{format}':
+ get:
+ tags:
+ - Video Feeds
+ summary: List videos of subscriptions tied to a token
+ operationId: getSyndicatedSubscriptionVideos
+ 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'
+ responses:
+ '204':
+ description: successful operation
+ headers:
+ Cache-Control:
+ schema:
+ type: string
+ default: 'max-age=900' # 15 min cache
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ application/rss+xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ text/xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ application/atom+xml:
+ schema:
+ $ref: '#/components/schemas/VideosForXML'
+ application/json:
+ schema:
+ type: object
+ '406':
+ description: accept header unsupported
+
+ '/api/v1/accounts/{name}':
get:
tags:
- Accounts
'404':
description: account not found
- '/accounts/{name}/videos':
+ '/api/v1/accounts/{name}/videos':
get:
tags:
- Accounts
print(json)
- '/accounts/{name}/followers':
+ '/api/v1/accounts/{name}/followers':
get:
tags:
- Accounts
items:
$ref: '#/components/schemas/Follow'
- /accounts:
+ /api/v1/accounts:
get:
tags:
- Accounts
items:
$ref: '#/components/schemas/Account'
- /config:
+ /api/v1/config:
get:
tags:
- Config
nightly:
externalValue: https://peertube2.cpy.re/api/v1/config
- /config/about:
+ /api/v1/config/about:
get:
summary: Get instance "About" information
operationId: getAbout
nightly:
externalValue: https://peertube2.cpy.re/api/v1/config/about
- /config/custom:
+ /api/v1/config/custom:
get:
summary: Get instance runtime configuration
operationId: getCustomConfig
'200':
description: successful operation
- /custom-pages/homepage/instance:
+ /api/v1/custom-pages/homepage/instance:
get:
summary: Get instance custom homepage
tags:
'204':
description: successful operation
- /jobs/pause:
+ /api/v1/jobs/pause:
post:
summary: Pause job queue
security:
'204':
description: successful operation
- /jobs/resume:
+ /api/v1/jobs/resume:
post:
summary: Resume job queue
security:
'204':
description: successful operation
- /jobs/{state}:
+ /api/v1/jobs/{state}:
get:
summary: List instance jobs
operationId: getJobs
items:
$ref: '#/components/schemas/Job'
- /server/followers:
+ /api/v1/server/followers:
get:
tags:
- Instance Follows
items:
$ref: '#/components/schemas/Follow'
- '/server/followers/{nameWithHost}':
+ '/api/v1/server/followers/{nameWithHost}':
delete:
summary: Remove or reject a follower to your server
security:
'404':
description: follower not found
- '/server/followers/{nameWithHost}/reject':
+ '/api/v1/server/followers/{nameWithHost}/reject':
post:
summary: Reject a pending follower to your server
security:
'404':
description: follower not found
- '/server/followers/{nameWithHost}/accept':
+ '/api/v1/server/followers/{nameWithHost}/accept':
post:
summary: Accept a pending follower to your server
security:
'404':
description: follower not found
- /server/following:
+ /api/v1/server/following:
get:
tags:
- Instance Follows
type: string
uniqueItems: true
- '/server/following/{hostOrHandle}':
+ '/api/v1/server/following/{hostOrHandle}':
delete:
summary: Unfollow an actor (PeerTube instance, channel or account)
security:
'404':
description: host or handle not found
- /users:
+ /api/v1/users:
post:
summary: Create a user
operationId: addUser
items:
$ref: '#/components/schemas/User'
- '/users/{id}':
+ '/api/v1/users/{id}':
parameters:
- $ref: '#/components/parameters/id'
delete:
$ref: '#/components/schemas/UpdateUser'
required: true
- /oauth-clients/local:
+ /api/v1/oauth-clients/local:
get:
summary: Login prerequisite
description: You need to retrieve a client id and secret before [logging in](#operation/getOAuthToken).
## AUTH
curl -s "$API/oauth-clients/local"
- /users/token:
+ /api/v1/users/token:
post:
summary: Login
operationId: getOAuthToken
--data password="$PASSWORD" \
| jq -r ".access_token"
- /users/revoke-token:
+ /api/v1/users/revoke-token:
post:
summary: Logout
description: Revokes your access token and its associated refresh token, destroying your current session.
'200':
description: successful operation
- /users/register:
+ /api/v1/users/register:
post:
summary: Register a user
operationId: registerUser
$ref: '#/components/schemas/RegisterUser'
required: true
- /users/{id}/verify-email:
+ /api/v1/users/{id}/verify-email:
post:
summary: Verify a user
operationId: verifyUser
'404':
description: user not found
- /users/ask-send-verify-email:
+ /api/v1/users/{id}/two-factor/request:
+ post:
+ summary: Request two factor auth
+ operationId: requestTwoFactor
+ description: Request two factor authentication for a user
+ tags:
+ - 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
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/RequestTwoFactorResponse'
+ '403':
+ description: invalid password
+ '404':
+ description: user not found
+
+ /api/v1/users/{id}/two-factor/confirm-request:
+ post:
+ summary: Confirm two factor auth
+ operationId: confirmTwoFactorRequest
+ description: Confirm a two factor authentication request
+ tags:
+ - 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:
+ '204':
+ description: successful operation
+ '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
+ description: Password of the currently authenticated user
+ responses:
+ '204':
+ description: successful operation
+ '403':
+ description: invalid password
+ '404':
+ description: user not found
+
+
+ /api/v1/users/ask-send-verify-email:
post:
summary: Resend user verification link
operationId: resendEmailToVerifyUser
'204':
description: successful operation
- /users/me:
+ /api/v1/users/me:
get:
summary: Get my user information
operationId: getUserInfo
$ref: '#/components/schemas/UpdateMe'
required: true
- /users/me/videos/imports:
+ /api/v1/users/me/videos/imports:
get:
summary: Get video imports of my user
security:
- $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
schema:
$ref: '#/components/schemas/VideoImportsList'
- /users/me/video-quota-used:
+ /api/v1/users/me/video-quota-used:
get:
summary: Get my user used quota
security:
description: The user video quota used today in bytes
example: 1681014151
- '/users/me/videos/{videoId}/rating':
+ '/api/v1/users/me/videos/{videoId}/rating':
get:
summary: Get rate of my user for a video
security:
schema:
$ref: '#/components/schemas/GetMeVideoRating'
- /users/me/videos:
+ /api/v1/users/me/videos:
get:
summary: Get videos of my user
security:
schema:
$ref: '#/components/schemas/VideoListResponse'
- /users/me/subscriptions:
+ /api/v1/users/me/subscriptions:
get:
summary: Get my user subscriptions
security:
'200':
description: successful operation
- /users/me/subscriptions/exist:
+ /api/v1/users/me/subscriptions/exist:
get:
summary: Get if subscriptions exist for my user
security:
schema:
type: object
- /users/me/subscriptions/videos:
+ /api/v1/users/me/subscriptions/videos:
get:
summary: List videos of subscriptions of my user
security:
schema:
$ref: '#/components/schemas/VideoListResponse'
- '/users/me/subscriptions/{subscriptionHandle}':
+ '/api/v1/users/me/subscriptions/{subscriptionHandle}':
get:
summary: Get subscription of my user
security:
'200':
description: successful operation
- /users/me/notifications:
+ /api/v1/users/me/notifications:
get:
summary: List my notifications
security:
schema:
$ref: '#/components/schemas/NotificationListResponse'
- /users/me/notifications/read:
+ /api/v1/users/me/notifications/read:
post:
summary: Mark notifications as read by their id
security:
'204':
description: successful operation
- /users/me/notifications/read-all:
+ /api/v1/users/me/notifications/read-all:
post:
summary: Mark all my notification as read
security:
'204':
description: successful operation
- /users/me/notification-settings:
+ /api/v1/users/me/notification-settings:
put:
summary: Update my notification settings
security:
'204':
description: successful operation
- /users/me/history/videos:
+ /api/v1/users/me/history/videos:
get:
summary: List watched videos history
security:
schema:
$ref: '#/components/schemas/VideoListResponse'
- /users/me/history/videos/{videoId}:
+ /api/v1/users/me/history/videos/{videoId}:
delete:
summary: Delete history element
security:
'204':
description: successful operation
- /users/me/history/videos/remove:
+ /api/v1/users/me/history/videos/remove:
post:
summary: Clear video history
security:
'204':
description: successful operation
- /users/me/avatar/pick:
+ /api/v1/users/me/avatar/pick:
post:
summary: Update my user avatar
security:
avatarfile:
contentType: image/png, image/jpeg
- /users/me/avatar:
+ /api/v1/users/me/avatar:
delete:
summary: Delete my avatar
security:
'204':
description: successful operation
- /videos/ownership:
+ /api/v1/videos/ownership:
get:
summary: List video ownership changes
tags:
'200':
description: successful operation
- '/videos/ownership/{id}/accept':
+ '/api/v1/videos/ownership/{id}/accept':
post:
summary: Accept ownership change request
tags:
'404':
description: video ownership change not found
- '/videos/ownership/{id}/refuse':
+ '/api/v1/videos/ownership/{id}/refuse':
post:
summary: Refuse ownership change request
tags:
'404':
description: video ownership change not found
- '/videos/{id}/give-ownership':
+ '/api/v1/videos/{id}/give-ownership':
post:
summary: Request ownership change
tags:
'404':
description: video not found
- /videos:
+ '/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
schema:
$ref: '#/components/schemas/VideoListResponse'
- /videos/categories:
+ /api/v1/videos/categories:
get:
summary: List available video categories
operationId: getCategories
nightly:
externalValue: https://peertube2.cpy.re/api/v1/videos/categories
- /videos/licences:
+ /api/v1/videos/licences:
get:
summary: List available video licences
operationId: getLicences
nightly:
externalValue: https://peertube2.cpy.re/api/v1/videos/licences
- /videos/languages:
+ /api/v1/videos/languages:
get:
summary: List available video languages
operationId: getLanguages
nightly:
externalValue: https://peertube2.cpy.re/api/v1/videos/languages
- /videos/privacies:
+ /api/v1/videos/privacies:
get:
summary: List available video privacy policies
operationId: getPrivacyPolicies
nightly:
externalValue: https://peertube2.cpy.re/api/v1/videos/privacies
- '/videos/{id}':
+ '/api/v1/videos/{id}':
put:
summary: Update a video
operationId: putVideo
'204':
description: successful operation
- '/videos/{id}/description':
+ '/api/v1/videos/{id}/description':
get:
summary: Get complete video description
operationId: getVideoDesc
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)**
- '/videos/{id}/source':
+ '/api/v1/videos/{id}/source':
post:
summary: Get video source file metadata
operationId: getVideoSource
schema:
$ref: '#/components/schemas/VideoSource'
- '/videos/{id}/views':
+ '/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.
'204':
description: successful operation
- '/videos/{id}/watching':
+ '/api/v1/videos/{id}/watching':
put:
summary: Set watching progress of a video
deprecated: true
'204':
description: successful operation
- '/videos/{id}/stats/overall':
+ '/api/v1/videos/{id}/stats/overall':
get:
summary: Get overall stats of a video
tags:
schema:
$ref: '#/components/schemas/VideoStatsOverall'
- '/videos/{id}/stats/retention':
+ '/api/v1/videos/{id}/stats/retention':
get:
summary: Get retention stats of a video
tags:
schema:
$ref: '#/components/schemas/VideoStatsRetention'
- '/videos/{id}/stats/timeseries/{metric}':
+ '/api/v1/videos/{id}/stats/timeseries/{metric}':
get:
summary: Get timeserie stats of a video
tags:
schema:
$ref: '#/components/schemas/VideoStatsTimeserie'
- /videos/upload:
+ /api/v1/videos/upload:
post:
summary: Upload a video
description: Uses a single request to upload a video.
--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
'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
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
- /videos/live/{id}/sessions:
+ /api/v1/videos/live/{id}/sessions:
get:
summary: List live sessions
description: List all sessions created in a particular live
type: array
items:
$ref: '#/components/schemas/LiveVideoSessionResponse'
- /videos/{id}/live-session:
+ /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
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
schema:
$ref: '#/components/schemas/VideoListResponse'
- '/video-channels/{channelHandle}/followers':
+ '/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:
+ - OAuth2: []
+ tags:
+ - Video Channels
+ parameters:
+ - $ref: '#/components/parameters/channelHandle'
+ responses:
+ '204':
+ description: successful operation
+
+ '/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 channel banner
+ summary: Delete a video channel synchronization
+ operationId: delVideoChannelSync
security:
- OAuth2: []
tags:
- - Video Channels
+ - Channels Sync
parameters:
- - $ref: '#/components/parameters/channelHandle'
+ - $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
- /video-playlists/privacies:
+
+ /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
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:
type: integer
format: seconds
- '/accounts/{name}/video-channels':
+ '/api/v1/accounts/{name}/video-channels':
get:
summary: List video channels of an account
tags:
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'
'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
'404':
description: account or account block does not exist
- /server/blocklist/servers:
+ /api/v1/server/blocklist/servers:
get:
tags:
- Server Blocks
'409':
description: self-blocking forbidden
- '/server/blocklist/servers/{host}':
+ '/api/v1/server/blocklist/servers/{host}':
delete:
tags:
- Server Blocks
'404':
description: account block does not exist
- /server/redundancy/{host}:
+ /api/v1/server/redundancy/{host}:
put:
tags:
- Instance Redundancy
'404':
description: server is not already known
- /server/redundancy/videos:
+ /api/v1/server/redundancy/videos:
get:
tags:
- Video Mirroring
'409':
description: video is already mirrored
- /server/redundancy/videos/{redundancyId}:
+ /api/v1/server/redundancy/videos/{redundancyId}:
delete:
tags:
- Video Mirroring
'404':
description: video redundancy not found
- '/feeds/video-comments.{format}':
+ /api/v1/server/stats:
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
+ - Stats
+ summary: Get instance stats
+ description: Get instance public statistics. This endpoint is cached.
+ operationId: getInstanceStats
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
- '404':
- description: video, video channel or account not found
- '406':
- description: accept header unsupported
+ $ref: '#/components/schemas/ServerStats'
- '/feeds/videos.{format}':
- get:
+ /api/v1/server/logs/client:
+ post:
tags:
- - 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'
+ - Logs
+ summary: Send client log
+ operationId: sendClientLog
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SendClientLog'
responses:
'204':
description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
+
+ /api/v1/server/logs:
+ get:
+ tags:
+ - Logs
+ summary: Get instance logs
+ operationId: getInstanceLogs
+ security:
+ - OAuth2:
+ - admin
+ responses:
+ '200':
+ description: successful operation
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
- '404':
- description: video channel or account not found
- '406':
- description: accept header unsupported
+ type: array
+ items:
+ type: string
- '/feeds/subscriptions.{format}':
- get:
- tags:
- - Feeds
- - Account
- summary: List videos of subscriptions tied to a token
- operationId: getSyndicatedSubscriptionVideos
- 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'
+ /api/v1/server/audit-logs:
+ get:
+ tags:
+ - Logs
+ summary: Get instance audit logs
+ operationId: getInstanceAuditLogs
+ security:
+ - OAuth2:
+ - admin
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'
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- text/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
application/json:
schema:
- type: object
- '406':
- description: accept header unsupported
+ type: array
+ items:
+ type: string
- /plugins:
+ /api/v1/plugins:
get:
tags:
- Plugins
schema:
$ref: '#/components/schemas/PluginResponse'
- /plugins/available:
+ /api/v1/plugins/available:
get:
tags:
- Plugins
'503':
description: plugin index unavailable
- /plugins/install:
+ /api/v1/plugins/install:
post:
tags:
- Plugins
'400':
description: should have either `npmName` or `path` set
- /plugins/update:
+ /api/v1/plugins/update:
post:
tags:
- Plugins
'404':
description: existing plugin not found
- /plugins/uninstall:
+ /api/v1/plugins/uninstall:
post:
tags:
- Plugins
'404':
description: existing plugin not found
- /plugins/{npmName}:
+ /api/v1/plugins/{npmName}:
get:
tags:
- Plugins
'404':
description: plugin not found
- /plugins/{npmName}/settings:
+ /api/v1/plugins/{npmName}/settings:
put:
tags:
- Plugins
'404':
description: plugin not found
- /plugins/{npmName}/public-settings:
+ /api/v1/plugins/{npmName}/public-settings:
get:
tags:
- Plugins
'404':
description: plugin not found
- /plugins/{npmName}/registered-settings:
+ /api/v1/plugins/{npmName}/registered-settings:
get:
tags:
- Plugins
'404':
description: plugin not found
+ /api/v1/metrics/playback:
+ post:
+ summary: Create playback metrics
+ description: These metrics are exposed by OpenTelemetry metrics exporter if enabled.
+ tags:
+ - Stats
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaybackMetricCreate'
+ responses:
+ '204':
+ description: successful operation
+
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:
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'
+ 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
+
+
securitySchemes:
OAuth2:
description: |
VideoFile:
readOnly: true
properties:
+ id:
+ $ref: '#/components/schemas/id'
magnetUri:
type: string
format: uri
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
type: integer
uuid:
$ref: '#/components/schemas/UUIDv4'
+
VideoChannelCreate:
allOf:
- $ref: '#/components/schemas/VideoChannel'
- $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:
description: User can select live latency mode if enabled by the instance
$ref: '#/components/schemas/LiveVideoLatencyMode'
- 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:
+ 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
- description: Video replay information
properties:
- id:
- type: number
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- shortUUID:
- $ref: '#/components/schemas/shortUUID'
+ 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
callbacks:
searchIndex: