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.
Send your API token in the Authorization header of every request:
Authorization: Basic <your-api-token>
Content-Type: application/json
429 with a Retry-After header (seconds).402 and consumes nothing./api/transcriptsFetch 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 __BASE__/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("__BASE__/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(
"__BASE__/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
}
/api/channels Plus & ProResolve channels into their full upload list (newest first, capped at 500 videos). Available on Plus (up to 5 channels/request) and Pro (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 __BASE__/api/channels \
-H "Authorization: Basic YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": ["@mkbhd"]}'
const res = await fetch("__BASE__/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(
"__BASE__/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": "…" }, …]
}
]
}
Plug VidWords into no-code automation platforms — import a template, set your API token, and you're running.
Ready-to-use n8n workflow for automated transcript extraction. Import and configure with your API token.
Ready-to-use Make.com blueprint for automated transcript extraction. Import and configure with your API token.
| 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, fetch_failed.