YouTube Transcript Scraper - Bulk Channels, Playlists, Search avatar

YouTube Transcript Scraper - Bulk Channels, Playlists, Search

Pricing

from $3.00 / 1,000 results

Go to Apify Store
YouTube Transcript Scraper - Bulk Channels, Playlists, Search

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

mochi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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. en also matches en-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 FAILURES record 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

FieldDefaultWhat it does
startUrlsnone (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).
maxVideosPerSource20 (max 5000)Cap for each channel, playlist or search. Single video URLs are never capped.
languages["en"]Caption languages in order of preference.
preferManualCaptionstruePrefer human-made captions; turn off to prefer auto-generated ones.
includeSegmentstrueAdd segments: {start, duration, text} in seconds.
includeSrtfalseAdd srt: the transcript as SubRip subtitles.
includeVttfalseAdd vtt: the transcript as WebVTT subtitles.
proxyConfigurationApify residential proxy, one IP per videoProxy 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:

  • publishDate and category come from a second request per video. If that request fails or YouTube refuses it, the row is still delivered with both set to null. In our latest test runs it happened for 0 of 61 delivered rows.
  • availableLanguages lists every caption track the video offers, so you can re-run for another language.
  • keywords is an empty array when the video has none.
  • sourceType / sourceInput tell 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.

statusmeaning
blocked_login_requiredYouTube asked to sign in to confirm you're not a bot. Not retried in the same run.
unavailableRemoved, private or otherwise not playable; reason has YouTube's wording.
no_captionsThe video has no caption track.
empty_transcriptThe caption track came back empty or unreadable.
source_failedA channel, playlist or search could not be read (or was empty); videoId is null.
unsupported_urlThe input is not a YouTube video, Shorts, channel or playlist URL.
request_failedA 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.