TikTok Transcript & Subtitle Scraper
Pricing
from $1.00 / 1,000 transcript extracteds
TikTok Transcript & Subtitle Scraper
Extract TikTok subtitles & transcripts instantly from native captions — no Whisper, no API key. Get timestamped JSON, SRT, VTT, plain text, or LLM-ready output. Supports video URLs, short links, and @profile batch scraping. Rich metadata included. Pay only for successful extractions.
Pricing
from $1.00 / 1,000 transcript extracteds
Rating
0.0
(0)
Developer
Richard Feng
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
10 days ago
Last modified
Categories
Share
TikTok Subtitle & Transcript Scraper
Extract subtitles and transcripts from any public TikTok video — instantly, accurately, at scale. No API key, no Whisper, no speech-to-text. Just the exact captions TikTok already generated, delivered in the format you need.
💡 Why this Actor?
Most TikTok transcript tools on Apify use Whisper AI to re-transcribe audio. That's slow, expensive, and can hallucinate words that were never said.
This Actor takes a different approach: it extracts TikTok's native captions directly from their CDN. The same subtitles viewers see on-screen, pulled in milliseconds instead of minutes.
| This Actor | Whisper-based actors | |
|---|---|---|
| Speed | ~2s per video | 10–30s per video |
| Accuracy | Exact (TikTok's own captions) | ~95% (AI can mishear) |
| Cost | Pay per result only | Pay per result + Whisper API |
| Languages | All that TikTok provides | Depends on model |
🚀 Quick start
Paste one or more TikTok URLs and hit Start:
{"urls": ["https://www.tiktok.com/@tiktok/video/7627209981670001950"]}
That's it. You'll get the full transcript with timestamps, metadata, and engagement stats.
📋 What you can pass as input
The urls field accepts any mix of:
https://www.tiktok.com/@username/video/7123456789012345678 (video URL)https://vm.tiktok.com/ZMrAbCdEf (short link)https://vt.tiktok.com/ZSrXyZ123 (short link)https://www.tiktok.com/t/ZTRaBcDeF (short link)https://www.tiktok.com/@username (all videos from profile)@username (profile shorthand)7123456789012345678 (raw video ID)
When you pass a profile URL or @username, the Actor enumerates that user's videos and extracts subtitles from each one. Use maxVideos to limit how many.
📋 Input reference
| Field | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | TikTok URLs, short links, @username handles, or raw video IDs |
outputFormat | select | json | json srt vtt text llm |
languages | string[] | ["eng"] | Preferred languages in priority order. Prefix matching supported — eng matches eng-US |
includeAutoGenerated | boolean | true | Include TikTok's auto-generated captions |
maxVideos | integer | 0 | Max videos to process in total across all inputs. 0 = unlimited. Videos you name explicitly are taken first, then profiles fill whatever budget is left |
maxConcurrency | integer | 3 | Parallel workers (1–10). Lower = safer from rate limits |
proxyConfiguration | object | No proxy | A proxy for every request. Without one, a video page TikTok refuses is fetched again through Apify's residential proxy; an Apify proxy group gets the same retry, and your own proxyUrls are used as they are |
📤 Example output
Real output from @tiktok/video/7627209981670001950:
{"videoId": "7627209981670001950","url": "https://www.tiktok.com/@tiktok/video/7627209981670001950","title": "your TikTok grandpa @writers cramp is proud of you","authorName": "TikTok","authorId": "tiktok","description": "your TikTok grandpa @writers cramp is proud of you","createTime": "2026-04-10T19:10:35.000Z","playCount": 54600,"likeCount": 3656,"commentCount": 837,"shareCount": 291,"thumbnail": "https://p16-common-sign.tiktokcdn-us.com/...","availableLanguages": ["eng-US"],"language": "eng-US","isAutoGenerated": true,"segments": [{ "text": "I'm 81 years old and I'm known as the TikTok Grandpa", "start": 0.04, "end": 3.64 },{ "text": "my name is Ian Smith", "start": 3.641, "end": 4.721 },{ "text": "and I make positive thinking and motivational videos as writers cramp", "start": 4.722, "end": 9.001 }],"text": "I'm 81 years old and I'm known as the TikTok Grandpa my name is Ian Smith and I make positive thinking and motivational videos...","duration": 77,"wordCount": 243,"segmentCount": 29,"extractedAt": "2026-04-12T02:45:36.000Z","error": null}
The segments array (with start/end timestamps in seconds) is included when outputFormat is json. Other formats populate the text field and optionally srt or vtt.
📤 Output formats
| Format | What you get | Best for |
|---|---|---|
| json | text + segments[] with timestamps | RAG pipelines, structured data, analytics |
| srt | text + srt (SubRip subtitle file) | Video editing, subtitle files |
| vtt | text + vtt (WebVTT subtitle file) | Web players, accessibility |
| text | text only (plain transcript) | Search indexing, simple analysis |
| llm | text cleaned of [Music], speaker labels, annotations | AI training, summarization, content repurposing |
🗂️ Output fields
Every result includes full video metadata alongside the transcript:
| Field | Description |
|---|---|
videoId | TikTok video ID |
url | Canonical video URL |
title / description | Video caption text |
authorName / authorId | Creator display name and handle |
createTime | ISO 8601 publish timestamp |
playCount / likeCount / commentCount / shareCount | Engagement metrics |
thumbnail | Cover image URL |
availableLanguages | All subtitle languages found on this video |
language | Language code of the extracted transcript, e.g. eng-US |
languageName | Human-readable language, e.g. English (United States) |
isAutoGenerated | true if captions are auto-generated, false if creator-uploaded |
segments | Array of { text, start, end } (JSON format only) |
text | Full transcript as a single string |
srt / vtt | Subtitle file content (only when that format is selected) |
duration | Video length in seconds |
wordCount / segmentCount | Transcript statistics |
extractedAt | When the extraction happened |
error | null on success. Inputs that fail still produce a row, with error set and the other fields empty — so every input is accounted for in the dataset |
🎯 Profile scraping
Pass @username or a profile URL to extract subtitles from multiple videos:
{"urls": ["@tiktok"],"maxVideos": 10,"outputFormat": "llm"}
The Actor fetches the profile, enumerates videos via TikTok's creator API, then processes each video's subtitles individually. Pagination is handled automatically — set maxVideos to control how many.
💳 Pricing
Pay-Per-Event — you're charged a fixed amount per successfully extracted transcript. You are never charged for:
- Failed extractions (video has no captions, network error, etc.)
- URL resolution (short links, profile enumeration)
- Videos that are private, deleted, or region-locked
If you set a maximum total charge on the run, the Actor stops as soon as the platform reports that budget is reached, rather than continuing to extract unpaid.
⚙️ Proxy
By default the Actor reads TikTok without a proxy. When TikTok refuses a video page — a block page, a captcha, a 403 or a 429 — that page is fetched again through Apify's residential proxy, on a new session and from a US address unless you set a proxy country.
To send every request through a proxy, set proxyConfiguration: pick an Apify proxy group, and a refused page still gets the residential retry; or supply your own proxyUrls, which are used as they are.
⚠️ Limitations
- Public videos only — private or restricted content is not accessible
- Existing captions only — this Actor extracts captions that TikTok already has. Videos without any subtitles (no auto-generated or creator-uploaded captions) will return an error. For those, you need a Whisper-based transcription tool
- Auto-caption availability — TikTok doesn't generate captions for every video. Very short clips, music-only content, or videos in unsupported languages may not have captions
- Thumbnail URLs expire — TikTok serves cover images from a signed CDN, and the
thumbnaillink stops working within hours. Download the image if you need to keep it - Rate limits — TikTok rate-limits requests per IP. The Actor fetches a refused page again from another IP and has configurable concurrency, but very large batches may need lower concurrency settings
💡 Use cases
- RAG pipelines — feed TikTok transcripts into vector databases for retrieval-augmented generation
- Content repurposing — convert viral TikToks into blog posts, newsletters, or threads
- Competitive analysis — extract and analyze competitor content at scale
- Trend research — analyze language, topics, and messaging across thousands of videos
- Accessibility — generate subtitle files (SRT/VTT) for reposting on other platforms
- Training data — build multilingual datasets from TikTok's auto-generated captions
- SEO — make TikTok video content searchable and indexable
🤖 Use with AI agents
This Actor is callable as a tool by any MCP-capable agent — Claude, Cursor, VS Code — or by your own code, with no wrapper and nothing extra to deploy.
Connect over MCP
https://mcp.apify.com?tools=autofacts/tiktok-subtitle-transcript-scraper
In a client that reads an mcpServers configuration block:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=autofacts/tiktok-subtitle-transcript-scraper","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
The agent reads this Actor's parameters and their descriptions straight from the input schema, and the hosted server infers the result field types from the dataset schema — so a model knows what to send and what comes back before it ever calls anything.
Or call the API directly
curl -X POST "https://api.apify.com/v2/acts/autofacts~tiktok-subtitle-transcript-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"urls": ["https://www.tiktok.com/@tiktok/video/7627209981670001950"], "languages": ["eng"]}'
The response body is the dataset records described above.
🧰 Other Actors by autofacts
Apify only auto-recommends Actors in the same category, so here are the ones that actually pair with this scraper:
| Actor | What it's for |
|---|---|
| YouTube Subtitle & Transcript Scraper | Video captions as clean text |
| Google Trends Trending Now | What is trending on Google right now, in 125 countries, to find the videos worth transcribing |
| Bluesky Scraper | Posts, profiles, feeds and interactions |
| Schema Markup Scraper & SEO Auditor | JSON-LD, Open Graph and a 0-100 SEO audit of any URL |
| Universal Web Printer | Turn any URL or HTML into PDF, PNG, JPEG or WebP |
All of them: apify.com/autofacts