Every YouTube transcript, one API call.
YouTube Transcript API with Python and JavaScript SDKs
{"ok": true,"data": {"kind": "transcript","platform": "youtube","video_id": "bNpx7gpSqbY","duration": 401,"segments": [{ "start": 41.0, "text": "I studied hundreds of companies" },{ "start": 46.2, "text": "Five factors shaped their outcomes" },{ "start": 52.3, "text": "One factor stood above the rest" },… 43 more]},"usage": { "credits_spent": 1, "balance": 4812 }}What the endpoint returns
Captions when the video has them, AI transcription when it does not, from the same request. Per-segment start times, the title and the channel come back with every fetch, so a quote can be checked against the second it was said. One credit per transcript, nothing when a fetch fails.
Transcript segments
segments[]textTiming data
startdurationSource metadata
titleplatformRequest metadata
request_idusageFeatures that make the API easier to ship
Native captions when the video has them
AI transcription when it does not, on the same call
Per-segment timestamps: start and duration
Transcripts in the languages YouTube provides
Batch endpoint for up to 50 videos per call
Plain text and segmented JSON in one response
Who it is for, and how they use it
Three ways in, depending on how you work. Same endpoint, same credit, same response shape underneath all of them.
Engineers building a product
You need YouTube text in a pipeline, and you do not want an outage the first week you run it at real volume.
Analysts and teams tracking a topic
You are covering a whole channel, course or category, at more hours of video than anyone can sit through.
Teams building with assistants
Your agent needs to read a video mid-conversation and cite it without inventing a timestamp.
Call the endpoint
One POST with the URL or the video id. Same JSON every time.
Drop it in a workflow
An official n8n node. Run it on a schedule or a trigger.
Let an assistant do it
Connect once and Claude or ChatGPT fetches transcripts mid-chat.
Team fit
Built for every way your team works
Bring the same structured response into the tools and workflows your team already uses.

Start sending requests in minutes
The first successful response needs one account, one key, and one source URL.
Create your account
Start with 100 free credits. No payment card is required.
Copy an API key
Generate a key in the dashboard and send it as a Bearer token.
Send one source URL
POST the public video, episode, or media URL without parsing it first.
Receive structured text
Store the transcript, timestamps, source metadata, and usage result.
Transparent monthly pricing
Start with 100 free credits each month. Upgrade when the API becomes part of your workflow.
Reading captions is the easy part.
A library on your own IP works until you run it at volume, then it gets blocked, and it returns an error rather than a transcript on any video without captions.
Python only, running from your address. No captions means an exception you have to handle. You rent and rotate the proxies yourself, you own every break, and channels, playlists and search are not in the box.
REST from any language, with cache, then captions, then AI transcription behind one call. Blocks and rotation are ours. Batch up to 50 videos, resolve a whole channel or playlist, and pay nothing for a fetch that fails.
Let the assistant fetch the video itself.
Add the MCP server once and Claude, ChatGPT or Cursor can pull a transcript mid-conversation. Same key, same credit, no glue code and nothing to deploy.
https://transcriptfetch.com/mcp
Check live status, incident history, API stability, and public package records yourself.
Questions people ask first
How a fetch resolves
Every request walks the same path, and your code only ever sees the last box. The steps in between are why the same call keeps working at ten thousand videos.
- InputYour requestOne POST with a URL or video id, from any language.
- ResolverCacheA video anyone fetched recently returns instantly.
- ResolverCaption readPulled through rotating infrastructure, not your IP.
- ResolverAI transcriptionOnly when no caption track exists. Audio in, segments out.
- OutputOne responseSame JSON shape whichever branch produced it.
The details that matter in production
The short version of the reference, here so you can judge the integration before opening the docs. Everything below is the live behavior of the video endpoint, not aspiration.
The response shape
One envelope every time: ok, a request_id for support, data with the transcript, and usage with what it cost and what remains. With timestamps on (the default) you get a segments array of start, duration and text; turn it off and data carries one joined text string instead, never both. Title, platform and thumbnail ride along so you can render a citation without a second call. Full schemas live in the API reference.
Choosing where the text comes from
The mode field picks the branch. captions reads an existing track and fails when there is none, which is the only way to guarantee a synchronous answer. audio skips captions and transcribes. auto, the default, tries captions first and falls back to transcription. Anything that transcribes audio returns a 202 with a job: poll it, or pass a callback_url and we POST the finished transcript to you, HMAC-signed so you can verify the sender. Media under 20 minutes usually comes back synchronously anyway.
Errors, retries and what you pay
Billing is on delivery: a fetch that fails costs nothing, and transcription jobs are charged once, when the transcript exists. Errors are plain HTTP: 401 for a bad key, 402 when credits run out, 429 with a Retry-After you can obey mechanically, 502 when the upstream hiccuped and a retry with backoff is safe. Every error names the problem in the body rather than making you guess; the error reference lists all of them with causes.
Languages and non-English video
Transcripts come back in the languages YouTube provides for that video, including auto-generated tracks, so a Spanish lecture yields Spanish text without any flag from you. When a video has no captions at all, the speech-to-text fallback detects the spoken language on its own. What we do not do is translate: you get the words as they were said, which is what you want feeding a search index or an LLM that can translate downstream.
Batch, channels and rate limits
The batch endpoint takes up to 50 video ids per call and returns a per-video outcome, so one dead video never fails the other 49. Channel, playlist and search endpoints resolve straight to video lists with cursors for paging, which turns "transcribe this whole channel" into two calls in a loop. Per-key rate limits are enforced with 429 + Retry-After rather than silent throttling; sustained volume is a matter of plan, not of engineering around us.
Idempotency and duplicate work
Send an Idempotency-Key header and retrying a timed-out request can never double-charge you; reusing a key with a different body is rejected with a 409 instead of silently doing something new. Under that, the cache means repeated fetches of the same video, by you or anyone, return the stored transcript instantly. A pipeline that re-runs is a normal Tuesday, not a billing incident.
SDKs and source
The endpoint is plain REST, so the SDKs are conveniences rather than requirements: typed responses, retries and paging in your language's idiom.
Guides from the blog
Start with 100 free credits
Paste a YouTube link or copy the curl, whichever suits you. No card, no sales call.