YouTube transcript RequestBlocked: routes that work

Third-party transcript endpoints get RequestBlocked. The official captions API only works for videos you can edit. Here is the accurate split between official and hosted routes.

RequestBlocked: YouTube transcript endpoint refused the request

Short answer

YouTube transcript RequestBlocked means YouTube refused the transcript request, commonly because it blocked the requesting IP address. Use authenticated captions.download for videos you can edit; for other videos, consider the library’s documented rotating-proxy workaround or evaluate a hosted transcript service.

Diagnosis checked 2026-11-12; sources below.

Why it happens

YouTube blocks most IP addresses known to belong to cloud providers such as AWS, Google Cloud and Azure, so youtube-transcript-api raises RequestBlocked or IpBlocked when the same code that works on a laptop runs on a server. A self-hosted IP that sends too many requests can be blocked the same way. Source: youtube-transcript-api README: working around IP bans.

Do this now

  1. Fix 1, documented: Route youtube-transcript-api through a rotating proxy (the library's own documented workaround). The library's README warns that YouTube bans static proxies after extended use and recommends a rotating pool; a proxy does not guarantee you will not be blocked. Source: youtube-transcript-api README: working around IP bans.

    from youtube_transcript_api import YouTubeTranscriptApi
    from youtube_transcript_api.proxies import GenericProxyConfig
    
    ytt_api = YouTubeTranscriptApi(
        proxy_config=GenericProxyConfig(
            http_url="http://user:pass@my-custom-proxy.org:port",
            https_url="https://user:pass@my-custom-proxy.org:port",
        )
    )
    ytt_api.fetch(video_id)
  2. If the data is yours or your use fits the official terms: YouTube Data API v3 (Public API). No per-call fee is published; the constraint is the daily quota. Extra quota is not self-serve.
  3. Fix 2, hosted: For video transcripts at volume, run a hosted route instead of patching your own requests: YouTube Caption & Whisper AI Transcript Extractor. The request below runs it with its published example input through the Apify API (your token, billed at the Store price).
  4. Compare every route, with fields and prices, on the YouTube page.

Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
    "mode": "videos",
    "videoUrls": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ],
    "maxVideosPerChannel": 50,
    "maxVideosPerPlaylist": 50,
    "includeAutoGenerated": True,
    "useWhisper": True,
    "whisperModel": "tiny",
    "includeWordTimings": False,
    "proxyCountry": "GB",
    "outputFormat": "full"
}

run = client.actor("nimbryxo-studio/youtube-caption-and-whisper-ai-transcript").call(run_input=run_input)
if run is None:
    raise RuntimeError("The Actor run was not found.")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

pip install apify-client

JavaScript

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const input = {
    "mode": "videos",
    "videoUrls": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ],
    "maxVideosPerChannel": 50,
    "maxVideosPerPlaylist": 50,
    "includeAutoGenerated": true,
    "useWhisper": true,
    "whisperModel": "tiny",
    "includeWordTimings": false,
    "proxyCountry": "GB",
    "outputFormat": "full"
};

const run = await client.actor("nimbryxo-studio/youtube-caption-and-whisper-ai-transcript").call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

npm install apify-client

cURL

curl -X POST "https://api.apify.com/v2/actors/nimbryxo-studio~youtube-caption-and-whisper-ai-transcript/run-sync-get-dataset-items"   -H "Authorization: Bearer $APIFY_TOKEN"   -H "Content-Type: application/json"   -d '{"mode":"videos","videoUrls":["https://www.youtube.com/watch?v=jNQXAC9IVRw"],"maxVideosPerChannel":50,"maxVideosPerPlaylist":50,"includeAutoGenerated":true,"useWhisper":true,"whisperModel":"tiny","includeWordTimings":false,"proxyCountry":"GB","outputFormat":"full"}'

Waits for the run and returns the dataset items (runs over 300 seconds return HTTP 408; start an async run instead).

MCP (AI agents)

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=nimbryxo-studio/youtube-caption-and-whisper-ai-transcript",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Adds this Actor as a tool in an MCP client that takes a remote server URL (Cursor, VS Code, Claude Code) through Apify's hosted MCP server. OAuth sign-in also works without the header. Clients that only start local servers can wrap the URL with npx mcp-remote.

Open YouTube Caption & Whisper AI Transcript Extractor in Apify Store

Routes that work for YouTube data

The official route first, then the catalogue Actors that fit this problem (video transcripts), by their published fields. Store figures are the publisher's public numbers.

Routes for YouTube data
RouteCore fieldsPrice / 1KSuccess, 30 daysLink
Public APIYouTube Data API v3not comparedbelowOfficial docs
YouTube Caption & Whisper AI Transcript Extractor6/8$0.9992% of 26 runsOpen in Apify Store
YouTube Video Metadata & Chapter Extractor7/8$0.9916 runs, too few to rateOpen in Apify Store

Official price: No per-call fee is published; the constraint is the daily quota. Extra quota is not self-serve. Compare all 25 YouTube routes.

The facts behind the error

FactValue
Official transcript methodcaptions.download in the YouTube Data API
Permission neededThe authenticated user must have permission to edit the video
Quota cost per download200 units
Quota cost to list captions50 units
Default quota10,000 units per day across most endpoints, plus a separate 100 search.list calls per day
Why it happensYouTube blocks most cloud-provider IPs (AWS, Google Cloud, Azure); heavy traffic from one IP can be blocked too

Why deployment triggers the error

YouTube blocks most IP addresses associated with cloud providers, including AWS, Google Cloud and Azure. Heavy traffic can also get a self-hosted IP blocked, so moving outside a cloud provider does not remove the need to manage request volume.

What the library recommends

The youtube-transcript-api documentation recommends routing requests through a rotating proxy pool. It warns that static proxies can be banned after extended use, and rotating proxies can still encounter blocks. This is a library workaround, separate from the official YouTube Data API.

Choose the route by video permissions

The official captions.download method requires the authenticated user to have permission to edit the video. If you have that access, use the captions API and account for its quota costs. For videos outside your editing permissions, evaluate a hosted transcript service by its supported videos, caption availability and handling of failed requests.

When to stop fighting the error

Patching transcript parsing is pointless when YouTube refuses the request before captions reach your application. Switch to the official captions API when you can authenticate with editing permission; evaluate a hosted transcript service when maintaining proxy routing and handling recurring blocks no longer suits the job. Check the service’s video coverage and failure handling before moving your transcript requests.

Questions people ask

Why does the same transcript code work locally but fail on a server?

YouTube blocks most IP addresses known to belong to cloud providers. Your laptop and server use different outgoing IP addresses, so identical code can receive different responses.

Can the official YouTube API download captions from any video?

The authenticated user must have permission to edit the video to use captions.download. For videos outside that permission, choose a different transcript route.

Will a static proxy fix RequestBlocked?

The library documentation warns that YouTube bans static proxies after extended use. It recommends a rotating pool, although requests through that pool can still be blocked.

Can a self-hosted connection also be blocked?

Yes, heavy traffic from a self-hosted IP can trigger a block too. Moving the application to another server is useful only if the outgoing connection and request pattern address the cause.

Sources

Every dated claim on this page comes from the public sources below. Check the source before you make a business decision on it.

Content updated 2026-11-12Data checked 2026-11-12

Get YouTube data with a catalogue Actor

YouTube Search Results & Entity Type Scraper returns 7 of 8 core YouTube fields at $0.99 per 1,000 results. Compare all 25 YouTube routes.

Open in Apify Store