Trailer

Refine one trailer beat.

Edits one trailer beat's plan: what it delivers (storyBeat), BOTH sides of its seam — transitionPrompt outgoing and transitionIn incoming — its framing (shotType), motion direction, its staging (characterAction — what its people physically do — and stagingNotes, which a beat held as one shot is filmed from; '' clears either), on-screen caption, composition, duration, who is in the picture (visibleCharacters is the named characters on camera; unnamed people need no listing), where it is set (location, stored as a canonical location key), the stage of the trailer's intent it serves (arcStage, advancesQuestion — plan words that never make a take stale; on a draft the changed plan is queued for plan coverage, planCoverage), whether it is a rapid intercut run (montage — brief shots cut tight, as short as 1 s; it stales the takes), what the narrator says over it (narrationText, at most 600 characters, '' clears it — laid over the picture, so it never stales a take; a blank beat added to a rendered trailer is given its line this way). Who speaks this beat's narration (narrationSpeaker): a cast member named on the project, spoken in their canon voice instead of the cut's narrator (at most 160 characters; an empty string or null clears it back to the narrator). Only a beat nobody can watch speak may name one — a capture or text beat; on a filmed beat a visible speaker's words belong in spokenLine, said on camera, and are refused here. An unknown speaker is refused when the cut renders, naming them; the narrator never speaks their line for them. And shots — the beat's CUT LIST of shots with hard cuts between them, each with whatever camera move it wants, which is how a beat is made to contain an EVENT rather than an image. A beat names where it is set in its location: a canonical location key, the place its location image is made of. A beat may travel: a shot set somewhere else names that place in its own location (a key, or a place in plain words), and the render follows it there. A capture beat plays one of the project's app captures (a real screen recording, ready) as it was recorded: set it with the beat refine (compositionKind: 'capture' and the capture's captureId). It plays the whole capture, or only the stretch of it you keep (captureKeep: a start and an end, in seconds of the capture); what it plays runs 4 to 30 seconds, so a longer capture plays a kept stretch of it. The capture must be in the trailer's shape. The beat carries no on-screen text (its caption is cleared and none can be set), and is never rendered or retaken, so it costs nothing. A beat that already has rendered shots cannot become one: add a beat for the capture instead. A capture beat's refusals: captureId or captureKeep without a capture beat, a capture beat with a caption or a length (400); a capture not of the trailer's project (404 capture_not_found); a capture not ready, playing outside 4–30 s (a capture longer than 30 s plays a kept stretch: captureKeep), a kept stretch that does not fit its capture (trailer_capture_keep_range), ends before the result of a click it keeps (trailer_capture_keep_cuts_result), or in another shape, or a beat that already has rendered shots (409). Allowed in draft, review and complete. Free — it saves the plan and marks what went stale: an edit to what the beat films marks its takes out of date (they stay playable), a caption edit marks only its text layer; render the beat again with beats/render-clip (priced). A narration edit on a rendered trailer that narrates is voiced and the master stitched again, free (reassembling: true); on a cut with no narrator voice a new line on a beat that names no narrationSpeaker is refused (409, details.refusal.code trailer_narrator_missing: choose a narrator first). Returns needsRerender, planCoverage, reassembling and previewUrl. Provide at least one editable field. Requires Idempotency-Key. Scope: story:write.

post/trailers/{jobId}/beats/refine

Request

  • Base URL: https://docs.sleeperhit.studio/api/v1
  • URL: https://docs.sleeperhit.studio/api/v1/trailers/{jobId}/beats/refine
  • Auth: HTTP bearer

Headers

Idempotency-Keystring required

Customer-generated stable identifier for safe retries of idempotent POST requests.

Request body

beatIndexinteger required

Zero-based index of the beat to edit.

storyBeatstring

What the beat delivers dramatically: the source its shots are compiled from.

transitionPromptstring

The OUTGOING side of this beat's seam — how this beat hands off to the next one.

transitionInstring

The INCOMING side of this beat's seam — how this beat receives the handoff from the PREVIOUS beat. A seam is two independent fields on two beats (beat N's transitionPrompt, beat N+1's transitionIn) and nothing reconciles them, so both must be written to agree. Rejected, not truncated, above 400 characters.

shotTypestring

The beat's framing (a single-shot beat's only framing): shot 1's framing picks the plate rung the render opens on — wide, medium or close. Prefer a canonical token: establishing, wide, medium-wide, medium, two-shot, over-the-shoulder, insert, closeup, extreme-closeup. Rejected, not truncated, above 120 characters.

motionPromptstring

How the beat moves: what the figures do and what moves in the room.

characterActionstring

What the people in this beat physically do, in order. A beat held as one shot is filmed from it; a beat with a cut list is filmed from its shots' own characterAction instead. When it changes what the beat films, its takes go out of date. Never on-screen text — words on the screen belong in captionText. An empty string clears it.

stagingNotesstring

