YouTube Subtitles Scraper avatar

YouTube Subtitles Scraper

Pricing

$1.99 / 1,000 results

Go to Apify Store
YouTube Subtitles Scraper

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

Scrape Mamba

Maintained by Community

Actor 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 videoIds in one run
  • Preferred caption lang (default en)
  • Optional expandCues for one Dataset row per cue
  • text preview 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")

GroupFields
IdentityvideoId, lang
AvailabilityisAvailable, source, trackCount, cueCount
Contenttracks, cues, text (preview ≤ 2000 chars)
DiagnosticscuesError / 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

  1. Open YouTube Subtitles Scraper
  2. Pass one known-captioned public video; keep expandCues: false for the first run
  3. Scale the videoIds list 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-js
cp .env.example .env
npm install
node src/main.js

Input parameters

ParameterRequiredDefaultDescription
videoIdsYes—Watch URLs, Shorts, youtu.be, embeds, or 11-character IDs. Free users limited to 200 videos per run; paying users uncapped.
langNo"en"Preferred caption language code
expandCuesNofalseIf 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; cuesError when tracks exist without timed cues
  • Flexible storage — Keep cues as JSON on the parent row, or expand to flat rows
  • Suite join keys — Same videoId as 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.


ActorUse it for
YouTube Video ScraperMetadata beside captions
YouTube Search ScraperFind videos to caption
YouTube Related Videos ScraperExpand a neighborhood before selective captioning
YouTube Channel Videos ScraperShortlist 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.