TikTok Transcript & Video Scraper
Pricing
from $0.30 / 1,000 ๐ video scrapeds
TikTok Transcript & Video Scraper
Extract spoken transcripts from TikTok videos as text, SRT or WebVTT with timestamps. Every video also returns 58 fields: upload date, views, likes, saves, hashtags, sounds, and creator follower counts. Pick a caption language, or download watermark-free MP4s. No login needed.
Pricing
from $0.30 / 1,000 ๐ video scrapeds
Rating
5.0
(6)
Developer
FlowExtract API
Maintained by CommunityActor stats
8
Bookmarked
81
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
Turn any TikTok URL into structured data. Get the spoken transcript, 58 metadata fields, creator profile stats, and an optional watermark-free MP4 download. No login, no API key.
Features
- ๐ Transcripts - Spoken content as plain text, timestamped segments, SRT or WebVTT
- ๐ Language Choice - Pick which caption track you get when a video offers more than one
- ๐ 58 Fields Per Video - Upload date, engagement stats, hashtags, mentions, sound details, AI-content flags
- ๐ฅ Creator Data - Handle, bio, follower count, total likes, video count, verified status
- ๐ฌ Watermark-Free Links - Direct MP4 URLs at your chosen frame rate
- ๐พ Optional Download - Store MP4s on Apify with permanent links
- ๐ Resumable Runs - State persistence survives migration, timeout and abort
- ๐ก๏ธ Block Handling - Detects TikTok's firewall challenge and rotates proxy sessions automatically
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
videoUrls | array | โ | - | TikTok video URLs. Standard, short (vm.tiktok.com) and mobile formats all work. |
includeTranscript | boolean | โ | true | Extract the spoken transcript |
transcriptFormats | array | โ | ["text","segments"] | Any of text, segments, srt, vtt |
preferredLanguage | string | โ | "auto" | Caption language to prefer, e.g. eng-US. auto uses the video's original language. |
preferredFps | string | โ | "60" | Video frame rate: "30" or "60" |
downloadVideo | boolean | โ | false | Store MP4 files on Apify |
proxyConfig | object | โ | - | Proxy configuration. Residential is strongly recommended. |
Example Input
{"videoUrls": [{ "url": "https://www.tiktok.com/@username/video/1234567890" },{ "url": "https://vm.tiktok.com/ABC123" }],"includeTranscript": true,"transcriptFormats": ["text", "segments", "srt"],"preferredLanguage": "auto","proxyConfig": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
How Transcripts Work
TikTok runs speech recognition on videos that contain speech and publishes the result as a caption track. This Actor reads that track directly. Nothing is re-transcribed, so the text matches what TikTok itself shows viewers, and extraction is fast and cheap.
Transcripts are only returned when the video has one. A video with no speech, such as music or sound effects, returns available: false along with TikTok's own reason. That is a normal result, not an error, and it is never charged.
In a sample of 31 public videos, 13 carried a transcript. Coverage is much higher on talking-head, news and tutorial content than on music or dance videos.
Choosing a language
Some videos carry more than one caption track: the original spoken language plus machine translations TikTok has already generated. Set preferredLanguage to pick one.
{ "preferredLanguage": "eng-US" }
If the language you ask for is not available on a given video, you get that video's original track instead, and transcript.language tells you what you actually received. transcript.availableLanguages lists every track the video offers, and transcript.source is ASR for speech recognition or MT for a translation of it.
The Actor never invents a translation. It only returns tracks TikTok has already published.
Sample Output
Each video produces one dataset record. Abbreviated below.
{"videoId": "1234567890","webVideoUrl": "https://www.tiktok.com/@username/video/1234567890","directUrl": "https://v16-webapp-prime.tiktok.com/...","title": "Video caption text","createTime": "2026-04-02T15:22:04.000Z","hashtags": ["cooking", "recipe"],"mentions": ["someoneelse"],"authorUsername": "username","author": "Creator Name","authorVerified": true,"authorFollowers": 4800000,"authorLikes": 120400000,"authorBio": "Profile bio text","viewCount": 734500,"likeCount": 24600,"commentCount": 181,"shareCount": 411,"collectCount": 1573,"repostCount": 0,"duration": 8,"quality": "540p","musicTitle": "original sound","musicIsOriginal": true,"transcript": {"available": true,"language": "eng-US","source": "ASR","isAutoGenerated": true,"wordCount": 42,"segmentCount": 9,"availableLanguages": ["eng-US", "spa-ES"],"text": "Full spoken transcript as a single string","segments": [{ "start": "00:00:00.380", "end": "00:00:03.600", "startSeconds": 0.38, "endSeconds": 3.6, "text": "First line of speech" }],"srt": "1\n00:00:00,380 --> 00:00:03,600\nFirst line of speech\n","error": null},"download": {"available": true,"url": "https://api.apify.com/v2/key-value-stores/.../records/...","status": "completed","fileSizeHuman": "1.5 MB"},"success": true}
Dataset Views
Seven pre-configured views, switchable from the dataset tab:
| View | Shows |
|---|---|
| Overview | Thumbnail, caption, creator, date, engagement, transcript availability |
| Transcripts | Transcript text, language, source and word count per video |
| Engagement | Views, likes, comments, shares, saves and reposts |
| Creator Data | Handle, follower count, total likes, bio, profile link |
| Sounds | Sound title, author, duration and audio link |
| Download Links | Stored file links and direct MP4 URLs |
| Failed Extractions | Error code and message for anything that did not work |
Pricing
Pay per event. You are billed for results, not for runtime.
| Event | Charged when |
|---|---|
| Run start | Once per run start, including a restart after a platform migration |
| Video scraped | A video is successfully scraped, for the full record |
| Transcript extracted | A transcript is actually returned |
| Video downloaded | An MP4 is stored, and only if you switch downloads on |
Failed videos are never charged. Videos with no speech are charged as a scrape but not as a transcript.
Downloads start a second Actor
If you switch downloadVideo on, this Actor hands the file transfer to Universal Downloader. You will see two Actor runs in your account for the same job, and that second Actor bills you separately on top of the download event here.
This is why the download event is priced low. It is meant to sit alongside the other Actor's charge rather than duplicate it.
Downloads are off by default. If you only need transcripts and metadata, leave them off and no second Actor is ever started.
Proxy Configuration
TikTok blocks datacenter traffic aggressively. Residential proxies are strongly recommended:
{"proxyConfig": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
The Actor detects TikTok's firewall challenge, which arrives as a normal-looking HTTP 200 rather than an error, and retries on a fresh session automatically.
State Persistence & Resumability
Runs are resumable. If a run is interrupted by migration, timeout or abort, the next run with the same input picks up where it stopped. State is saved every 3 videos, on migration, on abort and before exit.
Error Handling
| Error Type | Retryable | Behavior |
|---|---|---|
| Firewall challenge | โ | New proxy session, then retry |
| Network timeout | โ | Exponential backoff |
| Rate limiting (429) | โ | Extended backoff |
| Server errors (5xx) | โ | Standard backoff |
| Video not found (404) | โ | Immediate fail |
| Private/restricted video | โ | Immediate fail |
| Invalid URL | โ | Immediate fail |
Run Summary
A summary is written to the Key-Value Store under RUN_SUMMARY:
{"total": 10,"processed": 10,"successful": 9,"failed": 1,"transcripts": {"enabled": true,"extracted": 6,"unavailable": 3,"coverageRate": 67},"downloads": { "enabled": true, "successful": 9, "failed": 0 },"resumed": false,"completedAt": "2026-09-11T10:35:00.000Z"}
Limitations
- Memory is capped at 512 MB. Runs use around 110 MB in practice, and the work is network-bound rather than memory-bound, so more allocation would cost you without running faster.
- Transcripts exist only where TikTok generated captions. Videos without speech return none.
- Translated tracks are returned only where TikTok already published them. The Actor does not translate.
- Direct MP4 URLs expire after a few hours. Use
downloadVideo: truefor permanent links. - Private videos cannot be extracted, and some region-restricted videos may be unavailable.
๐ค Support & Resources
- ๐ Website: flowextractapi.com
- ๐ง Email: flowextractapi@outlook.com
- ๐ Apify Profile: FlowExtract API
- ๐ฌ GitHub Issues: FlowExtractAPI
Social Media
- ๐ผ LinkedIn: flowextract-api
- ๐ฆ Twitter: @FlowExtractAPI
- ๐ฑ Facebook: flowextractapi
Related Actors
- Universal File Downloader: Powers the intelligent download system
โ๏ธ Legal & Compliance
This Actor extracts publicly available data from TikTok. It does not log in, bypass authentication, or access private content. You are responsible for using the output in line with TikTok's Terms of Service, applicable copyright law, and data protection regulations such as GDPR and CCPA. Transcripts and video files remain the property of their creators.
Built and maintained by FlowExtract API.