Every YouTube transcript, one API call.

YouTube Transcript API with Python and JavaScript SDKs

100 free credits · no card
POST/api/v2/transcripts/video200 · 1.24s
{"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 }}
46 segments · 14.2 KB1 credit

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.

Get a transcript

Transcript segments

segments[]text

Timing data

startduration

Source metadata

titleplatform

Request metadata

request_idusage

Features 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.

DevelopersResearch and marketingAI and agentsRESTNO CODEMCPChannels, playlists and keyword searchAn MCP server, plus Python and JavaScript SDKs

Start sending requests in minutes

The first successful response needs one account, one key, and one source URL.

  1. 1

    Create your account

    Start with 100 free credits. No payment card is required.

  2. 2

    Copy an API key

    Generate a key in the dashboard and send it as a Bearer token.

  3. 3

    Send one source URL

    POST the public video, episode, or media URL without parsing it first.

  4. 4

    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.

Basic
$5/mo

1,000 credits every month

For side projects and light pipelines.

Start with Basic
Pro
$15/mo

10,000 credits every month

For production apps, agents, and RAG pipelines.

Go Pro
Mega
$45/mo

50,000 credits every month

For high-volume pipelines and whole-channel workloads.

Go Mega
Scale
$229/mo

300,000 credits every month

For serious volume: pipelines, platforms, and data teams.

Scale up

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.

With a caption library

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.

With TranscriptFetch

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.

No code required

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

ClaudeTool: transcriptfetch
What does this video say about chunking?
CALLING get_transcript(video="youtube.com/watch?v=dQw4…")
At 02:29 he says fixing how documents were chunked moved the numbers more than a bigger model did.
99.78%
Independently monitored uptime
100
Free credits every month
$0
Charged for a failed request
1
Response shape across sources

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.

  1. Input
    Your requestOne POST with a URL or video id, from any language.
  2. Resolver
    CacheA video anyone fetched recently returns instantly.
  3. Resolver
    Caption readPulled through rotating infrastructure, not your IP.
  4. Resolver
    AI transcriptionOnly when no caption track exists. Audio in, segments out.
  5. Output
    One 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.