---
title: "One full episode"
method: GET
path: "/api/v1/episodes/{slug}"
---

# One full episode

`GET /api/v1/episodes/{slug}`

## Request

- Base URL: `https://bidclub.ai`
- URL: `https://bidclub.ai/api/v1/episodes/{slug}`
- Auth: none declared

Editorial Markdown, transcript, alternate-language fields, and provenance. This is the correct route for bulk or automated content access — responses are CDN-cached with a configured shared-cache lifetime of 60 seconds and no stale-while-revalidate. Conditional-response validators are not guaranteed.

## Path parameters

- `slug` string, required

## Response `200`

The episode record.

- Episode
  - `slug` string, required: Stable public identifier.
  - `show_id` string, required: Foreign key into /api/v1/shows.
  - `title` string, required: Complete canonical publisher title.
  - `display_title` string, nullable: Feed-only compression of an overlength title; null when unneeded.
  - `title_orig` string, nullable: Source-platform title when it differs.
  - `dek` string, nullable: One-line editorial standfirst.
  - `lang` 'EN' | 'ZH' | 'null', nullable: Language of the primary editorial fields.
  - `date` string, nullable: Publication calendar date, YYYY-MM-DD.
  - `published_at` string, nullable: Exact publication timestamp (RFC 3339); null for date-only archives.
  - `duration_min` number, nullable: Episode length in minutes.
  - `source_url` string, nullable
  - `source_label` string, nullable
  - `rss_url` string, nullable
  - `youtube_id` string, nullable
  - `youtube_url` string, nullable
  - `provenance` array[]: Ordered [stage, tool] pairs recording how the episode was produced.
    - string[]
  - `chips` string[]: Participant tags, each prefixed "person:" (e.g. "person:Jensen Huang").
  - `tag_assets` string[]: Zero to two closed asset taxonomy ids, primary first. Empty is valid even after classification.
  - `tag_sectors` string[]: Zero to two closed sector taxonomy ids, primary first. Empty is valid even after classification.
  - `tag_focus` string[]: Zero to two closed editorial-focus taxonomy ids, primary first. Empty is valid even after classification.
  - `tagging_status` 'pending' | 'classified' | 'failed' | 'skipped': Classification state. Non-classified episodes have empty tag arrays; classified does not require a tag in every facet.
  - `tagging_version` string, nullable: Taxonomy version used for classification; nonblank when tagging_status is classified, otherwise it may be null.
  - `thumbnail_url` string, nullable
  - `title_alt` string, nullable: Title in the alternate language (lang_alt).
  - `display_title_alt` string, nullable
  - `dek_alt` string, nullable
  - `lang_alt` 'EN' | 'ZH' | 'null', nullable: Language of every *_alt field.
  - `tldr_md` string, nullable: TL;DR bullets as Markdown.
  - `digest_md` string, nullable: Structured digest as Markdown.
  - `transcript_md` string, nullable: Full speaker-attributed transcript.
  - `tldr_md_alt` string, nullable
  - `digest_md_alt` string, nullable
  - `shows` object, nullable
    - `name` string
    - `hosts` string, nullable

## Other responses

- `404`: No published episode with that slug. Body: {"error": "not found"}.
- `502`: Upstream database unavailable. Body: {"error": "upstream unavailable"}.

---

[API](https://skmtc.dev/bidclub/apis/bidclub-open-podcast-transcript-api.md) · [All operations](https://skmtc.dev/bidclub/apis/bidclub-open-podcast-transcript-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bidclub/apis/bidclub-open-podcast-transcript-api/revisions/a097c20ae335?raw)
