Sleeper Hit Docs

API Reference

Generated endpoint reference for the Story API.

View as Markdown

This reference is generated from the live OpenAPI builder, schema registry, capabilities manifest, examples manifest, and UI/API/CLI/MCP surface registry. Do not hand-edit endpoint lists; change the contract code and regenerate.

Machine-readable surfaces

SurfacePath
Capabilities/api/v1/capabilities
OpenAPI JSON/api/v1/openapi.json
Examples/api/v1/examples
Agent index/agent-index.json
Four-surface contract/docs/surface-contract.json
CLI command map/docs/cli-commands.json
MCP tool map/docs/mcp-tools.json

Surface coverage

  • Operations: 333
  • OpenAPI operations: 331
  • Complete UI/API/CLI/MCP operations: 333 / 333
SurfaceBound operations
UI333 / 333
API333 / 333
CLI333 / 333
MCP333 / 333

Development flow warnings

Complete the Series Bible before screenplay pages

  • Stage: before_screenplay_generation
  • Blocking: no
  • Surfaces: ui, api, cli, mcp
  • Guidance: Before planning or generating a screenplay-backed table_read artifact, read, save, or generate the project Series Bible and confirm the format, audience, season arc, episode map, character roster, canon/world rules, visual style, audio style, and open questions are usable. The planner and screenplay adapter auto-load the saved Series Bible as project canon; if the user proceeds anyway, carry the missing areas into the StoryPlan review instead of silently ignoring them.

Finish the project stage a refusal names — do not retry it

  • Stage: before_planning_or_generation
  • Blocking: yes
  • Surfaces: ui, api, cli, mcp
  • Guidance: Planning, drafting episodes, casting, keeping or rendering mood board frames, writing the episode map, and generating project media are refused until the project reaches the stage each one needs. The refusal is a 409 project_precondition_failed whose error.details.stage names the stage the project has not finished (premise, premise_coverage, planning, full_coverage) with missingFields, canPlan and canStartEpisode. It is state, not a transient fault: nothing was created or charged, and the identical call refuses the same way until the stage is done — a recurring caller must stop and finish the stage (or tell the writer) rather than retry on a schedule.

A table read performs the project cast — complete it first

  • Stage: before_planning_or_generation
  • Blocking: yes
  • Surfaces: ui, api, cli, mcp
  • Guidance: A table_read job never casts. From a plan it starts only when the project cast canon, plus the request's own voiceMap, covers every canon character: a voice for everyone and, unless the project is audio-only (Series Bible productionMedium "audio"), a headshot, body shot and character sheet; a narrated read also needs a narrator voice. A job that adopts a finalized screenplay (scriptUploadId) needs that screenplay's episode cast complete. The refusal is a 409 cast_precondition_failed before anything is created or charged, with details.reason and details.missing. Once the job has written its screenplay, a speaker the cast does not cover fails the job (failureCode cast_precondition_failed, a contract failure) before any audio, and its credits are released.

Complete the Series Bible Mood board before rendering

  • Stage: before_storyboard_rendering
  • Blocking: yes
  • Surfaces: ui, api, cli, mcp
  • Guidance: Image and video rendering are locked until the Series Bible has explicit production medium, visual style, character design, visual truths, production design, color palette, lighting rules, camera language, and location truths. Read document.readiness.moodBoard on the shared Series Bible response and resolve every missing field before rendering.

Run one coverage round after the screenplay exists

  • Stage: after_screenplay_exists
  • Blocking: no
  • Surfaces: ui, api, cli, mcp
  • Guidance: Once a screenplay-backed table_read artifact exists, read or poll the first coverage report before treating the script as ready for finalization, pitch packaging, or later installment generation. Table-read jobs queue the initial coverage pass when pages are created; request a new report only if none exists or the user wants another pass. Use the report, especially top fixes, to drive one revision pass. This is guidance, not an enforcement gate.

Account

EndpointOperation IDScopeIdempotentSchemas
DELETE /api/v1/account/deletioncancelAccountDeletionaccount:writenoresponse:AccountDeletionStatus
GET /api/v1/account/deletiongetAccountDeletionaccount:readnoresponse:AccountDeletionStatus
POST /api/v1/account/deletionrequestAccountDeletionaccount:writeyesrequest:AccountDeletionRequest<br>response:AccountDeletionStatus
GET /api/v1/account/exportgetAccountExportaccount:readnoresponse:AccountExportStatus
POST /api/v1/account/exportrequestAccountExportaccount:readyesresponse:AccountExportStatus

Artifacts

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/artifacts/{artifactId}getStoryArtifactartifact:readnoresponse:StoryArtifactEnvelope
PATCH /api/v1/artifacts/{artifactId}renameStoryArtifactstory:writenorequest:ArtifactRenameRequest<br>response:RenamedArtifact
POST /api/v1/artifacts/{artifactId}/avatar-videoanimateArtifactAvatarartifact:publishyesrequest:TableReadAvatarVideoRequest<br>response:TableReadAvatarVideoResponse
POST /api/v1/artifacts/{artifactId}/avatarrecastArtifactAvatarartifact:publishyesrequest:AvatarRecastRequest
GET /api/v1/artifacts/{artifactId}/castgetArtifactCastartifact:readnoresponse:CastEnvelope
POST /api/v1/artifacts/{artifactId}/castupdateArtifactCastartifact:publishyesrequest:CastBatchRequest
GET /api/v1/artifacts/{artifactId}/coveragegetArtifactCoverageartifact:readnoresponse:CoverageReportEnvelope
POST /api/v1/artifacts/{artifactId}/coveragegenerateArtifactCoveragestory:writeyesresponse:CoverageDispatchAck
GET /api/v1/artifacts/{artifactId}/coverage/blacklistgetBlackListAnalysisartifact:readnoresponse:BlackListAnalysisResponse
GET /api/v1/artifacts/{artifactId}/coverage/versionslistCoverageVersionsartifact:readnoresponse:CoverageVersionsResponse
POST /api/v1/artifacts/{artifactId}/figurerecastArtifactFigureartifact:publishyesrequest:FigureRecastRequest
POST /api/v1/artifacts/{artifactId}/finalizefinalizeArtifactartifact:publishyes
POST /api/v1/artifacts/{artifactId}/finalize/retryretryArtifactFinalizeartifact:publishyesresponse:ArtifactFinalizeAck
GET /api/v1/artifacts/{artifactId}/location-platesgetArtifactLocationPlatesartifact:readnoresponse:LocationPlatesEnvelope
POST /api/v1/artifacts/{artifactId}/location-plates/{plateKey}/remakeremakeArtifactLocationPlateartifact:publishyesrequest:LocationPlateRemakeRequest<br>response:LocationPlateRemakeEnvelope
GET /api/v1/artifacts/{artifactId}/musicgetArtifactMusicartifact:readnoresponse:MusicStatusEnvelope
POST /api/v1/artifacts/{artifactId}/musicgenerateArtifactMusicartifact:publishyesrequest:MusicGenerateRequest<br>response:MusicGenerateResponse
GET /api/v1/artifacts/{artifactId}/noun-imagerygetArtifactNounImageryartifact:readnoresponse:TableReadNounImageryResponse
POST /api/v1/artifacts/{artifactId}/noun-imagerygenerateArtifactNounImageryartifact:publishyesrequest:TableReadNounImageryRequest<br>response:TableReadNounImageryQueued
POST /api/v1/artifacts/{artifactId}/performanceupdateArtifactPerformanceartifact:publishyesrequest:PerformanceDirectiveRequest<br>response:PerformanceDirectiveResponse
GET /api/v1/artifacts/{artifactId}/publish-stategetArtifactPublishStateartifact:readnoresponse:ArtifactPublishState
POST /api/v1/artifacts/{artifactId}/publish-statesetArtifactPublishStateartifact:publishnorequest:ArtifactPublishStateRequest<br>response:ArtifactPublishStateResult
POST /api/v1/artifacts/{artifactId}/refinerefineArtifactartifact:publishyesrequest:RefineArtifactRequest<br>response:RefineArtifactEnvelope
GET /api/v1/artifacts/{artifactId}/render-videogetArtifactRenderStatusartifact:readnoresponse:ArtifactRenderStatus
POST /api/v1/artifacts/{artifactId}/render-videorenderArtifactVideoartifact:publishyesresponse:ArtifactRenderAck
GET /api/v1/artifacts/{artifactId}/review-itemslistLineReviewsartifact:readnoresponse:LineReviewList
POST /api/v1/artifacts/{artifactId}/review-itemsflagLineForReviewartifact:publishnorequest:LineReviewFlag<br>response:LineReviewFlagResult
DELETE /api/v1/artifacts/{artifactId}/review-items/{entryIndex}unflagLineForReviewartifact:publishno
POST /api/v1/artifacts/{artifactId}/revoice-linerevoiceArtifactLineartifact:publishyesrequest:RevoiceLineRequest<br>response:RevoiceLineEnvelope
POST /api/v1/artifacts/{artifactId}/revoicerevoiceArtifactCharacterartifact:publishyesrequest:RevoiceRequest<br>response:RevoiceEnvelope
GET /api/v1/artifacts/{artifactId}/scriptgetArtifactScriptartifact:readnoresponse:ArtifactScriptContentEnvelope
POST /api/v1/artifacts/{artifactId}/scriptreplaceArtifactScriptartifact:publishyesrequest:ArtifactScriptReplacementRequest<br>response:StoryJobEnvelope
GET /api/v1/artifacts/{artifactId}/sfxlistArtifactSfxartifact:readnoresponse:SfxListResponse
POST /api/v1/artifacts/{artifactId}/sfxmanageArtifactSfxartifact:publishyesrequest:SfxManageRequest<br>response:SfxMutationResponse
GET /api/v1/artifacts/{artifactId}/soundscapeslistArtifactSoundscapesartifact:readnoresponse:TableReadSoundscapesResponse
POST /api/v1/artifacts/{artifactId}/soundscapesmanageArtifactSoundscapesartifact:publishyesrequest:TableReadSoundscapeRequest<br>response:TableReadSoundscapeResponse
POST /api/v1/artifacts/{artifactId}/theater-backdrop-promptswriteArtifactTheaterBackdropPromptsartifact:publishyesrequest:TableReadBackdropPromptsRequest<br>response:TableReadBackdropPromptsResponse
POST /api/v1/artifacts/{artifactId}/theater-canvasapplyTheaterCanvasartifact:publishyesrequest:TheaterCanvasRequest<br>response:TheaterMotionResult
POST /api/v1/artifacts/{artifactId}/theater-fx-cuesgenerateArtifactTheaterFxCuesartifact:publishyesrequest:TableReadFxCuesRequest<br>response:TableReadFxCuesResponse
POST /api/v1/artifacts/{artifactId}/theater-motion-clipgenerateTheaterMotionClipartifact:publishyesrequest:TheaterMotionClipRequest<br>response:TheaterMotionResult
POST /api/v1/artifacts/{artifactId}/theater-motiondirectTheaterMotionBeatartifact:publishyesrequest:TheaterMotionBeatRequest<br>response:TheaterMotionResult
POST /api/v1/artifacts/{artifactId}/theater-sceneupdateArtifactTheaterSceneartifact:publishyesrequest:TableReadTheaterSceneRequest<br>response:TableReadTheaterSceneResponse
GET /api/v1/artifacts/{artifactId}/theatergetArtifactTheaterartifact:readnoresponse:TableReadTheaterResponse
POST /api/v1/artifacts/{artifactId}/theaterupdateArtifactTheaterartifact:publishyesrequest:TableReadTheaterUpdateRequest<br>response:TableReadTheaterUpdateResponse
POST /api/v1/artifacts/{artifactId}/update-recordingupdateArtifactRecordingartifact:publishyesrequest:UpdateRecordingRequest<br>response:UpdateRecordingEnvelope
POST /api/v1/artifacts/{artifactId}/voice-modificationmodifyArtifactVoiceartifact:publishyesrequest:VoiceModificationRequest<br>response:VoiceModificationResponse
POST /api/v1/artifacts/{artifactId}/voicerecastArtifactVoiceartifact:publishyes
POST /api/v1/artifacts/{artifactId}/voice/restorerestoreArtifactVoiceartifact:publishyesrequest:VoiceRestoreRequest<br>response:VoiceRestoreResponse
GET /api/v1/story-jobs/{jobId}/artifactslistStoryJobArtifactsartifact:readnoresponse:StoryArtifactListResponse

