YouTube Transcript Scraper - Bulk Channels, Playlists, Search
Pricing
from $3.00 / 1,000 results
YouTube Transcript Scraper - Bulk Channels, Playlists, Search
Transcripts for YouTube videos, Shorts, whole channels, playlists and search results in one run: transcript text, timestamped segments, optional SRT and WebVTT, plus title, channel, views, duration, publish date and keywords. You pay only for transcripts delivered.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
mochi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
YouTube Transcript Scraper - bulk transcripts from videos, channels, playlists and search
Get the transcript of a YouTube video, or of every video in a channel, playlist or search result, in one run. Each video becomes one row: the full transcript text, timestamped segments, optional SRT and WebVTT subtitle text, and the video's details (title, channel, views, duration, publish date, category, keywords, description).
- Paste any mix of inputs. Video, Shorts and youtu.be links, bare 11-character video IDs, channel URLs (
@handle,/channel/UC...,/c/...,/user/...), playlist URLs and search queries all go in one run. Video IDs are de-duplicated across sources. - Pick your languages. List language codes in order of preference (
en, es, de). Human-made captions are used when the video has them, auto-generated captions are the fallback.enalso matchesen-GB. If none of your languages exist, the video's default caption track is used and the row says which language you got. - Pay only for transcripts delivered. A video without captions, a removed video, or a video YouTube refuses to serve is never a charged row. Those go to a separate
FAILURESrecord with a status and a reason.
What it does NOT do
- No translation. You get the transcript in a language the video already has. YouTube answers translated-caption requests with HTTP 429, so the feature is not offered.
- No speech-to-text. A video with no captions at all is reported as
no_captions; its audio is not transcribed.
Known limitation: YouTube's "sign in to confirm you're not a bot" check
Some requests are answered with Sign in to confirm you're not a bot instead of video data. This actor never signs in, never uses cookies and never retries such a video in the same run. The video is written to FAILURES with the status blocked_login_required and is not charged.
Measured on 2026-10-19 with the default setting (Apify residential proxy, a new IP for every video): two checks on 2026-10-19 (97 videos requested in total, mixing single videos, channels, playlists and searches). YouTube refused 3 of the 97 (3%), and some videos had no captions. The same list on Apify's datacenter proxy was refused for 50 of 62 videos (81%) on 2026-10-17, so datacenter proxies are not recommended. A refused video is never retried in the same run; run the list again to get it.
Input
| Field | Default | What it does |
|---|---|---|
startUrls | none (the form is prefilled with two examples) | Videos, Shorts, channels, playlists, or bare video IDs. |
searchQueries | [] | Transcribe the top videos of a YouTube search (videos only). |
maxVideosPerSource | 20 (max 5000) | Cap for each channel, playlist or search. Single video URLs are never capped. |
languages | ["en"] | Caption languages in order of preference. |
preferManualCaptions | true | Prefer human-made captions; turn off to prefer auto-generated ones. |
includeSegments | true | Add segments: {start, duration, text} in seconds. |
includeSrt | false | Add srt: the transcript as SubRip subtitles. |
includeVtt | false | Add vtt: the transcript as WebVTT subtitles. |
proxyConfiguration | Apify residential proxy, one IP per video | Proxy used for all requests. |
Provide at least one URL, video ID or search query, otherwise the run fails with a message.
Output
One dataset row per video that has a transcript. Example (shortened):
{"videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","channelId": "UCuAXFkgsw1L7xaCfnd5JJOw","channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","publishDate": "2009-10-24T23:57:33-07:00","category": "Music","durationSeconds": 213,"viewCount": 1827615962,"isLive": false,"description": "The official video for “Never Gonna Give You Up” by Rick Astley. ...","keywords": ["rick astley", "Never Gonna Give You Up", "nggyu", "..."],"thumbnailUrl": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/sddefault.webp","transcriptLanguage": "en","transcriptLanguageName": "English","isAutoGenerated": false,"availableLanguages": [{"code": "en", "name": "English", "isAutoGenerated": false},{"code": "en", "name": "English (auto-generated)", "isAutoGenerated": true}],"wordCount": 487,"transcriptText": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ...","segments": [{"start": 1.36, "duration": 1.68, "text": "[♪♪♪]"},{"start": 18.64, "duration": 3.24, "text": "♪ We're no strangers to love ♪"}],"sourceType": "video","sourceInput": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","scrapedAt": "2026-10-17T17:40:32.653Z"}
With includeSrt / includeVtt the row also has srt / vtt (placed after segments); with includeSegments off, segments is omitted.
Notes on individual fields:
publishDateandcategorycome from a second request per video. If that request fails or YouTube refuses it, the row is still delivered with both set tonull. In our latest test runs it happened for 0 of 61 delivered rows.availableLanguageslists every caption track the video offers, so you can re-run for another language.keywordsis an empty array when the video has none.sourceType/sourceInputtell you which of your inputs (video,channel,playlist,search) produced the row. A video found by several inputs appears once, under the first.
The FAILURES record
Everything that did not become a row is saved in the key-value store under the key FAILURES, as a JSON array of {input, videoId, status, reason}. The run still finishes as succeeded, and the last log line reads like OK 5 / failed 26 by status: blocked_login_required 25, no_captions 1.
| status | meaning |
|---|---|
blocked_login_required | YouTube asked to sign in to confirm you're not a bot. Not retried in the same run. |
unavailable | Removed, private or otherwise not playable; reason has YouTube's wording. |
no_captions | The video has no caption track. |
empty_transcript | The caption track came back empty or unreadable. |
source_failed | A channel, playlist or search could not be read (or was empty); videoId is null. |
unsupported_url | The input is not a YouTube video, Shorts, channel or playlist URL. |
request_failed | A request kept failing after 3 retries (HTTP 429/5xx or network error). |
Pricing
Pay per result, at the rate shown in the pricing panel of this page, plus a very small per-run start fee. You are charged only for the results delivered.
Proxy cost (measured on 2026-10-19 over 66 to 97 videos in several runs): about 70 to 130 KB of residential traffic per video requested, which is $0.0006 to $0.0010 per video at Apify's residential rate of $8 per GB. That is roughly $0.8 to $1.0 of proxy cost per 1,000 transcripts delivered, counting videos without captions and the channel, playlist and search pages. Long videos and videos with more captions cost more.
Search keywords
youtube transcript, youtube transcript scraper, youtube subtitles, youtube captions download, bulk youtube transcripts, channel transcripts, playlist transcripts, youtube to text, srt download.