Apify Actors / TikTok transcripts with the video stats on each row

Apify Actor

TikTok transcripts with the video stats on each row

TikTok already has captions for many talking videos, from its own speech recognition or added by the creator. This Actor reads those caption tracks and saves them as rows. It doesn't log in, doesn't run a browser and doesn't download the video.

Paste video links, short links, bare IDs or @creator profiles. You get one row per video with the transcript in the formats you pick (text, segments, srt, vtt), every caption language TikTok lists, and the post caption, upload date, duration and play, like, comment, share and save counts. Videos that fail come back as free rows with an error code.

Run it on ApifySee input and output

$0.001 per video with a transcript · pay per result, no subscription

Price

EventPriceCharged when
Video transcript (video)$0.001Once per video saved with at least one transcript, whatever the number of languages or formats
Error rows$0No captions, not found, private, blocked, skipped and every other error code
Example runUnitsCost
The input below (1 video)1 × $0.001$0.001
100 video links100 × $0.001$0.10
1,000 links, 200 without speech, max videos 1,000800 × $0.001$0.80
20 profiles, 10 newest videos each, max videos 200up to 200 × $0.001up to $0.20

What you get

Input

Set the run options in the Apify console, or send the same object through the API.

{
  "videoUrls": [
    "https://www.tiktok.com/@tedtoks/video/7704416343474441502"
  ],
  "formats": [
    "text"
  ]
}

One video as plain text. A run takes up to 1,000 video links and 50 profiles. "Max videos per run" defaults to 100, so raise it for bigger lists; videos past it get free SKIPPED rows.

Output

{
  "input": "https://www.tiktok.com/@tedtoks/video/7704416343474441502",
  "url": "https://www.tiktok.com/@tedtoks/video/7704416343474441502",
  "videoId": "7704416343474441502",
  "status": "ok",
  "errorCode": null,
  "language": "en",
  "text": "We need to talk about democracy better. We're gonna ask people to put democracy over party. ...",
  "transcripts": [
    {
      "language": "en",
      "tiktokLanguage": "eng-US",
      "source": "MT",
      "autoGenerated": false,
      "captionFormat": "webvtt",
      "segmentCount": 18,
      "endSeconds": 59.976,
      "segments": [
        { "start": 0.12, "end": 2.2, "text": "We need to talk about democracy better." }
      ]
    }
  ],
  "availableLanguages": ["en"],
  "createdAt": "2026-11-04T20:30:39.000Z",
  "durationSeconds": 60,
  "authorUsername": "tedtoks",
  "authorName": "TED Talks",
  "authorFollowers": 3300000,
  "playCount": 4356,
  "likeCount": 287,
  "commentCount": 5,
  "shareCount": 3,
  "saveCount": 35,
  "scrapedAt": "2026-11-05T15:14:32.100Z"
}

One real row from the prefilled run on Apify on 2026-11-05 (text and segments), trimmed. source is TikTok's own label for the track, passed through as sent; ASR means TikTok's speech recognition.

Run it from your own code

The Actor takes the same input as a JSON body. This call starts a run, waits for it and returns the dataset items.

curl -X POST "https://api.apify.com/v2/acts/zovo-one~tiktok-transcripts/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls": ["https://www.tiktok.com/@tedtoks/video/7704416343474441502"], "formats": ["text"]}'

A sync call waits at most 300 seconds. For longer runs, start a run with POST /v2/acts/zovo-one~tiktok-transcripts/runs, wait for it, then read /v2/datasets/<defaultDatasetId>/items.

Limits

Up to 1,000 video links, 50 profiles and 10 languages per run. Profiles come from TikTok's public embed page, which lists about 10 of a creator's newest videos, so you get at most 10 per profile. The transcript is TikTok's own caption track; if TikTok's speech recognition misheard a word, you see the same mistake, because the Actor doesn't transcribe audio itself. TikTok's language labels aren't always right and are passed through as sent. Photo posts have no spoken audio and return UNSUPPORTED_POST. The residential proxy group isn't supported, and a run that asks for it stops right away.

Questions

Does it transcribe videos that have no captions?

No. It reads the caption tracks TikTok already has. A video without any gets a free NO_CAPTIONS row. In our check of 10 public talking videos, 8 had captions.

Do I need a TikTok account, cookies or a proxy?

No account and no cookies. The prefilled run worked on Apify's servers without a proxy on 2026-11-05. If TikTok starts blocking you, you'll see BLOCKED or PAGE_CHANGED rows. Turn on Apify Proxy with a datacenter group and run again.

Can I get every video from a creator?

Only the newest ones, up to 10 per profile, because that's what TikTok's public embed page lists. For older videos, paste their links in "Video URLs".

Can I get captions in several languages?

Yes. Put up to 10 codes in languages, such as en, es or pt-BR, or all for every track TikTok has. The price stays $0.001 per video, whatever the number of languages or formats. A video without any of your languages gets a free LANGUAGE_NOT_AVAILABLE row that lists the ones it does have.

Is there a YouTube version?

Yes. TubeText YouTube Transcript Scraper does the same for YouTube videos, playlists and channels.

Is this allowed?

The Actor only reads public videos and public profile pages, without logging in, and returns post data anyone can see on TikTok. Check that your use fits TikTok's terms and the privacy laws that apply to you.

Support this work

If this Actor saves you time, you can support the work on GitHub Sponsors. Monthly tiers start at $5, and one-time tiers start at $15. Sponsorship is optional, and the tool works the same without it.

Built and maintained by Zovo. Actor on Apify · All Actors.