Blog/Guides

TikTok Transcript API: Captions, Text and SRT

Get the transcript of any public TikTok video as plain text and timed segments with one API call. Python, Node.js and cURL examples, plus SRT export.

The Social Parse team · · Updated

To get a TikTok transcript with an API, send the video's link to GET /v1/tiktok/videos/transcript. The answer holds the whole transcript as one text, plus timed segments you can turn into subtitles. It works on any public video that has captions, with no TikTok login and no developer account.

Why TikTok's developer APIs won't do it

Not one most developers can use. TikTok's Display API returns only the signed-in user's own videos, and its Research API, which can return speech-to-text, is limited to approved non-commercial researchers. Neither gives you the transcript of an arbitrary public video for a product.

Get a transcript in one call

Set your key and base URL:

export API_KEY="your-api-key"
export API_URL="https://api.socialparse.dev"

Then pass the video's link (or its id, as video_id):

curl -G -H "x-api-key: $API_KEY" "$API_URL/v1/tiktok/videos/transcript" \
  --data-urlencode "url=https://www.tiktok.com/@nike/video/7587811642650545421"

Short links (vm.tiktok.com/...) aren't accepted: open one in a browser and use the full link it leads to.

What comes back

{
  "data": {
    "video_id": "7587811642650545421",
    "language": "eng-US",
    "text": "Hey Caitlin, can you make it from there? Hey Caitlin, how about from here? ...",
    "segments": [
      { "start": 6.14, "end": 7.24, "text": "Hey Caitlin," },
      { "start": 7.82, "end": 9.16, "text": "can you make it from there?" },
      { "start": 13.82, "end": 15.88, "text": "Hey Caitlin, how about from here?" }
    ]
  },
  "page": null,
  "meta": {
    "platform": "tiktok",
    "endpoint": "video_transcript",
    "params": { "video_id": "7587811642650545421" },
    "request_id": "req_61fd34ea3abe4686",
    "api_version": "v1",
    "fetched_at": "2026-10-19T09:30:28Z",
    "cached": false
  }
}
  • text is the whole transcript, ready for search, summaries or an LLM prompt.
  • segments are the captions in order; start and end are seconds from the start of the video.
  • language is the caption track's language, as TikTok codes it.

The transcript is shortened here. See Responses for the envelope and meta.

Choose a caption language

Some videos carry more than one caption track: the creator's own, auto-generated ones, and translations. The video endpoint lists them in captions, each with its language and whether it's auto generated. Pass one as language:

curl -G -H "x-api-key: $API_KEY" "$API_URL/v1/tiktok/videos/transcript" \
  --data-urlencode "video_id=7587811642650545421" \
  --data-urlencode "language=eng-US"

Leave language out to get the language spoken in the video.

Save it as an SRT subtitle file

The segments map straight onto SRT, the subtitle format most editors and players read:

def srt_time(seconds):
    millis = round(seconds * 1000)
    hours, millis = divmod(millis, 3_600_000)
    minutes, millis = divmod(millis, 60_000)
    secs, millis = divmod(millis, 1000)
    return f"{hours:02}:{minutes:02}:{secs:02},{millis:03}"


lines = []
number = 1
for segment in transcript["segments"]:
    lines.append(str(number))
    lines.append(f"{srt_time(segment['start'])} --> {srt_time(segment['end'])}")
    lines.append(segment["text"])
    lines.append("")
    number += 1

with open("video.srt", "w", encoding="utf-8") as file:
    file.write("\n".join(lines))

Transcripts for a whole profile

Pair the transcript endpoint with profile videos to transcribe a creator's recent uploads, for example to research a niche or index your own brand's videos:

import os

import requests

API_URL = os.environ["API_URL"]
HEADERS = {"x-api-key": os.environ["API_KEY"]}

videos = requests.get(
    f"{API_URL}/v1/tiktok/profiles/videos", params={"handle": "nasa"}, headers=HEADERS, timeout=120
).json()["data"]

for video in videos:
    response = requests.get(
        f"{API_URL}/v1/tiktok/videos/transcript", params={"video_id": video["id"]}, headers=HEADERS, timeout=120
    )
    if not response.ok:
        print("skipped", video["url"], response.json()["error"]["code"])  # NOT_FOUND: no captions
        continue
    print(video["url"])
    print(response.json()["data"]["text"])
    print()

A profile's page holds up to 15 videos. That's one credit for the page, plus one per transcript.

Errors: no captions, private or deleted

AnswerWhy
404 NOT_FOUNDThe video has no captions, or it was deleted, made private or isn't shown in your region.
400 INVALID_PARAMSThe link isn't a video link, or neither url nor video_id was sent.
429 RATE_LIMITEDToo many calls this minute: wait as long as Retry-After says.

Errors cost no credits. See Errors for retries.

Reddit video transcripts too

Reddit-hosted videos work the same way: the post transcript endpoint answers with the same text and segments.

FAQ

Does this work on any TikTok video?

On any public video that has captions, including auto-generated ones. Videos without captions answer 404 NOT_FOUND.

Do I need a TikTok account or developer approval?

No. Social Parse reads public pages as a logged-out visitor. You only need an API key.

How much does a transcript cost?

One credit per transcript. New accounts get 100 free credits; see pricing.

Can I translate the transcript?

If TikTok has a translated caption track, pass its code as language. Otherwise, send text to a translation service or LLM.

What else can I get from a TikTok video?

Views, likes, shares, saves, hashtags and its sound, from the video endpoint. See the TikTok scraper API guide for profiles and hashtags.

Related posts

More from the Social Parse team.

Need public social data as JSON?

Start with 100 free credits, no card needed. Get an API key, or read the quickstart.