---
title: "Choose the trailer's shots to blur."
method: POST
path: "/trailers/{jobId}/motion-blur"
tags: ["Trailer"]
---

# Choose the trailer's shots to blur.

`POST /trailers/{jobId}/motion-blur`

## Request

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

Sets which shots are blurred: `{ units: [{ unit, shots? }], strength?, off? }` — `unit` is the beat's `beatIndex`, `shots` its shot numbers from the read, `moving` (the default: every shot where nobody speaks on camera) or `[]` to clear it; beats not listed keep their choice; `off: true` clears every choice. Refused (400, one sentence naming the fix): a beat with no cut, a shot number it does not have, a choice over 300 seconds. Motion blur makes chosen shots move like film: what moves in them blurs the way a camera's shutter blurs it, while still frames, faces held in frame and straight edges stay sharp. It is chosen per shot (or per chapter or beat: its moving shots, never a shot where someone speaks on camera unless that shot is named), at one of two strengths (standard, subtle; standard by default). It is free, up to 300 seconds of blurred picture per deck or trailer, and it is laid when the master is assembled, before the film finish. The sound and timing are never touched. Allowed in any state: before a master the choice is kept for the first assembly; in review, finishing or complete the master is assembled again with it (`reassembling`). Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- MotionBlurSetRequest: The units to set (units not listed keep their choice), a strength, or `off: true` to clear every choice.
  - `units` object[]
    - `unit` integer, required: The chapter's `chapterIndex` / the beat's `beatIndex`.
    - `shots` union: Shot numbers from the read; `moving` (the default: every shot where nobody speaks on camera); `[]` clears the unit.
      - integer[]
      - 'moving'
  - `strength` 'standard' | 'subtle'
  - `off` boolean

## Response `200`

The motion blur now in force.

- MotionBlurSetAck: Motion blur makes chosen shots move like film: what moves in them blurs the way a camera's shutter blurs it, while still frames, faces held in frame and straight edges stay sharp. It is chosen per shot (or per chapter or beat: its moving shots, never a shot where someone speaks on camera unless that shot is named), at one of two strengths (standard, subtle; standard by default). It is free, up to 300 seconds of blurred picture per deck or trailer, and it is laid when the master is assembled, before the film finish. The sound and timing are never touched.
  - `strength` 'standard' | 'subtle', required: The strength (`standard` when nothing is chosen).
  - `on` boolean, required: True when any shot is chosen.
  - `chosenSeconds` number, required: Seconds of picture the choice blurs.
  - `capSeconds` number, required: The most a deck or trailer may choose, free.
  - `units` object[], required: Every chapter (deck) or beat (trailer), in order.
    - `unit` integer, required: The chapter's `chapterIndex` or the beat's `beatIndex`: the key a set names it by.
    - `unitNumber` integer, required: Its place, 1-based: the number a writer sees.
    - `hasCut` boolean, required: It has a rendered cut (shots can be chosen only then).
    - `state` 'on' | 'waiting' | 'skipped' | 'off', required: `on`: the last master laid the blur; `waiting`: chosen, not in a master yet; `skipped`: the last master played it unblurred (`reason`); `off`: nothing chosen.
    - `reason` 'unconfigured' | 'offline' | 'failed' | 'slow', nullable: Why a skipped blur was not laid.
    - `sentence` string, nullable, required: What the review says for it.
    - `shots` object[], required
      - `number` integer, required: The shot's number, 1-based, as the cut plays them: what a set names.
      - `startSeconds` number, required
      - `endSeconds` number, required
      - `framing` string, required
      - `speaksOnCamera` boolean, required: Someone says a line on camera in it (never chosen by `moving`).
      - `action` string, required: What happens in it.
      - `chosen` boolean, required
    - `staleShots` integer, required: Chosen shots a recompile removed: ignored until chosen again.
  - `strengths` object[], required
    - `id` 'standard' | 'subtle', required
    - `description` string, required
  - `renderBox` 'online' | 'offline' | 'unconfigured', nullable, required: Whether a render box answers now (null when not checked).
  - `description` string, required
  - `reassembling` boolean, required: True when the master is assembled again with the new choice (a rendered deck or trailer; free).
  - `masterHold` TrailerMasterHold: On a rendered trailer with no screenplay, a blank beat holds its video: nothing rebuilds it until each blank beat is a capture beat or a title card, or removed (then it is rebuilt, free); the answer's `masterHold` names the beats and the fix, and the export is refused with it (`trailer_capture_only`).
    - `blankBeats` integer[], required: The blank beats, numbered from 1.
    - `message` string, required: The sentence to show: the beats, that the video keeps playing, and the fix.

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