Transcripts for YouTube videos,fast the first time
Uncached videos come back about as fast as captions load on YouTube itself. 644 ms median across four regions, 2.34 s at P99, no retries. Segments, Markdown or SRT, with optional word timings.
Confirm you're human, then fetch a live transcript.
Let's build GPT: from scratch, in code, spelled out.
Andrej Karpathy · Live Video Pipeline · Word Timestamps Enabled
hi everyone so by now you have probably
heard of chat GPT it has taken the world
and AI Community by storm and it is a
system that allows you to interact with
an AI and give it text based tasks so
for example we can ask chat GPT to write
us a small Hau about how important it is
that people understand Ai and then they
can use it to improve the world and make
it more prosperous so when we run this
AI knowledge brings prosperity for all
to see Embrace its power okay not bad
Benchmarks
Cold requests, nothing cached
Measured from nodes in US West, US East, Central Europe and Asia, on recent videos none of the three APIs had cached. Every video went to all three.
Median response time
Tail latency
- Sustained load
- 12 hours from 4 regions
- Requests
- 565,900
- 56% uncached · 44% cache hits
- Errors
- 19 (0.003%)
- Uncached P99 under load
- 1.14 s
Each figure covers every region together. On the median, whiskers show the range between regions; on the tail, the darkest bar is P90 (9 in 10 requests finished within it) and the lightest is P99. The line under each name is the share of first requests that came back with a transcript.
How we measured
Videos. Uploads one to seven days old, under 1,000 views, with an English caption track, spread evenly from under 10 minutes to 90 minutes. We found them through our own search API and checked their captions without asking any API for a transcript, so none of the three had them cached.
Clients. A small VM in each region. Each video went to all three APIs from the same VM, in random order and a few seconds apart, with default options (Supadata in native mode).
What counts. Every YTAPI request was a cache miss (X-Cache: MISS). For the other two, every successful response counts as returned. TranscriptAPI's cache still answered about 7% of its responses, and those are included. Supadata sends no cache header; its fastest response took over a second, so none of them looks like a cache hit.
First try. TranscriptAPI answered 15% of first requests with 408, which its docs describe as a temporary failure to retry. Retried as documented, 99.7% succeeded; the wait including retries was 2.60 s at the median and 21.5 s at P99. The bars use the final request only.
Our side. Every YTAPI request was POST /v1/transcripts with default options, on the same path customers use: no cache bypass, nothing warmed first. Video length barely matters: the median was 553 ms under 10 minutes and 736 ms for 60–90 minutes.
Requests that failed inside our own test clients were dropped for all three APIs.
Sustained load. A separate run on YTAPI alone: 12 hours of steady traffic from the same 4 regions, with daily peaks and short bursts. Uncached requests skipped our cache, so each one is a fresh fetch from YouTube. Errors are timeouts, rate limits and 5xx responses; a 404 for a video without captions is a correct answer, not an error. The uncached P99 is lower than the chart's because the clients reused connections, as most production code does; the chart opens a new connection for every request.
How it works
Cache helps. We don't depend on it.
Cached transcripts come back fast. Uncached ones take a little longer, and 99 in 100 still finish within 2.34 s.
- 01Cached
Served from cache
If the video was fetched recently, you get it from our cache, in whichever format you ask for.
24–191 ms median, cached; depends on your network
- 02Not cached
Fetched on our own network
Otherwise we fetch it fresh, through a network we built for this one job and run ourselves. So a video nobody has asked for before still comes back fast.
644 ms median, uncached
- 03Not cached
Retried on our side
If a fetch is slow or refused, we try again another way before we answer. You don't need retry logic for it.
2.34 s P99, uncached
99.99% success over 500k+ requests
- 04Either way
In the format you asked for
Segments, word timings, Markdown, SRT or VTT. A 90-minute video takes only a little longer than a short one.
553 ms → 736 ms under 10 min vs 60–90 min
Beyond one transcript
One key, the rest of YouTube's text
Transcripts are where most people start. The same account and the same credits also cover whole channels, the Chrome extension, search, comments and video details.
Whole channels and playlists
Export every transcript from a channel or playlist, up to 5,000 videos, as one zip of Markdown, TXT, SRT or JSON files plus a combined file. No code: start it from the dashboard and we email you a link when it's done. The estimate is free, and videos without captions cost nothing.
Export a channelChrome extension
The transcript of the video you're watching, in a side panel on YouTube, free and without an account. Copy it, download it, or send it to ChatGPT, Claude or Grok to summarize. On a channel or playlist page, pick up to 1,000 videos and download their transcripts together.
Add to ChromeBatch API
Up to 100 videos in one request, fetched in parallel. Each video succeeds or fails on its own, and only the ones that succeed use a credit.
Batch docsSearch, channels and playlists
Search YouTube, list a channel's uploads or playlists, and page through any playlist. No Google Cloud project and no YouTube Data API quota.
Search docsVideo details, comments and replays
Views, likes, chapters, description links and YouTube's AI summary when it shows one. Top or newest comments with their replies, and the most replayed moments of a video.
Video docsFree tools, no account
Need one transcript right now? Paste a link into the transcript generator or the subtitle downloader and copy or download it as TXT, Markdown, SRT or VTT.
Transcript generator
Developer integration
From your code or your AI agent
Plain HTTPS and JSON, SDKs for Python and TypeScript, an MCP server and agent skills. One key and the same credits for all of them.
curl "https://api.ytapi.dev/v1/transcripts?video_id=kCc8FmEb1nY" \
-H "Authorization: Bearer $YTAPI_API_KEY"Response
{
"video_id": "kCc8FmEb1nY",
"language": "en",
"track_kind": "asr",
"duration_seconds": 6981.76,
"has_word_level": false,
"segments": [
{
"text": "hi everyone so by now you have probably",
"start": 0.199,
"end": 4.92,
"duration": 4.721
},
…
]
}# pip install ytapi-sdk
from ytapi import YTAPI
api = YTAPI() # reads YTAPI_API_KEY
transcript = api.get_transcript("kCc8FmEb1nY")
for segment in transcript["segments"][:3]:
print(segment["start"], segment["text"])Output
0.199 hi everyone so by now you have probably
2.52 heard of chat GPT it has taken the world
4.92 and AI Community by storm and it is a// npm install @ytapi/sdk
import { YTAPI } from "@ytapi/sdk";
const api = new YTAPI(); // reads YTAPI_API_KEY
const srt = await api.getTranscript("kCc8FmEb1nY", { format: "srt" });
console.log(srt);Output
1
00:00:00,199 --> 00:00:04,920
hi everyone so by now you have probably
2
00:00:02,520 --> 00:00:07,560
heard of chat GPT it has taken the world
…{
"mcpServers": {
"ytapi": { "url": "https://api.ytapi.dev/mcp" }
}
}Tools your agent gets
- get_transcript
- Markdown, plain text, SRT or VTT
- get_video_details
- Exact counts, views per day, related videos
- get_comments
- Top or newest comments and replies
- search_youtube
- Videos, channels, playlists and Shorts
- get_channel_videos
- A channel's uploads, newest first
- get_playlist_videos
- A playlist's videos, page by page
# Claude Code, Codex, Cursor, Cline and others
npx skills add ytapi/youtube-skills
# OpenClaw
npx clawhub@latest install ytapiThen ask
- Summarize this video: https://youtu.be/kCc8FmEb1nY
- Get the Spanish subtitles of this talk as an SRT file.
- What has @mkbhd uploaded lately? Two lines on each.
Plain HTTPS from any language. JSON, Markdown, SRT or VTT.
API referencePay as you go
Pay per transcript. Credits never expire.
No subscriptions. Only HTTP 200 responses use a credit; errors, 404s and rate limits are free.
Start free. 200 credits on signup, no card. Same API as a paid key.
Get 200 free credits5 req/s · 300 RPM
- Full API access
- Billed only on success (HTTP 200)
- 300 RPM rate limit (5 req/s)
- Standard technical support
- Credits never expire
Save 36% vs 2,000
10 req/s · 600 RPM
- Everything in 2,000 pack, plus:
- 600 RPM rate limit (10 req/s)
- Priority human technical support
Save 65% vs 2,000
50 req/s · 3,000 RPM
- Everything in 10,000 pack, plus:
- 3,000 RPM rate limit (50 req/s)
- Dedicated priority human support
Need more credits? Enterprise custom pricing
$20 and above may require 3-D Secure.
What a credit buys
One successful response is one credit. HTTP 4xx/5xx and 429 are free.
| Endpoint | Path | Cost | Notes |
|---|---|---|---|
| Transcript | POST /v1/transcripts | 1 credit | Word timestamps, Markdown, SRT, VTT |
| Basic video info | GET /v1/videos/:id/basic-info | Free | Title, duration, channel, subtitle languages |
| Full video info | GET /v1/videos/:id/video-info | 1 credit | Full metadata, chapters, metrics |
| Most replayed | GET /v1/videos/:id/heatmap | 1 credit | Peaks and graph; free when a video has none |
| Comments | GET /v1/videos/:id/comments | 1 credit | Top or newest, and replies, 1 credit per page |
| Playlist details | GET /v1/playlists/:id | 1 credit | Details and videos, 1 credit per page |
| Channel profile | GET /v1/channels/:id | 1 credit | Handles, subscribers, links, tabs |
| Channel playlists | GET /v1/channels/:id/playlists | 1 credit | Public playlists on the channel |
| Search | GET /v1/search | 1 credit | No YouTube Data API quota |
| Search suggestions | GET /v1/search/suggestions | Free | Autocomplete |
| Batch | POST /v1/batch | 1 credit / task | Async parallel batch for transcripts or basic_info; failed tasks are free |
Do I need a Google API key?
Which videos are supported?
Can I download every transcript from a channel or playlist?
Is there a Chrome extension?
Is it fast for videos nobody has requested before?
What happens if a video has no captions?
Can I get transcripts in other languages?
Do you support word-level timestamps?
Do I need to handle retries?
How does pricing work?
What are the rate limits?
Can I get a refund?
Get started
Try it on a video you actually need
200 credits on signup, no card. Failed requests are free. Credits never expire.
- Claude
- Claude Code
- Codex
- Cursor
- VS Code
- Antigravity
- OpenClaw
- Python
- TypeScript
- curl
- JSON
- Markdown
- SRT
- VTT
- word timings
- chapters
- search
- channel uploads
- playlists
- 100-video batches