TikTok Transcript Scraper: Captions to Text, No Login
Pricing
from $1.25 / 1,000 transcripts
TikTok Transcript Scraper: Captions to Text, No Login
Get the transcript of any TikTok video from TikTok's own captions: plain text plus timed segments, language and caption source. Video links, share links, ids or a creator's latest videos. Videos without captions are free. No login, no speech to text fees.
Pricing
from $1.25 / 1,000 transcripts
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
From The Mine Works, makers of YouTube Transcript and TikTok Scraper, with over 140,000 runs across 170+ public actors.
Updated 20 Oct 2026: first release. Transcripts for TikTok video links, share links, video ids and a creator's latest videos, as plain text and timed segments, with the caption language and where the captions came from. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- The words spoken in the video, as text, in seconds. TikTok makes captions for most videos with speech. This actor reads TikTok's own caption file and returns it as one plain text transcript plus every caption line with its start and end time. No audio download and no speech to text step: 40 video links took 39 seconds in our test.
- A creator's latest videos, not just links you already have. Give a username and the actor reads that creator's newest videos, up to 500, and returns a transcript for each one with captions. In our test, 6 creators and 120 videos took 62 seconds.
- You pay only for transcripts. A video with no captions (dance, music, no talking) gets a free row that says why. Private and deleted videos, wrong links, summary rows and duplicates are never charged, and a run where no video had captions pays nothing, not even the start fee. No TikTok account, cookies or API key.
Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns the transcripts of two popular videos (118 million and 50 million views), 2 rows. It took 16 seconds in our test run:
{"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567","https://www.tiktok.com/@tiktok/video/7665823355194363167"]}
A video can be given as a full link (tiktok.com/@user/video/<id>), a share link from the app (vm.tiktok.com/..., vt.tiktok.com/... or tiktok.com/t/...), or just its id (7625263096117857567). The same video given twice is read once.
Apify's free plan includes $5 of credit every month, which covers about 2,700 transcripts at this actor's price.
Copy to your AI assistant
themineworks/tiktok-transcript-scraper on Apify. Returns the transcript of TikTok videos from TikTok's own captions (plain text plus timed segments), for video links or a creator's latest videos, with no TikTok login. Call ApifyClient("TOKEN").actor("themineworks/tiktok-transcript-scraper").call(run_input={"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567"]}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give videoUrls (list of TikTok video links, share links or video ids; up to 1000) and/or profiles (list of usernames or profile links; up to 100). Optional: maxVideosPerProfile (default 10, 1 to 500), language (caption language code such as "en" or "es"; blank = the language spoken), includeSegments (default true), includeSubtitleFiles (default false; adds vtt and srt strings), includeNoCaptionRows (default true), residentialFallback (default true). Transcript rows have no _type field and status "transcript" and carry video_id, video_url, input, author_username, author_nickname, author_id, author_verified, description, hashtags, description_language, created_utc, created_at, duration_sec, play_count, like_count, comment_count, share_count, save_count, music_title, music_author, is_ad, has_captions, language, language_code, caption_source (auto_captions, creator_subtitles or machine_translation), caption_source_code, caption_format, available_languages, transcript, segments [{start, end, text}], segment_count, word_count, char_count, transcript_duration_sec, scraped_at. Videos without captions get a row with _type "no_captions" and no_captions_reason; failures get _type "error" with error_type and reason; each run also writes a _type "summary" row and, when transcripts were delivered, an _type "info" row. Only transcript rows are charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~tiktok-transcript-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- TikTok's own captions, read as they are. The actor downloads the WebVTT caption file TikTok made for the video and turns it into text. Nothing is transcribed again, so the words match what TikTok shows on screen when captions are on.
- Plain text and timed lines.
transcriptis the whole text in one string;segmentslists every caption line withstartandendin seconds;includeSubtitleFilesadds ready.vttand.srtfile contents. - Caption source in every row.
caption_sourcesays whether the text is TikTok's auto captions (auto_captions), subtitles the creator added (creator_subtitles) or a machine translation (machine_translation).available_languageslists every caption language TikTok offers for the video. - Choose the language. Leave
languageblank to get the captions in the language spoken. Set it (for exampleenores) to get TikTok's translated captions when TikTok offers them. - Profiles by username. Up to 100 creators per run and up to 500 latest videos each, read 15 videos per request.
- Post details in the same row. Author, description, hashtags, post date, duration, views, likes, comments, shares, saves and the sound used.
How to use it
Basic: transcripts of videos you have
{"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567","https://vm.tiktok.com/ZMxxxxxxx/","7665823355194363167"]}
One row per video. Videos with captions get status: "transcript"; videos without get a free no_captions row with the reason.
Content research: everything a creator said this month
{"profiles": ["garyvee", "@hubermanlab"],"maxVideosPerProfile": 50,"includeSegments": false}
The newest videos come first. Search the transcript column for a product name, a topic or a claim, and sort by play_count to see which talking points reached the most people.
Repurposing: turn your own TikToks into posts, threads or blog drafts
{"profiles": ["<your username>"],"maxVideosPerProfile": 100}
Each transcript is ready to paste into a writing tool or an AI assistant, with description and hashtags beside it.
Subtitles: VTT and SRT files for editing or reposting
{"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567"],"includeSubtitleFiles": true}
vtt holds the caption file exactly as TikTok serves it, srt the same lines in SRT format. Save either field as a file to load it in a video editor.
Translation: English captions for videos in other languages
{"profiles": ["<a creator who posts in Spanish>"],"maxVideosPerProfile": 30,"language": "en"}
When TikTok has an English translation of a video's captions, that track is returned with caption_source: "machine_translation" and requested_language_found: true. When it does not, the original captions come back and requested_language_found is false.
AI datasets: spoken text with engagement numbers
{"profiles": ["bbcnews", "nytimes", "neildegrassetyson"],"maxVideosPerProfile": 200,"includeNoCaptionRows": false}
Only transcript rows are returned. word_count, duration_sec, play_count and like_count let you filter by length and reach before training or analysis.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
videoUrls | array of strings | empty | TikTok video links, share links or video ids. Up to 1,000 per run. A profile link here is read as a profile. |
profiles | array of strings | empty | Usernames (garyvee or @garyvee) or profile links. Up to 100 per run. |
maxVideosPerProfile | integer | 10 | Latest videos to check per profile, 1 to 500. Videos without captions count toward it. |
language | string | empty | Caption language code such as en, es or eng-US. Blank returns the language spoken. |
includeSegments | boolean | true | Adds segments, every caption line with its start and end time. |
includeSubtitleFiles | boolean | false | Adds vtt and srt, the captions as subtitle file contents. |
includeNoCaptionRows | boolean | true | Adds a free row for each video without captions. |
residentialFallback | boolean | true | Retries a request TikTok refused twice from a residential IP. Never changes what you pay. |
Give videoUrls, profiles or both.
What data do you get?
One row per video. Transcript rows have no _type field and status: "transcript"; the no_captions, error, summary and info rows carry a _type, so a filter on _type separates them.
| Field | What it is |
|---|---|
status | transcript on charged rows, no_captions or error on free ones |
video_id, video_url | TikTok's video id and the link to the video |
input | The link, id or @username the row came from |
author_username, author_nickname, author_id, author_verified | The creator |
description, hashtags, description_language | The text the creator posted with the video |
created_utc, created_at | When it was posted (Unix seconds and ISO 8601, UTC) |
duration_sec | Video length in seconds |
play_count, like_count, comment_count, share_count, save_count | Counts when the row was read |
music_title, music_author | The sound used |
is_ad | True when TikTok marks the post as an ad or paid partnership |
has_captions | True on transcript rows |
language, language_code | The caption track used, e.g. eng-US and en |
requested_language_found | Only when language is set: whether a track in that language was found |
caption_source, caption_source_code | auto_captions (TikTok code ASR), creator_subtitles (LC) or machine_translation (MT) |
caption_format | webvtt |
available_languages | Every caption language TikTok offers for the video |
transcript | The whole transcript as plain text |
segments | Caption lines in order, each { start, end, text } in seconds |
segment_count, word_count, char_count | Size of the transcript |
transcript_duration_sec | End time of the last caption line |
vtt, srt | Subtitle file contents (with includeSubtitleFiles) |
scraped_at | When the row was written |
No captions rows (_type: "no_captions", never charged): the same post fields, has_captions: false, no_captions_reason in words and no_captions_code (tiktok_reason_3 when TikTok found no speech, tiktok_reason_<n> for TikTok's other reason codes, photo_post, caption_file_unavailable, empty_captions).
Error rows (_type: "error", never charged): error_type (invalid_input, not_found, private, removed, banned, share_link_unresolved, blocked_or_failed), input, video_id when known, and reason.
Summary row (_type: "summary", never charged): videos_requested, profiles_requested, profiles_read, videos_checked, transcripts_delivered, charged_for, no_captions, videos_failed, duplicates_skipped, caption_share, caption_sources, caption_languages, stopped_by_max_cost, rows_withheld_max_cost, shortfall_reason when fewer transcripts came back than asked, and request and byte counts. The same summary is saved as the OUTPUT record of the run.
Stable fields for automations
These were present in every transcript row of our test runs (98 transcripts from 160 videos), and their names will not change:
| Field | What it is |
|---|---|
video_id | The key to store and join on |
video_url | Link to the video |
status | transcript |
author_username | Creator's username |
created_at | Post time, ISO 8601 UTC |
language | Caption track language |
caption_source | Where the captions came from |
available_languages | All caption languages |
transcript | The text |
segment_count | Caption lines |
word_count | Words |
scraped_at | Row time |
Optional, present only when TikTok has a value or you asked for it: segments (on by default), vtt and srt, requested_language_found, description_language, music_title, music_author, and the counts on posts where TikTok hides them.
Output examples
A transcript row from the "Try it" input above (test run, 20 Oct 2026, transcript and segments trimmed):
{"status": "transcript","video_id": "7665823355194363167","video_url": "https://www.tiktok.com/@tiktok/video/7665823355194363167","author_username": "tiktok","author_nickname": "TikTok","author_verified": true,"description": "@Josh Groban on authentically sharing the process, catch more on In The Mix with Jack Coyne, presented by @T-Mobile ","created_at": "2026-07-23T20:30:08.000Z","duration_sec": 47,"play_count": 50900000,"like_count": 134300,"comment_count": 2750,"share_count": 430,"save_count": 8612,"has_captions": true,"language": "eng-US","language_code": "en","caption_source": "auto_captions","caption_source_code": "ASR","caption_format": "webvtt","available_languages": ["eng-US"],"transcript": "The old school way of growing up in this business was, like, you have to be that guy on the billboard, and you can't show the struggle. You can't show the dark days or the anxiety or the depression or whatever else. ...","segments": [{ "start": 0.06, "end": 2.58, "text": "The old school way of growing up in this business was, like," },{ "start": 2.581, "end": 4.301, "text": "you have to be that guy on the billboard," }],"segment_count": 23,"word_count": 189,"char_count": 962,"transcript_duration_sec": 43.401}
A video without captions (a dance clip from a profile run; nothing charged):
{"_type": "no_captions","status": "no_captions","video_id": "7697799680230575373","author_username": "charlidamelio","duration_sec": 10,"has_captions": false,"available_languages": [],"no_captions_reason": "TikTok found no speech to caption (music, sound only or no talking).","no_captions_code": "tiktok_reason_3"}
An error row for a video that does not exist (nothing charged):
{ "_type": "error", "status": "error", "error_type": "not_found", "input": "https://www.tiktok.com/@nobody/video/7000000000000000001", "video_id": "7000000000000000001", "reason": "TikTok says this post is not found (status 10204, item doesn't exist). Nothing was charged." }
Pricing
Pay per event: you pay for the transcripts you receive, plus a flat $0.003 per run, whatever memory you choose.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
transcript-scraped | Once per transcript row stored in your dataset | $1.79 per 1,000 | $1.70 per 1,000 | $1.52 per 1,000 | $1.25 per 1,000 |
run-start | Once per run, with the run's first transcript | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one transcript is the price per 1,000 divided by 1,000. A run of 100 transcripts on the free plan costs $0.179 plus $0.003.
Never charged:
- videos TikTok has no captions for (each gets a
no_captionsrow); - private, deleted or missing videos and profiles, links that are not TikTok, and share links that cannot be opened (each gets an error row);
- the same video found twice in one run;
- the summary, info, error and no_captions rows;
- a run where no video returned a transcript: it pays no start fee either;
- anything past your "Max cost per run". The actor checks the budget before each transcript and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input (for example a list of creators in
profileswithmaxVideosPerProfile: 10) and click Save as a new task. - In the task, open Schedules, click Add schedule and pick how often (every day at 08:00, every Monday and so on).
- Optional: add an integration (Google Sheets, Slack, a webhook) so new transcripts land where your team works.
Each run reads the newest videos again. To keep only videos you have not stored yet, dedupe on video_id in your sheet or database.
FAQ
Where does the transcript come from?
From TikTok itself. TikTok makes captions for most videos with speech (viewers see them with the CC button), and offers translated captions for some. The actor downloads that caption file and returns it as text and timed lines. It does not run its own speech recognition.
What share of videos has a transcript?
It depends on the creator. In our 20 Oct 2026 tests, 87% of 415 videos from talk based creators (news, science, podcasts, MrBeast) had captions, 78% of 40 random videos from them read one by one, and 56% of 120 videos from a mix that included dance and comedy creators. Videos with music only, no talking or very short clips usually have none, and those rows are free.
What if a video has no captions?
You get a free no_captions row with the post details and the reason TikTok gives, for example that it found no speech to caption. Turn off includeNoCaptionRows to get transcript rows only. This actor does not transcribe audio; for videos without captions, Video Transcriber listens to the audio and returns a transcript.
How accurate are the transcripts?
They are TikTok's own captions, so they are as accurate as what TikTok shows on screen: good for clear speech, weaker for music, heavy accents or several people talking at once. caption_source tells you whether the text is TikTok's auto captions, the creator's own subtitles or a machine translation.
Which languages are supported?
Every language TikTok makes captions in. Without language, you get the captions in the language spoken in the video (language holds TikTok's code, such as eng-US, spa-ES or rus-RU). With language, you get that language when TikTok has a track for it.
How many videos per run, and how long does it take?
Up to 1,000 video links and 100 profiles of up to 500 videos each. In our tests: 16 seconds for the two video "Try it" input, 39 seconds for 40 video links, 62 seconds for 6 profiles of 20 videos each. Profiles are the faster route per video because TikTok returns 15 videos per request.
Do I need a TikTok account, cookies or a proxy?
No. The actor reads public videos the way a logged out visitor sees them. The proxy is included.
What happens with private or deleted videos?
A video that does not exist or was removed gets an error row (not_found or removed), a private one private, and none of them is charged. A private profile gets an error row too, since its videos cannot be read without logging in.
Which link formats work?
Video links (tiktok.com/@user/video/<id>, with or without the username and any ? parameters), photo post links, embed links, m.tiktok.com/v/<id>.html, bare video ids, and share links from the app (vm.tiktok.com/<code>, vt.tiktok.com/<code>, tiktok.com/t/<code>). A profile link given in videoUrls is read as a profile.
Which TikTok actor should I use?
This one for what is said in the videos. TikTok Scraper to find videos by hashtag, keyword or trending. TikTok Creator Scraper for creator profiles and video stats. TikTok Video Comments Scraper for the comments under a video. Video Transcriber when a video has no captions and you need its audio transcribed.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has two ready views: Transcripts and Captions per video. For subtitle files, turn on includeSubtitleFiles and save the vtt or srt field.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/tiktok-transcript-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http tiktok-transcript-scraper "https://mcp.apify.com/?tools=themineworks/tiktok-transcript-scraper"
Is it legal to scrape TikTok transcripts?
The actor reads only public videos and the captions TikTok shows to anyone without logging in. Transcripts are the creators' words; you are responsible for how you use them, including TikTok's terms, copyright and data protection law such as GDPR and CCPA. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's transcripts to a sheet with Apify's Google Sheets integration; one row per video fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "new videos from these creators, transcribed, to Notion".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
Social media and video
- Threads Scraper
- Reddit Scraper
- Threads Search Scraper
- Instagram Profile Scraper
- Instagram Followers & Following
- Reddit Search Scraper
- Twitter / X Scraper
- YouTube Transcript
- Xiaohongshu (RED) Scraper
- Telegram Channel Scraper
- Telegram Channel Finder
- Pinterest Profile Scraper
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a video that should have a transcript but came back without one, or a link format that is not read? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Give TikTok video links or usernames and get each video's transcript back as plain text and timed lines, with language, caption source and post details, no login.

