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

> Scrapes the transcripts of a public TikTok video by URL (`tiktok.com/@user/video/<id>`) — every caption track TikTok lists for it: the original spoken language plus any machine translations (e.g. a Spanish video with an English translation). Each transcript comes as plain text, timed segments (start/end seconds) and the raw caption file exactly as TikTok serves it (WebVTT), with its language and whether it is the original, auto-generated (speech recognition) or a machine translation. The original-language transcript is also returned at the top level (`transcript`, `language`). `transcript` is null and `transcripts` empty when the video has no captions (e.g. no speech, captions turned off, or a photo post). For the rest of the video’s data use `/v1/tiktok/video`.

<Info>
  **Cost: 1 credit** per successful request. Errors and cache hits (`cache_max_age`) are free.
</Info>

<Accordion title="Copy for AI assistant" icon="sparkles">
  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/tiktok/video/transcript. Here are the details:

  Endpoint: GET https://api.scraperize.com/v1/tiktok/video/transcript
  Description: Scrapes the transcripts of a public TikTok video by URL (`tiktok.com/@user/video/<id>`) — every caption track TikTok lists for it: the original spoken language plus any machine translations (e.g. a Spanish video with an English translation). Each transcript comes as plain text, timed segments (start/end seconds) and the raw caption file exactly as TikTok serves it (WebVTT), with its language and whether it is the original, auto-generated (speech recognition) or a machine translation. The original-language transcript is also returned at the top level (`transcript`, `language`). `transcript` is null and `transcripts` empty when the video has no captions (e.g. no speech, captions turned off, or a photo post). For the rest of the video’s data use `/v1/tiktok/video`.

  Required Headers:
  - x-api-key: Your API key

  Parameters:
  - url (string) [required]: The TikTok video URL, e.g. https://www.tiktok.com/@user/video/7683891628230315295.
  - 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": "7683891628230315295",
        "url": "https://www.tiktok.com/@natgeo/video/7683891628230315295",
        "handle": "natgeo"
      },
      "transcript": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the w…",
      "language": "eng-US",
      "languageCode": "en",
      "transcripts": [
        {
          "language": "eng-US",
          "languageCode": "en",
          "isOriginal": true,
          "isAutoGenerated": true,
          "isMachineTranslation": false,
          "text": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the w…",
          "segments": [
            {
              "start": 3.22,
              "end": 4.32,
              "text": "Welcome"
            }
          ],
          "format": "webvtt",
          "raw": "WEBVTT\n\n\n00:00:03.220 --> 00:00:04.320\nWelcome\n\n00:00:06.060 --> 00:00:07.600\nto Africa.\n\n00:00:08.300 --> 00:00:09.400\nWelcome\n\n00:00:12.700 --> 00:00:15.480\nt…"
        }
      ],
      "fetchedAt": "2026-10-05T14:44:42.569Z"
    },
    "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.
  ```
</Accordion>


## OpenAPI

````yaml /api-reference/openapi.json get /v1/tiktok/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
paths:
  /v1/tiktok/video/transcript:
    get:
      tags:
        - TikTok
      summary: Video transcript
      description: >-
        Scrapes the transcripts of a public TikTok video by URL
        (`tiktok.com/@user/video/<id>`) — every caption track TikTok lists for
        it: the original spoken language plus any machine translations (e.g. a
        Spanish video with an English translation). Each transcript comes as
        plain text, timed segments (start/end seconds) and the raw caption file
        exactly as TikTok serves it (WebVTT), with its language and whether it
        is the original, auto-generated (speech recognition) or a machine
        translation. The original-language transcript is also returned at the
        top level (`transcript`, `language`). `transcript` is null and
        `transcripts` empty when the video has no captions (e.g. no speech,
        captions turned off, or a photo post). For the rest of the video’s data
        use `/v1/tiktok/video`.
      parameters:
        - name: url
          in: query
          required: true
          description: >-
            The TikTok video URL, e.g.
            https://www.tiktok.com/@user/video/7683891628230315295.
          schema:
            type: string
          example: https://www.tiktok.com/@natgeo/video/7683891628230315295
        - 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 video transcripts (empty when the video has no captions).
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      video:
                        type: object
                        properties:
                          id:
                            type: string
                          url:
                            type: string
                          handle:
                            type: string
                      transcript:
                        type: string
                        nullable: true
                        description: The original-language transcript as plain text.
                      language:
                        type: string
                        nullable: true
                      languageCode:
                        type: string
                        nullable: true
                      transcripts:
                        type: array
                        description: Every caption track, original language first.
                        items:
                          type: object
                          properties:
                            language:
                              type: string
                              nullable: true
                            languageCode:
                              type: string
                              nullable: true
                            isOriginal:
                              type: boolean
                            isAutoGenerated:
                              type: boolean
                            isMachineTranslation:
                              type: boolean
                            text:
                              type: string
                              nullable: true
                            segments:
                              type: array
                              items:
                                type: object
                                properties:
                                  start:
                                    type: number
                                  end:
                                    type: number
                                  text:
                                    type: string
                            format:
                              type: string
                              nullable: true
                              description: Format of raw (webvtt).
                            raw:
                              type: string
                              description: >-
                                The caption file exactly as TikTok serves it,
                                unparsed.
                      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: '7683891628230315295'
                    url: https://www.tiktok.com/@natgeo/video/7683891628230315295
                    handle: natgeo
                  transcript: >-
                    Welcome to Africa. Welcome to Earth's wild home. See a new
                    side to animals you know and meet some you've never seen
                    before. This is the definitive look at the wildest continent
                    on our planet. There's no place like Africa.
                  language: eng-US
                  languageCode: en
                  transcripts:
                    - language: eng-US
                      languageCode: en
                      isOriginal: true
                      isAutoGenerated: true
                      isMachineTranslation: false
                      text: >-
                        Welcome to Africa. Welcome to Earth's wild home. See a
                        new side to animals you know and meet some you've never
                        seen before. This is the definitive look at the wildest
                        continent on our planet. There's no place like Africa.
                      segments:
                        - start: 3.22
                          end: 4.32
                          text: Welcome
                        - start: 6.06
                          end: 7.6
                          text: to Africa.
                        - start: 8.3
                          end: 9.4
                          text: Welcome
                      format: webvtt
                      raw: |
                        WEBVTT


                        00:00:03.220 --> 00:00:04.320
                        Welcome

                        00:00:06.060 --> 00:00:07.600
                        to Africa.

                        00:00:08.300 --> 00:00:09.400
                        Welcome

                        00:00:12.700 --> 00:00:15.480
                        to Earth's wild home.

                        00:00:22.700 --> 00:00:25.640
                        See a new side to animals you know

                        00:00:27.420 --> 00:00:30.640
                        and meet some you've never seen before.

                        00:00:41.460 --> 00:00:44.040
                        This is the definitive look

                        00:00:45.660 --> 00:00:47.960
                        at the wildest continent

                        00:00:49.540 --> 00:00:51.000
                        on our planet.

                        00:00:57.060 --> 00:00:58.920
                        There's no place

                        00:01:05.140 --> 00:01:06.920
                        like Africa.
                  fetchedAt: '2026-10-05T14:44:42.569Z'
                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
        '404':
          description: Video not found, deleted, private, or unavailable.
          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 (missing url, or not a TikTok video 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: 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.