Transcript API for video pipelines
Spoken text from public YouTube, TikTok, and Instagram Reels — WebVTT or plain text, same data + meta envelope, TikTok AI fallback when captions are missing.
What usually breaks first
Common failure modes after a DIY scraper or marketplace API hits production — schema drift, billing surprises, and pagination quirks.
Each platform exposes captions differently — WebVTT, empty bodies, carousel slides, mismatched language codes. DIY downloaders mean three parsers and unclear billing on no-track videos.
Pass a public URL, read data.transcript, branch on data.lookupStatus. Completed not_found still bills; lookup_failed and 503 do not.
6 routes for this job
Routes used in live transcripts integrations (YouTube, TikTok, Instagram, X, Facebook, and Reddit). Paths and params match OpenAPI; documented fields ship in responses.
GET /v1/youtube/videos/transcriptWatch URLs, youtu.be links, Shorts — all normalised. Returns data.transcript.plainText plus timed data.transcript.segments (startMs, endMs per line). Optional language (ISO 639-1, e.g. en) when multiple caption tracks exist. 1 credit per completed lookup.
GET /v1/tiktok/videos/transcriptvm.tiktok.com short links and /@user/video/… URLs. WebVTT when captions exist. Set useAiFallback=true for speech-to-text when there's no track — 11 credits on a completed lookup (1 base + 10 AI surcharge). Photo carousels return 400 transcript_target_not_video after charge.
GET /v1/instagram/posts/transcriptReels and video posts by URL. Returns data.transcripts[] — one entry per carousel slide when applicable. AI transcription with a 120-second cap; longer Reels return video_too_long_for_transcription. 1 credit per completed lookup.
GET /v1/twitter/tweets/transcriptVideo tweets on X. Plain text in data.transcript. Same lookupStatus pattern. Handy when your monitoring pipeline already pulls tweet URLs and you want spoken content without a second vendor.
GET /v1/facebook/posts/transcriptReels and video posts on Facebook. Plain text response. Same 120-second AI transcription limit as Instagram. Useful for cross-posted creator content you already track on other networks.
GET /v1/reddit/posts/transcriptHosted video on Reddit posts. Optional language param. data.transcript.plainText when found. Niche, but if you're already mining Reddit threads for product research, you don't need a separate path for v.redd.it clips.
How teams wire this
Typical order starts with “rag ingestion: chunk text, not raw urls.” Adjust cadence, schema, and thresholds to your stack.
- 1
RAG ingestion: chunk text, not raw URLs
Pull transcripts from a list of YouTube long-form URLs. Use data.transcript.plainText for embeddings, or data.transcript.segments when you need startMs for citations. TikTok returns WebVTT in data.transcript.content — strip timing cues before your vector store.
- 2
TikTok batch: captions first, AI only on misses
Run two passes or branch in one job: try without useAiFallback first (1 credit) for caption-backed videos. Re-queue failures with useAiFallback=true only when you need text from every clip in the set. Don't blanket-enable AI on 10k URLs — that's 110k credits instead of 10k.
- 3
Cross-platform repurposing
Creator posts the same hook on TikTok and YouTube Shorts. Pull both transcripts, diff the spoken lines, generate a blog draft from the longer YouTube take. One auth header, no platform-specific normalizers in your repo.
- 4
Sponsorship and ad-read detection
Scan YouTube transcripts for 'use code', 'sponsored by', brand names. Timestamps in segments let you jump to the exact moment in the player UI. Pair with /v1/youtube/videos for metadata when you need publish date and view count in the same report.
- 5
Instagram Reels in a creator feed
List recent Reels via /v1/instagram/profiles/{handle}/reels, then transcript each URL. Carousel posts return multiple data.transcripts entries — iterate the array, don't assume a single string.
- 6
Accessibility and closed captions
Ship sidecar captions from timed segments. YouTube's data.transcript.segments gives startMs and endMs per line — enough to generate SRT without parsing anything yourself. TikTok's WebVTT in data.transcript.content works when you already have a VTT renderer.
- 7
Handle lookupStatus before you store
if (data.lookupStatus !== 'found') skip your vector write. not_found still charged. lookup_failed and 503 are free — safe to retry with backoff. Log meta.creditsCharged per row so finance can reconcile batch jobs.
TikTok with AI fallback when captions are missing
Swap YOUR_API_KEY for a dashboard key. The playground pre-fills auth for the same path.
Questions we get from teams shipping transcript pipelines
- Do YouTube and TikTok share a response shape? Yes — data.lookupStatus, data.transcript, meta.creditsCharged. Your parser doesn't fork per platform.
- What if there's no transcript? data.lookupStatus is not_found. You still pay 1 credit — the lookup completed. On TikTok, useAiFallback=true is your escape hatch (+10 credits).
- WebVTT or plain text? TikTok returns WebVTT in data.transcript.content. YouTube gives plainText plus segments with millisecond offsets. Twitter and Facebook return plain strings in data.transcript.
- How do language codes work? Pass language=en (two letters, ISO 639-1). We prefer that track when it exists. No guarantee the creator uploaded in that language.
- Any rate limits? No request quotas on paid metered routes — credits are the only limit. Under extreme concurrency you may get 503 with Retry-After (not charged). For big backfills stay under ~500 concurrent requests — same guidance as our monitoring endpoints.
- Why did my TikTok photo URL fail? Photo carousels aren't videos. You get 400 transcript_target_not_video. Filter non-video URLs before enqueueing if you're watching credit burn.
- Does HTTP 200 mean found? No. Always branch on lookupStatus. We've seen production bugs from teams who assumed 200 = content.
- Instagram carousels? data.transcripts is an array. A 5-slide post can return five entries. Empty array with found status means the post resolved but had nothing to transcribe.
- One API key for everything? Same x-api-key header as profiles, comments, search. Batch YouTube and TikTok in one worker pool without juggling marketplace subscriptions.
- What happens when platforms change? We absorb upstream structure shifts. Your field names stay data.transcript and data.lookupStatus — not whatever HTML class YouTube renamed this week.
Run a transcripts lookup on free credits
100 credits on signup — run the curl above, inspect lookupStatus and meta.creditsCharged, then buy a pack when ready. Balances do not expire.