Brand

EndpointOperation IDScopeIdempotentSchemas
POST /api/v1/brand-coverageanalyzeBrandCoveragestory:writeyesrequest:BrandCoverageRequest<br>response:BrandCoverageAck
GET /api/v1/brand-coverage/{reportId}getBrandCoveragestory:readnoresponse:BrandCoverageReport
POST /api/v1/brand-narrativegenerateBrandNarrativestory:writeyesrequest:BrandNarrativeRequest<br>response:BrandNarrativeResponse

Credits

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/creditsgetCreditscredits:readnoresponse:CreditsSummary
GET /api/v1/generation-healthgetGenerationHealthstory:readnoresponse:GenerationHealthEnvelope

Discovery

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/agent-guidancegetAgentGuidancestory:readnoresponse:AgentGuidance
GET /api/v1/capabilitiesgetCapabilitiesstory:readnoresponse:Capabilities
DELETE /api/v1/device/credentialrevokeDeviceCredentialno
POST /api/v1/device/credentialexchangeDeviceCodeno
GET /api/v1/examplesgetApiExamplesno

Jobs

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/background-activitygetBackgroundActivitystory:readno
GET /api/v1/screenplay-drafts/{scriptUploadId}getScreenplayDraftstory:readnoresponse:ScreenplayDraftStatus
POST /api/v1/screenplay-drafts/{scriptUploadId}startScreenplayDraftstory:writeyesresponse:ScreenplayDraftStatus
GET /api/v1/story-jobslistStoryJobsstory:readnoresponse:StoryJobList
POST /api/v1/story-jobscreateStoryJobstory:writeyesrequest:StoryJobCreate<br>response:StoryJobEnvelope
GET /api/v1/story-jobs/{jobId}getStoryJobstory:readnoresponse:StoryJobEnvelope
POST /api/v1/story-jobs/{jobId}/cancelcancelStoryJobstory:writeyesresponse:StoryJobEnvelope
POST /api/v1/story-jobs/{jobId}/resumeresumeStoryJobstory:writeyesresponse:StoryJobResumeResponse

Library

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/library/audiolistMyLibraryAudiostory:readnoresponse:MyLibraryAudio
POST /api/v1/library/audioimportMyLibraryAudiostory:writeyesrequest:MyLibraryAudioImportRequest<br>response:MyLibraryAudioImportResponse
PATCH /api/v1/library/audio/{assetId}renameMyLibraryAudiostory:writenorequest:MyLibraryAudioRenameRequest<br>response:MyLibraryAudioRenameResponse
GET /api/v1/library/imageslistMyLibraryImagesstory:readnoresponse:MyLibraryImages

Pitch Deck

