{"note":"OpenAPI conversion -- returning structured metadata","name":"cpy-re-peertube","description":"PeerTube","version":"8.1.0","base_url":"https://peertube2.cpy.re","endpoints":276,"raw":"@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 276\n@hint download_for_search\n@toc static(4), download(1), feeds(4), api(267)\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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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) {total: int, data: [map]} # 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 DELETE /api/v1/videos/ownership/{id}\n@desc Delete ownership change request\n@required {id: any # The object id, uuid or short uuid}\n@returns(204) successful operation\n@errors {403: only users who can manage the video can delete an ownership change request, 404: video ownership change not found}\n\n@endpoint GET /api/v1/videos/{id}/ownership\n@desc List ownership change requests for a video\n@required {id: any # The object id, uuid or short uuid}\n@optional {state: str(WAITING/ACCEPTED/REFUSED) # Filter by ownership change state (WAITING, ACCEPTED, REFUSED), 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@errors {403: cannot manage the video, 404: video 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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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, stateOneOf: any # **PeerTube >= 8.2** **Admins and moderators only** filter on videos that have one of these states, 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"}