TikTok Transcript Scraper - Captions & Subtitles, Paid If Found avatar

TikTok Transcript Scraper - Captions & Subtitles, Paid If Found

Pricing

from $2.92 / 1,000 transcript returneds

Go to Apify Store
TikTok Transcript Scraper - Captions & Subtitles, Paid If Found

TikTok Transcript Scraper - Captions & Subtitles, Paid If Found

Get the transcript of TikTok videos from their URLs: every caption language TikTok publishes (auto captions and machine translations) as plain text, WebVTT, SRT and timed segments, with views and likes. Charged only for videos that return a transcript.

Pricing

from $2.92 / 1,000 transcript returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Share

Get the transcript of public TikTok videos from their URLs. For each video you get the spoken words as plain text, WebVTT, SRT and timed segments, in every caption language TikTok publishes for it (the original-language auto captions and TikTok's machine translations), together with the author, description, duration and view, like, comment, share and save counts.

You pay only for videos that actually return a transcript. A video without captions, a deleted video, a bot check or a mistyped URL comes back as a free row that says why - never as a blank, charged row.

What you can use it for

  • Content research and repurposing: turn TikTok videos into blog posts, newsletters, scripts or summaries without watching them.
  • AI pipelines: feed transcriptText into an LLM for summaries, topic tagging, sentiment or Q&A. The segments keep timestamps if you need to quote a moment.
  • Subtitles: download ready-made .vtt or .srt bodies for re-editing or translation.
  • Multilingual work: a Japanese video can come back with its Japanese captions and TikTok's English translation in the same row.
  • Performance analysis: spoken hooks next to views and likes.

How it works

  1. Paste video URLs (https://www.tiktok.com/@name/video/1234567890123456789), bare numeric video ids, or vm.tiktok.com short links.
  2. For each video the Actor opens the public video page, checks that TikTok answered with the same video id you asked for, and reads the list of captions TikTok publishes for it.
  3. It downloads each caption file, checks that it is a WebVTT file with text whose last caption ends within the video's length (plus 3 seconds), and returns it in four formats.
  4. The row is written and charged. Videos without a transcript get a free row with the reason.

This Actor does not run speech-to-text. It returns the captions TikTok itself publishes. When TikTok lists no captions for a video, you get a free no-captions row.

Input

FieldDefaultWhat it does
videosexample videosVideo URLs, numeric video ids or short links. A repeated video is read and charged once; the repeat gets a free duplicate row.
languagesallCaption languages to return: en, en-US, eng or eng-US style codes. Matching is by language, not region.
includeMachineTranslationstrueReturn captions TikTok marks as machine translation (MT).
includeVtttrueAdd a WebVTT body per caption track.
includeSrttrueAdd an SRT body per caption track.
includeSegmentstrueAdd timed segments (start, end in seconds, text).
maxVideos100Stop after this many transcript rows. Up to 1,000 entries per run.
useProxytrueRetry through a proxy only if TikTok answers with a bot check.
{
"videos": [
"https://www.tiktok.com/@mrbeast/video/7654638524729216287",
"https://www.tiktok.com/@user6222822550964/video/7371575672298425621"
],
"languages": [],
"includeMachineTranslations": true
}

If you leave videos out of the input, the two example videos above are read (their URLs appear in inputUrl and the run log says so). An empty list is rejected with a free invalid-input row instead of reading the examples.

Output

One row per video with a transcript (shortened):

{
"status": "ok",
"videoId": "7654638524729216287",
"videoUrl": "https://www.tiktok.com/@mrbeast/video/7654638524729216287",
"authorUsername": "mrbeast",
"authorMatchesInput": true,
"durationSeconds": 24,
"transcriptLanguage": "eng-US",
"transcriptSource": "ASR",
"transcriptText": "Who's faster, me or the fastest man to ever live? I hope this slows him down. ...",
"transcriptCount": 1,
"transcripts": [
{
"languageCode": "eng-US",
"source": "ASR",
"sourceName": "automatic speech recognition",
"isAutoGenerated": true,
"isOriginalLanguage": true,
"text": "Who's faster, me or the fastest man to ever live? ...",
"segmentCount": 13,
"lastCueEndSeconds": 24.041,
"vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.180\nWho's faster, me or the fastest man to ever live?\n...",
"srt": "1\n00:00:00,000 --> 00:00:03,180\nWho's faster, me or the fastest man to ever live?\n...",
"segments": [{ "start": 0, "end": 3.18, "text": "Who's faster, me or the fastest man to ever live?" }]
}
],
"availableLanguages": ["eng-US (ASR)"],
"languagesNotReturned": [],
"playCount": 32300000,
"likeCount": 2900000,
"commentCount": 48100,
"shareCount": 35500,
"saveCount": 118851,
"countsMayBeRounded": true
}
FieldMeaning
transcriptTextPlain text of the caption track in the video's original language (or the first returned track if TikTok does not mark one as original). Japanese and Chinese captions are joined without inserted spaces; other languages, Korean included, are joined with a space.
transcripts[]Every returned caption track: languageCode as TikTok writes it (eng-US, jpn-JP, spa-ES), source as TikTok writes it (ASR or MT), isAutoGenerated and isOriginalLanguage as TikTok marks them, and the text in the formats you asked for.
availableLanguagesEvery caption track TikTok lists for the video, as language (source).
languagesNotReturnedTracks that were listed but not returned, with the reason (language-not-requested, machine-translation-not-requested, longer-than-video, no-text, not-webvtt, caption-file-blocked, ...).
authorMatchesInputfalse when the URL you gave has a different username than the video's author. TikTok serves the video by id whatever name is in the URL, so the id decides which video you get and this field tells you the name did not match.
resolvedFromShortLinkThe short link you gave, when the video was reached through one (also on free rows for such videos).
playCount, likeCount, commentCount, shareCount, saveCountThe counts TikTok puts on the video page.
countsMayBeRoundedtrue when a view, like, comment or share count is 10,000 or more.

About the counts

TikTok's video page carries the counts the way the app displays them. On the videos measured on 2026-09-14, every view, like, comment and share count of 10,000 or more was rounded to the displayed figure (32.3M came back as 32300000, 981.4K as 981400), counts below 10,000 were not rounded (7955), and the save count was not rounded even above 10,000 (118851). Treat large counts as approximate.

Rows that are not charged

statusWhen
no-captionsTikTok lists no captions for the video. TikTok's own noCaptionReasonCode (for example 3) is passed through untranslated, with hasOriginalAudio as TikTok marks it.
no-such-videoTikTok says the video does not exist (code 10204, "item doesn't exist").
different-video-returnedTikTok answered with a different video id than the one asked for; its captions are not returned.
no-matching-languageThe video has captions, but not in the languages or caption types you asked for. The row lists what is available.
captions-unreadableCaptions are listed but none could be read as this video's transcript (the row lists the reason per language, such as a caption address outside TikTok's own domains).
short-link-not-a-videoThe short link does not redirect to a video page.
blockedTikTok answered with a bot check or an empty page on every try.
unreadableThe page could not be read, or TikTok answered with a code whose meaning has not been measured (passed through as tiktokStatusCode).
invalid-inputThe entry is not a TikTok video URL, id or short link, or videos is an empty list.
duplicateThe same video was already handled by an earlier entry in this run.
not-checkedmaxVideos transcripts were already returned, or the list is longer than 1,000 entries. The row says how many entries were not read.
budget-reachedThe run's maximum total charge has no room for another transcript row. The row says how many entries were not read.

Pricing

$4.00 per 1,000 transcript rows, charged only for rows with status: "ok". One row per video, whatever the number of caption languages in it. Free rows are never charged. If you set a maximum total charge for the run, the Actor stops reading videos when no further transcript row fits, and says so in a budget-reached row.

Limits and notes

  • Only captions TikTok publishes are returned. There is no speech-to-text, so videos with music only, no speech, or captions TikTok has not generated come back as no-captions.
  • Private videos and videos TikTok restricts have not been measured; they come back as a free row with TikTok's own code rather than a guessed reason.
  • Photo posts (/photo/ URLs) are accepted and read by id; whether TikTok lists captions for them has not been measured.
  • Short links are followed one redirect. The Actor only uses the target when it is a TikTok video address it accepts as input (/@name/video/<id>, /@name/photo/<id> or m.tiktok.com/v/<id>.html).
  • Requests go out one after another with a pause between video pages. In a run on 2026-09-14, 16 entries took 20 seconds.

FAQ

Do I need a TikTok account or API key? No. The Actor reads public video pages.

Which languages are supported? Whatever TikTok publishes for the video. Codes are passed through as TikTok writes them.

Can I get the transcript of a video without captions? Not with this Actor; it does not transcribe audio.

Is it legal? The Actor reads publicly available pages. Transcripts may contain personal data; use them for legitimate purposes and in line with the laws that apply to you.