EndpointOperation IDScopeIdempotentSchemas
DELETE /api/v1/pitch-decks/{jobId}deletePitchDeckstory:writenoresponse:VideoDeleteResult
PATCH /api/v1/pitch-decks/{jobId}renamePitchDeckstory:writenorequest:ArtifactRenameRequest<br>response:RenamedVideo
GET /api/v1/pitch-decks/{jobId}/bell-lanegetPitchDeckBellLanestory:readno
POST /api/v1/pitch-decks/{jobId}/bell-lanestrikePitchDeckBellOnTheBeatstory:writeyes
POST /api/v1/pitch-decks/{jobId}/bell-lane/removeremovePitchDeckBellLanestory:writeyes
GET /api/v1/pitch-decks/{jobId}/cameragetPitchDeckCamerastory:readnoresponse:CameraView
POST /api/v1/pitch-decks/{jobId}/camerasetPitchDeckCamerastory:writeyesrequest:CameraSetRequest<br>response:CameraSetAck
POST /api/v1/pitch-decks/{jobId}/cancel-rendercancelPitchDeckRenderartifact:publishyesresponse:RenderCancelResult
GET /api/v1/pitch-decks/{jobId}/chaptersgetPitchDeckChaptersstory:readnoresponse:PitchDeckChapters
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/abandon-takeabandonPitchDeckTakeartifact:publishyesrequest:TakeAbandonRequest<br>response:TakeAbandonResult
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-linedropPitchDeckChapterLinestory:writeyesrequest:PitchDeckDropLineRequest<br>response:PitchDeckDropLineAnswer
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/repair-takerepairPitchDeckTakeartifact:publishyesrequest:TakeRepairRequest<br>response:TakeRepairAnswer
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/select-takeselectPitchDeckTakestory:writeyesrequest:PitchDeckSelectTakeRequest<br>response:PitchDeckSelectTakeAck
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/stage-voice-overstageVoiceOverPitchDeckTakeartifact:publishyesrequest:StageVoiceOverRequest<br>response:StageVoiceOverAnswer
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/take-repair-overrideoverridePitchDeckTakeRepairstory:writeyesrequest:TakeRepairOverrideRequest<br>response:TakeRepairOverrideAck
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/trim-taketrimPitchDeckTakestory:writeyesrequest:TakeTrimRequest<br>response:TakeTrimQueued
POST /api/v1/pitch-decks/{jobId}/chapters/insertinsertPitchDeckChapterstory:writeyesrequest:PitchDeckInsertChapterRequest<br>response:PitchDeckInsertChapterAck
POST /api/v1/pitch-decks/{jobId}/chapters/refinerefinePitchDeckChapterstory:writeyesrequest:PitchDeckChapterRefineRequest<br>response:PitchDeckChapterRefineAck
POST /api/v1/pitch-decks/{jobId}/chapters/removeremovePitchDeckChapterstory:writeyesrequest:PitchDeckRemoveChapterRequest<br>response:PitchDeckRemoveChapterAck
POST /api/v1/pitch-decks/{jobId}/chapters/render-cliprenderPitchDeckChapterClipartifact:publishyesrequest:PitchDeckRenderClipRequest<br>response:PitchDeckRenderAnswer
POST /api/v1/pitch-decks/{jobId}/chapters/reorderreorderPitchDeckChaptersstory:writeyesrequest:PitchDeckReorderChaptersRequest<br>response:PitchDeckReorderChaptersAck
POST /api/v1/pitch-decks/{jobId}/closing-sequenceupdatePitchDeckClosingSequencestory:writeyesrequest:PitchDeckClosingSequenceUpdateRequest<br>response:PitchDeckClosingSequenceUpdateAck
POST /api/v1/pitch-decks/{jobId}/duplicateduplicatePitchDeckstory:writeyesrequest:PitchDeckDuplicateRequest<br>response:PitchDeckDuplicate
POST /api/v1/pitch-decks/{jobId}/finishfinishPitchDeckartifact:publishyesrequest:PitchDeckFinishRequest<br>response:PitchDeckFinishAnswer
GET /api/v1/pitch-decks/{jobId}/intentgetPitchDeckIntentstory:readnoresponse:VideoIntent
POST /api/v1/pitch-decks/{jobId}/intentupdatePitchDeckIntentstory:writeyesrequest:VideoIntentEditRequest<br>response:VideoIntentEditAck
POST /api/v1/pitch-decks/{jobId}/interludesupdatePitchDeckInterludesstory:writeyesrequest:PitchDeckInterludesUpdateRequest<br>response:PitchDeckInterludesUpdateAck
GET /api/v1/pitch-decks/{jobId}/lookgetPitchDeckLookstory:readnoresponse:FinishView
POST /api/v1/pitch-decks/{jobId}/looksetPitchDeckLookstory:writeyesrequest:FinishSetRequest<br>response:FinishSetAck
POST /api/v1/pitch-decks/{jobId}/more-fixesallowMorePitchDeckFixesartifact:publishyesrequest:MoreFixesRequest<br>response:MoreFixesAnswer
GET /api/v1/pitch-decks/{jobId}/motion-blurgetPitchDeckMotionBlurstory:readnoresponse:MotionBlurView
POST /api/v1/pitch-decks/{jobId}/motion-blursetPitchDeckMotionBlurstory:writeyesrequest:MotionBlurSetRequest<br>response:MotionBlurSetAck
GET /api/v1/pitch-decks/{jobId}/narratorgetPitchDeckNarratorstory:readno
POST /api/v1/pitch-decks/{jobId}/narratorsetPitchDeckNarratorstory:writeyes
POST /api/v1/pitch-decks/{jobId}/pdfrequestPitchDeckPdfstory:writeyesresponse:PitchDeckPdf
POST /api/v1/pitch-decks/{jobId}/plan/approveapprovePitchDeckPlanstory:writeyesrequest:PitchDeckPlanApproveRequest<br>response:PitchDeckRenderAnswer
POST /api/v1/pitch-decks/{jobId}/publishpublishPitchDeckstory:writeyesresponse:PitchDeckPublish
GET /api/v1/pitch-decks/{jobId}/quiet-trackgetPitchDeckQuietTrackstory:readnoresponse:QuietTrackView
POST /api/v1/pitch-decks/{jobId}/quiet-tracksetPitchDeckQuietTrackstory:writeyesrequest:QuietTrackSetRequest<br>response:QuietTrackSetAck
POST /api/v1/pitch-decks/{jobId}/reassemblereassemblePitchDeckstory:writeyesresponse:RenderReassembleAck
GET /api/v1/pitch-decks/{jobId}/resolutiongetPitchDeckResolutionstory:readno
POST /api/v1/pitch-decks/{jobId}/resolutionsetPitchDeckResolutionstory:writeyes
GET /api/v1/pitch-decks/{jobId}/score-to-picturegetPitchDeckScoreToPicturestory:readno
POST /api/v1/pitch-decks/{jobId}/score-to-picturescorePitchDeckToPictureartifact:publishyes
POST /api/v1/pitch-decks/{jobId}/score-to-picture/revertrevertPitchDeckScoreToPicturestory:writeyes
GET /api/v1/pitch-decks/{jobId}/storyboard/audio-timelinegetPitchDeckAudioTimelinestory:readno
POST /api/v1/pitch-decks/{jobId}/storyboard/audio-timelineeditPitchDeckAudioTimelinestory:writeyes
GET /api/v1/pitch-decks/{jobId}/storyboard/audiogetPitchDeckSceneAudiostory:readno
GET /api/v1/pitch-decks/{jobId}/storyboard/coveragegetPitchDeckStoryboardCoveragestory:readno
POST /api/v1/pitch-decks/{jobId}/storyboard/coveragegeneratePitchDeckStoryboardCoveragestory:writeyes
POST /api/v1/pitch-decks/{jobId}/storyboard/direct-text-motiondirectPitchDeckTextMotionstory:writeyesrequest:PitchDeckDirectTextMotionRequest<br>response:PitchDeckDirectTextMotionAck
POST /api/v1/pitch-decks/{jobId}/storyboard/musiceditPitchDeckSceneMusicstory:writeyes
POST /api/v1/pitch-decks/{jobId}/storyboard/regenerate-textregeneratePitchDeckTextartifact:publishyesrequest:PitchDeckChapterIndexRequest<br>response:PitchDeckTextRenderAnswer
POST /api/v1/pitch-decks/{jobId}/storyboard/sfxeditPitchDeckSceneSfxstory:writeyes
GET /api/v1/pitch-decks/{jobId}/storyboard/sound-mapgetPitchDeckSoundMapstory:readno
POST /api/v1/pitch-decks/{jobId}/title-sequenceupdatePitchDeckTitleSequencestory:writeyesrequest:PitchDeckTitleSequenceUpdateRequest<br>response:PitchDeckTitleSequenceUpdateAck
POST /api/v1/pitch-decks/{jobId}/title-sequence/motion-closesrenderPitchDeckTitleMotionClosesartifact:publishyesrequest:PitchDeckTitleMotionClosesRequest<br>response:PitchDeckTitleMotionClosesAnswer
POST /api/v1/pitch-decks/{jobId}/unpublishunpublishPitchDeckstory:writeyesresponse:PitchDeckUnpublish
GET /api/v1/pitch-decks/{jobId}/versionslistPitchDeckVersionsstory:readnoresponse:PitchDeckVersions
GET /api/v1/pitch-decks/{jobId}/versions/{number}getPitchDeckVersionstory:readnoresponse:PitchDeckVersionRead
POST /api/v1/pitch-decks/{jobId}/versions/{number}/ziprequestPitchDeckVersionZipstory:writeyesresponse:VideoVersionZipAck
GET /api/v1/pitch-decks/{jobId}/video-coveragegetPitchDeckVideoCoveragestory:readnoresponse:VideoCoverageEnvelope
POST /api/v1/pitch-decks/{jobId}/video-coveragegeneratePitchDeckVideoCoveragestory:writeyesrequest:VideoCoverageGenerateRequest<br>response:VideoCoverageEnvelope
POST /api/v1/pitch-decks/{jobId}/video-exportexportPitchDeckVideostory:writeyesresponse:PitchDeckExportAck
GET /api/v1/pitch-decks/{jobId}/video-modelgetPitchDeckVideoModelstory:readnoresponse:PitchDeckVideoModelView
POST /api/v1/pitch-decks/{jobId}/video-modelsetPitchDeckVideoModelstory:writeyesrequest:PitchDeckVideoModelSetRequest<br>response:PitchDeckVideoModelSetAck
POST /api/v1/pitch-decks/{jobId}/visual-grammarupdatePitchDeckVisualGrammarstory:writeyesrequest:PitchDeckVisualGrammarUpdateRequest<br>response:PitchDeckVisualGrammarUpdateAck

