Base URL: https://api.example.com — auth with
Authorization: Bearer sk_… (create keys in the
dashboard). All endpoints speak JSON. Jobs are async: submit, then poll.
Results are cached — resubmitting an already-processed public video returns instantly.
Submit a video for transcription (or metadata only).
curl -X POST https://api.example.com/v1/jobs \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://www.tiktok.com/@user/video/7234567890123456789"}'
{"id": "a1b2c3d4-...", "status": "IN_QUEUE", "cached": false}
Poll a job. Terminal statuses: COMPLETED, FAILED.
{"id": "a1b2c3d4-...", "status": "COMPLETED",
"output": {
"text": "full transcript ...",
"language": "ar",
"duration": 42.7,
"title": "...", "description": "...",
"segments": [
{"start": 0.0, "end": 3.2, "text": "first phrase"},
{"start": 3.2, "end": 6.9, "text": "second phrase"}
]
}}
A completed job with empty text and a positive duration means the audio was processed and contains no speech (music-only video) — that's a result, not an error.
Turn a TikTok profile, YouTube channel/playlist, or YouTube search query into a list of video URLs with listing metadata. Free.
curl -X POST https://api.example.com/v1/expand \
-H "Authorization: Bearer sk_..." \
-d '{"url": "@bromabakery", "limit": 10, "sort": "mostViewed"}'
{"kind": "tiktok-profile", "scanned": 50, "videos": [
{"url": "https://www.tiktok.com/@bromabakery/video/7...", "title": "...",
"durationSeconds": 34, "viewCount": 128000, "postedAt": "2026-06-30T..."}, ...]}
Translate a transcript. Billed only when a translation is delivered.
{"translation": "translated text ..."}
Your credit balance and month-to-date usage.
{"creditsUsd": 9.94, "videos": 12, "transcripts": 0, "minutes": 4, "translations": 0,
"freeLimits": {"videos": 25, "transcripts": 1}}
401 — missing/invalid key · 402 — free-tier cap reached or out of credits (buy a pack in the dashboard) · 429 — rate limit (120 req/min) or too many jobs in flight · 5xx — transient; retry with backoff.