ShepHouse Guides

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.

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.

Last tested: 2026-10-30. Corrections welcome via the Polar customer portal or the order page.