Plans

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-plans/{planId}getStoryPlanstory:readnoresponse:StoryPlanEnvelopeResponse
PATCH /api/v1/story-plans/{planId}renameStoryPlanstory:writenorequest:ArtifactRenameRequest<br>response:StoryPlanEnvelopeResponse
POST /api/v1/story-plans/{planId}/approveapproveStoryPlanstory:writeyesrequest:StoryPlanApprovalRequest<br>response:StoryPlanEnvelopeResponse
POST /api/v1/story-plans/{planId}/rejectrejectStoryPlanstory:writeyesresponse:StoryPlanEnvelopeResponse
POST /api/v1/story-plans/{planId}/resumeresumeStoryPlanstory:writeyesresponse:StoryPlanEnvelopeResponse
GET /api/v1/story-projects/{projectId}/story-planslistStoryPlansstory:readnoresponse:StoryPlanList
POST /api/v1/story-projects/{projectId}/story-planscreateStoryPlanstory:writeyesrequest:StoryPlanCreate<br>response:StoryPlanEnvelopeResponse

Projects

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-projectslistStoryProjectsstory:readnoresponse:StoryProjectList
POST /api/v1/story-projectscreateStoryProjectstory:writeyesrequest:StoryProjectCreate<br>response:StoryProjectEnvelope
DELETE /api/v1/story-projects/{projectId}deleteStoryProjectstory:writenoresponse:ProjectDeletionResult
GET /api/v1/story-projects/{projectId}getStoryProjectstory:readnoresponse:StoryProjectDetailEnvelope
PATCH /api/v1/story-projects/{projectId}updateStoryProjectstory:writenorequest:StoryProjectPatch<br>response:StoryProjectEnvelope
GET /api/v1/story-projects/{projectId}/cast-canongetProjectCastCanonstory:readnoresponse:CastCanonEnvelope
PATCH /api/v1/story-projects/{projectId}/cast-canonsaveProjectCastCanonstory:writenorequest:CastCanonPatch<br>response:CastCanonEnvelope
GET /api/v1/story-projects/{projectId}/cast-lookgetProjectCastLookstory:readnoresponse:CastLookRead
PATCH /api/v1/story-projects/{projectId}/cast-looksetProjectCastLookstory:writenorequest:CastLookPatch<br>response:CastLookSaved
POST /api/v1/story-projects/{projectId}/cast-portraits/choosechooseProjectCastPortraitstory:writeyesrequest:CastPortraitChooseRequest<br>response:CastPortraitChooseResponse
POST /api/v1/story-projects/{projectId}/cast-portraits/designdesignProjectCastPortraitsartifact:publishyesrequest:CastPortraitDesignRequest<br>response:CastPortraitDesignEnvelope
GET /api/v1/story-projects/{projectId}/cast-portraits/designslistProjectCastPortraitDesignsstory:readnoresponse:CastPortraitDesignListResponse
GET /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coveragegetProjectCastPortraitCoveragestory:readnoresponse:CastingPortraitCoverageResponse
POST /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coveragegenerateProjectCastPortraitCoveragestory:writeyesrequest:CastingCoverageGenerateRequest<br>response:CastingPortraitCoverageResponse
PATCH /api/v1/story-projects/{projectId}/cast-voicesetProjectCastVoicestory:writenorequest:CastVoiceSetRequest<br>response:CastVoiceSetResponse
POST /api/v1/story-projects/{projectId}/cast-voice/choosechooseProjectCastVoicestory:writeyesrequest:CastVoiceChooseRequest<br>response:CastVoiceChooseResponse
POST /api/v1/story-projects/{projectId}/cast-voice/designdesignProjectCastVoiceartifact:publishyesrequest:CastVoiceDesignRequest<br>response:CastVoiceDesignEnvelope
GET /api/v1/story-projects/{projectId}/cast-voice/designslistProjectCastVoiceDesignsstory:readnoresponse:CastVoiceDesignListResponse
GET /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coveragegetProjectCastVoiceCoveragestory:readnoresponse:CastingCoverageResponse
POST /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coveragegenerateProjectCastVoiceCoveragestory:writeyesrequest:CastingCoverageGenerateRequest<br>response:CastingCoverageResponse
GET /api/v1/story-projects/{projectId}/castgetProjectCaststory:readnoresponse:ProjectCastReadEnvelope
PATCH /api/v1/story-projects/{projectId}/castupdateEpisodeCharacterDirectionstory:writenorequest:EpisodeCharacterDirectionRequest<br>response:EpisodeCharacterDirectionResult
POST /api/v1/story-projects/{projectId}/castgenerateProjectCastartifact:publishyesrequest:GenerateProjectCastRequest<br>response:ProjectCastEnvelope
GET /api/v1/story-projects/{projectId}/episodeslistProjectEpisodesstory:readnoresponse:ProjectEpisodesResponse
POST /api/v1/story-projects/{projectId}/episodesstartPlannedEpisodestory:writeyesrequest:StartPlannedEpisodeRequest<br>response:StartPlannedEpisodeResponse
GET /api/v1/story-projects/{projectId}/mood-boardgetProjectMoodBoardstory:readnoresponse:MoodBoardEnvelope
POST /api/v1/story-projects/{projectId}/mood-board/frameskeepProjectMoodBoardFramestory:writeyesrequest:MoodBoardFrameKeepRequest<br>response:MoodBoardEnvelope
DELETE /api/v1/story-projects/{projectId}/mood-board/frames/{frameId}dropProjectMoodBoardFramestory:writenoresponse:MoodBoardEnvelope
POST /api/v1/story-projects/{projectId}/mood-board/render-framesrenderProjectMoodBoardFramesartifact:publishyesrequest:MoodBoardRenderRequest<br>response:MoodBoardRenderEnvelope
GET /api/v1/story-projects/{projectId}/outline-mapgetProjectOutlineMapstory:readnoresponse:OutlineMapEnvelope
PATCH /api/v1/story-projects/{projectId}/outline-mapsaveProjectEpisodeOutlinestory:writenorequest:SaveEpisodeOutlineRequest<br>response:OutlineMapEnvelope
GET /api/v1/story-projects/{projectId}/outline-map/coveragegetProjectOutlineCoveragestory:readnoresponse:OutlineCoverageEnvelope
POST /api/v1/story-projects/{projectId}/outline-map/coveragegenerateProjectOutlineCoveragestory:writeyesrequest:OutlineCoverageGenerateRequest<br>response:OutlineCoverageEnvelope
POST /api/v1/story-projects/{projectId}/restorerestoreStoryProjectstory:writeyesresponse:ProjectRestoreResult
POST /api/v1/story-projects/{projectId}/seasonscreateProjectSeasonstory:writeyesrequest:ProjectSeasonCreateRequest<br>response:ProjectSeasonCreateResponse
GET /api/v1/story-projects/{projectId}/series-biblegetProjectSeriesBiblestory:readnoresponse:SeriesBibleEnvelope
PATCH /api/v1/story-projects/{projectId}/series-biblesaveProjectSeriesBiblestory:writenorequest:SeriesBiblePatch<br>response:SeriesBibleSaveResult
POST /api/v1/story-projects/{projectId}/series-biblegenerateProjectSeriesBiblestory:writeyesrequest:SeriesBibleGenerateRequest<br>response:SeriesBibleSaveResult
GET /api/v1/story-projects/{projectId}/series-bible/charactersgetSeriesBibleCharacterstory:readnoresponse:SeriesBibleCharacterResult
PATCH /api/v1/story-projects/{projectId}/series-bible/charactersupdateSeriesBibleCharacterstory:writenorequest:SeriesBibleCharacterUpdateRequest<br>response:SeriesBibleCharacterResult
GET /api/v1/story-projects/{projectId}/series-bible/coveragegetProjectSeriesBibleCoveragestory:readnoresponse:SeriesBibleCoverageEnvelope
POST /api/v1/story-projects/{projectId}/series-bible/coveragegenerateProjectSeriesBibleCoveragestory:writeyesrequest:SeriesBibleCoverageGenerateRequest<br>response:SeriesBibleCoverageEnvelope
GET /api/v1/story-projects/{projectId}/soundslistProjectSoundsstory:readno
GET /api/v1/story-projects/deletedlistDeletedStoryProjectsstory:readnoresponse:DeletedStoryProjectList
POST /api/v1/story-projects/from-scriptcreateStoryProjectFromScriptstory:writeyesrequest:StoryProjectFromScript<br>response:StoryProjectFromScriptEnvelope

