Video · AI & LLM data
YouTube Transcript Scraper & Bulk Downloader
Bulk-extract YouTube transcripts — manual or auto-generated captions, any language — as plain text plus optional timed cue segments. Works on videos, Shorts and youtu.be links, with no API key.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
YouTube ships closed captions for most videos. This Actor takes a list of video URLs or bare IDs, picks the best available caption track in the language you specify, downloads every cue, and writes one clean row per video. You get the full joined transcript text plus — if you want them — the per-cue segments with start time and duration. Channel name, video title, duration, and the full list of available languages all land in the same row.
We handle the parts that make bulk transcript extraction fragile at scale: rate-limit pushback, endpoint parameter drift, and residential proxy rotation so YouTube sees a real browser session rather than a Python script hitting its timedtext endpoint in a tight loop.
What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not a Python script. - 🌐 Residential proxy rotation via Apify Proxy — fresh session ID and exit IP on every block or rate-limit response.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per video,Retry-Afterheader honoured. - 🧱 Rate-limit-aware pacing — when YouTube pushes back we slow down rather than accumulate bans across the run.
- 🧊 Clean, typed dataset rows — Pydantic-validated output, ISO-8601 timestamps, stable IDs. Export as JSON, CSV, or Excel straight from Apify Console.
- 💰 Pay-Per-Event pricing — you pay only for rows that land in your dataset. No data, no charge beyond the small run warm-up fee.
Use cases
- RAG corpus seeding — bulk-download transcripts for a playlist of conference talks, lectures, or podcast episodes and feed them straight into a vector store or LLM context window.
- YouTube transcript bulk download for NLP — export hundreds of transcripts at once for sentiment analysis, topic modelling, or fine-tuning data prep.
- Podcast show-notes automation — feed each new YouTube-hosted episode through this Actor and into an LLM to generate Markdown show notes automatically.
- Download YouTube subtitles for language learning — pull caption tracks in the target language across a playlist for comprehension practice or graded reading corpora.
- YouTube subtitles dataset construction — build a reproducible, version-controlled transcript dataset for ML benchmarking, search indexing, or attribution research.
- YouTube transcript for RAG pipelines — drop transcripts directly into LangChain, LlamaIndex, or any retrieval-augmented generation stack without preprocessing.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
videoUrls | array | yes | List of YouTube video URLs or bare video IDs. Shorts and youtu.be links are accepted. |
language | string | no | ISO-639-1 language code. Tracks are picked in this order: manual language → auto language → manual any → auto any. |
includeSegments | boolean | no | When true, the `segments` array includes one entry per cue (text + start + duration). Always emits the joined `transcript_text`. |
concurrency | integer | no | Parallel videos to process. |
{
"videoUrls": [
"dQw4w9WgXcQ",
"https://www.youtube.com/watch?v=9bZkp7q19f0"
],
"language": "en",
"includeSegments": false,
"concurrency": 3,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
video_idtitlechannel_namelanguagetranscript_textsegmentsduration_secondsavailable_languages
{
"video_id": "dQw4w9WgXcQ",
"video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Music Video)",
"channel_name": "Rick Astley",
"channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw",
"duration_seconds": 213,
"language": "en",
"is_auto_generated": false,
"transcript_text": "We're no strangers to love\nYou know the rules and so do I\n...",
"segments": null,
"available_languages": [
"en",
"es",
"fr",
"de"
],
"scraped_at": "2026-06-01T10:32:14Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0040 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Captions disabled by uploader — some creators turn off captions entirely. Those videos return no transcript row; the Actor logs the skip and moves on.
- Rate-limiting on large batches — YouTube pushes back on high-concurrency runs from shared datacenter IPs. Use
proxyConfigurationwith residential routing and keepconcurrencyat 3–5 for lists of 500+ videos. - Live streams — live captions are usually unavailable until the broadcast ends and the VOD is processed. Re-run after the stream concludes.
- Age-gated / sign-in-required videos — this Actor does not accept YouTube credentials and cannot retrieve captions from age-restricted content.
- Parameter drift — YouTube occasionally rotates its internal timedtext endpoint parameters. When this happens existing runs may return empty transcripts for affected videos. We monitor for this and ship a fix within 48 hours. Check the Actor's CHANGELOG for the latest version.
FAQ
What's the difference between this and the `youtube-transcript-api` Python library?
youtube transcript bulk download at scale without managing infrastructure.Does it work for `youtube transcript api` access programmatically?
Can I download YouTube subtitles in languages other than English?
language to any ISO-639-1 code (e.g. "es" for Spanish, "ja" for Japanese, "de" for German). The Actor will select the best matching track and fall back gracefully if the exact language is unavailable. The available_languages field in every output row lists what was actually on the video.What about `youtube closed captions extract` for auto-generated tracks?
is_auto_generated field. Auto tracks are used as a fallback when no manual caption upload exists. Quality varies by video; auto-generated tracks on professionally produced content tend to be accurate.What if no captions exist at all?
Can I use this for a `youtube transcript for rag` pipeline?
transcript_text field is clean joined text ready for chunking. The segments array gives you cue-level timestamps if you want to preserve position information for citation or retrieval. Both fields export as-is into JSON; just point your LangChain Document or LlamaIndex Node constructor at the dataset.Why is `title` or `channel_name` empty?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Read more
Articles about this Actor
Related Actors