Bulk YouTube Transcript Scraper avatar

Bulk YouTube Transcript Scraper

Pricing

Pay per usage

Go to Apify Store
Bulk YouTube Transcript Scraper

Bulk YouTube Transcript Scraper

Transcripts for hundreds of YouTube videos in one run, not one run per video. Free. Every video returns a row: successes carry the text, failures carry a reason code you can act on. Segments, plain text, SRT and VTT.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Asif Ali

Asif Ali

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Hundreds of videos in one run. Free.

Most YouTube transcript tools take one video per run. Fine if you want one video. Painful if you have a playlist, a channel backlog, or a research corpus — that's one run per video, every time, and you pay per run.

Paste your whole list. Get one dataset back.

500 videos → 1 run → 1 dataset

What you get for every video

A row. Always. That sounds obvious until you've used a scraper that silently returns 430 rows for 500 inputs and leaves you to work out which 70 are missing and why.

Successful rows carry the transcript. Failed rows carry a stable error code:

CodeWhat it meansWorth retrying?
CAPTIONS_DISABLEDThe uploader turned captions offNo — never will work
NO_TRANSCRIPT_IN_LANGUAGENo track in the languages you asked forNo
VIDEO_UNAVAILABLEPrivate, deleted, or an invalid idNo
AGE_RESTRICTEDRequires a signed-in accountNo
IP_BLOCKEDYouTube throttled usYes — retry later

Four of those are facts about the video that no tool on earth can fix. One is temporary. Knowing which is which is the difference between a pipeline you can automate and a mystery you have to babysit.

Output formats

Pick any combination — segments, text, srt, vtt.

{
"videoId": "dQw4w9WgXcQ",
"success": true,
"languageCode": "en",
"isAutoGenerated": false,
"segmentCount": 61,
"durationSeconds": 211.32,
"characterCount": 2089,
"text": "...",
"segments": [{ "start": 0.0, "duration": 2.5, "text": "..." }]
}

Subtitle files come out ready to use — SRT for editors, VTT for the web. Plain text is single-line and clean, ready to drop into a RAG index or an LLM prompt without further tidying.

Watch URLs, youtu.be share links, embeds, Shorts, live URLs and bare 11-character video ids. In a list, or pasted as a block of text, one per line. Mixed formats are fine. Duplicates are removed automatically, across both fields.

Options worth knowing:

  • languages — ordered preference, e.g. ["en","es"]. Asking for es matches a native es-419 track instead of paying for a machine translation.
  • allowAutoGenerated — human-written captions are always preferred over machine ones. Set false to reject auto-generated captions entirely, which matters if you're quoting rather than summarising.
  • allowTranslated — off by default, deliberately. YouTube blocks its translation endpoint far harder than plain caption fetches, so switching this on lowers your success rate.
  • concurrency — 1 to 20. Faster, but trips YouTube's rate limit sooner.

Built to be cheap to run

YouTube's client key is cached rather than refetched for every video, cutting transfer from roughly 1.5 MB to 0.2 MB per video after the first. On a 1,000-video run that's over a gigabyte of proxy traffic you don't pay for — and it halves the requests per video, so you hit YouTube's rate limit far later.

Honest limits

YouTube rate-limits caption downloads per IP and answers HTTP 429 after roughly twenty fetches from one address. This Actor rotates its proxy session on every 429 and retries up to four times per video.

Measured success rate on Apify datacenter proxies: 75–88%. Residential proxies should take that close to 99%. IP_BLOCKED rows are not broken videos — re-run just those ids and they usually come back.

Use a proxy. It's on by default. Without one, expect failures past about twenty videos.