YouTube Transcript Scraper — Subtitles & Captions, Timestamps
Pricing
from $5.00 / 1,000 transcript delivereds
YouTube Transcript Scraper — Subtitles & Captions, Timestamps
Get YouTube transcripts from video links, IDs or channels: the captions in the spoken language (human-written when available, else auto-generated, de-duplicated) as clean text plus timed segments. $0.005 per transcript on every plan. No captions, no charge. No API key.
Pricing
from $5.00 / 1,000 transcript delivereds
Rating
0.0
(0)
Developer
Nicholas Cheng
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 hours ago
Last modified
Categories
Share
YouTube Transcript Scraper
Give it YouTube links, video IDs or channels — get back what is said in each video, as clean text with timestamps. The transcript is the caption track in the language that is actually spoken: the human-written captions when the video has them, otherwise YouTube's auto-generated ones, de-duplicated so the text reads as one pass of the speech. No API key, no login, no cookies.
You pay only for transcripts that came back. A video with no captions, a private or deleted video, or one YouTube would not serve produces an explanatory row and costs nothing.
| Input | Video URLs / IDs (watch, Shorts, youtu.be, embed) and/or channels (@handle, channel URL, UC… id) for their latest uploads |
| Output | One row per transcript: plain text + timed segments + title, channel, duration, language |
| Price | $0.005 per transcript — the same on every Apify plan |
| Not charged | Videos without captions, unavailable videos, filtered-out videos |
What you get
Real output for jNQXAC9IVRw (the first video on YouTube):
{"itemType": "transcript","videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","title": "Me at the zoo","channelId": "UC4QobU6STFB0P71PMvOGN5A","channelName": "jawed","durationSeconds": 19,"transcriptLanguage": "en","transcriptType": "manual","transcript": "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 and that's cool (baaaaaaaaaaahhh!!) and that's pretty much all there is to say","subtitles": [{"language": "en","type": "manual","name": "English","text": "All right, so here we are, in front of the elephants … and that's pretty much all there is to say","segments": [{ "start": 1.2, "end": 3.36, "text": "All right, so here we are, in front of the elephants" },{ "start": 5.318, "end": 7.974, "text": "the cool thing about these guys is that they have really..." },{ "start": 7.974, "end": 12.616, "text": "really really long trunks" },{ "start": 12.616, "end": 14.367, "text": "and that's cool" },{ "start": 14.421, "end": 15.733, "text": "(baaaaaaaaaaahhh!!)" },{ "start": 16.881, "end": 18.881, "text": "and that's pretty much all there is to say" }]}],"availableCaptionLanguages": [{ "language": "en", "isAutoGenerated": false },{ "language": "de", "isAutoGenerated": false }]}
transcript— the whole thing as one string, ready for an LLM, a search index or a summary.segments— the same text as timed cues (start/endin seconds), for quoting a moment or building chapters.transcriptType—manual(written by a person) orauto-generated(YouTube's speech recognition). Auto-generated captions arrive as "roll-up" cues that repeat each line two or three times; they are de-duplicated here, which is a common problem in raw auto-caption dumps.availableCaptionLanguages— every caption track the video has, so you know whether a translation exists.
Input
{"videoUrls": ["https://www.youtube.com/watch?v=aircAruvnKk", "jNQXAC9IVRw"],"channelUrls": ["@veritasium"],"maxVideosPerChannel": 5}
| Option | Default | Notes |
|---|---|---|
videoUrls | — | Watch, Shorts, youtu.be, embed, live links, or bare 11-character IDs |
channelUrls | — | Transcribe a channel's latest uploads. @handle, channel URL, or UC… id |
maxVideosPerChannel | 5 | Per channel, counting only videos that actually had a transcript |
minViews, minDurationSeconds, maxDurationSeconds, titleContains | — | Skip videos you do not want before paying for them — e.g. minDurationSeconds: 61 drops Shorts |
publishedAfter | — | ISO date. Applies to channel uploads (read from the channel listing); links you pass directly are not date-filtered |
maxItems | 0 | Hard cap on transcripts for the run — bounds your spend |
A channel page lists about 30 recent uploads; that is the pool maxVideosPerChannel draws from.
Pricing
$0.005 per transcript, on every Apify plan — Free, Bronze, Silver, Gold, Platinum, Diamond. Check the Pricing tab: all six columns are identical. There is no start fee and no per-minute fee.
The event is charged once per transcript delivered. Being straight about how that compares: several transcript Actors charge per video processed or per dataset row, which includes videos that turned out to have no captions. Here those rows are free, so the price you see is the price per transcript you actually get.
What you are not charged for
| What happens here | |
|---|---|
| Videos without captions | One row with chargedForThis: false and the reason. Common for music videos and clips without speech. |
| Unavailable videos | Private, deleted, region-blocked or age-restricted videos produce one explanatory row, not billed. |
| Bot checks | If YouTube keeps refusing after eight tries from different addresses and clients, the row says so and is not billed. |
| Filtered-out videos | Not written, not billed. |
| The free plan | Same code path, same fields, same price. No demo mode, no row cap. |
What this Actor cannot do
- No speech recognition of our own. The transcript is YouTube's own captions. If YouTube has none for a video, you get none — we do not download the audio and transcribe it.
- One language per video. You get the spoken language. Translations YouTube offers are listed in
availableCaptionLanguagesbut not downloaded. - No members-only or private videos, and no age-restricted ones — those need a signed-in account and this Actor never signs in.
- No search. It works from links and channels, not keywords.
- For view counts, likes, publish dates and full descriptions, use the
YouTube Video Stats Scraper (it can include the
transcript too, with
includeSubtitles).
How it stays working
The caption list is fetched the way YouTube's mobile apps fetch it — the iOS, Android VR and Android app clients in turn — first from a datacenter address and, if YouTube shows a bot check, from fresh residential addresses, up to eight tries. The caption file itself is downloaded directly. The watch page is never loaded, so a transcript costs a fraction of a full video scrape.
Measured over three rounds of fifteen videos (news, lectures, music; English, German, Korean and Arabic speech): the caption list came back for 14, 15 and 15 of 15 on a single pass through the clients, and all 170 caption downloads returned text. Client settings follow the open-source yt-dlp project and are updated when YouTube changes them.
Integrating
curl -X POST "https://api.apify.com/v2/acts/nick.cheng~youtube-transcript-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H 'Content-Type: application/json' \-d '{"videoUrls":["aircAruvnKk","jNQXAC9IVRw"]}'
Official clients exist for JavaScript and Python; results export as JSON, CSV or Excel; and the Actor is available as a tool to AI agents through Apify's MCP server.