YouTube Channel Transcript Scraper : $5 per 1,000 Videos avatar

YouTube Channel Transcript Scraper : $5 per 1,000 Videos

Pricing

from $5.00 / 1,000 transcript returneds

Go to Apify Store
YouTube Channel Transcript Scraper : $5 per 1,000 Videos

YouTube Channel Transcript Scraper : $5 per 1,000 Videos

Give it a YouTube channel handle, playlist, or list of video URLs and get every video's transcript as clean JSON: segments, plain text, or SRT, with language selection and channel metadata, at $5 per 1,000 videos. Bundles the per-video transcript job into one channel, every transcript, in one run.

Pricing

from $5.00 / 1,000 transcript returneds

Rating

0.0

(0)

Developer

Workware

Workware

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

YouTube Channel Transcript Scraper: All Videos in Bulk, $5/1K (Channel · Playlist · JSON/SRT)

Give it a YouTube channel handle, a playlist, or a list of video URLs: get every video's transcript as clean JSON in one run, at $5 per 1,000 videos. Paste @mkbhd and walk away with the whole back-catalogue as text: timed segments, plain text, or SRT, with language selection and channel metadata. Built for RAG and AI pipelines that need a creator's entire library, and for researchers who want a whole channel's words, not one video at a time.

  • What you put in: one or more sources. The fastest path is a channel handle (@mkbhd), but you can also pass a channel URL or ID, a playlist, or an explicit list of video URLs.
  • What you get back: one record per video with a validated transcript, plus one status record per source telling you exactly what happened: found, no_channel, or error.
  • Bulk is the whole point: the per-video transcript scrapers make you feed URLs one at a time. Here a single channel handle becomes every video's transcript in one run.
  • Boosted by the Apify platform: full REST API access, scheduling, monitoring, webhooks and integrations, residential proxy rotation, and dataset export to JSON, CSV, or Excel.

What is the YouTube Channel Transcript Scraper and what can it do?

The YouTube Channel Transcript Scraper is a bulk YouTube transcript API: name a channel, playlist, or video list and it returns every video's captions as normalized JSON: segments, plain text, or SRT. It is built for the job the per-video scrapers make tedious: turning a creator's whole library into text for a vector store, a search index, or an analysis pipeline, in one call instead of hundreds.

It reads YouTube's own innertube endpoints over a rotating residential proxy and extracts the existing captions: it does not download audio or run speech-to-text, so a run stays cheap and fast. You choose which caption languages you want, in priority order, and whether to accept YouTube's auto-generated captions when a manual one is not available. Every transcript echoes the language actually returned and whether it was auto-generated, so you always know what you got.

Per-video vs. bulk: why one handle beats a list of URLs:

This Actor (bulk)Per-video transcript scrapers
What you pasteOne channel handle, playlist, or video listEvery video URL, one at a time
A whole channelOne run enumerates and transcribes itYou assemble and paste the URL list yourself
Price$5 per 1,000 videos$5–$10 per 1,000, and you still gather the URLs
Outputsegments · plaintext · SRTUsually one fixed shape
Coverage recordA row per video with no captions, so gaps are explicitSilent gaps

