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

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:

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

Open YouTube Transcript Scraper on Apify

Related pages