> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scraperize.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Channel videos

> Fetches a YouTube channel's videos (its Videos tab, not Shorts or live streams), 30 per page, newest first or sorted by popularity or age. Each video has its id, URL, title, view count (as YouTube shows it in lists, rounded), when it was published ("2 days ago"), duration, thumbnails and a short animated preview, plus premiere time and waiting count for upcoming premieres, members-only and other badges, and the credit line of collaborations. The response also carries a summary of the channel (id, handle, name, avatar, verified, subscribers). Pass exactly one of `channelId`, `handle` or `url`; pass the returned `cursor` back (with the same channel) for the next page. Only publicly available data is returned.

> [!NOTE]
>
> **Cost: 1 credit** per successful request. Errors and cache hits (`cache_max_age`) are free.

> [accordion] Copy for AI assistant
>
> Paste this into ChatGPT, Claude or your coding assistant to generate working code for this endpoint (use the copy button).
>
> ```text Prompt
> I want to make an API call to /v1/youtube/channel-videos. Here are the details:
>
> Endpoint: GET https://api.scraperize.com/v1/youtube/channel-videos
> Description: Fetches a YouTube channel's videos (its Videos tab, not Shorts or live streams), 30 per page, newest first or sorted by popularity or age. Each video has its id, URL, title, view count (as YouTube shows it in lists, rounded), when it was published ("2 days ago"), duration, thumbnails and a short animated preview, plus premiere time and waiting count for upcoming premieres, members-only and other badges, and the credit line of collaborations. The response also carries a summary of the channel (id, handle, name, avatar, verified, subscribers). Pass exactly one of `channelId`, `handle` or `url`; pass the returned `cursor` back (with the same channel) for the next page. Only publicly available data is returned.
>
> Required Headers:
> - x-api-key: Your API key
>
> Parameters:
> - channelId (string): The channel id: `UC` followed by 22 characters, e.g. `UCX6OQ3DkcsbYNE6H8uQQuVA`.
> - handle (string): The channel handle, with or without `@`, e.g. `MrBeast`.
> - url (string): A YouTube channel URL: `/@handle`, `/channel/<id>`, `/c/<name>` or `/user/<name>`, e.g. `https://www.youtube.com/@MrBeast/videos`.
> - sort (select): `latest` (default, newest first), `popular` (most viewed first) or `oldest`. With a `cursor` it can be left out: the cursor keeps its sort.
> - cursor (string): The `cursor` from the previous page, to get the next one. Omit for the first page.
> - cache_max_age (select): Optional. Return a cached result if one this age or newer exists — served for **0 credits** with `meta.cached=true` and `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and refreshes the cache. Omit to always scrape fresh.
>
> Example Response:
> {
>   "data": {
>     "channel": {
>       "id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
>       "handle": "MrBeast",
>       "name": "MrBeast",
>       "url": "https://www.youtube.com/@MrBeast",
>       "avatarUrl": "https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s900-c-k-c0x00ffffff-no-rj",
>       "isVerified": true,
>       "subscriberCount": 525000000
>     },
>     "sort": "latest",
>     "videos": [
>       {
>         "id": "_c2e1NcI3Sc",
>         "url": "https://www.youtube.com/watch?v=_c2e1NcI3Sc",
>         "title": "Beat LeBron In Basketball, Win $100,000",
>         "viewCount": 57000000,
>         "viewCountText": "57M views",
>         "publishedText": "2 days ago",
>         "durationSeconds": 1348,
>         "durationText": "22:28",
>         "isUpcoming": false,
>         "scheduledStartAt": null,
>         "waitingCount": null,
>         "isMembersOnly": false,
>         "badges": [],
>         "collaboratorsText": null,
>         "thumbnailUrl": "https://i.ytimg.com/vi/_c2e1NcI3Sc/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUQko6c_hDclT_NrWCxAJcQVROuQ",
>         "thumbnails": [
>           {
>             "url": "https://i.ytimg.com/vi/_c2e1NcI3Sc/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUQko6c_hDclT_NrWCxAJcQVROuQ",
>             "width": 720,
>             "height": 404
>           }
>         ],
>         "previewUrl": "https://i.ytimg.com/an_webp/_c2e1NcI3Sc/mqdefault_6s.webp?du=3000&sqp=CKHKp9cG&rs=AOn4CLAd3PF6qwddYDNZb0ubw3Be4f2RGg"
>       }
>     ],
>     "count": 30,
>     "cursor": "eyJrIjoiQG1yYmVhc3QiLCJzIjoibGF0ZXN0IiwiYyI6IjRxbUZzZ0xkQ0JJWVZVTllOazlSTTBSclkzTmlXVTVGTmtnNGRWRlJkVlpCR3NBSU9HZGhia0pvY1d0Q2JuRm9RbXB4WlVKbmIydE9la1Y2VG1wQk5G…",
>     "hasMore": true,
>     "fetchedAt": "2026-11-03T13:53:13.751Z"
>   },
>   "meta": {
>     "requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
>     "creditsCharged": 1,
>     "creditsRemaining": 4999,
>     "cached": false
>   }
> }
>
> Please help me write code in my preferred programming language to make this API call and handle the response appropriately. Include error handling and best practices.
> ```


