YouTube Transcript API
Extract YouTube transcripts instantly with a single API call — no proxies, IP rotation, or infrastructure to manage. Get accurate transcripts for any public video or whole channels, ready for analysis, AI models, or automation. Grab your API token from your profile — included in every plan, even Free.
Download the OpenAPI 3.0 specification to import the API into Postman, Insomnia, code generators, or an AI coding assistant.
Authentication
Send your API token in the Authorization header of every request:
Authorization: Basic <your-api-token>
Content-Type: application/json
Confirm your email first. Until you click the verification link we sent you, every API call returns 403 with {"error":"email_unverified"}. This is the most common first-call failure on a new account.
Rate limits & credits
- The API is rate-limited to 5 requests per 10 seconds per token. Exceeding it returns
429with aRetry-Afterheader (seconds). - Each successfully extracted transcript consumes 1 credit from your monthly allowance. Failed lookups (no captions, invalid id) are free.
- Videos with no captions at all are rescued by automatic speech-to-text on paid plans. That is far more expensive to run, so a fresh transcription costs 3 credits (1 base + a 2-credit surcharge) instead of 1. Replays of an already-transcribed video cost the usual 1.
- If a request would exceed your remaining credits it returns
402and consumes nothing.
POST/api/transcripts
Fetch transcripts for up to 50 videos per request. ids accepts video IDs or full YouTube URLs. Optional lang sets the preferred caption language (falls back to whatever the video has).
curl -X POST https://vidwords.com/api/transcripts \
-H "Authorization: Basic YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": ["dQw4w9WgXcQ", "https://youtu.be/jNQXAC9IVRw"], "lang": "en"}'
const res = await fetch("https://vidwords.com/api/transcripts", {
method: "POST",
headers: {
"Authorization": "Basic YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ ids: ["dQw4w9WgXcQ", "jNQXAC9IVRw"], lang: "en" }),
});
const data = await res.json();
console.log(data.results);
import requests
res = requests.post(
"https://vidwords.com/api/transcripts",
headers={
"Authorization": "Basic YOUR_API_TOKEN",
"Content-Type": "application/json",
},
json={"ids": ["dQw4w9WgXcQ", "jNQXAC9IVRw"], "lang": "en"},
)
print(res.json()["results"])
Response:
{
"results": [
{
"id": "dQw4w9WgXcQ",
"title": "…",
"author": "…",
"language": "English",
"languageCode": "en",
"isGenerated": false,
"text": "full transcript as one string…",
"segments": [{ "text": "…", "start": 1.36, "duration": 1.68 }, …]
},
{ "id": "…", "error": "no_transcript", "message": "No transcript is available for this video" }
],
"creditsRemaining": 23
}
POST/api/channels Starter & up
Resolve channels into their full upload list (newest first, capped at 500 videos). Available on Starter (up to 5 channels/request), Pro, and Advanced (up to 50). ids accepts @handles, channel URLs, or UC… channel IDs. Listing videos is free; extracting their transcripts via /api/transcripts costs credits as usual.
curl -X POST https://vidwords.com/api/channels \
-H "Authorization: Basic YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": ["@mkbhd"]}'
const res = await fetch("https://vidwords.com/api/channels", {
method: "POST",
headers: {
"Authorization": "Basic YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ ids: ["@mkbhd"] }),
});
console.log((await res.json()).results);
import requests
res = requests.post(
"https://vidwords.com/api/channels",
headers={"Authorization": "Basic YOUR_API_TOKEN", "Content-Type": "application/json"},
json={"ids": ["@mkbhd"]},
)
print(res.json()["results"])
Response:
{
"results": [
{
"id": "@mkbhd",
"channelId": "UCBJycsmduvYEL83R_U4JriQ",
"title": "…",
"videoCount": 500,
"truncated": true,
"videos": [{ "id": "…", "title": "…", "author": "…" }, …]
}
]
}
Automation tools
Plug VidWords into no-code automation platforms — import a template, set your API token, and you're running.
n8n workflow
Ready-to-use n8n workflow for automated transcript extraction. Import and configure with your API token.
Make blueprint
Ready-to-use Make.com blueprint for automated transcript extraction. Import and configure with your API token.
Errors
| HTTP | Code | Meaning |
|---|---|---|
400 | bad_request | Malformed body, too many ids, or invalid input |
401 | unauthorized | Missing or invalid API token |
402 | insufficient_credits | Not enough credits left this month |
403 | plan_required | Endpoint needs a higher plan (channels API) |
429 | rate_limited | Too many requests — honor Retry-After |
Per-video errors inside results: invalid_id, no_transcript, transcripts_disabled, video_unavailable, age_restricted, video_unplayable, ip_blocked, request_blocked, fetch_failed, internal. Per-channel errors: invalid_id, channel_not_found, internal.