YouTube Subtitles Scraper
Pricing
$1.99 / 1,000 results
YouTube Subtitles Scraper
YouTube transcript extractor — get YouTube captions and transcript text from URLs or IDs. Bulk extract YouTube transcript data for NLP, with optional per-cue rows. Public captions only.
Pricing
$1.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrape Mamba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
YouTube Subtitles Scraper — Transcripts & Captions at Scale
Extract YouTube captions and transcript text from watch URLs or video IDs. Get tracks, timed cues, availability flags, and a joined text preview into an Apify Dataset — built for NLP, search indexes, and compliance archives, not one-off “copy transcript” clicks.
Run YouTube Subtitles Scraper on Apify · Built by ScrapeMamba · Public captions only · Not a media downloader
Why this Actor?
Phone “Show transcript” works for one video. Catalogs, warehouses, and weekly jobs need batch automation: many IDs, exportable JSON/CSV, and schedules. This Actor is the suite’s YouTube transcript extractor — same videoId keys as Video, Search, and Related scrapers.
- Batch
videoIdsin one run - Preferred caption
lang(defaulten) - Optional
expandCuesfor one Dataset row per cue textpreview truncated to 2000 characters; full cues stay on the subtitles row- Clear signals when tracks exist but timed cues are withheld (
cuesError)
Key features
- Bulk YouTube transcript / caption extraction
- Tracks metadata + timed cues when available
- Optional flat cue rows for warehouses that prefer timestamp tables
- Per-video error isolation
- Fits after Search / Video / Related shortlisting
What you can scrape
Subtitles row (type: "subtitles")
| Group | Fields |
|---|---|
| Identity | videoId, lang |
| Availability | isAvailable, source, trackCount, cueCount |
| Content | tracks, cues, text (preview ≤ 2000 chars) |
| Diagnostics | cuesError / related flags, raw, error |
Cue row (type: "cue", when expandCues: true)
videoId, id, start, duration, text, language, languageCode
Use cases
- NLP / topic models — Speech text beside video metadata
- Content research — Quote mining and theme extraction
- Compliance archives — Periodic public caption snapshots
- Search indexes — Index spoken content for internal discovery
- Accessibility audits — Check which catalog IDs expose captions
Example output
{"type": "subtitles","videoId": "dQw4w9WgXcQ","lang": "en","isAvailable": true,"source": "youtube","trackCount": 1,"cueCount": 180,"text": "We're no strangers to love…","tracks": [{ "languageCode": "en", "name": "English" }],"cues": [{ "start": 0.0, "duration": 3.5, "text": "We're no strangers to love" }]}
With expandCues: true, each cue also becomes its own Dataset row (type: "cue").
How to use
- Open YouTube Subtitles Scraper
- Pass one known-captioned public video; keep
expandCues: falsefor the first run - Scale the
videoIdslist once the schema looks right
Input example
{"videoIds": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"lang": "en","expandCues": false}
API (Node.js)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('scrapemamba/youtube-subtitles-scraper').call({videoIds: ['dQw4w9WgXcQ'],lang: 'en',expandCues: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Local run
cd youtube-subtitles-scraper-jscp .env.example .envnpm installnode src/main.js
Input parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
videoIds | Yes | — | Watch URLs, Shorts, youtu.be, embeds, or 11-character IDs. Free users limited to 200 videos per run; paying users uncapped. |
lang | No | "en" | Preferred caption language code |
expandCues | No | false | If true, also push one Dataset row per cue (multiplies billable rows) |
Output
Default runs produce one type: "subtitles" row per video. expandCues: true adds type: "cue" rows. API failures become type: "error" while other videos continue.
The Actor cannot invent captions when none are exposed. Auto-generated and human tracks both count when YouTube provides them.
Why choose this Actor
- Public captions only — Clear availability flags;
cuesErrorwhen tracks exist without timed cues - Flexible storage — Keep cues as JSON on the parent row, or expand to flat rows
- Suite join keys — Same
videoIdas Video / Search / Related - Batch transcript automation — Built for catalogs, not phone copy-paste
Pricing
$1.99 per 1,000 results on Apify. Cue expansion multiplies rows. Free users: first 200 videos per run. See the Store page.
FAQ
How do I get YouTube transcripts in bulk?
Pass many URLs/IDs, set lang, keep expandCues: false unless you need cue rows, run on Apify, export the Dataset.
What if captions are off?
If no track (including auto-generated) exists, the Actor will not invent speech — expect empty availability or an error.
What does cuesError mean?
Tracks were found, but timed cues were not returned. Inspect raw; try another language or retry. Different from “captions fully off.”
Auto vs human captions?
Both are returned when available. Quality varies; the Actor does not guarantee a human track.
Do Shorts work?
Yes, if you pass Shorts URLs/IDs and captions exist.
How many videos can I process in one run?
Free users are limited to the first 200 videos per run; paying users are uncapped.
Should I store cues as JSON or rows?
JSON on the subtitles row is usually cheaper. Use expandCues when your warehouse prefers flat timestamp tables.
Related Actors
| Actor | Use it for |
|---|---|
| YouTube Video Scraper | Metadata beside captions |
| YouTube Search Scraper | Find videos to caption |
| YouTube Related Videos Scraper | Expand a neighborhood before selective captioning |
| YouTube Channel Videos Scraper | Shortlist uploads to caption |
Use only on public caption data per YouTube’s terms, copyright/privacy law, and your policies. Do not bypass disabled captions or access private videos.