Price, then start, the render of a draft deck's plan.
Approves a draft deck's chapter plan into the render — the next step of EVERY deck job: A pitch deck job always stops at its plan: it plans the chapters onto a draft deck (the job's progress.pitchDeckJobId) and renders and reserves nothing, so planning is free. The next step is approve_pitch_deck_plan (POST /pitch-decks/{jobId}/plan/approve; CLI: pitch-deck approve-plan <jobId>), priced first: its quote (quote_approve_pitch_deck_plan, or the route without confirmed) returns the 480p render quote and reserves nothing; with confirmed: true it reserves exactly the quoted calls and renders them. Approving THIS job renders the deck that was scored; creating a new plan re-runs the stochastic planner and renders an ungraded draw instead. TWO CALLS, PRICE FIRST: sent WITHOUT confirmed it runs the coverage gate, compiles and voices every footage chapter (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); sent again with confirmed: true it reserves exactly the quoted calls and starts the render (rendering, then review). A chapter's line is spoken by a cast member in their own voice when its narrationVoice names one — on camera, lip-synced, when they are on its visibleCharacters, else as a voice-over — otherwise by the narrator over the cut; 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, and details.blocked per chapter): an unscored or failing plan, a chapter whose cast has no body figure or whose speaker has no cast voice, a chapter whose words one render cannot carry. Each blocked chapter carries its chapterIndex and chapterNumber: fix it with chapters/refine (free, on the draft) and price the approval again — the deck is not planned again. 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 pitch deck 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/pitch-decks/{jobId}/plan/approve
- Auth: HTTP bearer
Headers
Customer-generated stable identifier for safe retries of idempotent POST requests.
Request body
Response
The 480p render quote (no confirmed) or the started render — or, while the price is being prepared, status: "preparing" (nothing reserved; ask again).
Changes
No recorded changes to this operation across all 2 revisions of this API.