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

Sort the error before you fix it. Network errors (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.

01

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:

ErrorWhat it is aboutRetry?
IpBlockedNetworkLater, slower, or from another network
RequestBlockedNetworkLater, slower, or from another network
YouTubeRequestFailedNetworkRead the status code first
YouTubeDataUnparsableNetworkOnce, later
FailedToCreateConsentCookieNetworkFrom another region
TranscriptsDisabledNothing to fetchNo
VideoUnavailableNothing to fetchNo
VideoUnplayableNothing to fetchOnly after a live stream ends
AgeRestrictedNothing to fetchNo
NoTranscriptFoundYour requestNo, change the language
InvalidVideoIdYour requestNo, pass the ID, not the URL
NotTranslatableYour requestNo
TranslationLanguageNotAvailableYour requestNo, pick a listed language
PoTokenRequiredRareNo, check the library issues
02

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

These are single-network observations, not a benchmark. From one home connection the library hit the bot check after a few dozen requests in under an hour, while yt-dlp fetched subtitles from the same address a few minutes later. A GitHub-hosted runner, which uses a cloud address, got 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.
03

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 prints This video is unavailable for 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 prints Sign in to confirm your age and 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.

04

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 call list(video_id) and pick.
  • InvalidVideoId: you passed a URL. The library wants the 11-character ID, so call fetch("jNQXAC9IVRw"), not fetch("https://...").
  • NotTranslatable and TranslationLanguageNotAvailable: 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. Check is_translatable and translation_languages first.
05

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.

06

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.

07

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

Q01

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.

Q02

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.

Q03

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.

Q04

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.

Q05

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