TikTok Transcript Scraper: Captions to Text, No Login avatar

TikTok Transcript Scraper: Captions to Text, No Login

Pricing

from $1.25 / 1,000 transcripts

Go to Apify Store
TikTok Transcript Scraper: Captions to Text, No Login

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

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

120 TikTok videos checked in 62 seconds: transcripts from TikTok's own captions, free rows for videos without speech

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.

Run it on Apify

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. transcript is the whole text in one string; segments lists every caption line with start and end in seconds; includeSubtitleFiles adds ready .vtt and .srt file contents.
  • Caption source in every row. caption_source says whether the text is TikTok's auto captions (auto_captions), subtitles the creator added (creator_subtitles) or a machine translation (machine_translation). available_languages lists every caption language TikTok offers for the video.
  • Choose the language. Leave language blank to get the captions in the language spoken. Set it (for example en or es) 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

ParameterTypeDefaultWhat it does
videoUrlsarray of stringsemptyTikTok video links, share links or video ids. Up to 1,000 per run. A profile link here is read as a profile.
profilesarray of stringsemptyUsernames (garyvee or @garyvee) or profile links. Up to 100 per run.
maxVideosPerProfileinteger10Latest videos to check per profile, 1 to 500. Videos without captions count toward it.
languagestringemptyCaption language code such as en, es or eng-US. Blank returns the language spoken.
includeSegmentsbooleantrueAdds segments, every caption line with its start and end time.
includeSubtitleFilesbooleanfalseAdds vtt and srt, the captions as subtitle file contents.
includeNoCaptionRowsbooleantrueAdds a free row for each video without captions.
residentialFallbackbooleantrueRetries 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.

FieldWhat it is
statustranscript on charged rows, no_captions or error on free ones
video_id, video_urlTikTok's video id and the link to the video
inputThe link, id or @username the row came from
author_username, author_nickname, author_id, author_verifiedThe creator
description, hashtags, description_languageThe text the creator posted with the video
created_utc, created_atWhen it was posted (Unix seconds and ISO 8601, UTC)
duration_secVideo length in seconds
play_count, like_count, comment_count, share_count, save_countCounts when the row was read
music_title, music_authorThe sound used
is_adTrue when TikTok marks the post as an ad or paid partnership
has_captionsTrue on transcript rows
language, language_codeThe caption track used, e.g. eng-US and en
requested_language_foundOnly when language is set: whether a track in that language was found
caption_source, caption_source_codeauto_captions (TikTok code ASR), creator_subtitles (LC) or machine_translation (MT)
caption_formatwebvtt
available_languagesEvery caption language TikTok offers for the video
transcriptThe whole transcript as plain text
segmentsCaption lines in order, each { start, end, text } in seconds
segment_count, word_count, char_countSize of the transcript
transcript_duration_secEnd time of the last caption line
vtt, srtSubtitle file contents (with includeSubtitleFiles)
scraped_atWhen 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:

FieldWhat it is
video_idThe key to store and join on
video_urlLink to the video
statustranscript
author_usernameCreator's username
created_atPost time, ISO 8601 UTC
languageCaption track language
caption_sourceWhere the captions came from
available_languagesAll caption languages
transcriptThe text
segment_countCaption lines
word_countWords
scraped_atRow 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.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
transcript-scrapedOnce 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-startOnce 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_captions row);
  • 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

  1. Open the actor in Apify Console, set your input (for example a list of creators in profiles with maxVideosPerProfile: 10) and click Save as a new task.
  2. In the task, open Schedules, click Add schedule and pick how often (every day at 08:00, every Monday and so on).
  3. 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.

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"

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

Leads and business directories

Marketing, SEO and reviews

LinkedIn

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.