YouTube Transcript Scraper - Subtitles, SRT & RAG avatar

YouTube Transcript Scraper - Subtitles, SRT & RAG

Pricing

from $0.96 / 1,000 successful transcripts

Go to Apify Store
YouTube Transcript Scraper - Subtitles, SRT & RAG

YouTube Transcript Scraper - Subtitles, SRT & RAG

Get YouTube transcripts from video, Shorts, channel, playlist or search URLs. Returns clean text, timed segments, SRT/VTT and RAG-ready chunks in any caption language, with optional translation. Built for summaries, RAG and AI agents.

Pricing

from $0.96 / 1,000 successful transcripts

Rating

0.0

(0)

Developer

Rosario Vitale

Rosario Vitale

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Why use this Actor?

Get YouTube transcripts from video, Shorts, channel, playlist or search URLs. Returns clean text, timed segments, SRT/VTT and RAG-ready chunks in any caption language, with optional translation. Built for summaries, RAG and AI agents.

Features

  • YouTube URLs or video IDs — Direct YouTube video URLs or IDs. Can be combined with sourceUrls.
  • Preferred languages — Ordered language preferences such as en, it, es. Human captions are preferred unless Prefer auto-generated is enabled.
  • Fallback to any available language — If none of the preferred languages exist, use another available transcript instead of failing.
  • Prefer auto-generated captions — Prefer YouTube ASR captions over manually created captions when both are available.
  • Translate transcript to — Optional YouTube translation target language code such as en, it, es, fr. Leave blank for no translation.
  • Include timestamped segments — Include each caption segment with start time and duration.
  • Include timestamped text — Add timestampedText: plain text with one "[mm:ss] text" line per caption ("[hh:mm:ss]" for videos of an hour or more). Easy to paste into ChatGPT or a document and cite by time.
  • Timestamp every N seconds — With timestamped text, group captions into one line every N seconds (for example 30). 0 = one line per caption.
  • Include video metadata — Add title, channel, channel handle, description, keywords, thumbnail, duration, views, likes and publish/upload date when YouTube exposes them. Read from the page the transcript request already loads, so it usually adds no extra request.
  • Include chapters — Split the transcript into the video's chapters (title, start, end, text) when the creator added chapter timestamps to the description. Videos without chapters return an empty list.
  • Include SRT — Return the transcript as an SRT subtitle string.
  • Include WebVTT — Return the transcript as a WebVTT subtitle string.

Use cases

  • Video-to-text pipelines.
  • Rag and embeddings.
  • Subtitle export.
  • Content research and summarization.

Example input

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"languages": [
"en"
],
"fallbackToAnyLanguage": true,
"preferAutoGenerated": false,
"includeSegments": true,
"includeTimestampedText": false
}

Pricing & cost control

The primary event costs $0.001200 per Successful transcript (about $1.20 per 1,000 successful primary events). Only successful primary events are intentionally billed by this Actor; summary/status rows add context without adding primary-event charges.

Use the bounded input limits and filters to keep both event charges and platform usage predictable.

FAQ

What is this Actor for?
It is designed for video-to-text pipelines, RAG and embeddings, subtitle export.

Can I run it on a schedule?
Yes. You can schedule Actor runs on Apify and send the resulting dataset into automations, webhooks, storage, or downstream APIs.

How do I control cost and run size?
Use the input limits and filters shown in the Actor input form. The Actor applies bounded defaults and hard caps so large jobs remain predictable.

Pricing at a glance

Price per 1,000 transcripts
This Actor$1.20
Median of 8 comparable Apify Store Actors (October 2026)$1.50

That is about 20% below the median per-result price for this task in Apify Store.

Subscriber discounts: on a paid Apify plan you pay even less per result — Bronze −10%, Silver −15%, Gold and higher −20% ($0.96 per 1,000 transcripts on Gold).

Apify platform usage (compute, storage, data transfer) is included — you pay only the result price plus a small run start fee ($0.0001 per GB of run memory). No surprise compute bill, even on long runs.

Use the run's maximum charge setting to cap spending — the Actor stops cleanly when the limit is reached.

Use it from AI agents (MCP) and code

AI agents — Claude, ChatGPT, Cursor, VS Code, n8n AI agents and any MCP client can run this Actor through the official Apify MCP server: add https://mcp.apify.com?tools=zenomastro/youtube-transcript-reliable to your client. Then just ask, for example:

"Get the transcript of this YouTube video in English as clean text and as SRT subtitles."

The agent fills the input from the field descriptions and receives clean JSON it can reason over.

API — one HTTP call runs the Actor and returns the results directly:

curl -X POST "https://api.apify.com/v2/acts/zenomastro~youtube-transcript-reliable/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "languages": ["en"], "fallbackToAnyLanguage": true, "includeSegments": false, "includeMetadata": false, "includeParagraphs": true, "includeChunks": true, "retries": 1}'

The same works from the Apify Python/JavaScript clients, Make, n8n, Zapier, LangChain and LlamaIndex integrations, or on a schedule.

