Price, then render, a draft trailer's beat plan.
Approves a draft trailer's beat plan into the render — the next step of EVERY trailer job, which stops at its plan (a story job's progress.trailerJobId, progress.nextStep: approve_trailer_plan): approving THIS job renders the cut that was scored, while creating a new plan re-runs the stochastic planner and renders an ungraded draw. TWO CALLS, PRICE FIRST: sent WITHOUT confirmed it runs the coverage gate, compiles and voices every footage beat (free to the writer) and prices the 480p render — a line per call at its voiced seconds and a line per location plate the renders make first — reserving nothing (quotedOnly: true, lines, calls, warnings); sent again with confirmed: true it reserves exactly the quoted calls and starts the render (rendering, then review). Every call renders at 480p with the cast's own recorded lines; a take that leaves a line unheard or says it in another character's voice, has lips out of step with its lines, or misses its opening framing is retaken once automatically at our cost. Refused before the price with the action that fixes it (details.refusal, details.blocked): an unscored or failing plan, a narrated cut with no narrator, a beat whose cast has no body figure or cast voice. A TRAILER WITH NO SCREENPLAY (POST /story-projects/{projectId}/trailers) is approved here too: it needs at least one capture beat and every other beat a capture or a title card (else 409 trailer_capture_only, naming the beats), compiles and renders nothing, has no plan coverage to wait for, binds no video model and quotes 0 credits; the confirm assembles the cut from its captures. Preparing the price (voicing each line and planning each shot) can take a few minutes, so it runs in the background: an answer with status: "preparing" carries no price yet and reserved nothing — tell the writer, then ask again with the same call and the same inputs after checkAgainSeconds (about 20) until the price (or a refusal) comes back. Asking again while it is being prepared never starts a second one. A confirmed call that finds the price no longer prepared (the plan changed since) reserves nothing and answers the same way: price it again. A plan the gate refuses on the judge's scores alone says so (details.overridable: true, details.overrideWhy): the writer may render it anyway by sending acknowledgePlanCoverage: { reason } on the price and the confirm alike — only on their explicit choice. details.overridable: false cannot be rendered over (a blocking defect decided in code, or a missing, running, failed, stale or old-rubric report). The confirmed approval records the override on the report (the coverage read's writerOverride); the answer carries it as planCoverageOverride. Draft only. Requires Idempotency-Key. Scope: story:write. A trailer is priced by the second: 1 credit a second to render at 480p, plus 1 credit a second to finish at 720p (2 credits a second in all; a 1080p finish is 4 credits a second instead). Planning is free. The exact price is quoted per shot once the plan is ready, before anything renders; location plates and on-screen text are itemized in the same quotes.
Request
- Base URL: https://docs.sleeperhit.studio/api/v1
- URL: https://docs.sleeperhit.studio/api/v1/trailers/{jobId}/plan/approve
- Auth: HTTP bearer
Headers
Customer-generated stable identifier for safe retries of idempotent POST requests.
Request body
Response
The render price (no confirmed) or the queued render — or, while the price is being prepared, status: "preparing" (nothing reserved; ask again).
Changes
No recorded changes to this operation across all 1 revision of this API.