## OpenAPI

````yaml /api-reference/openapi.json get /v1/youtube/channel-videos
openapi: 3.0.3
info:
  title: Scraperize API
  version: 1.0.0
  description: >-
    Extract public data from social media platforms as clean JSON. Endpoints are
    split by platform and by what they return, e.g. `GET /v1/twitter/tweet`.


    ## Authentication

    Send your API key in the `x-api-key` header (or `Authorization: Bearer
    <key>`). Create keys in your dashboard.


    ## Credits

    Each successful live scrape costs **1 credit**. Credits are prepaid and
    never expire.


    ## Caching

    Every endpoint accepts an optional `cache_max_age`
    (`1d`|`3d`|`7d`|`14d`|`30d`). A cache hit within that window is returned for
    **0 credits**.


    ## Responses

    Success returns `{ "data": …, "meta": { "requestId", … } }`. Errors return
    `{ "error": { "code", "message", "requestId" } }` with a matching HTTP
    status. `meta` on a scrape carries `creditsCharged`, `creditsRemaining`,
    `cached`, and (on a hit) `cachedAt`.


    ## Rate limits

    Requests are limited per team per minute; over the limit returns `429` with
    a `Retry-After` header.
servers:
  - url: https://api.scraperize.com
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Twitter
    description: Twitter / X scraping endpoints
  - name: Facebook
    description: Facebook scraping endpoints
  - name: Linkme
    description: Linkme (link.me) scraping endpoints
  - name: Amazon
    description: Amazon (creator shop / storefront) scraping endpoints
  - name: Linkbio
    description: Linkbio (lnk.bio) scraping endpoints
  - name: Pillar
    description: Pillar (pillar.io) scraping endpoints
  - name: Komi
    description: Komi (komi.io) scraping endpoints
  - name: Linktree
    description: Linktree (linktr.ee) scraping endpoints
  - name: Kick
    description: Kick (kick.com) scraping endpoints
  - name: Snapchat
    description: Snapchat (snapchat.com) scraping endpoints
  - name: Telegram
    description: Telegram (t.me) scraping endpoints
  - name: LinkedIn
    description: LinkedIn scraping endpoints
  - name: Twitch
    description: Twitch scraping endpoints
  - name: TikTok
    description: TikTok (tiktok.com) scraping endpoints
  - name: Instagram
    description: Instagram scraping endpoints
  - name: Lagos Life
    description: Lagos Life scraping endpoints
  - name: Bluesky
    description: Bluesky (bsky.app) scraping endpoints
  - name: Threads
    description: Threads (threads.com) scraping endpoints
  - name: Truth Social
    description: Truth Social (truthsocial.com) scraping endpoints
  - name: YouTube
    description: YouTube (youtube.com) scraping endpoints
