Skip to content

Podcast transcript dataset: build one from the shows you choose

Every episode of the shows you care about, as a folder of Markdown files you can search and ask questions of.

Last updated October 2026

A podcast transcript dataset is a set of episode transcripts with enough metadata to tell them apart: show, episode, date, and who is speaking. The public research sets are fixed snapshots, mostly machine transcription with no speaker names. If you need particular shows, current episodes, or real names on the turns, you build your own.

With Spoken that is a loop over two calls. One lists every episode of a show that has a transcript, for free. The other returns an episode as Markdown with named speakers and timestamps, for one credit.

Most people who do this are not training a model. They want the back catalogue of a few shows in a knowledge base, so they can search it, quote from it, and put it in front of an AI model.

"I used Spoken to add every My First Million episode to my knowledge base, with a cron to pull new ones. Now I can enjoy the podcast on a run, then chat with Claude about it later — every episode saved and accessible in my Claude sessions."
Marcus Taylor

Check these three things first

  • Text or audio? Spoken returns text only. A speech-recognition training set needs the recordings.
  • Which shows? Spoken has transcripts for shows that publish them: most popular shows in English and several other European languages, and few small ones. Search tells you per show, for free.
  • A file today, or a loop? There is no dump to download. The loop below is the way in.

The four calls

  1. 1

    Pick shows

    Search by name. Each result carries the show's id.

    GET /search?q=
  2. 2

    List episodes

    Every episode with a transcript. Free.

    GET /podcasts/{id}/episodes
  3. 3

    Fetch text

    Markdown per episode. One credit, first fetch only.

    GET /transcripts/{id}
  4. 4

    Stay current

    What those shows published since. Free.

    GET /new

What one record looks like

The episode list gives you the metadata as JSON, so you never have to parse it out of the document.

transcripts/1545953110/1000651996090.md
**Matthew Walker** (6:25)
Yeah, I think we, many of us can resonate with the idea of dental hygiene,
but turns out there's something called sleep hygiene. …

**Andrew Huberman** (12:18)
There are a couple of quick points that are based on some what I consider
really nice studies. …
manifest.jsonl
{"id": "1000651996090", "podcast_id": "1545953110", "podcast": "Huberman Lab", "title": "GUEST SERIES | Dr. Matt Walker: Protocols to Improve Your Sleep", "date": "2024-04-10T08:00:00Z", "path": "transcripts/1545953110/1000651996090.md"}

Every speaker turn starts with a bold name and a timestamp, which makes three things cheap later: splitting into chunks on turn boundaries, filtering by speaker, and citing a moment in the audio. Where a speaker cannot be identified from the episode, the label stays generic instead of guessing.

The loop, in Python

Files already on disk are skipped, so you can stop it, add a show, or top up credits and run it again.

import json, pathlib, time, requests

API = "https://spoken.md"
HEADERS = {"x-api-key": "YOUR_KEY"}
SHOWS = ["huberman lab", "acquired", "odd lots"]

root = pathlib.Path("transcripts")
manifest = open("manifest.jsonl", "a", encoding="utf-8")

for name in SHOWS:
    hit = requests.get(f"{API}/search", params={"q": name}, headers=HEADERS).json()["results"][0]
    show = requests.get(f"{API}/podcasts/{hit['podcastId']}/episodes", headers=HEADERS).json()
    folder = root / show["podcast_id"]
    folder.mkdir(parents=True, exist_ok=True)

    for ep in show["episodes"]:
        path = folder / f"{ep['id']}.md"
        if path.exists():
            continue
        r = requests.get(f"{API}/transcripts/{ep['id']}", headers=HEADERS)
        if r.status_code == 402:      # out of credits: top up, then re-run
            raise SystemExit("out of credits")
        if not r.ok:                   # 404 or 502: nothing was charged
            continue
        path.write_text(r.text, encoding="utf-8")
        manifest.write(json.dumps({**ep, "podcast_id": show["podcast_id"],
                                   "podcast": show["podcast"], "path": str(path)}) + "\n")
        time.sleep(0.34)               # about 3 requests a second

Check the first search result is the show you meant before a long run; the show's id is stable, so you can also hard-code ids once you have them. The count field of the episode list tells you how many credits a show needs before you spend any.

What it costs

Dataset sizePricePer episode
100 episodes$15$0.15
500 episodes$50$0.10
2,000 episodes$160$0.08

Searching and listing are free, so sizing a dataset costs nothing. A credit is spent on the first successful fetch of an episode and never again for that episode. Errors are not charged. Credits don't expire, and prices exclude VAT. For runs above 10,000 episodes, write to support@spoken.md first.

Keeping it current

A dataset of living shows goes stale every week. Once a key has fetched from a show, GET /new lists that show's episodes released since the newest one you have, with a transcript URL for each. Polling it is free. A daily job that calls /new and fetches what it lists is the whole update process, and you don't have to track which episodes you already hold.

curl -H "x-api-key: YOUR_KEY" https://spoken.md/new

What you may do with it

Keep what you fetch for as long as you like, in a private or internal archive, a knowledge base or a vector store. Search it, analyse it, summarise it, and quote from it in what you build and show your own users.

Two things are off the table: redistributing the raw transcripts as a dataset of your own, and using them to build or train a competing transcript or podcast-data API. The terms have the exact wording. The podcasts belong to their publishers, so the copyright questions around your use are yours to check.

FAQ

Is there a downloadable podcast transcript dataset?

A few research datasets of podcast transcripts exist, and they are fixed snapshots, mostly machine transcription without speaker names. Spoken is not a download: you choose the shows, and Spoken's API returns each episode's transcript as Markdown with named speakers and timestamps, so the dataset you end up with covers exactly what you need and stays current.

How much does a podcast transcript dataset cost to build?

With Spoken, one episode is one credit. 100 credits cost $15, 500 cost $50 and 2,000 cost $160, so a dataset of 2,000 episodes costs $160. Listing a show's episodes is free, credits never expire, and an episode that has no transcript is never charged.

What format are the transcripts in?

Spoken returns each transcript as Markdown: one block per speaker turn, with the speaker's name in bold and a timestamp in parentheses. The episode's id, title, show and release date come from the episode list as JSON, so you can keep them beside the text as metadata.

Can I use the transcripts to train or fine-tune a model?

Spoken's terms let you keep the transcripts you fetch in a private or internal archive, a knowledge base or a vector store, and analyse, summarise and quote them. They do not let you redistribute raw transcripts as a standalone dataset, or use them to build or train a competing transcript or podcast-data API. The podcasts themselves belong to their publishers, so check that your use fits copyright and fair-use rules where you are.

How do I keep the dataset up to date?

Spoken's /new endpoint lists the episodes that the shows you fetch from have published since your last fetch, for free, as JSON or as an Atom feed. Run it on a schedule and fetch the ids it returns.

Which languages are covered?

Spoken's coverage is broadest for English, German, French, Spanish, Italian, Portuguese, Dutch and Swedish. Transcripts come back in the episode's own language. If Spoken's search finds a show's episodes, they are fetchable.

TL;DR: For a dataset of named, timestamped transcripts from shows you choose, list each show's episodes, fetch each one once, and keep a manifest beside the files. Budget $0.08 to $0.15 an episode.

Thousands of transcripts fetched by developers building summarizers, RAG pipelines, and podcast tools

No signup needed to try it: the key pt_demo lists any show and fetches the demo episode.

Price my show's archive

Next: RAG over podcasts · llms.txt

Read next