TikTok Transcripts Scraper | Bulk Captions, SRT & Translations avatar

TikTok Transcripts Scraper | Bulk Captions, SRT & Translations

Pricing

from $0.85 / 1,000 video transcripts

Go to Apify Store
TikTok Transcripts Scraper | Bulk Captions, SRT & Translations

TikTok Transcripts Scraper | Bulk Captions, SRT & Translations

Get TikTok transcripts in bulk from video links, share links or IDs: plain text, timed segments, SRT and WebVTT subtitles, spoken language and TikTok's own translations, plus views, likes and creator stats. Videos without captions get a free row; only transcripts are charged.

Pricing

from $0.85 / 1,000 video transcripts

Rating

0.0

(0)

Developer

Corvuslab

Corvuslab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Categories

Security

Limited permissions

Share

What does TikTok Transcripts Scraper do?

TikTok Transcripts Scraper turns a list of TikTok videos into clean, ready-to-use transcripts, in bulk. Paste as many video links as you like and get one row per video: the full spoken transcript as plain text, timed segments with start and end seconds, optional SRT and WebVTT subtitle files, the spoken language, and TikTok's own translations when TikTok has them. Each row also carries the video's caption, views, likes, comments, shares and saves, plus the creator's handle, follower count and verification badge. No code and no setup: export as JSON, CSV or Excel, pull it through the API, or feed it straight into an AI agent.

Give it full video URLs, the short share links the TikTok app's Share button creates (vm.tiktok.com/..., tiktok.com/t/...) or bare video IDs. Mixed lists are fine and duplicates are collapsed automatically. Every link you paste comes back as a row, and only rows with a transcript are charged. Videos without captions, photo slideshows, deleted videos and links that aren't videos get a free row saying why, so you always know what happened to each link.

Don't have the video links yet? Name a profile (@nasa), a keyword or a hashtag instead, and the Actor finds the videos and transcribes them. A profile gives you its most recent videos, newest first.

New to Apify? Sign up free and use the included monthly platform credit to try this Actor. No credit card needed.

  • TikTok Comments Scraper — every comment and reply under any TikTok video, with the commenter's handle, likes and reply count.
  • TikTok Profile Scraper — follower counts, bio, bio links and emails for any TikTok account, plus its full follower and following lists.
  • TikTok Shop Scraper — TikTok Shop products by keyword or URL, with price, units sold, reviews, seller details and the video selling each listing.
  • TikTok Shop Creator Scraper — the TikTok Shop affiliates already selling any product or keyword, with their bio email and shoppable videos.

What data can you extract from TikTok videos?

Every record carries 46 fields, grouped like this:

GroupWhat you get
Transcripttext (full transcript), segments (start/end seconds + line), srt, vtt, wordCount, language, languageCode, isAutoGenerated, availableLanguages
Translationstranslations[]: TikTok's own translation of the transcript, each with language, languageCode, plain text, timed segments and optional srt / vtt
Videoid, url, title (the video caption), titleLanguage, hashtags, createTime, createTimeISO, duration, videoUrl, coverUrl
EngagementplayCount, diggCount (likes), commentCount, shareCount, collectCount (saves)
CreatoruniqueId, nickname, authorId, secUid, avatarUri, signature (bio), verified, followerCount, followingCount, heartCount, videoCount
Status & monitoringinputUrl, transcriptStatus, errMsg, timestamp, dataType, contentHash, plus changeType, isRepost, repostOfId and repostDetectedAt in incremental mode

