# TikTok Transcript Scraper - JSON, SRT, VTT (`jamhimself/tiktok-transcript-scraper`) Actor

Extracts TikTok video transcripts from native captions (no AI transcription). Input: video URLs or IDs. Output: timestamped JSON segments, plain text, SRT, VTT, or RAG chunks + metadata. $0.0075 per video with a transcript (first 25 per run free); no-caption videos free.

- **URL**: https://apify.com/jamhimself/tiktok-transcript-scraper.md
- **Developed by:** [Jaime Martinez](https://apify.com/jamhimself) (community)
- **Categories:** Videos, Agents, Social media
- **Features:** Limited permissions
- **Stats:** 33 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 1,000 video transcripts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Transcript Scraper — TikTok Video to Text

Get the TikTok transcript of public videos as clean JSON, plain text, SRT, VTT, or RAG chunks with timestamps — in bulk, with no API key. If you need to turn a TikTok video to text, paste the URLs and run.

It reads TikTok's own native caption tracks (no speech-to-text guessing), and you only pay for transcripts actually delivered. TikTok throttles and captcha-walls datacenter IPs, so this actor runs a hosted residential-proxy layer with automatic retries on fresh IPs.

### ⚡ Quick start

Paste this into the Actor's **Input** (JSON view) and hit **Start**:

```json
{
  "videoUrls": ["https://www.tiktok.com/@khaby.lame/video/7106658991907802411"]
}
```

Each result row looks like:

```json
{
  "videoId": "7106658991907802411",
  "url": "https://www.tiktok.com/@khaby.lame/video/7106658991907802411",
  "author": "khaby.lame",
  "language": "en",
  "captionSource": "auto-generated",
  "text": "the whole transcript as one clean string ...",
  "segments": [{ "start": 0.12, "duration": 2.4, "text": "first caption line" }],
  "segmentCount": 14,
  "durationSeconds": 21
}
```

Or run it from the API:

```
POST https://api.apify.com/v2/acts/jamhimself~tiktok-transcript-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN
```

> **Already used it?** A short honest review helps other people find this Actor — and tells me what to fix next: [leave a review](https://apify.com/jamhimself/tiktok-transcript-scraper/reviews).

### What it does

Give it a list of TikTok video URLs (or short `vm.tiktok.com` links, or raw IDs) and it returns the transcript for each:

- **Clean JSON** with per-line timestamps
- **Plain text**, **SRT**, **VTT**, and **RAG chunks** — richer output than bare-text scrapers
- Video metadata: author, description, duration, like/view counts, available caption languages

### Output formats

| Option | What you get |
|---|---|
| `includePlainText` | Whole transcript as one string |
| `includeSegments` | `[{ start, duration, text }]` |
| `includeSrt` / `includeVtt` | Subtitle file strings |
| `ragChunking` | Overlapping timestamped chunks for embeddings |

### What you'll pay

**The first 25 transcripts in every run are free.** After that, **$0.0075 per video with a transcript** — no actor-start fee, no subscription, no API key. You pay only for transcripts actually delivered. The arithmetic is plain:

| Transcripts delivered in a run | Cost |
|---|---|
| 25 or fewer | $0.00 |
| 100 | $0.56 |
| 1,000 | $7.31 |

Videos with no captions (no speech, captions off, photo posts) go to the skipped list and are never charged. Migrating from a monthly-subscription scraper? There's nothing to subscribe to here — a run that delivers nothing costs nothing.

*Prices above are the standard rate. Apify Store subscription discounts apply automatically — Bronze −10%, Silver −20%, Gold and above −40% (that is the "from" price shown on this page).*

### RAG / LLM use cases

Built for retrieval-augmented generation and AI agents. Turn TikTok content into clean, chunked, timestamped context for vector stores (LangChain, LlamaIndex) — or feed plain text straight to an LLM for summaries and analysis.

### Use as an MCP tool / with AI agents

This actor is exposed as an MCP tool (streamable HTTP) at:

```
https://mcp.apify.com/?tools=jamhimself/tiktok-transcript-scraper
```

Example MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "streamable-http",
      "url": "https://mcp.apify.com/?tools=jamhimself/tiktok-transcript-scraper",
      "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
    }
  }
}
```

Any MCP client — Claude, Cursor, or agent frameworks — can call this actor directly and get the transcript back as structured output.

### Why scrapers return empty transcripts (and why this one doesn't)

TikTok serves a verification/captcha interstitial instead of the real video page to IPs it doesn't trust — which includes most datacenter ranges that free libraries run on. A scraper that doesn't detect the wall "succeeds" with an empty page and returns no transcript. This actor detects walled responses, discards that IP, and retries on fresh residential sessions (several rotations per video) before reading TikTok's native caption tracks directly. Genuinely unavailable videos (deleted, private, region-locked) are recognized as terminal and skipped without burning retries. Actively maintained.

### FAQ

- **Do I need a TikTok API key?** No.
- **What if a video has no captions?** Reported in the skipped list, not charged. (Photo posts and silent videos have no transcript.)
- **Auto-captions and translations?** Yes — original auto-captions are preferred; machine translations are used as a fallback for your requested language.
- **Is this legal?** It accesses publicly available caption data. You are responsible for complying with TikTok's Terms of Service and applicable law in your use of the output.

***

TikTok is a trademark of ByteDance Ltd. This actor is not affiliated with or endorsed by them. Built and maintained by Jamhimself LLC.

# Actor input Schema

## `videoUrls` (type: `array`):

TikTok video URLs or IDs — extract the transcript / subtitles / captions of each as JSON, SRT, VTT, or RAG chunks. Accepts full URLs, vm.tiktok.com short links, or raw video IDs.

## `languages` (type: `array`):

Transcript language codes in order of preference (e.g. \["en", "es"]). The original caption track is preferred over machine translations.

## `includeSegments` (type: `boolean`):

Timestamped transcript segments — include the array of {start, duration, text} caption lines.

## `includePlainText` (type: `boolean`):

Plain-text transcript — include the whole TikTok transcript as one clean string.

## `includeSrt` (type: `boolean`):

SRT subtitles — include the transcript as a SubRip (.srt) subtitle string.

## `includeVtt` (type: `boolean`):

VTT subtitles — include the transcript as a WebVTT (.vtt) subtitle string.

## `ragChunking` (type: `boolean`):

RAG chunks — split the transcript into overlapping timestamped chunks for embedding / vector pipelines.

## `chunkMaxChars` (type: `integer`):

Maximum characters per RAG chunk.

## `chunkOverlapChars` (type: `integer`):

Approximate character overlap between consecutive RAG chunks.

## `concurrency` (type: `integer`):

Videos processed in parallel (1-8).

## `proxyCountryCode` (type: `string`):

Proxy country — optional two-letter code (e.g. "US") for the IPs used to reach TikTok.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@khaby.lame/video/7106658991907802411"
  ],
  "languages": [
    "en"
  ],
  "includeSegments": true,
  "includePlainText": true,
  "includeSrt": false,
  "includeVtt": false,
  "ragChunking": false,
  "chunkMaxChars": 1200,
  "chunkOverlapChars": 150,
  "concurrency": 4
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One row per video: transcript text, timestamped segments, and metadata.

## `ragChunks` (type: `string`):

One row per RAG chunk with start/end timestamps and a deep link (enable the ragChunking input).

## `subtitles` (type: `string`):

Ready-to-save SRT/VTT subtitle strings per video (enable the includeSrt / includeVtt inputs).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videoUrls": [
        "https://www.tiktok.com/@khaby.lame/video/7106658991907802411"
    ],
    "languages": [
        "en"
    ],
    "includeSegments": true,
    "includePlainText": true,
    "chunkMaxChars": 1200,
    "chunkOverlapChars": 150,
    "concurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("jamhimself/tiktok-transcript-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "videoUrls": ["https://www.tiktok.com/@khaby.lame/video/7106658991907802411"],
    "languages": ["en"],
    "includeSegments": True,
    "includePlainText": True,
    "chunkMaxChars": 1200,
    "chunkOverlapChars": 150,
    "concurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("jamhimself/tiktok-transcript-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videoUrls": [
    "https://www.tiktok.com/@khaby.lame/video/7106658991907802411"
  ],
  "languages": [
    "en"
  ],
  "includeSegments": true,
  "includePlainText": true,
  "chunkMaxChars": 1200,
  "chunkOverlapChars": 150,
  "concurrency": 4
}' |
apify call jamhimself/tiktok-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jamhimself/tiktok-transcript-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eO7plcu8wCkthFqlT/builds/CZsboaTf3W3nofUp7/openapi.json
