# TikTok Transcripts Scraper | Bulk Captions, SRT & Translations (`corvuslab/tiktok-transcripts-scraper`) Actor

Get TikTok transcripts in bulk from video links, share links or IDs: plain text, timed segments, SRT and WebVTT subtitles, spoken language and TikTok's own translations, plus views, likes and creator stats. Videos without captions get a free row; only transcripts are charged.

- **URL**: https://apify.com/corvuslab/tiktok-transcripts-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 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.

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

### What does TikTok Transcripts Scraper do?

TikTok Transcripts Scraper turns a list of TikTok videos into clean, ready-to-use transcripts, **in bulk**. Paste as many video links as you like and get **one row per video**: the full spoken transcript as plain text, **timed segments** with start and end seconds, optional **SRT** and **WebVTT** subtitle files, the **spoken language**, and **TikTok's own translations** when TikTok has them. Each row also carries the video's caption, views, likes, comments, shares and saves, plus the creator's handle, follower count and verification badge. No code and no setup: export as JSON, CSV or Excel, pull it through the API, or feed it straight into an AI agent.

Give it full video URLs, the short share links the TikTok app's Share button creates (`vm.tiktok.com/...`, `tiktok.com/t/...`) or bare video IDs. Mixed lists are fine and duplicates are collapsed automatically. Every link you paste comes back as a row, and **only rows with a transcript are charged**. Videos without captions, photo slideshows, deleted videos and links that aren't videos get a **free row** saying why, so you always know what happened to each link.

Don't have the video links yet? Name a **profile** (`@nasa`), a **keyword** or a **hashtag** instead, and the Actor finds the videos and transcribes them. A profile gives you its most recent videos, newest first.

> New to Apify? Sign up free and use the included monthly platform credit to try this Actor. No credit card needed.

### Related TikTok scrapers