What it deliberately does not do: it does not download audio or transcribe speech with AI (that is a different, 10× pricier class of tool), it does not translate or summarize the transcript (your pipeline's job: the record stays raw), it does not scrape comments or analytics, and it does not access private or members-only videos.

What data does it extract? (output fields)

Every transcript record carries the videoId, watch url, channelId, the language actually returned, isAutoGenerated, the availableLanguages the video offered, the chosen format, the transcript itself (timed [{start,dur,text}] for segments, or a single string for plaintext/srt), and a transcriptCharCount. With metadata on (the default) it also carries the title, channel name and handle, publish date, duration, and view count; turn metadata off for slim, transcript-only records.

Two more row types share the dataset:

  • video-no-transcript: a coverage record for a video definitively proven to have no usable transcript (captions disabled, or none in your requested languages with the auto-generated fallback off). You see which videos have no text, and why: never a silent gap.
  • channel-status: one row per input source:
    { source, ref, channelId?, videoCount, transcriptsFound, noTranscript, errors, status }
    , where status is found, no_channel, or error. This is what makes an empty result unambiguous: you always know whether a channel has no videos, does not exist, or could not be reached.

How to use the YouTube Channel Transcript Scraper (tutorial)

  1. Click Start with the example input already filled in: one channel handle, a small cap.
  2. Watch the run finish. A small channel typically completes in well under a minute.
  3. Open the Dataset tab. You will see one transcript record per video, plus one channel-status row.
  4. Export as JSON, CSV, or Excel, or call the run from your own code through the Apify API.

To run it on your own sources, replace the sources array. Each entry needs exactly one of:

  • channel: a handle (@mkbhd), a channel URL (/@…, /channel/UC…, /c/…, /user/…), or a bare UC… id. The Actor resolves it and enumerates the uploads, newest-first.
  • playlist: a playlist URL or PL…/UU… id, enumerated directly.
  • videos: an explicit list of video URLs or IDs, which bypasses enumeration.

Use maxVideos to cap how many videos per source (0 = the whole source, up to roughly the newest ~10,000 videos; a channel takes the newest first, a playlist takes the first videos in its own order: for larger channels narrow with a date range or a playlist), languages to set the caption language priority, publishedAfter/publishedBefore to bound the window, and titleFilter for a plain case-insensitive substring match on the title. Sources in a batch are processed one after another at a polite request rate; if you poll on a schedule, prefer several small runs over one very large one.

How much does it cost to scrape a whole channel's transcripts?

Pay-per-event, with three events, all anchored on $5 per 1,000 transcripts:

  • $0.002 per channel processed: charged once per source that reached a definitive answer, whether that answer is "here are the videos" or "there is no such channel". Enumeration's proxy cost is amortized into the per-transcript price, not double-charged here.
  • $0.005 per transcript returned: charged per video with a validated, non-empty transcript ($5 per 1,000). This matches the cheapest high-volume per-video scraper and undercuts the one channel-scale competitor ($15/1K) threefold.
  • $0.001 per no-transcript video: a fifth of the transcript price, for a video proven to have no captions. You never pay the full price for an empty result.

Failed lookups are free. A source whose status is error (an anti-bot block, a timeout) is never charged, and neither are the transcripts of a source whose run failed part-way through; they are discarded rather than delivered. We charge for answers, not for our own failures.

A worked example: a 300-video channel where 280 have captions costs

1 × $0.002 + 280 × $0.005 + 20 × $0.001 = $1.42
. Platform usage costs are absorbed at launch, not passed through.

Input and output examples

Input: a whole channel as plain text, capped at 25 videos:

{ "sources": [{ "channel": "@mkbhd" }], "maxVideos": 25, "outputFormat": "plaintext" }

Input: a playlist and an explicit video list, German captions preferred:

{
"sources": [
{ "playlist": "https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx" },
{ "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }
],
"languages": ["de", "en"],
"outputFormat": "srt"
}

Output: one transcript record (trimmed) and its source's status row:

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "…",
"channelHandle": "@mkbhd",
"language": "en",
"isAutoGenerated": false,
"availableLanguages": ["en", "es", "de"],
"format": "segments",
"transcript": [{ "start": 0.0, "dur": 1.6, "text": "…" }],
"transcriptCharCount": 4200,
"source": "youtube"
}
{ "source": "channel", "ref": "@mkbhd", "channelId": "UC…", "videoCount": 25, "transcriptsFound": 24, "noTranscript": 1, "errors": 0, "status": "found" }
EventWhat it isCharged forPrice
channel-processedChannel processed (definitive answer)each run$2.00 / 1,000
transcript-resultTranscript returnedeach record delivered$5.00 / 1,000
video-no-transcriptVideo with no transcript (coverage)each record delivered$1.00 / 1,000
FieldTypeRequiredDefaultDescription
sourcesarrayYes-The channels, playlists, or explicit video lists to transcribe: one run handles the whole batch, one source at a time. Each entry needs exactly one of channel, playlist, or videos.
maxVideosintegerNo0Caps the videos processed per source. 0 means no cap: the whole source. For a channel it takes the newest videos first; for a playlist it takes the first videos in the playlist’s own order (a playlist has no single "newest" order). Enumeration reaches roughly the newest ~10,000 videos per source; for larger channels, narrow with a date range or a playlist. The primary cost and scope control.
publishedAfterstringNo-Keep only videos published on or after this ISO date (YYYY-MM-DD). Applied during enumeration.
publishedBeforestringNo-Keep only videos published on or before this ISO date (YYYY-MM-DD). Applied during enumeration.
languagesarrayNo["en"]Priority list of caption language codes (e.g. en, de, pt-BR). The first language available on a video wins; a manual (creator-uploaded) caption is preferred to an auto-generated one.
allowAutoGeneratedbooleanNotrueWhen no manual caption exists in the requested languages, fall back to YouTube auto-generated captions (flagged isAutoGenerated: true). When off, such videos are reported as having no transcript.
outputFormatsegments | plaintext | srtNosegmentsHow each transcript is shaped: segments (timed [{start,dur,text}]), plaintext (joined prose), or srt (a single SRT document).
titleFilterstringNo-Keep only videos whose title contains this text, case-insensitively. Plain substring matching: not a regular expression.
includeMetadatabooleanNotrueInclude title, channel name/handle, publish date, duration, and view count in each record. When off, emit the transcript and ids only (smaller records).

Other Actors you might need

This Actor is a media-to-text probe rather than a hiring tool, so the siblings below solve a different problem. They are listed because they come from the same account and hold to the same two rules: read the source live rather than serving a cached index, and never charge you for a run that could not answer.

ActorUse it when
Job Postings APIYou want every live job at a company, whichever applicant tracking system it uses, in one normalized schema.
Greenhouse Jobs ScraperYou already know the company runs on Greenhouse and want its board as JSON.
Ashby Jobs ScraperYou are tracking startups on Ashby and want employer-stated salary ranges included.

FAQ, legality, and support

How do I download all transcripts from a YouTube channel?

Paste the channel handle (e.g. @mkbhd) as a single channel source and click Start. The Actor resolves the channel, enumerates its uploads newest-first, fetches each video's captions, and returns one transcript record per video. Use maxVideos to cap the count, or leave it at 0 for the whole channel.

Does it work if captions are auto-generated?

Yes. Set allowAutoGenerated (on by default): when no manual, creator-uploaded caption exists in your requested languages, the Actor falls back to YouTube's auto-generated captions and flags them isAutoGenerated: true. Turn it off to accept only human captions: videos with none then return a video-no-transcript coverage record instead.

What languages are supported?

Any language YouTube offers captions in. Pass languages as a priority list of codes: ["de", "en"] means "German if available, otherwise English". A manual caption is always preferred to an auto-generated one, and base-language matching means asking for en still matches en-US.

How is this different from a per-video transcript scraper?

A per-video scraper takes a list of video URLs you have already gathered. This Actor takes a channel or playlist and gathers the videos for you, then transcribes all of them in one run: the same per-video work, without the URL-collecting step, at the same $5/1K price.

The data is public: public channel metadata and publicly available captions. This Actor touches no private user data and no members-only content. Transcripts may carry copyright (creator-uploaded captions especially), so respect copyright, use the data responsibly, and you are responsible for your downstream use. YouTube actively resists automated access, so expect the occasional blocked run: those are free.

What happens when YouTube changes its internal API?

Every response is shape-checked before it is normalized. A change that breaks the shape fails the affected source loudly instead of emitting silently wrong records, and a scheduled smoke test runs against a known-stable channel so we usually find out before you do. This is a deliberately honest, lower-stability source than a documented API: priced and monitored accordingly.