50 free credits · no card

YouTube Transcript API, every video in one call.

Clean text with timestamped segments, for any public video, whole channel, playlist or keyword search: over REST, an MCP server, or the Python and JavaScript SDKs.

No card required. Failed fetches are free.

video · 14:22captions · en · 412 segments
02:14The part everyone skips is that retrieval quality decides the answer, not the model you picked.
02:21We swapped in a model twice the size and the evaluation numbers barely moved at all.
02:29Then we fixed how the source documents were chunked and everything jumped in a week.
02:37Most of our corpus was video, which meant most of our corpus was not searchable.
02:45Transcripts with timestamps turned it into text we could actually index and cite.
02:53And citations matter more than people admit, because a claim nobody can check is a liability.
<2s
median caption fetch
99.84%
API uptime

Independently monitored

500+
developers served
3
Platforms covered

YouTube, TikTok, Instagram

One call, one shape.

Send a URL or a bare video id. Below are two different videos: the first has a caption track, the second has none and was transcribed from audio. Same request, same fields, same parser. Only source tells them apart.

The request, either way
curl -X POST https://transcriptfetch.com/api/v2/transcripts/video \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_KEY" \
  -d '{"video": "<any supported url or id>"}'
Video with captions
{
  "ok": true,
  "data": {
    "kind": "transcript",
    "title": "Example video",
    "duration": 212,
    "language": "en",
    "source": "captions",
    "segments": [
      { "start": 0, "duration": 3.5,
        "text": "We're no strangers to love" },411 more
    ]
  },
  "usage": { "credits_spent": 1, "balance": 49 }
}

200 · 1 credit

Video with no captions
{
  "ok": true,
  "data": {
    "kind": "transcript",
    "title": "Example video",
    "duration": 184,
    "language": "en",
    "source": "audio",
    "segments": [
      { "start": 0, "duration": 3.5,
        "text": "So the first thing to understand here" },411 more
    ]
  },
  "usage": { "credits_spent": 4, "balance": 45 }
}

200 · 4 credits · transcribed

Nothing in your code branches on which path ran. A caption fetch is a flat single credit; transcription is billed by audio duration, which is the only other difference and it shows up in usage rather than in the shape. Every field, with types

Try it on a real video.

Paste any YouTube link and run it against the live API. No account, no key, no card: you get the same JSON your code would.

6 free transcripts a month, no account needed.

Beyond one video

Resolve a channel, playlist or search into a list, then transcribe what you want. Every row's url is accepted by the transcript and batch endpoints as-is. Costs are stamped on each tile.

  • POST/transcripts/video

    Fetch a transcript

    One video URL or id. Captions, or AI transcription when there are none.

    1 credit

  • POST/transcripts/batch

    Batch fetch

    Up to 50 ids per call, 500 on Mega and Scale. Per-item outcomes.

    1 credit per delivered

  • POST/transcripts/channel

    List a channel

    Latest uploads, newest first, cursor-paged.

    1 credit per page

  • POST/transcripts/playlist

    List a playlist

    Every video in a YouTube playlist, cursor-paged.

    1 credit per page

  • POST/transcripts/search

    Search videos

    Keyword search, results ready to transcribe.

    1 credit per page

  • GET/transcripts/jobs/{jobId}

    Poll a job

    State of an audio transcription started by a 202.

    Free

  • GET/me

    Check balance

    Validate the key and read remaining credits.

    Free

  • GET/health

    Health check

    Public liveness probe for uptime monitoring.

    Free

Three ways to connect

The same fetch, the same credit, whichever way you reach it. Write code, let an assistant call it, or run it from a workflow tool without writing any.

01

Call the endpoint

One POST with a URL or a bare video id, from any language. Typed SDKs for Python and Node if you want them, plain REST if you do not.

Read the API reference

Endpoint

POST /api/v2/transcripts/video

02

Let an assistant fetch it

Add the MCP server once and Claude, ChatGPT or Cursor pulls a transcript mid-conversation. OAuth on first use, nothing to deploy, no key to paste.

Set up MCP

Server URL

https://transcriptfetch.com/mcp

03

Run it in a workflow

The official n8n node, or an authenticated HTTP step in Make and Zapier. Fetch on a schedule, on a webhook, or whenever a row lands in a sheet.

See the n8n node

Community node

n8n-nodes-transcriptfetch

Works with
  • ChatGPT
  • Claude
  • Cursor
  • n8n
  • Make
  • Zapier

In your language

