Quickstart
Every API is a hosted actor on Apify. One HTTP call starts a run and returns transcript items. Free Apify accounts include $5/month usage — enough for ~200 minutes of transcription.
1. Get a token
Sign up at apify.com (free) and copy your API token from Settings → Integrations.
2. Pick an endpoint
| Platform | Actor ID | Price |
|---|---|---|
| TikTok | ethereal_wool~tiktok-transcript-scraper | $0.025/min |
| Douyin (抖音) | ethereal_wool~douyin-transcript-scraper | $0.025/min |
| Xiaohongshu (小红书 / RedNote) | ethereal_wool~xiaohongshu-video-transcript-scraper | $0.025/min |
| Bilibili (B站) | ethereal_wool~bilibili-transcript-scraper | $0.025/min |
| Instagram Reels | ethereal_wool~instagram-reels-transcript-scraper | $0.025/min |
| YouTube | ethereal_wool~youtube-transcript-scraper | $0.01/video |
| Any URL | ethereal_wool~any-url-transcript | $0.025/min |
3. Call it
The simplest integration is the synchronous run endpoint — it starts the run, waits, and returns the dataset items in one response:
curl -X POST \
"https://api.apify.com/v2/acts/ethereal_wool~any-url-transcript/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"videoUrls": [
"https://www.tiktok.com/@tiktok/video/7649091368656194847",
"https://v.douyin.com/iRNBho6u/",
"https://www.bilibili.com/video/BV1GJ411x7h7"
]
}'For long batches, start the run asynchronously and fetch the dataset when it finishes:
# start
curl -X POST "https://api.apify.com/v2/acts/ethereal_wool~any-url-transcript/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{"videoUrls": [...]}'
# → returns {"data": {"id": "<runId>", "defaultDatasetId": "<datasetId>", ...}}
# poll, then fetch items
curl "https://api.apify.com/v2/datasets/<datasetId>/items?token=$APIFY_TOKEN"Output schema
Each transcribed video is one dataset item with this shape (uniform across platforms):
{
"url": "https://www.tiktok.com/@tiktok/video/7649091368656194847",
"platform": "tiktok",
"videoId": "7649091368656194847",
"author": "tiktok",
"title": "…",
"durationSec": 34.2,
"playCount": 1284000,
"language": "en",
"transcript": "full spoken text …",
"sentences": [
{ "beginTime": 0, "endTime": 3400, "text": "First sentence…" },
{ "beginTime": 3400, "endTime": 7100, "text": "Second sentence…" }
],
"billedMinutes": 0.57
}beginTime/endTime are milliseconds — converting to SRT/VTT subtitle cues is a 10-line script.
Errors & billing guarantees
Unfetchable video
Private, deleted or region-locked videos are reported in the run log and never billed.
No speech
Music-only or silent videos return an empty transcript and are not billed a transcription fee.
Metered exactly
Billing is per second of audio actually transcribed, rounded to the minute rate — visible per-run in your Apify console.