TranscriptFetchDashboard
Guides

Guides

Build and tune requests: try the interactive builder, learn what each source accepts, and handle rate limits, pagination, and idempotent retries.

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.

Live

Pick an endpoint, fill the fields, and copy a ready-to-run request.

POST/api/v1/transcripts/video

Fetch 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"}'
Run it against your account

One endpoint per source type. Paste a URL, handle, ID, or query — each route normalizes what you give it.

RouteFieldAcceptsExample value
/videovideoVideo URL, youtu.be link, /shorts/ link, or 11-char video IDhttps://youtu.be/dQw4w9WgXcQ
/playlistplaylistPlaylist URL or playlist ID (PL…, UU…, OL…, etc.)https://www.youtube.com/playlist?list=PL...
/channelchannel@handle, /channel/UC… URL, /c/ or /user/ URL, or UC… IDhttps://www.youtube.com/@veritasium
/searchqueryAny keyword queryhow transformers work
You don't need to extract IDs yourself. Full URLs are parsed server-side — a watch URL with a list= param works for either /video (just that video) or /playlist (the whole list), depending on the endpoint you call.

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 }
Honor Retry-After. When you hit a 429, wait the number of seconds in the Retry-After header before retrying rather than hammering the endpoint immediately.

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. Reusing a key with a different body, or while the first request with that key is still in flight, returns 409 idempotency_conflict.
Next →Integrations