# TikTok Transcript Scraper - Video to Text (`deapi/tiktok-transcript-scraper`) Actor

Turn any public TikTok video into accurate text. Word-level timestamps, speaker labels, SRT and VTT subtitles, 90+ languages. No TikTok login or API key needed.

- **URL**: https://apify.com/deapi/tiktok-transcript-scraper.md
- **Developed by:** [deAPI](https://apify.com/deapi) (community)
- **Categories:** Videos, Social media, AI
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $36.00 / 1,000 transcript, video up to 1 mins

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Turn public TikTok videos into accurate, timestamped text. Paste one URL or a thousand, and get back the full transcript, word-level timings, speaker labels, and ready-to-use SRT and VTT subtitle files. No TikTok login, no API key, no cookies, nothing to install.

This scraper does **not** read TikTok's auto-captions. It listens to the audio and transcribes it with a top-tier speech recognition model, so it works on videos that have no captions at all, on videos whose captions were switched off, and on the 90+ languages TikTok creators actually post in. That is the difference between a transcript you can publish and one you have to fix by hand.

### Why this one

Most TikTok transcript tools take one of two shortcuts. They copy TikTok's own auto-captions — fast and cheap, but simply absent on a large share of videos, and thinnest exactly where you need them most: non-English audio, older uploads, and creators who turned captions off. Or they run a budget speech model that returns one undifferentiated block of text.

This Actor is built for the case where the transcript has to be right.

| | Auto-caption scrapers | Budget transcribers | **This Actor** |
|---|---|---|---|
| Works when the video has no captions | ❌ | ✅ | ✅ |
| Non-English audio | Patchy | Varies | ✅ 90+ languages |
| Word-level timings | ❌ | Rarely | ✅ included |
| Speaker labels | ❌ | Rarely | ✅ included |
| Subtitle files, properly split | ❌ | ❌ | ✅ SRT + VTT |
| Per-segment confidence scores | ❌ | ❌ | ✅ included |
| Sentence timestamps | ❌ | Sometimes | ✅ **in the base price** |

Subtitles, confidence scores and sentence-level timestamps are all in the base price. Word-level timing and speaker labels sit one step up, on the precision price — and picking both of them costs no more than picking one.

### What you get for every video

- 📝 **Full transcript** — clean, punctuated text of everything spoken in the video.
- ⏱️ **Timestamps at the level you choose** — one per sentence, one for every single word, or none at all if you just want the text.
- 🗣️ **Speaker labels** — who said what, for duets, stitches, interviews and podcast clips.
- 🎬 **SRT and VTT subtitles** — properly split, two lines, readable. Drop them straight into a video editor, a player or your CMS.
- 🌍 **90+ languages** — auto-detected, or forced when the audio is noisy or mixed.
- 📊 **TikTok video metadata** (optional) — title, description, hashtags, author, upload date, thumbnails, plus view, like, comment, save and repost counts.
- ✅ **Confidence scores** — per segment, so you can flag the parts worth a human check.

### How to transcribe a TikTok video

1. Click **Try for free** and open the input form.
2. Paste your TikTok video URLs into **TikTok video URLs** — one per line. Full links (`https://www.tiktok.com/@user/video/1234567890`) and short share links (`https://vm.tiktok.com/XXXXXXX`) both work.
3. Pick a **Timestamp level**. *Segment* is right for reading and subtitles; *Word* is right for captions that highlight as they are spoken, for clip cutting, and for searching inside a video.
4. Switch on **Label speakers** if the video has more than one voice.
5. Click **Start**. Results appear row by row in the **Overview** tab and can be exported to JSON, CSV, Excel, XML or HTML.

Running it on a schedule, or from Python, Node.js, cURL, Make, Zapier or n8n, works exactly the same way — see the **API** tab for ready-made code.

### Input example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@claude/video/7660583650773323022",
    "https://www.tiktok.com/@another/video/7223456789012345678"
  ],
  "timestampLevel": "word",
  "diarize": true,
  "language": "auto",
  "includeSubtitles": true,
  "includeMetadata": false,
  "maxConcurrency": 5
}
```

### Output example

One row per video:

```json
{
  "url": "https://www.tiktok.com/@claude/video/7660583650773323022",
  "videoId": "7660583650773323022",
  "status": "success",
  "hasSpeech": true,
  "durationSeconds": 90,
  "language": "en",
  "languageConfidence": 0.9771,
  "text": "Can AI be trusted? Who's going to hit the brakes if we need to? What we're aiming to achieve really does benefit the majority of people...",
  "wordCount": 167,
  "timestampLevel": "word",
  "segments": [
    {
      "start": 8.43,
      "end": 43.65,
      "text": "Can AI be trusted? Who's going to hit the brakes if we need to?...",
      "avg_logprob": -0.0636,
      "words": [
        { "word": "Can", "start": 8.73, "end": 8.89, "score": -0.1154, "speaker": "SPEAKER_02" },
        { "word": "AI", "start": 8.99, "end": 9.21, "score": -4.4411, "speaker": "SPEAKER_02" }
      ]
    }
  ],
  "speakers": ["SPEAKER_00", "SPEAKER_01", "SPEAKER_02", "SPEAKER_03"],
  "srt": "1\n00:00:08,730 --> 00:00:12,930\n[SPEAKER_02] Can AI be trusted?\n...",
  "vtt": "WEBVTT\n\n00:00:08.730 --> 00:00:12.930\n...",
  "pricingTier": "up to 2 min",
  "pricingOption": "precision",
  "error": null
}
```

A video that cannot be transcribed never stops the run — it comes back as a row with `"status": "failed"` and a plain-English `error`, and it is not charged.

`avg_logprob` on a segment and `score` on a word are log-probabilities from the speech model, not percentages: **the closer to zero, the more confident the model is.** Sort by them to find the handful of lines worth a human check.

### What people use TikTok transcripts for

| Use case | Why the transcript matters |
|---|---|
| **Repurposing content** | Turn a viral TikTok into a blog post, newsletter, thread or YouTube description in one step. |
| **Subtitles and accessibility** | SRT and VTT files ready for TikTok, Reels, Shorts, or your own player — no manual sync. |
| **Competitor and market research** | Read what a whole niche is *saying*, not just what its captions claim, across hundreds of videos. |
| **Ad and hook analysis** | Pull the first five seconds of a thousand videos and find the hooks that actually convert. |
| **Brand monitoring and compliance** | Search spoken words for claims, disclosures, competitor mentions or unsafe language. |
| **AI, RAG and dataset building** | Word-timed, speaker-labelled text is exactly the shape LLM pipelines want. |
| **Search and archives** | Make a back catalogue of videos searchable down to the second. |

### How much does it cost to transcribe TikTok videos?

**The price depends on how long the video is** — one charge per video, no compute units to estimate and no Apify platform usage on top.

| Video length | Standard | Precision |
|---|---|---|
| up to 1 minute | **$0.04** | $0.06 |
| up to 2 minutes | $0.06 | $0.09 |
| up to 3 minutes | $0.08 | $0.12 |
| up to 5 minutes | $0.10 | $0.15 |
| over 5, up to 10 minutes | $0.16 | $0.24 |
| over 10 minutes | $0.20 | $0.30 |

**Standard** covers plain text and sentence-level timestamps, and it is what you get by default — including the SRT and VTT subtitle files and the confidence scores.

**Precision** is 1.5× the standard price and applies when you ask for word-level timestamps, or for speaker labels. **It never stacks:** word timings *and* speaker labels together cost exactly the same as either one on its own.

Two more things:

- **TikTok video metadata** is an optional add-on at **$0.005 per video**, charged only when you switch it on.
- **Business** Apify accounts get **10% off every price above**.

The band is taken from the whole length of the video, rounded up: a 1:05 clip is billed as *up to 2 minutes*. Most TikToks run under a minute, so a typical batch costs **$0.04 per video — $40 per 1,000 videos** — and **$0.30 is the ceiling** for transcribing a single video, however long it is (plus $0.005 if you switch metadata on). The Store card shows "from $36.00 / 1,000" because it quotes the discounted Business-plan price of the entry band; on every other plan that band is $40.00 / 1,000.

**Trying it on the Apify free plan?** A free-plan run attempts the first **5 videos** of your list, up to **20 attempts per calendar month** — enough to judge the transcript quality on your own content before you commit. Every URL a free run attempts counts against the allowance, including links that turn out to be private or deleted, and the allowance resets at 00:00 UTC on the 1st. URLs left out arrive as rows with `"status": "skipped"` so nothing disappears silently. Any Apify paid plan removes both limits; nothing else about the output changes.

Two things this pricing deliberately avoids:

- **No per-second meter.** You can budget a batch from the URLs and their lengths, instead of waiting to see the bill.
- **No charge for failures.** Private, deleted and region-locked videos come back as failed rows and cost nothing. (On the free plan they still count against the 20 monthly attempts — they cost you nothing, but they do use up a try.)

#### How long does a run take?

A short video is typically transcribed in 15–30 seconds. Videos are processed in parallel — five at a time by default, which puts a 1,000-video batch at roughly an hour and a half. Raise **Videos in parallel** to 10 and the same batch finishes in about 40 minutes.

### FAQ

#### How do I get the transcript of a TikTok video?

Paste the video URL into this Actor and start the run. The transcript is usually ready in well under a minute for a short video, and you can transcribe thousands of videos in one run.

#### Does it work if the TikTok video has no captions?

Yes. This is the main reason to use it. The Actor transcribes the **audio**, so it does not care whether the creator enabled captions, whether TikTok generated any, or what language they were in.

#### Can I transcribe TikTok videos in bulk?

Yes — put as many URLs in the list as you like and raise **Videos in parallel** up to 10. Exactly identical URLs are removed automatically. Links are compared as plain text, so the same video counts twice if it appears with different tracking parameters, a trailing slash, or once as a full link and once as a `vm.tiktok.com` short link — each is transcribed and charged. Strip query strings before pasting for a clean count.

Runs use Apify's default 2-hour timeout, which comfortably covers about 1,000 videos at 5 in parallel. For a larger backlog, raise the run timeout in **Run options** or split the list — a run that times out cannot be resumed.

On the Apify free plan a run attempts the first 5 videos and 20 per calendar month; any paid plan runs the whole batch.

#### Can I get SRT or VTT subtitles from a TikTok video?

Yes. Every successful row carries an `srt` and a `vtt` field, already split into short, two-line, readable cues instead of one wall of text. Choose the **Word** timestamp level for the tightest sync. Subtitles need timing to exist, so they are returned at every timestamp level except **None**.

#### Where are the TikTok views, likes and hashtags?

Switch on **Add TikTok video metadata** — it is off by default, because it is a paid add-on at $0.005 per video. With it on, every row carries a `metadata` object with the author, caption, hashtags, upload date, thumbnails and the view, like, comment, save and repost counts. In the run's **Storage** tab, pick the **Video metadata** view to see it as a table.

#### Does it identify different speakers?

Switch on **Label speakers** and every segment is tagged `SPEAKER_00`, `SPEAKER_01` and so on. You will find the labels on each entry in `segments`, on each word when word-level timing is on, in the `speakers` list, and as a `[SPEAKER_00]` prefix on every subtitle cue. The plain `text` field stays unlabelled — it is the clean transcript. Labels need timing to attach to, so turning them on alongside the **None** timestamp level still returns sentence-level timing. It puts the video on the precision price — and if you already chose word-level timestamps, it adds nothing on top of that.

#### Which languages are supported?

Over 90, auto-detected by default, including English, Spanish, Portuguese, French, German, Italian, Polish, Ukrainian, Russian, Turkish, Arabic, Hindi, Indonesian, Vietnamese, Thai, Japanese, Korean and Chinese. If a video mixes languages or the audio is noisy, naming the language in the input makes the result noticeably more accurate.

#### What happens with videos that have no speech?

Music-only and ambient clips come back with a short or empty transcript and a low `languageConfidence`. `hasSpeech` is `false` only when the model returned no words at all, so a clip with a single sung line still reports `true` — filter on `wordCount` and `languageConfidence` if you need to drop music. The audio was still processed, so the video is charged as normal.

#### Why did some videos fail?

Private, deleted, region-locked and age-restricted videos cannot be opened by anyone who is not logged in, so they cannot be transcribed. They are reported with `"status": "failed"` and are not charged.

#### Do I need a TikTok account, cookies or an API key?

No. Nothing to sign up for, nothing to configure, nothing to keep alive.

#### Is it legal to transcribe TikTok videos?

This Actor only reads **public** videos — the same ones anyone can watch without logging in — and it does not touch private data. Transcripts are usually treated as fair use for research, analysis and accessibility, but what you publish is your responsibility. If you are unsure how your use case is regulated, ask a lawyer, and read Apify's [ethical web scraping](https://blog.apify.com/is-web-scraping-legal/) guide.

#### Can I run this on a schedule or from my own code?

Yes. Use Apify **Schedules** to run it daily, or call it from Python, Node.js, cURL or any HTTP client — the **API** tab has copy-paste examples. Results can be pushed into Google Sheets, Slack, Airtable, Zapier, Make, n8n or a webhook.

### Support

Something not working, or a field you wish this returned? Open an issue on the Actor's **Issues** tab — every report is read.

# Actor input Schema

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

Public TikTok video links to transcribe. Full links (https://www.tiktok.com/@user/video/1234567890) and short share links (https://vm.tiktok.com/XXXXXXX) both work. Identical links are removed automatically, but only when they match character for character — the same video pasted once with tracking parameters (`?_t=`, `?is_from_webapp=`) and once without, or once as a full link and once as a short link, counts as two videos and is charged twice, so trim everything after the `?` before pasting. Private, deleted and age-restricted videos cannot be transcribed. **On the Apify free plan a run attempts the first 5 videos of the list, up to 20 attempts per calendar month (resets 00:00 UTC on the 1st); every URL a free run attempts counts, including links that turn out to be private or deleted. Any Apify paid plan removes both limits.**

## `timestampLevel` (type: `string`):

How finely the transcript is timed. **Segment** gives one timestamp per sentence — right for subtitles and reading, and included in the base price. **Word** times every single word — right for captions that highlight as they are spoken, clip cutting and search. **None** returns plain text only. Word moves the video onto the precision price (1.5× the base), and choosing speaker labels as well costs nothing extra on top.

## `diarize` (type: `boolean`):

Detect who is speaking and tag every line with a speaker (SPEAKER\_00, SPEAKER\_01, …). Use it for duets, interviews, podcast clips and stitches. Speaker labels need timing to attach to, so switching this on together with **None** still returns sentence-level timing. Moves the video onto the precision price (1.5× the base); if you already picked Word timestamps, adding speakers costs nothing extra.

## `language` (type: `string`):

Leave on auto-detect unless the video mixes languages or the audio is noisy — naming the language then makes the transcript noticeably more accurate. Auto-detect covers 90+ languages; the dropdown lists the 29 most requested, and anything outside it is still transcribed on auto-detect.

## `includeSubtitles` (type: `boolean`):

Return ready-to-use subtitle files as `srt` and `vtt` fields — paste them straight into a video editor, a player or a CMS. Free of charge. Subtitles need timing to exist, so they are produced at every timestamp level except None, and also at None when speaker labels are switched on. Rows with no speech, and rows that failed, carry no subtitle fields.

## `includeMetadata` (type: `boolean`):

Attach the video's own data to each row: author, caption, hashtags, upload date, thumbnail, plus view, like, comment, save and repost counts. Which fields are present varies by video — TikTok does not return all of them for every post. Turns one run into transcript + performance data for content research. Charged as an add-on of $0.005 per video.

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

How many videos are transcribed at the same time. Higher finishes a large batch sooner. It has no effect on price — you are charged per video either way, and platform usage is on us.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@claude/video/7660583650773323022"
  ],
  "timestampLevel": "segment",
  "diarize": false,
  "language": "auto",
  "includeSubtitles": true,
  "includeMetadata": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

One row per TikTok video: the full transcript text, timed segments (with word-level timings and speaker labels when requested), SRT and VTT subtitles, detected language, video length and word count. Every URL you submit produces a row. Videos that could not be transcribed carry status 'failed' with an 'error' field, and are not charged. Videos left out because a free-plan allowance or a run cost limit was reached carry status 'skipped' with the reason in 'error', and are not charged either.

# 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/@claude/video/7660583650773323022"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deapi/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/@claude/video/7660583650773323022"] }

# Run the Actor and wait for it to finish
run = client.actor("deapi/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/@claude/video/7660583650773323022"
  ]
}' |
apify call deapi/tiktok-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deapi/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/0DLPCdzJWXv5HbkVL/builds/69rUSchFLsZ0uk1f5/openapi.json