Publishing

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/publishing-feeds/{seriesSlug}.xmlgetPublishingRssFeedno
GET /api/v1/publishing-provider-configslistPublishingProviderConfigspublishing:connectnoresponse:PublishingProviderConfigList
POST /api/v1/publishing-provider-configsupsertPublishingProviderConfigpublishing:connectyesrequest:PublishingProviderConfigUpsertRequest<br>response:PublishingProviderConfigEnvelope
GET /api/v1/publishing-releases/{releaseId}getPublishingReleasepublishing:readnoresponse:PublishingReleaseEnvelope
PATCH /api/v1/publishing-releases/{releaseId}updatePublishingReleasepublishing:writenorequest:PublishingReleaseUpdateRequest<br>response:PublishingReleaseEnvelope
POST /api/v1/publishing-releases/{releaseId}/cancelcancelPublishingReleasepublishing:publishyesresponse:PublishingReleaseEnvelope
POST /api/v1/publishing-releases/{releaseId}/description/generategeneratePublishingReleaseDescriptionpublishing:writeyesresponse:PublishingReleaseEnvelope
POST /api/v1/publishing-releases/{releaseId}/publishpublishPublishingReleasepublishing:publishyesresponse:PublishingReleaseEnvelope
POST /api/v1/publishing-releases/{releaseId}/refresh-mediarefreshPublishedReleaseMediapublishing:publishyesrequest:PublishingReleaseRefreshMediaRequest<br>response:PublishingReleaseEnvelope
POST /api/v1/publishing-releases/{releaseId}/scheduleschedulePublishingReleasepublishing:publishyesresponse:PublishingReleaseEnvelope
GET /api/v1/publishing-releases/{releaseId}/targetslistPublishingReleaseTargetspublishing:readnoresponse:PublishingTargetList
POST /api/v1/publishing-releases/{releaseId}/unpublishunpublishPublishingReleasepublishing:publishyesresponse:PublishingReleaseEnvelope
GET /api/v1/publishing-series/{seriesId}getPublishingSeriespublishing:readnoresponse:PublishingSeriesEnvelope
PATCH /api/v1/publishing-series/{seriesId}updatePublishingSeriespublishing:writenorequest:PublishingSeriesUpdateRequest<br>response:PublishingSeriesEnvelope
GET /api/v1/publishing-series/{seriesId}/analyticslistPublishingAnalyticsSnapshotspublishing:analyticsnoresponse:PublishingAnalyticsList
GET /api/v1/publishing-series/{seriesId}/destinationslistPublishingDestinationspublishing:readnoresponse:PublishingDestinationList
POST /api/v1/publishing-series/{seriesId}/destinationsupsertPublishingDestinationpublishing:connectyesrequest:PublishingDestinationUpsertRequest<br>response:PublishingDestinationEnvelope
GET /api/v1/publishing-series/{seriesId}/episodeslistShowEpisodespublishing:readnoresponse:ShowEpisodeList
POST /api/v1/publishing-series/{seriesId}/episodesproduceShowEpisodepublishing:writeyesresponse:ShowEpisodeProduce
POST /api/v1/publishing-series/{seriesId}/generate-cover-artgeneratePublishingSeriesCoverArtpublishing:writenorequest:PublishingCoverArtGenerateRequest<br>response:PublishingCoverArtGenerateResponse
GET /api/v1/publishing-series/{seriesId}/quotegetShowQuotepublishing:readnoresponse:ShowQuote
GET /api/v1/publishing-series/{seriesId}/releaseslistPublishingReleasespublishing:readnoresponse:PublishingReleaseList
POST /api/v1/publishing-series/{seriesId}/releasescreatePublishingReleasepublishing:writeyesrequest:PublishingReleaseCreateRequest<br>response:PublishingReleaseEnvelope
POST /api/v1/publishing-series/{seriesId}/source-previewpreviewShowSourcespublishing:readnoresponse:ShowSourcePreview
GET /api/v1/show-source-templateslistShowSourceTemplatespublishing:readnoresponse:ShowSourceCatalog
GET /api/v1/story-projects/{projectId}/publishing-serieslistPublishingSeriespublishing:readnoresponse:PublishingSeriesList
POST /api/v1/story-projects/{projectId}/publishing-seriescreatePublishingSeriespublishing:writeyesrequest:PublishingSeriesCreateRequest<br>response:PublishingSeriesEnvelope

Scripts

EndpointOperation IDScopeIdempotentSchemas
POST /api/v1/scriptsuploadScriptstory:writeyesrequest:ScriptUploadRequest<br>response:ScriptUploadResponse
DELETE /api/v1/scripts/{scriptUploadId}deleteScriptstory:writeno
GET /api/v1/scripts/{scriptUploadId}getScriptstory:readnoresponse:WriterScriptEnvelope
PATCH /api/v1/scripts/{scriptUploadId}updateScriptstory:writenorequest:ScriptMetadataPatch<br>response:WriterScriptEnvelope
PATCH /api/v1/scripts/{scriptUploadId}/contentwriteScriptContentstory:writenorequest:ScriptContentWriteRequest<br>response:ScriptContentWriteResponse
GET /api/v1/scripts/{scriptUploadId}/exportexportScriptstory:readnoresponse:ScriptExportResponse
POST /api/v1/scripts/{scriptUploadId}/finishfinishDraftstory:writeyesrequest:FinishDraftRequest<br>response:FinishDraftResponse
GET /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}getScriptLineTuningstory:readnoresponse:ScriptLineTuning
PATCH /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}updateScriptLinestory:writenorequest:ScriptLineEdit<br>response:ScriptLineTuning
GET /api/v1/scripts/{scriptUploadId}/overridesgetScriptOverridesstory:readnoresponse:ScriptOverrides
PATCH /api/v1/scripts/{scriptUploadId}/overridesupdateScriptOverridesstory:writenorequest:ScriptOverridesPatch<br>response:ScriptOverrides
GET /api/v1/scripts/{scriptUploadId}/sharegetScriptSharestory:readnoresponse:ScriptShareState
POST /api/v1/scripts/{scriptUploadId}/sharecreateScriptShareartifact:publishnorequest:CreateScriptShareRequest<br>response:CreateScriptShareResult
POST /api/v1/scripts/{scriptUploadId}/table-read/characters/removeremoveScriptTableReadCharacterstory:writenorequest:RemoveCharacterRequest<br>response:RemoveCharacterResult
POST /api/v1/scripts/{scriptUploadId}/table-read/prepareprepareScriptTableReadartifact:publishyesrequest:PrepareTableReadRequest<br>response:TableReadPrepareEnvelope
POST /api/v1/scripts/{scriptUploadId}/table-read/retry-analysisretryScriptTableReadAnalysisstory:writenoresponse:RetryCreativeAnalysisResult
POST /api/v1/scripts/{scriptUploadId}/versionsuploadScriptVersionstory:writeyesrequest:ScriptVersionUploadRequest
DELETE /api/v1/scripts/{scriptUploadId}/versions/{versionId}deleteScriptVersionstory:writenoresponse:ScriptVersionDeleteResponse

Seasons

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/season-runs/{runId}getStorySeasonRunstory:readnoresponse:SeasonRunEnvelope
POST /api/v1/season-runs/{runId}/advanceadvanceStorySeasonRunstory:write, artifact:publish, publishing:writeyesrequest:SeasonRunAdvanceRequest<br>response:SeasonRunEnvelope
POST /api/v1/season-runs/{runId}/approveapproveStorySeasonMapstory:writeyesrequest:SeasonRunApprovalRequest<br>response:SeasonRunEnvelope
PATCH /api/v1/season-runs/{runId}/episodes/{episodeId}updateStorySeasonEpisodestory:writenorequest:SeasonRunEpisodeUpdateRequest<br>response:SeasonRunEnvelope
GET /api/v1/story-projects/{projectId}/season-runslistStorySeasonRunsstory:readnoresponse:SeasonRunList
POST /api/v1/story-projects/{projectId}/season-runscreateStorySeasonRunstory:write, publishing:writeyesrequest:SeasonRunCreateRequest<br>response:SeasonRunEnvelope

Sources

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-projects/{projectId}/sourceslistStorySourcessource:readnoresponse:StorySourceList
POST /api/v1/story-projects/{projectId}/sourcescreateStorySourcesource:writeyesrequest:StorySourceCreate<br>response:StorySourceCreateResult
DELETE /api/v1/story-projects/{projectId}/sources/{sourceId}deleteStorySourcesource:writenoresponse:DeletionAck
GET /api/v1/story-projects/{projectId}/sources/{sourceId}getStorySourcesource:readnoresponse:StorySourceEnvelope

Table Read

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/table-read/performance-boothgetPerformanceBoothStatusstory:readno
POST /api/v1/table-read/performance-boothstartPerformanceBoothSessionstory:writeyes

Trailer

