curl --request GET \
--url https://api.scraperize.com/v1/tiktok/video/transcript \
--header 'x-api-key: <api-key>'import requests
url = "https://api.scraperize.com/v1/tiktok/video/transcript"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.scraperize.com/v1/tiktok/video/transcript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scraperize.com/v1/tiktok/video/transcript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scraperize.com/v1/tiktok/video/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scraperize.com/v1/tiktok/video/transcript")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scraperize.com/v1/tiktok/video/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"video": {
"id": "7683891628230315295",
"url": "https://www.tiktok.com/@natgeo/video/7683891628230315295",
"handle": "natgeo"
},
"transcript": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the wildest continent on our planet. There's no place like Africa.",
"language": "eng-US",
"languageCode": "en",
"transcripts": [
{
"language": "eng-US",
"languageCode": "en",
"isOriginal": true,
"isAutoGenerated": true,
"isMachineTranslation": false,
"text": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the wildest continent on our planet. There's no place like Africa.",
"segments": [
{
"start": 3.22,
"end": 4.32,
"text": "Welcome"
},
{
"start": 6.06,
"end": 7.6,
"text": "to Africa."
},
{
"start": 8.3,
"end": 9.4,
"text": "Welcome"
}
],
"format": "webvtt",
"raw": "WEBVTT\n\n\n00:00:03.220 --> 00:00:04.320\nWelcome\n\n00:00:06.060 --> 00:00:07.600\nto Africa.\n\n00:00:08.300 --> 00:00:09.400\nWelcome\n\n00:00:12.700 --> 00:00:15.480\nto Earth's wild home.\n\n00:00:22.700 --> 00:00:25.640\nSee a new side to animals you know\n\n00:00:27.420 --> 00:00:30.640\nand meet some you've never seen before.\n\n00:00:41.460 --> 00:00:44.040\nThis is the definitive look\n\n00:00:45.660 --> 00:00:47.960\nat the wildest continent\n\n00:00:49.540 --> 00:00:51.000\non our planet.\n\n00:00:57.060 --> 00:00:58.920\nThere's no place\n\n00:01:05.140 --> 00:01:06.920\nlike Africa.\n"
}
],
"fetchedAt": "2026-10-05T14:44:42.569Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "API key required — pass it in the `x-api-key` header.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "This request costs 1 credit, but your balance is 0. Top up to continue.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested content was not found (it may not exist, be deleted, or be private).",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"details": [
{
"path": "url",
"message": "Required"
}
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded — max 100 requests per 60s. Retry in ~30s.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "UPSTREAM_BLOCKED",
"message": "The source is temporarily unavailable. Please try again shortly.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}Video transcript
Scrapes the transcripts of a public TikTok video by URL (tiktok.com/@user/video/<id>) — every caption track TikTok lists for it: the original spoken language plus any machine translations (e.g. a Spanish video with an English translation). Each transcript comes as plain text, timed segments (start/end seconds) and the raw caption file exactly as TikTok serves it (WebVTT), with its language and whether it is the original, auto-generated (speech recognition) or a machine translation. The original-language transcript is also returned at the top level (transcript, language). transcript is null and transcripts empty when the video has no captions (e.g. no speech, captions turned off, or a photo post). For the rest of the video’s data use /v1/tiktok/video.
curl --request GET \
--url https://api.scraperize.com/v1/tiktok/video/transcript \
--header 'x-api-key: <api-key>'import requests
url = "https://api.scraperize.com/v1/tiktok/video/transcript"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.scraperize.com/v1/tiktok/video/transcript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scraperize.com/v1/tiktok/video/transcript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scraperize.com/v1/tiktok/video/transcript"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scraperize.com/v1/tiktok/video/transcript")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scraperize.com/v1/tiktok/video/transcript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"video": {
"id": "7683891628230315295",
"url": "https://www.tiktok.com/@natgeo/video/7683891628230315295",
"handle": "natgeo"
},
"transcript": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the wildest continent on our planet. There's no place like Africa.",
"language": "eng-US",
"languageCode": "en",
"transcripts": [
{
"language": "eng-US",
"languageCode": "en",
"isOriginal": true,
"isAutoGenerated": true,
"isMachineTranslation": false,
"text": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the wildest continent on our planet. There's no place like Africa.",
"segments": [
{
"start": 3.22,
"end": 4.32,
"text": "Welcome"
},
{
"start": 6.06,
"end": 7.6,
"text": "to Africa."
},
{
"start": 8.3,
"end": 9.4,
"text": "Welcome"
}
],
"format": "webvtt",
"raw": "WEBVTT\n\n\n00:00:03.220 --> 00:00:04.320\nWelcome\n\n00:00:06.060 --> 00:00:07.600\nto Africa.\n\n00:00:08.300 --> 00:00:09.400\nWelcome\n\n00:00:12.700 --> 00:00:15.480\nto Earth's wild home.\n\n00:00:22.700 --> 00:00:25.640\nSee a new side to animals you know\n\n00:00:27.420 --> 00:00:30.640\nand meet some you've never seen before.\n\n00:00:41.460 --> 00:00:44.040\nThis is the definitive look\n\n00:00:45.660 --> 00:00:47.960\nat the wildest continent\n\n00:00:49.540 --> 00:00:51.000\non our planet.\n\n00:00:57.060 --> 00:00:58.920\nThere's no place\n\n00:01:05.140 --> 00:01:06.920\nlike Africa.\n"
}
],
"fetchedAt": "2026-10-05T14:44:42.569Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "API key required — pass it in the `x-api-key` header.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "This request costs 1 credit, but your balance is 0. Top up to continue.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested content was not found (it may not exist, be deleted, or be private).",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"details": [
{
"path": "url",
"message": "Required"
}
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded — max 100 requests per 60s. Retry in ~30s.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "UPSTREAM_BLOCKED",
"message": "The source is temporarily unavailable. Please try again shortly.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}cache_max_age) are free.Copy for AI assistant
Copy for AI assistant
I want to make an API call to /v1/tiktok/video/transcript. Here are the details:
Endpoint: GET https://api.scraperize.com/v1/tiktok/video/transcript
Description: Scrapes the transcripts of a public TikTok video by URL (`tiktok.com/@user/video/<id>`) — every caption track TikTok lists for it: the original spoken language plus any machine translations (e.g. a Spanish video with an English translation). Each transcript comes as plain text, timed segments (start/end seconds) and the raw caption file exactly as TikTok serves it (WebVTT), with its language and whether it is the original, auto-generated (speech recognition) or a machine translation. The original-language transcript is also returned at the top level (`transcript`, `language`). `transcript` is null and `transcripts` empty when the video has no captions (e.g. no speech, captions turned off, or a photo post). For the rest of the video’s data use `/v1/tiktok/video`.
Required Headers:
- x-api-key: Your API key
Parameters:
- url (string) [required]: The TikTok video URL, e.g. https://www.tiktok.com/@user/video/7683891628230315295.
- cache_max_age (select): Optional. Return a cached result if one this age or newer exists — served for **0 credits** with `meta.cached=true` and `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and refreshes the cache. Omit to always scrape fresh.
Example Response:
{
"data": {
"video": {
"id": "7683891628230315295",
"url": "https://www.tiktok.com/@natgeo/video/7683891628230315295",
"handle": "natgeo"
},
"transcript": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the w…",
"language": "eng-US",
"languageCode": "en",
"transcripts": [
{
"language": "eng-US",
"languageCode": "en",
"isOriginal": true,
"isAutoGenerated": true,
"isMachineTranslation": false,
"text": "Welcome to Africa. Welcome to Earth's wild home. See a new side to animals you know and meet some you've never seen before. This is the definitive look at the w…",
"segments": [
{
"start": 3.22,
"end": 4.32,
"text": "Welcome"
}
],
"format": "webvtt",
"raw": "WEBVTT\n\n\n00:00:03.220 --> 00:00:04.320\nWelcome\n\n00:00:06.060 --> 00:00:07.600\nto Africa.\n\n00:00:08.300 --> 00:00:09.400\nWelcome\n\n00:00:12.700 --> 00:00:15.480\nt…"
}
],
"fetchedAt": "2026-10-05T14:44:42.569Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}
Please help me write code in my preferred programming language to make this API call and handle the response appropriately. Include error handling and best practices.
Authorizations
Your API key. Send it in the x-api-key header (or Authorization: Bearer <key>). Create and manage keys from your dashboard.
Query Parameters
The TikTok video URL, e.g. https://www.tiktok.com/@user/video/7683891628230315295.
Optional. Return a cached result if one this age or newer exists — served for 0 credits with meta.cached=true and meta.cachedAt. Otherwise a fresh scrape runs (1 credit) and refreshes the cache. Omit to always scrape fresh.
1d, 3d, 7d, 14d, 30d