YouTube Transcript & Subtitle Scraper API — Captions + Metadata
Pricing
from $8.00 / 1,000 transcripts
YouTube Transcript & Subtitle Scraper API — Captions + Metadata
Extract YouTube transcripts, subtitles, and captions with timestamps plus video metadata (title, channel, views, duration). For RAG, analysis, and content workflows. No official API key needed.
Pricing
from $8.00 / 1,000 transcripts
Rating
0.0
(0)
Developer
bootforge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Transcript Scraper — Captions, Subtitles & Metadata
YouTube Transcript Scraper is an Apify actor that extracts the full transcript (captions/subtitles) — with per-line timestamps — from any public YouTube video, plus the video's metadata (title, channel, view count, duration, publish date, description, thumbnail) and every caption language available for it. No official API key required.
Use it to feed transcripts into a RAG pipeline or LLM summarizer, build searchable video archives, generate subtitles/blog posts from spoken content, monitor a channel's talking points, or bulk-export captions for research — exported to JSON, CSV, or Excel.
Table of contents
- What the YouTube Transcript Scraper does
- How to scrape YouTube transcripts
- YouTube Transcript Scraper input
- What data you get
- Pricing
- Recommended proxies
- Why this YouTube Transcript Scraper
- FAQ
- Rate this actor
- Related actors
What the YouTube Transcript Scraper does
- 📝 Full transcript with timestamps — every caption line as
{text, start, duration}, plus atranscript_textstring (one caption per line) ready for an LLM prompt. - 🌐 Language selection — pick a caption language code (
en,es,ja, …) and prefer human-made captions over auto-generated ones when both exist. - 🎬 Video metadata included — title, channel name/ID, duration, publish date, view count, description, and thumbnail URL, in the same row as the transcript.
- 🗣️ Available-languages list — every caption track YouTube offers for the video (code, name, human vs. auto-generated), so you know what else you could pull.
- ⚡ HTTP-only, no anti-bot browser tier — no login, no CAPTCHA solving; the actor replicates the same InnerTube requests the YouTube web/app player itself makes.
How to scrape YouTube transcripts
- Click Try for free and open the actor.
- Add one or more
video_urls— full watch URLs,youtu.belinks, Shorts/embed links, or bare 11-character video IDs, in any mix. - Optionally set
language(e.g.en) — leave empty to use the video's default caption track. - Toggle
prefer_manual(default on) to prefer human-made captions over auto-generated ones when a video has both for your chosen language. - Click Start and watch rows stream into the dataset — one row per video.
- Export as JSON, CSV, or Excel, or pull from the Apify API.
Single video, default (English track if present, human captions preferred):
{"video_urls": ["dQw4w9WgXcQ"]}
Multiple videos, explicit language:
{"video_urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/9bZkp7q19f0"],"language": "en"}
Prefer auto-generated captions over manual ones, capped to 5 videos this run:
{"video_urls": ["dQw4w9WgXcQ", "9bZkp7q19f0", "kJQP7kiw5Fk"],"prefer_manual": false,"max_records": 5}
YouTube Transcript Scraper input
| Field | Type | Default | Description |
|---|---|---|---|
video_urls | string[] | — | YouTube video URLs or 11-character IDs. Accepts watch?v=…, youtu.be/…, /shorts/…, /embed/…, or a bare ID. Required — at least one valid video. |
language | string | "" (video default) | Preferred caption language code, e.g. en, es, ja. |
prefer_manual | boolean | true | When both human and auto-generated captions exist for the chosen language, pick the human ones. |
max_records | integer | — | Cap the number of videos processed this run. |
proxy | object | — | Apify Proxy configuration. Residential recommended at volume — see Recommended proxies. |
What data you get
One row per requested video. Sample from a real local run (dQw4w9WgXcQ, trimmed for length):
{"video_id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","scraped_at": "2026-07-18T09:03:17.597050+00:00","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw","channel_name": "Rick Astley","duration_seconds": 213,"published_at": "2009-10-24T23:57:33-07:00","view_count": 1793953812,"description": "The official video for “Never Gonna Give You Up” by Rick Astley. ...","thumbnail_url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/sddefault.webp","language": "en","is_generated": false,"transcript_text": "[♪♪♪]\n♪ We're no strangers to love ♪\n♪ You know the rules and so do I ♪\n...","transcript_segments": "[{\"text\": \"[♪♪♪]\", \"start\": 1.36, \"duration\": 1.68}, {\"text\": \"♪ We're no strangers to love ♪\", \"start\": 18.64, \"duration\": 3.24}, ...]","available_languages": "[{\"code\": \"en\", \"name\": \"English\", \"is_generated\": false}, {\"code\": \"en\", \"name\": \"English (auto-generated)\", \"is_generated\": true}, {\"code\": \"de-DE\", \"name\": \"German (Germany)\", \"is_generated\": false}, {\"code\": \"ja\", \"name\": \"Japanese\", \"is_generated\": false}, {\"code\": \"pt-BR\", \"name\": \"Portuguese (Brazil)\", \"is_generated\": false}, {\"code\": \"es-419\", \"name\": \"Spanish (Latin America)\", \"is_generated\": false}]","error": null}
| Field | Description |
|---|---|
video_id / url | The normalized 11-character video ID and its canonical watch URL. |
title / channel_id / channel_name | Video title and uploading channel's ID/name. |
duration_seconds / published_at / view_count | Video length, publish timestamp, and view count at scrape time. |
description / thumbnail_url | Full video description and a thumbnail image URL. |
language / is_generated | The caption track actually delivered — its language code and whether it's auto-generated (true) or human-made (false). Note: transcript_text is machine-generated when is_generated is true — expect the usual auto-caption quirks (missing punctuation, mis-heard words). |
transcript_text | The full transcript as one string, one caption per line (newline-separated) — ready to paste into an LLM prompt. |
transcript_segments | JSON array of {text, start, duration} per caption line, for timestamp-accurate use (e.g. jump-to-timestamp links, subtitle files). |
available_languages | JSON array of every caption track YouTube offers for the video (code, name, is_generated), whether or not you requested it. |
error | null on success; otherwise a reason the row has no transcript (blocked fetch, no captions, no track for the requested language, etc.) — the row is still delivered, just unbilled (see Pricing). |
scraped_at | Capture timestamp (UTC ISO 8601). |
Pricing
This actor uses pay-per-event pricing — you pay for delivered transcripts, not for time. Pricing below is provisional until Console monetization is finalized (see the Monetization tab for current live pricing).
| Event | USD | Per 1,000 |
|---|---|---|
| Actor start (per run) | $0.001 | — |
Transcript scraped (transcript) | $0.008 | $8 |
| Typical run | Cost |
|---|---|
| 1 video | ~$0.009 |
| 10 videos | ~$0.081 |
| 100 videos | ~$0.801 |
A "transcript" event is charged only for a video that actually yields a transcript. Videos that fail (blocked, no captions available, no track for the requested language) are still delivered as rows — flagged via error — but are never charged.
Recommended proxies
YouTube rate-limits and can throttle datacenter IPs once you scrape at volume. Apify Proxy (residential) works out of the box under Proxy configuration in the input.
If you run your own scrapers (inside or outside Apify) and need reliable residential proxies for scale, we use DataImpulse — pay-as-you-go IPs with per-country targeting and no monthly minimum — recommended for your own scrapers too:
👉 Get DataImpulse proxies (referral link)
Why this YouTube Transcript Scraper
- Transcript + metadata + language list in one call — no chaining a separate metadata scraper and a separate captions tool.
- No anti-bot browser tax — HTTP-only, no browser, no CAPTCHA solving, so runs are fast and cheap as long as requests stay unblocked.
- No official API key needed — the actor replicates the same InnerTube requests the YouTube web/app player itself makes; there's no public "get me a transcript" API to authenticate against.
- Validated output — every row is Pydantic-validated before it's pushed; failed videos are flagged via
error, never silently dropped or shipped with garbage fields. - Only successful transcripts are billed — a blocked or caption-less video still shows up in your dataset, but you don't pay for it.
- Open source — the underlying
youtube-transcript-scraperPython package ships a Typer CLI and a FastAPI server; the Apify wrapper is a thin layer.
FAQ
Is this the official YouTube API? No — YouTube/Google do not offer a public API for fetching caption text. This actor calls the same InnerTube endpoints (/youtubei/v1/player, /api/timedtext) that the youtube.com web player and YouTube apps call when a human plays the video and captions render.
Do I need a proxy? Not for occasional single-video use. At volume, YouTube can start throttling or blocking a shared datacenter IP — a residential proxy (Apify Proxy or your own, see Recommended proxies) keeps larger runs reliable.
Why did some videos come back with no transcript? Common reasons, all surfaced in the error field: the video has no captions at all, no track exists for your requested language, or the request was rate-limited/blocked (retry, or add a proxy).
Can I get auto-generated captions specifically? Yes — set prefer_manual to false. If a video has no human captions at all, auto-generated ones are used regardless of this setting whenever they're the only track available.
What is transcript_segments for? It's the same transcript as transcript_text, but split into {text, start, duration} objects with second-accurate timestamps — useful for jump-to-timestamp links, building .srt/.vtt subtitle files, or aligning quotes to video time.
Is scraping YouTube transcripts legal? This actor collects only publicly available caption text and metadata that YouTube itself displays to any viewer — no private data, no login required. You are responsible for complying with YouTube's Terms of Service and applicable law for your use case (e.g. attribution, fair use, copyright of the underlying spoken content).
Rate this actor ⭐
If the YouTube Transcript Scraper saved you time, please leave a review on its Apify Store page — ratings help other people find it and tell us what to build next. Hit a bug or missing field? Open an issue or contact us through the actor's Issues tab and we'll fix it fast — recency and reliability are what keep this actor ranking.
Related actors
Building a content-intelligence or research pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.
- Google Trends Scraper — check whether a video's topic is trending before or after you summarize it.
- levels.fyi Salary Scraper — another HTTP-only, no-anti-bot actor if you're assembling a lightweight-scrape toolkit.
- Google Play App Search & Reviews Scraper — pair video content with real-world app reviews for market research.