paths:
  /v1/youtube/channel-videos:
    get:
      tags:
        - YouTube
      summary: Channel videos
      description: >-
        Fetches a YouTube channel's videos (its Videos tab, not Shorts or live
        streams), 30 per page, newest first or sorted by popularity or age. Each
        video has its id, URL, title, view count (as YouTube shows it in lists,
        rounded), when it was published ("2 days ago"), duration, thumbnails and
        a short animated preview, plus premiere time and waiting count for
        upcoming premieres, members-only and other badges, and the credit line
        of collaborations. The response also carries a summary of the channel
        (id, handle, name, avatar, verified, subscribers). Pass exactly one of
        `channelId`, `handle` or `url`; pass the returned `cursor` back (with
        the same channel) for the next page. Only publicly available data is
        returned.
      parameters:
        - name: channelId
          in: query
          required: false
          description: >-
            The channel id: `UC` followed by 22 characters, e.g.
            `UCX6OQ3DkcsbYNE6H8uQQuVA`.
          schema:
            type: string
          example: UCX6OQ3DkcsbYNE6H8uQQuVA
        - name: handle
          in: query
          required: false
          description: The channel handle, with or without `@`, e.g. `MrBeast`.
          schema:
            type: string
          example: MrBeast
        - name: url
          in: query
          required: false
          description: >-
            A YouTube channel URL: `/@handle`, `/channel/<id>`, `/c/<name>` or
            `/user/<name>`, e.g. `https://www.youtube.com/@MrBeast/videos`.
          schema:
            type: string
          example: https://www.youtube.com/@MrBeast/videos
        - name: sort
          in: query
          required: false
          description: >-
            `latest` (default, newest first), `popular` (most viewed first) or
            `oldest`. With a `cursor` it can be left out: the cursor keeps its
            sort.
          schema:
            type: string
            enum:
              - latest
              - popular
              - oldest
            default: latest
          example: popular
        - name: cursor
          in: query
          required: false
          description: >-
            The `cursor` from the previous page, to get the next one. Omit for
            the first page.
          schema:
            type: string
        - name: cache_max_age
          in: query
          required: false
          description: >-
            Optional. Return a cached result if one this age or newer exists —
            served for **0 credits** with `meta.cached=true` and
            `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and
            refreshes the cache. Omit to always scrape fresh.
          schema:
            type: string
            enum:
              - 1d
              - 3d
              - 7d
              - 14d
              - 30d
          example: 7d
      responses:
        '200':
          description: One page of the channel's videos.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      channel:
                        type: object
                      sort:
                        type: string
                        enum:
                          - latest
                          - popular
                          - oldest
                      videos:
                        type: array
                        items:
                          type: object
                      count:
                        type: integer
                      cursor:
                        type: string
                        nullable: true
                      hasMore:
                        type: boolean
                      fetchedAt:
                        type: string
                        format: date-time
                  meta:
                    type: object
                    description: >-
                      requestId + credit/caching metadata (creditsCharged,
                      creditsRemaining, cached, cachedAt).
                required:
                  - data
                  - meta
              example:
                data:
                  channel:
                    id: UCX6OQ3DkcsbYNE6H8uQQuVA
                    handle: MrBeast
                    name: MrBeast
                    url: https://www.youtube.com/@MrBeast
                    avatarUrl: >-
                      https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s900-c-k-c0x00ffffff-no-rj
                    isVerified: true
                    subscriberCount: 525000000
                  sort: latest
                  videos:
                    - id: _c2e1NcI3Sc
                      url: https://www.youtube.com/watch?v=_c2e1NcI3Sc
                      title: Beat LeBron In Basketball, Win $100,000
                      viewCount: 57000000
                      viewCountText: 57M views
                      publishedText: 2 days ago
                      durationSeconds: 1348
                      durationText: '22:28'
                      isUpcoming: false
                      scheduledStartAt: null
                      waitingCount: null
                      isMembersOnly: false
                      badges: []
                      collaboratorsText: null
                      thumbnailUrl: >-
                        https://i.ytimg.com/vi/_c2e1NcI3Sc/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUQko6c_hDclT_NrWCxAJcQVROuQ
                      thumbnails:
                        - url: >-
                            https://i.ytimg.com/vi/_c2e1NcI3Sc/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUQko6c_hDclT_NrWCxAJcQVROuQ
                          width: 720
                          height: 404
                        - url: >-
                            https://i.ytimg.com/vi/_c2e1NcI3Sc/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB4mETeLOvzOsdnpy6Hiw1k-jd1tA
                          width: 360
                          height: 202
                      previewUrl: >-
                        https://i.ytimg.com/an_webp/_c2e1NcI3Sc/mqdefault_6s.webp?du=3000&sqp=CKHKp9cG&rs=AOn4CLAd3PF6qwddYDNZb0ubw3Be4f2RGg
                    - id: RE3_PGwDwhw
                      url: https://www.youtube.com/watch?v=RE3_PGwDwhw
                      title: Lose 150 Lbs Together, Win $250,000
                      viewCount: 177000000
                      viewCountText: 177M views
                      publishedText: 2 weeks ago
                      durationSeconds: 2597
                      durationText: '43:17'
                      isUpcoming: false
                      scheduledStartAt: null
                      waitingCount: null
                      isMembersOnly: false
                      badges: []
                      collaboratorsText: null
                      thumbnailUrl: >-
                        https://i.ytimg.com/vi/RE3_PGwDwhw/hq720_custom_2.jpg?sqp=CIjNp9cG-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC1rDgyOnYiQGS3NYDImEFNnqsTAw
                      thumbnails:
                        - url: >-
                            https://i.ytimg.com/vi/RE3_PGwDwhw/hq720_custom_2.jpg?sqp=CIjNp9cG-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC1rDgyOnYiQGS3NYDImEFNnqsTAw
                          width: 720
                          height: 404
                        - url: >-
                            https://i.ytimg.com/vi/RE3_PGwDwhw/hq720_custom_2.jpg?sqp=CIjNp9cG-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB6rfosDx1fajTlVkQakh_T4Arwew
                          width: 360
                          height: 202
                      previewUrl: >-
                        https://i.ytimg.com/an_webp/RE3_PGwDwhw/mqdefault_6s.webp?du=3000&sqp=CJyup9cG&rs=AOn4CLCSouX_-M50bV4jPf3Wc889LqtZxQ
                    - id: plN7JMbadRg
                      url: https://www.youtube.com/watch?v=plN7JMbadRg
                      title: Eat Everything In A Grocery Store, Win $1,000,000
                      viewCount: 322000000
                      viewCountText: 322M views
                      publishedText: 4 weeks ago
                      durationSeconds: 3479
                      durationText: '57:59'
                      isUpcoming: false
                      scheduledStartAt: null
                      waitingCount: null
                      isMembersOnly: false
                      badges: []
                      collaboratorsText: null
                      thumbnailUrl: >-
                        https://i.ytimg.com/vi/plN7JMbadRg/hq720_custom_3.jpg?sqp=CIjNp9cG-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCQj6UKsOExsesWDiCSmwlWnMyA-g
                      thumbnails:
                        - url: >-
                            https://i.ytimg.com/vi/plN7JMbadRg/hq720_custom_3.jpg?sqp=CIjNp9cG-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCQj6UKsOExsesWDiCSmwlWnMyA-g
                          width: 720
                          height: 404
                        - url: >-
                            https://i.ytimg.com/vi/plN7JMbadRg/hq720_custom_3.jpg?sqp=CIjNp9cG-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDKJaZqCYETPdmeX5k1Hx79NXqIeQ
                          width: 360
                          height: 202
                      previewUrl: >-
                        https://i.ytimg.com/an_webp/plN7JMbadRg/mqdefault_6s.webp?du=3000&sqp=CNDBp9cG&rs=AOn4CLC16VZrdEt4DBIET5tqxHvPWYOF3A
                  count: 30
                  cursor: >-
                    eyJrIjoiQG1yYmVhc3QiLCJzIjoibGF0ZXN0IiwiYyI6IjRxbUZzZ0xkQ0JJWVZVTllOazlSTTBSclkzTmlXVTVGTmtnNGRWRlJkVlpCR3NBSU9HZGhia0pvY1d0Q2JuRm9RbXB4WlVKbmIydE9la1Y2VG1wQk5GbHFRWFJOUkVGM1RVTXdlVnBVUlRCTVZHc3pUVmRSZEU1VVozbE9SRWsxV1cxVk1WbHRWbXBGZGsxR1VWZE9WMDlHV210V2EwWkRVbGRHWm1KdVJqSmlSRUpHVkZkU1JtSklhSGxTUjA1dlVXcGFjbGt4VmpCWk1qVldZMnBTTVU5WFZscGpibXgzWTBkb1lWVlZXbGxrTWxKdFRUQjRUV1JYVmsxVE1IaHhWV3hvZDJGWGJIQlBWV3hUWlVack0yTnNWa2hXU0VaR1VWaFJORkZXUmxOUlZXUTBWRmRPY0U5RVNtNVZSRm94VWtVeGJtTlhTbkpoTURseFZURnZkRmt3WkdwTVYwNVlXbXN4YTA1WE5EVlBSRXAxV2xVd05GWXdlRTFrVjNoRFkwVkdjbFJXT0RGVlZrWlpUak53TWxsc1JtOVJibXhoVlc1c2RrNHlNVWRhVnpCNFRrVlNTRlZGVmt0U01taE5XakJzUlZaVWFFcGtSV3hGWlcxU2JreFlaSGhVYVRGTFVWaFdWbEpHUm5OYVYzUjJUMFpDV1ZOWVpHOWxSazUwVlZWb1IxZEZSbGRhU0hCSVZXeG9NMkpIVW5saU1EbEZWMFY0ZW1ReGJHMWlNbVJDVkZaVk1sRnNZek5XTUhCeFlUQkdkbUZZVWxWVGEwNW1aVlZuTkZKc2JHbFRNWEExWkRKT2QyUXlPWFpPTTJ3ellqTnZlVkpIWkU5VWVtdDVXa2RzVlZadVFrSldhMlJNVlcxa2QyUXpWak5SVjBaS1kxaGFVMU5GVWpCa01taEhaRVJCTldNeU9WWllNVUkwWVROd2RsVXhaR0ZoYVRGSlVsWlJNVlpVWnpCalNHaERUbnBTY2sxc1JUUmlNRmt5VFc1Q01HUnNTVEZSVmxKMFUzcE9ObFo2Ykc5aGJFSlFXa1JhUW1WSWJHdE9TR1F4WlVWYVdsUXpUa1pTU0ZWMFlsaHdjV1ZHVmt4V1ZVMTVWbTV3VUZKSWJFSmhWa0UwWXpKV00xbFdiRmhoU0hCWlZETmplRnBXVG5SaFZHUXdZVVZHVWxscmNIUk9WRXB2VTJ0Wk1sUnJWalpoUlVVeVpWZHdiVnBIYkVwTlZWSnRWMVJzU0dScldUUmFSbVJMVTJ4a2VWVlhhekZOVnpnelVqSk9SRmx0VmpST2EwWlRZMjVvV2xKdGF6VmxTSEEyVkZkMFRsa3haRzlNVkZKellXeENSRmxyVFROaGEyUnlZVU14V2xWclJreFdhM1JDVGtWT1ZWcHFTVEJQVnprMFYycE9aazFZVlRGWlZXeE5WRlJXUzJWSVRrcGFhMFY1WVVSRk5FOVhWblZVTUVZMVV6TnZNMWd6V1hSVGJuQTJWa1JPV21GSVRqUk5NblJ5VlVZNU5Ga3hUbWxOV0VabVl6TldUMUZzVG14VWFtUjVZekpXU0ZReFNrOWxhM1JHVGpKT2FGVjVNVkJOYm1odVUwaEtUbFZZV25GTlZURlpaREpXU2xsclRUQmhiWFF5WVZoa1dtRkZjSGhUTTFaMFltdEdjVk5VYUhCYVZHUnBUMGhDY0dKRldtNVpWMlJTVjBaQ1dsSXhWbFpXTVdSRFdURmtTbVJZYUdwUFZVNTVWRVJDVDFsWGVGSlVibEpvVmxoc05WaDZTa3RTV0ZvelQxVTVabFZETVhOak1GSk9WVE5WZEZwSVVtaFZSbVJoVEZST1ExTjZUVEJXTWpGMlkwVlNORXhYTVRSVE1scDBVbTFHU2xOVWFHOVNiSEJMWkd4Uk1HTnJhR3RaVldSVlRraEplbUpZU2tWalJqbFVVVmhDV0UxVVFUTlJiVGg2V25wTk1WTXdNWEZrVld0WlFrRWxNMFFsTTBRJTNEIiwiY2giOnsiaWQiOiJVQ1g2T1EzRGtjc2JZTkU2SDh1UVF1VkEiLCJoYW5kbGUiOiJNckJlYXN0IiwibmFtZSI6Ik1yQmVhc3QiLCJ1cmwiOiJodHRwczovL3d3dy55b3V0dWJlLmNvbS9ATXJCZWFzdCIsImF2YXRhclVybCI6Imh0dHBzOi8veXQzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9ueFlyY18xXzJmNzdEb0JhZHl4TVRtdjdacFJaYXBIUjVqYnVZZTdQbFBkNWNJUkp4dE5ORVl5T0MwWnN4YUR5Skp6WHJuSml1REU9czkwMC1jLWstYzB4MDBmZmZmZmYtbm8tcmoiLCJpc1ZlcmlmaWVkIjp0cnVlLCJzdWJzY3JpYmVyQ291bnQiOjUyNTAwMDAwMH19
                  hasMore: true
                  fetchedAt: '2026-11-03T13:53:13.751Z'
                meta:
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
                  creditsCharged: 1
                  creditsRemaining: 4999
                  cached: false
        '400':
          description: >-
            Invalid or expired cursor (or one for another channel or sort
            order).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: BAD_REQUEST
                  message: The request was invalid.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '401':
          description: Missing, invalid, or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: UNAUTHORIZED
                  message: API key required — pass it in the `x-api-key` header.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '402':
          description: Not enough credits for this request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: INSUFFICIENT_CREDITS
                  message: >-
                    This request costs 1 credit, but your balance is 0. Top up
                    to continue.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '404':
          description: No YouTube channel found (it may not exist or have been removed).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: NOT_FOUND
                  message: >-
                    The requested content was not found (it may not exist, be
                    deleted, or be private).
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '422':
          description: >-
            Invalid query parameters (pass exactly one of channelId, handle or
            url).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: Request validation failed
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
                  details:
                    - path: url
                      message: url is required
        '429':
          description: Over the per-minute rate limit — honour `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: RATE_LIMITED
                  message: >-
                    Rate limit exceeded — max 100 requests per 60s. Retry in
                    ~30s.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
        '503':
          description: >-
            Temporarily unavailable — retry after `Retry-After`. `error.code`
            tells you why: `UPSTREAM_BLOCKED` (the source blocked this request),
            `EXTRACTION_FAILED` (the source returned unexpected data),
            `PLATFORM_UNAVAILABLE` (the source is down), or
            `SERVICE_UNAVAILABLE` (we are at capacity).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: UPSTREAM_BLOCKED
                  message: >-
                    The source is temporarily unavailable. Please try again
                    shortly.
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: NOT_FOUND
            message:
              type: string
              example: The requested content was not found.
            requestId:
              type: string
              example: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
            details:
              type: array
              items:
                type: object
              description: Present on validation errors.
          required:
            - code
            - message
            - requestId
      required:
        - error
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Your API key. Send it in the `x-api-key` header (or `Authorization:
        Bearer <key>`). Create and manage keys from your dashboard.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.