---
title: "Lay a sound pass under the trailer's picture."
method: POST
path: "/trailers/{jobId}/storyboard/sound-pass"
tags: ["Trailer"]
---

# Lay a sound pass under the trailer's picture.

`POST /trailers/{jobId}/storyboard/sound-pass`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/trailers/{jobId}/storyboard/sound-pass`
- Auth: HTTP bearer

Lays a sound pass on the trailer's master in the background: an ambience bed under every beat it plays (one bed carried through beats in the same place) and the few spot effects its picture shows (a door, a mug set down, footsteps), designed from its sound map and placed on the timeline's sound-effect lane — each reused from the writer's sound bank or made. Every level is set against the film's dialogue (a bed about 12 dB under it, a spot about 5 dB under it), no spot lands inside a spoken line, a cue whose file came out too quiet, clipped or gappy is made again once, and the master is then re-stitched (by the score's own re-stitch when a score is still being composed). It designs around the sounds already placed and never removes one. A story film's first master gets one by itself. Free. Refused with a 409 while the cut has no master or a pass is already being laid. Read its progress with GET. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Response `200`

The pass is queued: `status` queued, its `requestId` and a `message`.

- object

## Other responses

- `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 trailer exists and the request is well-formed, but the trailer, its beat, its cast or its plates are not in a state that allows it (`trailer_state_invalid`), and nothing was reserved: a plan approved outside draft, a take chosen or a beat rendered outside review/complete, an export before the finish, a finish while a call has no selected take, a narrated cut with no narrator, a render the compile blocked, or a finish while the master failed its video coverage (`trailer_video_coverage_failed`, with `details.videoCoverage`). `details.refusal` is `{ code, action, fix }` (see TrailerRefusalDetails): `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 beat a blocked compile could not render. The identical request succeeds once the trailer 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/4534f5d25540?raw)
