YouTube Transcript Scraper (Bulk Channels & Videos) avatar

YouTube Transcript Scraper (Bulk Channels & Videos)

Pricing

from $6.00 / 1,000 result delivereds

Go to Apify Store
YouTube Transcript Scraper (Bulk Channels & Videos)

YouTube Transcript Scraper (Bulk Channels & Videos)

Fast bulk YouTube transcript scraper. Download captions from channels, playlists, Shorts, or URLs into Clean Text, SRT, VTT, and RAG chunks.

Pricing

from $6.00 / 1,000 result delivereds

Rating

0.0

(0)

Developer

Tobias Sauseng

Tobias Sauseng

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

YouTube Transcript Scraper

YouTube Transcript & Subtitle Scraper (Bulk Channels, Playlists & Videos)

Apify Actor Pay Per Event Status

A fast, production-grade tool to download YouTube transcripts, captions, and subtitles in bulk. Extract data from individual video URLs, YouTube Shorts, full playlists, or entire channel back-catalogues (@handle or channel ID).

Exports directly to Plain Text, SubRip (.srt), WebVTT (.vtt), JSON timestamps, and character-bounded RAG chunks ready for vector databases and LLMs.


⚡ Why Use This Scraper?

FeatureThis ScraperPintostudio (Top Competitor)Official YouTube API v3
Input FlexibilityBulk URLs, Shorts, Channels (@handle), PlaylistsSingle video URL only (1 video per run)Complex OAuth & Video IDs
Export Formats5 Formats (plaintext, srt, vtt, chunks, timestamped)1 format (raw JSON snippet array)Raw XML timedtext
AI Text FormattingBuilt-in (Punctuation, casing, paragraphs)❌ Raw unpunctuated text only❌ None
RAG & Vector Search ReadyBuilt-in overlapping timestamped chunks❌ Requires manual preprocessing❌ None
Pricing (per video)$0.006 (Undercuts competitors)$0.007 – $0.010Strict 10,000 quota units / day
Failed / Deleted Videos100% FREE ($0.00 charge)Charged full priceConsumes API quota
Proxy ArchitectureSticky Residential Proxy Pool (Zero 429 IP blocks)Datacenter proxies (frequent blocks)Subject to IP limits

🚀 Key Capabilities

  • Bulk Channel & Playlist Scraping: Enter a single channel handle like @hubermanlab or a playlist URL to process dozens or hundreds of videos in one automated run.
  • 5 Clean Export Formats:
    • plaintext: Continuous, readable text stream ideal for LLM prompts, summarization, and NLP.
    • timestamped: Precision cue array with millisecond start times and durations.
    • chunks: Overlapping character-bounded segments with startTime and endTime for RAG vector databases.
    • srt: Industry-standard SubRip subtitle file for Premiere, DaVinci Resolve, Final Cut, and VLC.
    • vtt: WebVTT format for HTML5 <track> tags and modern web players.
  • Smart Formatting Pass (cleanTranscript): Fixes auto-generated captions by inserting proper capitalization, punctuation, and natural paragraph breaks without removing spoken words.
  • Date & Language Filters: Pull only recent videos (publishedAfter / publishedBefore) and automatically translate captions into any target language (e.g. es, de, fr, ja).
  • Fair Billing Guarantee: You are billed strictly for delivered transcripts. If a video is private, deleted, or captions are disabled, it is saved to your dataset with zero charge.

📖 How to Scrape YouTube Transcripts in 3 Steps

  1. Add Your Sources: Paste video links, Shorts URLs, playlist links, or YouTube channel handles (@channelname) into the startUrls field.
  2. Choose Output Formats: Select which formats you need (plaintext, timestamped, chunks, srt, vtt). Optionally toggle cleanTranscript for readable punctuated text.
  3. Run & Export: Click Start. Once finished, download your transcripts in JSON, CSV, Excel, or XML, or sync directly to your webhook, Zapier, Make, or AWS S3.

📥 Supported Input Formats

You can mix and match any of these formats inside startUrls:

Target TypeExample InputWhat It Extracts
Channel Handle@lexfridman or https://www.youtube.com/@lexfridmanAll videos from the channel
Channel IDUC_x5XG1OV2P6uZZ5FSM9TtwAll videos from the channel
Playlisthttps://www.youtube.com/playlist?list=PLrAXtmErZgOdP_8GztsuKi9nrraNbKKp4Every video in the playlist
Standard Videohttps://www.youtube.com/watch?v=dQw4w9WgXcQIndividual video transcript
YouTube Shortshttps://www.youtube.com/shorts/dQw4w9WgXcQIndividual Shorts transcript
Short URLhttps://youtu.be/dQw4w9WgXcQIndividual video transcript
Bare Video IDdQw4w9WgXcQIndividual video transcript

⚙️ Input Configuration Reference

OptionTypeDefaultDescription
startUrlsArrayRequiredList of YouTube video URLs, channel handles (@name), channel IDs, or playlists.
maxVideosInteger50Maximum number of videos to scrape across all inputs. Set 0 for unlimited.
outputFormatsArray["timestamped", "plaintext"]Formats to include: timestamped, plaintext, chunks, srt, vtt.
languagesArray["en"]Priority order of caption languages to search for (e.g. ["en", "es"]).
preferManuallyCreatedBooleantruePrefer creator-uploaded subtitles over automatic speech recognition (ASR).
translateToStringnullTarget language code (e.g. es, de, fr) to translate transcripts into.
publishedAfterStringnullFilter channel uploads: only include videos on or after YYYY-MM-DD.
publishedBeforeStringnullFilter channel uploads: only include videos on or before YYYY-MM-DD.
cleanTranscriptBooleanfalseOptional AI formatting pass to add punctuation, casing, and paragraphs (textCleaned).
includeVideoDetailsBooleanfalseInclude view count, like count, upload date, description, tags, and category.
maxConcurrencyInteger5Simultaneous videos processed (1 to 25).
proxyConfigurationObjectResidentialApify Residential proxies enabled by default to prevent IP rate limits.