EndpointOperation IDScopeIdempotentSchemas
DELETE /api/v1/trailers/{jobId}deleteTrailerstory:writenoresponse:VideoDeleteResult
PATCH /api/v1/trailers/{jobId}renameTrailerstory:writenorequest:ArtifactRenameRequest<br>response:RenamedVideo
GET /api/v1/trailers/{jobId}/aspectgetTrailerAspectstory:readno
POST /api/v1/trailers/{jobId}/aspectsetTrailerAspectstory:writeyes
POST /api/v1/trailers/{jobId}/audio-policysetTrailerAudioPolicystory:writeyes
GET /api/v1/trailers/{jobId}/beatsgetTrailerBeatsstory:readnoresponse:TrailerBeats
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/abandon-takeabandonTrailerTakeartifact:publishyesrequest:TakeAbandonRequest<br>response:TakeAbandonResult
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/drop-linedropTrailerBeatLinestory:writeyesrequest:TrailerDropLineRequest<br>response:TrailerDropLineAnswer
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/repair-takerepairTrailerTakeartifact:publishyesrequest:TakeRepairRequest<br>response:TakeRepairAnswer
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/select-takeselectTrailerTakestory:writeyesrequest:TrailerSelectTakeRequest<br>response:TrailerSelectTakeAck
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/stage-voice-overstageVoiceOverTrailerTakeartifact:publishyesrequest:StageVoiceOverRequest<br>response:StageVoiceOverAnswer
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/take-repair-overrideoverrideTrailerTakeRepairstory:writeyesrequest:TakeRepairOverrideRequest<br>response:TakeRepairOverrideAck
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/trim-taketrimTrailerTakestory:writeyesrequest:TakeTrimRequest<br>response:TakeTrimQueued
POST /api/v1/trailers/{jobId}/beats/refinerefineTrailerBeatstory:writeyesrequest:TrailerBeatRefineRequest<br>response:TrailerBeatPreview
POST /api/v1/trailers/{jobId}/beats/render-cliprenderTrailerBeatClipartifact:publishyesrequest:TrailerRenderClipRequest<br>response:TrailerRenderAnswer
GET /api/v1/trailers/{jobId}/cameragetTrailerCamerastory:readnoresponse:CameraView
POST /api/v1/trailers/{jobId}/camerasetTrailerCamerastory:writeyesrequest:CameraSetRequest<br>response:CameraSetAck
POST /api/v1/trailers/{jobId}/cancel-rendercancelTrailerRenderartifact:publishyesresponse:RenderCancelResult
POST /api/v1/trailers/{jobId}/closing-sequenceupdateTrailerClosingSequencestory:writeyesrequest:TrailerClosingSequenceUpdateRequest<br>response:TrailerClosingSequenceUpdateAck
POST /api/v1/trailers/{jobId}/duplicateduplicateTrailerstory:writeyesrequest:TrailerDuplicateRequest<br>response:TrailerDuplicate
POST /api/v1/trailers/{jobId}/finishfinishTrailerartifact:publishyesrequest:TrailerFinishRequest<br>response:TrailerFinishAnswer
GET /api/v1/trailers/{jobId}/intentgetTrailerIntentstory:readnoresponse:VideoIntent
POST /api/v1/trailers/{jobId}/intentupdateTrailerIntentstory:writeyesrequest:VideoIntentEditRequest<br>response:VideoIntentEditAck
POST /api/v1/trailers/{jobId}/interludesupdateTrailerInterludesstory:writeyesrequest:TrailerInterludesUpdateRequest<br>response:TrailerInterludesUpdateAck
GET /api/v1/trailers/{jobId}/lookgetTrailerLookstory:readnoresponse:FinishView
POST /api/v1/trailers/{jobId}/looksetTrailerLookstory:writeyesrequest:FinishSetRequest<br>response:FinishSetAck
POST /api/v1/trailers/{jobId}/more-fixesallowMoreTrailerFixesartifact:publishyesrequest:MoreFixesRequest<br>response:MoreFixesAnswer
GET /api/v1/trailers/{jobId}/motion-blurgetTrailerMotionBlurstory:readnoresponse:MotionBlurView
POST /api/v1/trailers/{jobId}/motion-blursetTrailerMotionBlurstory:writeyesrequest:MotionBlurSetRequest<br>response:MotionBlurSetAck
GET /api/v1/trailers/{jobId}/narratorgetTrailerNarratorstory:readno
POST /api/v1/trailers/{jobId}/narratorsetTrailerNarratorstory:writeyes
POST /api/v1/trailers/{jobId}/plan/approveapproveTrailerPlanstory:writeyesrequest:TrailerPlanApproveRequest<br>response:TrailerRenderAnswer
GET /api/v1/trailers/{jobId}/quiet-trackgetTrailerQuietTrackstory:readnoresponse:QuietTrackView
POST /api/v1/trailers/{jobId}/quiet-tracksetTrailerQuietTrackstory:writeyesrequest:QuietTrackSetRequest<br>response:QuietTrackSetAck
POST /api/v1/trailers/{jobId}/reassemblereassembleTrailerstory:writeyesresponse:RenderReassembleAck
GET /api/v1/trailers/{jobId}/render-statesgetTrailerRenderStatesstory:readnoresponse:TrailerBeatRenderStates
GET /api/v1/trailers/{jobId}/resolutiongetTrailerResolutionstory:readno
POST /api/v1/trailers/{jobId}/resolutionsetTrailerResolutionstory:writeyes
GET /api/v1/trailers/{jobId}/score-to-picturegetTrailerScoreToPicturestory:readno
POST /api/v1/trailers/{jobId}/score-to-picturescoreTrailerToPictureartifact:publishyes
POST /api/v1/trailers/{jobId}/score-to-picture/revertrevertTrailerScoreToPicturestory:writeyes
GET /api/v1/trailers/{jobId}/storyboard/audio-timelinegetTrailerAudioTimelinestory:readno
POST /api/v1/trailers/{jobId}/storyboard/audio-timelineeditTrailerAudioTimelinestory:writeyes
GET /api/v1/trailers/{jobId}/storyboard/audiogetTrailerSceneAudiostory:readno
GET /api/v1/trailers/{jobId}/storyboard/coveragegetTrailerStoryboardCoveragestory:readno
POST /api/v1/trailers/{jobId}/storyboard/coveragegenerateTrailerStoryboardCoveragestory:writeyes
POST /api/v1/trailers/{jobId}/storyboard/direct-text-motiondirectTrailerTextMotionstory:writeyesrequest:TrailerDirectTextMotionRequest<br>response:TrailerDirectTextMotionAck
POST /api/v1/trailers/{jobId}/storyboard/insert-beatinsertTrailerBeatstory:writeyesrequest:TrailerInsertBeatRequest<br>response:TrailerBeatOrderAck
POST /api/v1/trailers/{jobId}/storyboard/move-beatmoveTrailerBeatstory:writeyesrequest:TrailerMoveBeatRequest<br>response:TrailerBeatOrderAck
POST /api/v1/trailers/{jobId}/storyboard/musiceditTrailerSceneMusicstory:writeyes
POST /api/v1/trailers/{jobId}/storyboard/regenerate-textregenerateTrailerTextartifact:publishyesrequest:TrailerBeatIndexRequest<br>response:TrailerTextRenderAnswer
POST /api/v1/trailers/{jobId}/storyboard/remove-beatremoveTrailerBeatstory:writeyesrequest:TrailerRemoveBeatRequest<br>response:TrailerBeatOrderAck
POST /api/v1/trailers/{jobId}/storyboard/restore-takerestoreTrailerTakestory:writeyesrequest:TrailerRestoreTakeRequest<br>response:TrailerRestoreTakeAck
POST /api/v1/trailers/{jobId}/storyboard/sfxeditTrailerSceneSfxstory:writeyes
GET /api/v1/trailers/{jobId}/storyboard/sound-mapgetTrailerSoundMapstory:readno
GET /api/v1/trailers/{jobId}/storyboard/takesgetTrailerBeatTakesstory:readnoresponse:TrailerBeatTakes
GET /api/v1/trailers/{jobId}/versionslistTrailerVersionsstory:readnoresponse:TrailerVersions
GET /api/v1/trailers/{jobId}/versions/{number}getTrailerVersionstory:readnoresponse:TrailerVersionRead
POST /api/v1/trailers/{jobId}/versions/{number}/ziprequestTrailerVersionZipstory:writeyesresponse:VideoVersionZipAck
GET /api/v1/trailers/{jobId}/video-coveragegetTrailerVideoCoveragestory:readnoresponse:VideoCoverageEnvelope
POST /api/v1/trailers/{jobId}/video-coveragegenerateTrailerVideoCoveragestory:writeyesrequest:VideoCoverageGenerateRequest<br>response:VideoCoverageEnvelope
POST /api/v1/trailers/{jobId}/video-exportexportTrailerVideostory:writeyesresponse:TrailerExportAck

