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.
- π 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
| 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. |
{
"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"] }
}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.
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.
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
}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 |
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.
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.
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.
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 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 |
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"
}- 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.
- π Website: flowextractapi.com
- π§ Email: flowextractapi@outlook.com
- π Apify Profile: FlowExtract API
- π¬ GitHub Issues: FlowExtractAPI
- πΌ LinkedIn: flowextract-api
- π¦ Twitter: @FlowExtractAPI
- π± Facebook: flowextractapi
- Universal File Downloader: Powers the intelligent download system
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.