---
title: "Choose the delivery class for this cut."
method: POST
path: "/trailers/{jobId}/resolution"
tags: ["Trailer"]
---

# Choose the delivery class for this cut.

`POST /trailers/{jobId}/resolution`

## Request

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

Choose the class the finish delivers the cut at — 720p (the default) or 1080p — or send `resolution: null` to clear the choice back to 720p. Storing it is free and changes no render: every shot renders at 480p first, and raising the class upscales the approved takes at finish, so it quotes a finish of the takes you keep, never a render. A finished (complete) cut goes back to review so it can be finished again at the new class. What it costs at each class, in Studio Credits for this cut, is the read's `finishCredits`. Refused (409) while a render or finish pass is running. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `resolution` '720p' | '1080p' | 'null', nullable, required: The delivery class, or null to clear the choice back to the default (720p).

## Response `200`

The delivery class now in force.

- object
  - `resolution` TrailerDeliveryResolution, required: The class the finish delivers the cut at. Raising it upscales the approved takes at finish — it quotes a finish, never a render.
    - `jobId` string, required
    - `deliveryResolution` '720p' | '1080p', required: The writer's choice, else 720p.
    - `isDefault` boolean, required: True when nobody has chosen, so the default applies.
    - `renderResolution` '480p', required: Every take renders at this class first, whatever the delivery class.
    - `options` string[], required
    - `editable` boolean, required: False while a render or finish pass is running.
    - `finishCredits` object, required: What finishing THIS cut costs at each class, in Studio Credits — the finish quote's own lines (the selected takes upscaled at their kept length, and the text layers): 0 for a cut of app captures and title cards. Null for a class it cannot price yet (a shot with no take to play). Say this number when the writer weighs the class; the finish quote stays the one that reserves.
      - `720p` integer, nullable, required
      - `1080p` integer, nullable, required

## 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/64c1102ccb2f?raw)