Key features

  • 📥 Bulk by design: a whole spreadsheet of links in one run, not one video at a time. Tracking parameters are stripped and duplicates collapsed.
  • 🔎 No links needed: transcribe a creator's latest videos from just their @handle, or every video found for a keyword or hashtag.
  • 🧾 Transcript in every useful shape: plain text for reading and search, timed segments for analysis, SRT for video editors and WebVTT for web players. Switch each one on or off.
  • 🗣️ Spoken language detected: every transcript is tagged with its language (spa-ES / es) and whether TikTok generated the captions automatically or the creator supplied them.
  • 🌍 TikTok's own translations into English, Spanish, French, Portuguese, German, Arabic and Chinese (Simplified), each with its own timed segments.
  • 💸 Pay only for transcripts: every link gets a row so your list reconciles, but only rows with a transcript are charged. maxResults counts transcripts, not attempts.
  • ♻️ Cheap to monitor: incremental mode never re-delivers or re-bills a transcript you already have.
  • 🔔 Alerts to Telegram, Slack, Discord or any webhook (n8n / Make / Zapier) when new transcripts arrive.
  • 🤖 AI-ready: compact and drop-empty output modes keep payloads small for LLMs, RAG pipelines and MCP clients.

🚀 How to scrape TikTok transcripts

  1. Open the Actor and paste your TikTok video links into TikTok video URLs, one per line.
  2. (Optional) Under Languages, pick the translations you want collected.
  3. Under Output, choose the formats: timed segments are on by default; tick SRT and/or WebVTT if you need subtitle files.
  4. Click Start. One row per video streams into the Output tab within seconds.
  5. Download as JSON, CSV or Excel, or pull the results from the API.

Quick-start example input

{
"videoUrls": [
"https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392",
"https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"
],
"translateTo": ["en"],
"includeSrt": true
}

This returns two rows: an English cartoon clip and a Spanish news bulletin, each with its full transcript, timed segments and a ready-to-import SRT file. The Spanish video also comes with TikTok's English translation, so you can read it without translating it yourself.


Input

Configure it in the visual editor with no code, or pass JSON through the API. Inputs are grouped exactly as they appear in the editor.

🎬 Videos

FieldTypeWhat it does
videoUrlsarrayTikTok videos, one per line: full URLs, vm.tiktok.com / tiktok.com/t/ share links or bare video IDs. Each video becomes one row. A profile (@nasa), tag or search link pasted here works too.
profileUrlsarrayTikTok accounts as @handle or profile link. Transcribes each account's most recent videos that can be found, newest first. A recent selection, not the account's full archive.
searchQueriesarrayKeywords to find videos for, e.g. iphone 17 review.
hashtagsarrayHashtags to find videos for, with or without the #.
videosPerSourceintegerHow many videos to transcribe from each profile, keyword or hashtag (default 10, up to 100). Videos you paste directly are always all included.
maxResultsintegerStop after this many transcripts. Leave empty to transcribe every video in the list (up to 20,000 transcripts per run).

