---
title: "Publish a finished pitch deck: its share link goes live."
method: POST
path: "/pitch-decks/{jobId}/publish"
tags: ["Pitch Deck"]
---

# Publish a finished pitch deck: its share link goes live.

`POST /pitch-decks/{jobId}/publish`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/pitch-decks/{jobId}/publish`
- Auth: HTTP bearer

Publish a finished deck: its share link goes live at the writer's public slug. ONLY A `complete` DECK PUBLISHES — a draft or a deck in review is refused and nothing is written. The deck's page is screened for outbound safety first (a held account publishes nothing). A share token is minted when the deck has none, and a master that is missing, idle, stale or failed is re-stitched. NOT metered and NOT confirmed. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Response `200`

The published deck: its full share link (relay it verbatim), share token, writer slug and master state.

- PitchDeckPublish: A published deck: its full share link (relay it verbatim), its share token and slug, and the master's state after publishing.
  - `shareToken` string, required: The deck's share token — the `t` in its public share link. `shareUrl` is the same link already assembled; use it, not this.
  - `writerSlug` string, required: The writer's public slug, where the shared deck lives.
  - `shareUrl` string, required: The deck's full public share link, built server-side. Give it to the user verbatim — never rebuild it from the token and slug.
  - `renderedVideoStatus` string, required: The master's state after publishing: a missing, idle, stale or failed master is re-stitched.
  - `pdfStatus` string, nullable, required: The deck's PDF state, unchanged by publishing.

## 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.
- `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)
