{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Transcript Scraper: Captions + AI Speech-to-Text",
    "description": "TikTok video transcripts, no login: video links or creator handles in, the spoken words out. TikTok's own captions with timed cues, SRT and WebVTT; AI speech-to-text where a video has none. Likes, comments, shares, saves, the author, the sound. Pinned videos told apart. No words, no charge.",
    "version": "0.1",
    "x-build-id": "51uynNcCOf8raLwAo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~tiktok-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-tiktok-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/hyperbach~tiktok-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-tiktok-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/hyperbach~tiktok-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-tiktok-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "videoUrls": {
            "title": "Video links",
            "type": "array",
            "description": "TikTok videos, one per line, in any form: `https://www.tiktok.com/@hubermanlab/video/7578955632024309022`, a `/photo/` link, a bare 19-digit video id (the `video_id` column of an earlier run), a share or short link (`vm.tiktok.com/…`, `tiktok.com/t/…`: followed to the video it lands on). A creator's handle pasted here (`garyvee`, `@garyvee`) is read as a creator. The same video given several ways is one row.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "handles": {
            "title": "Creators",
            "type": "array",
            "description": "TikTok creators, one per line: `garyvee`, `@garyvee`, `https://www.tiktok.com/@garyvee` or a share link to a profile. The Actor lists each creator's newest videos by posting date (a video pinned to the top of the profile is told apart and left out unless `includePinned` is on) and transcribes up to `maxVideosPerHandle` of them. A missing or private creator is a free row.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "datasetId": {
            "title": "Dataset to chain",
            "pattern": "^([A-Za-z0-9._~-]{1,100}(/[A-Za-z0-9._~-]{1,100})?)?$",
            "type": "string",
            "description": "The dataset id of another TikTok scraper's run (the clockworks scrapers, scrape-creators, dz_omar and the like): every row is scanned for a video link (`webVideoUrl`, `url`, `videoUrl`) or a video `id` and transcribed. Empty = none.",
            "default": ""
          },
          "maxVideosPerHandle": {
            "title": "Max videos per creator",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many of each creator's newest videos to transcribe, newest by posting date, pinned videos not counted. Up to 10 come from TikTok's embed; more are read by walking the creator's video list in a browser, with a COMPLETE or TRUNCATED verdict against TikTok's own count in the run summary. A video without words counts (it is a free row); a video outside the date window does not.",
            "default": 10
          },
          "includePinned": {
            "title": "Include pinned videos",
            "type": "boolean",
            "description": "Creators only: also deliver the videos pinned to the top of the profile (up to 3), flagged `is_pinned`, besides the newest `maxVideosPerHandle`. Off = the newest videos by date only; a pinned video is never taken for one of the newest.",
            "default": false
          },
          "dateFrom": {
            "title": "Posted from",
            "pattern": "^(|[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{1,4} *(day|week|month|year)s?)$",
            "type": "string",
            "description": "Creators only: videos posted on or after this date (`2026-09-01`), or a span back from today (`30 days`, `2 weeks`, `6 months`). The embed serves a creator's 10 newest: a window that reaches past them needs `maxVideosPerHandle` above 10 (the browser walk, which stops at the first video older than this).",
            "default": ""
          },
          "dateTo": {
            "title": "Posted until",
            "pattern": "^(|[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{1,4} *(day|week|month|year)s?)$",
            "type": "string",
            "description": "Creators only: videos posted on or before this date (same forms as `dateFrom`).",
            "default": ""
          },
          "aiTranscription": {
            "title": "AI speech-to-text",
            "enum": [
              "fallback",
              "always",
              "off"
            ],
            "type": "string",
            "description": "Where the words come from when TikTok has no caption track for a video (77 % of ordinary clips): `fallback` sends the video's audio to a speech model and charges the `ai_transcript` event; `always` sends every video to the model (the most consistent words across a creator's videos; TikTok's own track, when there is one, rides along as `caption_text`); `off` delivers TikTok's captions only and makes a video without one a free `no_caption` row. A video the model hears no speech in is a free `no_speech` row in every mode.",
            "default": "fallback"
          },
          "captionLanguages": {
            "title": "Caption languages (TikTok's translations)",
            "maxItems": 5,
            "type": "array",
            "description": "ISO 639-1 codes (`es`, `fr`, `pt`…), up to 5: TikTok's machine-translated caption track in each language, with its text and WebVTT in `translations` (one more page read per language, charged per track delivered). TikTok offers translations for some languages per video, not all: a language it has no track for is said in `notes`, free.",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z]{2,3}(-[A-Za-z]{2})?$"
            },
            "default": []
          },
          "timestamps": {
            "title": "Timestamps on model rows (timed words, SRT / WebVTT)",
            "type": "boolean",
            "description": "On a row the speech model transcribed: add the timed words (`words`), the model's timed segments, `srt` and `vtt`, the speech seconds and the hook's start second, and the spoken language as named by the timing model (OpenAI whisper-1). Charged per started minute of audio on top of the `ai_transcript` event. A caption row carries TikTok's own timed cues, SRT and WebVTT in every mode.",
            "default": false
          },
          "downloadMedia": {
            "title": "Download the video file",
            "enum": [
              "none",
              "video"
            ],
            "type": "string",
            "description": "Store the video file in the run's key-value store, with a link that does not expire on the row (`video_file_url`). Charged per file written. TikTok's own media links on the row expire within hours (`media_expires_at`).",
            "default": "none"
          },
          "readCountry": {
            "title": "Read from country",
            "enum": [
              "US",
              "GB",
              "DE",
              "FR"
            ],
            "type": "string",
            "description": "The country the video page is read from. TikTok shows the comment count of the reader's region (32 from the US and 35 from Germany on one video in the same minute); every row says which country read it (`read_country`). Canada and Brazil are not offered: TikTok refuses visitors from them on the first call.",
            "default": "US"
          },
          "maxItems": {
            "title": "Max transcripts",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "The most transcripts this run delivers (and charges), captions and model rows together. 0 = no limit. Free rows (no speech, photo posts, not found) do not count.",
            "default": 0
          },
          "onlyNew": {
            "title": "Only new videos",
            "type": "boolean",
            "description": "Skip videos this task delivered in an earlier run: run a creator daily and get only the new videos. A video without words is remembered too (its verdict is final); a video that could not be read is tried again next run. Turns the memory on.",
            "default": false
          },
          "stateStoreName": {
            "title": "Memory name",
            "pattern": "^([A-Za-z0-9._-]{1,100})?$",
            "type": "string",
            "description": "Name of the memory between runs (`onlyNew`, `is_new`, `first_seen_at`). Empty = derived from your videos and creators, so the same task always meets its own memory.",
            "default": ""
          },
          "proxyUrl": {
            "title": "Proxy URL",
            "type": "string",
            "description": "Optional. Your own proxy as `scheme://user:pass@host:port`, used instead of the Actor's own residential exits for TikTok's pages (Apify's residential proxy stays the fallback when yours fails). Leave empty to use the maintained exits (recommended)."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}