---
title: "Put an earlier cut of a beat back."
method: POST
path: "/trailers/{jobId}/storyboard/restore-take"
tags: ["Trailer"]
---

# Put an earlier cut of a beat back.

`POST /trailers/{jobId}/storyboard/restore-take`

## Request

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

Puts one of a beat's earlier cuts back and re-selects the takes it was assembled from, so the finish delivers exactly what was restored. NOT metered and NOT confirmed: it renders nothing, and it is reversible — the cut it displaces joins the beat's list, so the same call with the other url undoes it. `url` must be a cut THIS BEAT played (read them from `storyboard/takes`); a url the beat never held is refused with a 400 rather than trusted. A complete trailer goes back to review. Returns `{ success, clipUrl, selection }`. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- TrailerRestoreTakeRequest: Put one of a beat's earlier cuts back. Free and reversible.
  - `beatIndex` integer, required: Zero-based index of the beat whose earlier cut to put back.
  - `url` string, required: The earlier cut's url, exactly as `storyboard/takes` returned it. A url this beat never played is refused.

## Response `200`

The cut now playing, and the takes re-selected.

- TrailerRestoreTakeAck: The cut now playing. Nothing was rendered and nothing was charged; the cut it replaced joined the beat's list, and the takes the restored cut was assembled from are selected again.
  - `success` boolean, required
  - `clipUrl` string, required: The cut now playing for that beat.
  - `selection` object[], nullable, required: The takes re-selected (one per call), so the finish delivers exactly what was restored. Null for a cut recorded without its selection.
    - `callId` string
    - `take` integer

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