---
title: "Cut one of a beat's lines out of its footage and keep the rest (free)."
method: POST
path: "/trailers/{jobId}/beats/{beatIndex}/drop-line"
tags: ["Trailer"]
---

# Cut one of a beat's lines out of its footage and keep the rest (free).

`POST /trailers/{jobId}/beats/{beatIndex}/drop-line`

## Request

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

NOT metered and NOT confirmed: FREE, one call. Cut the line, keep the rest (free, one step): one of the beat's spoken lines leaves its plan (its words and who says it), and each take that says it is trimmed to the footage on one side of it — after the line when the line opens the take, before it when it closes it — measured where the take says it, with a small pad, so nothing of the line is heard. The trimmed take is the same footage, so the beat stays current: nothing is rendered or charged, the trimmed take plays as soon as it lands, and its sound is the take's own sound with the line cut out. A beat with several lines names the one to cut (`line`, from 1, as its `lineDrops` list them). A line with footage on both sides is refused until you choose keep before or keep after; so is a side shorter than 1.5 s. Name a beat to move the line to and its words and speaker go there, to be rendered with that beat's own staging; otherwise add it there with a refine. The beats read's `lineDrops` says, line by line, what it would do now (the takes it trims and the span each keeps) or why it cannot; `droppedLines` shows the lines already cut out and each trim's state. Calling it again (without `line`) on a beat whose line was already cut out queues again only the trims that never landed (`resumed`). Refused before anything changes (409, `details.refusal.code`): `drop_line_which_line` (name `line`), `drop_line_in_middle` (choose `keep`), `drop_line_too_short`, `drop_line_cuts_other_line`, `drop_line_not_rendered`, `drop_line_no_take`, `drop_line_unplaced`, `drop_line_no_line`, `drop_line_target_has_line`. A complete trailer goes back to review. Review or complete only. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- TrailerDropLineRequest: Cut the line, keep the rest (free, one step): one of the beat's spoken lines leaves its plan (its words and who says it), and each take that says it is trimmed to the footage on one side of it — after the line when the line opens the take, before it when it closes it — measured where the take says it, with a small pad, so nothing of the line is heard. The trimmed take is the same footage, so the beat stays current: nothing is rendered or charged, the trimmed take plays as soon as it lands, and its sound is the take's own sound with the line cut out. A beat with several lines names the one to cut (`line`, from 1, as its `lineDrops` list them). A line with footage on both sides is refused until you choose keep before or keep after; so is a side shorter than 1.5 s. Name a beat to move the line to and its words and speaker go there, to be rendered with that beat's own staging; otherwise add it there with a refine.
  - `line` integer: Which of the beat's lines (from 1, as its `lineDrops` list them). Omit it when the beat says one line.
  - `keep` 'before' | 'after': Which side of the line each take keeps. Omit it to keep the side with footage; a line with footage on both sides needs it (`drop_line_in_middle`).
  - `toBeatIndex` integer: The beat the line's words and speaker move into, as its own line. Refused when it already has another. Omit to only cut the line out.

## Response `200`

The line, cut out: each take's trim queued as a new take.

- TrailerDropLineAnswer: The line is cut out: what each take keeps (queued as trimmed takes), where the line went, and whether the beat is current. Nothing was charged.
  - `jobId` string, required
  - `beatIndex` integer, required
  - `beatNumber` integer, required
  - `line` object, required
    - `speaker` string, nullable
    - `text` string
  - `movedTo` object, nullable, required
    - `beatIndex` integer
    - `beatNumber` integer
  - `trims` object[], required
    - `callId` string
    - `take` integer
    - `trimTake` integer
    - `keep` 'before' | 'after'
    - `keepStartSeconds` number
    - `keepEndSeconds` number
  - `queued` boolean, required
  - `resumed` boolean, required: The line was cut out before; only its trims that never landed were queued again.
  - `current` boolean, required: Whether the beat's takes are current now (false: it was already out of date for another change).
  - `message` string, required

## 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/4534f5d25540?raw)
