YouTube Transcript Scraper: Subtitles, Channels & Whisper
Pricing
from $4.50 / 1,000 transcripts
YouTube Transcript Scraper: Subtitles, Channels & Whisper
Get YouTube transcripts and subtitles from videos, Shorts, channels, playlists and keyword searches: text, timestamped segments, SRT and VTT, plus views, tags and chapters. No captions? Whisper transcribes the audio. Pick languages and a date window. Failed videos are free.
Pricing
from $4.50 / 1,000 transcripts
Rating
0.0
(0)
Developer
Michael Costa
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
5
Monthly active users
8 days ago
Last modified
Categories
Share
What does YouTube Transcript Scraper do?
YouTube Transcript Scraper gets the transcript of any YouTube video, Short, channel, playlist or keyword search, as plain text, timestamped segments, SRT or VTT, with the video's title, views, tags, description and chapters. Videos with no captions at all are transcribed from their audio with the Whisper speech model. No login, no API key.
Input fields · API · Use it from Claude, ChatGPT or Cursor (MCP)
Jump to: Fields · Price · How to use · No captions · What you get here · Switching · Input · Output · AI agents (MCP) · Limits · FAQ
Try it in one click: the input comes pre-filled with "Me at the zoo", the first video ever uploaded to YouTube (19 seconds, with uploaded English subtitles). That's 1 transcript, about $0.0046 ($4.50 per 1,000, plus $0.00005 for the run start). Then replace it with your own videos, channels, playlists or search keywords.
What data does YouTube Transcript Scraper return?
One item per video:
| Field | Example | Notes |
|---|---|---|
id, url, title | jNQXAC9IVRw, https://www.youtube.com/watch?v=jNQXAC9IVRw, Me at the zoo | The video id is stable: use it to deduplicate |
input, inputType, inputTitle | sourdough starter, search | Which link or search the video came from: video, channel, playlist or search |
text | All right, so here we are, in front of the elephants... | The whole transcript, a new paragraph after each pause of 2 s or more |
segments | [{"start": 1.2, "end": 3.36, "text": "All right, so here..."}] | Timed in seconds from the start of the video |
srt, vtt | 1\n00:00:01,200 --> 00:00:03,360\n... | Subtitle files, when you turn them on |
transcriptSource | manual | manual (the uploader's subtitles), auto (YouTube's automatic captions) or whisper (transcribed from the audio by this actor) |
transcriptLanguage | en | With languageFallback: true when the language you asked for wasn't there |
captionLanguages | {"manual": ["de", "en"], "auto": []} | Every caption language the video offers |
channel, channelId, channelHandle, channelFollowers | jawed, UC4QobU6STFB0P71PMvOGN5A, @jawed | |
uploadDate, publishedAt, durationSeconds, viewCount, likeCount, commentCount | 2005-04-24, 2005-04-24T03:31:52Z, 19, 444097321 | As YouTube shows them when the run reads the video; likes are null when hidden |
tags, categories, description, thumbnail, chapters | ["Film & Animation"], [{"start": 0, "end": 5, "title": "Intro"}] | Chapters with start and end in seconds |
whisperMinutes, notes | 0, [] | Audio minutes charged (Whisper only), and anything worth knowing, in plain words |
The full list, with every field's meaning, is under Output.
How much does it cost to get YouTube transcripts?
You pay per transcript: $4.50 per 1,000 transcripts, plus $0.00005 each time a run starts. Video details are included at no extra cost.
Videos with no captions are transcribed from their audio with Whisper, only when you leave Transcribe videos without captions on, charged per started audio minute on top of the transcript:
| Whisper model | Per audio minute | A 10-minute video without captions |
|---|---|---|
| Base (default) | $0.012 | $0.12 + $0.0045 |
| Small (more accurate) | $0.024 | $0.24 + $0.0045 |
- A channel's last 100 videos, all with captions: 100 × $0.0045 = $0.45.
- The top 20 results of a keyword search: 20 × $0.0045 = $0.09.
- Caps: Max results per run and Max Whisper minutes per video in the input, and Maximum cost per run
in the run options. The run checks the budget before it reads each video and before it transcribes audio, so it
stops cleanly and never does work it can't charge for. A video that only partly fits gets its first minutes, and
its
notessay so.
Never charged: videos that are private, removed, members-only or age-restricted, live streams in progress,
videos without captions when Whisper is off, audio Whisper finds no speech in, videos outside your date window, and
anything that fails. A video that gives no transcript isn't written to the dataset at all, so there is no error row to
pay for either; the run's log and RUN_STATS record say why each one was left out.
How to get YouTube transcripts
- Open YouTube Transcript Scraper and click Try for free (or Start if you're signed in).
- Paste video, channel or playlist links into YouTube links, one per line, or type keywords into Search keywords (or both).
- Optional: a Transcript language (e.g.
es, ores, enfor Spanish, else English), Max videos per channel, playlist or search, a date window for channels, playlists and searches, and the output formats you want (plain text, timestamped segments, SRT, VTT). - Click Start, then open the Output tab and export as JSON, CSV or Excel.
What happens to videos without captions?
Most YouTube videos have captions: the uploader's own subtitles, or YouTube's automatic captions of the spoken language. This actor reads those first, in that order. Some videos have neither (very new uploads, music, many non-English channels, some Shorts). Caption-only scrapers return nothing for them.
With Transcribe videos without captions on (the default), this actor downloads the video's smallest audio
stream and transcribes it with Whisper (faster-whisper, run on Apify, nothing sent to a third party), in the
language YouTube labels the video with, or the one Whisper hears. The item says "transcriptSource": "whisper",
which model ran and how many minutes were charged. A transcript from Whisper is a machine transcript: very good on
clear speech, weaker on music, heavy accents and crosstalk; pick the Small model for those. Whisper gets a
time budget per video (about 30 s per audio minute at 4 GB of memory, twice that at the default 2 GB): speech it
can't follow, often a language it doesn't know, would otherwise take many times longer. A transcript cut there
says so in notes, and only the minutes it covers are charged.
What you get here that other transcript actors don't
- A transcript even when the video has no captions. Whisper transcribes the audio, charged per minute only for those videos. Caption-only tools return an error or an empty field for them.
- Videos, Shorts, channels, playlists and keyword searches in one run, mixed freely, each video read once even when two inputs name it.
- Every format in the same item: plain text, timed segments, SRT and WebVTT, with no second run for another format.
- Full video details at no extra cost: channel, follower count, exact publish time, duration, views, likes, comment count, tags, categories, description, thumbnail and chapters, plus every caption language the video offers.
- A date window for channels, playlists and searches that skips videos outside it before they're read, so they cost nothing, and stops reading a channel once its videos are older than the window.
- Nothing to pay for videos that fail: no error rows in your dataset, and the reason for each one in the log.
- Language list in order of preference, with a clear flag when a video had none of them.
Switching from another YouTube transcript actor?
Paste the same video links. What usually maps over:
| You had | Here |
|---|---|
| One video per run | Any number of videos, channels and playlists in YouTube links |
| A channel or playlist actor feeding a transcript actor | Paste the channel or playlist link directly; set Max videos per channel, playlist or search |
| Search keywords | Search keywords, one search per line, or paste a YouTube search results link |
| A channel URL with a start and end date | The channel link plus Published on or after / Published on or before (a date, or a span such as 30 days) |
| Language list / preferred language | Transcript language: one code, or several in order (es, en); when none is there you get the video's own language, flagged with languageFallback |
| Output format switch (text, timestamps, SRT, VTT) | Turn on any mix of text, segments, srt, vtt; they come in the same item |
| "Transcript not available" rows | Not written and not charged; the run log and RUN_STATS list each video and why |
Input
| Field | What it does |
|---|---|
YouTube links (urls) | Videos (watch, youtu.be, Shorts, live, embed links or bare ids), channels (@handle, /channel/UC..., a /videos, /shorts or /streams tab), playlists and search result links, one per line. |
Search keywords (searchQueries) | One YouTube search per line; its top results in YouTube's order. |
Max videos per channel, playlist or search (maxVideosPerSource) | Channels newest first; default 10, up to 5,000. |
Transcript language(s) (language) | A code such as en, es, pt-BR, or several in order (es, en). Empty: the video's own language. |
Published on or after / on or before (publishedAfter, publishedBefore) | A date window for videos from channels, playlists and searches: 2026-01-31 or a span back from today such as 30 days. Video links you paste are always read. |
Transcribe videos without captions (whisperFallback) | On by default; charged per audio minute. |
Whisper model (whisperModel) | base (default) or small. |
Max Whisper minutes per video (maxWhisperMinutesPerVideo) | Default 60, up to 300. |
Plain text, Timestamped segments, SRT, WebVTT (includeText, includeSegments, includeSrt, includeVtt) | Which formats each item carries. Text and segments are on by default. |
Video details (includeMetadata) | Channel, date, views, likes, tags, description, chapters. On by default. |
Max results per run (maxResults) | Cap the number of transcripts. |
Proxy (proxyConfiguration) | Apify Proxy by default. |
{"urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw","https://www.youtube.com/@jawed","https://www.youtube.com/playlist?list=PLxxxxxxxx"],"searchQueries": ["sourdough starter"],"maxVideosPerSource": 20,"publishedAfter": "90 days","language": "en, es","includeSrt": true}
Output
One item per video with a transcript. Real output of the default input on Apify (2026-10-14; text and segments shortened, some details left out). Fields YouTube doesn't publish for a video are null.
{"id": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","title": "Me at the zoo","input": "https://www.youtube.com/watch?v=jNQXAC9IVRw","inputType": "video","inputTitle": null,"transcriptSource": "manual","transcriptLanguage": "en","requestedLanguage": null,"languageFallback": false,"captionLanguages": {"manual": ["de", "en"], "auto": []},"whisperModel": null,"whisperMinutes": 0,"wordCount": 39,"segmentCount": 6,"text": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really really long trunks ...","segments": [{"start": 1.2, "end": 3.36, "text": "All right, so here we are, in front of the elephants"}],"srt": null,"vtt": null,"notes": [],"scrapedAt": "2026-10-14T22:45:32.983015Z","channel": "jawed","channelId": "UC4QobU6STFB0P71PMvOGN5A","channelHandle": "@jawed","viewCount": 444097321,"likeCount": 20077772,"tags": ["me at the zoo", "jawed karim", "first youtube video"],"uploadDate": "2005-04-24","publishedAt": "2005-04-24T03:31:52Z","durationSeconds": 19,"chapters": [{"start": 0, "end": 5, "title": "Intro"}]}
The run's RUN_STATS record lists every input line and every video, with why a video had no transcript
(noCaptions, private, unavailable, ageRestricted, membersOnly, live, blocked ...), and which videos
were skipped for falling outside your date window.
Run it on a schedule, or from your own code
- Save your input as a task (Save as a new task, top right of the actor page) and add it to a schedule (Console → Schedules → Create new), for example to pull a channel's newest videos every morning.
- Collect results: download the dataset as JSON, CSV or Excel; fetch the latest run's results from the
API
(
GET https://api.apify.com/v2/actor-tasks/<task id>/runs/last/dataset/items?status=SUCCEEDED&format=json, with your API token); let a webhook tell your system when a run succeeds; or connect it to Make, Zapier or n8n through Apify's integrations.
Can I use YouTube Transcript Scraper from an AI agent (MCP)?
Yes, through Apify's MCP server, from Claude, ChatGPT, Cursor or any other MCP client. Add this to your client's MCP configuration (or let the agent find it with the server's actor search); your client signs you in to Apify:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=humble-echidna/youtube-transcripts"}}}
To use an Apify API token instead of signing in, add
"headers": {"Authorization": "Bearer <APIFY_TOKEN>"} next to url. An agent passes
{"urls": ["<video link>"], "includeSegments": false} for just the text, or a channel link with
"maxVideosPerSource": 5.
Who it's for
People who turn videos into text: AI and RAG builders feeding transcripts to a model, marketers and researchers summarizing a channel's output, editors who need SRT/VTT subtitles, and course and podcast teams repurposing talks.
Why this one?
- Videos without captions still get a transcript. Whisper transcribes the audio when YouTube has no captions, charged per minute only then; caption-only scrapers return nothing for those videos.
- Channels, playlists and keyword searches in the same run as single videos, each video read once.
- Every format in one item: plain text, timestamped segments, SRT and WebVTT, plus the video's details at no extra cost.
- The real spoken track, never a machine translation: uploaded subtitles first, then YouTube's automatic captions of the spoken language. A missing language is flagged, not silently swapped.
- Reliable. One failing video never affects the others; a bot check or rate limit is retried twice from a new IP address. Failed videos are free, and the log says why each one failed.
Limits
- Logged out only. Private, members-only and age-restricted videos need a signed-in account, which this actor never uses; they're listed as failed and not charged.
- Live streams in progress have no transcript yet; run it again once the stream has ended.
- Very long transcripts (about 15 hours and up with every format on) don't fit one dataset item with every
format: WebVTT, then SRT, then the segments are left out, the text is always kept, and
notessays so. - Whisper transcribes at most 300 minutes per video (60 by default), one video at a time, so a run of many long videos without captions takes a while; videos with captions take seconds each.
- No translation. YouTube refuses its machine-translated caption tracks to logged-out readers, so you get the video's own language (flagged) when none of the ones you asked for is there.
- No comments. Searches return YouTube's own relevance order; YouTube no longer honours a sort by upload date there, so use the date window to narrow a search.
- The date window reads a list's rough dates ("3 weeks ago") first, then the exact day: a playlist or search is read up to 10 times as far as the videos you asked for to find ones inside it.
FAQ
Is it legal to scrape YouTube transcripts?
This actor reads only what any logged-out visitor sees on youtube.com: public videos, their captions and details. It never signs in and uses no accounts (only the anonymous visitor id YouTube gives every logged-out visitor), and collects no personal data beyond the public channel name and handle shown with every video. Be aware that YouTube's robots.txt disallows automated access to the caption and player addresses this needs, and YouTube's Terms of Service forbid accessing the service by automated means without YouTube's permission. Whether and how you use transcripts (and the videos' content, which belongs to their creators) is your responsibility. If you are a rights holder and want something removed or not read, open an issue and we'll act on it promptly.
Why did a video return no transcript?
The run log and the RUN_STATS record name each video and the reason: no captions (and Whisper off), private,
removed, members-only, age-restricted, a live stream in progress, or a bot check YouTube kept asking for after two
retries from new IP addresses. Nothing is charged for those. Please open an issue with the link if a public video
with captions fails.
Which caption track do I get?
The uploader's own subtitles in your language first, then YouTube's automatic captions of the spoken language. With
no language set, the video's own language. transcriptSource and transcriptLanguage say which one you got, and
captionLanguages lists everything the video offers.
How accurate is the Whisper transcript?
Whisper's base model makes about 4 words in 100 wrong on clear read speech (measured on LibriSpeech test-clean, 2026-09-26) and more on noisy audio; the small model about 3 in 100. Captions written by the uploader are usually better, which is why they always come first.
How is this different from YouTube's own transcript button or the YouTube Data API?
YouTube's "Show transcript" panel works one video at a time in a browser. The YouTube Data API only lets a video's owner download its captions. This actor works for any public video, in bulk, from channels, playlists and searches, with timestamps and subtitle files, and transcribes videos that have no captions at all.
Related actors
| Actor | Use it when |
|---|---|
| Audio & Video Transcriber | Your audio or video files and podcast feeds (not YouTube), to text, SRT and VTT with Whisper |
| AI for Every Row | Summarize or classify every transcript with an LLM |
| Dataset Transform | Reshape, filter or deduplicate the results into a clean CSV |
Feedback and support
Found a bug, or need a field that isn't here? Open an issue on the Issues tab with the input you used.
Versions
Current version: 0.2. See the Changelog tab for what changed in each version.