Endpoint Playground
Returns one video's own captions translated into the requested language, as TikTok's caption/language (`cla`) service serves them. The response carries the track twice: `webvtt` is the upstream WebVTT text verbatim, and `cues` is the same track parsed into `{start_ms, end_ms, start, end, text}` records so a caller does not have to implement WebVTT. `video_id` is the aweme id returned by the feed, search, profile-posts and hashtag endpoints. Measured 2026-10-21 with the pure-Go (device-free) signer: the Korean-caption video 7696141388324293918 answered 11 English cues for `language=en`, and the same video answered Japanese, Chinese, Spanish, French, German, Korean, Portuguese, Russian, Arabic, Hindi, Indonesian, Thai, Vietnamese, Turkish and Italian tracks; a Portuguese-lyrics video answered an 18,494-character English track (240 cues). Track size is a snapshot rather than a contract (the upstream re-translates from a cache), so assert a non-empty track in the requested language, not a byte count. The route is not signature-gated, so it does not need the device-backed signer. A video with no captions answers 400 (upstream status 5); a nonexistent video answers 500 (upstream status 4).
curl 'https://api.crawlora.net/api/v1/tiktok/mobile/video/subtitles?video_id=7696141388324293918&language=en' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| video_id | string | Yes | 7696141388324293918 | Numeric id of the video (aweme id) |
| language | string | Yes | en | Target language code: ar, de, en, es, fr, hi, id, it, ja, ko, pt, ru, th, tr, vi, zh |
{
"code": 200,
"msg": "OK",
"data": {
"video_id": "7696141388324293918",
"language": "en",
"cue_count": 2,
"cues": [
{
"start_ms": 80,
"end_ms": 880,
"start": "00:00:00.080",
"end": "00:00:00.880",
"text": "Hey."
},
{
"start_ms": 3080,
"end_ms": 4880,
"start": "00:00:03.080",
"end": "00:00:04.880",
"text": "Our family is finally together again after so long."
}
],
"webvtt": "WEBVTT\n\n00:00:00.080 --> 00:00:00.880\nHey.\n\n00:00:03.080 --> 00:00:04.880\nOur family is finally together again after so long.",
"variant": "glide_v3_1",
"content_source": "redis",
"host": "aggr16-normal.tiktokv.us",
"fetched_at": "2026-10-21T10:56:17Z"
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.