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.
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
Developer integration
Three lines of code. Any language
Plain HTTPS and JSON. Copy a snippet, add your key.
curl -X POST https://api.ytapi.dev/v1/transcripts \
-H "Authorization: Bearer sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"video_id": "kCc8FmEb1nY",
"format": "word_timestamps"
}'Pay 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 |
| 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 |
Get started
Try it on a video you actually need
200 credits on signup, no card. Failed requests are free. Credits never expire.