---
title: "Stop the trailer's render in flight (free; it gives back what was held)."
method: POST
path: "/trailers/{jobId}/cancel-render"
tags: ["Trailer"]
---

# Stop the trailer's render in flight (free; it gives back what was held).

`POST /trailers/{jobId}/cancel-render`

## Request

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

Stop the trailer's render in flight — its first pass, its finish, or a retake or repair still running. Nothing more is sent to a provider: its queued and running render jobs are cancelled, and a job already running stops at its next step. The writer's reservations for work that had not run are released (`released`, `releasedCredits`); every accepted take, selection, cut, finished take and master is kept (`keptTakes`). A shot already out at the provider is stopped and recorded on its beat (`abandoned`): not charged to the writer (the provider may still bill it, at our cost), and never resumed. It lands in `review` with what rendered, back at `draft` when nothing did (approving again quotes the same shots), back in `review` after a stopped finish, or as it was after a stopped retake. Free: no price and nothing to confirm. With nothing rendering it answers `stopped: false` and changes nothing. Answers `{ jobId, surface, stopped, previousStatus, status, cancelledJobs, abandoned, released, releasedCredits, keptTakes, note }`; read `GET /trailers/{jobId}/beats` after it. NOT metered and NOT confirmed. Requires `Idempotency-Key`. Scope: `artifact:publish` — the key that can start and spend on renders is the key that can stop them.

## Headers

- `Idempotency-Key` string, required

## Response `200`

What the stop did: the status it lands in, what it gave back, what it abandoned and kept.

- RenderCancelResult
  - `jobId` string, required
  - `surface` 'pitch_deck' | 'trailer', required
  - `stopped` boolean, required: False when nothing was rendering: nothing was changed.
  - `previousStatus` string, required
  - `status` string, required: Where it is now: `review` with what rendered, `draft` with its plan, or as it was.
  - `cancelledJobs` integer, required: Render queue jobs cancelled (queued, retrying, or running when the stop was written).
  - `abandoned` object[], required: Work that was out at a provider: stopped and recorded; never charged to the writer, never resumed.
    - `callId` string, required
    - `take` integer, required
    - `kind` 'render' | 'finish', required
    - `taskId` string, nullable, required
  - `released` object[], required: The writer's reservations given back, by line.
    - `idempotencyKey` string, required
    - `credits` integer, required
  - `releasedCredits` integer, required
  - `keptTakes` integer, required: Accepted takes kept, untouched.
  - `note` string, required: Read it to the writer.

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