Voices

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/likeness-consentslistLikenessConsentsstory:readnoresponse:LikenessConsentList
POST /api/v1/likeness-consents/{consentId}/revokerevokeLikenessConsentstory:writeyesresponse:StudioLikenessConsent
POST /api/v1/likeness-consents/linkscreateLikenessConsentLinkstory:writeyesresponse:LikenessConsentLinkResponse
GET /api/v1/voice-migrationslistVoiceMigrationsstory:readnoresponse:VoiceMigrationListResponse
POST /api/v1/voice-migrationsmigrateVoicestory:writeyesrequest:VoiceMigrationRequest<br>response:VoiceMigrationEnvelope
POST /api/v1/voice-migrations/{migrationId}/undoundoVoiceMigrationstory:writeyesresponse:VoiceMigrationUndoResponse
GET /api/v1/voiceslistStudioVoicesstory:readnoresponse:StudioVoiceListResponse
DELETE /api/v1/voices/{voiceId}deleteStudioVoicestory:writenoresponse:StudioVoiceDeleteResponse
PATCH /api/v1/voices/{voiceId}renameStudioVoicestory:writenorequest:StudioVoiceRenameRequest<br>response:StudioVoiceRenameResponse
POST /api/v1/voices/{voiceId}/consent-linkcreateVoiceConsentLinkstory:writeyesresponse:VoiceConsentLinkResponse
POST /api/v1/voices/{voiceId}/revoke-consentrevokeVoiceConsentstory:writeyesresponse:VoiceConsentRevokeResponse
POST /api/v1/voices/clone-linkcreateVoiceCloneLinkstory:writeyesresponse:VoiceCloneLinkResponse
POST /api/v1/voices/previewpreviewStudioVoicestory:writeyesrequest:VoicePreviewRequest<br>response:VoicePreviewResponse
GET /api/v1/voices/pro/{jobId}getProVoiceClonestory:readnoresponse:ProVoiceCloneStatus
GET /api/v1/voices/pro/scriptgetProVoiceCloneScriptstory:readnoresponse:ProVoiceCloneScript
POST /api/v1/voices/pro/startstartProVoiceClonestory:writeyesrequest:ProVoiceCloneStartRequest<br>response:ProVoiceCloneStartResult
POST /api/v1/voices/pro/trainstartProVoiceCloneTrainingstory:writeyesrequest:ProVoiceCloneTrainRequest<br>response:ProVoiceCloneTrainResult

Error codes

Every error response has the same shape: { "error": { "code", "message", "requestId" } }. Match on code; the message text can change.

