---
title: "Strike a bell on every beat of the pitch deck."
method: POST
path: "/pitch-decks/{jobId}/bell-lane"
tags: ["Pitch Deck"]
---

# Strike a bell on every beat of the pitch deck.

`POST /pitch-decks/{jobId}/bell-lane`

## Request

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

Strike ONE bell sound on every beat of the deck's bell beat grid, frame-exact, as one lane on its audio timeline — or change the lane. The sound is `assetId` (a My Library sound effect), `sound: { fromJobId }` (another deck's bell of the same project, exactly as it struck there: the same bell as v2), or `prompt` (words for one to be made with the sound-effect generator and banked in My Library; `label`, `durationSeconds`), or — on a change — the lane's own. `every` 1 (every beat, default) or 2 (every 2nd beat); `fromSeconds`/`toSeconds` in seconds of the master (null: its first/last frame, the default); `skipSceneIndexes` the parts it stays out of (black interludes, chapters, the title sequence); `accent` (the intros and the title louder, default true); `level` 0–1 (0.12: every bell is struck levelled to a -1 dBFS peak, and 0.12 sits a few dB under a laid score); `duckUnderVoice` (default true: it ducks under the spoken lines like the score). Fields left out keep the lane's; an unknown field is refused by name. Free: nothing is rendered again — a deck in review or finished re-stitches its master for its sound (`reassembling`), a sketch waiting for its master is mixed again with the bell (`sketchRemixing`), and a score to picture composed with a lane leaves room for the struck bell (no bell of its own, nothing on the downbeat). Refused with a 409 when the deck has no bell beat grid. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `assetId` string: A My Library sound effect to strike.
  - `sound` object: Or another deck's bell of the same project ("the same bell as v2"), exactly as it struck there, levelled into this deck. Only the sound; this deck's timing stays. GET /story-projects/{projectId}/sounds lists them.
    - `fromJobId` string, required: A deck of the same project whose bell to strike here.
  - `prompt` string: Or words for the bell to be made from (one sound effect, banked in My Library).
  - `label` string: The made bell's name.
  - `durationSeconds` number: The made bell's length in seconds (5 when left out).
  - `every` 1 | 2: 1: every beat (default). 2: every 2nd beat.
  - `fromSeconds` number, nullable: Where it starts, in seconds of the master; null for its first frame.
  - `toSeconds` number, nullable: Where it stops (inclusive), in seconds of the master; null for its last frame.
  - `skipSceneIndexes` number[]: The parts it stays out of, by the `sceneIndex` the read lists in `parts`.
  - `accent` boolean: Accent the strike on each intro and on the title (default true).
  - `level` number: Level 0..1 (0.12 by default) on a bell levelled to a -1 dBFS peak.
  - `duckUnderVoice` boolean: Duck under the spoken lines like the score (default true).

## Response `200`

The bell lane as set, and whether the master is re-stitched and the sketch mixed again.

- object

## 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`: The pitch deck exists and the request is well-formed, but the deck, its chapter, its cast or its plates are not in a state that allows it (`pitch_deck_state_invalid`), and nothing was reserved: a plan approved outside draft, a take chosen, a chapter edited or rendered outside review/complete, an export before the finish, a finish while a call has no selected take or a footage chapter has not rendered, a text-only chapter asked for footage, a changed chapter asked for one call, a delivery class changed mid-pass, a render the compile blocked, or a finish while the master failed its video coverage (`pitch_deck_video_coverage_failed`, with `details.videoCoverage`). `details.refusal` is `{ code, action, fix }` (see PitchDeckRefusalDetails): `action` is what unblocks it — `recast_figure`, `add_signature_items`, `recast_voice` or `remake_location_plate` — and `fix` names the MCP tool and CLI command that take it; `details.blocked[]` lists every chapter a blocked compile could not render. The identical request succeeds once the deck is put right.
- `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/86e084144cef?raw)
