Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
TikTok Transcript Scraper icon

TikTok Transcript Scraper

Get the spoken text from TikTok videos: transcript, timed segments, SRT, WebVTT, language, author, caption, duration. $0.40 per 1,000.

135 runs on Apify $0.0004 per transcript ($0.4 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust videoUrls, maxItems, language (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0004 per transcript = $0.4 per 1,000

You are charged forWhenPrice
Transcript scrapedOne TikTok video transcript delivered as a dataset row. Videos with no caption track, and private, deleted, age-restricted or region-locked videos, are never charged.$0.0004

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.

Inputs

FieldWhat it doesType
videoUrlsThe videos you want transcribed. A full link (https://www.tiktok.com/@user/video/7516208601434819862), a vm.tiktok.com or vt.tiktok.com share link, or just the bare numeric video id - all three work, and you can mix them in one list. Up to 1,000 per run.array
maxItemsHow many transcripts to return at most. Keep it low while you are testing - you pay per transcript.integer
languageA language code such as es, fr, de or ja. When TikTok holds a translated caption track for the video you get that one and the row is marked isTranslated: true. When it does not, you get the original spoken track instead of an error. Leave empty for the original.string
concurrencyHow many videos to read in parallel. Default 6, maximum 12. Lower it if you are working through a very long list and want to be gentle with the target.integer
sessionCookiesOptional, and empty is the normal case. Almost every video is read without any account at all. A few - age-restricted ones especially - are only shown to a signed-in visitor, and without a cookie those come back as free NOT_FOUND diagnostic rows. Paste your own TikTok cookie here to read them. In Chrome: F12 -> Application -> Cookies -> tiktok.com, copy the sessionid value and pass it as sessionid=…. It goes to TikTok video pages only, is never written to the log, and is never saved to the dataset.array
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

videoIdauthorUsernamecaptiondurationSecondslanguageisAutoGeneratedisTranslatedsegmentCountwordCounttexturlcreatedAtplayCount

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

TikTok Transcript Scraper: the spoken words from a TikTok video, with timings, SRT and VTT

Paste TikTok links and get the words back as text: the full transcript, the same text as timed segments, and ready-made SRT and WebVTT files. Each row also carries the video id, author, caption, hashtags, duration, play count and the language the track is in.

The thing to know before you plan a run: this reads the caption track TikTok already holds for a video. It does not listen to audio. A video with no caption track has nothing to give, and you get an uncharged row saying so. In a 120-video sample pulled from TikTok's own topic pages, 85 had a caption track and 35 did not.

InputVideo links, vm./vt. share links, or bare video ids
OutputOne row per transcript, with segments, SRT and WebVTT
Ceiling1,000 links in, 5,000 transcripts per run
Account neededNone for almost every video
Price$0.40 per 1,000 transcripts, flat on every plan

🗣️ What TikTok Transcript Scraper does

It opens each video's own page, reads the caption track out of it, and turns that into four shapes of the same thing: one block of text, an array of segments with start and end times, an srt string and a vtt string. Drop the SRT straight into an editor, or work off the segments.

TikTok makes a caption track itself when it hears speech, and creators can upload their own. Where TikTok also holds a translated track you can ask for it with language, and the row comes back marked isTranslated: true. When there is no translation you get the original rather than an error.

📥 What you give it

{
  "videoUrls": [
    "https://www.tiktok.com/@studywithlizzz/video/7657803613355412766",
    "7516208601434819862"
  ],
  "maxItems": 10,
  "language": ""
}
FieldDefaultWhat it is
videoUrlsbox holds two example linksFull links, vm./vt. share links or bare numeric ids, mixed freely. Up to 1,000 per run.
maxItemsbox holds 10How many transcripts to return, up to 5,000. The list is read in order and the run stops when it has enough, so links past that point cost nothing.
languageemptyA code like es, fr, de or ja. You get the translated track where TikTok has one, the original where it does not.
concurrency6, up to 12How many videos are read at once. Lower it for a very long list.
sessionCookiesemptyOptional. Your own TikTok sessionid, for the few videos shown only to a signed-in visitor. Anyone holding that value can act as your account, so treat it like a password.
proxyUrlsemptyOptional. Your own servers, as http://user:pass@host:port, used exactly as given.

Run it with the input empty and you get one labelled sample row and nothing else.

📤 What you get back

A real row from a recent run. The long fields and one name carrying emoji are cut short here:

{
  "ok": true,
  "charged": true,
  "recordType": "transcript",
  "videoId": "7657803613355412766",
  "url": "https://www.tiktok.com/@studywithlizzz/video/7657803613355412766",
  "authorUsername": "studywithlizzz",
  "authorName": "liz | studytok ...",
  "caption": "sometimes studying longer doesnt always mean higher grades...  #studytok #studytips",
  "hashtags": ["studytok", "studytips", "studyhacks", "studymotivation", "examtips"],
  "durationSeconds": 63,
  "createdAt": "2026-07-02T05:49:24.000Z",
  "language": "eng-US",
  "languageCode": "en",
  "languageName": "English",
  "isAutoGenerated": true,
  "isTranslated": false,
  "captionSource": "ASR",
  "text": "You scored at the top of your class because you studied for three hours the night before your exam, or so you thought...",
  "wordCount": 238,
  "characterCount": 1292,
  "segmentCount": 31,
  "segments": [{"start": 0, "end": 1.58, "startTime": "00:00:00.000", "endTime": "00:00:01.580", "text": "You scored at the top of your class"}],
  "srt": "1\n00:00:00,000 --> 00:00:01,580\nYou scored at the top of your class\n\n...",
  "vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:01.580\nYou scored at the top of your class\n\n...",
  "availableLanguages": ["eng-US"],
  "playCount": 3600000,
  "likeCount": 455300,
  "commentCount": 1285,
  "shareCount": 21000,
  "musicTitle": "original sound",
  "scrapedAt": "2026-09-21T01:29:19.131Z"
}
FieldWhat it is
textEvery cue joined into one block, which is what you want for search or a model.
segmentsCue-level timings. start and end are seconds, startTime and endTime the timecode form.
srt, vttThe same cues as subtitle files, ready to save.
isAutoGenerated, captionSourceWhether TikTok's own speech recognition made the track, or a person uploaded it.
availableLanguagesEvery caption track that video exposed on that request, so you can see what else you could ask for.
playCount, likeCount, commentCount, shareCountCounts at read time. A genuine zero comes back as null.
inputUrl, urlWhat you pasted, and the canonical link with the real handle.
coverUrlThe video's cover image. The link carries an expiry.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot it
A transcriptok: true and recordType: "transcript"
The sample row_sample: true, written only when the input was empty
A diagnosticok: false, _diagnostic: true and an errorCode

charged: true marks a real transcript row and false marks a sample or diagnostic one. Read it as the row type: it is stamped as the row is built, so it is not a receipt. Your run's own event count in Apify is the billing record.

CodeWhat it means
NO_TRANSCRIPTThe video has no caption track. Photo slideshows land here too.
NOT_FOUNDDeleted, private, region-locked, or shown only to a signed-in visitor.
BAD_INPUTThat line is not a TikTok video link or id.
BLOCKEDTikTok would not serve that page this time. Worth a re-run.
NETWORKThe page was unreachable or answered badly. A share link whose redirect fails lands here.
NO_RESULTSToo many videos in a row had no caption track, so the run stopped early instead of working through the list.
TIME_BUDGETThe run ran out of time before reaching that video.
PROXY_INPUT_ADJUSTEDSomething you put in proxyUrls was unusable, so the run carried on without it.
CHARGE_ERRORA charge could not be recorded. A couple in a row stops the run.

▶️ How to run it

1. Open TikTok Transcript Scraper and click Try for free. 2. Paste your links into TikTok videos, one per line, replacing the two examples. 3. Leave Preferred language empty for the original words, or put a code like es in it. 4. Set Maximum transcripts low for the first run, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.40 per 1,000 transcripts. Flat on every Apify plan, no volume tiers.

You are charged per transcript delivered. A video with no caption track, a deleted or private one, a line that was not a link, and the sample row are all uncharged. Links past your maxItems are never opened.

One thing to watch: the same video pasted twice, once as a share link and once as a full link, is read twice and counts twice. Paste one form per video.

💡 What people use it for

  • Turning a set of videos into text you can search, quote or feed to a model.
  • Making subtitle files for your own uploads, straight from srt or vtt.
  • Finding which videos in a niche actually say a phrase, rather than just tagging it.
  • Pulling the hook out of high-performing videos: the first few segments are the first few seconds.
  • Reading what a competitor says in their videos without watching all of them.

🚧 What it does not do

  • It does not listen to audio. No caption track means no transcript, and about one video in

three has none.

  • Timings are cue-level, not word-level. Each segment covers a phrase.
  • On-screen text is not included. Stickers, overlays and burned-in captions are pictures, not a

caption track.

  • Translations only exist where TikTok made one. Asking for a language it does not hold gives

you the original track, marked isTranslated: false.

  • No live videos or stories.
  • Age-restricted and private videos need your own cookie, and come back as uncharged

NOT_FOUND rows without one.

  • A zero count reads as null. A video with genuinely no comments shows commentCount: null.
  • If every line you paste is unusable, you get the sample row rather than a message per line.

Check your list if a run comes back with one row.

  • Counts are a snapshot, and a popular video's play count moves while you read it.

🧭 Which TikTok tool do you need?

If you wantUse
The spoken words from a videoThis one
The video file itself, as MP4 or MP3TikTok Video Downloader
Comments under a videoTikTok Comments Scraper
Videos under a hashtag, to collect links firstTikTok Hashtag Scraper
The same job on YouTubeYouTube Transcript Scraper

❓ Questions people ask

Do I need a TikTok account or an API key? No. Almost every video is read with nothing signed in. The cookie field is only for the few that are gated.

Why did some videos come back empty? They have no caption track. TikTok makes one when it hears speech, so silent, music-only and some slideshow posts have nothing to read.

Can I get a Spanish transcript of an English video? Only if TikTok already holds a Spanish track for it. Nothing is translated here.

Can I feed it a whole profile or hashtag? Not directly. Collect the video links first, then paste them in.

Can I run it on a schedule? Yes. videoId is stable, so a transcript you already have is easy to skip.

Is this legal? The captions are published with the public video. Copyright in the words belongs to whoever said them, so quoting and analysis are safer ground than republishing. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the video link and the run ID. The errorCode on the diagnostic row usually names the problem on its own.