{"files":{"SKILL.md":"---\nname: peertube\ndescription: \"PeerTube API skill. Use when working with PeerTube for static, download, feeds. Covers 276 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# PeerTube\nAPI version: 8.1.0\n\n## Auth\nOAuth2\n\n## Base URL\nhttps://peertube2.cpy.re\n\n## Setup\n1. Configure auth: OAuth2\n2. GET /feeds/podcast/videos.xml -- videos podcast feed\n3. POST /api/v1/config/instance-banner/pick -- create first pick\n\n## Endpoints\n276 endpoints across 4 groups. See references/api-spec.lap for full details.\n\n### Static\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /static/web-videos/{filename} | Get public Web Video file |\n| GET | /static/web-videos/private/{filename} | Get private Web Video file |\n| GET | /static/streaming-playlists/hls/{filename} | Get public HLS video file |\n| GET | /static/streaming-playlists/hls/private/{filename} | Get private HLS video file |\n\n### Download\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /download/videos/generate/{videoId} | Download video file |\n\n### Feeds\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /feeds/video-comments.{format} | Comments on videos feeds |\n| GET | /feeds/videos.{format} | Common videos feeds |\n| GET | /feeds/subscriptions.{format} | Videos of subscriptions feeds |\n| GET | /feeds/podcast/videos.xml | Videos podcast feed |\n\n### Api\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/v1/accounts/{name} | Get an account |\n| GET | /api/v1/accounts/{name}/videos | List videos of an account |\n| GET | /api/v1/accounts/{name}/followers | List followers of an account |\n| GET | /api/v1/accounts | List accounts |\n| GET | /api/v1/config | Get instance public configuration |\n| GET | /api/v1/config/about | Get instance \"About\" information |\n| GET | /api/v1/config/custom | Get instance runtime configuration |\n| PUT | /api/v1/config/custom | Set instance runtime configuration |\n| DELETE | /api/v1/config/custom | Delete instance runtime configuration |\n| POST | /api/v1/config/instance-banner/pick | Update instance banner |\n| DELETE | /api/v1/config/instance-banner | Delete instance banner |\n| POST | /api/v1/config/instance-avatar/pick | Update instance avatar |\n| DELETE | /api/v1/config/instance-avatar | Delete instance avatar |\n| POST | /api/v1/config/instance-logo/{logoType}/pick | Update instance logo |\n| DELETE | /api/v1/config/instance-logo/{logoType} | Delete instance logo |\n| GET | /api/v1/custom-pages/homepage/instance | Get instance custom homepage |\n| PUT | /api/v1/custom-pages/homepage/instance | Set instance custom homepage |\n| POST | /api/v1/jobs/pause | Pause job queue |\n| POST | /api/v1/jobs/resume | Resume job queue |\n| GET | /api/v1/jobs/{state} | List instance jobs |\n| GET | /api/v1/server/followers | List instances following the server |\n| DELETE | /api/v1/server/followers/{handle} | Remove or reject a follower to your server |\n| POST | /api/v1/server/followers/{handle}/reject | Reject a pending follower to your server |\n| POST | /api/v1/server/followers/{handle}/accept | Accept a pending follower to your server |\n| GET | /api/v1/server/following | List instances followed by the server |\n| POST | /api/v1/server/following | Follow a list of actors (PeerTube instance, channel or account) |\n| DELETE | /api/v1/server/following/{hostOrHandle} | Unfollow an actor (PeerTube instance, channel or account) |\n| POST | /api/v1/users | Create a user |\n| GET | /api/v1/users | List users |\n| DELETE | /api/v1/users/{id} | Delete a user |\n| GET | /api/v1/users/{id} | Get a user |\n| PUT | /api/v1/users/{id} | Update a user |\n| POST | /api/v1/users/{id}/block | Block a user |\n| POST | /api/v1/users/{id}/unblock | Unblock a user |\n| GET | /api/v1/oauth-clients/local | Login prerequisite |\n| POST | /api/v1/users/token | Login |\n| POST | /api/v1/users/revoke-token | Logout |\n| GET | /api/v1/users/{id}/token-sessions | List token sessions |\n| GET | /api/v1/users/{id}/token-sessions/{tokenSessionId}/revoke | List token sessions |\n| POST | /api/v1/users/ask-send-verify-email | Resend user verification link |\n| POST | /api/v1/users/registrations/ask-send-verify-email | Resend verification link to registration request email |\n| POST | /api/v1/users/{id}/verify-email | Verify a user |\n| POST | /api/v1/users/registrations/{registrationId}/verify-email | Verify a registration email |\n| POST | /api/v1/users/ask-reset-password | Ask to reset password |\n| POST | /api/v1/users/{id}/reset-password | Reset password |\n| POST | /api/v1/users/{id}/two-factor/request | Request two factor auth |\n| POST | /api/v1/users/{id}/two-factor/confirm-request | Confirm two factor auth |\n| POST | /api/v1/users/{id}/two-factor/disable | Disable two factor auth |\n| POST | /api/v1/users/{userId}/imports/import-resumable | Initialize the resumable user import |\n| PUT | /api/v1/users/{userId}/imports/import-resumable | Send chunk for the resumable user import |\n| DELETE | /api/v1/users/{userId}/imports/import-resumable | Cancel the resumable user import |\n| GET | /api/v1/users/{userId}/imports/latest | Get latest user import |\n| POST | /api/v1/users/{userId}/exports/request | Request user export |\n| GET | /api/v1/users/{userId}/exports | List user exports |\n| DELETE | /api/v1/users/{userId}/exports/{id} | Delete a user export |\n| GET | /api/v1/users/me | Get my user information |\n| PUT | /api/v1/users/me | Update my user information |\n| DELETE | /api/v1/users/me | Delete my account |\n| GET | /api/v1/users/me/videos/comments | List comments on user's videos |\n| GET | /api/v1/users/me/videos/imports | Get video imports of my user |\n| GET | /api/v1/users/me/video-quota-used | Get my user used quota |\n| GET | /api/v1/users/me/videos/{videoId}/rating | Get rate of my user for a video |\n| GET | /api/v1/users/me/videos | List videos of my user |\n| GET | /api/v1/users/me/subscriptions | List my user subscriptions |\n| POST | /api/v1/users/me/subscriptions | Add subscription to my user |\n| GET | /api/v1/users/me/subscriptions/exist | Get if subscriptions exist for my user |\n| GET | /api/v1/users/me/subscriptions/videos | List videos of subscriptions of my user |\n| GET | /api/v1/users/me/subscriptions/{subscriptionHandle} | Get subscription of my user |\n| DELETE | /api/v1/users/me/subscriptions/{subscriptionHandle} | Delete subscription of my user |\n| GET | /api/v1/users/me/notifications | List my notifications |\n| POST | /api/v1/users/me/notifications/read | Mark notifications as read by their id |\n| POST | /api/v1/users/me/notifications/read-all | Mark all my notification as read |\n| PUT | /api/v1/users/me/notification-settings | Update my notification settings |\n| POST | /api/v1/users/me/new-feature-info/read | Mark feature info as read |\n| GET | /api/v1/users/me/history/videos | List watched videos history |\n| DELETE | /api/v1/users/me/history/videos/{videoId} | Delete history element |\n| POST | /api/v1/users/me/history/videos/remove | Clear video history |\n| POST | /api/v1/users/me/avatar/pick | Update my user avatar |\n| DELETE | /api/v1/users/me/avatar | Delete my avatar |\n| POST | /api/v1/users/register | Register a user |\n| POST | /api/v1/users/registrations/request | Request registration |\n| POST | /api/v1/users/registrations/{registrationId}/accept | Accept registration |\n| POST | /api/v1/users/registrations/{registrationId}/reject | Reject registration |\n| DELETE | /api/v1/users/registrations/{registrationId} | Delete registration |\n| GET | /api/v1/users/registrations | List registrations |\n| GET | /api/v1/videos/ownership | List video ownership changes |\n| POST | /api/v1/videos/ownership/{id}/accept | Accept ownership change request |\n| POST | /api/v1/videos/ownership/{id}/refuse | Refuse ownership change request |\n| DELETE | /api/v1/videos/ownership/{id} | Delete ownership change request |\n| GET | /api/v1/videos/{id}/ownership | List ownership change requests for a video |\n| POST | /api/v1/videos/{id}/give-ownership | Request ownership change |\n| POST | /api/v1/videos/{id}/token | Request video token |\n| POST | /api/v1/videos/{id}/studio/edit | Create a studio task |\n| GET | /api/v1/videos | List videos |\n| GET | /api/v1/videos/categories | List available video categories |\n| GET | /api/v1/videos/licences | List available video licences |\n| GET | /api/v1/videos/languages | List available video languages |\n| GET | /api/v1/videos/privacies | List available video privacy policies |\n| PUT | /api/v1/videos/{id} | Update a video |\n| GET | /api/v1/videos/{id} | Get a video |\n| DELETE | /api/v1/videos/{id} | Delete a video |\n| GET | /api/v1/videos/{id}/description | Get complete video description |\n| POST | /api/v1/videos/{id}/views | Notify user is watching a video |\n| GET | /api/v1/videos/{id}/stats/overall | Get overall stats of a video |\n| GET | /api/v1/videos/{id}/stats/user-agent | Get user agent stats of a video |\n| GET | /api/v1/videos/{id}/stats/retention | Get retention stats of a video |\n| GET | /api/v1/videos/{id}/stats/timeseries/{metric} | Get timeserie stats of a video |\n| POST | /api/v1/videos/upload | Upload a video |\n| POST | /api/v1/videos/upload-resumable | Initialize the resumable upload of a video |\n| PUT | /api/v1/videos/upload-resumable | Send chunk for the resumable upload of a video |\n| DELETE | /api/v1/videos/upload-resumable | Cancel the resumable upload of a video, deleting any data uploaded so far |\n| POST | /api/v1/videos/imports | Import a video |\n| POST | /api/v1/videos/imports/{id}/cancel | Cancel video import |\n| POST | /api/v1/videos/imports/{id}/retry | Retry video import |\n| DELETE | /api/v1/videos/imports/{id} | Delete video import |\n| POST | /api/v1/videos/live | Create a live |\n| GET | /api/v1/videos/live/{id} | Get information about a live |\n| PUT | /api/v1/videos/live/{id} | Update information about a live |\n| GET | /api/v1/videos/live/{id}/sessions | List live sessions |\n| GET | /api/v1/videos/{id}/live-session | Get live session of a replay |\n| GET | /api/v1/videos/{id}/source | Get video source file metadata |\n| DELETE | /api/v1/videos/{id}/source/file | Delete video source file |\n| POST | /api/v1/videos/{id}/source/replace-resumable | Initialize the resumable replacement of a video |\n| PUT | /api/v1/videos/{id}/source/replace-resumable | Send chunk for the resumable replacement of a video |\n| DELETE | /api/v1/videos/{id}/source/replace-resumable | Cancel the resumable replacement of a video |\n| GET | /api/v1/users/me/abuses | List my abuses |\n| GET | /api/v1/abuses | List abuses |\n| POST | /api/v1/abuses | Report an abuse |\n| PUT | /api/v1/abuses/{abuseId} | Update an abuse |\n| DELETE | /api/v1/abuses/{abuseId} | Delete an abuse |\n| GET | /api/v1/abuses/{abuseId}/messages | List messages of an abuse |\n| POST | /api/v1/abuses/{abuseId}/messages | Add message to an abuse |\n| DELETE | /api/v1/abuses/{abuseId}/messages/{abuseMessageId} | Delete an abuse message |\n| POST | /api/v1/videos/{id}/blacklist | Block a video |\n| DELETE | /api/v1/videos/{id}/blacklist | Unblock a video by its id |\n| GET | /api/v1/videos/blacklist | List video blocks |\n| GET | /api/v1/videos/{id}/storyboards | List storyboards of a video |\n| GET | /api/v1/videos/{id}/captions | List captions of a video |\n| POST | /api/v1/videos/{id}/captions/generate | Generate a video caption |\n| PUT | /api/v1/videos/{id}/captions/{captionLanguage} | Add or replace a video caption |\n| DELETE | /api/v1/videos/{id}/captions/{captionLanguage} | Delete a video caption |\n| GET | /api/v1/videos/{id}/chapters | Get chapters of a video |\n| PUT | /api/v1/videos/{id}/chapters | Replace video chapters |\n| GET | /api/v1/videos/{id}/embed-privacy | Get video embed privacy |\n| PUT | /api/v1/videos/{id}/embed-privacy | Update video embed privacy |\n| GET | /api/v1/videos/{id}/embed-privacy/allowed | Check if embed is allowed |\n| GET | /api/v1/videos/{id}/passwords | List video passwords |\n| PUT | /api/v1/videos/{id}/passwords | Update video passwords |\n| POST | /api/v1/videos/{id}/passwords | Add a video password |\n| DELETE | /api/v1/videos/{id}/passwords/{videoPasswordId} | Delete a video password |\n| GET | /api/v1/video-channels | List video channels |\n| POST | /api/v1/video-channels | Create a video channel |\n| GET | /api/v1/video-channels/{channelHandle} | Get a video channel |\n| PUT | /api/v1/video-channels/{channelHandle} | Update a video channel |\n| DELETE | /api/v1/video-channels/{channelHandle} | Delete a video channel |\n| GET | /api/v1/video-channels/{channelHandle}/videos | List videos of a video channel |\n| GET | /api/v1/video-channels/{channelHandle}/activities | List activities of a video channel |\n| GET | /api/v1/video-channels/{channelHandle}/video-playlists | List playlists of a channel |\n| POST | /api/v1/video-channels/{channelHandle}/video-playlists/reorder | Reorder channel playlists |\n| GET | /api/v1/video-channels/{channelHandle}/followers | List followers of a video channel |\n| POST | /api/v1/video-channels/{channelHandle}/avatar/pick | Update channel avatar |\n| DELETE | /api/v1/video-channels/{channelHandle}/avatar | Delete channel avatar |\n| POST | /api/v1/video-channels/{channelHandle}/banner/pick | Update channel banner |\n| DELETE | /api/v1/video-channels/{channelHandle}/banner | Delete channel banner |\n| POST | /api/v1/video-channels/{channelHandle}/import-videos | Import videos in channel |\n| POST | /api/v1/video-channel-syncs | Create a synchronization for a video channel |\n| DELETE | /api/v1/video-channel-syncs/{channelSyncId} | Delete a video channel synchronization |\n| POST | /api/v1/video-channel-syncs/{channelSyncId}/sync | Triggers the channel synchronization job, fetching all the videos from the remote channel |\n| GET | /api/v1/player-settings/videos/{id} | Get video player settings |\n| PUT | /api/v1/player-settings/videos/{id} | Update video player settings |\n| GET | /api/v1/player-settings/video-channels/{channelHandle} | Get channel player settings |\n| PUT | /api/v1/player-settings/video-channels/{channelHandle} | Update channel player settings |\n| GET | /api/v1/video-playlists/privacies | List available playlist privacy policies |\n| GET | /api/v1/video-playlists | List video playlists |\n| POST | /api/v1/video-playlists | Create a video playlist |\n| GET | /api/v1/video-playlists/{playlistId} | Get a video playlist |\n| PUT | /api/v1/video-playlists/{playlistId} | Update a video playlist |\n| DELETE | /api/v1/video-playlists/{playlistId} | Delete a video playlist |\n| GET | /api/v1/video-playlists/{playlistId}/videos | List videos of a playlist |\n| POST | /api/v1/video-playlists/{playlistId}/videos | Add a video in a playlist |\n| POST | /api/v1/video-playlists/{playlistId}/videos/reorder | Reorder playlist elements |\n| PUT | /api/v1/video-playlists/{playlistId}/videos/{playlistElementId} | Update a playlist element |\n| DELETE | /api/v1/video-playlists/{playlistId}/videos/{playlistElementId} | Delete an element from a playlist |\n| GET | /api/v1/users/me/video-playlists/videos-exist | Check video exists in my playlists |\n| GET | /api/v1/accounts/{name}/video-playlists | List playlists of an account |\n| GET | /api/v1/accounts/{name}/video-channels | List video channels of an account |\n| GET | /api/v1/accounts/{name}/video-channel-syncs | List the synchronizations of video channels of an account |\n| GET | /api/v1/accounts/{name}/ratings | List ratings of an account |\n| GET | /api/v1/videos/{id}/comment-threads | List threads of a video |\n| POST | /api/v1/videos/{id}/comment-threads | Create a thread |\n| GET | /api/v1/videos/{id}/comment-threads/{threadId} | Get a thread |\n| GET | /api/v1/videos/comments | List instance comments |\n| POST | /api/v1/videos/{id}/comments/{commentId} | Reply to a thread of a video |\n| DELETE | /api/v1/videos/{id}/comments/{commentId} | Delete a comment or a reply |\n| POST | /api/v1/videos/{id}/comments/{commentId}/approve | Approve a comment |\n| PUT | /api/v1/videos/{id}/rate | Like/dislike a video |\n| DELETE | /api/v1/videos/{id}/hls | Delete video HLS files |\n| DELETE | /api/v1/videos/{id}/web-videos | Delete video Web Video files |\n| POST | /api/v1/videos/{id}/transcoding | Create a transcoding job |\n| GET | /api/v1/search/videos | Search videos |\n| GET | /api/v1/search/video-channels | Search channels |\n| GET | /api/v1/search/video-playlists | Search playlists |\n| GET | /api/v1/blocklist/status | Get block status of accounts/hosts |\n| GET | /api/v1/users/me/blocklist/accounts | List accounts blocked by my account |\n| POST | /api/v1/users/me/blocklist/accounts | Block an account by my account |\n| DELETE | /api/v1/users/me/blocklist/accounts/{accountName} | Unblock an account by my account |\n| GET | /api/v1/users/me/blocklist/servers | List servers blocked by my account |\n| POST | /api/v1/users/me/blocklist/servers | Block a server by my account |\n| DELETE | /api/v1/users/me/blocklist/servers/{host} | Unblock a server by my account |\n| GET | /api/v1/server/blocklist/accounts | List blocked accounts by server |\n| POST | /api/v1/server/blocklist/accounts | Block an account by server |\n| DELETE | /api/v1/server/blocklist/accounts/{accountName} | Unblock an account by server |\n| GET | /api/v1/server/blocklist/servers | List blocked servers by server |\n| POST | /api/v1/server/blocklist/servers | Block a server by server |\n| DELETE | /api/v1/server/blocklist/servers/{host} | Unblock a server by server |\n| PUT | /api/v1/server/redundancy/{host} | Update a server redundancy policy |\n| GET | /api/v1/server/redundancy/videos | List videos being mirrored |\n| POST | /api/v1/server/redundancy/videos | Mirror a video |\n| DELETE | /api/v1/server/redundancy/videos/{redundancyId} | Delete a mirror done on a video |\n| GET | /api/v1/server/stats | Get instance stats |\n| POST | /api/v1/server/logs/client | Send client log |\n| GET | /api/v1/server/logs | Get instance logs |\n| GET | /api/v1/server/audit-logs | Get instance audit logs |\n| GET | /api/v1/plugins | List plugins |\n| GET | /api/v1/plugins/available | List available plugins |\n| POST | /api/v1/plugins/install | Install a plugin |\n| POST | /api/v1/plugins/update | Update a plugin |\n| POST | /api/v1/plugins/uninstall | Uninstall a plugin |\n| GET | /api/v1/plugins/{npmName} | Get a plugin |\n| PUT | /api/v1/plugins/{npmName}/settings | Set a plugin's settings |\n| GET | /api/v1/plugins/{npmName}/public-settings | Get a plugin's public settings |\n| GET | /api/v1/plugins/{npmName}/registered-settings | Get a plugin's registered settings |\n| POST | /api/v1/metrics/playback | Create playback metrics |\n| POST | /api/v1/runners/registration-tokens/generate | Generate registration token |\n| DELETE | /api/v1/runners/registration-tokens/{registrationTokenId} | Remove registration token |\n| GET | /api/v1/runners/registration-tokens | List registration tokens |\n| POST | /api/v1/runners/register | Register a new runner |\n| POST | /api/v1/runners/unregister | Unregister a runner |\n| DELETE | /api/v1/runners/{runnerId} | Delete a runner |\n| GET | /api/v1/runners | List runners |\n| POST | /api/v1/runners/jobs/request | Request a new job |\n| POST | /api/v1/runners/jobs/{jobUUID}/accept | Accept job |\n| POST | /api/v1/runners/jobs/{jobUUID}/abort | Abort job |\n| POST | /api/v1/runners/jobs/{jobUUID}/update | Update job |\n| POST | /api/v1/runners/jobs/{jobUUID}/error | Post job error |\n| POST | /api/v1/runners/jobs/{jobUUID}/success | Post job success |\n| GET | /api/v1/runners/jobs/{jobUUID}/cancel | Cancel a job |\n| DELETE | /api/v1/runners/jobs/{jobUUID} | Delete a job |\n| GET | /api/v1/runners/jobs | List jobs |\n| GET | /api/v1/automatic-tags/policies/accounts/{accountName}/comments | Get account auto tag policies on comments |\n| PUT | /api/v1/automatic-tags/policies/accounts/{accountName}/comments | Update account auto tag policies on comments |\n| GET | /api/v1/automatic-tags/accounts/{accountName}/available | Get account available auto tags |\n| GET | /api/v1/automatic-tags/server/available | Get server available auto tags |\n| GET | /api/v1/watched-words/accounts/{accountName}/lists | List account watched words |\n| POST | /api/v1/watched-words/accounts/{accountName}/lists | Add account watched words |\n| PUT | /api/v1/watched-words/accounts/{accountName}/lists/{listId} | Update account watched words |\n| DELETE | /api/v1/watched-words/accounts/{accountName}/lists/{listId} | Delete account watched words |\n| GET | /api/v1/watched-words/server/lists | List server watched words |\n| POST | /api/v1/watched-words/server/lists | Add server watched words |\n| PUT | /api/v1/watched-words/server/lists/{listId} | Update server watched words |\n| DELETE | /api/v1/watched-words/server/lists/{listId} | Delete server watched words |\n| POST | /api/v1/client-config/update-language | Update client language |\n| GET | /api/v1/video-channels/{channelHandle}/collaborators | *List channel collaborators |\n| POST | /api/v1/video-channels/{channelHandle}/collaborators/invite | Invite a collaborator |\n| POST | /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/accept | Accept a collaboration invitation |\n| POST | /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/reject | Reject a collaboration invitation |\n| DELETE | /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId} | Remove a channel collaborator |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"Get web-video details?\" -> GET /static/web-videos/{filename}\n- \"Get private details?\" -> GET /static/web-videos/private/{filename}\n- \"Get hl details?\" -> GET /static/streaming-playlists/hls/{filename}\n- \"Get generate details?\" -> GET /download/videos/generate/{videoId}\n- \"Get video-comments.{format} details?\" -> GET /feeds/video-comments.{format}\n- \"Get videos.{format} details?\" -> GET /feeds/videos.{format}\n- \"Get subscriptions.{format} details?\" -> GET /feeds/subscriptions.{format}\n- \"List all videos.xml?\" -> GET /feeds/podcast/videos.xml\n- \"Get account details?\" -> GET /api/v1/accounts/{name}\n- \"Search videos?\" -> GET /api/v1/accounts/{name}/videos\n- \"Search followers?\" -> GET /api/v1/accounts/{name}/followers\n- \"List all accounts?\" -> GET /api/v1/accounts\n- \"List all config?\" -> GET /api/v1/config\n- \"List all about?\" -> GET /api/v1/config/about\n- \"List all custom?\" -> GET /api/v1/config/custom\n- \"Create a pick?\" -> POST /api/v1/config/instance-banner/pick\n- \"Delete a instance-logo?\" -> DELETE /api/v1/config/instance-logo/{logoType}\n- \"List all instance?\" -> GET /api/v1/custom-pages/homepage/instance\n- \"Create a pause?\" -> POST /api/v1/jobs/pause\n- \"Create a resume?\" -> POST /api/v1/jobs/resume\n- \"Get job details?\" -> GET /api/v1/jobs/{state}\n- \"List all followers?\" -> GET /api/v1/server/followers\n- \"Delete a follower?\" -> DELETE /api/v1/server/followers/{handle}\n- \"Create a reject?\" -> POST /api/v1/server/followers/{handle}/reject\n- \"Create a accept?\" -> POST /api/v1/server/followers/{handle}/accept\n- \"List all following?\" -> GET /api/v1/server/following\n- \"Create a following?\" -> POST /api/v1/server/following\n- \"Delete a following?\" -> DELETE /api/v1/server/following/{hostOrHandle}\n- \"Create a user?\" -> POST /api/v1/users\n- \"Search users?\" -> GET /api/v1/users\n- \"Delete a user?\" -> DELETE /api/v1/users/{id}\n- \"Get user details?\" -> GET /api/v1/users/{id}\n- \"Update a user?\" -> PUT /api/v1/users/{id}\n- \"Create a block?\" -> POST /api/v1/users/{id}/block\n- \"Create a unblock?\" -> POST /api/v1/users/{id}/unblock\n- \"List all local?\" -> GET /api/v1/oauth-clients/local\n- \"Create a token?\" -> POST /api/v1/users/token\n- \"Create a revoke-token?\" -> POST /api/v1/users/revoke-token\n- \"List all token-sessions?\" -> GET /api/v1/users/{id}/token-sessions\n- \"List all revoke?\" -> GET /api/v1/users/{id}/token-sessions/{tokenSessionId}/revoke\n- \"Create a ask-send-verify-email?\" -> POST /api/v1/users/ask-send-verify-email\n- \"Create a verify-email?\" -> POST /api/v1/users/{id}/verify-email\n- \"Create a ask-reset-password?\" -> POST /api/v1/users/ask-reset-password\n- \"Create a reset-password?\" -> POST /api/v1/users/{id}/reset-password\n- \"Create a request?\" -> POST /api/v1/users/{id}/two-factor/request\n- \"Create a confirm-request?\" -> POST /api/v1/users/{id}/two-factor/confirm-request\n- \"Create a disable?\" -> POST /api/v1/users/{id}/two-factor/disable\n- \"Create a import-resumable?\" -> POST /api/v1/users/{userId}/imports/import-resumable\n- \"List all latest?\" -> GET /api/v1/users/{userId}/imports/latest\n- \"List all exports?\" -> GET /api/v1/users/{userId}/exports\n- \"Delete a export?\" -> DELETE /api/v1/users/{userId}/exports/{id}\n- \"List all me?\" -> GET /api/v1/users/me\n- \"Search comments?\" -> GET /api/v1/users/me/videos/comments\n- \"Search imports?\" -> GET /api/v1/users/me/videos/imports\n- \"List all video-quota-used?\" -> GET /api/v1/users/me/video-quota-used\n- \"List all rating?\" -> GET /api/v1/users/me/videos/{videoId}/rating\n- \"List all subscriptions?\" -> GET /api/v1/users/me/subscriptions\n- \"Create a subscription?\" -> POST /api/v1/users/me/subscriptions\n- \"List all exist?\" -> GET /api/v1/users/me/subscriptions/exist\n- \"Get subscription details?\" -> GET /api/v1/users/me/subscriptions/{subscriptionHandle}\n- \"Delete a subscription?\" -> DELETE /api/v1/users/me/subscriptions/{subscriptionHandle}\n- \"List all notifications?\" -> GET /api/v1/users/me/notifications\n- \"Create a read?\" -> POST /api/v1/users/me/notifications/read\n- \"Create a read-all?\" -> POST /api/v1/users/me/notifications/read-all\n- \"Delete a video?\" -> DELETE /api/v1/users/me/history/videos/{videoId}\n- \"Create a remove?\" -> POST /api/v1/users/me/history/videos/remove\n- \"Create a register?\" -> POST /api/v1/users/register\n- \"Delete a registration?\" -> DELETE /api/v1/users/registrations/{registrationId}\n- \"Search registrations?\" -> GET /api/v1/users/registrations\n- \"List all ownership?\" -> GET /api/v1/videos/ownership\n- \"Create a refuse?\" -> POST /api/v1/videos/ownership/{id}/refuse\n- \"Delete a ownership?\" -> DELETE /api/v1/videos/ownership/{id}\n- \"Create a give-ownership?\" -> POST /api/v1/videos/{id}/give-ownership\n- \"Create a edit?\" -> POST /api/v1/videos/{id}/studio/edit\n- \"List all categories?\" -> GET /api/v1/videos/categories\n- \"List all licences?\" -> GET /api/v1/videos/licences\n- \"List all languages?\" -> GET /api/v1/videos/languages\n- \"List all privacies?\" -> GET /api/v1/videos/privacies\n- \"Update a video?\" -> PUT /api/v1/videos/{id}\n- \"Get video details?\" -> GET /api/v1/videos/{id}\n- \"List all description?\" -> GET /api/v1/videos/{id}/description\n- \"Create a view?\" -> POST /api/v1/videos/{id}/views\n- \"List all overall?\" -> GET /api/v1/videos/{id}/stats/overall\n- \"List all user-agent?\" -> GET /api/v1/videos/{id}/stats/user-agent\n- \"List all retention?\" -> GET /api/v1/videos/{id}/stats/retention\n- \"Get timesery details?\" -> GET /api/v1/videos/{id}/stats/timeseries/{metric}\n- \"Create a upload?\" -> POST /api/v1/videos/upload\n- \"Create a upload-resumable?\" -> POST /api/v1/videos/upload-resumable\n- \"Create a import?\" -> POST /api/v1/videos/imports\n- \"Create a cancel?\" -> POST /api/v1/videos/imports/{id}/cancel\n- \"Create a retry?\" -> POST /api/v1/videos/imports/{id}/retry\n- \"Delete a import?\" -> DELETE /api/v1/videos/imports/{id}\n- \"Create a live?\" -> POST /api/v1/videos/live\n- \"Get live details?\" -> GET /api/v1/videos/live/{id}\n- \"Update a live?\" -> PUT /api/v1/videos/live/{id}\n- \"List all sessions?\" -> GET /api/v1/videos/live/{id}/sessions\n- \"List all live-session?\" -> GET /api/v1/videos/{id}/live-session\n- \"List all source?\" -> GET /api/v1/videos/{id}/source\n- \"Create a replace-resumable?\" -> POST /api/v1/videos/{id}/source/replace-resumable\n- \"List all abuses?\" -> GET /api/v1/users/me/abuses\n- \"Search abuses?\" -> GET /api/v1/abuses\n- \"Create a abuse?\" -> POST /api/v1/abuses\n- \"Update a abuse?\" -> PUT /api/v1/abuses/{abuseId}\n- \"Delete a abuse?\" -> DELETE /api/v1/abuses/{abuseId}\n- \"List all messages?\" -> GET /api/v1/abuses/{abuseId}/messages\n- \"Create a message?\" -> POST /api/v1/abuses/{abuseId}/messages\n- \"Delete a message?\" -> DELETE /api/v1/abuses/{abuseId}/messages/{abuseMessageId}\n- \"Create a blacklist?\" -> POST /api/v1/videos/{id}/blacklist\n- \"Search blacklist?\" -> GET /api/v1/videos/blacklist\n- \"List all storyboards?\" -> GET /api/v1/videos/{id}/storyboards\n- \"List all captions?\" -> GET /api/v1/videos/{id}/captions\n- \"Create a generate?\" -> POST /api/v1/videos/{id}/captions/generate\n- \"Update a caption?\" -> PUT /api/v1/videos/{id}/captions/{captionLanguage}\n- \"Delete a caption?\" -> DELETE /api/v1/videos/{id}/captions/{captionLanguage}\n- \"List all chapters?\" -> GET /api/v1/videos/{id}/chapters\n- \"List all embed-privacy?\" -> GET /api/v1/videos/{id}/embed-privacy\n- \"List all allowed?\" -> GET /api/v1/videos/{id}/embed-privacy/allowed\n- \"List all passwords?\" -> GET /api/v1/videos/{id}/passwords\n- \"Create a password?\" -> POST /api/v1/videos/{id}/passwords\n- \"Delete a password?\" -> DELETE /api/v1/videos/{id}/passwords/{videoPasswordId}\n- \"List all video-channels?\" -> GET /api/v1/video-channels\n- \"Create a video-channel?\" -> POST /api/v1/video-channels\n- \"Get video-channel details?\" -> GET /api/v1/video-channels/{channelHandle}\n- \"Update a video-channel?\" -> PUT /api/v1/video-channels/{channelHandle}\n- \"Delete a video-channel?\" -> DELETE /api/v1/video-channels/{channelHandle}\n- \"List all activities?\" -> GET /api/v1/video-channels/{channelHandle}/activities\n- \"List all video-playlists?\" -> GET /api/v1/video-channels/{channelHandle}/video-playlists\n- \"Create a reorder?\" -> POST /api/v1/video-channels/{channelHandle}/video-playlists/reorder\n- \"Create a import-video?\" -> POST /api/v1/video-channels/{channelHandle}/import-videos\n- \"Create a video-channel-sync?\" -> POST /api/v1/video-channel-syncs\n- \"Delete a video-channel-sync?\" -> DELETE /api/v1/video-channel-syncs/{channelSyncId}\n- \"Create a sync?\" -> POST /api/v1/video-channel-syncs/{channelSyncId}/sync\n- \"Create a video-playlist?\" -> POST /api/v1/video-playlists\n- \"Get video-playlist details?\" -> GET /api/v1/video-playlists/{playlistId}\n- \"Update a video-playlist?\" -> PUT /api/v1/video-playlists/{playlistId}\n- \"Delete a video-playlist?\" -> DELETE /api/v1/video-playlists/{playlistId}\n- \"List all videos?\" -> GET /api/v1/video-playlists/{playlistId}/videos\n- \"Create a video?\" -> POST /api/v1/video-playlists/{playlistId}/videos\n- \"List all videos-exist?\" -> GET /api/v1/users/me/video-playlists/videos-exist\n- \"Search video-playlists?\" -> GET /api/v1/accounts/{name}/video-playlists\n- \"Search video-channels?\" -> GET /api/v1/accounts/{name}/video-channels\n- \"List all video-channel-syncs?\" -> GET /api/v1/accounts/{name}/video-channel-syncs\n- \"List all ratings?\" -> GET /api/v1/accounts/{name}/ratings\n- \"List all comment-threads?\" -> GET /api/v1/videos/{id}/comment-threads\n- \"Create a comment-thread?\" -> POST /api/v1/videos/{id}/comment-threads\n- \"Get comment-thread details?\" -> GET /api/v1/videos/{id}/comment-threads/{threadId}\n- \"Delete a comment?\" -> DELETE /api/v1/videos/{id}/comments/{commentId}\n- \"Create a approve?\" -> POST /api/v1/videos/{id}/comments/{commentId}/approve\n- \"Create a transcoding?\" -> POST /api/v1/videos/{id}/transcoding\n- \"List all status?\" -> GET /api/v1/blocklist/status\n- \"Search accounts?\" -> GET /api/v1/users/me/blocklist/accounts\n- \"Create a account?\" -> POST /api/v1/users/me/blocklist/accounts\n- \"Delete a account?\" -> DELETE /api/v1/users/me/blocklist/accounts/{accountName}\n- \"Search servers?\" -> GET /api/v1/users/me/blocklist/servers\n- \"Create a server?\" -> POST /api/v1/users/me/blocklist/servers\n- \"Delete a server?\" -> DELETE /api/v1/users/me/blocklist/servers/{host}\n- \"List all servers?\" -> GET /api/v1/server/blocklist/servers\n- \"Update a redundancy?\" -> PUT /api/v1/server/redundancy/{host}\n- \"List all stats?\" -> GET /api/v1/server/stats\n- \"Create a client?\" -> POST /api/v1/server/logs/client\n- \"List all logs?\" -> GET /api/v1/server/logs\n- \"List all audit-logs?\" -> GET /api/v1/server/audit-logs\n- \"List all plugins?\" -> GET /api/v1/plugins\n- \"Search available?\" -> GET /api/v1/plugins/available\n- \"Create a install?\" -> POST /api/v1/plugins/install\n- \"Create a update?\" -> POST /api/v1/plugins/update\n- \"Create a uninstall?\" -> POST /api/v1/plugins/uninstall\n- \"Get plugin details?\" -> GET /api/v1/plugins/{npmName}\n- \"List all public-settings?\" -> GET /api/v1/plugins/{npmName}/public-settings\n- \"List all registered-settings?\" -> GET /api/v1/plugins/{npmName}/registered-settings\n- \"Create a playback?\" -> POST /api/v1/metrics/playback\n- \"Delete a registration-token?\" -> DELETE /api/v1/runners/registration-tokens/{registrationTokenId}\n- \"List all registration-tokens?\" -> GET /api/v1/runners/registration-tokens\n- \"Create a unregister?\" -> POST /api/v1/runners/unregister\n- \"Delete a runner?\" -> DELETE /api/v1/runners/{runnerId}\n- \"List all runners?\" -> GET /api/v1/runners\n- \"Create a abort?\" -> POST /api/v1/runners/jobs/{jobUUID}/abort\n- \"Create a error?\" -> POST /api/v1/runners/jobs/{jobUUID}/error\n- \"Create a success?\" -> POST /api/v1/runners/jobs/{jobUUID}/success\n- \"List all cancel?\" -> GET /api/v1/runners/jobs/{jobUUID}/cancel\n- \"Delete a job?\" -> DELETE /api/v1/runners/jobs/{jobUUID}\n- \"Search jobs?\" -> GET /api/v1/runners/jobs\n- \"List all comments?\" -> GET /api/v1/automatic-tags/policies/accounts/{accountName}/comments\n- \"List all available?\" -> GET /api/v1/automatic-tags/accounts/{accountName}/available\n- \"List all lists?\" -> GET /api/v1/watched-words/accounts/{accountName}/lists\n- \"Create a list?\" -> POST /api/v1/watched-words/accounts/{accountName}/lists\n- \"Update a list?\" -> PUT /api/v1/watched-words/accounts/{accountName}/lists/{listId}\n- \"Delete a list?\" -> DELETE /api/v1/watched-words/accounts/{accountName}/lists/{listId}\n- \"Create a update-language?\" -> POST /api/v1/client-config/update-language\n- \"List all collaborators?\" -> GET /api/v1/video-channels/{channelHandle}/collaborators\n- \"Create a invite?\" -> POST /api/v1/video-channels/{channelHandle}/collaborators/invite\n- \"Delete a collaborator?\" -> DELETE /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api PeerTube\n@base https://peertube2.cpy.re\n@version 8.1.0\n@auth OAuth2\n@endpoints 274\n@hint download_for_search\n@toc static(4), download(1), feeds(4), api(265)\n\n@group static\n@endpoint GET /static/web-videos/{filename}\n@desc Get public Web Video file\n@required {filename: str # Filename}\n@returns(200) successful operation\n@errors {404: not found}\n\n@endpoint GET /static/web-videos/private/{filename}\n@desc Get private Web Video file\n@required {filename: str # Filename}\n@optional {videoFileToken: str # Video file token [generated](#operation/requestVideoToken) by PeerTube so you don't need to provide an OAuth token in the request header.}\n@returns(200) successful operation\n@errors {403: invalid auth, 404: not found}\n\n@endpoint GET /static/streaming-playlists/hls/{filename}\n@desc Get public HLS video file\n@required {filename: str # Filename}\n@returns(200) successful operation\n@errors {403: invalid auth, 404: not found}\n\n@endpoint GET /static/streaming-playlists/hls/private/{filename}\n@desc Get private HLS video file\n@required {filename: str # Filename}\n@optional {videoFileToken: str # Video file token [generated](#operation/requestVideoToken) by PeerTube so you don't need to provide an OAuth token in the request header., reinjectVideoFileToken: bool # Ask the server to reinject videoFileToken in URLs in m3u8 playlist}\n@returns(200) successful operation\n@errors {403: invalid auth, 404: not found}\n\n@endgroup\n\n@group download\n@endpoint GET /download/videos/generate/{videoId}\n@desc Download video file\n@required {videoId: any # The video id, videoFileIds: [int] # streams of video files to mux in the output}\n@optional {videoFileToken: str # Video file token [generated](#operation/requestVideoToken) by PeerTube so you don't need to provide an OAuth token in the request header.}\n@returns(200) successful operation\n\n@endgroup\n\n@group feeds\n@endpoint GET /feeds/video-comments.{format}\n@desc Comments on videos feeds\n@required {format: str(xml/rss/rss2/atom/atom1/json/json1) # format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/media-rss))}\n@optional {videoId: str # limit listing comments to a specific video, accountId: str # limit listing comments to videos of a specific account, accountName: str # limit listing comments to videos of a specific account, videoChannelId: str # limit listing comments to videos of a specific video channel, videoChannelName: str # limit listing comments to videos of a specific video channel}\n@returns(200) successful operation\n@errors {400: Arises when:   - videoId filter is mixed with a channel filter, 404: video, video channel or account not found, 406: accept header unsupported}\n\n@endpoint GET /feeds/videos.{format}\n@desc Common videos feeds\n@required {format: str(xml/rss/rss2/atom/atom1/json/json1) # format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/media-rss))}\n@optional {accountId: str # limit listing to a specific account, accountName: str # limit listing to a specific account, videoChannelId: str # limit listing to a specific video channel, videoChannelName: str # limit listing to a specific video channel, sort: str # Sort column, nsfw: str(true/false) # whether to include nsfw videos, if any, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files}\n@returns(200) successful operation\n@errors {404: video channel or account not found, 406: accept header unsupported}\n\n@endpoint GET /feeds/subscriptions.{format}\n@desc Videos of subscriptions feeds\n@required {format: str(xml/rss/rss2/atom/atom1/json/json1) # format expected (we focus on making `rss` the most feature-rich ; it serves [Media RSS](https://www.rssboard.org/media-rss)), accountId: str # limit listing to a specific account, token: str # private token allowing access}\n@optional {sort: str # Sort column, nsfw: str(true/false) # whether to include nsfw videos, if any, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files}\n@returns(200) successful operation\n@errors {406: accept header unsupported}\n\n@endpoint GET /feeds/podcast/videos.xml\n@desc Videos podcast feed\n@required {videoChannelId: str # Limit listing to a specific video channel}\n@returns(200) successful operation\n@errors {404: video channel not found}\n\n@endgroup\n\n@group api\n@endpoint GET /api/v1/accounts/{name}\n@desc Get an account\n@required {name: str # The username or handle of the account}\n@returns(200) successful operation\n@errors {404: account not found}\n\n@endpoint GET /api/v1/accounts/{name}/videos\n@desc List videos of an account\n@required {name: str # The username or handle of the account}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/accounts/{name}/followers\n@desc List followers of an account\n@required {name: str # The username or handle of the account}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort followers by criteria, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/accounts\n@desc List accounts\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/config\n@desc Get instance public configuration\n@returns(200) {instance: map{name: str, shortDescription: str, defaultClientRoute: str, isNSFW: bool, defaultNSFWPolicy: str, serverCountry: str, defaultLanguage: str, support: map{text: str}, social: map{externalLink: str, mastodonLink: str, blueskyLink: str, xLink: str}, customizations: map{javascript: str, css: str}, avatars: [any], banners: [any]}, search: map{remoteUri: map{users: bool, anonymous: bool}}, plugin: map{registered: [str]}, theme: map{registered: [str]}, email: map{enabled: bool}, contactForm: map{enabled: bool}, serverVersion: str, serverCommit: str, signup: map{allowed: bool, allowedForCurrentIP: bool, requiresEmailVerification: bool}, transcoding: map{hls: map{enabled: bool}, web_videos: map{enabled: bool}, enabledResolutions: [int]}, import: map{videos: map{http: map{enabled: bool}, torrent: map{enabled: bool}}, videoChannelSynchronization: map{enabled: bool}, users: map{enabled: bool}}, export: map{users: map{enabled: bool, exportExpiration: num, maxUserVideoQuota: num}}, autoBlacklist: map{videos: map{ofUsers: map{enabled: bool}}}, avatar: map{file: map{size: map{max: int}}, extensions: [str]}, video: map{image: map{extensions: [str], size: map{max: int}}, file: map{extensions: [str]}}, videoCaption: map{file: map{size: map{max: int}, extensions: [str]}}, user: map{videoQuota: int, videoQuotaDaily: int}, trending: map{videos: map{intervalDays: int}}, tracker: map{enabled: bool}, followings: map{instance: map{autoFollowIndex: map{indexUrl: str(url)}}}, federation: map{enabled: bool}, homepage: map{enabled: bool}, openTelemetry: map{metrics: map{enabled: bool, playbackStatsInterval: num}}, views: map{views: map{watchingInterval: map{anonymous: num, users: num}}}} # successful operation\n\n@endpoint GET /api/v1/config/about\n@desc Get instance \"About\" information\n@returns(200) {instance: map{name: str, shortDescription: str, description: str, terms: str, codeOfConduct: str, hardwareInformation: str, creationReason: str, moderationInformation: str, administrator: str, maintenanceLifetime: str, businessModel: str, languages: [str], categories: [int], avatars: [any], banners: [any]}} # successful operation\n\n@endpoint GET /api/v1/config/custom\n@desc Get instance runtime configuration\n@returns(200) {instance: map{name: str, shortDescription: str, description: str, terms: str, codeOfConduct: str, creationReason: str, moderationInformation: str, administrator: str, maintenanceLifetime: str, businessModel: str, hardwareInformation: str, languages: [str], categories: [num], isNSFW: bool, defaultNSFWPolicy: str, serverCountry: str, support: map{text: str}, social: map{externalLink: str, mastodonLink: str, blueskyLink: str, xLink: str}, defaultClientRoute: str, customizations: map{javascript: str, css: str}}, theme: map{default: str}, services: map{twitter: map{username: str}}, cache: map{previews: map{size: int}, captions: map{size: int}}, signup: map{enabled: bool, limit: int, requiresEmailVerification: bool}, admin: map{email: str(email)}, contactForm: map{enabled: bool}, user: map{videoQuota: int, videoQuotaDaily: int}, transcoding: map{enabled: bool, originalFile: map{keep: bool}, allowAdditionalExtensions: bool, allowAudioFiles: bool, threads: int, concurrency: num, profile: str, resolutions: map{0p: bool, 144p: bool, 240p: bool, 360p: bool, 480p: bool, 720p: bool, 1080p: bool, 1440p: bool, 2160p: bool}, web_videos: map{enabled: bool}, hls: map{enabled: bool, splitAudioAndVideo: bool}}, import: map{videos: map{http: map{enabled: bool}, torrent: map{enabled: bool}}, video_channel_synchronization: map{enabled: bool}}, autoBlacklist: map{videos: map{ofUsers: map{enabled: bool}}}, followers: map{instance: map{enabled: bool, manualApproval: bool}}, storyboard: map{enabled: bool}, defaults: map{publish: map{downloadEnabled: bool, commentsPolicy: int, privacy: int, licence: int}, p2p: map{webapp: map{enabled: bool}, embed: map{enabled: bool}}, player: map{autoPlay: bool}}} # successful operation\n\n@endpoint PUT /api/v1/config/custom\n@desc Set instance runtime configuration\n@returns(200) successful operation\n@errors {400: Arises when:   - the emailer is disabled and the instance is open to registrations   - web videos and hls are disabled with transcoding enabled - you need at least one enabled}\n\n@endpoint DELETE /api/v1/config/custom\n@desc Delete instance runtime configuration\n@returns(200) successful operation\n\n@endpoint POST /api/v1/config/instance-banner/pick\n@desc Update instance banner\n@returns(204) successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/config/instance-banner\n@desc Delete instance banner\n@returns(204) successful operation\n\n@endpoint POST /api/v1/config/instance-avatar/pick\n@desc Update instance avatar\n@returns(204) successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/config/instance-avatar\n@desc Delete instance avatar\n@returns(204) successful operation\n\n@endpoint POST /api/v1/config/instance-logo/{logoType}/pick\n@desc Update instance logo\n@required {logoType: str(favicon/header-wide/header-square/opengraph)}\n@returns(204) successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/config/instance-logo/{logoType}\n@desc Delete instance logo\n@required {logoType: str(favicon/header-wide/header-square/opengraph)}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/custom-pages/homepage/instance\n@desc Get instance custom homepage\n@returns(200) {content: str} # successful operation\n@errors {404: No homepage set}\n\n@endpoint PUT /api/v1/custom-pages/homepage/instance\n@desc Set instance custom homepage\n@optional {content: str # content of the homepage, that will be injected in the client}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/jobs/pause\n@desc Pause job queue\n@returns(204) successful operation\n\n@endpoint POST /api/v1/jobs/resume\n@desc Resume job queue\n@returns(204) successful operation\n\n@endpoint GET /api/v1/jobs/{state}\n@desc List instance jobs\n@required {state: str(/active/completed/failed/waiting/delayed) # The state of the job ('' for for no filter)}\n@optional {jobType: str(activitypub-follow/activitypub-http-broadcast/activitypub-http-fetcher/activitypub-http-unicast/email/video-transcoding/video-file-import/video-import/videos-stats/activitypub-refresher/video-redundancy/video-live-ending/video-channel-import) # job type, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/server/followers\n@desc List instances following the server\n@optional {state: str(pending/accepted), actorType: str(Person/Application/Group/Service/Organization), start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint DELETE /api/v1/server/followers/{handle}\n@desc Remove or reject a follower to your server\n@required {handle: str(email) # The remote actor handle to remove from your followers}\n@returns(204) successful operation\n@errors {404: follower not found}\n\n@endpoint POST /api/v1/server/followers/{handle}/reject\n@desc Reject a pending follower to your server\n@required {handle: str(email) # The remote actor handle to remove from your followers}\n@returns(204) successful operation\n@errors {404: follower not found}\n\n@endpoint POST /api/v1/server/followers/{handle}/accept\n@desc Accept a pending follower to your server\n@required {handle: str(email) # The remote actor handle to remove from your followers}\n@returns(204) successful operation\n@errors {404: follower not found}\n\n@endpoint GET /api/v1/server/following\n@desc List instances followed by the server\n@optional {state: str(pending/accepted), actorType: str(Person/Application/Group/Service/Organization), start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/server/following\n@desc Follow a list of actors (PeerTube instance, channel or account)\n@optional {hosts: [str(hostname)], handles: [str]}\n@returns(204) successful operation\n@errors {500: cannot follow a non-HTTPS server}\n\n@endpoint DELETE /api/v1/server/following/{hostOrHandle}\n@desc Unfollow an actor (PeerTube instance, channel or account)\n@required {hostOrHandle: str # The hostOrHandle to unfollow}\n@returns(204) successful operation\n@errors {404: host or handle not found}\n\n@endpoint POST /api/v1/users\n@desc Create a user\n@required {username: str # immutable name of the user, used to find or mention its actor, password: str(password), email: str(email) # The user email, role: int(0/1/2) # The user role (Admin = `0`, Moderator = `1`, User = `2`)}\n@optional {videoQuota: int # The user video quota in bytes, videoQuotaDaily: int # The user daily video quota in bytes, channelName: str # immutable name of the channel, used to interact with its actor, adminFlags: int(0/1) # Admin flags for the user (None = `0`, Bypass video blocklist = `1`)}\n@returns(200) {user: map{id: int, account: map{id: int}}} # user created\n@errors {403: insufficient authority to create an admin or moderator}\n\n@endpoint GET /api/v1/users\n@desc List users\n@optional {search: str # Plain text search that will match with user usernames or emails, blocked: bool # Filter results down to (un)banned users, role: int # Filter results down to users with a specific role, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(-id/-username/-createdAt) # Sort users by criteria}\n@returns(200) successful operation\n\n@endpoint DELETE /api/v1/users/{id}\n@desc Delete a user\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/{id}\n@desc Get a user\n@optional {withStats: bool # include statistics about the user (only available as a moderator/admin)}\n@returns(200) 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.\n\n@endpoint PUT /api/v1/users/{id}\n@desc Update a user\n@optional {email: any # The updated email of the user, emailVerified: bool # Set the email as verified, videoQuota: int # The updated video quota of the user in bytes, videoQuotaDaily: int # The updated daily video quota of the user in bytes, pluginAuth: str # The auth plugin to use to authenticate the user, role: int(0/1/2) # The user role (Admin = `0`, Moderator = `1`, User = `2`), adminFlags: int(0/1) # Admin flags for the user (None = `0`, Bypass video blocklist = `1`), password: str(password)}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/{id}/block\n@desc Block a user\n@required {id: int # Entity id}\n@optional {reason: str # Optional reason for blocking the user}\n@returns(204) successful operation\n@errors {400: invalid user id, 403: insufficient permissions to block users, 404: user not found}\n\n@endpoint POST /api/v1/users/{id}/unblock\n@desc Unblock a user\n@required {id: int # Entity id}\n@returns(204) successful operation\n@errors {400: invalid user id, 403: insufficient permissions to unblock users, 404: user not found}\n\n@endpoint GET /api/v1/oauth-clients/local\n@desc Login prerequisite\n@returns(200) {client_id: str, client_secret: str} # successful operation\n\n@endpoint POST /api/v1/users/token\n@desc Login\n@optional {x-peertube-otp: str # If the user enabled two factor authentication, you need to provide the OTP code in this header}\n@returns(200) {token_type: str, access_token: str, refresh_token: str, expires_in: int, refresh_token_expires_in: int} # successful operation\n@errors {400: Disambiguate via `code`: - `invalid_client` for an unmatched `client_id` - `invalid_grant` for unmatched credentials, 401: Disambiguate via `code`: - default value for a regular authentication failure - `invalid_token` for an expired token - `missing_two_factor` if two factor header is missing}\n\n@endpoint POST /api/v1/users/revoke-token\n@desc Logout\n@returns(200) successful operation\n\n@endpoint GET /api/v1/users/{id}/token-sessions\n@desc List token sessions\n@required {id: int # Entity id}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/users/{id}/token-sessions/{tokenSessionId}/revoke\n@desc List token sessions\n@required {id: int # Entity id, tokenSessionId: int # Token session Id}\n@returns(200) successful operation\n\n@endpoint POST /api/v1/users/ask-send-verify-email\n@desc Resend user verification link\n@required {email: str # User email}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/registrations/ask-send-verify-email\n@desc Resend verification link to registration request email\n@required {email: str # Registration email}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/{id}/verify-email\n@desc Verify a user\n@required {id: int # Entity id, verificationString: str(url)}\n@optional {isPendingEmail: bool}\n@returns(204) successful operation\n@errors {403: invalid verification string, 404: user not found}\n\n@endpoint POST /api/v1/users/registrations/{registrationId}/verify-email\n@desc Verify a registration email\n@required {registrationId: int # Registration ID, verificationString: str(url)}\n@returns(204) successful operation\n@errors {403: invalid verification string, 404: registration not found}\n\n@endpoint POST /api/v1/users/ask-reset-password\n@desc Ask to reset password\n@required {email: str # User email}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/{id}/reset-password\n@desc Reset password\n@required {id: int # Entity id, verificationString: str(url), password: str}\n@returns(204) successful operation\n@errors {403: invalid verification string, 404: user not found}\n\n@endpoint POST /api/v1/users/{id}/two-factor/request\n@desc Request two factor auth\n@required {id: int # Entity id}\n@optional {currentPassword: str # Password of the currently authenticated user}\n@returns(200) successful operation\n@errors {403: invalid password, 404: user not found}\n\n@endpoint POST /api/v1/users/{id}/two-factor/confirm-request\n@desc Confirm two factor auth\n@required {id: int # Entity id, requestToken: str # Token to identify the two factor request, otpToken: str # OTP token generated by the app}\n@returns(204) successful operation\n@errors {403: invalid request token or OTP token, 404: user not found}\n\n@endpoint POST /api/v1/users/{id}/two-factor/disable\n@desc Disable two factor auth\n@required {id: int # Entity id}\n@optional {currentPassword: str # Password of the currently authenticated user}\n@returns(204) successful operation\n@errors {403: invalid password, 404: user not found}\n\n@endpoint POST /api/v1/users/{userId}/imports/import-resumable\n@desc Initialize the resumable user import\n@required {userId: int # User id, X-Upload-Content-Length: num # Number of bytes that will be uploaded in subsequent requests. Set this value to the size of the file you are uploading., X-Upload-Content-Type: str(mimetype) # MIME type of the file that you are uploading. Depending on your instance settings, acceptable values might vary.}\n@optional {filename: str(filename) # Archive filename including extension}\n@returns(201) created\n\n@endpoint PUT /api/v1/users/{userId}/imports/import-resumable\n@desc Send chunk for the resumable user import\n@required {userId: int # User id, upload_id: str # 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., Content-Range: str # Specifies the bytes in the file that the request is uploading.  For example, a value of `bytes 0-262143/1000000` shows that the request is sending the first 262144 bytes (256 x 1024) in a 2,469,036 byte file., Content-Length: num # Size of the chunk that the request is sending.  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.}\n@returns(204) last chunk received: successful operation\n@errors {308: resume incomplete}\n\n@endpoint DELETE /api/v1/users/{userId}/imports/import-resumable\n@desc Cancel the resumable user import\n@required {userId: int # User id, upload_id: str # 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., Content-Length: num}\n@returns(204) import cancelled\n\n@endpoint GET /api/v1/users/{userId}/imports/latest\n@desc Get latest user import\n@required {userId: int # User id}\n@returns(200) {id: int, state: map{id: int, label: str}, createdAt: str(date-time)} # successful operation\n\n@endpoint POST /api/v1/users/{userId}/exports/request\n@desc Request user export\n@required {userId: int # User id}\n@optional {withVideoFiles: bool # Whether to include video files in the archive}\n@returns(200) {export: map{id: int}} # successful operation\n\n@endpoint GET /api/v1/users/{userId}/exports\n@desc List user exports\n@required {userId: int # User id}\n@returns(200) {id: int, state: map{id: int, label: str}, size: int, privateDownloadUrl: str, createdAt: str(date-time), expiresOn: str(date-time)} # successful operation\n\n@endpoint DELETE /api/v1/users/{userId}/exports/{id}\n@desc Delete a user export\n@required {userId: int # User id, id: int # Entity id}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/me\n@desc Get my user information\n@returns(200) successful operation\n\n@endpoint PUT /api/v1/users/me\n@desc Update my user information\n@optional {password: str(password), currentPassword: str(password), email: any # new email used for login and service communications, displayName: str # new name of the user in its representations, nsfwPolicy: str(true/false/both) # new NSFW display policy, nsfwFlagsDisplayed: int(0/1/2/4) # NSFW flags (can be combined using bitwise or operator) - `0` NONE - `1` VIOLENT - `2` EXPLICIT_SEX, nsfwFlagsHidden: int(0/1/2/4) # NSFW flags (can be combined using bitwise or operator) - `0` NONE - `1` VIOLENT - `2` EXPLICIT_SEX, nsfwFlagsWarned: int(0/1/2/4) # NSFW flags (can be combined using bitwise or operator) - `0` NONE - `1` VIOLENT - `2` EXPLICIT_SEX, nsfwFlagsBlurred: int(0/1/2/4) # NSFW flags (can be combined using bitwise or operator) - `0` NONE - `1` VIOLENT - `2` EXPLICIT_SEX, p2pEnabled: bool # whether to enable P2P in the player or not, autoPlayVideo: bool # new preference regarding playing videos automatically, autoPlayNextVideo: bool # new preference regarding playing following videos automatically, autoPlayNextVideoPlaylist: bool # new preference regarding playing following playlist videos automatically, videosHistoryEnabled: bool # whether to keep track of watched history or not, videoLanguages: [str] # list of languages to filter videos down to, language: str # default language for this user, theme: str, noInstanceConfigWarningModal: bool, noAccountSetupWarningModal: bool, noWelcomeModal: bool}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/users/me\n@desc Delete my account\n@returns(204) successful operation - account deleted\n@errors {400: invalid request parameters, 401: authentication required}\n\n@endpoint GET /api/v1/users/me/videos/comments\n@desc List comments on user's videos\n@optional {search: str # Plain text search, applied to various parts of the model depending on endpoint, searchAccount: str # Filter comments by searching on the account, searchVideo: str # Filter comments by searching on the video, videoId: int # Limit results on this specific video, videoChannelId: int # Limit results on this specific video channel, autoTagOneOf: any # **PeerTube >= 6.2** filter on comments that contain one of these automatic tags, isHeldForReview: bool # only display comments that are held for review, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/users/me/videos/imports\n@desc Get video imports of my user\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels, videoId: int # Filter on import video ID, targetUrl: str # Filter on import target URL, videoChannelSyncId: num # Filter on imports created by a specific channel synchronization, search: str # Search in video names}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/users/me/video-quota-used\n@desc Get my user used quota\n@returns(200) {videoQuotaUsed: num, videoQuotaUsedDaily: num} # successful operation\n\n@endpoint GET /api/v1/users/me/videos/{videoId}/rating\n@desc Get rate of my user for a video\n@required {videoId: any # The video id}\n@returns(200) {id: int, rating: str} # successful operation\n\n@endpoint GET /api/v1/users/me/videos\n@desc List videos of my user\n@optional {channelNameOneOf: any # **PeerTube >= 7.2** Filter on videos that are published by a channel with one of these names, start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, search: str # Plain text search, applied to various parts of the model depending on endpoint, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/users/me/subscriptions\n@desc List my user subscriptions\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(-id/-createdAt/-channelUpdatedAt)}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/users/me/subscriptions\n@desc Add subscription to my user\n@required {uri: str(uri) # uri of the video channels to subscribe to}\n@returns(204) successful operation\n@example_request {\"uri\":\"008a0e54-375d-49d0-8379-143202e24152@video.lqdn.fr\"}\n\n@endpoint GET /api/v1/users/me/subscriptions/exist\n@desc Get if subscriptions exist for my user\n@required {uris: [str(uri)] # list of uris to check if each is part of the user subscriptions}\n@returns(200) successful operation\n\n@endpoint GET /api/v1/users/me/subscriptions/videos\n@desc List videos of subscriptions of my user\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/users/me/subscriptions/{subscriptionHandle}\n@desc Get subscription of my user\n@required {subscriptionHandle: str # The subscription handle}\n@returns(200) successful operation\n\n@endpoint DELETE /api/v1/users/me/subscriptions/{subscriptionHandle}\n@desc Delete subscription of my user\n@required {subscriptionHandle: str # The subscription handle}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/me/notifications\n@desc List my notifications\n@optional {typeOneOf: [int] # only list notifications of these types, unread: bool # only list unread notifications, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/users/me/notifications/read\n@desc Mark notifications as read by their id\n@required {ids: [int] # ids of the notifications to mark as read}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/me/notifications/read-all\n@desc Mark all my notification as read\n@returns(204) successful operation\n\n@endpoint PUT /api/v1/users/me/notification-settings\n@desc Update my notification settings\n@optional {abuseAsModerator: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, videoAutoBlacklistAsModerator: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newUserRegistration: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newVideoFromSubscription: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, blacklistOnMyVideo: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, myVideoPublished: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, myVideoImportFinished: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, commentMention: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newCommentOnMyVideo: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newFollow: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newInstanceFollower: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, autoInstanceFollowing: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, abuseStateChange: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, abuseNewMessage: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newPeerTubeVersion: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, newPluginVersion: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, myVideoStudioEditionFinished: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL, myVideoTranscriptionGenerated: int # Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/me/new-feature-info/read\n@desc Mark feature info as read\n@required {feature: int # Represent a new feature that can be displayed to inform users. One of the following values:    - `1` CHANNEL_COLLABORATION}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/me/history/videos\n@desc List watched videos history\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint DELETE /api/v1/users/me/history/videos/{videoId}\n@desc Delete history element\n@required {videoId: any}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/me/history/videos/remove\n@desc Clear video history\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/me/avatar/pick\n@desc Update my user avatar\n@returns(200) {avatars: [any]} # successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/users/me/avatar\n@desc Delete my avatar\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/register\n@desc Register a user\n@required {username: any # immutable name of the user, used to find or mention its actor, password: str(password), email: str(email) # email of the user, used for login or service communications}\n@optional {displayName: str # editable name of the user, displayed in its representations, channel: map{name: str, displayName: str} # channel base information used to create the first channel of the user}\n@returns(200) {state: map{id: int, label: str}} # successful operation\n@errors {400: request error, 403: user registration is not enabled, user limit is reached, registration is not allowed for the ip, requires approval or blocked by a plugin, 409: a user with this username, channel name or email already exists}\n\n@endpoint POST /api/v1/users/registrations/request\n@desc Request registration\n@returns(200) {state: map{id: int, label: str}} # successful operation\n@errors {400: request error or signup approval is not enabled on the instance, 403: user registration is not enabled, user limit is reached, registration is not allowed for the ip or blocked by a plugin, 409: a user or registration with this username, channel name or email already exists}\n\n@endpoint POST /api/v1/users/registrations/{registrationId}/accept\n@desc Accept registration\n@required {registrationId: int # Registration ID, moderationResponse: str # Moderation response to send to the user}\n@optional {preventEmailDelivery: bool # Set it to true if you don't want PeerTube to send an email to the user}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/users/registrations/{registrationId}/reject\n@desc Reject registration\n@required {registrationId: int # Registration ID, moderationResponse: str # Moderation response to send to the user}\n@optional {preventEmailDelivery: bool # Set it to true if you don't want PeerTube to send an email to the user}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/users/registrations/{registrationId}\n@desc Delete registration\n@required {registrationId: int # Registration ID}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/registrations\n@desc List registrations\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, search: str, sort: str(-createdAt/createdAt/state/-state), stateOneOf: [int]}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/ownership\n@desc List video ownership changes\n@returns(200) successful operation\n\n@endpoint POST /api/v1/videos/ownership/{id}/accept\n@desc Accept ownership change request\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {403: cannot terminate an ownership change of another user, 404: video ownership change not found}\n\n@endpoint POST /api/v1/videos/ownership/{id}/refuse\n@desc Refuse ownership change request\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {403: cannot terminate an ownership change of another user, 404: video ownership change not found}\n\n@endpoint POST /api/v1/videos/{id}/give-ownership\n@desc Request ownership change\n@required {id: any # The object id, uuid or short uuid, username: str}\n@returns(204) successful operation\n@errors {400: changing video ownership to a remote account is not supported yet, 404: video not found}\n\n@endpoint POST /api/v1/videos/{id}/token\n@desc Request video token\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {files: map{token: str, expires: str(date-time)}} # successful operation\n@errors {400: incorrect parameters, 404: video not found}\n\n@endpoint POST /api/v1/videos/{id}/studio/edit\n@desc Create a studio task\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {400: incorrect parameters, 404: video not found}\n\n@endpoint GET /api/v1/videos\n@desc List videos\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/categories\n@desc List available video categories\n@returns(200) successful operation\n\n@endpoint GET /api/v1/videos/licences\n@desc List available video licences\n@returns(200) successful operation\n\n@endpoint GET /api/v1/videos/languages\n@desc List available video languages\n@returns(200) successful operation\n\n@endpoint GET /api/v1/videos/privacies\n@desc List available video privacy policies\n@returns(200) successful operation\n\n@endpoint PUT /api/v1/videos/{id}\n@desc Update a video\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/videos/{id}\n@desc Get a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) successful operation\n@errors {401: Requires authentication or the video requires a password, 403: Invalid authentication or the video requires a password}\n\n@endpoint DELETE /api/v1/videos/{id}\n@desc Delete a video\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/videos/{id}/description\n@desc Get complete video description\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) successful operation\n\n@endpoint POST /api/v1/videos/{id}/views\n@desc Notify user is watching a video\n@required {id: any # The object id, uuid or short uuid, currentTime: int(seconds) # timestamp within the video, in seconds}\n@optional {viewEvent: str # Event since last viewing call:  * `seek` - If the user seeked the video, sessionId: str # Optional param to represent the current viewer session. Used by the backend to properly count one view per session per video. PeerTube admin can configure the server to not trust this `sessionId` parameter but use the request IP address instead to identify a viewer., client: str # Client software used to watch the video. For example \"Firefox\", \"PeerTube Approval Android\", etc., device: any # Device used to watch the video. For example \"desktop\", \"mobile\", \"smarttv\", etc., operatingSystem: str # Operating system used to watch the video. For example \"Windows\", \"Ubuntu\", etc.}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/videos/{id}/stats/overall\n@desc Get overall stats of a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {startDate: str(date-time) # Filter stats by start date, endDate: str(date-time) # Filter stats by end date}\n@returns(200) {averageWatchTime: num, totalWatchTime: num, viewersPeak: num, totalViewers: num, viewersPeakDate: str(date-time), countries: [map], subdivisions: [map]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/stats/user-agent\n@desc Get user agent stats of a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {startDate: str(date-time) # Filter stats by start date, endDate: str(date-time) # Filter stats by end date}\n@returns(200) {clients: [map], devices: [map], operatingSystem: [map]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/stats/retention\n@desc Get retention stats of a video\n@required {id: any # The object id, uuid or short uuid}\n@returns(200) {data: [map]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/stats/timeseries/{metric}\n@desc Get timeserie stats of a video\n@required {id: any # The object id, uuid or short uuid, metric: str(viewers/aggregateWatchTime) # The metric to get}\n@optional {startDate: str(date-time) # Filter stats by start date, endDate: str(date-time) # Filter stats by end date}\n@returns(200) {data: [map]} # successful operation\n\n@endpoint POST /api/v1/videos/upload\n@desc Upload a video\n@returns(200) {video: map{id: any, uuid: any, shortUUID: any}} # successful operation\n@errors {403: video didn't pass upload filter, 408: upload has timed out, 413: If the response has no body, it means the reverse-proxy didn't let it through. Otherwise disambiguate via `code`: - `quota_reached` for quota limits whether daily or global, 415: video type unsupported, 422: video unreadable}\n\n@endpoint POST /api/v1/videos/upload-resumable\n@desc Initialize the resumable upload of a video\n@required {X-Upload-Content-Length: num # Number of bytes that will be uploaded in subsequent requests. Set this value to the size of the file you are uploading., X-Upload-Content-Type: str(mimetype) # MIME type of the file that you are uploading. Depending on your instance settings, acceptable values might vary.}\n@returns(200) file already exists, send a [`resume`](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) request instead\n@returns(201) created\n@errors {413: Disambiguate via `code`: - `max_file_size_reached` for the absolute file size limit - `quota_reached` for quota limits whether daily or global, 415: video type unsupported}\n\n@endpoint PUT /api/v1/videos/upload-resumable\n@desc Send chunk for the resumable upload of a video\n@required {upload_id: str # 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., Content-Range: str # Specifies the bytes in the file that the request is uploading.  For example, a value of `bytes 0-262143/1000000` shows that the request is sending the first 262144 bytes (256 x 1024) in a 2,469,036 byte file., Content-Length: num # Size of the chunk that the request is sending.  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.}\n@returns(200) {video: map{id: any, uuid: any, shortUUID: any}} # last chunk received\n@errors {308: resume incomplete, 403: video didn't pass upload filter, 404: upload not found, 409: chunk doesn't match range, 422: video unreadable, 429: too many concurrent requests, 503: upload is already being processed}\n\n@endpoint DELETE /api/v1/videos/upload-resumable\n@desc Cancel the resumable upload of a video, deleting any data uploaded so far\n@required {upload_id: str # 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., Content-Length: num}\n@returns(204) upload cancelled\n@errors {404: upload not found}\n\n@endpoint POST /api/v1/videos/imports\n@desc Import a video\n@returns(200) {video: map{id: any, uuid: any, shortUUID: any}} # successful operation\n@errors {400: `magnetUri` or `targetUrl` or a torrent file missing, 403: video didn't pass pre-import filter, 409: HTTP or Torrent/magnetURI import not enabled}\n\n@endpoint POST /api/v1/videos/imports/{id}/cancel\n@desc Cancel video import\n@required {id: int # Entity id}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/videos/imports/{id}/retry\n@desc Retry video import\n@required {id: int # Entity id}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/videos/imports/{id}\n@desc Delete video import\n@required {id: int # Entity id}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/videos/live\n@desc Create a live\n@returns(200) {video: map{id: any, uuid: any, shortUUID: any}} # successful operation\n@errors {400: Disambiguate via `code`: - default type for a validation error - `live_conflicting_permanent_and_save_replay` for conflicting parameters set, 403: Disambiguate via `code`: - `live_not_enabled` for a disabled live feature - `live_not_allowing_replay` for a disabled replay feature - `max_instance_lives_limit_reached` for the absolute concurrent live limit - `max_user_lives_limit_reached` for the user concurrent live limit}\n\n@endpoint GET /api/v1/videos/live/{id}\n@desc Get information about a live\n@required {id: any # The object id, uuid or short uuid}\n@returns(200) {rtmpUrl: str, rtmpsUrl: str, streamKey: str, saveReplay: bool, replaySettings: map{privacy: int}, permanentLive: bool, latencyMode: any, schedules: [any]} # successful operation\n\n@endpoint PUT /api/v1/videos/live/{id}\n@desc Update information about a live\n@required {id: any # The object id, uuid or short uuid}\n@optional {saveReplay: bool, replaySettings: map{privacy: int}, permanentLive: bool # User can stream multiple times in a permanent live, latencyMode: any # User can select live latency mode if enabled by the instance, schedules: [any]}\n@returns(204) successful operation\n@errors {400: bad parameters or trying to update a live that has already started, 403: trying to save replay of the live but saving replay is not enabled on the instance}\n\n@endpoint GET /api/v1/videos/live/{id}/sessions\n@desc List live sessions\n@required {id: any # The object id, uuid or short uuid}\n@optional {sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/live-session\n@desc Get live session of a replay\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {id: int, startDate: str(date-time), endDate: str(date-time)?, error: int?, replayVideo: map{id: num, uuid: str(uuid), shortUUID: str}} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/source\n@desc Get video source file metadata\n@required {id: any # The object id, uuid or short uuid}\n@returns(200) {inputFilename: str, fileDownloadUrl: str, resolution: any, size: int, fps: num, width: int, height: int, createdAt: str(date-time)} # successful operation\n\n@endpoint DELETE /api/v1/videos/{id}/source/file\n@desc Delete video source file\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {404: video source not found}\n\n@endpoint POST /api/v1/videos/{id}/source/replace-resumable\n@desc Initialize the resumable replacement of a video\n@required {id: any # The object id, uuid or short uuid, X-Upload-Content-Length: num # Number of bytes that will be uploaded in subsequent requests. Set this value to the size of the file you are uploading., X-Upload-Content-Type: str(mimetype) # MIME type of the file that you are uploading. Depending on your instance settings, acceptable values might vary.}\n@optional {filename: str(filename) # Video filename including extension}\n@returns(200) file already exists, send a [`resume`](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) request instead\n@returns(201) created\n@errors {413: Disambiguate via `code`: - `max_file_size_reached` for the absolute file size limit - `quota_reached` for quota limits whether daily or global, 415: video type unsupported}\n\n@endpoint PUT /api/v1/videos/{id}/source/replace-resumable\n@desc Send chunk for the resumable replacement of a video\n@required {id: any # The object id, uuid or short uuid, upload_id: str # 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., Content-Range: str # Specifies the bytes in the file that the request is uploading.  For example, a value of `bytes 0-262143/1000000` shows that the request is sending the first 262144 bytes (256 x 1024) in a 2,469,036 byte file., Content-Length: num # Size of the chunk that the request is sending.  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.}\n@returns(204) last chunk received: successful operation\n@errors {308: resume incomplete, 403: video didn't pass file replacement filter, 404: replace upload not found, 409: chunk doesn't match range, 422: video unreadable, 429: too many concurrent requests, 503: upload is already being processed}\n\n@endpoint DELETE /api/v1/videos/{id}/source/replace-resumable\n@desc Cancel the resumable replacement of a video\n@required {id: any # The object id, uuid or short uuid, upload_id: str # 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., Content-Length: num}\n@returns(204) source file replacement cancelled\n@errors {404: source file replacement not found}\n\n@endpoint GET /api/v1/users/me/abuses\n@desc List my abuses\n@optional {id: int # only list the report with this id, state: int, sort: str(-id/-createdAt/-state) # Sort abuses by criteria, start: int # Offset used to paginate results, count: int=15 # Number of items to return}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/abuses\n@desc List abuses\n@optional {id: int # only list the report with this id, predefinedReason: [str] # predefined reason the listed reports should contain, search: str # plain search that will match with video titles, reporter names and more, state: int, searchReporter: str # only list reports of a specific reporter, searchReportee: str # only list reports of a specific reportee, searchVideo: str # only list reports of a specific video, searchVideoChannel: str # only list reports of a specific video channel, videoIs: str(deleted/blacklisted) # only list deleted or blocklisted videos, filter: str(video/comment/account) # only list account, comment or video reports, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(-id/-createdAt/-state) # Sort abuses by criteria}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/abuses\n@desc Report an abuse\n@required {reason: str # Reason why the user reports this video}\n@optional {predefinedReasons: [str] # Reason categories that help triage reports, video: map{id: any, startAt: int(seconds), endAt: int(seconds)}, comment: map{id: any}, account: map{id: int}}\n@returns(200) {abuse: map{id: int}} # successful operation\n@errors {400: incorrect request parameters}\n\n@endpoint PUT /api/v1/abuses/{abuseId}\n@desc Update an abuse\n@required {abuseId: int # Abuse id}\n@optional {state: int(1/2/3) # The abuse state (Pending = `1`, Rejected = `2`, Accepted = `3`), moderationComment: str # Update the report comment visible only to the moderation team}\n@returns(204) successful operation\n@errors {404: abuse not found}\n\n@endpoint DELETE /api/v1/abuses/{abuseId}\n@desc Delete an abuse\n@required {abuseId: int # Abuse id}\n@returns(204) successful operation\n@errors {404: block not found}\n\n@endpoint GET /api/v1/abuses/{abuseId}/messages\n@desc List messages of an abuse\n@required {abuseId: int # Abuse id}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/abuses/{abuseId}/messages\n@desc Add message to an abuse\n@required {abuseId: int # Abuse id, message: str # Message to send}\n@returns(200) successful operation\n@errors {400: incorrect request parameters}\n\n@endpoint DELETE /api/v1/abuses/{abuseId}/messages/{abuseMessageId}\n@desc Delete an abuse message\n@required {abuseId: int # Abuse id, abuseMessageId: int # Abuse message id}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/videos/{id}/blacklist\n@desc Block a video\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/videos/{id}/blacklist\n@desc Unblock a video by its id\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {404: block not found}\n\n@endpoint GET /api/v1/videos/blacklist\n@desc List video blocks\n@optional {type: int(1/2) # list only blocks that match this type: - `1`: manual block - `2`: automatic block that needs review, search: str # plain search that will match with video titles, and more, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(-id/name/-duration/-views/-likes/-dislikes/-uuid/-createdAt) # Sort blocklists by criteria}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/storyboards\n@desc List storyboards of a video\n@required {id: any # The object id, uuid or short uuid}\n@returns(200) {storyboards: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/{id}/captions\n@desc List captions of a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/videos/{id}/captions/generate\n@desc Generate a video caption\n@required {id: any # The object id, uuid or short uuid}\n@optional {forceTranscription: bool=false}\n@returns(204) successful operation\n@errors {404: video not found}\n\n@endpoint PUT /api/v1/videos/{id}/captions/{captionLanguage}\n@desc Add or replace a video caption\n@required {id: any # The object id, uuid or short uuid, captionLanguage: str # The caption language}\n@returns(204) successful operation\n@errors {404: video or language not found}\n\n@endpoint DELETE /api/v1/videos/{id}/captions/{captionLanguage}\n@desc Delete a video caption\n@required {id: any # The object id, uuid or short uuid, captionLanguage: str # The caption language}\n@returns(204) successful operation\n@errors {404: video or language or caption for that language not found}\n\n@endpoint GET /api/v1/videos/{id}/chapters\n@desc Get chapters of a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {chapters: map{title: str, timecode: int}} # successful operation\n\n@endpoint PUT /api/v1/videos/{id}/chapters\n@desc Replace video chapters\n@required {id: any # The object id, uuid or short uuid}\n@optional {chapters: [map{title: str, timecode: int}]}\n@returns(204) successful operation\n@errors {404: video not found}\n\n@endpoint GET /api/v1/videos/{id}/embed-privacy\n@desc Get video embed privacy\n@required {id: any # The object id, uuid or short uuid}\n@returns(200) {policy: map{id: int, label: str}, domains: [str]} # successful operation\n@errors {400: invalid request}\n\n@endpoint PUT /api/v1/videos/{id}/embed-privacy\n@desc Update video embed privacy\n@required {id: any # The object id, uuid or short uuid}\n@optional {policy: int(1/2/3) # The video embed privacy level:   - `1` All allowed: anyone can embed the video   - `2` Allowlist: only the domains in the allowlist can embed the video   - `3` Remote restrictions: the remote instance has restrictions on where the video can be embedded, domains: [str]}\n@returns(204) successful operation\n@errors {400: invalid request}\n\n@endpoint GET /api/v1/videos/{id}/embed-privacy/allowed\n@desc Check if embed is allowed\n@required {id: any # The object id, uuid or short uuid, domain: str # The domain to check if embed is allowed}\n@returns(200) {domainAllowed: bool, userBypassAllowed: bool?} # successful operation\n@errors {400: invalid request}\n\n@endpoint GET /api/v1/videos/{id}/passwords\n@desc List video passwords\n@required {id: any # The object id, uuid or short uuid}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(204) {total: int, data: [any]} # successful operation\n@errors {400: video is not password protected}\n\n@endpoint PUT /api/v1/videos/{id}/passwords\n@desc Update video passwords\n@required {id: any # The object id, uuid or short uuid}\n@optional {passwords: [str]}\n@returns(204) successful operation\n@errors {400: video is not password protected}\n\n@endpoint POST /api/v1/videos/{id}/passwords\n@desc Add a video password\n@required {id: any # The object id, uuid or short uuid}\n@optional {password: str}\n@returns(204) successful operation\n@errors {400: video is not password protected}\n\n@endpoint DELETE /api/v1/videos/{id}/passwords/{videoPasswordId}\n@desc Delete a video password\n@required {id: any # The object id, uuid or short uuid, videoPasswordId: int # The video password id}\n@returns(204) successful operation\n@errors {400: video is not password protected, 403: cannot delete the last password of the protected video}\n\n@endpoint GET /api/v1/video-channels\n@desc List video channels\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/video-channels\n@desc Create a video channel\n@returns(200) {videoChannel: map{id: int}} # successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}\n@desc Get a video channel\n@required {channelHandle: str # The video channel handle}\n@returns(200) successful operation\n\n@endpoint PUT /api/v1/video-channels/{channelHandle}\n@desc Update a video channel\n@required {channelHandle: str # The video channel handle}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/video-channels/{channelHandle}\n@desc Delete a video channel\n@required {channelHandle: str # The video channel handle}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}/videos\n@desc List videos of a video channel\n@required {channelHandle: str # The video channel handle}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}/activities\n@desc List activities of a video channel\n@required {channelHandle: str # The video channel handle}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [map]} # successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}/video-playlists\n@desc List playlists of a channel\n@required {channelHandle: str # The video channel handle}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, playlistType: int}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/video-playlists/reorder\n@desc Reorder channel playlists\n@required {channelHandle: str # The video channel handle, startPosition: int # Start position of the element to reorder, insertAfterPosition: int # New position for the block to reorder, to add the block before the first element}\n@optional {reorderLength: int # How many element from `startPosition` to reorder}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}/followers\n@desc List followers of a video channel\n@required {channelHandle: str # The video channel handle}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort followers by criteria, search: str # Plain text search, applied to various parts of the model depending on endpoint}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/avatar/pick\n@desc Update channel avatar\n@required {channelHandle: str # The video channel handle}\n@returns(200) {avatars: [any]} # successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/video-channels/{channelHandle}/avatar\n@desc Delete channel avatar\n@required {channelHandle: str # The video channel handle}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/banner/pick\n@desc Update channel banner\n@required {channelHandle: str # The video channel handle}\n@returns(200) {banners: [any]} # successful operation\n@errors {413: image file too large}\n\n@endpoint DELETE /api/v1/video-channels/{channelHandle}/banner\n@desc Delete channel banner\n@required {channelHandle: str # The video channel handle}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/import-videos\n@desc Import videos in channel\n@required {channelHandle: str # The video channel handle, externalChannelUrl: str}\n@optional {videoChannelSyncId: int # If part of a channel sync process, specify its id to assign video imports to this channel synchronization}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/video-channel-syncs\n@desc Create a synchronization for a video channel\n@optional {externalChannelUrl: str, videoChannelId: int}\n@returns(200) {videoChannelSync: map{id: int, state: map{id: int, label: str}, externalChannelUrl: str, createdAt: str(date-time), lastSyncAt: str(date-time)?, channel: any}} # successful operation\n\n@endpoint DELETE /api/v1/video-channel-syncs/{channelSyncId}\n@desc Delete a video channel synchronization\n@required {channelSyncId: int # Channel Sync id}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/video-channel-syncs/{channelSyncId}/sync\n@desc Triggers the channel synchronization job, fetching all the videos from the remote channel\n@required {channelSyncId: int # Channel Sync id}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/player-settings/videos/{id}\n@desc Get video player settings\n@required {id: any # The object id, uuid or short uuid}\n@optional {raw: bool=false # Return raw settings without merging channel defaults}\n@returns(200) {theme: str} # successful operation\n@errors {404: video not found}\n\n@endpoint PUT /api/v1/player-settings/videos/{id}\n@desc Update video player settings\n@required {id: any # The object id, uuid or short uuid, theme: str(channel-default/instance-default/galaxy/lucide) # Player theme setting for a video:   - `channel-default` Use the channel default theme   - `instance-default` Use the instance default theme   - `galaxy` Use the galaxy theme   - `lucide` Use the lucide theme}\n@returns(200) {theme: str} # successful operation\n@errors {404: video not found}\n\n@endpoint GET /api/v1/player-settings/video-channels/{channelHandle}\n@desc Get channel player settings\n@required {channelHandle: str # The video channel handle}\n@optional {raw: bool=false # Return raw settings without applying instance defaults}\n@returns(200) {theme: str} # successful operation\n@errors {404: video channel not found}\n\n@endpoint PUT /api/v1/player-settings/video-channels/{channelHandle}\n@desc Update channel player settings\n@required {channelHandle: str # The video channel handle, theme: str(instance-default/galaxy/lucide) # Player theme setting for a channel:   - `instance-default` Use the instance default theme   - `galaxy` Use the galaxy theme   - `lucide` Use the lucide theme}\n@returns(200) {theme: str} # successful operation\n@errors {404: video channel not found}\n\n@endpoint GET /api/v1/video-playlists/privacies\n@desc List available playlist privacy policies\n@returns(200) successful operation\n\n@endpoint GET /api/v1/video-playlists\n@desc List video playlists\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, playlistType: int}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/video-playlists\n@desc Create a video playlist\n@returns(200) {videoPlaylist: map{id: int, uuid: str(uuid), shortUUID: any}} # successful operation\n\n@endpoint GET /api/v1/video-playlists/{playlistId}\n@desc Get a video playlist\n@required {playlistId: int # Playlist id}\n@returns(200) {id: int, uuid: str(uuid), shortUUID: any, createdAt: str(date-time), updatedAt: str(date-time), description: str, displayName: str, isLocal: bool, videoLength: int, thumbnailPath: str, thumbnails: [any], privacy: any, type: any, ownerAccount: any, videoChannel: any, videoChannelPosition: int} # successful operation\n\n@endpoint PUT /api/v1/video-playlists/{playlistId}\n@desc Update a video playlist\n@required {playlistId: int # Playlist id}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/video-playlists/{playlistId}\n@desc Delete a video playlist\n@required {playlistId: int # Playlist id}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/video-playlists/{playlistId}/videos\n@desc List videos of a playlist\n@required {playlistId: int # Playlist id}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return}\n@returns(200) {total: int, data: [map]} # successful operation\n\n@endpoint POST /api/v1/video-playlists/{playlistId}/videos\n@desc Add a video in a playlist\n@required {playlistId: int # Playlist id, videoId: any # Video to add in the playlist}\n@optional {startTimestamp: int(seconds) # Start the video at this specific timestamp, stopTimestamp: int(seconds) # Stop the video at this specific timestamp}\n@returns(200) {videoPlaylistElement: map{id: int}} # successful operation\n\n@endpoint POST /api/v1/video-playlists/{playlistId}/videos/reorder\n@desc Reorder playlist elements\n@required {playlistId: int # Playlist id, startPosition: int # Start position of the element to reorder, insertAfterPosition: int # New position for the block to reorder, to add the block before the first element}\n@optional {reorderLength: int # How many element from `startPosition` to reorder}\n@returns(204) successful operation\n\n@endpoint PUT /api/v1/video-playlists/{playlistId}/videos/{playlistElementId}\n@desc Update a playlist element\n@required {playlistId: int # Playlist id, playlistElementId: int # Playlist element id}\n@optional {startTimestamp: int(seconds) # Start the video at this specific timestamp, stopTimestamp: int(seconds) # Stop the video at this specific timestamp}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/video-playlists/{playlistId}/videos/{playlistElementId}\n@desc Delete an element from a playlist\n@required {playlistId: int # Playlist id, playlistElementId: int # Playlist element id}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/users/me/video-playlists/videos-exist\n@desc Check video exists in my playlists\n@required {videoIds: [any] # The video ids to check}\n@returns(200) {videoId: [map]} # successful operation\n\n@endpoint GET /api/v1/accounts/{name}/video-playlists\n@desc List playlists of an account\n@required {name: str # The username or handle of the account}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, search: str # Plain text search, applied to various parts of the model depending on endpoint, playlistType: int, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels, channelNameOneOf: any # **PeerTube >= 8.0** Filter on playlists that are published on a channel with one of these names}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/accounts/{name}/video-channels\n@desc List video channels of an account\n@required {name: str # The username or handle of the account}\n@optional {withStats: bool # include daily view statistics for the last 30 days and total views (only if authenticated as the account user), start: int # Offset used to paginate results, count: int=15 # Number of items to return, search: str # Plain text search, applied to various parts of the model depending on endpoint, sort: str # Sort column, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/accounts/{name}/video-channel-syncs\n@desc List the synchronizations of video channels of an account\n@required {name: str # The username or handle of the account}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, includeCollaborations: bool # **PeerTube >= 8.0** Include objects from collaborated channels}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/accounts/{name}/ratings\n@desc List ratings of an account\n@required {name: str # The username or handle of the account}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, rating: str(like/dislike) # Optionally filter which ratings to retrieve}\n@returns(200) successful operation\n\n@endpoint GET /api/v1/videos/{id}/comment-threads\n@desc List threads of a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(-createdAt/-totalReplies) # Sort comments by criteria, x-peertube-video-password: str # Required on password protected video}\n@returns(200) {total: int, totalNotDeletedComments: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/videos/{id}/comment-threads\n@desc Create a thread\n@required {id: any # The object id, uuid or short uuid, text: any}\n@returns(200) {comment: any} # successful operation\n@errors {404: video does not exist}\n\n@endpoint GET /api/v1/videos/{id}/comment-threads/{threadId}\n@desc Get a thread\n@required {id: any # The object id, uuid or short uuid, threadId: int # The thread id (root comment id)}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {comment: any, children: [any]} # successful operation\n\n@endpoint GET /api/v1/videos/comments\n@desc List instance comments\n@optional {search: str # Plain text search, applied to various parts of the model depending on endpoint, searchAccount: str # Filter comments by searching on the account, searchVideo: str # Filter comments by searching on the video, videoId: int # Limit results on this specific video, videoChannelId: int # Limit results on this specific video channel, autoTagOneOf: any # **PeerTube >= 6.2** filter on comments that contain one of these automatic tags, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, onLocalVideo: bool # Display only objects of local or remote videos}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/videos/{id}/comments/{commentId}\n@desc Reply to a thread of a video\n@required {id: any # The object id, uuid or short uuid, commentId: int # The comment id, text: any}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(200) {comment: any} # successful operation\n@errors {404: thread or video does not exist}\n\n@endpoint DELETE /api/v1/videos/{id}/comments/{commentId}\n@desc Delete a comment or a reply\n@required {id: any # The object id, uuid or short uuid, commentId: int # The comment id}\n@returns(204) successful operation\n@errors {403: cannot remove comment of another user, 404: comment or video does not exist, 409: comment is already deleted}\n\n@endpoint POST /api/v1/videos/{id}/comments/{commentId}/approve\n@desc Approve a comment\n@required {id: any # The object id, uuid or short uuid, commentId: int # The comment id}\n@returns(204) successful operation\n\n@endpoint PUT /api/v1/videos/{id}/rate\n@desc Like/dislike a video\n@required {id: any # The object id, uuid or short uuid, rating: str(like/dislike)}\n@optional {x-peertube-video-password: str # Required on password protected video}\n@returns(204) successful operation\n@errors {404: video does not exist}\n\n@endpoint DELETE /api/v1/videos/{id}/hls\n@desc Delete video HLS files\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {404: video does not exist}\n\n@endpoint DELETE /api/v1/videos/{id}/web-videos\n@desc Delete video Web Video files\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {404: video does not exist}\n\n@endpoint POST /api/v1/videos/{id}/transcoding\n@desc Create a transcoding job\n@required {id: any # The object id, uuid or short uuid, transcodingType: str(hls/web-video)}\n@optional {forceTranscoding: bool=false # If the video is stuck in transcoding state, do it anyway}\n@returns(204) successful operation\n@errors {404: video does not exist}\n\n@endpoint GET /api/v1/search/videos\n@desc Search videos\n@required {search: str # String to search. If the user can make a remote URI search, and the string is an URI then the PeerTube instance will fetch the remote object and add it to its database. Then, you can use the REST API to fetch the complete video information and interact with it.}\n@optional {uuids: any # Find elements with specific UUIDs, searchTarget: str(local/search-index) # If the administrator enabled search index support, you can override the default search target.  **Warning**: If you choose to make an index search, PeerTube will get results from a third party service. It means the instance may not yet know the objects you fetched. If you want to load video/channel information:   * If the current user has the ability to make a remote URI search (this information is available in the config endpoint),   then reuse the search API to make a search using the object URI so PeerTube instance fetches the remote object and fill its database.   After that, you can use the classic REST API endpoints to fetch the complete object or interact with it   * If the current user doesn't have the ability to make a remote URI search, then redirect the user on the origin instance or fetch   the data from the origin instance API, start: int # Offset used to paginate results, count: int=15 # Number of items to return, skipCount: str(true/false)=false # if you don't need the `total` in the response, sort: str(name/-duration/-createdAt/-publishedAt/-views/-likes/-comments/-trending/-hot/-best), nsfw: str(true/false) # whether to include nsfw videos, if any, nsfwFlagsIncluded: int, nsfwFlagsExcluded: int, isLive: bool # whether or not the video is a live, includeScheduledLive: bool # whether or not include live that are scheduled for later, categoryOneOf: any # category id of the video (see [/videos/categories](#operation/getCategories)), licenceOneOf: any # licence id of the video (see [/videos/licences](#operation/getLicences)), languageOneOf: any # language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language, tagsOneOf: any # tag(s) of the video, tagsAllOf: any # tag(s) of the video, where all should be present in the video, isLocal: bool # **PeerTube >= 4.0** Display only local or remote objects, include: int(0/1/2/4/8/16/32) # **Only administrators and moderators can use this parameter**  Include additional videos in results (can be combined using bitwise or operator) - `0` NONE - `1` NOT_PUBLISHED_STATE - `2` BLACKLISTED - `4` BLOCKED_OWNER - `8` FILES - `16` CAPTIONS - `32` VIDEO SOURCE, hasHLSFiles: bool # **PeerTube >= 4.0** Display only videos that have HLS files, hasWebVideoFiles: bool # **PeerTube >= 6.0** Display only videos that have Web Video files, host: str # Find elements owned by this host, autoTagOneOf: any # **PeerTube >= 6.2** **Admins and moderators only** filter on videos that contain one of these automatic tags, privacyOneOf: int # **PeerTube >= 4.0** Display only videos in this specific privacy/privacies, excludeAlreadyWatched: bool # Whether or not to exclude videos that are in the user's video history, startDate: str(date-time) # Get videos that are published after this date, endDate: str(date-time) # Get videos that are published before this date, originallyPublishedStartDate: str(date-time) # Get videos that are originally published after this date, originallyPublishedEndDate: str(date-time) # Get videos that are originally published before this date, durationMin: int # Get videos that have this minimum duration, durationMax: int # Get videos that have this maximum duration}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {500: search index unavailable}\n\n@endpoint GET /api/v1/search/video-channels\n@desc Search channels\n@required {search: str # String to search. If the user can make a remote URI search, and the string is an URI then the PeerTube instance will fetch the remote object and add it to its database. Then, you can use the REST API to fetch the complete channel information and interact with it.}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, searchTarget: str(local/search-index) # If the administrator enabled search index support, you can override the default search target.  **Warning**: If you choose to make an index search, PeerTube will get results from a third party service. It means the instance may not yet know the objects you fetched. If you want to load video/channel information:   * If the current user has the ability to make a remote URI search (this information is available in the config endpoint),   then reuse the search API to make a search using the object URI so PeerTube instance fetches the remote object and fill its database.   After that, you can use the classic REST API endpoints to fetch the complete object or interact with it   * If the current user doesn't have the ability to make a remote URI search, then redirect the user on the origin instance or fetch   the data from the origin instance API, sort: str # Sort column, host: str # Find elements owned by this host, handles: any # Find elements with these handles}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {500: search index unavailable}\n\n@endpoint GET /api/v1/search/video-playlists\n@desc Search playlists\n@required {search: str # String to search. If the user can make a remote URI search, and the string is an URI then the PeerTube instance will fetch the remote object and add it to its database. Then, you can use the REST API to fetch the complete playlist information and interact with it.}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, searchTarget: str(local/search-index) # If the administrator enabled search index support, you can override the default search target.  **Warning**: If you choose to make an index search, PeerTube will get results from a third party service. It means the instance may not yet know the objects you fetched. If you want to load video/channel information:   * If the current user has the ability to make a remote URI search (this information is available in the config endpoint),   then reuse the search API to make a search using the object URI so PeerTube instance fetches the remote object and fill its database.   After that, you can use the classic REST API endpoints to fetch the complete object or interact with it   * If the current user doesn't have the ability to make a remote URI search, then redirect the user on the origin instance or fetch   the data from the origin instance API, sort: str # Sort column, host: str # Find elements owned by this host, uuids: any # Find elements with specific UUIDs}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {500: search index unavailable}\n\n@endpoint GET /api/v1/blocklist/status\n@desc Get block status of accounts/hosts\n@optional {accounts: [str] # Check if these accounts are blocked, hosts: [str] # Check if these hosts are blocked}\n@returns(200) {accounts: map, hosts: map} # successful operation\n\n@endpoint GET /api/v1/users/me/blocklist/accounts\n@desc List accounts blocked by my account\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, search: str # Search query string}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {401: authentication required}\n\n@endpoint POST /api/v1/users/me/blocklist/accounts\n@desc Block an account by my account\n@required {accountName: str # Account name to block (format: name@host)}\n@returns(204) successful operation - account blocked\n@errors {400: invalid account name, 401: authentication required, 404: account not found}\n\n@endpoint DELETE /api/v1/users/me/blocklist/accounts/{accountName}\n@desc Unblock an account by my account\n@required {accountName: str # Account name to unblock (format: name@host)}\n@returns(204) successful operation - account unblocked\n@errors {400: invalid account name, 401: authentication required, 404: account block not found}\n\n@endpoint GET /api/v1/users/me/blocklist/servers\n@desc List servers blocked by my account\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column, search: str # Search query string}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {401: authentication required}\n\n@endpoint POST /api/v1/users/me/blocklist/servers\n@desc Block a server by my account\n@required {host: str # Server host to block}\n@returns(204) successful operation - server blocked\n@errors {400: invalid server host, 401: authentication required, 404: server not found}\n\n@endpoint DELETE /api/v1/users/me/blocklist/servers/{host}\n@desc Unblock a server by my account\n@required {host: str # Server host to unblock}\n@returns(204) successful operation - server unblocked\n@errors {400: invalid server host, 401: authentication required, 404: server block not found}\n\n@endpoint GET /api/v1/server/blocklist/accounts\n@desc List blocked accounts by server\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/server/blocklist/accounts\n@desc Block an account by server\n@required {accountName: str # account to block, in the form `username@domain`}\n@returns(200) successful operation\n@errors {409: self-blocking forbidden}\n\n@endpoint DELETE /api/v1/server/blocklist/accounts/{accountName}\n@desc Unblock an account by server\n@required {accountName: str # account to unblock, in the form `username@domain`}\n@returns(201) successful operation\n@errors {404: account or account block does not exist}\n\n@endpoint GET /api/v1/server/blocklist/servers\n@desc List blocked servers by server\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/server/blocklist/servers\n@desc Block a server by server\n@required {host: str(hostname) # server domain to block}\n@returns(204) successful operation\n@errors {409: self-blocking forbidden}\n\n@endpoint DELETE /api/v1/server/blocklist/servers/{host}\n@desc Unblock a server by server\n@required {host: str(hostname) # server domain to unblock}\n@returns(204) successful operation\n@errors {404: server block does not exist}\n\n@endpoint PUT /api/v1/server/redundancy/{host}\n@desc Update a server redundancy policy\n@required {host: str(hostname) # server domain to mirror, redundancyAllowed: bool # allow mirroring of the host's local videos}\n@returns(204) successful operation\n@errors {404: server is not already known}\n\n@endpoint GET /api/v1/server/redundancy/videos\n@desc List videos being mirrored\n@required {target: str(my-videos/remote-videos) # direction of the mirror}\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort abuses by criteria}\n@returns(200) successful operation\n\n@endpoint POST /api/v1/server/redundancy/videos\n@desc Mirror a video\n@required {videoId: any # object id for the video}\n@returns(204) successful operation\n@errors {400: cannot mirror a local video, 404: video does not exist, 409: video is already mirrored}\n\n@endpoint DELETE /api/v1/server/redundancy/videos/{redundancyId}\n@desc Delete a mirror done on a video\n@required {redundancyId: str # id of an existing redundancy on a video}\n@returns(204) successful operation\n@errors {404: video redundancy not found}\n\n@endpoint GET /api/v1/server/stats\n@desc Get instance stats\n@returns(200) {totalUsers: num, totalDailyActiveUsers: num, totalWeeklyActiveUsers: num, totalMonthlyActiveUsers: num, totalModerators: num, totalAdmins: num, totalLocalVideos: num, totalLocalVideoViews: num, totalLocalVideoDownloads: num, totalLocalVideoComments: num, totalLocalVideoFilesSize: num, totalVideos: num, totalVideoComments: num, totalLocalVideoChannels: num, totalLocalDailyActiveVideoChannels: num, totalLocalWeeklyActiveVideoChannels: num, totalLocalMonthlyActiveVideoChannels: num, totalLocalPlaylists: num, totalInstanceFollowers: num, totalInstanceFollowing: num, videosRedundancy: [map], totalActivityPubMessagesProcessed: num, totalActivityPubMessagesSuccesses: num, totalActivityPubMessagesErrors: num, activityPubMessagesProcessedPerSecond: num, totalActivityPubMessagesWaiting: num, averageRegistrationRequestResponseTimeMs: num, totalRegistrationRequestsProcessed: num, totalRegistrationRequests: num, averageAbuseResponseTimeMs: num, totalAbusesProcessed: num, totalAbuses: num} # successful operation\n\n@endpoint POST /api/v1/server/logs/client\n@desc Send client log\n@required {message: str, url: str # URL of the current user page, level: any(error/warn)}\n@optional {stackTrace: str # Stack trace of the error if there is one, userAgent: str # User agent of the web browser that sends the message, meta: str # Additional information regarding this log}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/server/logs\n@desc Get instance logs\n@returns(200) successful operation\n\n@endpoint GET /api/v1/server/audit-logs\n@desc Get instance audit logs\n@returns(200) successful operation\n\n@endpoint GET /api/v1/plugins\n@desc List plugins\n@optional {pluginType: int, uninstalled: bool, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/plugins/available\n@desc List available plugins\n@optional {search: str, pluginType: int, currentPeerTubeEngine: str, start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort column}\n@returns(200) {total: int, data: [any]} # successful operation\n@errors {503: plugin index unavailable}\n\n@endpoint POST /api/v1/plugins/install\n@desc Install a plugin\n@returns(204) successful operation\n@errors {400: should have either `npmName` or `path` set}\n\n@endpoint POST /api/v1/plugins/update\n@desc Update a plugin\n@returns(204) successful operation\n@errors {400: should have either `npmName` or `path` set, 404: existing plugin not found}\n\n@endpoint POST /api/v1/plugins/uninstall\n@desc Uninstall a plugin\n@required {npmName: str # name of the plugin/theme in its package.json}\n@returns(204) successful operation\n@errors {404: existing plugin not found}\n\n@endpoint GET /api/v1/plugins/{npmName}\n@desc Get a plugin\n@required {npmName: str # name of the plugin/theme on npmjs.com or in its package.json}\n@returns(200) {name: str, type: int, latestVersion: str, version: str, enabled: bool, uninstalled: bool, peertubeEngine: str, description: str, homepage: str(url), settings: map, createdAt: str(date-time), updatedAt: str(date-time)} # successful operation\n@errors {404: plugin not found}\n\n@endpoint PUT /api/v1/plugins/{npmName}/settings\n@desc Set a plugin's settings\n@required {npmName: str # name of the plugin/theme on npmjs.com or in its package.json}\n@optional {settings: map}\n@returns(204) successful operation\n@errors {404: plugin not found}\n\n@endpoint GET /api/v1/plugins/{npmName}/public-settings\n@desc Get a plugin's public settings\n@required {npmName: str # name of the plugin/theme on npmjs.com or in its package.json}\n@returns(200) successful operation\n@errors {404: plugin not found}\n\n@endpoint GET /api/v1/plugins/{npmName}/registered-settings\n@desc Get a plugin's registered settings\n@required {npmName: str # name of the plugin/theme on npmjs.com or in its package.json}\n@returns(200) successful operation\n@errors {404: plugin not found}\n\n@endpoint POST /api/v1/metrics/playback\n@desc Create playback metrics\n@required {playerMode: str(p2p-media-loader/web-video), p2pEnabled: bool, resolutionChanges: num # How many resolution changes occurred since the last metric creation, errors: num # How many errors occurred since the last metric creation, downloadedBytesP2P: num # How many bytes were downloaded with P2P since the last metric creation, downloadedBytesHTTP: num # How many bytes were downloaded with HTTP since the last metric creation, uploadedBytesP2P: num # How many bytes were uploaded with P2P since the last metric creation, videoId: any}\n@optional {resolution: num # Current player video resolution, fps: num # Current player video fps, p2pPeers: num # P2P peers connected (doesn't include WebSeed peers), bufferStalled: num # How many times buffer has been stalled since the last metric creation}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/runners/registration-tokens/generate\n@desc Generate registration token\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/runners/registration-tokens/{registrationTokenId}\n@desc Remove registration token\n@required {registrationTokenId: int}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/runners/registration-tokens\n@desc List registration tokens\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort registration tokens by criteria}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/runners/register\n@desc Register a new runner\n@required {registrationToken: str, name: str}\n@optional {description: str}\n@returns(200) {id: int, runnerToken: str} # successful operation\n\n@endpoint POST /api/v1/runners/unregister\n@desc Unregister a runner\n@required {runnerToken: str}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/runners/{runnerId}\n@desc Delete a runner\n@required {runnerId: int, runnerToken: str}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/runners\n@desc List runners\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str # Sort runners by criteria}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/runners/jobs/request\n@desc Request a new job\n@required {runnerToken: str}\n@optional {jobTypes: [str] # Filter jobs depending on their types}\n@returns(200) {availableJobs: [map]} # successful operation\n\n@endpoint POST /api/v1/runners/jobs/{jobUUID}/accept\n@desc Accept job\n@required {jobUUID: str(uuid), runnerToken: str}\n@returns(200) {job: any} # successful operation\n\n@endpoint POST /api/v1/runners/jobs/{jobUUID}/abort\n@desc Abort job\n@required {jobUUID: str(uuid), runnerToken: str, jobToken: str, reason: str # Why the runner aborts this job}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/runners/jobs/{jobUUID}/update\n@desc Update job\n@required {jobUUID: str(uuid), runnerToken: str, jobToken: str}\n@optional {progress: int # Update job progression percentage (optional), payload: any}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/runners/jobs/{jobUUID}/error\n@desc Post job error\n@required {jobUUID: str(uuid), runnerToken: str, jobToken: str, message: str # Why the runner failed to process this job}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/runners/jobs/{jobUUID}/success\n@desc Post job success\n@required {jobUUID: str(uuid), runnerToken: str, jobToken: str, payload: any}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/runners/jobs/{jobUUID}/cancel\n@desc Cancel a job\n@required {jobUUID: str(uuid)}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/runners/jobs/{jobUUID}\n@desc Delete a job\n@required {jobUUID: str(uuid)}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/runners/jobs\n@desc List jobs\n@optional {start: int # Offset used to paginate results, count: int=15 # Number of items to return, sort: str(updatedAt/createdAt/priority/state/progress) # Sort runner jobs by criteria, search: str # Plain text search, applied to various parts of the model depending on endpoint, stateOneOf: [int], typeOneOf: [str]}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint GET /api/v1/automatic-tags/policies/accounts/{accountName}/comments\n@desc Get account auto tag policies on comments\n@required {accountName: str # account name to get auto tag policies}\n@returns(200) {review: [str]} # successful operation\n\n@endpoint PUT /api/v1/automatic-tags/policies/accounts/{accountName}/comments\n@desc Update account auto tag policies on comments\n@required {accountName: str # account name to update auto tag policies}\n@optional {review: [str] # Auto tags that automatically set the comment in review state}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/automatic-tags/accounts/{accountName}/available\n@desc Get account available auto tags\n@required {accountName: str # account name to get auto tag policies}\n@returns(200) {available: [map]} # successful operation\n\n@endpoint GET /api/v1/automatic-tags/server/available\n@desc Get server available auto tags\n@returns(200) {available: [map]} # successful operation\n\n@endpoint GET /api/v1/watched-words/accounts/{accountName}/lists\n@desc List account watched words\n@required {accountName: str # account name to list watched words}\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/watched-words/accounts/{accountName}/lists\n@desc Add account watched words\n@required {accountName: str}\n@optional {listName: str, words: [str]}\n@returns(200) {watchedWordsList: map{id: int}} # successful operation\n\n@endpoint PUT /api/v1/watched-words/accounts/{accountName}/lists/{listId}\n@desc Update account watched words\n@required {accountName: str, listId: str # list of watched words to update}\n@optional {listName: str, words: [str]}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/watched-words/accounts/{accountName}/lists/{listId}\n@desc Delete account watched words\n@required {accountName: str, listId: str # list of watched words to delete}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/watched-words/server/lists\n@desc List server watched words\n@returns(200) {total: int, data: [any]} # successful operation\n\n@endpoint POST /api/v1/watched-words/server/lists\n@desc Add server watched words\n@optional {listName: str, words: [str]}\n@returns(200) {watchedWordsList: map{id: int}} # successful operation\n\n@endpoint PUT /api/v1/watched-words/server/lists/{listId}\n@desc Update server watched words\n@required {listId: str # list of watched words to update}\n@optional {listName: str, words: [str]}\n@returns(204) successful operation\n\n@endpoint DELETE /api/v1/watched-words/server/lists/{listId}\n@desc Delete server watched words\n@required {listId: str # list of watched words to delete}\n@returns(204) successful operation\n\n@endpoint POST /api/v1/client-config/update-language\n@desc Update client language\n@required {language: str # Language code to set}\n@returns(204) successful operation\n\n@endpoint GET /api/v1/video-channels/{channelHandle}/collaborators\n@desc *List channel collaborators\n@required {channelHandle: str # The video channel handle}\n@returns(200) {total: int, data: [map]} # successful operation\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/collaborators/invite\n@desc Invite a collaborator\n@required {channelHandle: str # The video channel handle}\n@optional {accountHandle: str # Local user username to invite}\n@returns(200) {collaborator: map{id: int, account: any, state: map{id: int, label: str}, createdAt: str(date-time), updatedAt: str(date-time)}} # Collaborator invited\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/accept\n@desc Accept a collaboration invitation\n@required {channelHandle: str # The video channel handle, collaboratorId: int # The collaborator id}\n@returns(204) Collaboration accepted\n\n@endpoint POST /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/reject\n@desc Reject a collaboration invitation\n@required {channelHandle: str # The video channel handle, collaboratorId: int # The collaborator id}\n@returns(204) Collaboration rejected\n\n@endpoint DELETE /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}\n@desc Remove a channel collaborator\n@required {channelHandle: str # The video channel handle, collaboratorId: int # The collaborator id}\n@returns(204) successful operation\n\n@endgroup\n\n@end\n"}}