The best YouTube transcript API is the one that returns what your model needs. On 20 October 2026 the QuanticData Video API read three videos in 1.7 to 7.3 seconds, with the transcript as spoken and 12 frames each; the open-source Python package was blocked 9 of 9 times from a cloud server. Hosted alternatives return text and timestamps, no frames.
Most comparisons of transcript APIs are written by a vendor from the vendors' own pages. This one adds two measurements of our own, both taken on 20 October 2026: three public videos read through our Video API, and the open-source package run from our server in a datacenter, first directly and then through a residential exit. The hosted services were not called: their rows come from their own pricing and API pages, read the same day. Their names are given so you can recognize them, without links.
What one call returns, option by option
| Option | What one call returns | Chapters | Frames | MCP tool |
|---|---|---|---|---|
| QuanticData Video API | Transcript stamped [m:ss], description, chapters and frames in one Markdown timeline, plus the same parts as JSON and a token count | Yes, the author's chapters as headings | Up to 30, 160×90, where the speaker points, says a price or starts a chapter | Yes, read_video, frames inline as images |
| youtube-transcript-api, the open-source Python package | Timed snippets: text, start, duration | No | No | No, you write the wrapper |
| YouTube Data API v3, captions.download | One caption file (SRT, VTT, SBV, SCC or TTML) of a video you are allowed to edit | No | No | No |
| TranscriptAPI.com | Transcript with text, start and duration, plus the title and the length | Not in its documented response | Not listed | Yes |
| Supadata | Transcript with timestamps | Not listed | Not listed | Yes |
| youtube-transcript.io | Transcripts for up to 50 video IDs per request | Not listed | Not listed | Not listed |
"Not listed" means the feature does not appear on the service's own pricing, API or feature page on 20 October 2026. Language is the other difference that matters to a model. The Video API returns the language that is spoken and lists every track the video offers. The Python package asks for English unless you pass languages, and can machine-translate a track. The Data API returns a track in its original language, and its tlang parameter returns a machine translation. A model translates better from the original than from a translated caption track, which carries the translator's errors on top of the captioner's.
Where it runs, what happens on a block, what it costs
| Option | Who fetches, and what happens on a block | Billing | Free tier |
|---|---|---|---|
| QuanticData Video API | Our servers. A refused address is retried through a residential exit inside the same call, as all three reads of 20 October were | Per successful read, one price whatever the length; failed reads never billed | $2 of API usage every month, no card |
| youtube-transcript-api | Your machine. It raises RequestBlocked or IpBlocked, 9 of 9 times from our cloud server, and you add and pay a proxy | Free software; about 1.6 MB of proxy traffic per transcript in our run | Free |
| YouTube Data API v3 | Google, with your OAuth token. No IP block, but a quota: 200 units per caption download | Free quota | 10,000 units a day, so 50 caption downloads |
| TranscriptAPI.com | Its servers | Credits, 1 per successful request; $5 a month for 1,000 | 100 credits once, at signup |
| Supadata | Its servers | Credits, 1 per transcript; unused credits do not roll over | 100 credits a month; paid plans from $5 a month billed annually, for 300 credits |
| youtube-transcript.io | Its servers. Above 5 requests per 10 seconds it answers 429 | Plans on its pricing page | On its pricing page |
Two rows need a word. The Data API is the official route, but captions.download only works on a video you have permission to edit, so it does not read other people's videos at all. The Python package costs nothing to install, and the bill moves to the proxy you put under it: in our run each transcript moved about 1.6 MB through the proxy, because the package downloads the full watch page before it asks for the captions. At the Residential Basic price of $1.00 per GB that is about $1.60 per 1,000 transcripts in bandwidth alone, with the code and the retries still yours to maintain.
Measured: three videos through the Video API
On 20 October 2026 we sent three public YouTube videos to the production endpoint with the default settings, one call each, and timed the whole round trip from a client outside our network.
| Video and length | Captions | Chapters | Frames | Tokens | Time |
|---|---|---|---|---|---|
| Product review in Italian, 8:23 | it, automatic | 0 | 12 | 2,342 | 1.7 s |
| Maths lesson, 18:40 | en, manual | 12 | 12 | 5,780 | 2.6 s |
| Developer tutorial, 12:22 | en, automatic | 25 | 12 | 4,270 | 7.3 s |
Each read fetched between 442 KB and 565 KB from the platform: the player data, the captions and the storyboard sheets, never the media file. The Italian review came back in Italian, not as an English translation. All three reads took the residential retry inside the same call, with no parameter set by the caller, and still came back in 1.7 to 7.3 seconds.
Measured: the open-source package from a cloud server
Same three videos, same day, from our production server in a datacenter in Frankfurt (DigitalOcean). Version 1.2.4 of youtube-transcript-api from PyPI, Python 3.12, three rounds two seconds apart, 17:48 to 17:49 UTC. Then the same code with the package's GenericProxyConfig pointed at a rotating United States exit of our residential proxies.
| Route | Attempts | Result | Time per attempt |
|---|---|---|---|
| Direct, from the datacenter address | 9 | RequestBlocked 9 of 9 | 0.78 to 1.11 s |
| Same server, rotating residential exit | 9 | 9 of 9 read: 192 Italian snippets, 286 and 338 English ones | 1.57 to 2.61 s, median 2.09 s |
The block is not about volume: the very first request from the datacenter address was refused. What the package returned through the proxy was the transcript and nothing else, with no chapters, no description and no frames, and the Italian review still had to be asked for by passing languages=["it", "en"]. The three ways out of that error, with code for each, are in the RequestBlocked and IpBlocked guide.
What frames add to a transcript
A transcript says "as you can see" and stops there. The Video API places a frame at the moments the words point to, using five rules. Over the 36 frames of the three reads above, this is where they landed:
| Reason | When a frame is taken | Frames out of 36 |
|---|---|---|
| cue | The speaker points at the screen: "as you can see", "come vedete", "regardez" and the like | 21 |
| price | A price is said out loud | 2 |
| chapter | Three seconds into a chapter the author wrote | 6 |
| scene | The picture changes on a stretch nobody points at | 6 |
| interval | Periodic coverage when nothing else claims the stretch | 1 |
Each frame comes with its timestamp, its reason and the quote that earned it, so a model can say what was on screen when a price was said, and a reader can jump to that second. The frames are small by design, 160×90: they show a product, a slide or a chart, not small text.
Which option for which job
| Job | Option | Why |
|---|---|---|
| An agent that must see what the speaker shows | Video API | Frames where the words point, inline as images through MCP |
| Summaries that cite the second a claim is made | Video API | [m:ss] stamps and the author's chapters in one timeline |
| Transcripts from a cloud server or a serverless function | Video API, or the package with a rotating residential proxy | 9 of 9 blocked direct in our run; the Video API retries inside the call |
| A few transcripts from your own laptop | The open-source package | No account, works from a home connection |
| Captions of videos on your own channel | YouTube Data API v3 | Official, but only for videos you may edit, 50 downloads a day on the default quota |
How to read a video with the Video API
One POST with the URL. Set max_frames to 0 for the transcript alone, start and end to read a window of a long video, and max_tokens to keep the timeline inside a prompt.
import os, requests
r = requests.post("https://api.quanticdata.io/v1/scraper/video",
headers={"Authorization": f"Bearer {os.environ['QD_API_KEY']}"},
json={"url": "https://www.youtube.com/watch?v=aircAruvnKk",
"max_frames": 8, "max_tokens": 6000},
timeout=120)
video = r.json()["payload"]
print(video["transcript"]["language"], len(video["chapters"]), "chapters")
print(video["content"][:800]) # the timeline: Markdown with [m:ss] stamps
for f in video["frames"]:
print(f["n"], f["at"], f["reason"], f.get("quote", ""))
Agents get the same call as the read_video tool of the QuanticData MCP server: Claude, Cursor or any MCP client passes a URL and receives the timeline with the frames as images. The step by step, with the MCP setup and a REST loop side by side, is in Train an agent with the Video API. Every field is in the API reference, and the rest of the data layer is on the web data API for AI page.
How we compared, and the limits
- The Video API and the Python package were measured by us on 20 October 2026, on three public videos of 8 to 19 minutes.
- The hosted services were not called. Their rows come from their own pages, read the same day, and prices change: check them before you buy.
- The package run used one datacenter address. Other providers' ranges may answer differently, and a home connection usually works.
- Proxy traffic per transcript is the bandwidth meter of our proxy order over nine reads with the retry code of the RequestBlocked guide: 14.4 MB, about 1.6 MB each, retries included.
- The Video API costs $0.02 per successful read ($20 per 1,000 reads), list price since 22 October 2026.