Quarra
Guide · YouTube

YouTube transcript API in 2026: what the official API allows, and what to use instead

YouTube's official API gives you the captions of your own videos, 50 a day. The open-source library fills the gap until you deploy it. What each one does, three traps in YouTube's captions, and how to get transcripts of any public video.

Checked against the YouTube Data API documentation and measured on October 10, 2026.

The short answer

The official YouTube Data API only lets you download the captions of videos you are allowed to edit: your own, or those of a channel you manage. Each download costs 200 of the 10,000 quota units a project gets per day. For anyone else's videos, there is no official transcript API. The open-source Python library youtube-transcript-api reads the captions YouTube shows on the watch page, without a key, but its own documentation warns that YouTube blocks most requests coming from cloud providers. Code that works on your laptop can fail once deployed. A hosted scraper is the remaining route when you need transcripts at scale.

What the official API gives you

We read the YouTube Data API v3 reference on October 10, 2026 (pages last updated in September 2026). Captions have two read methods:

MethodWhat it returnsQuota costWho can call it
captions.listThe caption tracks of a video: language, name, whether they are automatic. “The API response does not contain the actual captions.”50 unitsOAuth with the youtube.force-ssl or youtubepartner scope
captions.downloadThe text of one track, as SRT, VTT, SBV, SCC or TTML200 unitsOAuth, and “the user to have permission to edit the video”

A project gets 10,000 units a day by default, so at most 50 caption downloads a day, and only for videos its user can edit. More quota goes through Google's quota extension form. The API fits a creator managing their own captions. It does not fit research, monitoring or AI pipelines that read other people's videos.

The Python library youtube-transcript-api

youtube-transcript-api (version 1.2.4, January 2026) reads the same captions a viewer can turn on, with no key and no account. On a home connection it works well:

from youtube_transcript_api import YouTubeTranscriptApi

api = YouTubeTranscriptApi()
print([t.language_code for t in api.list("wsstlwuE5XY")])
# ['ar', 'my', 'en', 'fr', 'ko', 'pt-BR']
transcript = api.fetch("wsstlwuE5XY", languages=["en"])
print(transcript.snippets[0].text)

Two things to know before you build on it:

  • Deployment. Its README says that YouTube has started blocking most requests that come from cloud providers such as AWS, Google Cloud Platform and Azure, and that you will then run into RequestBlocked errors. Code that works on your laptop can fail on a server or in a scheduled job.
  • Languages. fetch() looks for English unless you pass languages. For a channel in several languages, you need to know each video's language first, or list its tracks and pick one.

Three traps, whatever tool you use

The first track is not the spoken language

The TED talk above is in English, and YouTube lists its tracks with Arabic first: an Arabic translation by a volunteer, followed by Burmese, then English. A tool that takes the first track when you do not name a language returns Arabic. In our benchmark on October 10, 2026, with the language left empty, the most used YouTube transcript scraper on Apify returned Arabic for 10 of 12 English videos from @TED and @MrBeast. The language to trust is the video's original audio track, which YouTube marks.

Machine-dubbed tracks

YouTube now dubs many videos into a dozen languages or more with AI, and each dubbed audio track gets its own automatic captions. Those are captions of a machine translation, not of what the speaker said. Stanford Online's first CS229 lecture of 2022 (Bl4Feh_Mjvo) has an English track and 15 automatic ones. Ask youtube-transcript-api for es-US and you get the Spanish dub's captions, which open with “Bueno, soy Tongima”: the lecturer says “So I am Tony Ma.”

Every line twice

Some creators style their captions with an outline, which YouTube stores as a second copy of each line, with invisible zero-width characters around the words. On a 19-minute @MrBeast video, youtube-transcript-api returned 1,170 lines, 585 of them exact repeats of the line before. Joined into text, the transcript reads every sentence twice and counts twice the words.

Getting transcripts with our Actor

The YouTube Transcript Scraper takes video, Short, channel and playlist links, or search terms, and returns one record per video. With no language set, each video comes back in the language spoken in it: the creator's captions in that language if they exist, otherwise YouTube's automatic captions. Machine-dubbed tracks are never returned, and repeated outline lines are kept once. Give a list of languages if you want another one, in order of preference.

{
  "urls": [
    "https://www.youtube.com/watch?v=wsstlwuE5XY",
    "https://www.youtube.com/@lexfridman"
  ],
  "maxVideosPerSource": 10,
  "languages": [],
  "transcriptFormat": "both",
  "includeSrt": false
}

Run it from Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/youtube-transcript-scraper").call(run_input={
    "urls": [
        "https://www.youtube.com/watch?v=wsstlwuE5XY",
        "https://www.youtube.com/watch?v=v9QtM6qnG50",
        "https://www.youtube.com/watch?v=8jPQjjsBbIc",
    ],
})
for video in client.dataset(run.default_dataset_id).iterate_items():
    if video["status"] == "ok":
        print(video["videoId"], video["language"], video["wordCount"], "words:", video["transcript"][:60])
    else:
        print(video["videoId"], video["status"], video.get("missingReason") or video.get("error"))

Tested with apify-client 3.3 on October 10, 2026, in an 18-second call. It printed:

wsstlwuE5XY en 999 words: For those of us who are worried about climate change, it's n
8jPQjjsBbIc en 2232 words: A few years ago, I broke into my own house. I had just drive
v9QtM6qnG50 en 3711 words: This field behind me, by the end of the video, will be a CIT

The third is the @MrBeast video with outlined captions: 3,711 words, each line once. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

What comes back

Each record has the transcript as plain text and as timestamped segments, the language you got and whether it was the one you asked for, every track of the video (machine-dubbed ones flagged), the chapters, and the video's title, channel, date, duration, views, likes, exact comment count and thumbnail, with the channel's subscriber count. SRT and VTT files are one option away. A video without a transcript comes back as a free record that says why: no captions, none in your languages, a live stream still in progress, a private or deleted video.

Limits

  • It reads captions; it does not transcribe audio. In a sample of 150 videos from searches in 12 languages, 19% had no captions at all (silent Shorts, live streams, music). They come back as free records.
  • Automatic captions are YouTube's: punctuation is often sparse and speakers are not named.
  • Age-restricted, members-only and paid videos need an account; we do not use one, so they come back as free error records.
  • No translation: you get a video's own captions in the language you ask for, when they exist.

What it costs

$5.00 per 1,000 transcripts on every Apify plan, plus a start fee of $0.005 per GB of memory per run ($0.005 at the default memory). A video over 10 hours counts once per 10 hours started. Videos without captions, errors and duplicates are free. The three videos above cost $0.02; a channel's latest 100 videos with transcripts, $0.505.

Run it on the Apify Store

Transcripts cost $5.00 per 1,000 on every Apify plan, plus $0.005 per run at the default memory; videos without captions are free. Errors and empty results are not charged, and you can set a maximum cost per run.