V2 is the streamlined, user-owned transcript model. It prioritizes fast cache hits, consistent responses, and no surprise translations unless you request a language.
https://www.youtubetranscript.dev/api/v2/transcribehttps://www.youtubetranscript.dev/api/v2/batchhttps://www.youtubetranscript.dev/api/v2/jobs/{job_id}https://www.youtubetranscript.dev/api/v2/batch/{batch_id}https://www.youtubetranscript.dev/api/v2/channels/resolvehttps://www.youtubetranscript.dev/api/v2/channels/{channel_id}https://www.youtubetranscript.dev/api/v2/channels/historyDownload the YAML to import into Postman, Insomnia, generate clients, or paste into ChatGPT / Claude.
The fastest path for one video at a time. Caption-based transcripts return within a few seconds; ASR runs asynchronously and is polled via /api/v2/jobs/{job_id}.
/api/v2/transcribeTranscribe a single YouTube video. Returns immediately for caption-based videos; falls back to ASR (async) when allow_asr is true and captions are unavailable.
videostringYouTube URL or 11-character video ID.
languageISO 639-1Translate to this language. Omit to keep the source language.
sourceauto | manual | asrPreferred transcript source. Default: auto.
allow_asrbooleanFall back to ASR if captions fail. Required for ASR-only videos.
formatobject{ timestamp, paragraphs, words } — include extra structure in the transcript.
webhook_urluriWhen set, the response returns processing and the result is delivered to your URL.
/api/v2/jobs/{job_id}Poll a single transcription job. Use this for ASR jobs returned from /transcribe. Returns 202 while running and 200 when complete.
job_idpathIdentifier returned in the original transcribe response.
include_segmentsbooleanInclude segment-level timestamps in the transcript payload.
include_paragraphsbooleanInclude paragraph groupings.
include_wordsbooleanInclude word-level timestamps (ASR only).
Transcribe many videos in a single request, then poll or receive results via webhook.
/api/v2/batchSubmit up to 3,000 videos in one request. Returns within 2 seconds; poll the returned poll_url or wait for the webhook.
video_idsstring[]Up to 3,000 IDs depending on plan. Free = 10, Basic = 500, Pro = 1,500, Business = 3,000.
sourceauto | manual | asrPreferred transcript source. Default: auto.
allow_asrbooleanFall back to ASR when captions fail. webhook_url is required.
formatobject{ timestamp, paragraphs, words } — applied to every result.
webhook_urluriDelivers the completed batch payload. Required when allow_asr is true.
/api/v2/batch/{batch_id}Check the status of a batch. Returns 202 while processing and 200 when results are ready.
batch_idpathBatch identifier returned from POST /batch.
Channel transcription flow:1. POST /api/v2/channels/resolve — fetch the channel uploads (video metadata only).2. POST /api/v2/batch — send the returned video_id values to start transcription. Use a webhook_url to receive results when done.3. GET /api/v2/batch/{batch_id} — poll the batch for overall progress and aggregated results.4. GET /api/v2/channels/{channel_id} — fetch a channel batch with per-video job status; /channels/history lists past channel batches.
/api/v2/channels/resolvePaid plansFetch the uploads of a YouTube channel by URL, channel ID, or @handle. Returns video metadata only — pair the returned video_id values with /api/v2/batch to transcribe them.
channel_urlstringYouTube channel URL, channel ID, or @handle. One of channel_url, channel_id, or handle must be provided. Handles are the public ID without the @ (for https://www.youtube.com/@jawed, the ID is jawed).
limitintegerMaximum uploads returned. Defaults to the plan maximum.
Per-request cap: Basic 500 videos · Pro 1,500 videos · Business 3,000 videos. Monthly job cap: Basic 3 · Pro 8 · Business unlimited.
Plan-based: Free 1 req/s · Basic 25 req/s · Pro 50 req/s · Business 100 req/s. Exceeding the limit returns 429 with a Retry-After header.
/api/v2/channels/{channel_id}Fetch a channel batch and the per-video transcription job status. For overall batch status (counts + progress), poll GET /api/v2/batch/{batch_id} instead — use this endpoint when you also need each video's individual job state.
channel_idpathBatch ID returned from /channels/resolve.
/api/v2/channels/historyList recent channel batches for the authenticated user.
limitqueryMax items (default 50, max 100).
Official SDKs, an MCP server for Claude and Cursor, a custom GPT, and ready-made templates for Make and n8n.
Add the YouTube Transcript MCP server to Claude Desktop, Cursor, or any MCP-compatible client. Adds tools to transcribe videos, fetch existing transcripts, and check usage.
claude mcp add --transport http ytscribe https://mcp.youtubetranscript.dev --header "x-api-token: YOUR_API_KEY"First-class TypeScript types, retries, pagination helpers, and webhook signature verification.
npm install youtube-transcript-apiSync + async clients, type stubs, and helpers for batch and webhook flows.
pip install youtubetranscriptdevapiDrop our custom GPT into ChatGPT to summarize, quote, translate, or query any YouTube video using natural language. Backed by /api/v2/gpt/* under the hood.
Import the template (or copy the snippet) to add transcription to existing automations — Notion, Sheets, Slack, Airtable, Zapier-style flows.
Module: HTTP > Make a request
- URL: https://www.youtubetranscript.dev/api/v2/transcribe
- Method: POST
- Headers:
Authorization: Bearer {{connection.api_key}}
Content-Type: application/json
- Body type: Raw / JSON
- Request content:
{
"video": "{{1.video_url}}",
"format": { "timestamp": true }
}{
"name": "Transcribe Video",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://www.youtubetranscript.dev/api/v2/transcribe",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"video\": $json.video_url }"
}
}Import the OpenAPI spec into Postman, Insomnia, or any tool that speaks OpenAPI 3.
Errors return a JSON body with code and message. HTTP status reflects the category.
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | invalid_request | Invalid JSON or missing required fields |
| 401 | invalid_api_key | Missing or invalid API key |
| 402 | payment_required | Insufficient credits |
| 404 | no_captions | No captions available and ASR not used |
| 429 | rate_limit_exceeded | Too many requests, check Retry-After |
| 500 | internal_error | Server error, retry with backoff |
Per-plan caps for sustained requests and batch sizes. Bursting above the limit returns 429 with a Retry-After header.
| Plan | Requests | Batch size |
|---|---|---|
| Free | 1 req/s | 10 videos |
| Basic | 25 req/s | 500 videos |
| Pro | 50 req/s | 1,500 videos |
| Business | 100 req/s | 3,000 videos |
Need help shipping? Reach out — we usually reply within a few hours.