Quarra
Guide · TikTok

TikTok transcript API: the Research API, yt-dlp captions and the alternative

TikTok's speech text sits behind a researchers-only API. yt-dlp downloads captions when a video has them, about 4 times in 10. What each route gives, captions in the wrong language, and how to cover the rest.

Checked against TikTok's developer documentation and measured on October 10, 2026.

The short answer

TikTok's developer API has no transcript field. Its Research API has one, voice_to_text, but only for approved non-profit researchers. Outside it, yt-dlp downloads the captions TikTok shows on a video, when the video has them: about 4 videos in 10 in our sample. The other 6 need speech-to-text. And captions can be wrong: on one video spoken in English, TikTok's track is in Japanese. A transcript scraper that uses TikTok's captions when they are right and transcribes the rest covers every case.

What TikTok's APIs give you

We read TikTok's developer documentation on October 10, 2026.

APISpeech textWho can use it
Display API (video/list, video/query)None. The video object has a title and a description written by the creator, up to 150 characters each.Apps, for the videos of users who authorise them.
Research API (research/video/query)voice_to_text: “Voice to text and subtitles (for videos that have voice to text features on, show the texts already generated)”.“Independent and academic researchers who conduct research on a non-for-profit basis”, after an application. Creators, advertisers and commercial users are not eligible.

An approved Research API project gets 1,000 requests a day and up to 100,000 records a day, 100 per request, and new videos can take up to 48 hours to appear (Research API FAQ). For a product, a newsletter or a marketing team, neither API returns what is said in a video.

Captions with yt-dlp

yt-dlp reads a public TikTok video and lists its caption tracks. On October 10, 2026, version 2026.08.19 needed its curl-cffi extra: without it, TikTok's page came back with “Unexpected response from webpage request”.

pip install "yt-dlp[default,curl-cffi]"
yt-dlp --skip-download --write-subs -o "%(id)s.%(ext)s" https://www.tiktok.com/@natgeo/video/7694024577701137677

It saved 7694024577701137677.eng-US.vtt, 37 timed lines:

00:00:00.060 --> 00:00:02.940
Did you know shoebills attack their own siblings?

00:00:02.941 --> 00:00:05.061
Five surprising facts about the shoebill.

When a video has captions, written by the creator or generated by TikTok, that is the cheapest transcript there is. Three things to handle around it.

Three traps

Most videos have no captions

In a sample of 150 TikTok videos, 63 had captions. For the other 87, yt-dlp saves nothing and the audio has to go through speech-to-text, with Whisper's habit of writing “Thank you.” over music (measured in our Instagram guide).

Captions in the wrong language

Video 7685118587685637390 by @trauma_donut is spoken in English. Its only caption track is Japanese, jpn-JP, and reads “ドローイング アッシュベイビー コウズザオリジナルイズ エーアイ”: the English words “drawing Ash Baby, 'cause the original is AI”, spelled out phonetically in katakana. TikTok's recognition ran in the wrong language. Taking the first track, or the only one, gives you that.

Empty records that cost money

Many TikTok links lead to music, photo slideshows or deleted videos. In our benchmark of 20 video links shared on Reddit, on October 10, 2026, the most used TikTok transcript scraper on Apify charged 18 records, 12 of them without any text.

Getting transcripts with our Actor

The TikTok Transcript Scraper takes video links, short vm.tiktok.com links and accounts, and returns one record per video. It uses TikTok's captions when they are in the language of the video, transcribes the audio with AI when they are missing or wrong, and charges only transcripts: music, photo posts and dead links come back as free records that say why.

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/tiktok-transcript-scraper").call(run_input={
    "urls": [
        "https://www.tiktok.com/@natgeo/video/7694024577701137677",
        "https://www.tiktok.com/@trauma_donut/video/7685118587685637390",
        "https://www.tiktok.com/@gwens_sydicate/video/7693014800716090676",
    ],
})
for video in client.dataset(run.default_dataset_id).iterate_items():
    if video["status"] == "ok":
        print(video["videoId"], video["language"], video["transcriptSource"], video["billedMinutes"], "min:", video["transcript"][:40])
    else:
        print(video["videoId"], video["status"], video.get("missingReason") or video.get("errorCode"))

Tested with apify-client 3.3 on October 10, 2026, in a 19-second call. It printed:

7694024577701137677 en captions 0 min: Did you know shoebills attack their own
7685118587685637390 missing uncertain_language
7693014800716090676 en speech_to_text 3 min: Sunlight streams through the heavy glass

The first comes from TikTok's captions, with no minutes billed. The Japanese captions of the second were set aside; its English speech, over a song, could not be settled with confidence, so it is free rather than a guess. The third has no captions: 174 seconds transcribed by AI, 3 minutes. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

What comes back

Each record has the transcript as plain text and as timestamped segments, where it came from (captions or speech_to_text, and whether the creator wrote the captions), the language, the minutes billed, and the video's account, date, views, likes, comments, shares, saves, caption and sound. SRT and VTT files are one option away. Turn off useTikTokCaptions to send every video to speech-to-text.

Limits

  • An account gives about its 10 latest videos, the list TikTok publishes for embedding an account on other sites. For older videos, paste their links.
  • TikTok's captions are returned as TikTok made them, after a check of their language: a wrong word in them stays wrong.
  • The no-speech check keeps a margin: a single short line over music can come back as no_speech, free.
  • Private and age-restricted videos need a signed-in account; we do not use one, so they come back as free error records.

What it costs

$1.00 per 1,000 transcripts on Apify's free plan ($0.75 on Gold and above), plus $0.001 per started minute only when a video is transcribed by AI, and a start fee of $0.003 per run at the default memory. A video with TikTok captions costs $0.001 whatever its length. The three videos above cost $0.008.

Run it on the Apify Store

Transcripts cost $1.00 per 1,000 on the Free plan, plus $0.001 per started minute only when a video has no usable TikTok captions, plus $0.003 per run; videos without speech are free. Errors and empty results are not charged, and you can set a maximum cost per run.