YouTube Transcript Scraper & Bulk Downloader icon

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 rotationcurl-cffi impersonates 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-After header 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.

FieldTypeRequiredWhat 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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result emitted$0.0040Per 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 proxyConfiguration with residential routing and keep concurrency at 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?
The OSS library is great for one-off scripts. This Actor wraps equivalent logic inside Apify's cloud infrastructure, adding proxy rotation, retries, concurrency control, structured output, and the ability to schedule recurring runs — no server required. Use the library for local experiments; use this Actor when you need youtube transcript bulk download at scale without managing infrastructure.
Does it work for `youtube transcript api` access programmatically?
Yes. Every run's dataset is accessible via the Apify REST API. You can trigger runs, poll for completion, and pull results as JSON in one API call. See Apify's documentation for the full reference.
Can I download YouTube subtitles in languages other than English?
Yes. Set 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?
Auto-generated tracks are fully supported and labelled clearly via the 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?
The Actor logs the video ID and skips it. We do not synthesise or transcribe audio — that's a different (much more expensive) problem.
Can I use this for a `youtube transcript for rag` pipeline?
Exactly the use case we built for. The 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?
If YouTube returns a consent interstitial or a 429 on the watch page during metadata fetch, we still deliver the transcript but leave page-scraped fields null. The transcript itself is retrieved from a separate endpoint and succeeds independently.

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.

Related Actors

Teams that run this also run