API
YouTube transcripts for any video or channel, with translation to 50+ languages. 1 credit per transcript (cache hits are free), +1 for AI translation.
Authentication
Create an API key in the console (new accounts get 20 free credits). Pass it as a header:
x-api-key: ct_test_... GET /v1/transcript
| Param | Description |
|---|---|
url | YouTube video URL or 11-char ID (required) |
lang | Language code, e.g. en hi id. Serves an existing caption track, or AI-translates when unavailable |
format | json (default, with timestamps) · text · srt |
curl "https://api.channeltranscripts.com/v1/transcript?url=https://youtu.be/dQw4w9WgXcQ&lang=hi&format=text" \
-H "x-api-key: ct_test_..." Response headers: X-Cache (hit/miss), X-Credits-Charged. Errors: 400 invalid URL / language code / batch limit (BAD_URL / BAD_LANG / INVALID_LIMIT), 401 invalid or malformed key (BAD_KEY / BAD_KEY_FORMAT), 402 insufficient credits, 404 video/job not found, 429 anonymous rate limit.
Troubleshooting: if you see X-RateLimit-Remaining in the response, your API key was not sent — the request fell back to anonymous access (no credits charged). Common cause in shell one-liners: prefix assignment like KEY=... curl -H "x-api-key: $KEY" expands $KEY before the assignment takes effect. Assign on its own line first. Cache hits are always free (X-Credits-Charged: 0).
POST /v1/batch — whole channel
Fetch transcripts for a channel's latest videos. Async: returns a job_id; poll until completed. Costs 1 credit per video (charged upfront).
curl -X POST "https://api.channeltranscripts.com/v1/batch" \
-H "x-api-key: ct_test_..." -H "Content-Type: application/json" \
-d '{"url":"https://www.youtube.com/@3blue1brown","limit":10}'
GET /v1/batch/{job_id} → {"status":"completed","videos":[{"videoId":"...","lang":"en","text":"..."}]} Pricing
| Plan | Price | Credits / month |
|---|---|---|
| Starter | $5 | 1,000 |
| API | $9 | 3,000 |
| Pro | $19 | 10,000 |