> ## 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.

# Video transcript

> Fetches the transcript of a YouTube video or Short — the same one YouTube shows under "Show transcript" — from its uploaded or auto-generated captions. Each segment has its start and end time (seconds, to the millisecond), its timestamp as shown ("0:18"), its text and, for videos with chapters, the chapter it belongs to; the whole transcript also comes as one `transcript` text. Pick the language with `language` (e.g. `en`, `es`, `pt-BR`; uploaded captions are preferred over auto-generated ones) or leave it out for the one YouTube picks by default. The response says which captions were used and lists every language its transcript is available in. Not included: YouTube's machine translation, and on videos with YouTube's dubbed audio the captions generated from the dubs (the transcript follows the original audio; uploaded subtitles in any language still work). 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/video/transcript. Here are the details:
>
> Endpoint: GET https://api.scraperize.com/v1/youtube/video/transcript
> Description: Fetches the transcript of a YouTube video or Short — the same one YouTube shows under "Show transcript" — from its uploaded or auto-generated captions. Each segment has its start and end time (seconds, to the millisecond), its timestamp as shown ("0:18"), its text and, for videos with chapters, the chapter it belongs to; the whole transcript also comes as one `transcript` text. Pick the language with `language` (e.g. `en`, `es`, `pt-BR`; uploaded captions are preferred over auto-generated ones) or leave it out for the one YouTube picks by default. The response says which captions were used and lists every language its transcript is available in. Not included: YouTube's machine translation, and on videos with YouTube's dubbed audio the captions generated from the dubs (the transcript follows the original audio; uploaded subtitles in any language still work). Only publicly available data is returned.
>
> Required Headers:
> - x-api-key: Your API key
>
> Parameters:
> - url (string) [required]: A YouTube video or Short URL — `youtube.com/watch?v=<id>`, `youtu.be/<id>`, `youtube.com/shorts/<id>`.
> - language (string): The captions' language: a code like `en` (matches any region, e.g. `en-US`) or a full one like `pt-BR`. Defaults to the captions YouTube shows first.
> - 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": {
>     "video": {
>       "id": "dQw4w9WgXcQ",
>       "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
>       "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
>       "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
>       "channelName": "Rick Astley",
>       "durationSeconds": 213,
>       "isShort": false
>     },
>     "transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ♪ A full commitment's what I'm thinking of ♪ ♪ You wouldn't get this from any other guy …",
>     "language": "English",
>     "languageCode": "en",
>     "isAutoGenerated": false,
>     "segments": [
>       {
>         "start": 1,
>         "end": 3.04,
>         "timestamp": "0:01",
>         "text": "[♪♪♪]",
>         "chapter": null
>       }
>     ],
>     "chapters": [],
>     "availableLanguages": [
>       {
>         "languageCode": "en",
>         "language": "English",
>         "isAutoGenerated": false
>       }
>     ],
>     "segmentCount": 24,
>     "fetchedAt": "2026-11-05T17:46:32.413Z"
>   },
>   "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/video/transcript
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: Reddit
    description: Reddit (reddit.com) scraping endpoints
  - name: Rumble
    description: Rumble (rumble.com) scraping endpoints
  - name: Truth Social
    description: Truth Social (truthsocial.com) scraping endpoints
  - name: YouTube
    description: YouTube (youtube.com) scraping endpoints
