PeerTube Video Channels API

Operations dealing with the creation, modification and listing of videos within a channel.

OpenAPI Specification

peertube-video-channels-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: PeerTube Abuses Video Channels API
  version: 8.1.0
  contact:
    name: PeerTube Community
    url: https://joinpeertube.org
  license:
    name: AGPLv3.0
    url: https://github.com/Chocobozzz/PeerTube/blob/master/LICENSE
  x-logo:
    url: https://joinpeertube.org/img/brand.png
    altText: PeerTube Project Homepage
  description: "The PeerTube API is built on HTTP(S) and is RESTful. You can use your favorite\nHTTP/REST library for your programming language to use PeerTube.\n\nSee the [REST API quick start](https://docs.joinpeertube.org/api/rest-getting-started) for a few\nexamples of using the PeerTube API.\n\n# Authentication\n\nWhen you sign up for an account on a PeerTube instance, you are given the possibility\nto generate sessions on it, and authenticate there using an access token. Only __one\naccess token can currently be used at a time__.\n\n## Roles\n\nAccounts are given permissions based on their role. There are three roles on\nPeerTube: Administrator, Moderator, and User. See the [roles guide](https://docs.joinpeertube.org/admin/managing-users#roles) for a detail of their permissions.\n\n# Errors\n\nThe API uses standard HTTP status codes to indicate the success or failure\nof the API call, completed by a [RFC7807-compliant](https://tools.ietf.org/html/rfc7807) response body.\n\n```\nHTTP 1.1 404 Not Found\nContent-Type: application/problem+json; charset=utf-8\n\n{\n  \"detail\": \"Video not found\",\n  \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n  \"status\": 404,\n  \"title\": \"Not Found\",\n  \"type\": \"about:blank\"\n}\n```\n\nWe provide error `type` (following RFC7807) and `code` (internal PeerTube code) values for [a growing number of cases](https://github.com/Chocobozzz/PeerTube/blob/develop/packages/models/src/server/server-error-code.enum.ts),\nbut it is still optional. Types are used to disambiguate errors that bear the same status code\nand are non-obvious:\n\n```\nHTTP 1.1 403 Forbidden\nContent-Type: application/problem+json; charset=utf-8\n\n{\n  \"detail\": \"Cannot get this video regarding follow constraints\",\n  \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n  \"status\": 403,\n  \"title\": \"Forbidden\",\n  \"type\": \"https://docs.joinpeertube.org/api-rest-reference.html#section/Errors/does_not_respect_follow_constraints\"\n}\n```\n\nHere a 403 error could otherwise mean that the video is private or blocklisted.\n\n### Validation errors\n\nEach parameter is evaluated on its own against a set of rules before the route validator\nproceeds with potential testing involving parameter combinations. Errors coming from validation\nerrors appear earlier and benefit from a more detailed error description:\n\n```\nHTTP 1.1 400 Bad Request\nContent-Type: application/problem+json; charset=utf-8\n\n{\n  \"detail\": \"Incorrect request parameters: id\",\n  \"docs\": \"https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo\",\n  \"instance\": \"/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180\",\n  \"invalid-params\": {\n    \"id\": {\n      \"location\": \"params\",\n      \"msg\": \"Invalid value\",\n      \"param\": \"id\",\n      \"value\": \"9c9de5e8-0a1e-484a-b099-e80766180\"\n    }\n  },\n  \"status\": 400,\n  \"title\": \"Bad Request\",\n  \"type\": \"about:blank\"\n}\n```\n\nWhere `id` is the name of the field concerned by the error, within the route definition.\n`invalid-params.<field>.location` can be either 'params', 'body', 'header', 'query' or 'cookies', and\n`invalid-params.<field>.value` reports the value that didn't pass validation whose `invalid-params.<field>.msg`\nis about.\n\n### Deprecated error fields\n\nSome fields could be included with previous versions. They are still included but their use is deprecated:\n- `error`: superseded by `detail`\n\n# Rate limits\n\nWe are rate-limiting all endpoints of PeerTube's API. Custom values can be set by administrators:\n\n| Endpoint (prefix: `/api/v1`) | Calls         | Time frame   |\n|------------------------------|---------------|--------------|\n| `/*`                         | 50            | 10 seconds   |\n| `POST /users/token`          | 15            | 5 minutes    |\n| `POST /users/register`       | 2<sup>*</sup> | 5 minutes    |\n| `POST /users/ask-send-verify-email` | 3      | 5 minutes    |\n\nDepending on the endpoint, <sup>*</sup>failed requests are not taken into account. A service\nlimit is announced by a `429 Too Many Requests` status code.\n\nYou can get details about the current state of your rate limit by reading the\nfollowing headers:\n\n| Header                  | Description                                                |\n|-------------------------|------------------------------------------------------------|\n| `X-RateLimit-Limit`     | Number of max requests allowed in the current time period  |\n| `X-RateLimit-Remaining` | Number of remaining requests in the current time period    |\n| `X-RateLimit-Reset`     | Timestamp of end of current time period as UNIX timestamp  |\n| `Retry-After`           | Seconds to delay after the first `429` is received         |\n\n# CORS\n\nThis API features [Cross-Origin Resource Sharing (CORS)](https://fetch.spec.whatwg.org/),\nallowing cross-domain communication from the browser for some routes:\n\n| Endpoint                    |\n|------------------------- ---|\n| `/api/*`                    |\n| `/download/*`               |\n| `/lazy-static/*`            |\n| `/.well-known/webfinger`    |\n\nIn addition, all routes serving ActivityPub are CORS-enabled for all origins.\n"