What this YouTube transcript scraper does

Paste YouTube video links, a channel, a playlist or a few search keywords, and get every video's transcript as clean text, plus timed segments, readable paragraphs, chapters, SRT/WebVTT subtitles and RAG chunks, together with the video's metadata. It reads the captions YouTube already has (human-made or auto-generated, in any language the video offers), so no YouTube API key and no login are needed.

Who it is for:

  • AI and RAG builders: chunks carry their start and end time and a link that opens the video at that moment, so answers can cite the exact second.
  • Researchers, marketers and students: turn a whole channel, playlist or search into text, or into one Markdown file you can upload to ChatGPT, Claude or NotebookLM.
  • Video editors and translators: SRT and WebVTT subtitles, and YouTube's own auto-translation into another language.
  • Monitoring: scheduled runs that return only new or changed transcripts.

How to use it

  1. Add video links to YouTube URLs or video IDs, channel/playlist/search links to Channel, playlist or search URLs, or keywords to Search keywords. You can combine all three.
  2. Set Preferred languages (for example en). To get every transcript in one language, also set Translate transcript to.
  3. Choose the extra formats you need under Output formats (plain text is always included) and click Start.
  4. Open the Output tab: the results table, the "Videos & metadata" table, the full JSON, and transcripts.md with all transcripts in one readable file.

Input examples

One video, with a timestamped line every 30 seconds (handy for ChatGPT):

{
"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"languages": ["en"],
"includeTimestampedText": true,
"timestampEverySeconds": 30
}

The 20 newest videos of a channel as RAG chunks for a vector database:

{
"sourceUrls": ["https://www.youtube.com/@mkbhd/videos"],
"maxDiscoveredVideos": 20,
"includeSegments": false,
"includeChunks": true,
"chunkSizeChars": 2000,
"chunkOverlapChars": 200,
"removeSoundTags": true
}

Up to 10 top videos for each of three searches, keeping those published in the last 6 months:

{
"searchQueries": ["sourdough bread recipe", "sourdough starter", "no knead bread"],
"maxVideosPerSource": 10,
"maxDiscoveredVideos": 30,
"publishedAfter": "6 months"
}

Spanish SRT subtitles for an English video:

{
"videoUrls": ["https://youtu.be/dQw4w9WgXcQ"],
"languages": ["en"],
"translateTo": "es",
"includeSrt": true
}

A daily schedule that returns only the channel's new videos:

{
"sourceUrls": ["https://www.youtube.com/@RickAstleyYT/videos"],
"maxDiscoveredVideos": 15,
"monitorName": "rick-astley-daily",
"onlyChanged": true
}

Output

Every video gives one row. A successful transcript looks like this (shortened; values are illustrative):

