Create an artifact-generation job against an APPROVED StoryPlan.
Requires the referenced plan to be APPROVED. Non-blocking warning gates: if this generates screenplay pages, confirm the full Series Bible was completed/reviewed first; the screenplay adapter auto-loads the saved bible as canonical project truth. After the table-read artifact is READY, read/poll the initial coverage report before finalization, pitch packaging, or later-installment work. Table-read jobs queue that first coverage pass when pages are created. For table_read, the plan must include a reviewed scriptBlueprint (unless the request adopts a finalized screenplay with scriptUploadId) and the job may contain only one table_read artifact request. A table read PERFORMS the project's cast and never makes one: from a plan it starts when the project's cast canon, plus the request's voiceMap, covers every canon character — a voice for everyone and, unless the project is audio-only, a headshot, body shot and sheet — and a narrated read also covers the narrator; GET /story-projects/{projectId} reports this as project.tableReadReadiness. With scriptUploadId it performs that finalized screenplay as written, which needs its own episode cast complete. Once the job has written its screenplay, a speaker the cast does not cover fails the job (failureCode: cast_precondition_failed) before any audio and releases its credits. Every refusal runs BEFORE the job row is created — a plan not APPROVED, a project that has not reached the stage the artifacts need (409 project_precondition_failed, details.stage), a table read whose cast is incomplete (409 cast_precondition_failed, details.reason and details.missing), an adopted screenplay outside the project (404 script_not_found), a balance that cannot cover the quote (402 insufficient_credits) — so a refused call leaves nothing behind. Then it persists the job, reserves Studio Credits for the artifact line items, and enqueues the async runner. Requires Idempotency-Key, and the job is BOUND to it: retrying a key whose attempt failed resumes that same job (a 402 names it in details.jobId), it never creates a second one. artifactRequests defaults to the plan's own requests when omitted; table-read overrides may include narrationPolicy (auto | include | suppress) and a voiceMap using saved IDs from GET /voices for voices the cast canon does not carry. A trailer request: A trailer job always stops at its plan: it plans the beats onto a draft trailer (the job's progress.trailerJobId) and renders and reserves nothing, so planning is free. The next step is approve_trailer_plan (POST /trailers/{jobId}/plan/approve; CLI: trailer approve-plan <jobId>), priced first: its quote (quote_approve_trailer_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. The job completes READY with progress.stage: 'plan_ready', progress.trailerJobId and progress.nextStep: 'approve_trailer_plan', and its quote prices the planning only (0 credits). A pitch_deck request: 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. The job completes READY with progress.stage: 'plan_ready', progress.pitchDeckJobId and progress.nextStep: 'approve_pitch_deck_plan', and its quote prices the planning only (0 credits).
Request
- Base URL: https://docs.sleeperhit.studio/api/v1
- URL: https://docs.sleeperhit.studio/api/v1/story-jobs
- Auth: HTTP bearer
Headers
Customer-generated stable identifier for safe retries of idempotent POST requests.
Request body
Response
Created job envelope.
Changes
No recorded changes to this operation across all 1 revision of this API.