servers:
- url: https://peertube2.cpy.re
  description: Live Test Server (live data - latest nightly version)
- url: https://peertube3.cpy.re
  description: Live Test Server (live data - latest RC version)
- url: https://peertube.cpy.re
  description: Live Test Server (live data - stable version)
tags:
- name: Video Channels
  description: Operations dealing with the creation, modification and listing of videos within a channel.
paths:
  /api/v1/video-channels:
    get:
      summary: List video channels
      operationId: getVideoChannels
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/sort'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoChannelList'
    post:
      summary: Create a video channel
      operationId: addVideoChannel
      security:
      - OAuth2: []
      tags:
      - Video Channels
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  videoChannel:
                    type: object
                    properties:
                      id:
                        $ref: '#/components/schemas/id'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VideoChannelCreate'
  /api/v1/video-channels/{channelHandle}:
    get:
      summary: Get a video channel
      operationId: getVideoChannel
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoChannel'
    put:
      summary: Update a video channel
      operationId: putVideoChannel
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '204':
          description: successful operation
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VideoChannelUpdate'
    delete:
      summary: Delete a video channel
      operationId: delVideoChannel
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '204':
          description: successful operation
  /api/v1/video-channels/{channelHandle}/videos:
    get:
      summary: List videos of a video channel
      operationId: getVideoChannelVideos
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/skipCount'
      - $ref: '#/components/parameters/videosSort'
      - $ref: '#/components/parameters/nsfw'
      - $ref: '#/components/parameters/nsfwFlagsIncluded'
      - $ref: '#/components/parameters/nsfwFlagsExcluded'
      - $ref: '#/components/parameters/isLive'
      - $ref: '#/components/parameters/includeScheduledLive'
      - $ref: '#/components/parameters/categoryOneOf'
      - $ref: '#/components/parameters/licenceOneOf'
      - $ref: '#/components/parameters/languageOneOf'
      - $ref: '#/components/parameters/tagsOneOf'
      - $ref: '#/components/parameters/tagsAllOf'
      - $ref: '#/components/parameters/isLocal'
      - $ref: '#/components/parameters/include'
      - $ref: '#/components/parameters/hasHLSFiles'
      - $ref: '#/components/parameters/hasWebVideoFiles'
      - $ref: '#/components/parameters/host'
      - $ref: '#/components/parameters/autoTagOneOfVideo'
      - $ref: '#/components/parameters/stateOneOfVideo'
      - $ref: '#/components/parameters/privacyOneOf'
      - $ref: '#/components/parameters/excludeAlreadyWatched'
      - $ref: '#/components/parameters/search'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoListResponse'
  /api/v1/video-channels/{channelHandle}/activities:
    get:
      summary: List activities of a video channel
      description: '**PeerTube >= 8.0**'
      operationId: listVideoChannelActivities
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/sort'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChannelActivityListResponse'
  /api/v1/video-channels/{channelHandle}/video-playlists:
    get:
      summary: List playlists of a channel
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/sort'
      - $ref: '#/components/parameters/videoPlaylistType'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: integer
                    example: 1
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/VideoPlaylist'
  /api/v1/video-channels/{channelHandle}/video-playlists/reorder:
    post:
      summary: Reorder channel playlists
      operationId: reorderVideoPlaylistsOfChannel
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '204':
          description: successful operation
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                startPosition:
                  type: integer
                  description: Start position of the element to reorder
                  minimum: 1
                insertAfterPosition:
                  type: integer
                  description: New position for the block to reorder, to add the block before the first element
                  minimum: 0
                reorderLength:
                  type: integer
                  description: How many element from `startPosition` to reorder
                  minimum: 1
              required:
              - startPosition
              - insertAfterPosition
  /api/v1/video-channels/{channelHandle}/followers:
    get:
      tags:
      - Video Channels
      summary: List followers of a video channel
      security:
      - OAuth2: []
      operationId: getVideoChannelFollowers
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/followersSort'
      - $ref: '#/components/parameters/search'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: integer
                    example: 1
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Follow'
  /api/v1/video-channels/{channelHandle}/avatar/pick:
    post:
      summary: Update channel avatar
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  avatars:
                    type: array
                    items:
                      $ref: '#/components/schemas/ActorImage'
        '413':
          description: image file too large
          headers:
            X-File-Maximum-Size:
              schema:
                type: string
                format: Nginx size
              description: Maximum file size for the avatar
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                avatarfile:
                  description: The file to upload.
                  type: string
                  format: binary
            encoding:
              avatarfile:
                contentType: image/png, image/jpeg
  /api/v1/video-channels/{channelHandle}/avatar:
    delete:
      summary: Delete channel avatar
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '204':
          description: successful operation
  /api/v1/video-channels/{channelHandle}/banner/pick:
    post:
      summary: Update channel banner
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  banners:
                    type: array
                    items:
                      $ref: '#/components/schemas/ActorImage'
        '413':
          description: image file too large
          headers:
            X-File-Maximum-Size:
              schema:
                type: string
                format: Nginx size
              description: Maximum file size for the banner
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                bannerfile:
                  description: The file to upload.
                  type: string
                  format: binary
            encoding:
              bannerfile:
                contentType: image/png, image/jpeg
  /api/v1/video-channels/{channelHandle}/banner:
    delete:
      summary: Delete channel banner
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '204':
          description: successful operation
  /api/v1/video-channels/{channelHandle}/import-videos:
    post:
      summary: Import videos in channel
      description: Import a remote channel/playlist videos into a channel
      security:
      - OAuth2: []
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ImportVideosInChannelCreate'
      responses:
        '204':
          description: successful operation
  /api/v1/accounts/{name}/video-channels:
    get:
      summary: List video channels of an account
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/name'
      - name: withStats
        in: query
        description: include daily view statistics for the last 30 days and total views (only if authenticated as the account user)
        schema:
          type: boolean
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/sort'
      - $ref: '#/components/parameters/includeCollaborations'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoChannelList'
  /api/v1/accounts/{name}/video-channel-syncs:
    get:
      summary: List the synchronizations of video channels of an account
      tags:
      - Video Channels
      parameters:
      - $ref: '#/components/parameters/name'
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/sort'
      - $ref: '#/components/parameters/includeCollaborations'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoChannelSyncList'
  /api/v1/search/video-channels:
    get:
      tags:
      - Video Channels
      summary: Search channels
      operationId: searchChannels
      parameters:
      - name: search
        in: query
        required: true
        description: '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.

          '
        schema:
          type: string
      - $ref: '#/components/parameters/start'
      - $ref: '#/components/parameters/count'
      - $ref: '#/components/parameters/searchTarget'
      - $ref: '#/components/parameters/sort'
      - $ref: '#/components/parameters/host'
      - $ref: '#/components/parameters/handles'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoChannelList'
        '500':
          description: search index unavailable
  /api/v1/video-channels/{channelHandle}/collaborators:
    get:
      tags:
      - Video Channels
      summary: List channel collaborators
      description: '**PeerTube >= 8.0**'
      operationId: listVideoChannelCollaborators
      security:
      - OAuth2: []
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: integer
                    example: 1
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/VideoChannelCollaborator'
  /api/v1/video-channels/{channelHandle}/collaborators/invite:
    post:
      tags:
      - Video Channels
      summary: Invite a collaborator
      operationId: inviteVideoChannelCollaborator
      description: '**PeerTube >= 8.0**  Invite a local user to collaborate on the specified video channel.'
      security:
      - OAuth2: []
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                accountHandle:
                  type: string
                  description: Local user username to invite
      responses:
        '200':
          description: Collaborator invited
          content:
            application/json:
              schema:
                type: object
                properties:
                  collaborator:
                    $ref: '#/components/schemas/VideoChannelCollaborator'
  /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/accept:
    post:
      tags:
      - Video Channels
      summary: Accept a collaboration invitation
      description: '**PeerTube >= 8.0**'
      operationId: acceptVideoChannelCollaborator
      security:
      - OAuth2: []
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/collaboratorId'
      responses:
        '204':
          description: Collaboration accepted
  /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}/reject:
    post:
      tags:
      - Video Channels
      summary: Reject a collaboration invitation
      description: '**PeerTube >= 8.0**'
      operationId: rejectVideoChannelCollaborator
      security:
      - OAuth2: []
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/collaboratorId'
      responses:
        '204':
          description: Collaboration rejected
  /api/v1/video-channels/{channelHandle}/collaborators/{collaboratorId}:
    delete:
      tags:
      - Video Channels
      summary: Remove a channel collaborator
      description: '**PeerTube >= 8.0** Only the channel owner or the collaborator themselves can remove a collaborator from a channel'
      operationId: removeVideoChannelCollaborator
      security:
      - OAuth2: []
      parameters:
      - $ref: '#/components/parameters/channelHandle'
      - $ref: '#/components/parameters/collaboratorId'
      responses:
        '204':
          description: successful operation
