YouTube Transcript Errors Explained: IpBlocked, RequestBlocked, TranscriptsDisabled and the Rest
What every youtube-transcript-api error means, what triggers it, which ones are worth retrying, and what yt-dlp prints for the same videos. Checked against version 1.2.4.
00:09:00 · OCT 17, 2026
Quick answer
RequestBlocked, IpBlocked) say something about where your code runs, and are the only ones worth retrying. Errors about the video (captions off, unavailable, age-restricted) and about your request (wrong language, URL instead of ID) give the same answer every time, so retrying them only gets you blocked sooner.Checked against youtube-transcript-api 1.2.4 on 17 October 2026. We make GetYouTubeTranscript, a hosted option mentioned at the end. Everything before that is about the free tools, and each error has a longer page with a reproducible example in the open reference repository.
Quick reference
The library defines 17 error classes. Fourteen can be raised, and the three cookie classes (CookieError, CookieInvalid, CookiePathInvalid) are never raised anywhere in version 1.2.4. The fourteen:
| Error | What it is about | Retry? |
|---|---|---|
IpBlocked | Network | Later, slower, or from another network |
RequestBlocked | Network | Later, slower, or from another network |
YouTubeRequestFailed | Network | Read the status code first |
YouTubeDataUnparsable | Network | Once, later |
FailedToCreateConsentCookie | Network | From another region |
TranscriptsDisabled | Nothing to fetch | No |
VideoUnavailable | Nothing to fetch | No |
VideoUnplayable | Nothing to fetch | Only after a live stream ends |
AgeRestricted | Nothing to fetch | No |
NoTranscriptFound | Your request | No, change the language |
InvalidVideoId | Your request | No, pass the ID, not the URL |
NotTranslatable | Your request | No |
TranslationLanguageNotAvailable | Your request | No, pick a listed language |
PoTokenRequired | Rare | No, check the library issues |
Network errors: YouTube never gave a real answer
These come from the library's source as follows. IpBlocked is raised when YouTube answers with HTTP 429, or returns a page containing a reCAPTCHA form. RequestBlocked is raised when YouTube asks for a sign-in because it suspects a bot. YouTubeRequestFailed covers any other HTTP error status, such as a 403 or a 5xx. YouTubeDataUnparsable means the page was fetched but did not contain what the library looks for, and was not the reCAPTCHA page. FailedToCreateConsentCookie means YouTube showed its cookie consent page and the library could not get past it, which can happen in some regions.
The library's own message for the first two lists the usual causes: too many requests from one IP, or requests coming from a cloud provider such as AWS, Google Cloud or Azure.
What we saw on 17 October 2026
RequestBlocked on its very first request. The block on the home address lifted after roughly 25 minutes and returned soon after requests resumed at about ten a minute.What helps, roughly from least to most effort:
- Back off. Wait, then retry slowly, with a cap. Do not loop.
- Cache what you fetch so each video is requested once.
- Run from a different network. A home or office connection is treated differently from a server.
- Send the requests through a proxy provider. The library supports proxy configuration, and its documentation recommends rotating residential proxies for IP bans.
The video has nothing to fetch
TranscriptsDisabled: the video data has no caption tracks at all. If "Show transcript" is missing in a browser too, there is nothing for any tool to fetch, and your only route to text is speech-to-text on the audio.VideoUnavailable: YouTube says the video is unavailable. It was removed, made private, blocked in a region, or the ID is wrong. yt-dlp printsThis video is unavailablefor the same ID.VideoUnplayable: YouTube will not play it, with its own reason. Live streams that are not archived and premieres that have not started are the common cases. Wait for the stream to end.AgeRestricted: YouTube only serves the video to signed-in users. yt-dlp printsSign in to confirm your ageand points to its cookie options. Automated use of an account can be restricted by YouTube, so treat these videos as unavailable unless you have a good reason not to.
Record these as normal answers and move on. A retry cannot change the result.
You asked for the wrong thing
NoTranscriptFound: none of the language codes you passed exist on the video. The error text lists what does. Pass several codes in order of preference, or calllist(video_id)and pick.InvalidVideoId: you passed a URL. The library wants the 11-character ID, so callfetch("jNQXAC9IVRw"), notfetch("https://...").NotTranslatableandTranslationLanguageNotAvailable: you asked for a machine translation that does not exist. Some tracks offer no translation languages at all (the first video ever uploaded to YouTube is one), and others offer a list, such as 18 languages on a popular math channel's video. Checkis_translatableandtranslation_languagesfirst.
Rare and legacy
PoTokenRequired appears when a caption track URL asks for a proof-of-origin token the library does not produce. Users report it for some videos, and the library asks you to open an issue, so check its tracker for the current state. The three cookie errors are left over from the 0.x versions, when cookies could be used to sign in. They are defined but never raised in 1.2.4, so code that catches them does nothing.
Handle them in code
One small function that turns an exception into a decision keeps retry logic in one place. This one was run against every error class listed above:
from youtube_transcript_api import (
AgeRestricted,
InvalidVideoId,
NoTranscriptFound,
NotTranslatable,
RequestBlocked, # IpBlocked is a subclass, so this catches both
TranscriptsDisabled,
TranslationLanguageNotAvailable,
VideoUnavailable,
VideoUnplayable,
)
def classify(exc: Exception) -> str:
if isinstance(exc, RequestBlocked):
return "blocked" # about your network: back off, change network, do not loop
if isinstance(exc, (TranscriptsDisabled, VideoUnavailable, VideoUnplayable, AgeRestricted)):
return "nothing_to_fetch" # record it and move on
if isinstance(exc, (NoTranscriptFound, InvalidVideoId, NotTranslatable, TranslationLanguageNotAvailable)):
return "bad_request" # fix the language code or the video ID
return "other" # read the message: YouTubeRequestFailed, PoTokenRequired, ...Retry only blocked, with exponential back-off and a limit. Log the rest and continue.
If you would rather not own the blocking problem
Everything above works with free tools, and for a handful of videos from your own machine you probably need nothing else. The network errors are what hurt once code runs on a server. At that point you can run proxies yourself, or call a hosted transcript service so the blocked address is not yours. Several exist, including Supadata, TranscriptAPI, youtube-transcript.io and ours, GetYouTubeTranscript. We compare them without ranking in the transcript tools roundup and list our own error codes in the API troubleshooting checklist.
If we got anything here wrong, or a tool's maintainers see it differently, tell us in the repository and we will correct it.
Frequently asked questions
What does RequestBlocked mean in youtube-transcript-api?
YouTube answered with a sign-in wall that says it suspects automated traffic, so the library could not read the video at all. It is about the network the request came from, not the video. IpBlocked is a more specific version of the same thing and is a subclass, so catching RequestBlocked catches both.
Why do I get TranscriptsDisabled when the video seems to have captions?
The library raises it when the video data it received contains no caption track list. If you can see "Show transcript" in a browser but the library disagrees, try again later or from another network and compare with another tool. We saw one video where the library and yt-dlp disagreed about whether it was available at all.
Is an IP block permanent?
Not in what we saw. On one home connection a block lifted after roughly 25 minutes, then returned soon after requests resumed at about ten a minute. That is one observation on one network, not a rule. Back off and slow down instead of looping.
Which youtube-transcript-api errors should I retry?
Only the network ones (RequestBlocked and IpBlocked), and only with a back-off and a cap. Errors about the video (captions disabled, unavailable, age-restricted) and about your request (wrong language, URL instead of ID) will give the same answer every time.
How do I fix NoTranscriptFound?
The video has captions, just not in the language you asked for. The error text lists what is available. Pass several codes in order of preference, for example languages=["de", "en"], or call list(video_id) and choose from the result.
Related
- We Read 191 Starter Story Founder Interviews. Here Is What Actually Got Them Customers
- How to Get the Transcript of a YouTube Video (Computer, Phone, and Download)
- n8n YouTube Transcript Failing on Your Server? Why YouTube Blocks It and How to Fix It
- YouTube API Quota Exceeded: Causes and Fixes
- YouTube Transcript API Rate Limit: What It Is and How to Handle 429s
- YouTube Transcript MCP Server: Setup Guide for Claude and Other AI Tools
- YouTube Transcripts in n8n: HTTP Request Workflow Guide
- Migrating from Supadata: A Field Guide
- How to Get YouTube Transcripts in Python
- Migrating from TranscriptAPI.com: A Field Guide
- Build an AI YouTube Video Summarizer with LangChain and Next.js
- How to Build a RAG Pipeline with YouTube Transcripts
- The Best YouTube Transcript APIs in 2026
- GetYouTubeTranscript vs TranscriptAPI
- GetYouTubeTranscript vs youtubetotranscript.com
- GetYouTubeTranscript vs youtube-transcript.io
- GetYouTubeTranscript vs NoteGPT
- GetYouTubeTranscript vs Tactiq
- GetYouTubeTranscript vs Glasp
- GetYouTubeTranscript vs Eightify
- GetYouTubeTranscript vs Supadata
- GetYouTubeTranscript vs DownSub
- GetYouTubeTranscript vs youtubetranscript.dev