Guides
Build and tune requests: try the interactive builder, learn what each source accepts, and handle rate limits, pagination, and idempotent retries.
Request builder
Pick an endpoint, fill in the fields, and run it live against your account — then copy the generated cURL, Node, or Python snippet straight into your own code.
Request builder
LivePick an endpoint, fill the fields, and copy a ready-to-run request.
/api/v1/transcripts/videoFetch a single video's transcript
A video URL or 11-character video ID. Full YouTube URLs (watch, youtu.be, /shorts/) are normalized automatically.
curl https://transcriptfetch.com/api/v1/transcripts/video \
-H "Authorization: Bearer tf_live_…" \
-H "Content-Type: application/json" \
-d '{"video":"dQw4w9WgXcQ"}'Supported sources
One endpoint per source type. Paste a URL, handle, ID, or query — each route normalizes what you give it.
list= param works for either /video (just that video) or /playlist (the whole list), depending on the endpoint you call.Rate limits
Requests are rate limited per key. The default is 60 requests per minute; a custom limit can be set on a key. Every response carries the current limit state:
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 58 X-RateLimit-Reset: 1717619400
When you exceed the limit you get 429 Too Many Requests with a Retry-After header (seconds to wait):
HTTP/1.1 429 Too Many Requests Retry-After: 12 { "error": "Rate limit exceeded. Slow down and retry shortly.", "retryAfterSeconds": 12 }
429, wait the number of seconds in the Retry-After header before retrying rather than hammering the endpoint immediately.Pagination & idempotency
List endpoints (/channel, /playlist, /search) return up to limit videos per page (1–50, default 5) plus a next_cursor. When next_cursor is non-null, pass it back as cursor to fetch the next page; null means the list is exhausted. Each page is one successful response and costs 1 credit.
# Fetch the next page by echoing next_cursor back as cursor POST /api/v1/transcripts/search { "query": "lex fridman", "limit": 10, "cursor": "eyJvIjoxMH0" }
Because requests are billed, retry safely by sending an Idempotency-Key header (any unique string, ≤255 chars). The first request runs and is charged; retries with the same key replay the stored response — same body, no extra charge — and carry an Idempotent-Replayed: true header. Replays are kept for 24 hours.
curl https://transcriptfetch.com/api/v1/transcripts/video \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 9f1c-7b2e-...-a3" \ -d '{"video":"dQw4w9WgXcQ"}'
409 idempotency_conflict.