{
"recordType": "transcript",
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"success": true,
"language": "English",
"languageCode": "en",
"isGenerated": false,
"translatedTo": "",
"fullText": "We're no strangers to love You know the rules and so do I ...",
"segmentCount": 61,
"segments": [{ "text": "We're no strangers to love", "start": 18.6, "duration": 3.2 }],
"paragraphs": [{ "start": 18.6, "end": 95.1, "text": "We're no strangers to love ...", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=18s" }],
"chapters": [],
"chunks": [{ "index": 0, "text": "We're no strangers to love ...", "start": 18.6, "end": 95.1, "startTimestamp": "00:18", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=18s", "startChar": 0, "endChar": 1980, "chunkId": "5f0c...", "wordCount": 371, "estimatedTokens": 495 }],
"metadata": {
"title": "Rick Astley - Never Gonna Give You Up (Official Video)",
"channel": "Rick Astley",
"channelHandle": "@RickAstleyYT",
"publishedAt": "2009-10-24T23:57:33-07:00",
"durationSeconds": 213,
"viewCount": 1700000000,
"likeCount": 18700000,
"commentCount": 2400000,
"channelSubscriberCount": 4310000,
"thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg"
},
"availableTranscripts": [{ "language": "English", "languageCode": "en", "isGenerated": false, "isTranslatable": true }],
"wordCount": 487,
"estimatedTokens": 640,
"sha256": "3b1f..."
}

A video that cannot be transcribed gives an error row instead. Error rows are never charged, say why the video failed and whether a later run may succeed (retryable):

{
"recordType": "error",
"videoId": "abcdefghijk",
"url": "https://www.youtube.com/watch?v=abcdefghijk",
"success": false,
"errorType": "TranscriptsDisabled",
"error": "This video has no captions (subtitles are turned off or were never added), so there is no transcript.",
"retryable": false,
"metadata": { "title": "Some video without captions", "channel": "Some channel" }
}

When none of your languages exist and fallback is off, the error row also lists the video's availableTranscripts, so you can see which language codes to ask for. Runs that read channels, playlists or searches end with a free discovery_summary row (videos found per source), and monitor runs with a monitor_summary row.

All transcripts in one file (transcripts.md)

With Save all transcripts in one file (on by default, free), the run also saves transcripts.md in its key-value store, linked from the Output tab. It has a table of contents and, for each video, the title, link, channel, publish date, duration and language, then the transcript as paragraphs with [mm:ss] timestamps, grouped under the video's chapters when it has them. Upload it to ChatGPT, Claude or NotebookLM to ask questions across a whole channel. Very large runs are split into transcripts.md, transcripts-2.md and so on.

Languages and translation

  • Preferred languages are tried in order. Human-made captions are preferred over auto-generated ones; turn on Prefer auto-generated captions to reverse that.
  • If a video has no exact match, a regional variant of the same language is used (en finds en-GB or en-US, pt finds pt-BR), before any other language.
  • With Fallback to any available language (on by default) a video without your languages still returns its best available transcript; turn it off to get an error row instead.
  • Translate transcript to uses YouTube's own auto-translation. When YouTube refuses a translation, you get the original transcript (not charged) and translationError says why.
  • Remove sound tags deletes [Music], [Applause] and similar notes from every output.
  • Channel URLs are read newest first. A channel URL without a tab reads the Videos, Live and Shorts tabs; pick tabs with Channel tabs to include or use a tab URL such as /@name/shorts.
  • Maximum videos from channels, playlists and searches caps the total; Maximum videos per source caps each source, e.g. the 5 newest videos of each of 10 channels.
  • Published on or after / before accept dates (2026-09-01) or relative values (30 days, 6 months). Videos outside the window are skipped and not charged.
  • Search keywords return the top video results, like youtube.com with the Videos filter. For YouTube's own filters (upload date, duration, sort), apply them on youtube.com and paste the results URL into Channel, playlist or search URLs.
  • Shortcuts are accepted in the URL list: @handle, a channel ID (UC...) or plain keywords.

Reliability

  • One bad video never fails the run: it gets an uncharged error row with a clear reason (no captions, private, members-only, age-restricted, blocked) and the run continues.
  • Temporary problems are retried with backoff and a fresh proxy session; every request has a timeout.
  • Blocks are handled automatically: a blocked video is retried at once from other IP addresses (Apify Proxy and the run's own address), and the run learns which of the two works better and uses it first for the next videos.
  • Apify Proxy (datacenter) is on by default because YouTube often blocks cloud servers. Your own proxy URLs (for example residential) also work and are then always used.
  • The run stops cleanly, keeping all results, before your maximum charge and before the run timeout, and the status message says how many videos were not processed.
  • Video metadata is read from the page the transcript request already loads, so it usually costs no extra request, and a metadata problem never costs you the transcript (metadataError explains it).

What is charged

You pay only for successful transcript rows, one per video (see Pricing at a glance above and the Pricing tab). These are free: error rows, videos skipped by the date window, unchanged transcripts in monitor mode, transcripts returned untranslated because YouTube refused the translation, the summary rows and the transcripts.md file.

Limits

  • Up to 500 videos per run (listed and discovered together) and up to 50 channel, playlist or search sources.
  • Only videos with captions (human-made or auto-generated) have a transcript; this Actor does not transcribe audio. For videos without captions, use Audio & Video to Text.
  • Private, members-only, age-restricted and region-locked videos cannot be read, because the Actor does not log in.
  • Likes, comment count and subscribers are read as YouTube shows them on the video page: they can be rounded (for example 2.4M) or missing (null).
  • One dataset row can hold up to 9 MB. For very long videos with every format turned on, turn off segments, SRT or VTT if a SaveFailed row appears.

Use transcripts in accordance with applicable copyright, privacy and platform rules.

Troubleshooting and FAQ

Why did a video fail? Read error and errorType on its row. retryable: true (for example IpBlocked, RequestBlocked or a timeout) means running the same video again later may work; retryable: false (for example TranscriptsDisabled or VideoUnavailable) means it will not without changing the input.

Can I get a transcript in a language the video does not have? Yes, when YouTube offers auto-translation for that video: set Translate transcript to. translatedTo confirms the translation and sourceLanguageCode shows the original language.

How do I get only the plain text? fullText is always included. Turn off timestamped segments and paragraphs to keep rows small.

How do I download everything at once? Download transcripts.md from the Output tab, or export the dataset as JSON, CSV or Excel.

Does it work with Shorts and live streams? Yes, Shorts, Live and past live-stream URLs work when the video has captions.

Can I run it on a schedule and get only what is new? Yes: set a Transcript monitor name and turn on Emit only new or changed transcripts, then schedule the run or task.

Support

For a reproducible issue, open an issue with the public video URL, your language settings, whether a proxy was enabled, and the run ID. Never post private proxy credentials or API tokens in an issue.

Extended capabilities

  • Accept direct video IDs/URLs or discover videos from playlists, channels, handles, search-result pages, and other supported YouTube source URLs.
  • Fetch transcript segments with language controls and optional proxy fallback.
  • Produce text, paragraphs, RAG chunks, SRT, VTT, metadata, hashes, and persistent transcript-change monitoring.