📊 Sample Output

Every processed video generates a structured record in the dataset:

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Music Video)",
"channel": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"channelUrl": "https://www.youtube.com/@RickAstleyYT",
"duration": 213,
"status": "ok",
"hasTranscript": true,
"language": "English",
"languageCode": "en",
"isGenerated": false,
"isTranslated": false,
"availableTranscripts": [
{ "language": "English", "languageCode": "en", "isGenerated": false },
{ "language": "Spanish", "languageCode": "es", "isGenerated": false }
],
"snippetCount": 61,
"wordCount": 487,
"charCount": 2610,
"transcript": [
{ "text": "We're no strangers to love", "start": 18.64, "duration": 3.6 },
{ "text": "You know the rules and so do I", "start": 22.84, "duration": 4.1 }
],
"text": "We're no strangers to love You know the rules and so do I ...",
"chunks": [
{
"index": 0,
"text": "We're no strangers to love You know the rules and so do I ...",
"startTime": 18.64,
"endTime": 65.2,
"charCount": 1180
}
],
"srt": "1\n00:00:18,640 --> 00:00:22,240\nWe're no strangers to love\n\n2\n00:00:22,840 --> 00:00:26,940\nYou know the rules and so do I\n",
"vtt": "WEBVTT\n\n00:00:18.640 --> 00:00:22.240\nWe're no strangers to love\n\n00:00:22.840 --> 00:00:26.940\nYou know the rules and so do I\n",
"textCleaned": "We're no strangers to love. You know the rules, and so do I...",
"publishedAt": "2009-10-25",
"error": null
}

💰 Transparent Pay-Per-Event (PPE) Pricing

You only pay for successful results. There are no hidden subscription fees:

EventRateWhen Charged
video-transcribed$0.006 / videoCharged only when a full transcript is delivered.
video-metadata-only$0.002 / videoVideo exists and metadata resolved, but captions are disabled.
transcript-cleaned$0.010 / 1k wordsOptional AI formatting pass (adds punctuation & paragraphs).
Unavailable / Private / Deleted$0.00 (FREE)Zero charge. Detailed status saved to dataset.

Pricing Examples:

  • 100 YouTube Videos (Transcripts only): 100 × $0.006 = $0.60
  • 10-Minute Video with AI Formatting: $0.006 (base) + 2 × $0.010 (cleanup) = $0.026 (2.6 cents)
  • 50 Videos with 10 Deleted: You are only billed for the 40 successful ones ($0.24). The 10 deleted videos cost $0.00.

💻 Developer API & Integrations

Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
# Run scraper on a channel handle
run = client.actor("t0b0t/youtube-transcript-scraper").call(
run_input={
"startUrls": ["https://www.youtube.com/@hubermanlab"],
"maxVideos": 25,
"outputFormats": ["plaintext", "chunks", "srt"],
"cleanTranscript": True,
}
)
# Fetch dataset items
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["hasTranscript"]:
print(f"[{item['videoId']}] {item['title']}")
print(item["textCleaned"][:250] + "...\n")

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('t0b0t/youtube-transcript-scraper').call({
startUrls: ['https://www.youtube.com/playlist?list=PLrAXtmErZgOdP_8GztsuKi9nrraNbKKp4'],
maxVideos: 50,
outputFormats: ['plaintext', 'vtt'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} transcripts successfully!`);

cURL

curl -X POST "https://api.apify.com/v2/acts/t0b0t~youtube-transcript-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": ["https://www.youtube.com/@Apify"],
"maxVideos": 10,
"outputFormats": ["plaintext", "srt"]
}'

🤖 RAG & Vector Search Integration (LangChain & LlamaIndex)

The chunks output format is designed specifically for Large Language Model retrieval pipelines:

  • Timestamp Citations: Each chunk contains startTime and endTime, so your AI chatbot can link directly to the exact second in the video (https://youtu.be/<id>?t=<startTime>).
  • Sliding Overlap Window: Balanced 1,200-character segments with 150-character overlaps ensure that thoughts and sentences spanning boundaries are never cut mid-idea.

❓ Frequently Asked Questions (FAQ)

How do I scrape an entire YouTube channel?

Simply paste the channel handle (e.g. @Veritasium or https://www.youtube.com/@Veritasium) into the startUrls array. The scraper automatically resolves the channel and crawls all available video uploads.

Can I extract transcripts from YouTube Shorts?

Yes! Standard URLs (youtube.com/watch?v=...), share links (youtu.be/...), and Shorts (youtube.com/shorts/...) are all recognized and processed seamlessly.

How does translation work?

Set the translateTo field to your desired two-letter ISO language code (e.g. es, de, fr, ja, zh). YouTube's automated translation engine translates the subtitle stream directly before export.

Why do other scrapers get blocked by YouTube?

YouTube enforces aggressive IP rate-limiting on its timedtext caption endpoints, immediately blocking standard datacenter IPs with HTTP 429 errors. This Actor runs an intelligent sticky residential proxy pool with automatic error retirement, ensuring 99%+ delivery reliability.

Yes. Transcripts and subtitles published on YouTube are publicly accessible information. This scraper operates in full compliance with public web scraping legal precedents by extracting publicly available caption tracks without bypassing paywalls or authentication.


💬 Support & Feature Requests

Have questions, need custom features, or want to report an issue? Check the Issues tab on the Actor page or reach out via Apify Console. We respond quickly!