TikTok Video Transcript
tiktok.video.transcript
Get a video's own captions as text with timings, in the language you choose when the video has it.
At a glance
- Endpoint ID
tiktok.video.transcript- Price
- 1 credit per call; failed calls are free
- Runs for up to
- 45 seconds
Request
Send the endpoint ID as capability and its fields as input. Set UPSCRAPE_API_KEY to your key first.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "tiktok.video.transcript", "input": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tiktok.video.transcript", "input": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "tiktok.video.transcript", "input": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
Input
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
handle |
string | one of | Account handle. | |
url |
string | one of | Public URL of the page to fetch. | https://www.tiktok.com/@tiktok/video/7680721699… |
video_id |
string | one of | Video identifier. | |
language |
string | no | Language for returned content. |
Response
A finished call answers with HTTP 200; the data is in results[0].data, and billing.credits_charged is what it cost. A call still running after the wait answers 202: see jobs and results.
This is results[0].data from a real run:
{ "text": "Hi, it's Katy Perry,\nand something amazing has been happening on TikTok. Let me show you.\nMake that in your Mustang. To Radiohead.\nThank yo…", "language": "eng-US", "video_id": "7680721699171601694", "cues": [ { "text": "Hi, it's Katy Perry,", "end_ms": 1100, "start_ms": 0 }, { "text": "and something amazing has been happening on TikTok. Let me show you.", "end_ms": 5561, "start_ms": 1101 } ]}
Fields
| Field | Type | Example |
|---|---|---|
cues[].start_ms |
integer | 0 |
cues[].end_ms |
integer | 1100 |
cues[].text |
string | Hi, it's Katy Perry, |
text |
string | Hi, it's Katy Perry, and something amazing has been happening o… |
cues |
array | 4 records |
language |
string | eng-US |
video_id |
string | 7680721699171601694 |
If a call fails
A failed call costs nothing. The response carries an error.code you can branch on; Errors and retries lists every code and which ones to retry.
Other TikTok endpoints
tiktok.collection.videosCollection videostiktok.comment.repliesComment repliestiktok.feed.trendingTrending feedtiktok.hashtag.postsHashtag videostiktok.live.getLive room detailtiktok.music.infoSong detailtiktok.music.postsSong videostiktok.post.getVideo detailtiktok.profile.getUser profile detailtiktok.search.suggestionsSuggestions searchtiktok.shop.product.getShop product detailtiktok.shop.productsShop store productstiktok.shop.reviewsShop product reviewstiktok.shop.searchShop product searchtiktok.user.followersUser followerstiktok.user.followingUser followingtiktok.user.liveUser live statustiktok.user.videosUser videostiktok.video.commentsVideo comments
Something missing or unclear? Ask the team that builds the TikTok endpoints.