3.7× faster uncached

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.

99.99% success over 500k+ requests Word-level timestamps Markdown, SRT, VTT Billed only on HTTP 200
Interactive Studio
TRANSCRIPT V1ID: kCc8FmEb1nY

Let's build GPT: from scratch, in code, spelled out.

Andrej Karpathy · Live Video Pipeline · Word Timestamps Enabled

Transcript

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

Sample transcript · paste a link to fetch a live one|21,030 words|JSON / SRT / VTT

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.

Cold requests · default optionsMeasured Sep 23, 2026

Median response time

Median response timeYTAPI: median 644 ms, 100% on first try; TranscriptAPI: median 2.41 s, 85% on first try; Supadata: median 4.76 s, 100% on first try02 s4 s6 s8 sYTAPI: median 644 ms, 100% on first tryYTAPI100% on first tryRegional medians: 403 ms–1.13 s644 msTranscriptAPI: median 2.41 s, 85% on first tryTranscriptAPI85% on first tryRegional medians: 2.21 s–2.64 s2.41 sSupadata: median 4.76 s, 100% on first trySupadata100% on first tryRegional medians: 3.31 s–6.71 s4.76 s

Tail latency

P90P95P99
Tail latencyYTAPI: P90 1.23 s, P95 1.37 s, P99 2.34 s; TranscriptAPI: P90 4.12 s, P95 5.13 s, P99 9.57 s; Supadata: P90 15.0 s, P95 23.9 s, P99 37.2 s010 s20 s30 s40 sYTAPI: P90 1.23 s, P95 1.37 s, P99 2.34 sYTAPI100% on first tryP90 1.23 s · P95 1.37 s · P99 2.34 sTranscriptAPI: P90 4.12 s, P95 5.13 s, P99 9.57 sTranscriptAPI85% on first tryP90 4.12 s · P95 5.13 s · P99 9.57 sSupadata: P90 15.0 s, P95 23.9 s, P99 37.2 sSupadata100% on first tryP90 15.0 s · P95 23.9 s · P99 37.2 s
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.

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

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

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

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

Also in the APIPlaylistsChannelsSearchBatch jobs up to 100 videosFailed calls are free.

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.

1 successful HTTP 200 = 1 creditPaid packs · 300–3,000 RPM (5–50 req/s)

Start free. 200 credits on signup, no card. Same API as a paid key.

Get 200 free credits
Starter Choice
2,000credits
$9≈ $0.0045 per credit

5 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
Most Popular
10,000credits
$29≈ $0.0029 per credit

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
Best Value
50,000credits
$79≈ $0.0016 per credit

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.

EndpointPathCostNotes
TranscriptPOST /v1/transcripts1 creditWord timestamps, Markdown, SRT, VTT
Basic video infoGET /v1/videos/:id/basic-infoFreeTitle, duration, channel, subtitle languages
Full video infoGET /v1/videos/:id/video-info1 creditFull metadata, chapters, metrics
Playlist detailsGET /v1/playlists/:id1 creditDetails and videos, 1 credit per page
Channel profileGET /v1/channels/:id1 creditHandles, subscribers, links, tabs
Channel playlistsGET /v1/channels/:id/playlists1 creditPublic playlists on the channel
SearchGET /v1/search1 creditNo YouTube Data API quota
Search suggestionsGET /v1/search/suggestionsFreeAutocomplete
BatchPOST /v1/batch1 credit / taskAsync parallel batch for transcripts or basic_info; failed tasks are free

FAQ

Frequently asked questions

Something else? Email [email protected].

Get started

Try it on a video you actually need

200 credits on signup, no card. Failed requests are free. Credits never expire.

See credit packs