- **[TikTok Comments Scraper](https://apify.com/corvuslab/tiktok-comments-scraper)** — every comment and reply under any TikTok video, with the commenter's handle, likes and reply count.
- **[TikTok Profile Scraper](https://apify.com/corvuslab/tiktok-profile-scraper)** — follower counts, bio, bio links and emails for any TikTok account, plus its full follower and following lists.
- **[TikTok Shop Scraper](https://apify.com/corvuslab/tiktok-shop-scraper)** — TikTok Shop products by keyword or URL, with price, units sold, reviews, seller details and the video selling each listing.
- **[TikTok Shop Creator Scraper](https://apify.com/corvuslab/tiktok-shop-creator-finder)** — the TikTok Shop affiliates already selling any product or keyword, with their bio email and shoppable videos.

***

### What data can you extract from TikTok videos?

Every record carries **46 fields**, grouped like this:

| Group | What you get |
|---|---|
| **Transcript** | `text` (full transcript), `segments` (start/end seconds + line), `srt`, `vtt`, `wordCount`, `language`, `languageCode`, `isAutoGenerated`, `availableLanguages` |
| **Translations** | `translations[]`: TikTok's own translation of the transcript, each with `language`, `languageCode`, plain `text`, timed `segments` and optional `srt` / `vtt` |
| **Video** | `id`, `url`, `title` (the video caption), `titleLanguage`, `hashtags`, `createTime`, `createTimeISO`, `duration`, `videoUrl`, `coverUrl` |
| **Engagement** | `playCount`, `diggCount` (likes), `commentCount`, `shareCount`, `collectCount` (saves) |
| **Creator** | `uniqueId`, `nickname`, `authorId`, `secUid`, `avatarUri`, `signature` (bio), `verified`, `followerCount`, `followingCount`, `heartCount`, `videoCount` |
| **Status & monitoring** | `inputUrl`, `transcriptStatus`, `errMsg`, `timestamp`, `dataType`, `contentHash`, plus `changeType`, `isRepost`, `repostOfId` and `repostDetectedAt` in incremental mode |

***

### Key features

- 📥 **Bulk by design**: a whole spreadsheet of links in one run, not one video at a time. Tracking parameters are stripped and duplicates collapsed.
- 🔎 **No links needed**: transcribe a creator's latest videos from just their `@handle`, or every video found for a keyword or hashtag.
- 🧾 **Transcript in every useful shape**: plain text for reading and search, timed `segments` for analysis, **SRT** for video editors and **WebVTT** for web players. Switch each one on or off.
- 🗣️ **Spoken language detected**: every transcript is tagged with its language (`spa-ES` / `es`) and whether TikTok generated the captions automatically or the creator supplied them.
- 🌍 **TikTok's own translations** into English, Spanish, French, Portuguese, German, Arabic and Chinese (Simplified), each with its own timed segments.
- 💸 **Pay only for transcripts**: every link gets a row so your list reconciles, but only rows with a transcript are charged. `maxResults` counts transcripts, not attempts.
- ♻️ **Cheap to monitor**: incremental mode never re-delivers or re-bills a transcript you already have.
- 🔔 **Alerts** to Telegram, Slack, Discord or any webhook (n8n / Make / Zapier) when new transcripts arrive.
- 🤖 **AI-ready**: compact and drop-empty output modes keep payloads small for LLMs, RAG pipelines and MCP clients.

***

### 🚀 How to scrape TikTok transcripts

1. Open the Actor and paste your TikTok video links into **TikTok video URLs**, one per line.
2. (Optional) Under **Languages**, pick the translations you want collected.
3. Under **Output**, choose the formats: timed segments are on by default; tick **SRT** and/or **WebVTT** if you need subtitle files.
4. Click **Start**. One row per video streams into the Output tab within seconds.
5. Download as **JSON, CSV or Excel**, or pull the results from the **API**.

#### Quick-start example input

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392",
    "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"
  ],
  "translateTo": ["en"],
  "includeSrt": true
}
```

This returns two rows: an English cartoon clip and a Spanish news bulletin, each with its full transcript, timed segments and a ready-to-import SRT file. The Spanish video also comes with TikTok's English translation, so you can read it without translating it yourself.

***

### Input

Configure it in the visual editor with no code, or pass JSON through the API. Inputs are grouped exactly as they appear in the editor.

#### 🎬 Videos

| Field | Type | What it does |
|---|---|---|
| `videoUrls` | array | TikTok videos, one per line: full URLs, `vm.tiktok.com` / `tiktok.com/t/` share links or bare video IDs. Each video becomes one row. A profile (`@nasa`), tag or search link pasted here works too. |
| `profileUrls` | array | TikTok accounts as `@handle` or profile link. Transcribes each account's most recent videos that can be found, newest first. A recent selection, not the account's full archive. |
| `searchQueries` | array | Keywords to find videos for, e.g. `iphone 17 review`. |
| `hashtags` | array | Hashtags to find videos for, with or without the `#`. |
| `videosPerSource` | integer | How many videos to transcribe from each profile, keyword or hashtag (default 10, up to 100). Videos you paste directly are always all included. |
| `maxResults` | integer | Stop after this many transcripts. Leave empty to transcribe every video in the list (up to 20,000 transcripts per run). |

For videos found from a profile, keyword or hashtag, `inputUrl` says which one found it (`@nasa`, `#booktok`, `'iphone 17 review'`).

API users can also pass a single link as `videoUrl` (string); it is merged into the list, so integrations built around one video per call work unchanged.

#### 🌍 Languages

| Field | Type | What it does |
|---|---|---|
| `translateTo` | array | Also collect TikTok's translation into any of: `en` English, `es` Spanish, `fr` French, `pt` Portuguese, `de` German, `ar` Arabic, `zh-Hans` Chinese (Simplified). See the FAQ on when translations are available. |

#### 📄 Output

| Field | Type | What it does |
|---|---|---|
| `includeSegments` | boolean | Each spoken line with its start and end time in seconds. **On by default.** |
| `includeSrt` | boolean | Add the transcript as an SRT subtitle file. |
| `includeVtt` | boolean | Add the transcript as a WebVTT subtitle file. |
| `includeVideosWithoutCaptions` | boolean | Add a free row for videos with no captions and for photo posts. **On by default.** Dead or invalid links always get a row. |
| `compact` | boolean | Only the transcript and core video fields (listed under Output). |
| `excludeEmptyFields` | boolean | Drop null, empty-string and empty-array fields from each record. |

#### ♻️ Incremental monitoring and 🔔 Notifications

`incrementalMode`, `stateKey`, `emitUnchanged`, `emitExpired` and the notification channels are explained in their own sections below.

#### ⚙️ Advanced

| Field | Type | What it does |
|---|---|---|
| `proxyConfiguration` | object | Not needed. The scraper works without a proxy; turn one on only if requests start being refused. |
| `maxConcurrency` | integer | Videos read in parallel (1–10, default 5). |
| `maxRequestRetries` | integer | Retries for a failed request before the video is marked as failed (0–10, default 3). |

#### More example inputs

Transcripts only, compact, for an AI pipeline:

```json
{
  "videoUrls": ["https://vm.tiktok.com/ZMxxxxxxx/", "7587841579029679392"],
  "includeVideosWithoutCaptions": false,
  "compact": true,
  "excludeEmptyFields": true
}
```

Multilingual subtitles for a localisation team:

```json
{
  "videoUrls": ["https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"],
  "translateTo": ["en", "fr", "pt"],
  "includeSrt": true,
  "includeVtt": true
}
```

***

### Output

Each dataset item is one video. A real record (the Spanish news video from the quick-start, with segments and the English translation shortened for display):

```json
{
  "id": "7698589001103576333",
  "url": "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
  "inputUrl": "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
  "transcriptStatus": "OK",
  "text": "Esta noche noticias telemundo exigen respuestas. México presentará una denuncia en estados unidos por la muerte de un mexicano bajo custodia de ais en texas. La familia de esta persona denuncia que le negaron medicamentos y exigen respuestas sobre su fallecimiento. …",
  "language": "spa-ES",
  "languageCode": "es",
  "isAutoGenerated": true,
  "wordCount": 191,
  "segments": [
    { "start": 0.32, "end": 3.32, "text": "Esta noche noticias telemundo exigen respuestas." },
    { "start": 3.44, "end": 4.4, "text": "México presentará" },
    { "start": 4.401, "end": 4.881, "text": "una denuncia" }
  ],
  "translations": [
    {
      "language": "eng-US",
      "languageCode": "en",
      "text": "Tonight telemundo news demands answers. Mexico will present a complaint in the united states for the death of a mexican in ais custody in texas. …",
      "segments": [
        { "start": 0.32, "end": 3.32, "text": "Tonight telemundo news demands answers." },
        { "start": 3.44, "end": 4.4, "text": "Mexico will present" }
      ]
    }
  ],
  "availableLanguages": ["es", "en"],
  "title": "📌 Estas son las noticias que debes saber antes que termine el lunes 19 de octubre de 2026.",
  "titleLanguage": "es",
  "createTime": 1792467435,
  "createTimeISO": "2026-10-20T03:37:15+00:00",
  "duration": 67,
  "playCount": 37800,
  "diggCount": 1719,
  "commentCount": 6,
  "shareCount": 8,
  "collectCount": 72,
  "uniqueId": "noticiastelemundo",
  "nickname": "Noticias Telemundo",
  "authorId": "7026015251758613509",
  "signature": "Cuenta oficial de Noticias Telemundo. #LasCosasComoSon",
  "verified": true,
  "followerCount": 17800000,
  "followingCount": 100,
  "heartCount": 495900000,
  "videoCount": 9358,
  "errMsg": "",
  "timestamp": "2026-10-20T16:28:56.841551+00:00",
  "dataType": "transcript",
  "contentHash": "b25c8f298cb64752b7ae1e60b1d1badacccff0ce"
}
```

With **SRT** switched on, the same transcript also arrives in `srt`, ready to drop into a video editor:

```text
1
00:00:00,320 --> 00:00:03,320
Esta noche noticias telemundo exigen respuestas.

2
00:00:03,440 --> 00:00:04,400
México presentará
```

A video TikTok has no captions for comes back as a free row with the video and creator fields filled in, `transcriptStatus: "NO_CAPTIONS"` and an `errMsg` such as *"TikTok has no captions for this video, so there is no transcript to return."*

Every field is present in standard mode (missing values are `null`). **Compact mode** returns only `id`, `url`, `transcriptStatus`, `text`, `language`, `title`, `uniqueId`, `createTimeISO`, `duration`, `playCount`, `errMsg` and `contentHash`. **`excludeEmptyFields`** drops empties entirely. The Output tab also has three ready-made views: **Transcripts** (status, language, word count and text at a glance), **Timed transcript** (segments, translations and SRT side by side) and **Video & creator** (engagement and creator stats).

***

### ♻️ How to monitor TikTok transcripts with incremental mode

Keep a running list of videos (your brand's, your competitors', a set of creators you follow), add new links as they're posted, and schedule the Actor with **incremental mode** on. Each run compares against the last and returns only transcripts you haven't received yet: **NEW** for a first-time transcript, **UPDATED** when the words themselves change (for example, a creator replaces their captions). View, like, comment and share counts move on every run, so they are deliberately **not** treated as a change. An unchanged transcript is skipped and not billed again.

| Field | Type | What it does |
|---|---|---|
| `incrementalMode` | boolean | Remember delivered transcripts and tag each record `NEW` / `UPDATED` / `UNCHANGED` / `EXPIRED`. |
| `stateKey` | string | Stable name for the tracked list. Auto-derived from your links if blank; set it yourself if you add videos over time. |
| `emitUnchanged` | boolean | Also return transcripts that haven't changed since the last run. |
| `emitExpired` | boolean | Add a row for videos that were in the previous run but are gone now. |

After the first run, your cost scales with how many **new** videos you add, not with the size of the list you watch:

| New or changed videos per run | of 1,000 tracked | billable transcripts (at most) | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

#### Setting up scheduled monitoring

1. Paste your video list, turn on **Incremental mode** and give the list a **State key** (e.g. `brand-watchlist`) so it stays the same as you add links.
2. Run it once. This seeds the baseline.
3. Open the **Schedules** tab and set a recurring run (e.g. daily).
4. Add a notification channel to be pinged only when new transcripts arrive.

```json
{
  "videoUrls": ["https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392"],
  "incrementalMode": true,
  "stateKey": "brand-watchlist",
  "slackWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

***

### 🔔 How to set up TikTok transcript alerts

Get a message when new transcripts land. Fill in only the channels you want:

| Channel | What to configure |
|---|---|
| ✈️ **Telegram** | `telegramToken` (from @BotFather) + `telegramChatId` |
| 💬 **Slack** | `slackWebhookUrl` (Incoming Webhook URL) |
| 🎮 **Discord** | `discordWebhookUrl` (channel webhook URL) |
| 🪝 **Webhook** | `webhookUrl` (+ optional `webhookHeaders`) receives the new transcripts as JSON, ideal for n8n / Make / Zapier |

`notificationLimit` sets how many transcripts each message previews (1–20, default 5). Credentials are secret inputs: encrypted at rest, masked in the UI and never written to the run log. Every channel fires independently, so a broken channel can't stop the run or the others. Paired with incremental mode, you hear only about transcripts that are genuinely new.

***

### 💡 What can you do with TikTok transcript data?

#### Repurpose videos into written content

Turn a creator's best-performing TikToks into blog posts, newsletters, threads and show notes. The plain-text transcript plus the view and like counts tell you which ideas are worth rewriting first.

#### Hook and script analysis

Use the timed segments to see exactly what is said in the first three seconds of videos that go viral. Compare opening lines across hundreds of videos to find the hooks that hold attention in your niche.

#### Subtitles and localisation

Download SRT or WebVTT files to re-edit, caption or re-publish your own videos on other platforms. TikTok's translations give you a starting point for other languages.

#### Brand, product and media monitoring

Search the spoken words, not just the captions, for brand names, product mentions, claims and sentiment. Schedule a watched list with incremental mode and alerts to catch new mentions as soon as they're posted.

#### Market and trend research

Track the topics, phrases and claims spreading through TikTok in a category or a language over time. Export the history to build trend dashboards in Sheets, Looker Studio or Power BI.

#### Feed AI agents, RAG and LLM pipelines

Send compact JSON straight into an LLM context, an MCP tool or a vector store for summarisation, classification or question answering over video content.

#### Academic and journalistic research

Build a searchable corpus of what was actually said in news, political or health videos, with the post date, creator and engagement attached to every transcript for citation and analysis.

***

### 💰 How much does it cost to scrape TikTok transcripts?

This Actor uses Apify's **pay-per-event** model: you're charged **once for each transcript returned**. See the Actor's **Pricing** tab for the current numbers.

What you are **not** charged for:

- **Videos without captions, photo slideshows, deleted or private videos and non-video links.** They get an informative row at no charge (or no row at all if you turn off `includeVideosWithoutCaptions`).
- **Translations and subtitle formats.** SRT, WebVTT, timed segments and every translation you request come inside the same row.
- **Transcripts you already have.** In incremental mode, unchanged transcripts are skipped and not billed again.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents.

More TikTok tools from the same team: **[TikTok Comments Scraper](https://apify.com/corvuslab/tiktok-comments-scraper)** adds what viewers said under each video, and **[TikTok Profile Scraper](https://apify.com/corvuslab/tiktok-profile-scraper)** adds full creator profiles. All of them share the same field names (`id`, `url`, `uniqueId`), so the datasets join cleanly.

***

### 🔗 Using the API

Run this Actor from your own code. Example with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "videoUrls": [
        "https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392",
        "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
    ],
    "translateTo": ["en"],
    "includeSrt": True,
}

run = client.actor("corvuslab/tiktok-transcripts-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["transcriptStatus"] == "OK":
        print(item["url"], item["languageCode"], item["wordCount"])
        print(item["text"][:200])
    else:
        print(item["url"], item["transcriptStatus"], item["errMsg"])
```

It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

***

### ❓ FAQ

**Does every TikTok video have a transcript?** No, and we'd rather you know that before you run it. The transcript is the caption track TikTok itself provides; nothing is generated by AI or speech-to-text on top. In our tests about **85% of speech-heavy videos** (news, talking-head, tutorials, explainers) had one, but only about **half of videos in a random mix**, because music-only and non-speech clips often carry none. Photo slideshows never do. Those videos get a free `NO_CAPTIONS` or `SLIDESHOW` row rather than a guessed transcript.

**What does `isAutoGenerated` mean?** `true` means TikTok created the captions automatically from the audio; `false` means the creator supplied them. Auto-generated captions can contain the occasional misheard word or name, exactly as they appear on TikTok.

**Will every translation I select be returned?** Only when TikTok has that translation for the video. Translations are produced by TikTok, vary from video to video, and not every video is translated into every language. `availableLanguages` lists exactly what came back. An English translation of non-English videos is included whenever TikTok has one, even if you didn't select English. They are machine translations, so treat them as a working draft.

**What do the `transcriptStatus` values mean?** `OK`: transcript returned (the only charged status). `NO_CAPTIONS`: the video exists but TikTok has no captions for it. `SLIDESHOW`: a photo post with nothing spoken. `NOT_FOUND`: deleted, private or unavailable in your region (also used for share links that no longer resolve). `UNSUPPORTED_URL`: not a TikTok video link. `BLOCKED` / `ERROR`: TikTok didn't answer for that video. Try it again later.

**Can I paste a profile, hashtag or search link?** Yes. Paste it into **TikTok video URLs**, or use the **Profiles**, **Search keywords** and **Hashtags** fields, and the Actor finds the videos itself. **Videos per profile, search or hashtag** sets how many (default 10). A profile gives its most recent videos that can be found, newest first; it is a recent selection rather than the account's complete archive.

**Can I download the video itself?** Each row includes `videoUrl`, the video's playback link, and `coverUrl`, its thumbnail. Both links are temporary and stop working after roughly a day, so download what you need soon after the run rather than storing the links.

**How many videos can I process in one run?** As many as you paste, up to 20,000 transcripts per run. A few hundred videos usually finish in minutes. Raise **Videos in parallel** for big lists.

**Do I need a TikTok account, cookies or a proxy?** No. It reads public videos without logging in, and no proxy is needed.

***

### ⚖️ Is it legal to scrape TikTok?

This Actor collects only **publicly available** data from public TikTok videos: what anyone can see without logging in. You're responsible for how you use it, in particular any personal information about creators, and for complying with TikTok's terms, copyright in the spoken content you reuse, and applicable law (including the GDPR/LGPD where they apply). Not affiliated with, endorsed by or sponsored by TikTok or ByteDance.

***

**Keywords:** tiktok transcript scraper · tiktok transcripts · tiktok transcript extractor · tiktok subtitles download · tiktok captions to text · tiktok video to text · tiktok srt · tiktok vtt subtitles · bulk tiktok transcripts · tiktok translation · tiktok api · content repurposing · hook analysis · brand monitoring · export to CSV · no-code scraper · MCP tool for AI agents

# Changelog

This Actor's version history is a separate document: https://apify.com/corvuslab/tiktok-transcripts-scraper/changelog.md

# Actor input Schema

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

One TikTok video per line. Each video becomes one row. Links that are not videos get a row explaining why they were skipped.

## `profileUrls` (type: `array`):

TikTok accounts as @handle or profile link. Transcribes each account's most recent videos that can be found, up to 'Videos per profile, search or hashtag'. This is a recent selection, not the account's full archive.

## `searchQueries` (type: `array`):

Find videos by keyword and transcribe them, for example 'iphone 17 review'.

## `hashtags` (type: `array`):

Find videos by hashtag and transcribe them. With or without the #.

## `videosPerSource` (type: `integer`):

How many videos to transcribe from each profile, search or hashtag. Videos you paste directly are always all included.

## `maxResults` (type: `integer`):

Stop after this many transcripts. Leave empty to transcribe every video in the list.

## `translateTo` (type: `array`):

TikTok's own caption translations, added to the translations field when TikTok has one for that video. Not every video is translated into every language. An English translation of non-English videos is included whenever TikTok has one, even without selecting it.

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

Add each spoken line with its start and end time in seconds.

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

Add the transcript as SRT subtitles, ready to import into a video editor.

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

Add the transcript as WebVTT subtitles, the format web video players use.

## `includeVideosWithoutCaptions` (type: `boolean`):

Add a row (free of charge) for videos TikTok has no captions for, and for photo posts, so you can see which videos in your list had no transcript. Turn off to skip them. Dead or invalid links always get a row.

## `compact` (type: `boolean`):

Return only the transcript and the core video fields. Ideal for AI agents and LLM pipelines.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Remember which transcripts earlier runs returned and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED). Unchanged transcripts are skipped and not charged. View and like counts changing does not count as a change.

## `stateKey` (type: `string`):

Stable name for the tracked list. Leave empty to derive one from your video URLs. Set it yourself if you add videos to the list over time.

## `emitUnchanged` (type: `boolean`):

Also return transcripts that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Add a row for videos that were in the previous run but are gone now.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the new transcripts. Works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many transcripts to include in each notification message.

## `proxyConfiguration` (type: `object`):

Not needed: the scraper works without a proxy. Turn one on only if TikTok starts refusing requests.

## `maxConcurrency` (type: `integer`):

How many videos to read at the same time.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392",
    "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"
  ],
  "videosPerSource": 10,
  "includeSegments": true,
  "includeSrt": false,
  "includeVtt": false,
  "includeVideosWithoutCaptions": true,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 5,
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (type: `string`):

No description

# 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/@foxfamilyguy/video/7587841579029679392",
        "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/tiktok-transcripts-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/@foxfamilyguy/video/7587841579029679392",
        "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/tiktok-transcripts-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/@foxfamilyguy/video/7587841579029679392",
    "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"
  ]
}' |
apify call corvuslab/tiktok-transcripts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/tiktok-transcripts-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/xi1QdkU1XWq7KbXG8/builds/rsrXDdc5cK7TyIEBk/openapi.json
