YouTube Channel Transcript Scraper - Whole Channel, One Input avatar

YouTube Channel Transcript Scraper - Whole Channel, One Input

Pricing

$8.00 / 1,000 transcripts

Go to Apify Store
YouTube Channel Transcript Scraper - Whole Channel, One Input

YouTube Channel Transcript Scraper - Whole Channel, One Input

Give it a YouTube channel handle and get transcripts for its recent videos - no need to collect video IDs first. Every row says which language you got and whether the captions were human-written or auto-generated, and videos with no captions come back with the reason instead of a blank row.

Pricing

$8.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 hours ago

Last modified

Share

YouTube Channel Transcript Scraper

Give it a channel. Get transcripts for that channel's recent videos.

Most transcript scrapers want a list of video IDs, which means you need a second tool — or a scrape of your own — before you can start. This one takes @veritasium, a channel URL, or a UC... channel ID, finds the videos itself, and returns one row per video.

What you get

One row per video:

Field
channelInput / channelId / channelTitlewhich channel this row came from
videoId / url / title / publishedAtthe video
textthe full transcript as one string
segmentsper-line text with start and duration (switch off with includeTimestamps: false)
languagethe language you actually received
isAutoGeneratedtrue if these are machine-generated captions
availableLanguagesevery caption language the video offers
segmentCountnumber of caption lines
okfalse on rows that could not be transcribed, with reason

Read isAutoGenerated before you trust the text

I measured the 15 most recent videos from each of 12 channels — 180 videos — on 2026-08-29.

Returned a caption track163 (90.6%)
...of which the track was auto-generated124 (76.1%)
Human captions available43 (23.9%)
No caption track at all15 (8.3%)
Video not playable2 (1.1%)

Whether a channel has human-written captions is close to binary. Six of the twelve channels had none at all across their last 15 uploads, while Marques Brownlee (12) and NASA (11) between them account for over half of the 43.

Machine captions and human captions arrive through the same field, with the same success status. isAutoGenerated is the only thing that tells them apart, so it is on every row — along with language and availableLanguages, so you can see what you actually received rather than assuming you got what you asked for.

What it does not do

  • It cannot reach a channel's back catalogue. YouTube's public channel feed returns at most 15 videos, so 15 per channel is the ceiling. Ask for more and it will tell you in the log rather than quietly returning 15.
  • It does not translate. If a video only offers Bulgarian captions, you get Bulgarian, labelled as Bulgarian. Machine-translating a machine transcription without saying so is how a pipeline ends up confidently wrong.
  • It does not return blank rows. A private video, a members-only video, one with no captions, or one that was blocked comes back with ok: false and a reason in plain English.

Billing

You are charged per transcript that actually contains text. Rows that explain a failure are free. If you set a maximum total charge on the run and it is reached, the run stops and says so in the log and in the run status, rather than silently returning a partial result that looks complete.

Input

{
"channels": ["@veritasium", "https://www.youtube.com/@mkbhd", "UCHnyfMqiRRG1u-2MsSQLbXA"],
"maxVideosPerChannel": 15,
"languages": ["en"],
"includeTimestamps": true,
"proxyMode": "auto",
"maxRetries": 3
}
Input
channelsHandles (@name), channel URLs, or UC... channel IDs. Required.
maxVideosPerChannel1–15. YouTube's public feed caps at 15 per channel.
languagesPreferred language codes in order. Human captions win over auto-generated ones.
includeTimestampsInclude per-line segments with start and duration.
proxyModeauto tries datacenter proxies first, because their traffic is free, and falls back to residential only when YouTube blocks. Set residential directly if you run at volume.
maxRetriesAttempts per video on a different IP before writing a row that says why it failed.