# TikTok Transcript Extractor — Native Captions, SRT, No Login (`eliai/tiktok-transcript-clean`) Actor

Extract TikTok video transcripts from native captions: clean text, timestamps, SRT, language selection (ISO codes), batch URLs, short links and bare video IDs. $0.001 per transcript — and unlike per-result competitors, videos without captions are never charged. No login, no cookies.

- **URL**: https://apify.com/eliai/tiktok-transcript-clean.md
- **Developed by:** [Anthony Snider](https://apify.com/eliai) (community)
- **Categories:** Social media, Videos, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 extracted 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/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

## TikTok Transcript (Clean)

Extract TikTok video transcripts as **clean, readable text** — plain-prose paragraphs, per-line timestamps, and a ready-to-use SRT string, plus the video's full metadata (author, views, likes, music). Paste full links, share-sheet short links (`vm.tiktok.com/…`), or bare video IDs.

### Why this one

- **Pay only for real transcripts.** A meaningful share of TikTok videos have no captions at all — in an 11-video sample of popular TikToks we measured (2026-08-07), 3 of 11 had none: every dance, silent-comedy, and pre-2022 video in the sample, while 8 of 9 current speech videos were captioned. Actors that bill per *result* charge you for those empty, metadata-only records. This actor bills per **transcript actually extracted** — a caption-less video returns an uncharged record with the video's metadata and a clear reason.
- **Parsed, not raw.** You get plain text, timestamped segments, and SRT — not a raw WEBVTT blob to post-process.
- **Native captions, exact wording.** Transcripts come from TikTok's own caption tracks (including its auto-captions), not a re-transcription — what you get matches what viewers see.
- **Fast and robust.** No browser, no login. A typical video takes well under a second. Bad URLs, deleted videos, and private videos produce clean per-item error records — one bad item never stops a batch.

### Input

| Field | Description |
| --- | --- |
| `videoUrl` | Any TikTok video URL, a `vm.tiktok.com` / `tiktok.com/t` short link, or a bare numeric video ID |
| `videoUrls` | Batch of videos in one run |
| `language` | Preferred caption language (`en`, `es`, `de`, …). Falls back to English, then the first available track; every record lists `availableLanguages` |
| `format` | `paragraphs` (readable prose, default) or `raw` (one block) |
| `includeTimestamps` | Adds per-line timestamps and an SRT subtitle string (default `true`) |
| `maxVideos` | Safety cap, 1–200 — also your budget cap since billing is per transcript |

### Output (one record per video)

```json
{
  "videoId": "7478435819724934446",
  "url": "https://www.tiktok.com/@garyvee/video/7478435819724934446",
  "ok": true,
  "title": "Please please never ever ever ever ... make yourself lesser than anyone.",
  "author": "garyvee",
  "authorName": "GaryVee",
  "durationSeconds": 26,
  "playCount": 306500,
  "likeCount": 12000,
  "createTime": "2026-03-04T15:21:08.000Z",
  "music": { "title": "original sound", "author": "GaryVee" },
  "language": "eng-US",
  "isAutoGenerated": true,
  "availableLanguages": ["eng-US"],
  "cuesAfterDedup": 13,
  "wordCount": 108,
  "transcript": "You feel lesser than in a room? ...",
  "segments": [{ "start": 0.02, "timestamp": "00:00", "text": "You feel lesser than in a room?" }],
  "srt": "1\n00:00:00,020 --> 00:00:01,220\n..."
}
```

Videos without captions come back as `{ "ok": false, "error": "No captions on this video …" }` **with the metadata included** — and are never charged.

### Pricing

$0.001 per extracted transcript. The most-used alternative (scrape-creators/best-tiktok-transcripts-scraper, $0.001 per result) charges for every result including caption-less videos; this actor never charges a video that yields no transcript (measured 2026-08-07).

### Common uses

- Feed TikTok content to an LLM (summaries, trend analysis, RAG pipelines)
- Subtitle files (SRT) for re-edits, translations, accessibility
- Social listening and creator research with engagement metadata attached
- Quote mining and content repurposing (video → blog/newsletter)

### Notes and honest limits

- TikTok generates captions only for videos with recognizable speech; silent or music-only videos legitimately have none — you are not charged for those.
- Transcripts are TikTok's native tracks; if TikTok's own ASR misheard a word, the transcript reflects that.
- Extraction reads TikTok's public web player data — no login, no cookies, and none of your account credentials are ever involved.

### Use from code or AI agents

Run it from any HTTP client and get the transcripts back in the same call:

```bash
curl -X POST "https://api.apify.com/v2/acts/eliai~tiktok-transcript-clean/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrl": "https://www.tiktok.com/@garyvee/video/7478435819724934446"}'
```

Or with the Apify JS client:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('eliai/tiktok-transcript-clean').call({
  videoUrls: ['https://www.tiktok.com/@garyvee/video/7478435819724934446', '7478435819724934446'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

AI agents can call this actor as a tool through [Apify's MCP server](https://mcp.apify.com) — an MCP-enabled agent can discover it, read the input schema, and fetch TikTok transcripts autonomously.

### FAQ

**How do I get the transcript of a TikTok video?** Paste the link into `videoUrl` and run — full links, `vm.tiktok.com` / `tiktok.com/t` share-sheet short links, and bare numeric video IDs all work. The `transcript` field is clean prose; `segments` and `srt` carry the timing.

**Why did a video come back with "no captions"?** TikTok generates captions only for videos with recognizable speech — dances, silent comedy, and music-only videos legitimately have none. You get the video's metadata anyway and are not charged for it.

**Is this a re-transcription of the audio?** No — transcripts come from TikTok's own caption tracks (including its auto-captions), so the wording matches exactly what viewers see on screen.

**Can I get subtitles as an SRT file?** Yes. With `includeTimestamps` on (the default), every result includes a ready-to-use `srt` string.

**Do I need to log in or provide cookies?** No — extraction reads TikTok's public web player data. No login, no cookies, no account credentials involved.

**Can I transcribe a list of videos at once?** Put up to 200 links in `videoUrls` — one captionless or deleted video never stops the rest, and you pay only per transcript actually extracted.

**Which languages are supported?** Whatever caption tracks the video carries — set `language` (e.g. `es`, `de`) to prefer one; every record lists `availableLanguages` so you can see what exists.

# Actor input Schema

## `videoUrl` (type: `string`):

Any TikTok video URL — full link, vm.tiktok.com / tiktok.com/t short link from the share sheet, or a bare numeric video ID.

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

Extract many transcripts in one run. One video without captions never stops the rest.

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

Preferred caption language, e.g. en, es, de. Falls back to English, then the first available track. Each result lists availableLanguages.

## `format` (type: `string`):

Paragraphs is readable prose. Raw is one continuous block.

## `includeTimestamps` (type: `boolean`):

Adds per-line timestamps and a ready-to-use SRT subtitle string.

## `maxVideos` (type: `integer`):

Safety cap. You are charged per transcript actually extracted, so this is also your budget cap.

## Actor input object example

```json
{
  "videoUrl": "https://www.tiktok.com/@garyvee/video/7478435819724934446",
  "videoUrls": [],
  "language": "en",
  "format": "paragraphs",
  "includeTimestamps": true,
  "maxVideos": 25
}
```

# Actor output Schema

## `results` (type: `string`):

Every item this run produced, as JSON.

## `resultsCsv` (type: `string`):

The same items as a spreadsheet-ready CSV.

# 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 = {
    "videoUrl": "https://www.tiktok.com/@garyvee/video/7478435819724934446",
    "videoUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("eliai/tiktok-transcript-clean").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 = {
    "videoUrl": "https://www.tiktok.com/@garyvee/video/7478435819724934446",
    "videoUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("eliai/tiktok-transcript-clean").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 '{
  "videoUrl": "https://www.tiktok.com/@garyvee/video/7478435819724934446",
  "videoUrls": []
}' |
apify call eliai/tiktok-transcript-clean --silent --output-dataset

```

## MCP server setup

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

```

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/mkckHYUpEpX0pO2fv/builds/AxR8ieSn4PMCglrty/openapi.json
