---
title: "Override the repair engine on one take of a beat's call."
method: POST
path: "/trailers/{jobId}/beats/{beatIndex}/take-repair-override"
tags: ["Trailer"]
---

# Override the repair engine on one take of a beat's call.

`POST /trailers/{jobId}/beats/{beatIndex}/take-repair-override`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/trailers/{jobId}/beats/{beatIndex}/take-repair-override`
- Auth: HTTP bearer

NOT metered and NOT confirmed: free. `decision: keep` keeps the take as it is — what was found on it no longer ranks it down or warns, and the engine never acts on it; `decision: restore` lets the engine's decision stand again (both reversible). The call's default selection re-runs unless the writer chose its take explicitly, and the cut re-assembles when the take it plays changed. `decision: rewatch` watches again, at our cost, a take whose watch could not finish (its decision `unwatched`: never clean, never remedied on its own) — its checks are queued, it reads checks pending until the watch lands, and a take already watched is refused (409). Review or complete only. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- TakeRepairOverrideRequest: Override the repair engine on one take. Free.
  - `callId` string, required
  - `take` integer, required
  - `decision` 'keep' | 'restore' | 'rewatch', required: `keep`: keep the take as it is (what was found no longer ranks it down or warns, and the engine never acts on it); `restore`: the engine's decision stands again; `rewatch`: watch a take that could not be watched (its decision `unwatched`) again, at our cost — it reads checks pending until the watch lands, then is decided like any take. A take already watched is refused (`take_already_watched`).

## Response `200`

The override, the take's decision after it, and the take the call plays now.

- TakeRepairOverrideAck: The override is recorded. Nothing was rendered or charged; the cut re-assembles when its selection changed. A `rewatch` queues the take's watch (`repair` is null until it lands).
  - `jobId` string, required
  - `callId` string, required
  - `take` integer, required
  - `decision` 'keep' | 'restore' | 'rewatch', required
  - `repair` TakeRepairDecision, required: What the repair engine decided for one take, and why. Every rendered take is watched with its sound after its checks. A cut nobody asked for at the start or end of an otherwise good take is trimmed off first, before any new take: free, frame for frame, only where the cut is measured in the file, outside every spoken line (each kept whole with a breath after it), and only when what is left keeps its chapter or beat within a quarter of its planned length. When the shot's automatic new take is spent and the take it plays still has such a cut outside its line, that end is trimmed as a last resort: past the quarter, as long as the line stays whole, at least 2 seconds are left and the chapter or beat keeps half its planned length. A cut inside a spoken line is never trimmed. A speaker whose lips keep moving past the take's last line, where nothing is heard, is trimmed half a second after the line, free and frame for frame. Lips moving where no line is heard are never retaken on their own: the same staging brings them back, so the shot is offered for restaging (one face, framed closer), a trim, or your call. Any other defect is remedied by rule during processing, at our cost: first a new take told what to avoid; a repair in place when the same problem comes back after a new take, or when the take passed every other check and only something removable (a period anachronism, garbled lettering, a stray or doubled person) or the light is wrong. Camera movement and its speed (a move that rushes, or dies into a hold at the end), timing, cuts and a crowd moving as one (extras in step, everyone turning or looking down at once, repeated faces) are only ever fixed by a new take, or by the free trim when they sit only at an end of the take. A made-up screen or app the shot never had (a display or app window painted into the picture where none was filmed) is only ever fixed by a new take, or by the free trim when it sits only at an end of the take; spoken shots are not repaired in place. A line the speaker's mouth did not speak on two takes is no longer retaken on camera: the next take stages it as a voice-over, the speaker seen from behind, the line heard over the picture. Every take plays its own sound under its own picture, so the lips follow what is heard: a line said in the take's own reading is kept, and only a line not heard, or said in a voice too like another character's, is a defect (a new take). Where a speaker's mouth cannot be measured (or the face is too small to trust a miss), the watcher's own judgment of the lips decides the line: a mouth it saw not speak is a miss, one it saw speak is uncertain. Each shot gets at most one automatic new take, one automatic repair in place and one automatic voice-over re-stage, so a new take whose removable defect came back is repaired in the same pass; a repaired or trimmed take is never remedied again on its own. A repair that fails on the repair service's own side (never one declined at its content check) and cost nothing is sent again once; if that fails too, a new take instead. A repaired take keeps the take's own sound, is judged again, and is kept as a new take linked to the one it repairs; it plays only when it passes. A trimmed take plays over the take it came from when it passes, or when it shows only part of what that take showed, with the same speech and faces: it is judged by time window, so anything seen inside the span it keeps counts as that take's own footage too, and it wins when the trim cut something off.
    - `remedy` 'none' | 'wan_retake' | 'aleph_repair' | 'trim' | 'stage_as_voice_over', required: `none`; `trim`: a cut nobody asked for at the start or end of the take is cut off (free, frame for frame, never into a spoken line; see `trim`); `wan_retake`: a new take, told what to avoid; `stage_as_voice_over`: a new take that plays a line whose speaker's lips failed it on two takes as a voice-over (see `voiceOver`); `aleph_repair`: a repair in place.
    - `rule` 'not_judged' | 'clean' | 'writer_kept' | 'first_remedy_is_a_new_take' | 'recurred_after_new_take' | 'clean_but_removable' | 'needs_a_new_render' | 'spoken_shot_held_from_repair' | 'repair_refused_before' | 'repair_unavailable' | 'writer_requested' | 'trim_edge' | 'writer_trimmed' | 'repair_failed_at_host' | 'line_revoiced_twice' | 'mouth_failed_twice' | 'writer_staged_voice_over' | 'trim_last_resort' | 'trim_overrun' | 'unwatched', required: The rule that fired. `unwatched`: the take's watch could not finish, so nothing is decided for it (never `clean`, never a remedy on its own); `defects` lists what its other checks measured, and `take-repair-override` with `decision: rewatch` watches it again, free.
    - `reason` string, required: The rule in plain words, with what was found.
    - `defects` TakeDefect[], required
      - `kind` 'anachronism' | 'signage' | 'stray_person' | 'duplicate_person' | 'crowd_unison' | 'lighting' | 'camera_path' | 'speed_ramp' | 'timing' | 'invented_cut' | 'drawn_screen' | 'identity' | 'identity_swap' | 'lip_sync' | 'line_voice' | 'other', required
      - `source` 'watcher' | 'playthrough' | 'mouths' | 'duplicates' | 'opening' | 'dissolves', required: `watcher`: the take watcher saw it; the others are the checks that measured it.
      - `severity` 'minor' | 'major' | 'critical', required: `minor` is shown and never acted on; `major` and `critical` earn a remedy.
      - `startSeconds` number, required: Seconds from the start of the take.
      - `endSeconds` number, required
      - `description` string, required
      - `removableInPlace` boolean, required: True when it can be removed or replaced in place without a new take.
      - `replaceWith` string, nullable: For a removable defect: what should be there instead, in plain words (never a word to write).
    - `automatic` boolean, required: True when the engine applied (or applies) it on its own, at our cost.
    - `heldBy` 'one_remedy_per_pass' | 'new_take_budget_spent' | 'repair_budget_spent' | 'spend_gate' | 'next_take_is_the_writers' | 'writer_overrode' | 'failed_repair_billed' | 'voice_over_budget_spent' | 'restage_needed' | 'null', nullable, required: Why it was not applied automatically: it is offered to the writer instead.
    - `outcome` 'applied' | 'offered' | 'failed' | 'refused' | 'pending' | 'none', required: `refused` only when the repair was declined at the content check (never sent again unchanged).
    - `resultTake` integer, nullable, required: The take the remedy made, once it exists.
    - `outcomeMessage` string, nullable, required
    - `decidedAt` string, date-time, required
    - `trim` TakeTrimPlan: A trim: the span of the take that is kept (frame-exact) and what was cut off at each end.
      - `keepStartSeconds` number, required
      - `keepEndSeconds` number, required
      - `keptSeconds` number, required: The kept span's length: what the trimmed take plays in its cut.
      - `takeSeconds` number, required: The take's length before the trim.
      - `edges` TakeTrimEdge[], required
        - `edge` 'head' | 'tail', required
        - `transition` 'cut' | 'dissolve' | 'settle' | 'writer', required: `cut`: a hard cut (one frame, or a few the render smeared it over); `dissolve`: a blend over several frames, cut at its first blended frame; `settle`: the camera's move dying into a hold at the end, cut at the hold's first frame (nothing is slowed or padded); `writer`: the writer's own span (nothing measured).
        - `transitionStartSeconds` number, required
        - `transitionEndSeconds` number, required
      - `basis` 'outside_the_line' | 'dying_move' | 'last_resort_after_retakes' | 'speaker_overrun', nullable: Why the engine trimmed it, recorded with the take's checks: `outside_the_line` ("invented edge cut trimmed: outside the line": the free trim before any new take, the invented edge cut lying outside every spoken line and the chapter or beat kept within a quarter of its plan), `dying_move` ("camera move dying into a hold trimmed: outside the line": the same free trim of a camera move that dies into a hold at the end, cut at the hold's first frame, never slowed or padded) or `last_resort_after_retakes` ("invented edge cut trimmed: last resort after retakes": the shot's automatic new take was spent, so the take it plays was trimmed past the quarter, the line kept whole, at least 2 s left, the chapter or beat at least half its plan). Null for the writer's own trim.
      - `droppedLineRefs` integer[], nullable: The lines this trim cut OUT of the take (the writer cut the chapter's line out and kept the rest of its footage): the span kept is one side of them. Null for every other trim, which keeps every line whole.
    - `voiceOver` TakeVoiceOver: Lines a take plays as a VOICE-OVER that its call says on camera: the speaker seen from behind, the line heard over the picture.
      - `lineRefs` integer[], required
      - `speakers` string[], required
  - `selectedTake` integer, nullable, required: The take the call plays now.
  - `message` string, required: What happened, in the writer's words.

## 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 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/86e084144cef?raw)
