The YouTube transcript API that never guesses.
Get a YouTube transcript from any public video URL in one API call. Name the language and the caption source, and that exact track comes back as JSON, plain text, SRT, or WebVTT.
- The exact track, or an error
- Ask for manual Spanish and you get manual Spanish. If that track is not published, you get
track_not_availableand no charge. Never a fallback language. Never speech recognition standing in for captions the video does not carry. - Proof on every transcript
- Track ID, caption kind, observation time, cache status, and a SHA-256 of the content.
Interactive demo: find and pick a caption track
This demo runs on sample fixtures inside your browser, so any YouTube link resolves to one of them. The real API answers the same shapes.
Billing, retries, and batches
One price either way
A completed caption track costs one credit. A cached transcript comes straight back from storage at the same price as a fresh extraction.
Zero credits
No captions, private video, upstream refusal, our own fault: the request is free and the reason is a machine-readable error code.
Idempotency-Key
Replay the same key with the same body and the original transcript comes back. A different body returns 409. A timeout never bills you twice.
1,000 videos per batch
Send explicit video inputs, reserve credits atomically, read per-item status, and page through the finished items.
How to get a YouTube transcript in one call.
The POST commits your request before it waits, so a dropped connection or a retry with the same idempotency key returns the original transcript instead of starting a second one.
Ask for the track you want
Send a supported source URL plus language preferences and caption kinds, or an exact track_id returned by an earlier call.
curl -sS https://api.transcriptlayer.com/v1/transcripts \
-H "Authorization: Bearer $TRANSCRIPTLAYER_API_KEY" \
-H "Idempotency-Key: import-row-1842" \
-H "Content-Type: application/json" \
-d '{
"source": { "url": "https://www.youtube.com/watch?v=tlDemo01Voy" },
"language_preferences": ["en"],
"caption_kinds": ["manual"],
"content_format": "segments"
}'Take the answer
HTTP 200 with the finished transcript, or 202 with poll_url and Retry-After. One schema in both, and in every batch item.
HTTP/1.1 202 Accepted
Retry-After: 3
{
"id": "tr_9Qv…",
"status": "processing",
"poll_url": "/v1/transcripts/tr_9Qv…"
}Download SRT or WebVTT
Optional. The same stored artifact renders as JSON, plain text, SRT, or WebVTT. Downloads cost no credits.
GET /v1/transcripts/tr_9Qv…/content?format=srt GET /v1/transcripts/tr_9Qv…/content?format=vtt
One schema. Four downloads.
Every YouTube transcript comes back as segments with start_ms, duration_ms, and text. The four formats are renderings of that one artifact, so your subtitle file and your search index never disagree.
- jsonThe full transcript resource: selected track, available tracks, retrieval provenance, credits used.
- textPlain reading copy for embeddings, summarizers, RAG pipelines, and full-text search.
- srtNumbered cues with comma milliseconds, for video editors and players.
- vttWebVTT for the browser
<track>element and accessibility work.
Pull your first YouTube transcript today.
Create an account, take an API key, and spend one credit on the caption track you named. Failed requests cost nothing, so a bad video ID costs you nothing but a retry.