All guides

October 4, 2026 · 5 min read

How to Download All Transcripts from a YouTube Channel or Playlist

Researchers, course builders, and anyone building a search or RAG index over a channel eventually need every transcript, not one. Doing this by hand means opening each video. With the TranscriptYT API it is two calls: list the channel or playlist, then fetch the transcripts in batches.

Step 1: list every video (free)

GET /v1/playlist accepts a playlist URL or ID, a channel URL, a channel ID, or an @handle. It returns titles, video IDs, and durations, newest first for channels, up to 500 videos per call. Listing is free; it does not use credits.

curl "https://transcript-yt.com/v1/playlist?url=@veritasium&limit=200" \
  -H "Authorization: Bearer $TRANSCRIPTYT_KEY"

Step 2: fetch transcripts in batches of 50

POST /v1/transcripts takes up to 50 video URLs or IDs per request and runs them in parallel. Each result says whether it succeeded, so one unavailable video never fails the batch. You can pass the same options as the single-video endpoint, such as format, language, or translate_to.

Each transcript returned costs 1 credit, and failed videos cost nothing. On the Scale plan that works out to $1.58 per 1,000 transcripts.

import os, json, requests

API = "https://transcript-yt.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['TRANSCRIPTYT_KEY']}"}

videos = requests.get(f"{API}/playlist", params={"url": "@veritasium", "limit": 500},
                      headers=HEADERS, timeout=120).json()["videos"]
ids = [v["videoId"] for v in videos]

os.makedirs("transcripts", exist_ok=True)
for i in range(0, len(ids), 50):
    batch = requests.post(f"{API}/transcripts", json={"urls": ids[i:i + 50]},
                          headers=HEADERS, timeout=300).json()
    for item in batch["results"]:
        if item["ok"]:
            t = item["transcript"]
            with open(f"transcripts/{t['videoId']}.json", "w", encoding="utf-8") as f:
                json.dump(t, f, ensure_ascii=False)
        else:
            print("skipped", item["url"], item["error"]["code"])

Shortcut: pass the playlist directly

For up to 50 videos you can skip the listing step. Send a playlist or channel link as playlist instead of urls, and the API lists it and fetches the transcripts in one call. Use limit to cap how many videos it takes.

curl -X POST "https://transcript-yt.com/v1/transcripts" \
  -H "Authorization: Bearer $TRANSCRIPTYT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"playlist": "https://www.youtube.com/playlist?list=PLxxxxxxxx", "limit": 50, "format": "text"}'

Pick the right output format

Keep JSON if you plan to search or chunk the text later, because it keeps timestamps for every segment and lets you link back to the exact moment in a video. Use format=text for language-model input or reading, and srt or vtt if you are archiving subtitles. Every format costs the same credit.

Doing it without code

For a handful of videos, paste a playlist or channel link into the free transcript tool. It lists the videos so you can open each transcript. For a full archive, the API is the practical route, and n8n or Make can run the same two calls on a schedule without writing a script.

Try the TranscriptYT API

Get transcripts as JSON, text, SRT, or VTT. 100 free credits, no card required.

More guides