paths:
  /v1/youtube/video/transcript:
    get:
      tags:
        - YouTube
      summary: Video transcript
      description: >-
        Fetches the transcript of a YouTube video or Short — the same one
        YouTube shows under "Show transcript" — from its uploaded or
        auto-generated captions. Each segment has its start and end time
        (seconds, to the millisecond), its timestamp as shown ("0:18"), its text
        and, for videos with chapters, the chapter it belongs to; the whole
        transcript also comes as one `transcript` text. Pick the language with
        `language` (e.g. `en`, `es`, `pt-BR`; uploaded captions are preferred
        over auto-generated ones) or leave it out for the one YouTube picks by
        default. The response says which captions were used and lists every
        language its transcript is available in. Not included: YouTube's machine
        translation, and on videos with YouTube's dubbed audio the captions
        generated from the dubs (the transcript follows the original audio;
        uploaded subtitles in any language still work). Only publicly available
        data is returned.
      parameters:
        - name: url
          in: query
          required: true
          description: >-
            A YouTube video or Short URL — `youtube.com/watch?v=<id>`,
            `youtu.be/<id>`, `youtube.com/shorts/<id>`.
          schema:
            type: string
          example: https://www.youtube.com/watch?v=dQw4w9WgXcQ
        - name: language
          in: query
          required: false
          description: >-
            The captions' language: a code like `en` (matches any region, e.g.
            `en-US`) or a full one like `pt-BR`. Defaults to the captions
            YouTube shows first.
          schema:
            type: string
          example: en
        - 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: The transcript.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      video:
                        type: object
                      transcript:
                        type: string
                      language:
                        type: string
                        nullable: true
                      languageCode:
                        type: string
                      isAutoGenerated:
                        type: boolean
                      availableLanguages:
                        type: array
                        items:
                          type: object
                      segments:
                        type: array
                        items:
                          type: object
                      chapters:
                        type: array
                        items:
                          type: object
                      segmentCount:
                        type: integer
                      fetchedAt:
                        type: string
                        format: date-time
                  meta:
                    type: object
                    description: >-
                      requestId + credit/caching metadata (creditsCharged,
                      creditsRemaining, cached, cachedAt).
                required:
                  - data
                  - meta
              example:
                data:
                  video:
                    id: dQw4w9WgXcQ
                    url: https://www.youtube.com/watch?v=dQw4w9WgXcQ
                    title: >-
                      Rick Astley - Never Gonna Give You Up (Official Video) (4K
                      Remaster)
                    channelId: UCuAXFkgsw1L7xaCfnd5JJOw
                    channelName: Rick Astley
                    durationSeconds: 213
                    isShort: false
                  transcript: >-
                    [♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules
                    and so do I ♪ ♪ A full commitment's what I'm thinking of ♪ ♪
                    You wouldn't get this from any other guy ♪ ♪ I just wanna
                    tell you how I'm feeling ♪ ♪ Gotta make you understand ♪ ♪
                    Never gonna give you up ♪ ♪ Never gonna let you down ♪ ♪
                    Never gonna run around and desert you ♪ ♪ Never gonna make
                    you cry ♪ ♪ Never gonna say goodbye ♪ ♪ Never gonna tell a
                    lie and hurt you ♪ ♪ We've known each other for so long ♪ ♪
                    Your heart's been aching but you're too shy to say it ♪ ♪
                    Inside we both know what's been going ♪ ♪ We know the game
                    and we're gonna play it ♪ ♪ And if you ask me how I'm
                    feeling ♪ ♪ Don't tell me you're too blind to see ♪ ♪ Never
                    gonna give you up ♪ ♪ Never gonna let you down ♪ ♪ Never
                    gonna run around and desert you ♪ ♪ Never gonna make you cry
                    ♪ ♪ Never gonna say goodbye ♪ ♪ Never gonna tell a lie and
                    hurt you ♪ ♪ Never gonna give you up ♪ ♪ Never gonna let you
                    down ♪ ♪ Never gonna run around and desert you ♪ ♪ Never
                    gonna make you cry ♪ ♪ Never gonna say goodbye ♪ ♪ Never
                    gonna tell a lie and hurt you ♪ ♪ (Ooh, give you up) ♪ ♪
                    (Ooh, give you up) ♪ ♪ Never gonna give, never gonna give ♪
                    ♪ (Give you up) ♪ ♪ Never gonna give, never gonna give ♪ ♪
                    (Give you up) ♪ ♪ We've known each other for so long ♪ ♪
                    Your heart's been aching but you're too shy to say it ♪ ♪
                    Inside we both know what's been going ♪ ♪ We know the game
                    and we're gonna play it ♪ ♪ I just wanna tell you how I'm
                    feeling ♪ ♪ Gotta make you understand ♪ ♪ Never gonna give
                    you up ♪ ♪ Never gonna let you down ♪ ♪ Never gonna run
                    around and desert you ♪ ♪ Never gonna make you cry ♪ ♪ Never
                    gonna say goodbye ♪ ♪ Never gonna tell a lie and hurt you ♪
                    ♪ Never gonna give you up ♪ ♪ Never gonna let you down ♪ ♪
                    Never gonna run around and desert you ♪ ♪ Never gonna make
                    you cry ♪ ♪ Never gonna say goodbye ♪ ♪ Never gonna tell a
                    lie and hurt you ♪ ♪ Never gonna give you up ♪ ♪ Never gonna
                    let you down ♪ ♪ Never gonna run around and desert you ♪ ♪
                    Never gonna make you cry ♪ ♪ Never gonna say goodbye ♪ ♪
                    Never gonna tell a lie and hurt you ♪
                  language: English
                  languageCode: en
                  isAutoGenerated: false
                  segments:
                    - start: 1
                      end: 3.04
                      timestamp: '0:01'
                      text: '[♪♪♪]'
                      chapter: null
                    - start: 18
                      end: 26.96
                      timestamp: '0:18'
                      text: >-
                        ♪ We're no strangers to love ♪ ♪ You know the rules and
                        so do I ♪
                      chapter: null
                    - start: 27
                      end: 35.08
                      timestamp: '0:27'
                      text: >-
                        ♪ A full commitment's what I'm thinking of ♪ ♪ You
                        wouldn't get this from any other guy ♪
                      chapter: null
                  chapters: []
                  availableLanguages:
                    - languageCode: en
                      language: English
                      isAutoGenerated: false
                    - languageCode: en
                      language: English (auto-generated)
                      isAutoGenerated: true
                    - languageCode: de-DE
                      language: German (Germany)
                      isAutoGenerated: false
                  segmentCount: 24
                  fetchedAt: '2026-11-05T17:46:32.413Z'
                meta:
                  requestId: req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f
                  creditsCharged: 1
                  creditsRemaining: 4999
                  cached: false
        '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
        '403':
          description: The video is age-restricted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            No such video, no captions, or no captions in the requested language
            (the error lists the available ones).
          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 (url is required; language must be a
            language code).
          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.