---
title: "Publish a held or preview episode."
method: POST
path: "/publishing-series/{seriesId}/show/episodes/{episodeId}/publish"
tags: ["Shows"]
---

# Publish a held or preview episode.

`POST /publishing-series/{seriesId}/show/episodes/{episodeId}/publish`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/publish`
- Auth: HTTP bearer

Publish a held or preview episode: it takes its release and episode number now, its description is written, its sources are credited in the show notes, and it goes to the feed. A preview claims its items as it publishes; one whose item already aired is refused (409 `show_item_already_aired`). A show an outside app makes is refused (409 `show_made_outside`). Takes `userConfirmed: true` after the creator agrees.

## Request body

- ShowConfirmRequest
  - `userConfirmed` boolean: Required after the user agrees.

## Response `200`

The episode, published.

- ShowEpisodeAction
  - `episode` ShowEpisode, required: One episode of the show: its kind (scheduled, extra, preview, external), how it stands (queued, making, published, held with why, preview, dropped, skipped with why, failed with why), the items it covers, what it cost, its audio once made, and its release once published.
    - `episodeId` string, required
    - `seriesId` string, required
    - `kind` 'scheduled' | 'extra' | 'preview' | 'external', required
    - `outcome` 'queued' | 'making' | 'published' | 'held' | 'preview' | 'dropped' | 'skipped' | 'failed', required
    - `outcomeLabel` string, required: How it stands, in the writer's words.
    - `title` string, nullable, required
    - `heldReason` 'review' | 'hard_line' | 'off_cast' | 'voice_pin_failed' | 'voice_effect_failed' | 'sounds_failed' | 'theme_failed' | 'show_turned_off' | 'shows_not_running', nullable, required
    - `skippedReason` 'no_material' | 'not_runnable' | 'not_ready' | 'cap_reached' | 'already_covered', nullable, required
    - `failureCode` string, nullable, required
    - `failureMessage` string, nullable, required
    - `itemId` string, nullable, required
    - `items` object[], required
      - `itemKey` string, required
      - `title` string, required
      - `author` string
      - `url` string
      - `publishedAt` string, date-time
    - `creditsSpent` integer, nullable, required
    - `wornPhrasingLines` integer, nullable, required: Spoken lines of the finished script in a worn-out shape ("it's not X, it's Y" in any form, "Not X. Not Y.", podcast filler): a measure of whether the writing holds the voice rules, never acted on. Null until counted.
    - `audioUrl` string, nullable, required
    - `artifactId` string, nullable, required
    - `releaseId` string, nullable, required: Set once published: the release in the feed.
    - `runId` string, nullable, required
    - `attempts` integer, required
    - `createdAt` string, date-time, required
    - `finishedAt` string, date-time, nullable, required
  - `note` string, required

## Other responses

- `400`: Request payload failed validation. The error message names the offending field.
- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: The named project or source does not exist or is owned by another account.
- `409`: Nothing was published: `show_made_outside` (an outside app makes this show and publishes it itself), `show_item_already_aired` (this preview covers an item the show already aired; `details.itemKeys`: drop it instead), or the release cannot be published as it stands (`publishing_release_state_invalid`, `publishing_asset_stale`).
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/4534f5d25540?raw)
