---
title: "Get an episode"
method: GET
path: "/v1/episodes/{episode_id}"
tags: ["Episodes"]
---

# Get an episode

`GET /v1/episodes/{episode_id}`

## Request

- Base URL: `https://api.jellypod.com`
- URL: `https://api.jellypod.com/v1/episodes/{episode_id}`
- Auth: HTTP bearer

## Path parameters

- `episode_id` string, uuid, required: Episode UUID

## Response `200`

Episode with its progress. While `progress.poll_after_seconds` is above zero, the `Retry-After` header carries the same wait.

- object
  - `data` EpisodeDetail, required: A podcast episode with publishing metadata, audio/video URLs when available, and its production progress.
    - `audio_url` string, nullable, required
    - `created_at` string, required
    - `description` string, nullable, required
    - `generation` object, nullable, required
      - `completed_at` string, nullable, required
      - `error_message` string
      - `started_at` string, required
      - `state` 'generating' | 'completed' | 'failed', required
      - `skipped_sources` object[]
        - `id` string, required
        - `title` string, nullable, required
        - `url` string, nullable, required
        - `reason` string, required
    - `host_ids` string[], nullable, required
    - `id` string, uuid, required
    - `image_url` string, nullable, required
    - `podcast_id` string, uuid, required
    - `published_at` string, nullable, required
    - `scheduled_at` string, nullable, required
    - `source_ids` string[], required
    - `status` 'draft' | 'published' | 'scheduled', required: Lifecycle state stored on the episode row. Generation progress is reported separately on the `generation` field, `generating`/`completed`/`failed` are not `status` values.
    - `title` string, nullable, required
    - `updated_at` string, required
    - `url` string, nullable, required
    - `video_url` string, nullable, required
    - `progress` EpisodeProgress, required: Where the episode stands across generation and rendering. MCP `get_content` reports the same progress.
      - `error` string, nullable, required: Why generation or rendering failed, when it did.
      - `phase` string, nullable, required: The work still in flight, such as `rendering` or `finalizing_outputs`. Null once the episode is idle, completed, or failed.
      - `poll_after_seconds` number, required: Seconds to wait before reading the episode again. Zero means it will not change on its own.
      - `status` 'idle' | 'generating' | 'completed' | 'failed', required: Whether the episode and its audio and video are still being produced. `completed` means its outputs are ready.

## Other responses

- `400`: Validation failed or malformed request.
- `401`: Missing or invalid API key.
- `403`: Authenticated, but this API key does not have access to this resource.
- `404`: Resource not found.
- `429`: Rate limit exceeded. Response includes `Retry-After`, `RateLimit`, and `RateLimit-Policy` headers (IETF draft).
- `500`: Internal server error.

---

[API](https://skmtc.dev/jellypod/apis/jellypod-api.md) · [All operations](https://skmtc.dev/jellypod/apis/jellypod-api/llms.txt) · [OpenAPI document](https://skmtc.dev/jellypod/apis/jellypod-api/revisions/ba945de68cf7?raw)