CodeMeaning
authentication_requiredNo bearer API key was supplied in the Authorization header.
invalid_api_keyThe API key is malformed, unknown, or does not match the stored secret.
api_key_revokedThe API key has been revoked by an account owner.
api_key_expiredThe API key has passed its configured expiration timestamp.
account_disabledThe account that owns this API key has been disabled.
ip_not_allowedThe request originated from an IP that is not in the key allowlist.
insufficient_scopeThe credential does not include the scope required for this endpoint. The endpoint exists — error.details.missingScopes names what is missing. On an OAuth connector, disconnect and sign in again approving that access; on an sh_ key, mint a new key with those scopes.
rate_limitedThe per-key + per-IP rate limit for this route family was exceeded.
idempotency_key_requiredThe endpoint requires an Idempotency-Key header for safe retries.
idempotency_conflictA request with the supplied Idempotency-Key is already processing or used incompatible parameters.
validation_failedThe request payload failed validation. The error message names the offending field.
project_not_foundThe story project does not exist, was deleted, or is owned by another account.
source_not_foundThe story source does not exist, was deleted, or is owned by another account.
source_type_unsupportedThe requested source type is not yet supported by this API phase. Check /api/v1/capabilities.
source_too_largeThe source payload exceeds the documented size limit. See details.maxBytes.
source_incompleteA source declared as full context failed its producer-specific completeness proof and was rejected before generation.
source_fetch_failedA URL or PDF source could not be safely fetched (SSRF block, redirect limit, size limit, content-type mismatch, or upstream error).
story_plan_not_foundThe story plan does not exist, was deleted, or is owned by another account.
story_plan_state_invalidThe story plan is in a state that does not allow the requested operation. See details.status and details.allowed.
story_plan_failedStoryPlan generation or refinement failed. See details for the underlying reason when available.
season_run_not_foundThe season run does not exist, was deleted, or is owned by another account.
season_run_state_invalidThe season run or episode is not at the required lifecycle state. Reload it and follow nextAction before retrying.
story_job_not_foundThe story job does not exist, was deleted, or is owned by another account.
story_job_state_invalidThe story job is in a state that does not allow the requested operation (e.g. canceling a job that has already reached a terminal state). See details.status and details.allowed.
artifact_not_foundThe story artifact does not exist or is owned by another account.
artifact_not_readyThe artifact is not in a state where this operation is valid yet (e.g. requesting an MP4 render before the share link exists). See details.status.
artifact_generation_failedThe artifact adapter failed to produce a shareable output. The job and artifact rows stay inspectable; see the artifact failureCode / failureMessage.
publishing_series_not_foundThe publishing series does not exist, was deleted, or is owned by another account.
publishing_destination_not_foundThe publishing destination does not exist, was deleted, or is owned by another account.
publishing_release_not_foundThe publishing release does not exist, was deleted, or is owned by another account.
publishing_release_state_invalidThe publishing release is in a state that does not allow the requested operation. See details.status and details.allowed.
publishing_asset_not_readyThe release does not have a finalized, ready asset for the requested publish operation.
publishing_asset_staleThe source artifact changed after the release asset was promoted. Finalize the current source before publishing.
project_precondition_failedThe project has not reached the development stage this call needs, so nothing was created, queued or charged. details.stage names the stage it has not finished (premise, premise_coverage, planning, full_coverage; ready when the stage is passed and a narrower precondition refused, such as a mood-board render with no image model bound), details.missingFields what that stage still lacks, and details.canPlan / details.canStartEpisode what the project can do now. Finish the named stage — do not retry: the identical call refuses the same way until it is done. GET /story-projects/{projectId} reports the same position as project.workspaceGate without attempting anything — read it first.
spend_subject_unresolvedThe project gate could not find the artifact, screenplay version, episode or project this paid call is for under your account, so it refused instead of guessing — nothing was created, queued or charged. details.subject is the kind it looked for (artifact, script_upload, script, project) and details.id the id. Check the id; retrying the same one refuses the same way.
insufficient_creditsThe account does not have enough Studio Credits to reserve this job. See details.required and details.available. A story job's refusal also carries details.jobId: null when the job was refused before it was created, or the id of the one job the Idempotency-Key is bound to — retrying that key after topping up resumes that job, it never creates another.
internal_errorThe Sleeper Hit Story API failed unexpectedly. Retrying with the same Idempotency-Key is safe.
trailer_not_foundNo trailer with that id, or it belongs to another account.
trailer_state_invalidThe trailer exists and the request is well-formed, but the trailer, its beat, its cast or its plates are not in a state that allows it — a plan approved outside draft, a take chosen or a beat rendered outside review/complete, an export before the trailer is finished, a finish while a call has no selected take, a narrated cut with no narrator, a re-voiced take selected (it is never played), a beat with no caption or footage-only when text was asked for, or a render the compile blocked. Nothing was reserved. A render refusal carries details.refusal = { code, action, fix } — 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 — plus details.blocked[], one entry per beat the compile could not render. The identical request succeeds once the trailer is put right.
pitch_deck_not_foundNo pitch deck with that id, or it belongs to another account.
pitch_deck_state_invalidThe 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; details.refusal names the fix. State, not payload.
pitch_deck_version_not_foundThe deck has no version with that number. Read its versions (GET /pitch-decks/{jobId}/versions) for the numbers it has; a version is kept each time the deck's master is published.
trailer_version_not_foundThe trailer has no version with that number. Read its versions (GET /trailers/{jobId}/versions) for the numbers it has; a version is kept each time the trailer's master is published.
story_job_not_resumableThe job exists but has no resumable checkpoint — it either finished or failed past the point a resume can start from.
script_not_foundNo screenplay with that id, or it belongs to another account.
cast_precondition_failedA cast is not ready, so nothing was created, quoted or charged. On the casting step: nobody castable, nobody with a description, or no image model bound. On a table_read job: the project cast canon (+ the request's voiceMap) does not cover every character (details.reason: no_cast_canon, cast_canon_collision, cast_canon_incomplete), an adopted scriptUploadId is a draft or not cast (script_not_finalized, script_not_cast_ready), or a resumed job's own screenplay voices someone uncast (episode_cast_incomplete); details.missing lists each member and what it lacks (voice, and unless details.audioOnly, face, body, sheet). Complete the cast — do not retry: the identical call refuses the same way until it is done. GET /story-projects/{projectId} reports the canon half as project.tableReadReadiness.
table_read_not_preparedThe read's table read is not paid for yet, so nothing was started, rendered or charged. A live read, a durable audio render (finalize) and the read's sound effects and music wait until it is PREPARED — charged once per screenplay version: POST /scripts/{scriptUploadId}/table-read/prepare (MCP prepare_table_read, CLI script table-read prepare), or Continue to Table Read in the Writing Lab. A read made by a Story API job is paid by that job. Prepare it, then retry.
table_read_not_failedThe read's creative analysis is not in a FAILED state, so there is nothing to retry. Only a read whose analysis failed can be re-run (POST /scripts/{scriptUploadId}/table-read/retry-analysis, MCP retry_creative_analysis, CLI script table-read retry-analysis, or the Writing Lab failed card's Try Again). Nothing was changed or charged.
voice_clone_not_foundNo voice clone with that id, or it belongs to another account.
mood_board_fullThe mood board already holds the maximum number of frames that can bind a render. Drop one before keeping another.
fal_account_lockedThe upstream generation provider has locked the studio account, usually for billing. Nothing was charged.
location_plate_not_foundThe script stores no location plate at that key. Read the location plates (GET /artifacts/{artifactId}/location-plates) for the keys it does store; a plate the script has not made yet is made when a video renders.
location_plate_precondition_failedThe plate cannot be remade yet, and nothing was priced or charged: it is not ready, a remake is already running for it, the plate it is cropped from is missing, or no image model is bound. The message says which; the identical call succeeds once the plate is put right.
voice_not_foundNo voice with that id in your library (GET /voices lists the ones you own), or a voice you may not use: another writer's cloned or designed voice is never previewed, cast, pinned or migrated onto. A catalog voice can be previewed and assigned, but only your own voices can be renamed or deleted.
voice_design_not_foundNo cast voice design with that id in this project. designId comes from the answer of POST /story-projects/{projectId}/cast-voice/design for the same project.
voice_in_useThe voice is still pinned in a cast canon or spoken in a read, so it was not deleted. details.uses names where; repoint those first, or send the delete again with confirmed: true to delete it anyway (those characters will have no voice until they are recast).
cast_voice_precondition_failedThe read or project is not ready for this cast voice operation, and nothing was priced or charged: the character has no lines to speak, there is no earlier voice to restore, or the read has no finished recording to re-voice. The message says which and what to do first.
script_in_useThe script was not deleted: something live still depends on it. details.uses names each (a published or scheduled release, a running job, a season-run slot, a pitch deck or a trailer); unpublish, cancel or delete those first, then delete the script again.
script_state_invalidThe script's state refuses this change: the most common is deleting a script's only version, which leaves no script — delete the whole script instead (DELETE /scripts/{scriptId}). The message says which.
plan_limit_reachedYour plan does not allow this: an upload that would take you past the plan's Writers Lab page allowance (the message gives the pages in use and the pages this upload adds) or a second version of a script on the free plan, or a second screenplay coverage report on the free plan (it includes one). details carries the plan and the numbers. Upgrade the plan, or delete scripts you no longer need, then try again.
usage_limit_reachedThis month's cap on your coverage reports (screenplay, Series Bible premise and full, outline) or table-read generations (scene music, scene atmosphere, backdrop prompts) is used up, so nothing was queued or charged. details carries feature (COVERAGE or TABLE_READ), limit, used and resetsAt (the first of next month, 00:00 UTC). It is state, not a rate: do not retry before resetsAt — the same call refuses the same way until then.
cast_voice_casting_coverage_failedThe candidate voice you chose FAILED its casting coverage (a model listened to the candidates and scored each against the brief), so nothing was cloned or pinned. details.castingCoverage carries its score, the bar, why (flags, gateReasons), the candidate it recommends instead and, when every candidate failed, a revised brief to design again from. Choose the recommendation, design again, or send acknowledgeCastingCoverage: true only once the writer has heard the failure and chosen it anyway.
cast_portrait_casting_coverage_failedThe headshot you chose FAILED its casting coverage (a model looked at the candidates and scored each against the look and the Series Bible), so nothing was pinned. details.castingCoverage carries its score, the bar, why (flags, gateReasons), the headshot it recommends instead and, when every one failed, a revised look to draw again from. Choose the recommendation, draw again, or send acknowledgeCastingCoverage: true only once the writer has seen the failure and chosen it anyway.
voice_retiredA voice its provider has retired (it can no longer speak) is in the way, and nothing was queued, charged or changed. A finalize, export, render, live read, re-voice or preview that would speak it refuses before anything is synthesized; a cast, pin or choose refuses to add it; a migration refuses a replacement whose provider is retiring or retired. details.voices names each voice (character, voiceId, voiceName, provider, retiresAt). Migrate those voices to a new voice (POST /voice-migrations; MCP migrate_voice; CLI voices migrate), then retry.
voice_consent_requiredA CLONED voice has no consent on record from the person whose voice it is (it was made before consent records began), so nothing was cast, pinned, previewed, spoken or charged. details.voices names each (voiceId, name). Mint a consent link (POST /voices/{voiceId}/consent-link; MCP create_voice_consent_link; CLI voices consent <voiceId>) and give it to that person; once they confirm, retry. A Pro clone with no consent from any recording session cannot be trained.
voice_consent_revokedThe speaker of a cloned voice revoked their consent, so the voice is never used for anything new (work already published stays up). Nothing was cast, pinned, previewed, spoken, recorded or charged. details.voices names each (voiceId, name, revokedAt). Choose another voice; revoking is final.
account_email_mismatchconfirmEmail is not this account's email address, so no deletion was scheduled. Ask the account owner for the address on the account.
account_deletion_refusedThis account cannot delete itself (message says why): it is an admin account, it hosts workshop cohorts other members belong to, or it owns a live organization (transfer or delete it first). Also returned when cancelling a deletion whose purge has already started. Nothing was changed.
project_not_restorableThe project cannot be restored: it is not deleted, its 30-day restore window has passed, or its purge has started (message says which). Its episodes are already in the library as private scripts.
content_refusedThe request asks for, or what would be published or shared contains, content our rules never allow (sexual content involving anyone under 18, or a real person, however long ago they lived, shown in a sexual or intimate way), so nothing was made, saved, published, shared or charged. It is not retried. Rephrase or remove that content.
safety_holdPublishing and sharing are paused on this account while a review is open, so nothing was published or shared. Writing is not affected. Write to help@sleeperhit.studio if you think this is a mistake.
safety_check_unavailableThe content safety check that runs before anything is published or shared could not run, so nothing was published or shared. Retry in a few minutes; a queued publish retries on its own.
likeness_consent_requiredThe picture or video would show a real, identifiable person who is living or died within the last 70 years (details.people names them). A real person's likeness needs their approval, or their estate's, so nothing was made or charged. Mint a link for them to approve (POST /likeness-consents/links; the account holder approves their own likeness in the dashboard), then retry; or describe a fictional character instead. Fictional characters, including ones who share a name with real people, and long-dead historical figures are not affected, and nobody real is ever shown in a sexual or intimate way.
reference_image_not_ownedA face or likeness reference (a portrait or body reference, a cast canon picture, a roster portrait) must be a picture stored in your own account: one you uploaded, or one made in your own projects. A link to anywhere else, or to another writer's picture, is refused (details.field names it), and nothing was changed or charged. Use a picture from your library or one of your cast's portraits.
likeness_consent_not_foundNo likeness approval with that id belongs to this account. List them with GET /likeness-consents.
character_not_foundNobody in the project's cast canon or Series Bible answers to that name (any name or alias counts). Read GET /story-projects/{projectId}/cast-look for the people the project has, or add the character to the Series Bible first. Nothing was changed or charged.
portrait_design_not_foundNo portrait design with that id in this project. designId comes from POST /story-projects/{projectId}/cast-portraits/design (confirmed) or GET .../cast-portraits/designs for the same project.
series_bible_version_conflictThe Series Bible changed since the version this edit was based on (details.expectedVersion vs details.currentVersion), so nothing was saved. Read the character again and send the edit with the current version, or omit expectedVersion to edit whatever is saved now.
show_cap_reachedA recurring show's next paid step would cross one of its spending caps, so it was not taken: details.scope is episode (the episode cap), month (the monthly cap, in the series' timezone) or unset (the show has no caps, so it spends nothing). details.cap, details.credits (the step's quote) and details.wouldSpend give the numbers. Raise the cap with the creator (PATCH /publishing-series/{seriesId} episodeCreditCap / monthlyCreditCap) or wait for the next month; do not retry — the same step refuses the same way.
not_a_sign_in_keyA sign-out (DELETE /device/credential) was made with a credential no browser sign-in minted — a key made on the API page, or a connector's OAuth grant — so nothing was revoked and the credential keeps working. Revoke a key, or disconnect a connector, on the API page (/dashboard/api).
not_foundNo endpoint at that path. This is a routing problem, not an authentication or method one — check the path against the API reference.
method_not_allowedThe path exists but does not accept that HTTP method. The Allow response header lists the methods it does accept.