YouTube Transcript Scraper - Bulk Subtitles, SRT & RAG Chunks
Pricing
Pay per event
YouTube Transcript Scraper - Bulk Subtitles, SRT & RAG Chunks
Extract YouTube transcripts in bulk from videos, playlists, channels, @handles or searches. Timestamped segments, plain text, SRT, VTT and RAG-ready chunks, in any caption language, with optional translation.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Data Mill
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
What does YouTube Transcript Scraper do?
This Actor extracts YouTube transcripts and subtitles in bulk and hands them back in whatever shape your pipeline needs: timestamped segments, plain text, SRT, WebVTT, or RAG-ready chunks with per-chunk timestamped links.
Give it anything YouTube: a video URL or ID, a youtu.be or /shorts/ link, a playlist, a channel URL or @handle, or a search like ytsearch:apache spark tutorial. Playlists, channels and searches expand into their videos automatically. Run it in the Console, call it over the API, schedule it, or let an AI agent use it through MCP.
Why this one and not the others
Most YouTube transcript Actors read the watch page and then call /api/timedtext. As of 2026 that route returns an empty body — YouTube gates it behind a session token, which is why so many transcript tools now fail intermittently. This Actor goes through YouTube's InnerTube API (what the official mobile apps use), falls back across seven clients, and runs on a residential proxy by default because YouTube refuses datacenter IPs outright. That combination is why transcripts keep arriving.
| This Actor | Typical alternative | |
|---|---|---|
| Input | Videos, playlists, channels, @handles, search | One video URL per run |
| Output | Segments, text, SRT, VTT, RAG chunks | Segments only |
| Languages | Pick priority order, see all available tracks | Whatever comes first |
| Translation | YouTube auto-translation to any language | None |
| Metadata | Title, channel, duration, views, thumbnail, tags | None |
| Failures | Per-video status, run keeps going | Run dies |
Why use YouTube Transcript Scraper?
- Feed RAG pipelines and LLMs. The
chunksformat returns overlapping passages sized for embedding models, each carryingstartSeconds,endSecondsand a deep link back to that moment in the video, so your answers can cite the exact timestamp. - Repurpose content at scale. Turn an entire channel's back catalogue into blog drafts, summaries or newsletters in one run.
- Ship subtitles. Download ready-to-use
.srtor.vttfiles, including YouTube-translated versions. - Research and analysis. Search a topic, pull every transcript, and analyse what is actually being said across creators.
- Accessibility and SEO. Publish text versions of video content that search engines can index.
How to use YouTube Transcript Scraper
- Click Try for free.
- Paste your sources into YouTube videos, playlists, channels or searches. Mix types freely — one video, a whole channel, and a search can all go in the same run.
- Set Max videos so a large channel cannot surprise you.
- Choose your Output formats. Pick
chunksif this is going into a vector database. - Click Start, then export from the Output tab as JSON, CSV, Excel or HTML.
Input
| Field | Type | Description |
|---|---|---|
videoUrls | array | Videos, IDs, playlists, channels, @handles, or ytsearch:query |
maxVideos | integer | Cap on videos processed per run |
preferredLanguages | array | Language codes in priority order, e.g. ["ja","en"] |
includeAutoGenerated | boolean | Accept YouTube's automatic captions (default on) |
translateTo | string | Have YouTube translate captions, e.g. ja |
outputFormats | array | segments, text, srt, vtt, chunks |
chunkCharacters | integer | Target chunk size for RAG (default 1200) |
chunkOverlapCharacters | integer | Overlap between chunks (default 150) |
includeMetadata | boolean | Title, channel, duration, views, thumbnail |
includeDescription | boolean | Full description and tags (off by default) |
skipVideosWithoutCaptions | boolean | Omit caption-less videos entirely |
{"videoUrls": ["https://www.youtube.com/@MrBeast", "ytsearch:apache spark tutorial"],"maxVideos": 50,"preferredLanguages": ["en"],"outputFormats": ["text", "chunks"],"chunkCharacters": 1200}
Output
One item per video. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
{"videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","status": "ok","title": "Me at the zoo","channel": "jawed","channelUrl": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A","durationSeconds": 19,"viewCount": 403777047,"language": "en","languageName": "English","isAutoGenerated": false,"availableLanguages": ["en", "de"],"wordCount": 39,"segmentCount": 6,"text": "All right, so here we are, in front of the elephants ...","transcript": [{ "startSeconds": 1.2, "durationSeconds": 4.118, "text": "All right, so here we are, in front of the elephants" }],"chunks": [{"index": 0,"startSeconds": 1.2,"endSeconds": 18.88,"text": "All right, so here we are, in front of the elephants ...","charCount": 212,"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&t=1s"}]}
Data you can extract
| Field | Description |
|---|---|
videoId, url | Video identifier and canonical link |
status | ok, no_captions, unavailable, network_error or invalid_input |
title, channel, channelId, channelUrl | Video and creator identity |
durationSeconds, viewCount, thumbnailUrl, isLive | Video metadata |
description, keywords | Full description and tags (opt-in) |
language, languageName, isAutoGenerated | Which caption track was used |
availableLanguages | Every caption language the video offers |
translatedTo, translationError | Translation target, and why it fell back if it did |
transcript[] | startSeconds, durationSeconds, text per caption line |
text | Whole transcript as one string |
srt, vtt | Ready-to-save subtitle files |
chunks[] | RAG passages with timestamps and deep links |
wordCount, characterCount, segmentCount, chunkCount | Size counters |
How much does it cost to scrape YouTube transcripts?
Pay per event, charged only when a transcript is actually returned:
| Event | Price |
|---|---|
| Transcript extracted | $0.004 |
| Actor start | $0.00005 |
Videos with no captions, private videos and invalid inputs are reported in the dataset but not charged. 1,000 transcripts cost about $4, whichever formats you request — cheaper than every comparable Actor on the Store.
One thing to leave switched on
YouTube refuses datacenter IPs with "Sign in to confirm you're not a bot", so this Actor ships with Apify residential proxy enabled by default. Leave it on. Residential traffic is billed by Apify at roughly $0.001 per transcript on top of the price above, and without it every run fails. Actors that do not use a residential proxy are the reason transcript scraping has a reputation for being flaky.
Tips
- Building a vector database? Use
outputFormats: ["chunks"]alone. You skip the duplicatetextandsegmentspayloads, and every chunk already carries the timestamp link you need for citations. - Want human-written subtitles only? Turn off
includeAutoGenerated. Videos that only have automatic captions will come back asno_captionsinstead of lower-quality text. - Multilingual channels: put several codes in
preferredLanguages(["ja","en"]) and the first available track wins.availableLanguageson every item tells you what else was there. - Large channels: raise
maxVideosand keepmaxConcurrencyat 5. If you start seeingnetwork_error, lower concurrency rather than raising it. - Translation is throttled by YouTube more aggressively than plain captions. If it is rate limited you still get the original transcript, with the reason in
translationError.
FAQ
Which videos work?
Any public video that has captions, automatic or human-written. Private, deleted, members-only and age-restricted videos return unavailable with a reason.
Does it need an API key or login? No. No YouTube Data API quota, no OAuth, no cookies.
Can it transcribe videos that have no captions?
No. This Actor extracts captions that already exist; it does not run speech-to-text. Check status: "no_captions" to find those videos.
Is scraping YouTube transcripts legal? The Actor reads publicly available caption data without bypassing any login or paywall. Web scraping of public data is generally lawful in many jurisdictions, but you are responsible for complying with YouTube's terms and the copyright of the material you process.
Something broke, or you need another field? Use the Issues tab. YouTube changes its internals regularly, and fixes usually ship within a day.
Other Actors by Data Mill
- Mercari Sold Price Scraper — verified sold prices across Mercari, Yahoo Auctions and PayPay Flea Market
- Japan Hotel Scraper — Jalan rates, ratings and plans, including ryokan the global OTAs never list
- Japan Horse Racing Scraper — JRA race cards, live odds and results with full payouts
All of them return clean English-keyed JSON and are maintained the same way.