TikTok Transcript Scraper: Subtitles, SRT and Metadata avatar

TikTok Transcript Scraper: Subtitles, SRT and Metadata

Pricing

from $0.80 / 1,000 transcripts

Go to Apify Store
TikTok Transcript Scraper: Subtitles, SRT and Metadata

TikTok Transcript Scraper: Subtitles, SRT and Metadata

Scrape TikTok video transcripts and subtitles with timestamps as JSON, text, SRT or WebVTT, in the spoken language or a translation TikTok offers. Video metadata free on request. Pay only for videos that return a transcript.

Pricing

from $0.80 / 1,000 transcripts

Rating

0.0

(0)

Developer

Fetchrail

Fetchrail

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

8 hours ago

Last modified

Categories

Share

📝 TikTok Transcript Scraper: Subtitles, SRT and Metadata

Turn TikTok videos into clean, timestamped text. Paste a list of links, choose a language and a format, and get one result per video, ready for an LLM, a spreadsheet or a subtitle editor.

At a glance
Price$1.00 per 1,000 transcripts, platform usage included
Charged whenA video returns a transcript. Everything else is free.
FormatsTimestamped segments (JSON), plain text, SRT, WebVTT
LanguageThe spoken language by default, or a translation TikTok offers
LinksFull video links and vm.tiktok.com / vt.tiktok.com short links
MetadataCaption text, account, duration, views, likes, comments, sound: free on request
AI agentsCallable as a tool from Claude, Cursor and VS Code over MCP

🧾 What's in each result

  • The transcript in the format you chose. As segments, each line carries text, start and duration in seconds.
  • Which track you got, in language.
  • What you asked for, in preferred, so a fallback is easy to spot.
  • Every caption track the video has, in captionTracks, including the translations TikTok offers for it.
  • The video's metadata, when you turn it on: caption text and hashtags, account, duration, upload date, view, like and comment counts, the sound used and cover images.
  • A reason code for every video that has no transcript, instead of a crashed run.

📌 Where TikTok transcripts come from

TikTok generates captions from a video's speech and shows them in its player. This Actor returns those captions; it does not run speech-to-text of its own. Two things follow from that:

  • Not every video has a transcript. TikTok makes captions for many videos with speech, but not all, and none for videos without speech. Those return NO_CAPTIONS, free of charge.
  • Every track is automatic. Creators can edit TikTok's captions but cannot upload their own, so isAsr is always true, as TikTok's own player labels them.

For some videos TikTok also offers a translation, often English. It is listed in captionTracks and returned when you ask for that language. Without a preferred language you get the language spoken in the video, even when a translation is listed first.

🧠 Who it's for

You are buildingSet this
Trend or content research across creatorsincludeMetadata: true, then export to CSV or Excel
A summarizer, classifier or RAG indexformat: json, so every chunk keeps its timestamp
A prompt from a batch of videosformat: text, one string per video
Subtitles for re-editing a clipformat: srt or vtt
An English feed from videos in other languageslanguage: en, which returns TikTok's English translation where one exists
An agent that answers questions about videosThe MCP setup below

▶️ Run it in three steps

  1. Paste TikTok video links into TikTok video URLs.
  2. Optionally set a Preferred language, such as en, de or pt-BR.
  3. Press Start, then download the results as JSON, CSV or Excel.

⚙️ Input

FieldTypeDefaultWhat it does
urlslist of strings, requiredTikTok video links. A link repeated in the list is dropped, so it is never charged twice in one run.
languagestringthe spoken languagePreferred language code. A preference, not a filter: see below.
formatjson, text, srt, vttjsonSegments with timestamps, or the transcript as one string.
includeMetadatabooleanfalseAdd the video's metadata to each result, at no extra charge.

How the language is chosen

A video always returns a transcript when it has any caption track at all. Tracks are tried in this order:

  1. Your preferred language
  2. The language spoken in the video
  3. English
  4. The first track available

preferred echoes what you asked for and language says what you got, so filtering out an unwanted fallback is one comparison.

Recipes

A batch with short links

{
"urls": [
"https://www.tiktok.com/@nasa/video/7697300954667994381",
"https://vm.tiktok.com/YOUR_SHORT_LINK/"
]
}

The English translation, as SRT

{
"urls": ["https://www.tiktok.com/@ibaillanos/video/7697233515926129953"],
"language": "en",
"format": "srt"
}

Ibai Llanos speaks Spanish here, and TikTok offers an English translation, so transcript holds an English SRT file. A video without an English track returns its spoken language instead.

Plain text plus video details, for a research sheet

{
"urls": ["https://www.tiktok.com/@nasa/video/7697300954667994381"],
"format": "text",
"includeMetadata": true
}

🗂️ Output

One item per URL. Here is a transcript with metadata on, shortened. With metadata off, the fields from description to extra are left out:

