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

ParamDescription
urlYouTube video URL or 11-char ID (required)
langLanguage code, e.g. en hi id. Serves an existing caption track, or AI-translates when unavailable
formatjson (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

PlanPriceCredits / month
Starter$51,000
API$93,000
Pro$1910,000

Subscribe in the console →