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

PlatformActor IDPrice
TikTokethereal_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 Reelsethereal_wool~instagram-reels-transcript-scraper$0.025/min
YouTubeethereal_wool~youtube-transcript-scraper$0.01/video
Any URLethereal_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.