{
"inputUrl": "https://www.tiktok.com/@nasa/video/7697300954667994381",
"site": "tiktok",
"id": "7697300954667994381",
"url": "https://www.tiktok.com/@nasa/video/7697300954667994381",
"title": "There was plenty to see across NASA this week 🚀 🔴 Perseverance brea...",
"preferred": { "language": null, "asr": false },
"language": "en-US",
"isAsr": true,
"captionTracks": [
{ "language": "en-US", "asr": true, "name": null }
],
"format": "json",
"segmentCount": 43,
"transcript": [
{ "text": "From breaking records on Mars to lighting up the skies over Earth,", "start": 0.34, "duration": 3.08 },
{ "text": "NASA put on quite a show this week.", "start": 3.421, "duration": 1.96 }
],
"description": "There was plenty to see across NASA this week 🚀 🔴 Perseverance breaks a record on Mars 🛰️ Fresh cargo arrives at the ISS ...",
"uploader": {
"id": "MS4wLjABAAAAU9BRVzC8oCaegVnia8IbqWhPb_-dbU7s00Y3wS1_Nx8g5RUaYvyXrpejgjdxTwd6",
"name": "NASA",
"url": "https://www.tiktok.com/@MS4wLjABAAAAU9BRVzC8oCaegVnia8IbqWhPb_-dbU7s00Y3wS1_Nx8g5RUaYvyXrpejgjdxTwd6"
},
"durationSeconds": 121,
"uploadDate": "2026-10-16",
"viewCount": 97200,
"isLive": false,
"thumbnails": [
{ "url": "https://p19-common-sign.tiktokcdn.com/..." }
],
"chapters": [],
"tags": [],
"extra": {
"like_count": 9569,
"comment_count": 252,
"language": "en",
"track": "original sound - NASA",
"artist": "NASA"
},
"error": null
}

A video with a translation lists both tracks. Ibai's video above has Spanish audio and an English translation:

"captionTracks": [
{ "language": "en-US", "asr": true, "name": null },
{ "language": "es-ES", "asr": true, "name": null }
]

Without a preferred language it returns es-ES, starting "es oficial los coches vuelan". With "language": "en" it returns en-US, starting "it's official cars fly".

TikTok signs its cover image links and they expire, so download any thumbnails you need soon after the run.

When a video has no transcript

You still get an item, and it costs nothing:

{
"inputUrl": "https://www.tiktok.com/@tiktok/video/6584647400055377158",
"error": {
"code": "NO_CAPTIONS",
"message": "This media has no caption tracks.",
"requestId": "..."
}
}
CodeMeaning
NO_CAPTIONSTikTok has no captions for this video.
UNAVAILABLERemoved, private or region locked.
BLOCKEDTikTok refused the request. Some videos are restricted by region.
UPSTREAM_RATE_LIMITEDTikTok is throttling requests. Try again later.
EXTRACTION_FAILEDA temporary failure. Try again later.
UNSUPPORTED_SITENot a TikTok video URL.
INVALID_URLNot a valid URL.
FREE_PLAN_LIMITSkipped: the Apify free plan's daily transcripts are used up.
CHARGE_LIMIT_REACHEDSkipped: the run reached the maximum charge you set.

None of these is charged.

🏷️ Pricing

One price, one event: $1.00 per 1,000 transcripts. You are charged once per video that returns a transcript, with or without metadata. Videos without captions cost nothing, and platform usage is included.

Videos with a transcriptCost
100$0.10
1,000$1.00
10,000$10.00
100,000$100.00

Set a maximum charge for a run and it stops before going over, listing the URLs it did not process.

On the Apify free plan, you get 30 transcripts per day, across all your runs. The count resets at 00:00 UTC. Once it is reached, the run stops and returns the remaining URLs with the FREE_PLAN_LIMIT code, free of charge, and the run's status message says so. Videos without a transcript do not count. Paid Apify plans have no limit.

🔌 Plug it into your AI agent

Through Apify's MCP server, this Actor becomes a tool your agent can call. Use this server URL, with your Apify API token:

https://mcp.apify.com?tools=fetchrail/tiktok-transcript
ClientHow to add it
Claude Codeclaude mcp add --transport http apify "https://mcp.apify.com?tools=fetchrail/tiktok-transcript" --header "Authorization: Bearer YOUR_TOKEN"
Claude Desktop, claude.aiAdd a custom connector with the URL above and sign in to Apify
CursorIn .cursor/mcp.json, under mcpServers: the URL, plus an Authorization: Bearer YOUR_TOKEN header
VS CodeIn .vscode/mcp.json, under servers: "type": "http", the URL and the same header

Then just ask, for example: "What does this TikTok say? Translate it to English and summarize it in two lines."

🧑‍💻 From code and automations

One HTTP request. Runs the Actor and returns the results. Replace YOUR_TOKEN with your Apify API token:

curl -X POST "https://api.apify.com/v2/acts/fetchrail~tiktok-transcript/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://www.tiktok.com/@nasa/video/7697300954667994381"], "format": "text"}'

Python, with apify-client version 3 or later:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("fetchrail/tiktok-transcript").call(
run_input={"urls": ["https://www.tiktok.com/@nasa/video/7697300954667994381"], "format": "text"}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item.get("title"), item.get("transcript") or item["error"])

No code. Apify's Make, n8n and Zapier integrations run the Actor and pass each result to your next step, such as a spreadsheet row or a Slack message. Schedules and webhooks are set up from Apify Console.

🙋 Questions people ask

Why did a video return NO_CAPTIONS when it has speech? TikTok has not made captions for it. This Actor returns the captions TikTok already has and does not transcribe audio itself. You are not charged.

Why did I get a different language than I asked for? TikTok offers no track or translation in that language for this video, so the fallback order chose another. Compare language with preferred in the result.

Can I pass a profile or a hashtag page? Not yet. Pass individual video links. TikTok's short drama series episodes are not supported.

Do short links work? Yes. vm.tiktok.com, vt.tiktok.com and tiktok.com/t/ links resolve to the video they point at, and url in the result is the full link.

Is this affiliated with TikTok? No. It is an independent tool that reads captions TikTok shows publicly to any viewer.

Is it legal? How you use transcripts is your responsibility: they can be protected by copyright, and spoken content can contain personal data. If in doubt, consult a lawyer.

🛟 Support

Open an issue on this Actor's Issues tab. If a video failed, include the requestId from its result, which lets us trace exactly what happened.