Loading TranscribeYouTube...
Loading TranscribeYouTube...
One POST request, JSON back. No key, no sign-up, no card — paste the cURL below and it works right now. Behind it is an extraction engine that falls back through 11 separate strategies before it gives up.
It is the same endpoint that powers the web tool, rate limited per IP for fair use: 5 requests a minute, 30 an hour, 100 a day. Success rate is roughly 70–80%: YouTube blocks datacenter IPs, so no one who tells you otherwise is measuring honestly.
POST /api/transcript
Content-Type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Full YouTube video URL |
| lang | string | No | Language code (default: "en", use "auto" for any) |
curl -X POST https://transcribeyoutube.com/api/transcript \
-H "Content-Type: application/json" \
-d '{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","lang":"en"}'
{
"ok": true,
"videoId": "dQw4w9WgXcQ",
"title": "Video Title",
"channel": "Channel Name",
"thumbnail": "https://i.ytimg.com/vi/.../hqdefault.jpg",
"transcript": [
{ "text": "Hello everyone", "start": 0, "dur": 3 },
{ "text": "Welcome to the tutorial", "start": 3, "dur": 4 }
],
"languages": [],
"selectedLang": "en",
"isAutoGenerated": false,
"error": null,
"message": "Successfully fetched transcript."
}
Two fields are worth reading carefully. selectedLang is the language you actually got, which is not always the one you asked for — a video without your requested language falls back to its own rather than failing, and this field tells you that happened. languages lists the caption tracks the video offers, and is frequently an empty array: the extraction path that serves most requests returns the captions without enumerating the alternatives. Treat it as a bonus, never as a promise that a video has only one track.
{
"ok": false,
"error": "NO_CAPTIONS",
"message": "No captions are available for this video.",
"transcript": []
}
INVALID_URLHTTP 400No URL was provided in the request body.
INVALID_VIDEO_IDHTTP 400 / 200Either the URL contained no readable video ID (400), or YouTube says there is no such video — deleted, made private, or mistyped (200). Never reported as NO_CAPTIONS: a video that does not exist does not have captions to be missing.
URL_TOO_LONGHTTP 400The url field exceeded 500 characters.
INVALID_LANGHTTP 400The lang field was not a string.
INVALID_LANG_FORMATHTTP 400lang must look like "en", "en-GB", or "auto".
PAYLOAD_TOO_LARGEHTTP 413The request body exceeded 10 KB.
RATE_LIMITEDHTTP 429Over 5 requests a minute, 30 an hour or 100 a day, or the free API is at its hourly capacity. The body carries retryAfter, in seconds — back off for that long.
NO_CAPTIONSHTTP 200The video genuinely has no caption tracks. We only return this when the track list came back empty — never as a guess.
EXTRACTION_FAILEDHTTP 200We could not retrieve the captions. The video may have none, or YouTube may have blocked the request. This is deliberately NOT reported as NO_CAPTIONS, because the two are different problems and only one is worth retrying.
AUTOMATED_ACCESSHTTP 200YouTube detected automated access. Retry later.
BACKEND_OFFLINEHTTP 200The extraction backend was unreachable. Retry shortly.
FETCH_ERRORHTTP 200A network or parsing error occurred.
INTERNAL_ERRORHTTP 500Unexpected server error.
This API is provided for personal and educational use. Rate limits apply to prevent abuse and protect service availability. If you need higher limits, please contact us.
5/min · 30/hour · 100/daySame video cached 6h, not countedJSON onlyRestricted to transcribeyoutube.com500 charactersIntegrate transcript fetching into your own apps, dashboards, or content pipelines with simple HTTP calls.
Collect transcript data for NLP research, sentiment analysis, or content summarization projects.
Automate subtitle generation for video editing workflows, blog post creation, or accessibility compliance.
If you are wiring transcripts into Claude, Cursor, Zed, Continue or your own agent, there is an MCP server. Free, no API key, no account, and zero dependencies — one file of standard-library Node you can read in two minutes.
{
"mcpServers": {
"transcribeyoutube": {
"command": "npx",
"args": ["-y", "transcribeyoutube-mcp"]
}
}
}It exposes one tool, get_youtube_transcript, which takes a URL or a bare video ID and returns the text with the title, channel, language and whether the captions were auto-generated.
Most agents that read YouTube wrap a library that runs on your own machine, and YouTube blocks datacenter IPs — so those agents work locally and fail once deployed. This calls the hosted endpoint instead. Source and the full README are in the repository.
The endpoint is free and keyless today, and there is nothing to wait for. If you are building on it, tell us — it is how we decide what to work on, and how you hear first if anything changes.