components:
  schemas:
    VideoPlaylistTypeConstant:
      properties:
        id:
          $ref: '#/components/schemas/VideoPlaylistTypeSet'
        label:
          type: string
    VideoConstantNumber-Licence:
      properties:
        id:
          $ref: '#/components/schemas/VideoLicenceSet'
        label:
          type: string
          example: Attribution - Share Alike
    VideoConstantString-Language:
      properties:
        id:
          $ref: '#/components/schemas/VideoLanguageSet'
        label:
          type: string
          example: English
    ImportVideosInChannelCreate:
      type: object
      properties:
        externalChannelUrl:
          type: string
          example: https://youtube.com/c/UC_myfancychannel
        videoChannelSyncId:
          type: integer
          description: If part of a channel sync process, specify its id to assign video imports to this channel synchronization
      required:
      - externalChannelUrl
    VideoStateConstant:
      properties:
        id:
          type: integer
          enum:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
          description: 'The video state:

            - `1`: Published

            - `2`: To transcode

            - `3`: To import

            - `4`: Waiting for live stream

            - `5`: Live ended

            - `6`: To move to an external storage (object storage...)

            - `7`: Transcoding failed

            - `8`: Moving to an external storage failed

            - `9`: To edit using studio edition feature

            '
        label:
          type: string
    username:
      type: string
      description: immutable name of the user, used to find or mention its actor
      example: chocobozzz
      pattern: /^[a-z0-9._]+$/
      minLength: 1
      maxLength: 50
    VideoChannelCollaborator:
      type: object
      description: Representation of a channel collaboration
      properties:
        id:
          $ref: '#/components/schemas/id'
        account:
          $ref: '#/components/schemas/AccountSummary'
        state:
          type: object
          properties:
            id:
              $ref: '#/components/schemas/VideoChannelCollaboratorState'
            label:
              type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    ActorImage:
      properties:
        path:
          description: Deprecated in PeerTube v8.0, use fileUrl instead
          deprecated: true
          type: string
        fileUrl:
          description: '**PeerTube >= 7.1**'
          type: string
        width:
          type: integer
        height:
          type: integer
          description: '**PeerTube >= 7.3**'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    VideoChannelSummary:
      properties:
        id:
          $ref: '#/components/schemas/id'
        name:
          type: string
        displayName:
          type: string
        url:
          type: string
          format: url
        host:
          type: string
          format: hostname
        avatars:
          type: array
          items:
            $ref: '#/components/schemas/ActorImage'
    VideoPlaylist:
      properties:
        id:
          $ref: '#/components/schemas/id'
        uuid:
          $ref: '#/components/schemas/UUIDv4'
        shortUUID:
          allOf:
          - $ref: '#/components/schemas/shortUUID'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        description:
          type: string
          minLength: 3
          maxLength: 1000
        displayName:
          type: string
          minLength: 1
          maxLength: 120
        isLocal:
          type: boolean
        videoLength:
          type: integer
          minimum: 0
        thumbnailPath:
          description: Deprecated in PeerTube v8.1, use thumbnails instead
          deprecated: true
          type: string
        thumbnails:
          description: '**PeerTube >= 8.1** Array of thumbnails for the playlist'
          type: array
          items:
            $ref: '#/components/schemas/Thumbnail'
        privacy:
          $ref: '#/components/schemas/VideoPlaylistPrivacyConstant'
        type:
          $ref: '#/components/schemas/VideoPlaylistTypeConstant'
        ownerAccount:
          $ref: '#/components/schemas/AccountSummary'
        videoChannel:
          $ref: '#/components/schemas/VideoChannelSummary'
        videoChannelPosition:
          type: integer
          minimum: 1
          description: Position of the playlist in the channel
    VideoChannelUpdate:
      allOf:
      - $ref: '#/components/schemas/VideoChannelEdit'
      - properties:
          bulkVideosSupportUpdate:
            type: boolean
            description: Update the support field for all videos of this channel
    VideoPrivacySet:
      type: integer
      enum:
      - 1
      - 2
      - 3
      - 4
      - 5
      description: privacy id of the video (see [/videos/privacies](#operation/getVideoPrivacyPolicies))
    AccountSummary:
      properties:
        id:
          type: integer
        name:
          type: string
        displayName:
          type: string
        url:
          type: string
          format: url
        host:
          type: string
          format: hostname
        avatars:
          type: array
          items:
            $ref: '#/components/schemas/ActorImage'
    VideoPlaylistPrivacyConstant:
      properties:
        id:
          $ref: '#/components/schemas/VideoPlaylistPrivacySet'
        label:
          type: string
    VideoCategorySet:
      type: integer
      description: category id of the video (see [/videos/categories](#operation/getCategories))
      example: 15
    usernameChannel:
      type: string
      description: immutable name of the channel, used to interact with its actor
      example: framasoft_videos
      pattern: /^[a-zA-Z0-9\\-_.:]+$/
      minLength: 1
      maxLength: 50
    VideoChannelActivityAction:
      type: integer
      enum:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      - 10
      - 11
      description: "The activity action:\n  - CREATE: 1\n  - UPDATE: 2\n  - DELETE: 3\n  - UPDATE_CAPTIONS: 4\n  - UPDATE_CHAPTERS: 5\n  - UPDATE_PASSWORDS: 6\n  - CREATE_STUDIO_TASKS: 7\n  - UPDATE_SOURCE_FILE: 8\n  - UPDATE_ELEMENTS: 9\n  - REMOVE_CHANNEL_OWNERSHIP: 10\n  - CREATE_CHANNEL_OWNERSHIP: 11\n"
    VideoListResponse:
      properties:
        total:
          type: integer
          example: 1
        data:
          type: array
          maxItems: 100
          items:
            $ref: '#/components/schemas/Video'
    VideoChannelSync:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/id'
        state:
          type: object
          properties:
            id:
              type: integer
              example: 2
            label:
              type: string
              example: PROCESSING
        externalChannelUrl:
          type: string
          example: https://youtube.com/c/UC_myfancychannel
        createdAt:
          type: string
          format: date-time
        lastSyncAt:
          type: string
          format: date-time
          nullable: true
        channel:
          $ref: '#/components/schemas/VideoChannel'
    VideoPrivacyConstant:
      properties:
        id:
          $ref: '#/components/schemas/VideoPrivacySet'
        label:
          type: string
    id:
      type: integer
      minimum: 1
      example: 42
    Video:
      properties:
        id:
          description: object id for the video
          allOf:
          - $ref: '#/components/schemas/id'
        uuid:
          description: universal identifier for the video, that can be used across instances
          allOf:
          - $ref: '#/components/schemas/UUIDv4'
        shortUUID:
          allOf:
          - $ref: '#/components/schemas/shortUUID'
        isLive:
          type: boolean
        liveSchedules:
          type: array
          items:
            $ref: '#/components/schemas/LiveSchedule'
        createdAt:
          type: string
          format: date-time
          example: '2017-10-01T10:52:46.396000+00:00'
          description: time at which the video object was first drafted
        publishedAt:
          type: string
          format: date-time
          example: '2018-10-01T10:52:46.396000+00:00'
          description: time at which the video was marked as ready for playback (with restrictions depending on `privacy`). Usually set after a `state` evolution.
        updatedAt:
          type: string
          format: date-time
          example: '2021-05-04T08:01:01.502000+00:00'
          description: last time the video's metadata was modified
        originallyPublishedAt:
          type: string
          nullable: true
          format: date-time
          example: '2010-10-01T10:52:46.396000+00:00'
          description: used to represent a date of first pu

# --- truncated at 32 KB (57 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/peertube/refs/heads/main/openapi/peertube-video-channels-api-openapi.yml