Bulk YouTube captions to timed text, SRT, and VTT without a browser
Extract transcripts from public YouTube videos in bulk. This Actor resolves video, playlist, and channel sources into visible video IDs, fetches public caption tracks, selects a matching language (with optional auto-generated captions and translation), and returns one dataset row per video: identifiers, title, channel, caption provenance, full text, timed segments, and formatted SRT, VTT, or plain text. It is HTTP-first and does not use browser automation. It does not fetch website HTML — for docs, pricing, or help-center pages use Website Content Extractor.
Open YouTube Transcript Scraper on Apify
YouTube captions, not website HTML
Use this page when the job is public YouTube transcripts for AI pipelines, RAG ingestion, subtitle export, research, or a searchable video archive. Use Website Content Extractor when the job is cleaned markdown or text from public HTTP(S) pages. Use Article Content Extractor when the URLs are article-shaped and you need headline, byline, and body.
| YouTube Transcript Scraper | Website Content Extractor | |
|---|---|---|
| Intent | Bulk public YouTube captions for pipelines, RAG, and subtitle export | Clean docs, product, pricing, policy, and help-center HTML |
| Input | Video URLs, video IDs, playlist URLs, and/or channel URLs | HTTP(S) page URLs |
| What it reads | Public YouTube caption tracks (HTTP-first, no browser) | Live page HTML |
| Primary output | One row per video: metadata, full text, timed segments, SRT/VTT/text | Cleaned page content, title, word count, metadata |
| HTML cleanup | No. Captions only; it does not fetch website pages | Yes — bounded website extraction |
This Actor is not a video-file or audio downloader. It does not scrape the YouTube watch UI with a browser. Only public videos with public caption tracks are supported.
Use cases
- Bulk transcript extraction for AI pipelines and large-scale text corpora
- Preparing video text for RAG ingestion and embedding creation
- Auditing transcript coverage and RAG readiness of a YouTube corpus
- Content repurposing and subtitle export (SRT/VTT/plain text)
- Building searchable video archives and research corpora
- Generating decision-ready reports and audits of transcript quality and coverage
The published README also positions the Actor for pipeline integration, transcript export, and downstream RAG or embedding workflows. It is built for AI pipelines, RAG ingestion, content repurposing, subtitle export, research, and searchable video archives.
How is YouTube Transcript Scraper different from Website Content Extractor?
This Actor extracts public YouTube caption tracks. You pass video URLs, video IDs, playlist URLs, or channel URLs. It resolves visible video IDs, fetches public captions, selects a matching language, downloads timed transcript XML, and returns one dataset row per video with full text, timed segments, and formatted SRT, VTT, or plain text. It is HTTP-first and does not use browser automation. Website Content Extractor fetches public docs, product, pricing, policy, and help-center page URLs and returns cleaned markdown, text, or HTML. It does not read YouTube caption tracks. Use this Actor for video transcripts. Use Website Content Extractor when you need page body content.
What input is required?
The published schema does not mark a required array. The README says you provide YouTube video URLs, video IDs, playlist URLs, or channel URLs. Live input schema fields:
| Field | Type | Default | Notes |
|---|---|---|---|
videoUrls |
string[] | — | Watch, Shorts, embed, or youtu.be URLs. README also lists live URLs. Schema prefill is https://www.youtube.com/watch?v=dQw4w9WgXcQ. |
videoIds |
string[] | — | Direct 11-character YouTube video IDs |
playlistUrls |
string[] | [] |
Public playlist pages; the Actor extracts visible video IDs |
channelUrls |
string[] | [] |
Public channel pages; the Actor extracts visible video IDs |
dedupeVideos |
boolean | true | Remove duplicate IDs after combining direct, playlist, and channel sources |
language |
string | en |
Preferred caption language (for example en, ja, es). Falls back to the first available track. |
includeAutoGenerated |
boolean | true | Allow auto-generated captions when manual captions are unavailable |
translationLanguage |
string | empty | Optional YouTube translation target. Leave blank for the original caption track. |
outputFormat |
string | json |
Extra formatted transcript field: json, text, srt, or vtt |
maxVideos |
integer | 100 | Maximum videos to process in one run |
timeoutMs |
integer | 15000 | HTTP request timeout in milliseconds |
delivery |
string | dataset |
dataset or dataset_and_webhook |
webhookUrl |
string | empty | HTTPS endpoint when delivery is dataset_and_webhook |
dryRun |
boolean | false | Validate inputs and emit preview rows without fetching YouTube |
Live schema names are the fields above. Do not send unpublished aliases such as startUrls, captionsOnly, or webhook as a delivery value. The live delivery enum is dataset and dataset_and_webhook.
Published Store input-object example (schema defaults):
{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"videoIds": [],
"language": "en",
"includeAutoGenerated": true,
"translationLanguage": "",
"outputFormat": "json",
"maxVideos": 100,
"timeoutMs": 15000,
"dryRun": false,
"playlistUrls": [],
"channelUrls": [],
"dedupeVideos": true,
"delivery": "dataset",
"webhookUrl": ""
}
Run YouTube Transcript Scraper on Apify
What does a result row contain?
Each video produces one row with transcript data and billing audit fields. The published README lists:
videoId,videoUrl,videoTitle,channelTitle,sourceTypestatus,chargedEvent,sourceUrls,errorslanguage,sourceLanguage,isAutoGenerated,captionTrackNamesegmentCount,fullText,segments,formattedTranscripterrorCode,errorMessage,scrapedAt
There is no published output JSON sample on the Store page and no separate published dataset/output JSON schema. There is no published video-file or audio-download field. outputFormat selects the extra formatted transcript field on each row (json, text, srt, or vtt).
What happens if captions are unavailable?
Only public videos with public caption tracks are supported. Age-restricted, private, deleted, or captionless videos return an error row. Unavailable captions, deleted videos, private videos, and request failures are returned as error rows instead of failing the full run. Playlist and channel expansion uses public page HTML and only discovers visible video IDs. YouTube may change its watch page payload shape.
How is YouTube Transcript Scraper priced?
Billing is pay per event. The published Store card is from $2.50 / 1,000 results. Live events are Actor Start at $0.00005 (charged when the Actor starts; number of events depends on Actor memory, one event per GB, minimum one event) and Result at $0.0025 (charged automatically for each item saved to the default dataset). You are not charged for Apify platform usage, only the fixed event price.
README recommended event names such as transcript_extracted or transcript_partial are not the live Store event titles. The live primary event is Result (apify-default-dataset-item). The README also states that the cost model assumes HTTP requests, no browser, and no residential proxy.
From $2.50 per 1,000 results ($0.0025 per default-dataset item, plus $0.00005 Actor Start)
See YouTube Transcript Scraper pricing on Apify
How do dataset, webhook, and dry-run delivery work?
delivery defaults to dataset and writes transcripts only to the dataset. Set delivery to dataset_and_webhook and provide webhookUrl (an HTTPS endpoint) to also send transcript rows after the run. The live schema values are dataset and dataset_and_webhook, not webhook. dryRun true validates inputs and emits preview rows without fetching YouTube.
Open YouTube Transcript Scraper on Apify
Limits to keep in mind
- Only public videos with public caption tracks are supported.
- Age-restricted, private, deleted, or captionless videos return an error row.
- Playlist and channel expansion uses public page HTML and only discovers visible video IDs.
maxVideosdefaults to 100.timeoutMsdefaults to 15000.- HTTP-first: no browser automation. This Actor does not fetch or clean website HTML.
- Live
deliveryvalues aredatasetanddataset_and_webhook.
Open YouTube Transcript Scraper on Apify
Related pages
- Website Content Extractor — clean docs, pricing, policy, or product pages, not YouTube captions
- Meta Tag & OpenGraph Scraper — head metadata and Open Graph audit, not captions
- Article Content Extractor — clean article, news, and blog pages
- RSS & Atom Feed Extractor
- Google News Scraper
- Apple Podcasts Scraper
- Apple Podcasts Chart Scraper
- Apple Podcasts Reviews Scraper
- Shopify App Store Review Scraper
- G2 & Capterra Review Scraper
- DNS Propagation Checker
- Wayback Machine Bulk Checker
- TED, SAM.gov & Grants Bid Alerts Scraper
- Tools