Bulk YouTube Transcript Scraper
Pricing
Pay per usage
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
Maintained by CommunityActor 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:
| Code | What it means | Worth retrying? |
|---|---|---|
CAPTIONS_DISABLED | The uploader turned captions off | No — never will work |
NO_TRANSCRIPT_IN_LANGUAGE | No track in the languages you asked for | No |
VIDEO_UNAVAILABLE | Private, deleted, or an invalid id | No |
AGE_RESTRICTED | Requires a signed-in account | No |
IP_BLOCKED | YouTube throttled us | Yes — 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.
Input — paste links however you have them
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 foresmatches a nativees-419track instead of paying for a machine translation.allowAutoGenerated— human-written captions are always preferred over machine ones. Setfalseto 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.