---
title: "Create a presentation and put its slides up now"
method: POST
path: "/v1/presentations"
tags: ["Publish"]
---

# Create a presentation and put its slides up now

`POST /v1/presentations`

## Request

- Base URL: `https://bisque.today`
- URL: `https://bisque.today/v1/presentations`
- Auth: HTTP bearer

Start a creation: send the HTML and the assets, and the slides are viewable at the returned `webUrl` straight away — silent until narration arrives. The response names the slides that still need narrating (`needsAudio`) and the ones whose audio carried forward from last time (`reused`), with an upload target for each asset and each slide. Narrate each slide with the `bisque-voice` CLI, PUT the MP3 to its target, then PATCH the slide. While the creation is open it can take more slides (`PATCH /v1/presentations/{presentationId}`): the presentation document carries `live: { revision, startedAt }`, `revision` rises on every append, and the watch page appends the new slides in place. API-key callers only.

## Headers

- `Idempotency-Key` string

## Request body

- PublishNarratedRequest
  - `indexHtml` string, required: The whole `html-presentation/v1` file.
  - `title` string: Overrides the title parsed from the HTML.
  - `slug` string: URL slug under your channel. Reuse it to republish.
  - `presentationId` string: Republish an existing presentation by id instead of slug.
  - `handle` string: Which of your channels to publish on; defaults to your account's.
  - `dryRun` boolean: Sandbox: run every check a real create runs (format, slug and org conflicts, tier cap, credit preflight) and write nothing. The reply is a 200 with status `validated`.
  - `visibility` 'public' | 'unlisted' | 'private' | 'org': Who can open the watch link. Unlisted unless you say otherwise; `org` publishes into the bisque.team organization named by `org`.
  - `org` string: bisque.team organization slug; publishes into the company space.
  - `contextMd` string: Agent-facing background shipped with the bundle as `context.md`.
  - `designMd` string: Design notes shipped with the bundle.
  - `voiceId` string: Narration voice tag; defaults to the account's saved voice.
  - `madeWith` string[]: Models credited with making this presentation — e.g. ["Claude Opus 5", "Kokoro af_heart"]. Free text, shown to viewers in the watch page's ⋯ menu. Omit to keep what a previous publish recorded; send `[]` to clear it.
  - `description` string: Plain-text description shown under the player on the watch page, with web URLs linked — a summary, then the sources. Omit to keep what a previous publish sent; send an empty string to clear it.
  - `speechSpeed` number: Narration speed. 1.0 is normal.
  - `voiceStability` number: How closely the voice keeps to its reference, for voices that take it. Omit for the voice's default.
  - `assets` object: Page assets (fonts, images) keyed by bundle path.

## Response `200`

The creation is open and the slides are live.

- object

## Other responses

- `401`: Missing or invalid credential.

---

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