curl -X POST https://transcriptfetch.com/api/v2/transcripts/video \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{"video": "dQw4w9WgXcQ"}'
Shared response
{
  "ok": true,
  "request_id": "req_…",
  "data": {
    "kind": "transcript",
    "video_id": "dQw4w9WgXcQ",
    "platform": "youtube",
    "title": "Example video",
    "channel": "Example Channel",
    "duration": 212,
    "language": "en",
    "source": "captions",
    "segments": [
      { "start": 0,   "duration": 3.5,
        "text": "We're no strangers to love" },
      { "start": 3.5, "duration": 4.1,
        "text": "You know the rules and so do I" }
    ]
  },
  "usage": { "credits_spent": 1, "balance": 49 }
}

What people build with it

What did they say about chunking?

get_transcript(video="…")

02:29Fixing how documents were chunked moved the numbers more than a bigger model did.

AI apps and agents

Ground an assistant in what was actually said. Segments carry start times, so an answer can cite the second rather than paraphrase a video it never watched.

segments

02:14
02:21
02:29

chunked, cited, retrievable

Search and RAG indexing

Turn a video corpus into text your index can reach. Chunk on timestamps and every retrieved passage keeps a link back to the moment.

mentions · 12 weeks

Content analytics

Track a channel, a course, or a topic across more hours of video than anyone can sit through, then query the text.

Pricing

One credit per delivered caption transcript. Failed or empty results are free. Unused credits roll over up to twice your monthly allowance.

How much will my volume cost?

10,000transcripts / month

50300,000

Best plan

Pro

You pay

$15 / mo

Per 1,000

$1.50

Choose Pro
PlanPriceCredits / monthPer 1,000
Free$0/mo50FreeGet started
Basic$5/mo1,000$5.00Start with Basic
ProPopular$15/mo10,000$1.50Go Pro
Mega$45/mo50,000$0.90Go Mega
Scale$229/mo300,000$0.76Scale up

Top-ups are billed at your plan's per-1,000 rate and never expire. AI transcription is billed by audio duration rather than per transcript. Full pricing

Three ways to get YouTube text

Compared by approach rather than by vendor, because the real choice is whether you want to own the infrastructure.

CapabilityTranscriptFetchAn open-source libraryYour own scraper
Language supportREST, any languagePython onlyAny language
SetupGet a key, make a requestpip installRent proxies, write parsers, maintain
No captions on the videoAI transcription, same endpointRaises an errorBuild a whole second pipeline
Blocks and rotationHandled for youYour IP, blocked at scaleYours to solve, forever
Channels, playlists, searchBuilt in, paginatedNot includedMore parsers
BatchUp to 50 per callManual loopsYour queue
Cost of a failureNothingYour timeYour time and your proxies
When YouTube changesWe fix itWait for a releaseYou fix it, tonight

One approach people expect to see here and will not: the YouTube Data API. It does not return caption text for videos you do not own: captions.download requires the owner's OAuth credentials, so for third-party videos it is not an option at any quota.

Questions people ask first

What happens when a video has no captions?

The audio is transcribed automatically on the same call: no second endpoint and no change to your code. Media under 20 minutes usually returns inline; longer media returns a 202 with a job you can poll or receive by callback. Transcription is billed by audio duration, one credit per started minute, and only on delivery.

Which languages does it return?

Whatever caption track the video carries, with the language stamped on the response. When several tracks exist you can ask for one; when none exists and the audio is transcribed, the language is detected automatically.

What are the rate limits?

Per-plan request rates, returned on every response as standard rate-limit headers so a client can back off without guessing. Batch is the cheaper path for volume: one call carries up to 50 videos on the free tier, Basic and Pro, and up to 500 on Mega and Scale.

Can I fetch many videos in one request?

Yes. POST /transcripts/batch takes up to 50 ids per call, 500 on Mega and Scale, and returns a per-item outcome rather than failing the whole request. You are charged one credit per successfully delivered caption transcript; failures cost nothing.

What is in the free tier?

50 credits a month, no card. Every endpoint is included, not a reduced subset, so you can build the real integration before deciding to pay for it.

Is a credit the same as a request?

No. A credit is a delivered result. A caption transcript is one credit, a channel, playlist or search page is one credit, and polling a job, checking your balance and the health probe are free. Failed and empty results are never charged.

Are there SDKs?

Python and JavaScript, both thin wrappers over the same REST endpoints with typed models. There is also an official n8n community node, and an MCP server if you would rather let an assistant make the call.

What happens when YouTube changes something?

We fix it. Extraction runs through several methods behind one endpoint, so a change that breaks one path usually falls through to another before anyone notices, and the response shape your code parses does not move either way.

Put the spoken web to work

50 free transcripts a month. No card required. Failed fetches are never billed.