---
title: "Cut a chapter's line out of its footage and keep the rest (free)."
method: POST
path: "/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line"
tags: ["Pitch Deck"]
---

# Cut a chapter's line out of its footage and keep the rest (free).

`POST /pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line`
- Auth: HTTP bearer

NOT metered and NOT confirmed: FREE, one call. Cut the line, keep the rest (free, one step): the chapter's spoken line leaves its plan (its words, its voice and how it is said), 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 chapter 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 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, and a trim that would leave another chapter of its scene group with no shot. Name a chapter to move the line to and its words, speaker and delivery go there, to be rendered with that chapter's own staging; otherwise add it there with a refine. The chapters read's `lineDrop` says what it would do now (the takes it trims and the span each keeps) or why it cannot; `droppedLine` shows a line already cut out and each trim's state. Calling it again on a chapter 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_in_middle` (choose `keep`), `drop_line_too_short`, `drop_line_empties_chapter`, `drop_line_cuts_other_line`, `drop_line_narrated`, `drop_line_not_rendered`, `drop_line_no_take`, `drop_line_unplaced`, `drop_line_target_has_line`. A complete deck goes back to review. Review or complete only. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- PitchDeckDropLineRequest: Cut the line, keep the rest (free, one step): the chapter's spoken line leaves its plan (its words, its voice and how it is said), 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 chapter 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 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, and a trim that would leave another chapter of its scene group with no shot. Name a chapter to move the line to and its words, speaker and delivery go there, to be rendered with that chapter's own staging; otherwise add it there with a refine.
  - `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`).
  - `toChapterIndex` integer: The chapter (its key from the chapters read) the line's words, speaker and delivery move into. Refused when it already has another line. Omit to only cut the line out.

## Response `200`

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

- PitchDeckDropLineAnswer: The line is cut out: what each take keeps (queued as trimmed takes), where the line went, and whether the chapter is current. Nothing was charged.
  - `jobId` string, required
  - `chapterIndex` integer, required
  - `chapterNumber` integer, required
  - `line` object, required
    - `speaker` string, nullable
    - `text` string
    - `lineDelivery` string, nullable
  - `movedTo` object, nullable, required
    - `chapterIndex` integer
    - `chapterNumber` 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 chapter'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 pitch deck exists and the request is well-formed, but the deck, its chapter, its cast or its plates are not in a state that allows it (`pitch_deck_state_invalid`), and nothing was reserved: a plan approved outside draft, a take chosen, a chapter edited or rendered outside review/complete, an export before the finish, a finish while a call has no selected take or a footage chapter has not rendered, a text-only chapter asked for footage, a changed chapter asked for one call, a delivery class changed mid-pass, a render the compile blocked, or a finish while the master failed its video coverage (`pitch_deck_video_coverage_failed`, with `details.videoCoverage`). `details.refusal` is `{ code, action, fix }` (see PitchDeckRefusalDetails): `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 chapter a blocked compile could not render. The identical request succeeds once the deck 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)