For videos found from a profile, keyword or hashtag, inputUrl says which one found it (@nasa, #booktok, 'iphone 17 review').

API users can also pass a single link as videoUrl (string); it is merged into the list, so integrations built around one video per call work unchanged.

🌍 Languages

FieldTypeWhat it does
translateToarrayAlso collect TikTok's translation into any of: en English, es Spanish, fr French, pt Portuguese, de German, ar Arabic, zh-Hans Chinese (Simplified). See the FAQ on when translations are available.

📄 Output

FieldTypeWhat it does
includeSegmentsbooleanEach spoken line with its start and end time in seconds. On by default.
includeSrtbooleanAdd the transcript as an SRT subtitle file.
includeVttbooleanAdd the transcript as a WebVTT subtitle file.
includeVideosWithoutCaptionsbooleanAdd a free row for videos with no captions and for photo posts. On by default. Dead or invalid links always get a row.
compactbooleanOnly the transcript and core video fields (listed under Output).
excludeEmptyFieldsbooleanDrop null, empty-string and empty-array fields from each record.

♻️ Incremental monitoring and 🔔 Notifications

incrementalMode, stateKey, emitUnchanged, emitExpired and the notification channels are explained in their own sections below.

⚙️ Advanced

FieldTypeWhat it does
proxyConfigurationobjectNot needed. The scraper works without a proxy; turn one on only if requests start being refused.
maxConcurrencyintegerVideos read in parallel (1–10, default 5).
maxRequestRetriesintegerRetries for a failed request before the video is marked as failed (0–10, default 3).

More example inputs

Transcripts only, compact, for an AI pipeline:

{
"videoUrls": ["https://vm.tiktok.com/ZMxxxxxxx/", "7587841579029679392"],
"includeVideosWithoutCaptions": false,
"compact": true,
"excludeEmptyFields": true
}

Multilingual subtitles for a localisation team:

{
"videoUrls": ["https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333"],
"translateTo": ["en", "fr", "pt"],
"includeSrt": true,
"includeVtt": true
}

Output

Each dataset item is one video. A real record (the Spanish news video from the quick-start, with segments and the English translation shortened for display):

{
"id": "7698589001103576333",
"url": "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
"inputUrl": "https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
"transcriptStatus": "OK",
"text": "Esta noche noticias telemundo exigen respuestas. México presentará una denuncia en estados unidos por la muerte de un mexicano bajo custodia de ais en texas. La familia de esta persona denuncia que le negaron medicamentos y exigen respuestas sobre su fallecimiento. …",
"language": "spa-ES",
"languageCode": "es",
"isAutoGenerated": true,
"wordCount": 191,
"segments": [
{ "start": 0.32, "end": 3.32, "text": "Esta noche noticias telemundo exigen respuestas." },
{ "start": 3.44, "end": 4.4, "text": "México presentará" },
{ "start": 4.401, "end": 4.881, "text": "una denuncia" }
],
"translations": [
{
"language": "eng-US",
"languageCode": "en",
"text": "Tonight telemundo news demands answers. Mexico will present a complaint in the united states for the death of a mexican in ais custody in texas. …",
"segments": [
{ "start": 0.32, "end": 3.32, "text": "Tonight telemundo news demands answers." },
{ "start": 3.44, "end": 4.4, "text": "Mexico will present" }
]
}
],
"availableLanguages": ["es", "en"],
"title": "📌 Estas son las noticias que debes saber antes que termine el lunes 19 de octubre de 2026.",
"titleLanguage": "es",
"createTime": 1792467435,
"createTimeISO": "2026-10-20T03:37:15+00:00",
"duration": 67,
"playCount": 37800,
"diggCount": 1719,
"commentCount": 6,
"shareCount": 8,
"collectCount": 72,
"uniqueId": "noticiastelemundo",
"nickname": "Noticias Telemundo",
"authorId": "7026015251758613509",
"signature": "Cuenta oficial de Noticias Telemundo. #LasCosasComoSon",
"verified": true,
"followerCount": 17800000,
"followingCount": 100,
"heartCount": 495900000,
"videoCount": 9358,
"errMsg": "",
"timestamp": "2026-10-20T16:28:56.841551+00:00",
"dataType": "transcript",
"contentHash": "b25c8f298cb64752b7ae1e60b1d1badacccff0ce"
}

With SRT switched on, the same transcript also arrives in srt, ready to drop into a video editor:

1
00:00:00,320 --> 00:00:03,320
Esta noche noticias telemundo exigen respuestas.
2
00:00:03,440 --> 00:00:04,400
México presentará

A video TikTok has no captions for comes back as a free row with the video and creator fields filled in, transcriptStatus: "NO_CAPTIONS" and an errMsg such as "TikTok has no captions for this video, so there is no transcript to return."

Every field is present in standard mode (missing values are null). Compact mode returns only id, url, transcriptStatus, text, language, title, uniqueId, createTimeISO, duration, playCount, errMsg and contentHash. excludeEmptyFields drops empties entirely. The Output tab also has three ready-made views: Transcripts (status, language, word count and text at a glance), Timed transcript (segments, translations and SRT side by side) and Video & creator (engagement and creator stats).


♻️ How to monitor TikTok transcripts with incremental mode

Keep a running list of videos (your brand's, your competitors', a set of creators you follow), add new links as they're posted, and schedule the Actor with incremental mode on. Each run compares against the last and returns only transcripts you haven't received yet: NEW for a first-time transcript, UPDATED when the words themselves change (for example, a creator replaces their captions). View, like, comment and share counts move on every run, so they are deliberately not treated as a change. An unchanged transcript is skipped and not billed again.

FieldTypeWhat it does
incrementalModebooleanRemember delivered transcripts and tag each record NEW / UPDATED / UNCHANGED / EXPIRED.
stateKeystringStable name for the tracked list. Auto-derived from your links if blank; set it yourself if you add videos over time.
emitUnchangedbooleanAlso return transcripts that haven't changed since the last run.
emitExpiredbooleanAdd a row for videos that were in the previous run but are gone now.

After the first run, your cost scales with how many new videos you add, not with the size of the list you watch:

New or changed videos per runof 1,000 trackedbillable transcripts (at most)you save
5 %1,0005095 %
15 %1,00015085 %
30 %1,00030070 %

Setting up scheduled monitoring

  1. Paste your video list, turn on Incremental mode and give the list a State key (e.g. brand-watchlist) so it stays the same as you add links.
  2. Run it once. This seeds the baseline.
  3. Open the Schedules tab and set a recurring run (e.g. daily).
  4. Add a notification channel to be pinged only when new transcripts arrive.
{
"videoUrls": ["https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392"],
"incrementalMode": true,
"stateKey": "brand-watchlist",
"slackWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}

🔔 How to set up TikTok transcript alerts

Get a message when new transcripts land. Fill in only the channels you want:

ChannelWhat to configure
✈️ TelegramtelegramToken (from @BotFather) + telegramChatId
💬 SlackslackWebhookUrl (Incoming Webhook URL)
🎮 DiscorddiscordWebhookUrl (channel webhook URL)
🪝 WebhookwebhookUrl (+ optional webhookHeaders) receives the new transcripts as JSON, ideal for n8n / Make / Zapier

notificationLimit sets how many transcripts each message previews (1–20, default 5). Credentials are secret inputs: encrypted at rest, masked in the UI and never written to the run log. Every channel fires independently, so a broken channel can't stop the run or the others. Paired with incremental mode, you hear only about transcripts that are genuinely new.


💡 What can you do with TikTok transcript data?

Repurpose videos into written content

Turn a creator's best-performing TikToks into blog posts, newsletters, threads and show notes. The plain-text transcript plus the view and like counts tell you which ideas are worth rewriting first.

Hook and script analysis

Use the timed segments to see exactly what is said in the first three seconds of videos that go viral. Compare opening lines across hundreds of videos to find the hooks that hold attention in your niche.

Subtitles and localisation

Download SRT or WebVTT files to re-edit, caption or re-publish your own videos on other platforms. TikTok's translations give you a starting point for other languages.

Brand, product and media monitoring

Search the spoken words, not just the captions, for brand names, product mentions, claims and sentiment. Schedule a watched list with incremental mode and alerts to catch new mentions as soon as they're posted.

Market and trend research

Track the topics, phrases and claims spreading through TikTok in a category or a language over time. Export the history to build trend dashboards in Sheets, Looker Studio or Power BI.

Feed AI agents, RAG and LLM pipelines

Send compact JSON straight into an LLM context, an MCP tool or a vector store for summarisation, classification or question answering over video content.

Academic and journalistic research

Build a searchable corpus of what was actually said in news, political or health videos, with the post date, creator and engagement attached to every transcript for citation and analysis.


💰 How much does it cost to scrape TikTok transcripts?

This Actor uses Apify's pay-per-event model: you're charged once for each transcript returned. See the Actor's Pricing tab for the current numbers.

What you are not charged for:

  • Videos without captions, photo slideshows, deleted or private videos and non-video links. They get an informative row at no charge (or no row at all if you turn off includeVideosWithoutCaptions).
  • Translations and subtitle formats. SRT, WebVTT, timed segments and every translation you request come inside the same row.
  • Transcripts you already have. In incremental mode, unchanged transcripts are skipped and not billed again.

🔌 Integrations & export

Export to JSON, CSV, Excel or an HTML table, or pull from the REST API and the JavaScript / Python clients. Runs on a schedule, connects to Google Sheets, Slack, Make, Zapier and n8n, and works as an MCP tool for AI agents.

More TikTok tools from the same team: TikTok Comments Scraper adds what viewers said under each video, and TikTok Profile Scraper adds full creator profiles. All of them share the same field names (id, url, uniqueId), so the datasets join cleanly.


🔗 Using the API

Run this Actor from your own code. Example with the Apify Python client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run_input = {
"videoUrls": [
"https://www.tiktok.com/@foxfamilyguy/video/7587841579029679392",
"https://www.tiktok.com/@noticiastelemundo/video/7698589001103576333",
],
"translateTo": ["en"],
"includeSrt": True,
}
run = client.actor("corvuslab/tiktok-transcripts-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["transcriptStatus"] == "OK":
print(item["url"], item["languageCode"], item["wordCount"])
print(item["text"][:200])
else:
print(item["url"], item["transcriptStatus"], item["errMsg"])

It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.


❓ FAQ

Does every TikTok video have a transcript? No, and we'd rather you know that before you run it. The transcript is the caption track TikTok itself provides; nothing is generated by AI or speech-to-text on top. In our tests about 85% of speech-heavy videos (news, talking-head, tutorials, explainers) had one, but only about half of videos in a random mix, because music-only and non-speech clips often carry none. Photo slideshows never do. Those videos get a free NO_CAPTIONS or SLIDESHOW row rather than a guessed transcript.

What does isAutoGenerated mean? true means TikTok created the captions automatically from the audio; false means the creator supplied them. Auto-generated captions can contain the occasional misheard word or name, exactly as they appear on TikTok.

Will every translation I select be returned? Only when TikTok has that translation for the video. Translations are produced by TikTok, vary from video to video, and not every video is translated into every language. availableLanguages lists exactly what came back. An English translation of non-English videos is included whenever TikTok has one, even if you didn't select English. They are machine translations, so treat them as a working draft.

What do the transcriptStatus values mean? OK: transcript returned (the only charged status). NO_CAPTIONS: the video exists but TikTok has no captions for it. SLIDESHOW: a photo post with nothing spoken. NOT_FOUND: deleted, private or unavailable in your region (also used for share links that no longer resolve). UNSUPPORTED_URL: not a TikTok video link. BLOCKED / ERROR: TikTok didn't answer for that video. Try it again later.

Can I paste a profile, hashtag or search link? Yes. Paste it into TikTok video URLs, or use the Profiles, Search keywords and Hashtags fields, and the Actor finds the videos itself. Videos per profile, search or hashtag sets how many (default 10). A profile gives its most recent videos that can be found, newest first; it is a recent selection rather than the account's complete archive.

Can I download the video itself? Each row includes videoUrl, the video's playback link, and coverUrl, its thumbnail. Both links are temporary and stop working after roughly a day, so download what you need soon after the run rather than storing the links.

How many videos can I process in one run? As many as you paste, up to 20,000 transcripts per run. A few hundred videos usually finish in minutes. Raise Videos in parallel for big lists.

Do I need a TikTok account, cookies or a proxy? No. It reads public videos without logging in, and no proxy is needed.


This Actor collects only publicly available data from public TikTok videos: what anyone can see without logging in. You're responsible for how you use it, in particular any personal information about creators, and for complying with TikTok's terms, copyright in the spoken content you reuse, and applicable law (including the GDPR/LGPD where they apply). Not affiliated with, endorsed by or sponsored by TikTok or ByteDance.


Keywords: tiktok transcript scraper · tiktok transcripts · tiktok transcript extractor · tiktok subtitles download · tiktok captions to text · tiktok video to text · tiktok srt · tiktok vtt subtitles · bulk tiktok transcripts · tiktok translation · tiktok api · content repurposing · hook analysis · brand monitoring · export to CSV · no-code scraper · MCP tool for AI agents