Disclosure: ShepHouse is an AI-operated software studio with a human owner. An AI agent wrote these guides and ran every code sample. We sell one of the hosted options mentioned below (a paid Apify Actor). Free options come first.
Download transcripts for a whole YouTube playlist or channel
Published by ShepHouse, an AI-operated venture. This guide was written with AI assistance. Some links go to ShepHouse's own paid products, and those are labeled.
Short answer: on your own computer, yt-dlp gets a whole playlist's captions for free with one command. In Python, list the video IDs and loop youtube-transcript-api. If the job runs on a server (where YouTube often blocks caption requests) or you need hundreds of videos as clean JSON, use a hosted scraper and pay per transcript.
Option 1: yt-dlp (free, command line)
pip install -U yt-dlp
# All English captions (manual or auto-generated) for every video in a playlist, no video download:
yt-dlp --skip-download --write-subs --write-auto-subs --sub-langs "en.*" --sub-format vtt \
-o "%(playlist_index)03d-%(id)s.%(ext)s" "https://www.youtube.com/playlist?list=PLAYLIST_ID"
# A whole channel works the same way:
yt-dlp --skip-download --write-auto-subs --sub-langs "en.*" "https://www.youtube.com/@CHANNEL/videos"
You get one .vtt file per video. To turn VTT into plain text, strip the timestamp lines, or convert to SRT with --convert-subs srt.
Limits: auto-generated VTT repeats lines (rolling captions), so dedupe before feeding an LLM. Large channels from cloud IPs hit "Sign in to confirm you're not a bot" (see our fix guide).
Option 2: Python with youtube-transcript-api (free)
# pip install youtube-transcript-api yt-dlp
import json, subprocess
from youtube_transcript_api import YouTubeTranscriptApi
playlist = "https://www.youtube.com/playlist?list=PLAYLIST_ID"
ids = subprocess.run(["yt-dlp", "--flat-playlist", "--print", "id", playlist],
capture_output=True, text=True, check=True).stdout.split()
api = YouTubeTranscriptApi()
out = {}
for vid in ids:
try:
t = api.fetch(vid, languages=["en"])
out[vid] = " ".join(s.text for s in t)
except Exception as e: # no captions, private video, or blocked
out[vid] = f"ERROR: {type(e).__name__}"
json.dump(out, open("transcripts.json", "w"), indent=1)
Limits: from AWS, GCP, Azure or GitHub Actions this usually fails with RequestBlocked/IpBlocked. Here's why and every fix.
Option 3: shephouse-yt (same interface, works on servers)
shephouse-yt is ShepHouse's open-source (MIT) Python client. It keeps a fetch()-style interface but runs the fetch on Apify, so it works from cloud servers and CI. You need a free Apify account. Delivered transcripts cost $0.0025 each, billed by Apify, and failed videos are free. There's also an MCP server, shephouse-yt-mcp, for Claude, Cursor and other AI agents.
Option 4: Hosted bulk scraper (no code)
The ShepHouse YouTube Transcript Scraper on Apify (a paid ShepHouse product) takes video, playlist, channel or search URLs. It returns one row per video with plain text, timestamped segments, SRT, VTT, chapters and an approximate token count. Export as JSON, CSV or Excel.
- Price: $0.0025 per delivered transcript. No start fee. Videos without captions, private videos and blocked requests are free. A 200-video playlist costs at most $0.50.
- Apify's free plan includes monthly credit, which is usually enough to try it on a playlist.
Which should I use?
| Situation | Best option | Cost |
|---|---|---|
| One-off playlist on your laptop | yt-dlp | Free |
| Python script on your laptop | youtube-transcript-api | Free |
| Script on a server, CI or cloud function | shephouse-yt or another hosted API | ~$0.0025 per video |
| No code, spreadsheet output, hundreds of videos | Hosted scraper | ~$0.0025 per video |
| You want a searchable, cited knowledge base | RAG Starter Kit (paid ShepHouse product, $29) | One-time |
What's next: chat with the transcripts
Once you have the transcripts, chunk them by timestamp, embed them, and answer questions with links back to the exact second. The YouTube Transcript → RAG Starter Kit is a paid ShepHouse product that does this end to end in Python.