Where the people and things in this beat are and how the picture is arranged. A beat held as one shot is filmed from it; a beat with a cut list is filmed from its shots instead. When it changes what the beat films, its takes go out of date. Never on-screen text. An empty string clears it.

captionTextstring

The beat's on-screen text. A capture beat carries none.

compositionKind'image' | 'text' | 'both' | 'capture'

What the beat is made of: footage only, on-screen text only, text over footage, or an app capture played as recorded (capture, with captureId). A capture beat plays one of the project's app captures (a real screen recording, ready) as it was recorded: set it with the beat refine (compositionKind: 'capture' and the capture's captureId). It plays the whole capture, or only the stretch of it you keep (captureKeep: a start and an end, in seconds of the capture); what it plays runs 4 to 30 seconds, so a longer capture plays a kept stretch of it. The capture must be in the trailer's shape. The beat carries no on-screen text (its caption is cleared and none can be set), and is never rendered or retaken, so it costs nothing. A beat that already has rendered shots cannot become one: add a beat for the capture instead.

keepsSoundboolean

A beat plays its takes' own sound (true) or the cut's planned sound (false). A beat that keeps its sound (keepsSound: true) plays what its own footage carries in the master: a capture's own recorded track (a table read's voices, the app's own sounds), or a rendered beat's own take sound (a crowd, singers, a room's own sound) instead of the cut's planned silence, room tone and laid lines. It plays over the score: the music dips about 12 dB under it, wherever it sounds. The narration dips it only while a line is spoken, and it comes straight back after; a beat that does not plays the cut's planned sound. A capture only keeps its sound when it has one. Free: in review the master is rebuilt from what it has, and a finished trailer's master is stitched again. A capture beat with no sound track is refused (409). The answer's masterRebuild says what follows on a rendered trailer.

scoreUnderOwnSound'duck' | 'out' | 'hold'

What the music does under its own sound: duck lowers it about 12 dB (the default), out stops it over a quarter second, hold keeps its level. Where a beat plays its own sound (a capture's recorded track, a cut that kept its takes' sound, a chapter's kept scene sound), scoreUnderOwnSound says what the music does under it: duck (Lower, the default) dips it about 12 dB; out (Stop) fades it to silence over a quarter second and back after, for a captured video that carries its own score; hold (Keep) leaves it at its level (a spoken line still dips it). ownSoundGainDb (−12 to +18, null clears) raises or lowers the beat's own sound itself. The score to picture is composed around it, thinning or stopping there, so a score composed before the change is out of date: score to picture again. Free: in review the master is rebuilt from what it has, and a finished video's master is stitched again.

ownSoundGainDbnumber nullable

Its own sound raised or lowered in the master, in dB from -12 to +18; null or 0 plays it as recorded.

depthPreset'flat' | 'subtle' | 'cinematic' | 'showcase' | 'hero' | 'none' nullable

A capture beat's own depth preset: flat, subtle, cinematic, showcase, hero, none to play it full frame whatever the trailer's says, or null to follow the trailer's again. A capture beat's depth plays its recording as a floating window on a branded stage instead of full frame: flat, subtle, cinematic, showcase, hero, shallowest first. Above flat the camera finds the result — it punches in (at most 2× the recording's own pixels) on what each click changed, arriving as it changes, pushes in slowly while the viewer reads, never moves during a scroll and never crops the cursor — and cinematic, showcase and hero add a frame and a 3D turn (cinematic on the opening; showcase and hero hold it through the wide shots, square again before every punch-in), its move varied beat to beat — the left or right side turned away, the top or bottom edge tipped away, a slow push, or held square for about a quarter to a third of the beats. Where the words are read, a held turn is kept strong and made readable: it holds at most of its angle, keeps the words read in focus while the far side falls softly out of focus, and eases only as far as their measured size needs. Showcase sets the recording close up in a laptop or phone on a drifting brand background, and a punch-in never crops the device out of the picture. Each depth beat is rendered beside a flat version and checked: one that got harder to read (smaller text, a softer text crop, words out of focus, or a camera that moves too fast) is first framed closer on its words, keeping its preset and its turn — closer up, the camera pushed in on them, and never a word cut at the frame's edge — and only steps down one preset when that still reads worse, each time rendered again at no charge and keeping the look it asked for (its frame, background and cursor). When the full version cannot be rendered, a quicker version plays instead: subtle, at 720p. Set it for the whole trailer, or per beat; a beat's own preset wins, and none plays the recording full frame as recorded. Free. Refused on a beat that is not a capture beat (400). The answer's masterRebuild says what follows on a rendered trailer.

stageCaptionstring

A capture beat's stage caption is a few words (at most 60 characters) shown in the stage's margin below the floating window, never over the captured screen. It needs a depth preset: a beat played full frame has no margin. '' clears it. Refused on a beat that is not a capture beat (400), and on one that plays full frame (409: give it a depth preset first).

captureSpeedUp'off' | 'gentle' | 'standard' | 'brisk' nullable

A capture beat plays the stretches where the viewer would only wait (the page loading or an answer streaming in, a long run of typing, a long scroll, an idle pause) sped up and eased in and out, while every click, its result and the moments to read play at real speed; the narrator's line still lands on its click, and the beat is never cut shorter than its line. On by default. captureSpeedUp sets it for one capture beat: off (real time), gentle (about 2× through waits), standard (the default, about 4×) or brisk (about 8×); null puts the beat back on the default. A beat that keeps its recording's own sound plays in real time unless it is set. Refused on a beat that is not a capture beat (400). The answer's masterRebuild says what follows on a rendered trailer.

captureIdstring

The app capture a capture beat plays: one of the trailer's project's captures, ready (list them with GET /story-projects/{projectId}/captures). Sent with compositionKind: 'capture', or alone to swap a capture beat's capture (which drops its kept stretch unless captureKeep comes with it). Refused unless what it plays (the whole capture, or the kept stretch) runs 4–30 s, in the trailer's shape.

intendedDurationSecondsinteger

The beat's length in seconds (4–30). A beat renders as calls of at most 10s each. A capture beat runs the length of what it plays and refuses one: keep a stretch of its capture instead (captureKeep).

visibleCharactersstring[]

The NAMED characters in the picture (max 8), by exact project-canon name — each renders from their own identity reference. Unnamed people (a crowd, passers-by) are not listed and need none. Pass [] for a beat with no cast member on screen, e.g. a street or a vista.

featuredCharacterstring nullable

The beat's lead character (null clears it).

locationstring nullable

Where the beat is set, stored as a canonical location key (pass the key, or a room name, resolved to the room's stored key). A room with no plate yet is legal: the render makes it, priced as a plate line. Null clears it. A beat names where it is set in its location: a canonical location key, the place its location image is made of. A beat may travel: a shot set somewhere else names that place in its own location (a key, or a place in plain words), and the render follows it there.

arcStage'setup' | 'escalation' | 'turn' | 'closing_question'

The stage of the trailer's intent this beat serves: setup, escalation, turn or closing_question. The beats follow the arc in order, every stage is served, and the last beat is the closing_question — plan coverage refuses a plan that breaks it. Plan words: never makes a take stale.

advancesQuestionstring

One sentence: how this beat advances the intent's central question — what it raises, sharpens or makes costlier.

whyItFollowsstring

One line, never on screen: why this beat comes after the one before it — the link a viewer sees or hears and what it moves forward. Required on every beat after the first; "" clears it. Plan words: never makes a take stale.

montageboolean

true makes the beat a rapid intercut run — several brief shots (one to two seconds each) across the people and places its shots name, cut tight; its shots may run as short as 1 s. false makes it hold or travel. It changes how the beat compiles, so its takes go out of date.

narrationTextstring

What the narrator says over this beat: one line in the cut's narrator voice, laid over the finished picture (never part of the footage). Heard only when the cut narrates (audioPolicy: narrate). Write what the cut means, never what is on screen, and leave it empty on a beat whose character speaks. It never makes a take stale; on a rendered trailer that narrates, the new line is voiced and the master stitched again, free. An empty string clears it.

narrationSpeakerstring nullable

Who speaks this beat's narration (narrationSpeaker): a cast member named on the project, spoken in their canon voice instead of the cut's narrator (at most 160 characters; an empty string or null clears it back to the narrator). Only a beat nobody can watch speak may name one — a capture or text beat; on a filmed beat a visible speaker's words belong in spokenLine, said on camera, and are refused here. An unknown speaker is refused when the cut renders, naming them; the narrator never speaks their line for them.

Response

The saved beat + a shareable beat preview link.

successboolean
needsRerenderboolean

True when the beat's rendered takes (or its text layer) are now out of date. They stay playable; render the beat again (priced) to bring it in line.

planCoverage'queued' | 'current' | 'failed' | 'null' nullable

On a draft plan the edit changed: its plan coverage — queued (one run per burst of edits, started once the plan has been left alone for three minutes; the plan approval starts it at once), current (this revision is already scored or being scored) or failed (it could not be queued; the approval says what is missing). Null outside draft, or when the edit changed nothing.

masterRebuild'reassembling' | 'restitching'

When the edit changed what a capture beat plays (its capture, the capture taken off, or its sound), or what the music does under a beat's own sound (scoreUnderOwnSound, ownSoundGainDb), on a rendered trailer: reassembling — in review the master is rebuilt from what it has (free); restitching — a finished trailer's master is stitched again at its class (free). Absent otherwise.

reassemblingboolean

True when the edit changed what the narrator says on a rendered trailer that narrates: the line is voiced again and the master stitched again, free. Poll the beats read until the new master lands.

ownSoundWarningstring

The beat's narration speaks over its own sound, which dips under the line: say it to the writer (move the line to the beat before, onto a black, or clear it). Advisory, the edit is saved. Absent when they do not overlap.

previewUrlstring

Shareable link to watch this beat's current cut.

Changes

No recorded changes to this operation across all 1 revision of this API.