Sleeper Hit makes produced episodes: the script, the voices and the mix.

Sleeper Hit Docs

Reference

The shared UI, Story API, CLI and MCP contract, with endpoints and examples.

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.

Contract sources

  • Surface registry: packages/web/src/lib/api-v1/surface-registry.ts
  • OpenAPI builder: packages/web/src/lib/api-v1/openapi.ts
  • OpenAPI schemas: packages/web/src/lib/api-v1/openapi-schemas.ts
  • Capabilities manifest: packages/web/src/lib/api-v1/capabilities.ts
  • Examples manifest: packages/web/src/lib/api-v1/examples.ts
  • MCP server tool schemas: packages/mcp-server/src/index.ts
  • CLI command router: packages/cli/src/cli.ts

Machine-readable surfaces

SurfacePath
Capabilities/api/v1/capabilities
OpenAPI JSON/api/v1/openapi.json
Examples/api/v1/examples
Agent index/agent-index.json
Search index/docs/search-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: 535
  • OpenAPI operations: 521
  • Example recipes: 17
  • Complete UI/API/CLI/MCP operations: 529 / 535
SurfaceBound operations
UI535 / 535
API533 / 535
CLI533 / 535
MCP529 / 535

Surface gaps

OperationMissing surfacesPlanned
admin.captureGrants.issueMCPMCP, UI: MCP and the app come with hosted capture (H5): an MCP tool would hand a long-lived grant to a connected agent's context, and the admin Users tab gains an Integration grants list then. Until then an admin issues, lists and revokes grants from the CLI or the Story API (artifacts/app-to-trailer/UNATTENDED-CAPTURE-PLAN.md).
admin.captureGrants.listMCPMCP, UI: MCP and the app come with hosted capture (H5): an MCP tool would hand a long-lived grant to a connected agent's context, and the admin Users tab gains an Integration grants list then. Until then an admin issues, lists and revokes grants from the CLI or the Story API (artifacts/app-to-trailer/UNATTENDED-CAPTURE-PLAN.md).
admin.captureGrants.revokeMCPMCP, UI: MCP and the app come with hosted capture (H5): an MCP tool would hand a long-lived grant to a connected agent's context, and the admin Users tab gains an Integration grants list then. Until then an admin issues, lists and revokes grants from the CLI or the Story API (artifacts/app-to-trailer/UNATTENDED-CAPTURE-PLAN.md).
appConnections.testLoginPreviewFrameCLI, MCP
captures.recordAPI, MCPAPI, MCP, UI: CLI only in Phase 1 (owner-approved): recording drives a browser on the operator's machine. The Story API, MCP and the app record with hosted capture, app-to-trailer Phase 2 (2.8, the priced ui-capture job).
integrations.ownerGuideAPI, CLI, MCPAPI, MCP: Operator-only vendor console steps: shown in Admin -> Integrations (each product's "Setup guide") and printed as Markdown by the operator script pnpm exec tsx scripts/integrations-owner-guide.ts <slug> (not a sleeperhit command). Never on the Story API, MCP or the member CLI, which serve members, not the owner registering vendor apps.

Development flow warnings

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. Most visibly, createStoryPlan refuses every plan until the project's Series Bible passes premise coverage — there is no advisory path around it. 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 a narrated read also needs a narrator voice. Pictures are not a read requirement: a headshot, body shot or sheet is drawn for renders, and the read shows each character's initials until it exists. 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.

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.

Operations by workflow

account workflows

OperationStatusUIAPICLIMCP
Set the craft focus<br><small>account.craftFocus.set</small>availableProfile craft focus<br>/dashboard/profilePUT /api/v1/account/craft-focus<br>account:writesleeperhit craft-focus set <focus> | sleeperhit craft-focus clearset_craft_focus
Cancel the account's deletion<br><small>account.deletion.cancel</small>availableProfile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=securityDELETE /api/v1/account/deletion<br>account:writesleeperhit account cancel-deletioncancel_account_deletion
Read where the account's deletion stands<br><small>account.deletion.get</small>availableProfile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=securityGET /api/v1/account/deletion<br>account:readsleeperhit account deletionget_account_deletion
Delete the account<br><small>account.deletion.request</small>availableProfile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=securityPOST /api/v1/account/deletion<br>account:writesleeperhit account delete --confirm-email <email>request_account_deletion
Read the "Download my data" archive<br><small>account.export.get</small>availableProfile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=securityGET /api/v1/account/export<br>account:readsleeperhit account export --statusget_account_export
Download my data<br><small>account.export.request</small>availableProfile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=securityPOST /api/v1/account/export<br>account:readsleeperhit account export [--wait] [--download <dir>]request_account_export
Read the writer's profile<br><small>account.profile.get</small>availableProfile page<br>/dashboard/profileGET /api/v1/account/profile<br>account:readsleeperhit profileget_profile
Change the writer's profile<br><small>account.profile.update</small>availableProfile page<br>/dashboard/profilePATCH /api/v1/account/profile<br>account:writesleeperhit profile update [--name <text>] [--headline <text>] [--public on|off] [--slug <url>] [--json <fields>]update_profile
Read the workspace role<br><small>account.workspaceRole.get</small>availableAccount menu<br>/dashboardGET /api/v1/account/workspace-role<br>account:readsleeperhit roleget_workspace_role
Switch the workspace role<br><small>account.workspaceRole.set</small>availableAccount menu<br>/dashboardPUT /api/v1/account/workspace-role<br>account:writesleeperhit role set <writer|creator|business>set_workspace_role

admin workflows

OperationStatusUIAPICLIMCP
Issue an integration grant for a demo account<br><small>admin.captureGrants.issue</small>availableplannedPOST /api/v1/admin/demo-accounts/{userId}/capture-grants<br>account:writesleeperhit admin capture-grant issue --user <userId> [--days 90] [--label <text>] [--out <file>]planned
List integration grants<br><small>admin.captureGrants.list</small>availableplannedGET /api/v1/admin/capture-grants<br>account:writesleeperhit admin capture-grantsplanned
Revoke an integration grant<br><small>admin.captureGrants.revoke</small>availableplannedDELETE /api/v1/admin/capture-grants/{grantId}<br>account:writesleeperhit admin capture-grant revoke <grantId>planned
Let a connection record on a shared-host runner<br><small>admin.captureRunners.allow</small>availableAdmin Capture runners tab<br>/adminPUT /api/v1/admin/capture-runners/allow/{connectionId}<br>account:writesleeperhit admin capture-runner allow <connectionId> [--note <text>]allow_capture_runner_connection
Stop a connection recording on a shared-host runner<br><small>admin.captureRunners.disallow</small>availableAdmin Capture runners tab<br>/adminDELETE /api/v1/admin/capture-runners/allow/{connectionId}<br>account:writesleeperhit admin capture-runner disallow <connectionId>disallow_capture_runner_connection
List capture runners<br><small>admin.captureRunners.list</small>availableAdmin Capture runners tab<br>/adminGET /api/v1/admin/capture-runners<br>account:readsleeperhit admin capture-runnerslist_capture_runners
Preview where a take would record<br><small>admin.captureRunners.route</small>availableAdmin Capture runners tab<br>/adminPOST /api/v1/admin/capture-runners/preview<br>account:readsleeperhit admin capture-runner route [--connection <id>] [--sound app|off] [--draw-fps <n>] [--runner <name>] [--purpose record|sign-in-test]get_capture_route
Make an account a demo account<br><small>admin.demoAccounts.add</small>availableAdmin Users tab<br>/adminPUT /api/v1/admin/demo-accounts/{userId}<br>account:writesleeperhit admin demo-account add <userId>add_demo_account
List demo accounts<br><small>admin.demoAccounts.list</small>availableAdmin Users tab<br>/adminGET /api/v1/admin/demo-accounts<br>account:readsleeperhit admin demo-accountslist_demo_accounts
Stop an account being a demo account<br><small>admin.demoAccounts.remove</small>availableAdmin Users tab<br>/adminDELETE /api/v1/admin/demo-accounts/{userId}<br>account:writesleeperhit admin demo-account remove <userId>remove_demo_account
Sign in as a demo account (a demo session)<br><small>admin.demoSessions.mint</small>availableAdmin Users tab<br>/adminPOST /api/v1/admin/demo-accounts/{userId}/sessions<br>account:writesleeperhit admin demo-session --user <userId> [--ttl 2h] [--out <file>]mint_demo_session
End a demo session<br><small>admin.demoSessions.revoke</small>availableAdmin Users tab<br>/adminDELETE /api/v1/admin/demo-sessions/{sessionId}<br>account:writesleeperhit admin demo-session revoke <sessionId>revoke_demo_session
Read whether shows are running across Sleeper<br><small>admin.showsRunning.get</small>availableAdmin Settings tab<br>/adminGET /api/v1/admin/shows-running<br>account:readsleeperhit admin shows-runningset_shows_running
Turn shows running on or off across Sleeper<br><small>admin.showsRunning.set</small>availableAdmin Settings tab<br>/adminPUT /api/v1/admin/shows-running<br>account:writesleeperhit admin shows-running on|offset_shows_running
Take away an account's unlimited Studio Credits<br><small>admin.unlimitedCredits.disable</small>availableAdmin Users tab<br>/adminDELETE /api/v1/admin/users/{userId}/unlimited-credits<br>account:writesleeperhit admin unlimited-credits off <userId>set_unlimited_credits
Give an account unlimited Studio Credits<br><small>admin.unlimitedCredits.enable</small>availableAdmin Users tab<br>/adminPUT /api/v1/admin/users/{userId}/unlimited-credits<br>account:writesleeperhit admin unlimited-credits on <userId>set_unlimited_credits
Stop an account switching its workspace role<br><small>admin.workspaceRoleSwitch.disable</small>availableAdmin Users tab<br>/adminDELETE /api/v1/admin/users/{userId}/workspace-role-switch<br>account:writesleeperhit admin role-switch disable <userId>set_workspace_role_switch
Allow an account to switch its workspace role<br><small>admin.workspaceRoleSwitch.enable</small>availableAdmin Users tab<br>/adminPUT /api/v1/admin/users/{userId}/workspace-role-switch<br>account:writesleeperhit admin role-switch enable <userId>set_workspace_role_switch
Check generation health<br><small>generation.health</small>availableDashboard background activity<br>/dashboardGET /api/v1/generation-health<br>story:readsleeperhit generation-healthget_generation_health

artifacts workflows

OperationStatusUIAPICLIMCP
Animate a character's portrait<br><small>artifacts.avatarVideo</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/avatar-video<br>artifact:publishsleeperhit cast animate <artifactId> --character <name> [--description <text>]animate_avatar
Read a Black List analysis<br><small>artifacts.coverage.blacklist</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/artifacts/{artifactId}/coverage/blacklist<br>artifact:readsleeperhit coverage blacklist <artifactId> [--report <reportId>]get_blacklist_analysis
Generate script coverage<br><small>artifacts.coverage.generate</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/artifacts/{artifactId}/coverage<br>story:writesleeperhit coverage generate <artifactId> [--focus <text>] [--confirm]generate_coverage
Read script coverage<br><small>artifacts.coverage.get</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/artifacts/{artifactId}/coverage<br>artifact:readsleeperhit coverage get <artifactId>get_coverage
List a screenplay's coverage history<br><small>artifacts.coverage.versions</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/artifacts/{artifactId}/coverage/versions<br>artifact:readsleeperhit coverage versions <artifactId>list_coverage_versions
Finalize a durable MP3 or MP4<br><small>artifacts.finalize</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/finalize<br>artifact:publishsleeperhit finalize <artifactId> --mode audio|video [--refresh]finalize_artifact
Retry a failed or stalled durable MP3 finalize<br><small>artifacts.finalize.retry</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/finalize/retry<br>artifact:publishsleeperhit finalize <artifactId> --retryretry_artifact_finalize
Read an artifact<br><small>artifacts.get</small>availableWriters Lab project workflow<br>/dashboard/writing-labGET /api/v1/artifacts/{artifactId}<br>artifact:readsleeperhit artifacts get <artifactId>get_artifact
Read the enriched cast<br><small>artifacts.getCast</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/cast<br>artifact:readsleeperhit cast <artifactId>get_cast
List job artifacts<br><small>artifacts.list</small>availableWriters Lab project workflow<br>/dashboard/writing-labGET /api/v1/story-jobs/{jobId}/artifacts<br>artifact:readsleeperhit jobs artifacts <jobId>list_artifacts
Read the location plates<br><small>artifacts.locationPlates.get</small>availableWriters Lab videos asset panel<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/artifacts/{artifactId}/location-plates<br>artifact:readsleeperhit locations get <artifactId>get_location_plates
Remake one location plate<br><small>artifacts.locationPlates.remake</small>availableWriters Lab videos asset panel<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/artifacts/{artifactId}/location-plates/{plateKey}/remake<br>artifact:publishsleeperhit locations remake <artifactId> <plateKey> [--confirm]remake_location_plate
Generate scene music<br><small>artifacts.music.generate</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/music<br>artifact:publishsleeperhit music generate <artifactId> [--coverage <0..1|0..100>] [--scenes 0,2,5]generate_music
Read scene music status<br><small>artifacts.music.get</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/music<br>artifact:readsleeperhit music get <artifactId>get_music
Update scene music<br><small>artifacts.music.update</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/music<br>artifact:publishsleeperhit music update <artifactId> [--scene <n> --clip-prompt <text> --clip-volume <0..1> --clip-fade-in <ms> --clip-fade-out <ms> --clip-play-mode once|loop --clip-sound-url <url> --clip-duration-ms <ms> --clip-anchor start|end --clip-post-roll-ms <ms>] [--scene <n> --end-transition fadeOut|cut --mix <0..1> --ducking <0.1..1> --bpm <60..180> --density <0..1> --brightness <0..1> --instruments "Cello:1.2,Piano:0.8"] [--scope screenplay|scene|entry] [--mode merge|replace]update_music
Build the noun imagery<br><small>artifacts.nounImagery.generate</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/noun-imagery<br>artifact:publishsleeperhit noun-imagery generate <artifactId> [--force] [--noun <key> [--label <text>] [--kind object|location|entity]]generate_noun_imagery
Read the noun imagery<br><small>artifacts.nounImagery.get</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/noun-imagery<br>artifact:readsleeperhit noun-imagery get <artifactId>get_noun_imagery
Refine character performance<br><small>artifacts.performance</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/performance<br>artifact:publishsleeperhit performance <artifactId> --character <name|NARRATOR|ALL> [--speed-factor 1.2] [--volume N] [--pause-ms N]refine_performance
Read a render's publishable state<br><small>artifacts.publishState.get</small>availableWriters Lab table-read publish button<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/publish-state<br>artifact:readsleeperhit artifacts publish-state <artifactId>get_publish_state
Send a render to Publishing (or remove it)<br><small>artifacts.publishState.set</small>availableWriters Lab table-read publish button<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/publish-state<br>artifact:publishsleeperhit artifacts publish <artifactId> [--off]mark_publishable/unmark_publishable
Regenerate a character avatar<br><small>artifacts.recastAvatar</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/avatar<br>artifact:publishsleeperhit avatar set <artifactId> --character <c> [--refine <text>] [--style <style>] [--confirm]recast_avatar
Regenerate a character figure<br><small>artifacts.recastFigure</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/figure<br>artifact:publishsleeperhit figure set <artifactId> --character <c> [--refine <text>] [--reference-image-url <url>] [--confirm]recast_figure
Recast a character voice<br><small>artifacts.recastVoice</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/voice<br>artifact:publishsleeperhit voice recast <artifactId> --character <c> --voice-id <id> --voice-name <name> [--no-canon]recast_voice
Refine a table read<br><small>artifacts.refine</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/refine<br>artifact:publishsleeperhit refine <artifactId> <instruction...> [--scope auto|screenplay|plan] [--confirm]refine_artifact
Rename a result<br><small>artifacts.rename</small>availableWriters Lab script details and video lists<br>/dashboard/writing-labPATCH /api/v1/artifacts/{artifactId}<br>story:writesleeperhit artifacts rename <artifactId> <title>rename_artifact
Render a table-read video<br><small>artifacts.renderVideo</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/render-video<br>artifact:publishsleeperhit artifacts render-video <artifactId>render_artifact_video
Read render status + share link<br><small>artifacts.renderVideo.status</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/render-video<br>artifact:readsleeperhit artifacts render-status <artifactId>get_artifact_share
Restore a character's previous voice<br><small>artifacts.restoreVoice</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/voice/restore<br>artifact:publishsleeperhit voice restore <artifactId> [--character <c>]restore_voice
Flag a table-read line for review<br><small>artifacts.reviewItems.flag</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/review-items<br>artifact:publishsleeperhit script review flag <artifactId> <entryIndex> --line-text "<the line as it stands>" [--character <c>] [--note <text>]flag_line_for_review
List a table read's flagged lines<br><small>artifacts.reviewItems.list</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/review-items<br>artifact:readsleeperhit script review list <artifactId>list_line_reviews
Remove a table-read line's review flag<br><small>artifacts.reviewItems.unflag</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readDELETE /api/v1/artifacts/{artifactId}/review-items/{entryIndex}<br>artifact:publishsleeperhit script review unflag <artifactId> <entryIndex>unflag_line_for_review
Re-voice one character in a finished read<br><small>artifacts.revoiceCharacter</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/revoice<br>artifact:publishsleeperhit voice revoice <artifactId> --character <c> [--voice-id <id> --voice-name <name>] [--confirm]revoice_character
Re-voice one line at a new speed or with a new direction<br><small>artifacts.revoiceLine</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/revoice-line<br>artifact:publishsleeperhit voice revoice-line <artifactId> --entry <index> [--speed <x>] [--direction <text> | --no-direction] [--confirm]revoice_line
Read character lines<br><small>artifacts.script.character</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/script<br>artifact:readsleeperhit script character <artifactId> <character...>get_character_lines
Read table-read script content<br><small>artifacts.script.get</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/script<br>artifact:readsleeperhit script get <artifactId>get_table_read_script
Read script content by page<br><small>artifacts.script.page</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/script<br>artifact:readsleeperhit script page <artifactId> <page>get_script_page
Replace a table-read screenplay exactly<br><small>artifacts.script.replace</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/script<br>artifact:publishsleeperhit script replace <artifactId> --file <path> [--instruction <text>] [--narration-policy include|suppress] [--defer-music] [--defer-audio-render] [--confirm]replace_artifact_script
Read script content by scene<br><small>artifacts.script.scene</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/script<br>artifact:readsleeperhit script scene <artifactId> <sceneIndex>get_script_scene
List sound effects<br><small>artifacts.sfx.list</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/sfx<br>artifact:readsleeperhit sfx list <artifactId>list_sfx
Manage sound effects<br><small>artifacts.sfx.manage</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/sfx<br>artifact:publishsleeperhit sfx add|update|remove <artifactId>add_sfx/update_sfx/remove_sfx
List soundscape beds and regions<br><small>artifacts.soundscapes.list</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/soundscapes<br>artifact:readsleeperhit soundscapes list <artifactId>get_soundscapes
Edit soundscape beds and regions<br><small>artifacts.soundscapes.manage</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/soundscapes<br>artifact:publishsleeperhit soundscapes update-bed|add|update|attach|remove <artifactId>update_soundscape/remove_soundscape
Write scene backdrop prompts<br><small>artifacts.theater.backdropPrompts</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/theater-backdrop-prompts<br>artifact:publishsleeperhit theater backdrop-prompts <artifactId> [--scenes 0,2,5] [--force]write_scene_backdrop_prompts
Write a scene's atmospheric FX cues<br><small>artifacts.theater.fxCues</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/theater-fx-cues<br>artifact:publishsleeperhit theater fx-cues <artifactId> --scene <n>generate_scene_fx_cues
Read the theater presentation<br><small>artifacts.theater.get</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/artifacts/{artifactId}/theater<br>artifact:readsleeperhit theater get <artifactId>get_theater_settings
Change one scene's theater<br><small>artifacts.theater.scene</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/theater-scene<br>artifact:publishsleeperhit theater scene <artifactId> --scene <n> [--text-reveal fade|drift|spotlight] [--backdrop-prompt <text>] [--media image|video] [--transition <type>] [--transition-duration <ms>] [--transition-prompt <text>] [--summary <text>] [--fx-cues <json-array> | --clear-fx-cues]update_scene_theater
Change the theater presentation<br><small>artifacts.theater.update</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/theater<br>artifact:publishsleeperhit theater update <artifactId> [--theater-mode on|off] [--backgrounds on|off] [--scene-visuals on|off] [--style-set <id>] [--transition <type>] [--transition-duration <ms>] [--heading-font <id>] [--dialogue-font <id>] [--layout <mode>] [--dialogue <presentation>] [--title <text>] [--subtitle <text>] [--title-layout <layout>] [--noun-imagery insets|replace_backdrop|off] [--json <presentation>]update_theater_settings
Design a theater scene canvas<br><small>artifacts.theaterCanvas.apply</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/artifacts/{artifactId}/theater-canvas<br>artifact:publishsleeperhit artifacts theater-canvas <artifactId> --scene <n> --beats <json-array>apply_theater_canvas
Generate a theater motion background clip<br><small>artifacts.theaterMotion.clip</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/artifacts/{artifactId}/theater-motion-clip<br>artifact:publishsleeperhit artifacts theater-motion-clip <artifactId> --scene <n> --entry <n> [--prompt <text>] [--duration <4..30>]generate_theater_motion_clip
Direct a theater motion graphic<br><small>artifacts.theaterMotion.direct</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/artifacts/{artifactId}/theater-motion<br>artifact:publishsleeperhit artifacts theater-motion <artifactId> --scene <n> --entry <n> --composition motion-only|motion-over-clip|performance-motion-overlay [--caption <text>] [--direction <text>] [--duration <0.5..30>] [--clip-prompt <text>]direct_theater_motion_beat
Update the cast (voices + avatars)<br><small>artifacts.updateCast</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/cast<br>artifact:publishsleeperhit cast update <artifactId> --json '<entries-or-{entries,avatarStyle}>' [--confirm] (cast-wide restyle: sleeperhit cast restyle <artifactId> --style <s> [--confirm])update_cast
Update a read's recording with its changed lines<br><small>artifacts.updateRecording</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/update-recording<br>artifact:publishsleeperhit recording update <artifactId> [--confirm]update_recording
Modify voices over a range<br><small>artifacts.voiceModification</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/artifacts/{artifactId}/voice-modification<br>artifact:publishsleeperhit voice modify <artifactId> --start <n> --end <n>modify_voice

brand workflows

OperationStatusUIAPICLIMCP
Analyze brand storytelling coverage<br><small>brand.coverage.analyze</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/brand-coverage<br>story:writesleeperhit brand-coverage generate <content|-> [--project <projectId>] [--type <text>] [--audience <text>] [--industry <text>] [--channel <text>] [--voice <text>]analyze_brand_coverage
Read brand coverage report<br><small>brand.coverage.get</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/brand-coverage/{reportId}<br>story:readsleeperhit brand-coverage get <reportId>get_brand_coverage
List a project's brand coverage reports<br><small>brand.coverage.list</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/story-projects/{projectId}/brand-coverage<br>story:readsleeperhit brand-coverage list --project <projectId> [--limit <n>] [--cursor <cursor>]list_brand_coverage
Generate brand storytelling<br><small>brand.narrative.generate</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/brand-narrative<br>story:writesleeperhit brand-narrative generate <brief|-> [--type <text>] [--audience <text>] [--industry <text>] [--channel <text>] [--voice <text>] [--length <text>] [--facts <file>]generate_brand_narrative

captures workflows

OperationStatusUIAPICLIMCP
Connect an app to record<br><small>appConnections.create</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsPOST /api/v1/story-projects/{projectId}/app-connections<br>app:connectsleeperhit app connect --project <projectId> --url <origin> [--login-url <url>] [--user <name>] [--password-stdin | --password-env <VAR>] [--totp-env <VAR>] [--cf-access-id <id> --cf-access-secret-env <VAR> | --vercel-bypass-env <VAR>] [--storage-state-env <VAR>] [--provider <url> --grant-env <VAR>] [--extra-origin <origin>]... [--mask <selector>]... [--label <text>] [--retention-days <n>]create_app_connection
Delete a stored app login<br><small>appConnections.delete</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsDELETE /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>app:connectsleeperhit app delete <connectionId> --project <projectId>delete_app_connection
Read a stored app login<br><small>appConnections.get</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>source:readsleeperhit app get <connectionId> --project <projectId>list_app_connections
List stored app logins<br><small>appConnections.list</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/app-connections<br>source:readsleeperhit app list --project <projectId>list_app_connections
Save a stored app login's secret<br><small>appConnections.secrets.save</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsPUT /api/v1/story-projects/{projectId}/app-connections/{connectionId}/secrets/{kind}<br>app:connectsleeperhit app secret <connectionId> <kind> --project <projectId> (--value-stdin | --value-env <VAR>)connect_app
Test sign-in<br><small>appConnections.testLogin</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsPOST /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login<br>app:connectsleeperhit app test <connectionId> --project <projectId>test_app_login
Read one sign-in check preview<br><small>appConnections.testLoginPreview</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview<br>source:readsleeperhit app preview <connectionId> <testId> --project <projectId>get_app_login_test_preview
View one sign-in check picture<br><small>appConnections.testLoginPreviewFrame</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview/frame<br>source:read
Read a test sign-in<br><small>appConnections.testLoginResult</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login<br>source:readsleeperhit app test <connectionId> --project <projectId> --resultget_app_login_test
Change a stored app login<br><small>appConnections.update</small>availableWriters Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-appsPATCH /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>app:connectsleeperhit app update <connectionId> --project <projectId> [--url <origin>] [--login-url <url>] [--login-method form|storageState|provider|none] [--provider <url>] [--header none|cloudflareAccess|vercelBypass] [--extra-origin <origin>]... [--mask <selector>]... [--label <text>] [--retention-days <n>]update_app_connection
Start an app capture<br><small>captures.create</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/captures<br>source:writesleeperhit capture import <file|take-dir> --project <projectId> [--label <text>] [--tour-id <tourId>] [--feature-id <featureId>]import_app_capture
Delete an app capture<br><small>captures.delete</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:writesleeperhit capture delete <captureId> --project <projectId>delete_app_capture
Check an uploaded app capture<br><small>captures.finalize</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/captures/{captureId}/finalize<br>source:writesleeperhit capture finalize <captureId> --project <projectId>import_app_capture
Read an app capture<br><small>captures.get</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:readsleeperhit capture get <captureId> --project <projectId>list_app_captures
List app captures<br><small>captures.list</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/captures<br>source:readsleeperhit capture list --project <projectId> [--feature-id <featureId>] [--tour-id <tourId>]list_app_captures
Match app captures to features<br><small>captures.matchFeatures</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/captures/match-features<br>source:writesleeperhit capture match-features --project <projectId> [--apply]match_capture_features
Record an app capture from a tour<br><small>captures.record</small>availableplannedplannedsleeperhit capture record <tour.json> --out <dir> [--storage-state <file> | --storage-state-env <VAR> | --demo-user <userId> [--demo-ttl 2h] | --provider <url> --grant-env <VAR> [--connection <id>] | --login-url <url> --user <name> --password-env <VAR> [--totp-env <VAR>] | --redeem-url <url> --code-env <VAR>] [--extra-origin <origin>]... [--origin-header-env <Header-Name>=<VAR>]... [--secret-env <secretRef>=<VAR>]... [--sandbox [--egress-proxy <url>]] [--sound app|off | --audio-from <url|file> [--offset <seconds>]] [--browser chrome|chromium] [--gpu nvidia|none] [--allow-stutter] [--app-version <tag>] [--upload --project <projectId> [--label <text>]]planned
Set the feature an app capture shows<br><small>captures.setFeature</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdPATCH /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:writesleeperhit capture set-feature <captureId> --project <projectId> (--feature-id <featureId> | --none)set_capture_feature
Read whether a capture's picture is smooth<br><small>captures.smoothness</small>availableWriters Lab project page captures<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/captures<br>source:readsleeperhit capture list --project <projectId>list_app_captures
Give back recordings of every feature without one<br><small>missingRecordings.cancel</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/record-missing/cancel<br>source:writesleeperhit tour record-missing --project <projectId> --cancel --job-ids <jobId,jobId>record_missing_tours
Book recordings of every feature without one<br><small>missingRecordings.confirm</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/record-missing/confirm<br>source:writesleeperhit tour record-missing --project <projectId> --confirm --job-ids <jobId,jobId>record_missing_tours
Quote recordings of every feature without one<br><small>missingRecordings.quote</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/record-missing<br>source:writesleeperhit tour record-missing --project <projectId>record_missing_tours
Cancel a tour recording<br><small>recordings.cancel</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:writesleeperhit tour job cancel <jobId> --project <projectId> --tour-id <tourId>record_tour
Confirm a tour recording<br><small>recordings.confirm</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:writesleeperhit tour record --project <projectId> --tour-id <tourId> --job-id <jobId> --confirmrecord_tour
Read a tour recording job<br><small>recordings.get</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:readsleeperhit tour job get <jobId> --project <projectId> --tour-id <tourId>get_capture_job
Quote a tour recording<br><small>recordings.quote</small>availableWriters Lab project page recordings<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings<br>source:writesleeperhit tour record --project <projectId> --tour-id <tourId>record_tour
Read a tour draft run<br><small>tourDrafts.get</small>availableWriters Lab project page tour drafts<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/tours/drafts/{runId}<br>source:readsleeperhit tour draft-status <runId> --project <projectId>get_tour_draft
List tour draft runs<br><small>tourDrafts.list</small>availableWriters Lab project page tour drafts<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/tours/drafts<br>source:readsleeperhit tour drafts --project <projectId> [--feature <featureId>]list_tour_drafts
Draft a tour for a feature<br><small>tourDrafts.start</small>availableWriters Lab project page tour drafts<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/drafts<br>source:writesleeperhit tour draft --project <projectId> (--feature <featureId> | --story <storyId> --moment <momentId>) [--connection <connectionId>] [--wait]draft_tour
Draft tours for the features without one<br><small>tourDrafts.startMissing</small>availableWriters Lab project page tour drafts<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/draft-missing<br>source:writesleeperhit tour draft-missing --project <projectId> [--story <storyId>] [--connection <connectionId>]draft_missing_tours
Check a tour document<br><small>tours.check</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours/check<br>source:readsleeperhit tour check [<tourId>] [--file <tour.json>] --project <projectId>check_tour
Create a tour<br><small>tours.create</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/tours<br>source:writesleeperhit tour create --project <projectId> --feature <featureId> --file <tour.json> [--label <text>]create_tour
Delete a tour<br><small>tours.delete</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:writesleeperhit tour delete <tourId> --project <projectId>delete_tour
Read a tour<br><small>tours.get</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:readsleeperhit tour get <tourId> --project <projectId>get_tour
List tours<br><small>tours.list</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/tours<br>source:readsleeperhit tour list --project <projectId> [--feature <featureId>]list_tours
Change a tour<br><small>tours.update</small>availableWriters Lab project page tours<br>/dashboard/writing-lab/:projectIdPATCH /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:writesleeperhit tour update <tourId> --project <projectId> [--file <tour.json>] [--feature <featureId>] [--label <text>] [--expected-revision <n>]update_tour

casting workflows

OperationStatusUIAPICLIMCP
Prepare an episode's table read<br><small>scripts.tableRead.prepare</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castPOST /api/v1/scripts/{scriptUploadId}/table-read/prepare<br>artifact:publishsleeperhit script table-read prepare <scriptUploadId> [--confirm]prepare_table_read
Remove a character from a read<br><small>scripts.tableRead.removeCharacter</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castPOST /api/v1/scripts/{scriptUploadId}/table-read/characters/remove<br>story:writesleeperhit script table-read remove-character <scriptUploadId> --character <name>remove_character
Rewrite a character's acting directions<br><small>scripts.tableRead.rewriteCharacterDirections</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castPOST /api/v1/scripts/{scriptUploadId}/table-read/characters/rewrite-directions<br>story:writesleeperhit script table-read rewrite-directions <scriptUploadId> --character <name> [--direction <text>] [--apply]rewrite_character_acting_directions

credits workflows

OperationStatusUIAPICLIMCP
Set auto top-up and the monthly spending cap<br><small>credits.billing.update</small>availableBilling spending card<br>/dashboard/billingPATCH /api/v1/credits/billing<br>account:writesleeperhit credits auto-topup|capupdate_credit_billing
Read Studio Credit balance<br><small>credits.read</small>availableDashboard credit meter<br>/dashboardGET /api/v1/credits<br>credits:readsleeperhit credits [topup [--pack 25]]get_credits
Read your referral program<br><small>referrals.read</small>availableBilling referral panel<br>/dashboard/billingGET /api/v1/referrals<br>credits:readsleeperhit referralsget_referrals

discovery workflows

OperationStatusUIAPICLIMCP
Read agent guidance<br><small>agent-guidance</small>availableDeveloper console and docs<br>/dashboard/developersGET /api/v1/agent-guidance<br>story:readsleeperhit guidanceget_agent_guidance
Discover live capabilities<br><small>capabilities</small>availableDeveloper console and docs<br>/dashboard/developersGET /api/v1/capabilities<br>sleeperhit capabilitiessleeperhit://capabilities

episode_overrides workflows

OperationStatusUIAPICLIMCP
Read an episode's overrides<br><small>scripts.overrides.get</small>availableWriters Lab episode overrides<br>/dashboard/writing-lab/:projectId/:scriptId/castGET /api/v1/scripts/{scriptUploadId}/overrides<br>story:readsleeperhit script overrides get <scriptUploadId>get_script_overrides
Set or clear an episode's overrides<br><small>scripts.overrides.update</small>availableWriters Lab episode overrides<br>/dashboard/writing-lab/:projectId/:scriptId/castPATCH /api/v1/scripts/{scriptUploadId}/overrides<br>story:writesleeperhit script overrides update <scriptUploadId> [--avatar <text>] [--theater <text>] [--soundscape <text>] [--pitch-deck <text>] [--locations <text>] [--clear <override>]update_script_overrides

integrations workflows

OperationStatusUIAPICLIMCP
Start connecting a product (a link for a person to open)<br><small>integrations.connect</small>availableIntegrations page Connect drawer<br>/dashboard/integrationsPOST /api/v1/integrations/providers/{slug}/connect<br>story:writesleeperhit integrations connect <slug>connect_integration
Disconnect a product<br><small>integrations.disconnect</small>availableIntegrations page<br>/dashboard/integrationsDELETE /api/v1/integrations/{integrationId}<br>story:writesleeperhit integrations disconnect <integrationId>disconnect_integration
List connectable products and this organization's connections<br><small>integrations.list</small>availableIntegrations page<br>/dashboard/integrationsGET /api/v1/integrations<br>story:readsleeperhit integrations listlist_integrations
List the places a connection can bring in<br><small>integrations.origins.list</small>availableIntegrations page Connect drawer<br>/dashboard/integrationsGET /api/v1/integrations/{integrationId}/origins<br>story:readsleeperhit integrations origins <integrationId>list_integration_origins
Choose what a connection brings in<br><small>integrations.origins.set</small>availableIntegrations page Connect drawer<br>/dashboard/integrationsPUT /api/v1/integrations/{integrationId}/origins<br>story:writesleeperhit integrations origins <integrationId> --set <originKey,originKey,...> [--label <originKey>=<name>]...set_integration_origins
Read a product's owner setup guide (admin only)<br><small>integrations.ownerGuide</small>availableAdmin Integrations tab<br>/adminplannedplanned
Request another product<br><small>integrations.request</small>availableIntegrations page<br>/dashboard/integrationsPOST /api/v1/integrations/providers/{slug}/interest<br>story:writesleeperhit integrations request <slug> [--note <text>]request_integration
Withdraw a product request<br><small>integrations.request.withdraw</small>availableIntegrations page<br>/dashboard/integrationsDELETE /api/v1/integrations/providers/{slug}/interest<br>story:writesleeperhit integrations withdraw-request <slug>withdraw_integration_request
Check a connection now<br><small>integrations.sync</small>availableIntegrations page<br>/dashboard/integrationsPOST /api/v1/integrations/{integrationId}/sync<br>story:writesleeperhit integrations sync <integrationId>sync_integration
Add a teammate to your organization<br><small>integrations.team.add</small>availableIntegrations page Team card<br>/dashboard/integrationsPOST /api/v1/organization/members<br>story:writesleeperhit integrations team add <email> --role admin|editor|vieweradd_organization_member
List your organization's team<br><small>integrations.team.list</small>availableIntegrations page Team card<br>/dashboard/integrationsGET /api/v1/organization/members<br>story:readsleeperhit integrations team listlist_organization_members
Remove a teammate<br><small>integrations.team.remove</small>availableIntegrations page Team card<br>/dashboard/integrationsDELETE /api/v1/organization/members/{userId}<br>story:writesleeperhit integrations team remove <userId>remove_organization_member
Change a teammate's role<br><small>integrations.team.update</small>availableIntegrations page Team card<br>/dashboard/integrationsPATCH /api/v1/organization/members/{userId}<br>story:writesleeperhit integrations team update <userId> admin|editor|viewerupdate_organization_member
Read a product's step-by-step connect walkthrough<br><small>integrations.walkthrough</small>availableIntegrations page Connect drawer<br>/dashboard/integrationsGET /api/v1/integrations/providers/{slug}/walkthrough<br>story:readsleeperhit integrations walkthrough <slug>get_integration_walkthrough
Feed a season from a connected product<br><small>season-runs.integrationFeed.set</small>availableWriters Lab Seasons tab season Sources<br>/dashboard/writing-lab/:projectId?tab=seasonsPUT /api/v1/season-runs/{runId}/integration-feed<br>story:writesleeperhit season-runs feed <runId> --product <slug> [--allow <originKey,...>] [--deny <originKey,...>] [--off]set_season_integration_feed
Keep an item for a season<br><small>season-runs.sourceCandidates.accept</small>availableIntegrations page season review queue<br>/dashboard/integrationsPOST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/accept<br>story:writesleeperhit season-runs sources <runId> --keep <candidateId>review_season_source_candidates
Keep or turn down several items at once<br><small>season-runs.sourceCandidates.bulkReview</small>availableIntegrations page season review queue<br>/dashboard/integrationsPOST /api/v1/season-runs/{runId}/source-candidates/bulk-review<br>story:writesleeperhit season-runs sources <runId> --keep <id,id,...> | --turn-down <id,id,...>review_season_source_candidates
Read a season's review queue<br><small>season-runs.sourceCandidates.list</small>availableIntegrations page season review queue<br>/dashboard/integrationsGET /api/v1/season-runs/{runId}/source-candidates<br>story:readsleeperhit season-runs sources <runId> [--state NEW|WITHHELD|ACCEPTED|REJECTED] [--limit <n>] [--cursor <id>]list_season_source_candidates
Turn an item down for a season<br><small>season-runs.sourceCandidates.reject</small>availableIntegrations page season review queue<br>/dashboard/integrationsPOST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/reject<br>story:writesleeperhit season-runs sources <runId> --turn-down <candidateId>review_season_source_candidates
Read what feeds a project's seasons<br><small>story-projects.integrationFeed.get</small>availableIntegrations page<br>/dashboard/integrationsGET /api/v1/story-projects/{projectId}/integration-feed<br>story:readsleeperhit integrations feeds <projectId>get_project_integration_feeds
Feed a project's seasons from a connected product<br><small>story-projects.integrationFeed.set</small>availableIntegrations page Connect drawer<br>/dashboard/integrationsPUT /api/v1/story-projects/{projectId}/integration-feed<br>story:writesleeperhit integrations feed <projectId> --product <slug> [--places <key,key,...>] [--off]set_project_integration_feed

jobs workflows

OperationStatusUIAPICLIMCP
Read background activity<br><small>activity.get</small>availableDashboard background activity<br>/dashboardGET /api/v1/background-activity<br>story:readsleeperhit activitybackground_activity
Cancel a story job<br><small>jobs.cancel</small>availableDashboard background activity<br>/dashboardPOST /api/v1/story-jobs/{jobId}/cancel<br>story:writesleeperhit jobs cancel <jobId>cancel_job
Create a story job<br><small>jobs.create</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/story-jobs<br>story:writesleeperhit jobs create <planId> [--script <scriptUploadId>]create_job
Read a story job<br><small>jobs.get</small>availableWriters Lab project workflow<br>/dashboard/writing-labGET /api/v1/story-jobs/{jobId}<br>story:readsleeperhit jobs get <jobId>get_job
List story jobs<br><small>jobs.list</small>availableWriters Lab project workflow<br>/dashboard/writing-labGET /api/v1/story-jobs<br>story:readsleeperhit jobs listlist_jobs
Resume a story job<br><small>jobs.resume</small>availableDashboard background activity<br>/dashboardPOST /api/v1/story-jobs/{jobId}/resume<br>story:writesleeperhit jobs resume <jobId>resume_story_job
Read screenplay drafting progress<br><small>screenplay-drafts.get</small>availableWriters Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptIdGET /api/v1/screenplay-drafts/{scriptUploadId}<br>story:readsleeperhit screenplay-draft status <scriptUploadId>screenplay_draft_status
Draft or resume an episode scene by scene<br><small>screenplay-drafts.start</small>availableWriters Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptIdPOST /api/v1/screenplay-drafts/{scriptUploadId}<br>story:writesleeperhit screenplay-draft start|resume <scriptUploadId> [--file <scene-plan.json>]draft_episode/resume_screenplay_draft

library workflows

OperationStatusUIAPICLIMCP
Import reusable audio<br><small>library.audio.import</small>availableMy Library<br>/dashboard/libraryPOST /api/v1/library/audio<br>story:writesleeperhit library audio import (--file <path> | --source-url <url>) --kind <kind> --label <text>import_my_library_audio
List reusable My-Library audio<br><small>library.audio.list</small>availableMy Library<br>/dashboard/libraryGET /api/v1/library/audio<br>story:readsleeperhit library audio list [--kind music|sfx|soundscape] [--query <text>] [--project <projectId>] [--limit N] [--cursor C]list_my_library_audio
Rename a reusable audio asset<br><small>library.audio.rename</small>availableWriters Lab table-read sound picker<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPATCH /api/v1/library/audio/{assetId}<br>story:writesleeperhit library audio rename <assetId> <label>rename_my_library_audio
List My-Library characters<br><small>library.cast.list</small>availableMy Library<br>/dashboard/libraryGET /api/v1/library/cast<br>story:readsleeperhit library cast [--query <text>] [--project <id>] [--limit N] [--cursor C]list_my_library_cast

likeness workflows

OperationStatusUIAPICLIMCP
Mint a likeness approval link<br><small>likeness.link</small>availableMy Library likeness approvals<br>/dashboard/libraryPOST /api/v1/likeness-consents/links<br>story:writesleeperhit likeness link <name> [--email <email>]create_likeness_consent_link
List likeness approvals<br><small>likeness.list</small>availableMy Library likeness approvals<br>/dashboard/libraryGET /api/v1/likeness-consents<br>story:readsleeperhit likeness listlist_likeness_consents
Withdraw a likeness approval<br><small>likeness.revoke</small>availableMy Library likeness approvals<br>/dashboard/libraryPOST /api/v1/likeness-consents/{consentId}/revoke<br>story:writesleeperhit likeness revoke <consentId> --confirmrevoke_likeness_consent

pitch-deck workflows

OperationStatusUIAPICLIMCP
Read the pitch-deck audio timeline<br><small>pitch-deck.audioTimeline.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline<br>story:readsleeperhit pitch-deck timeline <jobId> showget_pitch_deck_audio_timeline
Edit the pitch-deck audio timeline<br><small>pitch-deck.audioTimeline.mutate</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline<br>story:writesleeperhit pitch-deck timeline <jobId> <add-layer|remove-layer|generate-music|add-music-from-library|update-music|remove-music|generate-sfx|add-sfx-from-library|update-sfx|update-sfx-cues|remake-flagged-sfx-cues|remove-sfx|set-narration-level|duck> [flags] (duck: <dB|default>, the music's dip under the voices; set-narration-level: <level|default> --chapter N, a scene's narration level 0..2; sfx: --kind spot|ambience --length-ms N --fade-in-ms N --fade-out-ms N; update-sfx --muted|--unmuted --clear-length; update-sfx-cues --cues '<json>')add_pitch_deck_music_layer/remove_pitch_deck_music_layer/generate_pitch_deck_timeline_music/add_pitch_deck_timeline_music_from_library/update_pitch_deck_timeline_music/remove_pitch_deck_timeline_music/generate_pitch_deck_timeline_sfx/add_pitch_deck_timeline_sfx_from_library/update_pitch_deck_timeline_sfx/update_pitch_deck_timeline_sfx_cues/remake_pitch_deck_flagged_sfx_cues/remove_pitch_deck_timeline_sfx/set_pitch_deck_timeline_narration/set_pitch_deck_timeline_duck
Read per-scene music and sound effects<br><small>pitch-deck.sceneAudio.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/storyboard/audio<br>story:readsleeperhit pitch-deck audio <jobId>get_pitch_deck_scene_audio
Score one scene's music<br><small>pitch-deck.sceneMusic.mutate</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/storyboard/music<br>story:writesleeperhit pitch-deck music <score|update|remove|apply-library> <jobId> --chapter <chapterIndex> [flags]score_pitch_deck_scene_music/update_pitch_deck_scene_music/remove_pitch_deck_scene_music/apply_pitch_deck_scene_music_from_library
Place sound effects on one scene<br><small>pitch-deck.sceneSfx.mutate</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/storyboard/sfx<br>story:writesleeperhit pitch-deck sfx <add|update|remove|apply-library> <jobId> --chapter <chapterIndex> [flags]add_pitch_deck_scene_sfx/update_pitch_deck_scene_sfx/remove_pitch_deck_scene_sfx/apply_pitch_deck_scene_sfx_from_library
Read the pitch-deck sound map<br><small>pitch-deck.soundMap.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/storyboard/sound-map<br>story:readsleeperhit pitch-deck sound-map <jobId> [--chapter <chapterIndex>]get_pitch_deck_sound_map
Read the pitch deck's bell on the beat<br><small>pitchDeck.bellLane.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/bell-lane<br>story:readsleeperhit pitch-deck bell <jobId> showget_pitch_deck_bell_lane
Take the bell off the pitch deck<br><small>pitchDeck.bellLane.remove</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/bell-lane/remove<br>story:writesleeperhit pitch-deck bell <jobId> removeremove_pitch_deck_bell_lane
Strike a bell on every beat of the pitch deck<br><small>pitchDeck.bellLane.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/bell-lane<br>story:writesleeperhit pitch-deck bell <jobId> strike [--asset <id>|--from-deck <jobId>|--prompt <text>] [--every 1|2] [--from <s>|start] [--to <s>|end] [--skip <keys>|none] [--accent on|off] [--level <0-1>] [--duck on|off]strike_pitch_deck_bell_on_the_beat
Read the pitch deck camera motion<br><small>pitchDeck.camera.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/camera<br>story:readsleeperhit pitch-deck camera <jobId>get_pitch_deck_camera
Set the pitch deck camera motion<br><small>pitchDeck.camera.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/camera<br>story:writesleeperhit pitch-deck camera <jobId> [--handheld off|subtle|medium] [--snap <chapterIndex>:<shot>:<NAME>[@<zoom>]]… [--reframe <chapterIndex>:<shot>:<FROM>><TARGET>]… [--clear <chapterIndex>]… [--off]set_pitch_deck_camera
Stop a pitch deck's render<br><small>pitchDeck.cancelRender</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/cancel-render<br>artifact:publishsleeperhit pitch-deck cancel-render <jobId>cancel_pitch_deck_render
Let one pitch deck take still out at the provider go<br><small>pitchDeck.chapters.abandonTake</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/abandon-take<br>artifact:publishsleeperhit pitch-deck abandon-take <jobId> --chapter <chapterIndex> --call <callId> --take <n>abandon_pitch_deck_take
Add a blank pitch deck chapter<br><small>pitchDeck.chapters.add</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/add<br>story:writesleeperhit pitch-deck add-chapter <jobId> [--at <position> | --after <chapterIndex>]add_pitch_deck_chapter
Cut a pitch deck chapter's line out, keep the rest of its footage<br><small>pitchDeck.chapters.dropLine</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line<br>story:writesleeperhit pitch-deck drop-line <jobId> --chapter <chapterIndex> [--keep before|after] [--to <chapterIndex>]drop_pitch_deck_chapter_line
Read a pitch deck's chapters<br><small>pitchDeck.chapters.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/chapters<br>story:readsleeperhit pitch-deck chapters <jobId>get_pitch_deck_chapters
Override the repair decision on one pitch deck take<br><small>pitchDeck.chapters.overrideTakeRepair</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/take-repair-override<br>story:writesleeperhit pitch-deck override-repair <jobId> --chapter <chapterIndex> --call <callId> --take <n> --keep|--restore|--rewatchoverride_pitch_deck_take_repair
Refine one pitch deck chapter<br><small>pitchDeck.chapters.refine</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/refine<br>story:writesleeperhit pitch-deck refine-chapter <jobId> --chapter <chapterIndex> [--title <text>] [--story-beat <text>] [--visual-plan <text>] [--shot-type <text>] [--motion-plan <text>] [--location <key> | --clear-location] [--transition-prompt <text>] [--motion-prompt <text>] [--caption <text>] [--text-treatment <text>] [--text-mode voiceover|caption] [--narration <text>] [--narration-voice <id> | --clear-narration-voice] [--composition image|text|both] [--chapter-focus world|cast] [--arc-stage setup|escalation|turn|closing_question] [--advances-question <text>] [--montage | --no-montage] [--keep-scene-sound | --no-scene-sound] [--line-delivery <text>] [--cut-into-next cut|dip] [--duration <4..30>] [--visible-characters <a,b>] [--featured-character <name>] [--prop-continuity <text>] [--wardrobe-continuity <text>] [--screen-direction <text>] [--continuity-notes <text>]refine_pitch_deck_chapter
Remove a pitch deck chapter<br><small>pitchDeck.chapters.remove</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/remove<br>story:writesleeperhit pitch-deck remove-chapter <jobId> --chapter <chapterIndex>remove_pitch_deck_chapter
Render one pitch deck chapter again<br><small>pitchDeck.chapters.renderClip</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/render-clip<br>artifact:publishsleeperhit pitch-deck render-clip <jobId> --chapter <chapterIndex> [--call <callId>] [--confirm]render_pitch_deck_chapter_clip
Put the pitch deck chapters in a new order<br><small>pitchDeck.chapters.reorder</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/reorder<br>story:writesleeperhit pitch-deck reorder-chapters <jobId> (--order <chapterIndex,...> | --move <chapterIndex> --after <chapterIndex|first>)reorder_pitch_deck_chapters
Repair one take of a pitch deck call in place<br><small>pitchDeck.chapters.repairTake</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/repair-take<br>artifact:publishsleeperhit pitch-deck repair-take <jobId> --chapter <chapterIndex> --call <callId> --take <n> [--confirm]repair_pitch_deck_take
Choose the music under a chapter's own sound<br><small>pitchDeck.chapters.scoreUnderOwnSound</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/refine<br>story:writesleeperhit pitch-deck refine-chapter <jobId> --chapter <chapterIndex> --score-under-sound duck|out|hold [--own-sound-gain <dB> | --clear-own-sound-gain] [--keep-scene-sound | --no-scene-sound]refine_pitch_deck_chapter
Select a take of one pitch deck call<br><small>pitchDeck.chapters.selectTake</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/select-take<br>story:writesleeperhit pitch-deck select-take <jobId> --chapter <chapterIndex> --call <callId> --take <n>select_pitch_deck_take
Stage one pitch deck take's line as a voice-over<br><small>pitchDeck.chapters.stageVoiceOver</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/stage-voice-over<br>artifact:publishsleeperhit pitch-deck stage-voice-over <jobId> --chapter <chapterIndex> --call <callId> --take <n> [--confirm]stage_pitch_deck_take_as_voice_over
Trim one take of a pitch deck call<br><small>pitchDeck.chapters.trimTake</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/trim-take<br>story:writesleeperhit pitch-deck trim-take <jobId> --chapter <chapterIndex> --call <callId> --take <n> --keep <start>-<end>trim_pitch_deck_take
Set a pitch deck's closing sequence<br><small>pitchDeck.closingSequence.update</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/closing-sequence<br>story:writesleeperhit pitch-deck closing-sequence <jobId> [--quote <text> [--quote-attribution <source>] | --no-quote] [--coming-soon <text>] [--production-credit <text>] [--on|--off] [--logo-card|--no-logo-card] | --clearupdate_pitch_deck_closing_sequence
Delete a pitch deck<br><small>pitchDeck.delete</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosDELETE /api/v1/pitch-decks/{jobId}<br>story:writesleeperhit pitch-deck delete <jobId> [--confirm]delete_pitch_deck
Duplicate a pitch deck from its plan<br><small>pitchDeck.duplicate</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/duplicate<br>story:writesleeperhit pitch-deck duplicate <jobId> [--title <text>]duplicate_pitch_deck
Finish the pitch deck<br><small>pitchDeck.finish</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/finish<br>artifact:publishsleeperhit pitch-deck finish <jobId> [--resolution 720p|1080p] [--confirm] [--acknowledge-video-coverage]finish_pitch_deck
Read a pitch deck's intent<br><small>pitchDeck.intent.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/intent<br>story:readsleeperhit pitch-deck intent <jobId>get_video_intent
Edit a draft pitch deck's intent<br><small>pitchDeck.intent.update</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/intent<br>story:writesleeperhit pitch-deck intent <jobId> [--purpose <text>] [--audience <text>] [--logline <text>] [--theme <text>] [--central-question <text>] [--stakes <text>] [--viewer-promise <text>] [--ending <text>] [--arc <json>]update_video_intent
Set a pitch deck's black interludes<br><small>pitchDeck.interludes.update</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/interludes<br>story:writesleeperhit pitch-deck interludes <jobId> --json <list> | --file <path> | --clearupdate_pitch_deck_interludes
Read the pitch deck finish<br><small>pitchDeck.look.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/look<br>story:readsleeperhit pitch-deck look <jobId>get_pitch_deck_look
Set the pitch deck finish<br><small>pitchDeck.look.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/look<br>story:writesleeperhit pitch-deck look <jobId> <camera|period-35mm|night-interior|none> [--intensity light|standard|strong] [--adjust <effect>=<level>,…]set_pitch_deck_look
Let the deck's automatic fixes try more<br><small>pitchDeck.moreFixes</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/more-fixes<br>artifact:publishsleeperhit pitch-deck more-fixes <jobId> [--confirm]allow_more_pitch_deck_fixes
Read the pitch deck motion blur<br><small>pitchDeck.motionBlur.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/motion-blur<br>story:readsleeperhit pitch-deck motion-blur <jobId>get_pitch_deck_motion_blur
Set the pitch deck motion blur<br><small>pitchDeck.motionBlur.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/motion-blur<br>story:writesleeperhit pitch-deck motion-blur <jobId> [--chapter <chapterIndex>[:<shot>,…|moving|none]]… [--strength standard|subtle] [--off]set_pitch_deck_motion_blur
Read the pitch deck narrator<br><small>pitchDeck.narrator.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/narrator<br>story:readsleeperhit pitch-deck narrator <jobId>get_pitch_deck_narrator
Cast the pitch deck narrator<br><small>pitchDeck.narrator.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/narrator<br>story:writesleeperhit pitch-deck narrator <jobId> --voice-id <voiceId> [--provider <name>] | --clearset_pitch_deck_narrator
Render a finished pitch deck's PDF<br><small>pitchDeck.pdf.request</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/pdf<br>story:writesleeperhit pitch-deck pdf <jobId>render_pitch_deck_pdf
Open a new deck planning conversation<br><small>pitchDeck.plan</small>availablePitch deck workspace and Slug<br>/dashboard/writing-lab/:projectIdPOST /api/v1/conversations/{conversationId}/pitch-deck-plan<br>story:writesleeperhit pitch-deck plan <conversationId> [--notes <text>] [--mode pitch|showcase] [--shot-density <density>]plan_pitch_deck
Approve the pitch deck plan into the render<br><small>pitchDeck.plan.approve</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/plan/approve<br>story:writesleeperhit pitch-deck approve-plan <jobId> [--confirm] [--acknowledge-plan-coverage "<reason>" [--waive-veto <veto>="<reason>"]…]approve_pitch_deck_plan
Publish a pitch deck<br><small>pitchDeck.publish</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/publish<br>story:writesleeperhit pitch-deck publish <jobId>publish_pitch_deck
Read the pitch deck quiet track<br><small>pitchDeck.quietTrack.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/quiet-track<br>story:readsleeperhit pitch-deck quiet-track <jobId>get_pitch_deck_quiet_track
Set the pitch deck quiet track<br><small>pitchDeck.quietTrack.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/quiet-track<br>story:writesleeperhit pitch-deck quiet-track <jobId> --track silence|room_tone | --offset_pitch_deck_quiet_track
Re-assemble a pitch deck whose assembly failed, or rebuild its master<br><small>pitchDeck.reassemble</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/reassemble<br>story:writesleeperhit pitch-deck reassemble <jobId>reassemble_pitch_deck
Rename a pitch deck<br><small>pitchDeck.rename</small>availableWriters Lab deck list<br>/dashboard/writing-lab/:projectId/:scriptId/videosPATCH /api/v1/pitch-decks/{jobId}<br>story:writesleeperhit pitch-deck rename <jobId> <title> [--automatic]rename_pitch_deck
Read the pitch deck delivery class<br><small>pitchDeck.resolution.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/resolution<br>story:readsleeperhit pitch-deck resolution <jobId>get_pitch_deck_resolution
Choose the pitch deck delivery class<br><small>pitchDeck.resolution.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/resolution<br>story:writesleeperhit pitch-deck resolution <jobId> --resolution <720p|1080p> | --defaultset_pitch_deck_resolution
Read the pitch deck's score to picture<br><small>pitchDeck.scoreToPicture.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/score-to-picture<br>story:readsleeperhit pitch-deck score-to-picture <jobId> showget_pitch_deck_score_to_picture
Revert the pitch deck to its scene beds<br><small>pitchDeck.scoreToPicture.revert</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/score-to-picture/revert<br>story:writesleeperhit pitch-deck score-to-picture <jobId> revertrevert_pitch_deck_score_to_picture
Score the pitch deck to picture<br><small>pitchDeck.scoreToPicture.start</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/score-to-picture<br>artifact:publishsleeperhit pitch-deck score-to-picture <jobId> start [--direction <text>] [--confirm]score_pitch_deck_to_picture
Generate pitch deck plan coverage<br><small>pitchDeck.storyboard.coverage.generate</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/pitch-decks/{jobId}/storyboard/coverage<br>story:writesleeperhit pitch-deck coverage <jobId> --generategenerate_storyboard_coverage
Read pitch deck plan coverage<br><small>pitchDeck.storyboard.coverage.get</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/pitch-decks/{jobId}/storyboard/coverage<br>story:readsleeperhit pitch-deck coverage <jobId>get_storyboard_coverage
Direct how a deck's text looks and moves<br><small>pitchDeck.storyboard.directTextMotion</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/storyboard/direct-text-motion<br>story:writesleeperhit pitch-deck direct-text-motion <jobId> (--chapter <chapterIndex> | --title-element title|epigraph|source-credit|name-supers | --closing-element quote|coming-soon|production-credit) (--direction <text> | --clear)direct_pitch_deck_text_motion
Render one chapter's text layer<br><small>pitchDeck.storyboard.regenerateText</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/storyboard/regenerate-text<br>artifact:publishsleeperhit pitch-deck regenerate-text <jobId> --chapter <chapterIndex> [--confirm]regenerate_pitch_deck_text
Make living portraits for a pitch deck's title intros<br><small>pitchDeck.titleSequence.motionCloses</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/title-sequence/motion-closes<br>artifact:publishsleeperhit pitch-deck title-motion-closes <jobId> [--name <name>]… [--confirm]render_pitch_deck_title_motion_closes
Set a pitch deck's title sequence<br><small>pitchDeck.titleSequence.update</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/title-sequence<br>story:writesleeperhit pitch-deck title-sequence <jobId> --title <WORD> --cast <names> [--shadow <name>] [--seconds <3-5>] [--epigraph <text> [--epigraph-attribution <text>]] [--source-credit <text>] [--name-supers on|off] [--role "<name>=<role>"]… [--label "<name>=<LABEL>"]… [--beat-grid on|off] [--beat-seconds <0.5-4>] [--title-beats <1-8>] [--flash-source "<name>=deck|project|motion|portrait|auto"]… [--on|--off] | --clearupdate_pitch_deck_title_sequence
Unpublish a pitch deck<br><small>pitchDeck.unpublish</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/unpublish<br>story:writesleeperhit pitch-deck unpublish <jobId>unpublish_pitch_deck
Read a pitch deck version<br><small>pitchDeck.versions.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/versions/{number}<br>story:readsleeperhit pitch-deck version-clips <jobId> <number> [--download <dir>]get_pitch_deck_version
List the pitch deck versions<br><small>pitchDeck.versions.list</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/versions<br>story:readsleeperhit pitch-deck versions <jobId>list_pitch_deck_versions
Ask for a pitch deck version zip<br><small>pitchDeck.versions.zip</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/versions/{number}/zip<br>story:writesleeperhit pitch-deck version-clips <jobId> <number> --ziprequest_pitch_deck_version_zip
Re-stitch the finished deck master from its current chapters and audio<br><small>pitchDeck.video.export</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/video-export<br>story:writesleeperhit pitch-deck export <jobId> [--target site|youtube|x]export_pitch_deck_video
Cover the pitch deck video again<br><small>pitchDeck.videoCoverage.generate</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/video-coverage<br>story:writesleeperhit pitch-deck video-coverage <jobId> --generategenerate_video_coverage
Read pitch deck video coverage<br><small>pitchDeck.videoCoverage.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/video-coverage<br>story:readsleeperhit pitch-deck video-coverage <jobId>get_video_coverage
Read the pitch deck video model<br><small>pitchDeck.videoModel.get</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/pitch-decks/{jobId}/video-model<br>story:readsleeperhit pitch-deck video-model <jobId>get_pitch_deck_video_model
Set the pitch deck video model<br><small>pitchDeck.videoModel.set</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/video-model<br>story:writesleeperhit pitch-deck video-model <jobId> --model wan3-prime|vidu-q4set_pitch_deck_video_model
Set a pitch deck's visual grammar<br><small>pitchDeck.visualGrammar.update</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/pitch-decks/{jobId}/visual-grammar<br>story:writesleeperhit pitch-deck visual-grammar <jobId> [--text <words> | --file <path>]update_pitch_deck_visual_grammar
List a project's pitch decks<br><small>projects.pitchDecks.list</small>availableWriters Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/story-projects/{projectId}/pitch-decks<br>story:readsleeperhit pitch-deck list <projectId> [--season N | --episode <episodeId>]list_pitch_decks

plans workflows

OperationStatusUIAPICLIMCP
Make a plan's advised change<br><small>plans.advice.apply</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-plans/{planId}/advice<br>story:writesleeperhit plans advice <planId> (--opening-staging <text>|--opening-screen <text>|--device <beatId,...>)apply_plan_advice
Read a waiting plan's advice<br><small>plans.advice.get</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-plans/{planId}/advice<br>story:readsleeperhit plans advice <planId>get_plan_advice
Approve a StoryPlan<br><small>plans.approve</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-plans/{planId}/approve<br>story:writesleeperhit plans approve <planId> --confirmapprove_plan
Generate a StoryPlan<br><small>plans.create</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/story-projects/{projectId}/story-plans<br>story:writesleeperhit plans create <projectId> --target ... --artifact ...create_plan
Read a StoryPlan<br><small>plans.get</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-plans/{planId}<br>story:readsleeperhit plans get <planId>get_plan
List StoryPlans<br><small>plans.list</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-projects/{projectId}/story-plans<br>story:readsleeperhit plans list <projectId>list_plans
Reject a StoryPlan<br><small>plans.reject</small>availableWriters Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-plans/{planId}/reject<br>story:writesleeperhit plans reject <planId>reject_plan
Rename a plan<br><small>plans.rename</small>availableWriters Lab plans waiting for you<br>/dashboard/writing-lab/:projectId?tab=seasonsPATCH /api/v1/story-plans/{planId}<br>story:writesleeperhit plans rename <planId> <title>rename_plan
Resume a StoryPlan<br><small>plans.resume</small>availableWriters Lab project workflow<br>/dashboard/writing-labPOST /api/v1/story-plans/{planId}/resume<br>story:writesleeperhit plans resume <planId>resume_story_plan

projects workflows

OperationStatusUIAPICLIMCP
Confirm, reject or reopen a claim<br><small>claimsLedger.decide</small>availableWriters Lab project page claims the site makes<br>/dashboard/writing-lab/:projectId?tab=connected-appsPOST /api/v1/story-projects/{projectId}/claims-ledger/{claimId}<br>story:writesleeperhit app claim <claimId> --project <projectId> (--confirm | --reject | --reopen) [--note <text>]decide_claim
Read the product's claims ledger<br><small>claimsLedger.get</small>availableWriters Lab project page claims the site makes<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/claims-ledger<br>story:readsleeperhit app claims --project <projectId>get_claims_ledger
List your Slug conversations<br><small>conversations.list</small>availableSlug pane conversations<br>/dashboard/writing-lab/:projectIdGET /api/v1/conversations<br>story:readsleeperhit conversationslist_conversations
Set Slug video editing scope<br><small>conversations.videoEditingScope.set</small>availableTrailer and pitch deck conversation scope<br>/dashboard/writing-lab/:projectId/videosPATCH /api/v1/conversations/{conversationId}/video-editing-scope<br>story:writesleeperhit conversations scope set <conversationId> --surface trailer|pitch-deck --job <id> (--scene <sceneIndex>|--whole)set_video_editing_scope
Set or remove a project's brand logo<br><small>projects.brandLogo.set</small>availableWriters Lab videos Closing line<br>/dashboard/writing-lab/:projectId/:scriptId/videosPATCH /api/v1/story-projects/{projectId}<br>story:writesleeperhit projects update <projectId> [--brand-logo-file <path> | --brand-logo-url <https url> | --no-brand-logo]set_project_brand_logo
Cast a persona<br><small>projects.cast-canon.from-persona</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-canon/from-persona<br>story:writesleeperhit cast from-persona <projectId> --persona <id> [--name <n>] [--alias <a>]...cast_from_persona
Read a project cast canon<br><small>projects.cast-canon.get</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-canon<br>story:readsleeperhit cast-canon get <projectId>get_cast_canon
Save a project cast canon<br><small>projects.cast-canon.save</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPATCH /api/v1/story-projects/{projectId}/cast-canon<br>story:writesleeperhit cast-canon save <projectId> --json '<object>' | --file <json> [--replace]save_cast_canon
Cast a story film's people<br><small>projects.cast-film</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-film<br>artifact:publishsleeperhit cast film <projectId> [--script <id>] [--person <json>]... [--confirm]cast_story_film
Read cast look directions<br><small>projects.cast-look.get</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-look<br>story:readsleeperhit cast direction <projectId> [--character <c>]get_cast_look_direction
Set a cast member's look direction<br><small>projects.cast-look.set</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPATCH /api/v1/story-projects/{projectId}/cast-look<br>story:writesleeperhit cast direction <projectId> --character <c> [--look <text>] [--age <a>] [--clear-look] [--clear-age]set_cast_look_direction
Choose a headshot candidate<br><small>projects.cast-portraits.choose</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-portraits/choose<br>story:writesleeperhit cast-portrait choose <projectId> --design <designId> --candidate <n> [--acknowledge-coverage]choose_cast_portrait
Judge a portrait design again<br><small>projects.cast-portraits.coverage.generate</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage<br>story:writesleeperhit cast-portrait judge <projectId> --design <designId> [--focus <text>]generate_portrait_coverage
Read a portrait design's casting coverage<br><small>projects.cast-portraits.coverage.get</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage<br>story:readsleeperhit cast-portrait coverage <projectId> --design <designId>get_portrait_coverage
Draw headshot candidates for a cast member<br><small>projects.cast-portraits.design</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-portraits/design<br>artifact:publishsleeperhit cast-portrait design <projectId> --character <c> [--direction <text>] [--age <a>] [--candidates <n>] [--keep-face] [--confirm]design_cast_portraits
List headshot candidate designs<br><small>projects.cast-portraits.designs</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-portraits/designs<br>story:readsleeperhit cast-portrait designs <projectId> [--character <c>] [--design <designId>] [--watch]list_cast_portrait_designs
Choose a designed cast voice<br><small>projects.cast-voice.choose</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-voice/choose<br>story:writesleeperhit cast-voice choose <projectId> --design <designId> --candidate <n> [--name <voiceName>] [--acknowledge-coverage]choose_cast_voice
Judge a voice design again<br><small>projects.cast-voice.coverage.generate</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage<br>story:writesleeperhit cast-voice judge <projectId> --design <designId> [--focus <text>]generate_casting_coverage
Read a voice design's casting coverage<br><small>projects.cast-voice.coverage.get</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage<br>story:readsleeperhit cast-voice coverage <projectId> --design <designId>get_casting_coverage
Design a cast member's voice<br><small>projects.cast-voice.design</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPOST /api/v1/story-projects/{projectId}/cast-voice/design<br>artifact:publishsleeperhit cast-voice design <projectId> --character <c> [--description <text>] [--candidates <n>] [--preview-lines <n>] [--sample-text <line>] [--confirm]design_cast_voice
List cast voice designs<br><small>projects.cast-voice.designs</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/cast-voice/designs<br>story:readsleeperhit cast-voice designs <projectId> [--character <c>]list_cast_voice_designs
Set a cast member's voice<br><small>projects.cast-voice.set</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPATCH /api/v1/story-projects/{projectId}/cast-voice<br>story:writesleeperhit cast-voice set <projectId> --character <c> --voice-id <id> [--voice-name <n>] [--provider <p>] [--gender <g>]set_cast_voice
Save episode character direction<br><small>projects.cast.direction</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castPATCH /api/v1/story-projects/{projectId}/cast<br>story:writesleeperhit cast direction <projectId> --script <scriptUploadId> --character <name> --json <direction>update_character_direction
Generate the project cast<br><small>projects.cast.generate</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castPOST /api/v1/story-projects/{projectId}/cast<br>artifact:publishsleeperhit cast generate <projectId> [--script <scriptUploadId>] [--character <name>] [--force] [--image face|body|sheet] [--confirm --quote <quoteId>]generate_cast
Read casting progress<br><small>projects.cast.get</small>availableWriters Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/castGET /api/v1/story-projects/{projectId}/cast<br>story:readsleeperhit cast status <projectId> [--script <scriptUploadId>]get_project_cast
Read character notes<br><small>projects.character-notes.get</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castGET /api/v1/story-projects/{projectId}/character-notes<br>story:readsleeperhit character-notes <projectId> [--character <c>]get_character_notes
Change a character's notes<br><small>projects.character-notes.update</small>availableProject Cast<br>/dashboard/writing-lab/:projectId/castPATCH /api/v1/story-projects/{projectId}/character-notes<br>story:writesleeperhit character-notes <projectId> --character <c> [--role <text>] [--want <text>] [--obstacle <text>] [--arc <text>] [--relationships <text>] [--voice <text>] [--notes <text>]update_character_notes
Set or remove a project's own click sound<br><small>projects.clickSound.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPATCH /api/v1/story-projects/{projectId}<br>story:writesleeperhit projects update <projectId> [--click-sound <librarySoundId> [--click-sound-trim-ms <ms>] [--click-sound-gain-db <dB>] | --no-click-sound]set_project_click_sound
Create a story project<br><small>projects.create</small>availableWriters Lab New Project<br>/dashboard/writing-labPOST /api/v1/story-projects<br>story:writesleeperhit projects create --name <name> [--kind story|product] [--role writer|creator|business]create_project
Create a project around a script<br><small>projects.createFromScript</small>availableWriters Lab sidebar<br>/dashboard/writing-lab/:scriptId/:scriptIdPOST /api/v1/story-projects/from-script<br>story:writesleeperhit projects from-script <scriptId> | --script <scriptUploadId>create_project_from_script
Delete a story project<br><small>projects.delete</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}<br>story:writesleeperhit projects delete <projectId>delete_project
List deleted projects that can still be restored<br><small>projects.deleted.list</small>availableWriters Lab project library recently deleted<br>/dashboard/writing-labGET /api/v1/story-projects/deleted<br>story:readsleeperhit projects deletedlist_deleted_projects
List a project's episodes, versions and videos<br><small>projects.episodes.list</small>availableWriters Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-projects/{projectId}/episodes<br>story:readsleeperhit projects episodes <projectId> [--season N]list_project_episodes
Start a Series Bible episode as a draft<br><small>projects.episodes.start</small>availableWriters Lab episode map<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-projects/{projectId}/episodes<br>story:writesleeperhit projects episodes start <projectId> <episodeId>start_planned_episode
Read a story project<br><small>projects.get</small>availableWriters Lab project library<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}<br>story:readsleeperhit projects get <projectId>get_project
List story projects<br><small>projects.list</small>availableWriters Lab project library<br>/dashboard/writing-labGET /api/v1/story-projects<br>story:readsleeperhit projects list [--role writer|creator|business]list_projects
Share a project with an account<br><small>projects.members.add</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/members<br>story:writesleeperhit projects members add <projectId> <email> --role editor|vieweradd_project_member
List who a project is shared with<br><small>projects.members.list</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/members<br>story:readsleeperhit projects members list <projectId>list_project_members
Stop sharing a project with a member<br><small>projects.members.remove</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}/members/{userId}<br>story:writesleeperhit projects members remove <projectId> <userId>remove_project_member
Change a project member's role<br><small>projects.members.update</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdPATCH /api/v1/story-projects/{projectId}/members/{userId}<br>story:writesleeperhit projects members update <projectId> <userId> editor|viewerupdate_project_member
Merge a project into another<br><small>projects.merge</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/merge<br>story:writesleeperhit projects merge <projectId> --into <projectId>merge_project
Drop a frame from the mood board<br><small>projects.mood-board.dropFrame</small>availableWriters Lab project canon<br>/dashboard/writing-labDELETE /api/v1/story-projects/{projectId}/mood-board/frames/{frameId}<br>story:writesleeperhit mood-board drop <projectId> <frameId>drop_mood_board_frame
Read a project mood board<br><small>projects.mood-board.get</small>availableWriters Lab project canon<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}/mood-board<br>story:readsleeperhit mood-board get <projectId>get_mood_board
Keep a frame on the mood board<br><small>projects.mood-board.keepFrame</small>availableWriters Lab project canon<br>/dashboard/writing-labPOST /api/v1/story-projects/{projectId}/mood-board/frames<br>story:writesleeperhit mood-board keep <projectId> --json '<frame>' | --file <json>keep_mood_board_frame
Render candidate mood board frames<br><small>projects.mood-board.renderFrames</small>availableWriters Lab project canon<br>/dashboard/writing-labPOST /api/v1/story-projects/{projectId}/mood-board/render-frames<br>artifact:publishsleeperhit mood-board render <projectId> --brief <text> [--count <n>] [--aspect <ratio>] [--confirm]render_mood_board_frames
Generate outline coverage<br><small>projects.outline-map.coverage.generate</small>availableProject Overview outline coverage<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/outline-map/coverage<br>story:writesleeperhit outline coverage <projectId> --generategenerate_outline_coverage
Read outline coverage<br><small>projects.outline-map.coverage.get</small>availableProject Overview outline coverage<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/outline-map/coverage<br>story:readsleeperhit outline coverage <projectId>get_outline_coverage
Save an episode outline<br><small>projects.outline-map.episode.save</small>availableWriters Lab Notes Outline<br>/dashboard/writing-lab/:projectId/:scriptId/notes/outlinePATCH /api/v1/story-projects/{projectId}/outline-map<br>story:writesleeperhit outline save <projectId> <episodeId> --json <outline>save_episode_outline
Read episode outlines<br><small>projects.outline-map.get</small>availableWriters Lab Notes Outline<br>/dashboard/writing-lab/:projectId/:scriptId/notes/outlineGET /api/v1/story-projects/{projectId}/outline-map<br>story:readsleeperhit outline get <projectId>get_outline_map
Restore a deleted project<br><small>projects.restore</small>availableWriters Lab project library recently deleted<br>/dashboard/writing-labPOST /api/v1/story-projects/{projectId}/restore<br>story:writesleeperhit projects restore <projectId>restore_project
Name a new season<br><small>projects.seasons.create</small>availableWriters Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-projects/{projectId}/seasons<br>story:writesleeperhit projects seasons add <projectId> [--name <text>]create_project_season
Read the full arc: every season and episode, and the next step<br><small>projects.seasons.list</small>availableWriters Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-projects/{projectId}/seasons<br>story:readsleeperhit projects seasons list <projectId> [--season N]list_project_seasons
Read one Series Bible character<br><small>projects.series-bible.character.get</small>availableWriters Lab project canon<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}/series-bible/characters<br>story:readsleeperhit bible character <projectId> <character>get_series_bible_character
Edit one Series Bible character<br><small>projects.series-bible.character.update</small>availableWriters Lab project canon<br>/dashboard/writing-labPATCH /api/v1/story-projects/{projectId}/series-bible/characters<br>story:writesleeperhit bible character <projectId> <character> --json '<fields>' [--expected-version <n>] [--create]update_series_bible_character
Continue over Series Bible coverage<br><small>projects.series-bible.coverage.acknowledge</small>availableSeries Bible coverage step<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/series-bible/coverage/acknowledge<br>story:writesleeperhit bible acknowledge <projectId> --phase premise|full|product --report <reportId> --reason <text>acknowledge_series_bible_coverage
Generate Series Bible coverage<br><small>projects.series-bible.coverage.generate</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/story-projects/{projectId}/series-bible/coverage<br>story:writesleeperhit bible coverage <projectId> --generate [--phase premise|full|product]generate_series_bible_coverage
Read Series Bible coverage<br><small>projects.series-bible.coverage.get</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/story-projects/{projectId}/series-bible/coverage<br>story:readsleeperhit bible coverage <projectId> [--phase premise|full|product]get_series_bible_coverage
Generate a project Series Bible<br><small>projects.series-bible.generate</small>availableWriters Lab project canon<br>/dashboard/writing-labPOST /api/v1/story-projects/{projectId}/series-bible<br>story:writesleeperhit bible generate <projectId>generate_series_bible
Read a project Series Bible<br><small>projects.series-bible.get</small>availableWriters Lab project canon<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}/series-bible<br>story:readsleeperhit bible get <projectId>get_series_bible
Save a project Series Bible<br><small>projects.series-bible.save</small>availableWriters Lab project canon<br>/dashboard/writing-labPATCH /api/v1/story-projects/{projectId}/series-bible<br>story:writesleeperhit bible save <projectId> --json <object>save_series_bible
List the sounds a project uses<br><small>projects.sounds.list</small>availableWriters Lab project library<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}/sounds<br>story:readsleeperhit projects sounds <projectId> [--kind bell|music|sfx] [--query <text>]list_project_sounds
Update a story project<br><small>projects.update</small>availableWriters Lab project page actions menu<br>/dashboard/writing-lab/:projectIdPATCH /api/v1/story-projects/{projectId}<br>story:writesleeperhit projects update <projectId> [--name <text>] [--description <text>] [--metadata <json>] [--archived true|false] [--season-cadence monthly|numbered] [--kind story|product] [--confirm-kind-change] [--role writer|creator|business]update_project

publishing workflows

OperationStatusUIAPICLIMCP
List publishing analytics<br><small>publishing.analytics.list</small>availableWriters Lab publishing listening numbers<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/analytics<br>publishing:analyticssleeperhit publishing analytics list <seriesId>list_publishing_analytics
List publishing destinations<br><small>publishing.destinations.list</small>availableWriters Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/destinations<br>publishing:readsleeperhit publishing destinations list <seriesId>list_publishing_destinations
Connect a publishing destination<br><small>publishing.destinations.upsert</small>availableWriters Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/destinations<br>publishing:connectsleeperhit publishing destinations upsert <seriesId> --provider rssupsert_publishing_destination
Read RSS feed<br><small>publishing.feed</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-feeds/{seriesSlug}.xml<br>sleeperhit publishing feed <seriesSlug>get_publishing_rss_feed
List publishing provider config<br><small>publishing.providerConfigs.list</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-provider-configs<br>publishing:connectsleeperhit publishing provider-configs listlist_publishing_provider_configs
Upsert publishing provider config<br><small>publishing.providerConfigs.upsert</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-provider-configs<br>publishing:connectsleeperhit publishing provider-configs upsert --provider <provider> --medium <medium>upsert_publishing_provider_config
Cancel a publishing release<br><small>publishing.releases.cancel</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/cancel<br>publishing:publishsleeperhit publishing releases cancel <releaseId>cancel_publishing_release
Promote an artifact into a publishing release<br><small>publishing.releases.create</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/releases<br>publishing:writesleeperhit publishing releases create <seriesId> --source-artifact-id <artifactId> --title <title>create_publishing_release
Generate a podcast episode description<br><small>publishing.releases.generate_description</small>availableWriters Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/description/generate<br>publishing:writesleeperhit publishing releases generate-description <releaseId> [--direction <text>]generate_publishing_release_description
Read a publishing release<br><small>publishing.releases.get</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-releases/{releaseId}<br>publishing:readsleeperhit publishing releases get <releaseId>get_publishing_release
List publishing releases<br><small>publishing.releases.list</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/releases<br>publishing:readsleeperhit publishing releases list <seriesId>list_publishing_releases
Publish a release<br><small>publishing.releases.publish</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/publish<br>publishing:publishsleeperhit publishing releases publish <releaseId> --confirmpublish_publishing_release
List what is ready to add to the feed<br><small>publishing.releases.ready</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/ready-recordings<br>publishing:readsleeperhit publishing releases ready <seriesId>list_publishing_ready_recordings
Refresh published release media<br><small>publishing.releases.refresh_media</small>availableWriters Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/refresh-media<br>publishing:publishsleeperhit publishing releases refresh-media <releaseId> --source-artifact-id <artifactId>refresh_published_release_media
Take a recording off the ready list<br><small>publishing.releases.removeReady</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingDELETE /api/v1/publishing-series/{seriesId}/ready-recordings/{sourceArtifactId}<br>publishing:writesleeperhit publishing releases remove-ready <seriesId> <sourceArtifactId>remove_publishing_ready_recording
Schedule a publishing release<br><small>publishing.releases.schedule</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/schedule<br>publishing:publishsleeperhit publishing releases schedule <releaseId> --at <iso> --confirmschedule_publishing_release
List publishing release targets<br><small>publishing.releases.targets</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-releases/{releaseId}/targets<br>publishing:readsleeperhit publishing releases targets <releaseId>list_publishing_release_targets
Unpublish a published release<br><small>publishing.releases.unpublish</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-releases/{releaseId}/unpublish<br>publishing:publishsleeperhit publishing releases unpublish <releaseId> --confirmunpublish_publishing_release
Update publishing release metadata<br><small>publishing.releases.update</small>availableWriters Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishingPATCH /api/v1/publishing-releases/{releaseId}<br>publishing:writesleeperhit publishing releases update <releaseId> [--title <title>] [--description <text>]update_publishing_release
Create a publishing series<br><small>publishing.series.create</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/story-projects/{projectId}/publishing-series<br>publishing:writesleeperhit publishing series create <projectId> [--title <title>]create_publishing_series
Generate podcast cover art<br><small>publishing.series.generateCoverArt</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/generate-cover-art<br>publishing:writesleeperhit publishing series generate-cover-art <seriesId> [--direction <text>] [--title <title>] [--description <text>] [--podcast-category <text>] [--podcast-subcategory <text>]generate_publishing_cover_art
Read a publishing series<br><small>publishing.series.get</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}<br>publishing:readsleeperhit publishing series get <seriesId>get_publishing_series
List publishing series<br><small>publishing.series.list</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/story-projects/{projectId}/publishing-series<br>publishing:readsleeperhit publishing series list <projectId>list_publishing_series
Update a publishing series<br><small>publishing.series.update</small>availableWriters Lab publishing<br>/dashboard/writing-lab/:projectId/publishingPATCH /api/v1/publishing-series/{seriesId}<br>publishing:writesleeperhit publishing series update <seriesId> [--title <title>] [--status <status>] [--timezone <zone>] [--standing-approval-key <keyId|self|null>] [--confirm]update_publishing_series
Connect a TikTok account<br><small>publishing.tiktok.connect</small>availableWriters Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing/tiktok/connect<br>publishing:connectsleeperhit publishing connect tiktok [--series <seriesId>] [--return-to <url>]get_publishing_connect_link
Connect a YouTube account<br><small>publishing.youtube.connect</small>availableWriters Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing/youtube/connect<br>publishing:connectsleeperhit publishing connect youtube [--series <seriesId>] [--return-to <url>]get_publishing_connect_link
Advance a coverage-gated season episode<br><small>season-runs.advance</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/season-runs/{runId}/advance<br>story:write, artifact:publish, publishing:writesleeperhit season-runs advance <runId> | replan <runId> [--instruction <text>] --confirm | retry-coverage <runId> --confirm | revise <runId> (--instruction <text> | --screenplay-file <path>) --confirm | publish <runId> --confirmadvance_season_run
Approve a complete season map<br><small>season-runs.approve</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/season-runs/{runId}/approve<br>story:writesleeperhit season-runs approve <runId> --expected-map-version <n> --confirmapprove_season_map
Create a conversational season run<br><small>season-runs.create</small>availableWriters Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/story-projects/{projectId}/season-runs<br>story:write, publishing:writesleeperhit season-runs create <projectId>create_season_run
Delete a season run<br><small>season-runs.delete</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsDELETE /api/v1/season-runs/{runId}<br>story:writesleeperhit season-runs delete <runId> --confirmdelete_season_run
End a season run<br><small>season-runs.end</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsPOST /api/v1/season-runs/{runId}/end<br>story:writesleeperhit season-runs end <runId> --confirmend_season_run
Map one season episode<br><small>season-runs.episodes.map</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsPATCH /api/v1/season-runs/{runId}/episodes/{episodeId}<br>story:writesleeperhit season-runs map <runId> <episodeId> --expected-map-version <n> --patch <json> [--confirm]map_season_episode
Read a season run<br><small>season-runs.get</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/season-runs/{runId}<br>story:readsleeperhit season-runs get <runId>get_season_run
List season runs<br><small>season-runs.list</small>availableWriters Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasonsGET /api/v1/story-projects/{projectId}/season-runs<br>story:readsleeperhit season-runs list <projectId>list_season_runs
Check a show's sources<br><small>show.checkSources</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/check-sources<br>publishing:writesleeperhit show check-sources <seriesId> [--source …] [--lookback-days <n>]check_show_sources
Serve a show's site on its own domain<br><small>show.domain.set</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/domain<br>publishing:writesleeperhit show domain <seriesId> <domain|--remove> [--redirects <file.json>]set_show_domain
Drop a show episode<br><small>show.episode.drop</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/drop<br>publishing:writesleeperhit show drop <seriesId> <episodeId> --confirmdrop_show_episode
Fix one line of a show episode<br><small>show.episode.fixLine</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/fix-line<br>publishing:writesleeperhit show fix-line <seriesId> <episodeId> --find <text> --replace-with <text> [--confirm]fix_show_episode_line
Read a show episode<br><small>show.episode.get</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}<br>publishing:readsleeperhit show episode <seriesId> <episodeId>get_show_episode
Publish a held or preview episode<br><small>show.episode.publish</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/publish<br>publishing:writesleeperhit show publish <seriesId> <episodeId> --confirmpublish_show_episode
Read a show<br><small>show.get</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/show<br>publishing:readsleeperhit show get <seriesId>get_show
Make a show episode now (a preview or an extra)<br><small>show.makeEpisode</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/episodes<br>publishing:writesleeperhit show make-episode <seriesId> [--extra] [--item <itemId>] [--confirm]make_show_episode
Re-mix a show episode after its script was edited<br><small>show.refinishEpisode</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/refinish<br>publishing:writesleeperhit show refinish <seriesId> <episodeId> [--confirm]refinish_show_episode
List a show's runs<br><small>show.runs.list</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/publishing-series/{seriesId}/show/runs<br>publishing:readsleeperhit show runs <seriesId> [--limit <n>]list_show_runs
Set up or change a show<br><small>show.setUp</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPATCH /api/v1/publishing-series/{seriesId}/show<br>publishing:writesleeperhit show setup <seriesId> [--source rss:<feedUrl>|web-search:"<query>"|hackernews:top]… [--every day|week|month] [--at 19:00] [--weekday tuesday] [--day-of-month 1] [--covers item|roundup] [--episodes 5] [--pages 9] [--episodes-at-once 2] [--profanity none|mild|open] [--punch-up|--no-punch-up] [--hard-line <text>]… [--commenter-names handles|pseudonyms] [--notes-file <md>] [--theme "<prompt>"] [--hold-for-review|--no-hold-for-review] [--episode-cap N --monthly-cap N --confirm] [--setup-file <show.json>]set_up_show
Suggest sources for a show<br><small>show.sourceSuggestions</small>availableWriters Lab publishing — Show, Slug pane<br>/dashboard/writing-lab/:projectId/publishingGET /api/v1/show-source-suggestions<br>publishing:readsleeperhit show suggest-sources [--topic <topic>]suggest_show_sources
Turn a show on, pause it, or turn it off<br><small>show.state.set</small>availableWriters Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishingPOST /api/v1/publishing-series/{seriesId}/show/state<br>publishing:writesleeperhit show on|pause|resume|off <seriesId> [--confirm]set_show_state

scripts workflows

OperationStatusUIAPICLIMCP
Write a version's text<br><small>scripts.content.write</small>availableWriters Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptIdPATCH /api/v1/scripts/{scriptUploadId}/content<br>story:writesleeperhit script write <scriptUploadId> --file <path> [--expected-file <path>]write_script_content
Continue over screenplay coverage<br><small>scripts.coverage.acknowledge</small>availableCoverage tab<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/scripts/{scriptUploadId}/coverage/acknowledge<br>story:writesleeperhit script acknowledge <scriptUploadId> --report <reportId> --reason <text>acknowledge_screenplay_coverage
Read a version's screenplay coverage gate<br><small>scripts.coverage.gate</small>availableCoverage tab<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/scripts/{scriptUploadId}/coverage/acknowledge<br>artifact:readsleeperhit script acknowledge <scriptUploadId>acknowledge_screenplay_coverage
Delete a whole script<br><small>scripts.delete</small>availableWriters Lab script delete<br>/dashboard/writing-lab/:projectId/:scriptIdDELETE /api/v1/scripts/{scriptUploadId}<br>story:writesleeperhit script delete <scriptId> --confirmdelete_script
Export a screenplay as Fountain, Final Draft or PDF<br><small>scripts.export</small>availableWriters Lab export<br>/dashboard/writing-lab/:projectId/:scriptIdGET /api/v1/scripts/{scriptUploadId}/export<br>story:readsleeperhit script export <scriptUploadId> --format fountain|fdx|pdf [--out <path>] [--no-title-page] [--from-page N] [--to-page N] [--font <font>]export_script
Finish a draft into a locked version<br><small>scripts.finish</small>availableWriters Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptIdPOST /api/v1/scripts/{scriptUploadId}/finish<br>story:writesleeperhit script finish <scriptUploadId> [--coverage adopt|fresh]finish_draft
Read a script<br><small>scripts.get</small>availableWriters Lab script details<br>/dashboard/writing-labGET /api/v1/scripts/{scriptUploadId}<br>story:readsleeperhit script show <scriptId>get_script
Read one table-read line<br><small>scripts.lines.get</small>availableWriters Lab table-read line detail<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}<br>story:readsleeperhit script line get <scriptUploadId> <entryIndex> [--json]get_script_line_tuning
Edit one table-read line<br><small>scripts.lines.update</small>availableWriters Lab table-read line detail<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPATCH /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}<br>story:writesleeperhit script line set <scriptUploadId> <entryIndex> [--text <t>] [--tts-text <t>] [--parenthetical <t>] [--scene-heading <h>] [--pause-ms N] [--volume N]edit_script_line
Share a table read<br><small>scripts.share.create</small>availableWriters Lab table-read share dialog<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/scripts/{scriptUploadId}/share<br>artifact:publishsleeperhit script share create <scriptUploadId> [--audience public|private_review|team] [--mode theater|audio] [--scope whole|scene|entries|conversation] [--expires-in-days N] [--include-on-profile]share_script
Read a table read's share link<br><small>scripts.share.get</small>availableWriters Lab table-read share dialog<br>/dashboard/writing-lab/:projectId/:scriptId/table-readGET /api/v1/scripts/{scriptUploadId}/share<br>story:readsleeperhit script share get <scriptUploadId> [--json]get_script_share
Change a script's title, logline, format, genre or season<br><small>scripts.update</small>availableWriters Lab script details<br>/dashboard/writing-labPATCH /api/v1/scripts/{scriptUploadId}<br>story:writesleeperhit script update <scriptId> [--title <t>] [--logline <text>] [--media-type film|tv] [--genre <text>] [--season N] [--clear logline|genre|media-type]update_script
Upload a screenplay<br><small>scripts.upload</small>availableWriters Lab upload<br>/dashboard/writing-labPOST /api/v1/scripts<br>story:writesleeperhit script upload --title <title> (--file <path> | --source <sourceId> | --file-url <url> [--file-name <name>]) [--format text|fountain|fdx] [--project <projectId>] [--season N] [--episode <episodeId>]upload_script
Delete one version of a script<br><small>scripts.versions.delete</small>availableWriters Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptIdDELETE /api/v1/scripts/{scriptUploadId}/versions/{versionId}<br>story:writesleeperhit script versions delete <scriptId> <scriptUploadId> --confirmdelete_script_version
Upload a new version of a script<br><small>scripts.versions.upload</small>availableWriters Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptIdPOST /api/v1/scripts/{scriptUploadId}/versions<br>story:writesleeperhit script versions add <scriptId> (--file <path> | --source <sourceId> | --file-url <url> [--file-name <name>]) [--format text|fountain|fdx]upload_script_version

sources workflows

OperationStatusUIAPICLIMCP
Read the product's feature inventory<br><small>featureInventory.get</small>availableWriters Lab project Connected apps features<br>/dashboard/writing-lab/:projectId?tab=connected-appsGET /api/v1/story-projects/{projectId}/feature-inventory<br>source:readsleeperhit app inventory --project <projectId>get_feature_inventory
Learn the product from its site<br><small>featureInventory.learn</small>availableWriters Lab project Connected apps features<br>/dashboard/writing-lab/:projectId?tab=connected-appsPOST /api/v1/story-projects/{projectId}/feature-inventory<br>source:writesleeperhit app learn --project <projectId> [--url <site>] [--connection <connectionId>] [--public-only] [--wait]learn_from_site
Attach a source<br><small>sources.create</small>availableWriters Lab project Sources<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/sources<br>source:writesleeperhit sources add <projectId> --type text|markdown|url|pdf [--producer <name> --external-id <id>] [--originated-at <iso>]add_source
Delete a source<br><small>sources.delete</small>availableWriters Lab project Sources<br>/dashboard/writing-lab/:projectIdDELETE /api/v1/story-projects/{projectId}/sources/{sourceId}<br>source:writesleeperhit sources delete <projectId> <sourceId>delete_source
Read a source<br><small>sources.get</small>availableWriters Lab project Sources<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/sources/{sourceId}<br>source:readsleeperhit sources get <projectId> <sourceId>get_source
List sources<br><small>sources.list</small>availableWriters Lab project Sources<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/sources<br>source:readsleeperhit sources list <projectId>list_sources

story-films workflows

OperationStatusUIAPICLIMCP
Anchor a story beat's cut to a mark<br><small>story_film.beat.anchor</small>availableWriters Lab project Videos Slug pane<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor<br>story:writesleeperhit story-films anchor <storyId> <beatId> --project <projectId> (--mark <markId> | --clear)set_story_film_beat_anchor
Read the mark a story beat's cut is anchored to<br><small>story_film.beat.anchor.get</small>availableWriters Lab project Videos Slug pane<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor<br>story:readsleeperhit story-films anchor <storyId> <beatId> --project <projectId>set_story_film_beat_anchor
Set what a story film's beat sounds like<br><small>story_film.beat.sound</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/sound<br>story:writesleeperhit story-films sound <storyId> <beatId> --project <projectId> [--ui app|foley|off] [--score enters|not|clear] [--dead-air <ms>] [--bridge|--no-bridge]set_story_film_beat_sound
Set what a story film's beat says<br><small>story_film.beat.voice</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/voice<br>story:writesleeperhit story-films voice <storyId> <beatId> <none|on_camera|inner_vo> --project <projectId> [--character <castId>] [--text <words>]set_story_film_beat_voice
Read a story film's brief<br><small>story_film.brief.get</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/story-films/{storyId}/brief<br>story:readsleeperhit story-films brief show <storyId> --project <projectId>get_story_film_brief
Set a story film's brief<br><small>story_film.brief.set</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/brief<br>story:writesleeperhit story-films brief set <storyId> --project <projectId> [--feature <featureId>] [--feature-name <text>] [--what-it-does <text>] [--person <name>] [--problem <text>] [--conflict <text>] [--turn <text>] [--logline <text>] [--cta-line <text>] [--cta-reason <text>] [--cta-url <https>] [--supporting <featureId,featureId|none>]set_story_film_brief
Read one story film<br><small>story_film.get</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/story-films/{storyId}<br>story:readsleeperhit story-films get <storyId> --project <projectId>get_story_film
List a project's story films<br><small>story_film.list</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/story-films<br>story:readsleeperhit story-films list --project <projectId>list_story_films
Choose the recording a story film moment uses<br><small>story_film.moment.recording</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/moments/{momentId}/recording<br>story:writesleeperhit story-films moment <storyId> <momentId> --project <projectId> (--recording <appCaptureId> | --needs-recording)set_story_film_moment_recording
Pitch three story films for a product<br><small>story_film.pitch</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/story-projects/{projectId}/story-films<br>story:writesleeperhit story-films pitch --project <projectId> [--notes <text>] [--seconds 30-60] [--from-story <storyId>] [--feature <featureId>] [--feature-name <text>] [--what-it-does <text>] [--person <name>] [--problem <text>] [--conflict <text>] [--turn <text>] [--logline <text>] [--cta-line <text>] [--cta-reason <text>] [--cta-url <https>] [--supporting <featureId,featureId|none>]pitch_story_films
Choose how we see a story film's screen<br><small>story_film.screen_view</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/screen-view<br>story:writesleeperhit story-films screen-view <storyId> <full-screen|over-the-shoulder|hands-then-full-screen|slug> --project <projectId> [--moment <momentId>] [--set-by writer|slug]set_story_film_screen_view
Set how a story film's world beat is staged and spoken<br><small>story_film.world_beat</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/world<br>story:writesleeperhit story-films world-beat <storyId> <beatId> <glow|device_back|hands|profile|payoff_no_screen> --project <projectId> [--line <text> --speaker <castId> | --silent]set_story_film_world_beat
Write a chosen story film as its script<br><small>story_film.write</small>availableWriters Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/story-projects/{projectId}/story-films/{storyId}/script<br>story:writesleeperhit story-films write <storyId> --project <projectId> [--screen-view full-screen|over-the-shoulder|hands-then-full-screen] [--seconds 30-60]write_story_film

strategy workflows

OperationStatusUIAPICLIMCP
Add an action item<br><small>strategy.actionItems.add</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/strategy/pursuits/{pursuitId}/action-items<br>story:writesleeperhit strategy action-items add <pursuitId> --title "<title>" [--detail "<text>"] [--due YYYY-MM-DD]add_action_item
Tick an action item done<br><small>strategy.actionItems.complete</small>availableStrategy Action Items tab<br>/dashboard/strategyPOST /api/v1/strategy/action-items/{actionItemId}/complete<br>story:writesleeperhit strategy action-items complete <actionItemId> [--undo]complete_action_item
Remove an action item<br><small>strategy.actionItems.delete</small>availableWriters Lab<br>/dashboard/writing-labDELETE /api/v1/strategy/action-items/{actionItemId}<br>story:writesleeperhit strategy action-items delete <actionItemId>delete_action_item
List your action items<br><small>strategy.actionItems.list</small>availableStrategy Action Items tab<br>/dashboard/strategyGET /api/v1/strategy/action-items<br>story:readsleeperhit strategy action-items list [--all] [--pursuit <pursuitId>]list_action_items
Change an action item<br><small>strategy.actionItems.update</small>availableWriters Lab<br>/dashboard/writing-labPATCH /api/v1/strategy/action-items/{actionItemId}<br>story:writesleeperhit strategy action-items update <actionItemId> [--title "<title>"] [--detail "<text>"|none] [--due YYYY-MM-DD|none]update_action_item
Add a contact<br><small>strategy.contacts.create</small>availableStrategy Contacts conversation<br>/dashboard/strategyPOST /api/v1/strategy/contacts<br>story:writesleeperhit strategy contacts create person|company --name "<name>" [--email <email>] [--title "<title>"] [--company "<company>"] [--domain <domain>] [--description "<text>"] [--notes "<text>"] [--tag <tag>]create_contact
List your contacts<br><small>strategy.contacts.list</small>availableStrategy Contacts tab<br>/dashboard/strategyGET /api/v1/strategy/contacts<br>story:readsleeperhit strategy contacts listlist_contacts
Change a contact<br><small>strategy.contacts.update</small>availableStrategy Contacts conversation<br>/dashboard/strategyPATCH /api/v1/strategy/contacts/{contactId}<br>story:writesleeperhit strategy contacts update <contactId> [--name "<name>"] [--email <email>] [--title "<title>"] [--company "<company>"] [--domain <domain>] [--description "<text>"] [--notes "<text>"] [--tag <tag>]update_contact
Put an opportunity away<br><small>strategy.opportunities.archive</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/strategy/opportunities/{opportunityId}/archive<br>story:writesleeperhit strategy opportunities archive <opportunityId>archive_opportunity
Delete an opportunity<br><small>strategy.opportunities.delete</small>availableWriters Lab<br>/dashboard/writing-labDELETE /api/v1/strategy/opportunities/{opportunityId}<br>story:writesleeperhit strategy opportunities delete <opportunityId>delete_opportunity
List the opportunities your watches found<br><small>strategy.opportunities.list</small>availableStrategy Opportunities tab<br>/dashboard/strategyGET /api/v1/strategy/opportunities<br>story:readsleeperhit strategy opportunities list [--status new|reviewed|promoted|archived] [--watch <watchId>] [--query "<words>"] [--limit N]list_opportunities
Make an opportunity a pursuit<br><small>strategy.opportunities.promote</small>availableStrategy Opportunities tab<br>/dashboard/strategyPOST /api/v1/strategy/opportunities/{opportunityId}/promote<br>story:writesleeperhit strategy opportunities promote <opportunityId> [--script <scriptUploadId>]promote_opportunity
Save an opportunity to a script's research<br><small>strategy.opportunities.saveToResearch</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/strategy/opportunities/{opportunityId}/save-to-research<br>story:writesleeperhit strategy opportunities save <opportunityId> --script <scriptId> [--notes "<text>"]save_opportunity_to_research
Start a pursuit<br><small>strategy.pursuits.create</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/strategy/pursuits<br>story:writesleeperhit strategy pursuits create --title "<title>" [--summary "<text>"] [--due YYYY-MM-DD] [--contact <personId>] [--company <companyId>] [--script <scriptUploadId>] [--step "<title>"]create_pursuit
List your pursuits<br><small>strategy.pursuits.list</small>availableStrategy Pursuits tab<br>/dashboard/strategyGET /api/v1/strategy/pursuits<br>story:readsleeperhit strategy pursuits list [--status active|completed|archived]list_pursuits
Change a pursuit<br><small>strategy.pursuits.update</small>availableStrategy Pursuits tab<br>/dashboard/strategyPATCH /api/v1/strategy/pursuits/{pursuitId}<br>story:writesleeperhit strategy pursuits update <pursuitId> [--status active|completed|archived] [--due YYYY-MM-DD|none] [--summary "<text>"]update_pursuit
Start an opportunity watch<br><small>strategy.watches.create</small>availableStrategy conversation<br>/dashboard/strategyPOST /api/v1/strategy/watches<br>story:writesleeperhit strategy watches create --name "<name>" --query "<query>" --cadence daily|weekly|monday|friday|monthly [--category <category>] [--script <scriptId>]create_opportunity_watch
Delete a watch<br><small>strategy.watches.delete</small>availableStrategy Watches tab<br>/dashboard/strategyDELETE /api/v1/strategy/watches/{watchId}<br>story:writesleeperhit strategy watches delete <watchId>delete_opportunity_watch
List your opportunity watches<br><small>strategy.watches.list</small>availableStrategy Watches tab<br>/dashboard/strategyGET /api/v1/strategy/watches<br>story:readsleeperhit strategy watches listlist_opportunity_watches
Run a watch now<br><small>strategy.watches.run</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/strategy/watches/{watchId}/run<br>story:writesleeperhit strategy watches run <watchId>run_opportunity_watch_now
Change, pause or resume a watch<br><small>strategy.watches.update</small>availableStrategy Watches tab<br>/dashboard/strategyPATCH /api/v1/strategy/watches/{watchId}<br>story:writesleeperhit strategy watches update <watchId> [--name "<name>"] [--query "<query>"] [--cadence <cadence>] [--category <category>] [--script <scriptId>|--no-script] [--pause|--resume]update_opportunity_watch

table_read workflows

OperationStatusUIAPICLIMCP
Retry a failed creative analysis<br><small>scripts.tableRead.retryAnalysis</small>availableWriters Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-readPOST /api/v1/scripts/{scriptUploadId}/table-read/retry-analysis<br>story:writesleeperhit script table-read retry-analysis <scriptUploadId>retry_creative_analysis

table-read workflows

OperationStatusUIAPICLIMCP
Mint a Performance Booth recording link<br><small>tableRead.performanceBooth.start</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/table-read/performance-booth<br>story:writesleeperhit performance-booth <jobId>create_performance_booth_link
Read which table-read lines have a performed take<br><small>tableRead.performanceBooth.status</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/table-read/performance-booth<br>story:readsleeperhit performance-booth <jobId> --statusget_performance_booth_status

trailer workflows

OperationStatusUIAPICLIMCP
Plan a product video from the feature map<br><small>productVideos.plan</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/story-projects/{projectId}/product-video-plans<br>story:writesleeperhit product-video plan --project <projectId> (--feature <featureId> | --release <name> --features <id,id,...>) [--seconds <n>] [--aspect 16:9|9:16|1:1] [--title <text>] [--notes <text>] [--reference <REF-id>] [--destination <key>] [--wait]plan_product_video
Read a planned draft's plan check<br><small>productVideos.planCoverage</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/trailers/{jobId}/product-plan-coverage<br>story:readsleeperhit product-video coverage <jobId>get_product_video_plan_coverage
Read a product video plan run<br><small>productVideos.plans.get</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/product-video-plans/{runId}<br>story:readsleeperhit product-video run <runId> --project <projectId>get_product_video_plan
List the product video plan runs<br><small>productVideos.plans.list</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/story-projects/{projectId}/product-video-plans<br>story:readsleeperhit product-video runs --project <projectId>list_product_video_plans
List a project's trailers<br><small>projects.trailers.list</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/story-projects/{projectId}/trailers<br>story:readsleeperhit trailer list <projectId> [--season N | --episode <episodeId>]list_trailers
Compare a video with its reference<br><small>references.check</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/reference-check<br>story:writesleeperhit product-video check-reference <jobId> [--confirm]check_trailer_reference
Choose a video's reference<br><small>references.choose</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosPUT /api/v1/trailers/{jobId}/reference<br>story:writesleeperhit product-video reference <jobId> --choose <REF-id>choose_trailer_reference
Clear a video's reference<br><small>references.clear</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosDELETE /api/v1/trailers/{jobId}/reference<br>story:writesleeperhit product-video reference <jobId> --clearclear_trailer_reference
Find reference films for a business video<br><small>references.find</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/story-projects/{projectId}/references<br>story:readsleeperhit product-video references --project <projectId> [--scope feature|release] [--category <name>] [--aspect 16:9|9:16|1:1] [--seconds <n>] [--feature <featureId> | --features <id,id,...>] [--release <name>] [--notes <text>]find_references
Read a video's reference<br><small>references.get</small>availableWriters Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/trailers/{jobId}/reference<br>story:readsleeperhit product-video reference <jobId>get_trailer_reference
Read the trailer aspect ratio<br><small>trailer.aspect.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/aspect<br>story:readsleeperhit trailer aspect <jobId>get_trailer_aspect
Choose the trailer aspect ratio<br><small>trailer.aspect.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/aspect<br>story:writesleeperhit trailer aspect <jobId> <9:16|16:9|1:1>set_trailer_aspect
Choose the trailer audio policy<br><small>trailer.audioPolicy.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/audio-policy<br>story:writesleeperhit trailer audio-policy <jobId> [narrate|suppress]set_trailer_audio_policy
Read the trailer audio timeline<br><small>trailer.audioTimeline.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/storyboard/audio-timeline<br>story:readsleeperhit trailer timeline <jobId> showget_trailer_audio_timeline
Edit the trailer audio timeline<br><small>trailer.audioTimeline.mutate</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/audio-timeline<br>story:writesleeperhit trailer timeline <jobId> <add-layer|remove-layer|generate-music|add-music-from-library|update-music|remove-music|generate-sfx|add-sfx-from-library|update-sfx|update-sfx-cues|remake-flagged-sfx-cues|remove-sfx|set-narration-level|duck> [flags] (duck: <dB|default>, the music's dip under the voices; set-narration-level: <level|default> --beat N, a beat's narration level 0..2; sfx: --kind spot|ambience --length-ms N --fade-in-ms N --fade-out-ms N; update-sfx --muted|--unmuted --clear-length; update-sfx-cues --cues '<json>')add_trailer_music_layer/remove_trailer_music_layer/generate_trailer_timeline_music/add_trailer_timeline_music_from_library/update_trailer_timeline_music/remove_trailer_timeline_music/generate_trailer_timeline_sfx/add_trailer_timeline_sfx_from_library/update_trailer_timeline_sfx/update_trailer_timeline_sfx_cues/remake_trailer_flagged_sfx_cues/remove_trailer_timeline_sfx/set_trailer_timeline_narration/set_trailer_timeline_duck
Let one trailer take still out at the provider go<br><small>trailer.beats.abandonTake</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/abandon-take<br>artifact:publishsleeperhit trailer abandon-take <jobId> --beat <beatIndex> --call <callId> --take <n>abandon_trailer_take
Play an app capture in a trailer beat<br><small>trailer.beats.capture</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> --composition capture --capture <captureId> [--capture-keep <start>-<end>]refine_trailer_beat
Keep a stretch of a capture beat's capture<br><small>trailer.beats.captureKeep</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> --capture-keep <start>-<end> | --capture-keep wholerefine_trailer_beat
Read a capture beat's screen look<br><small>trailer.beats.captureLook.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look<br>story:readsleeperhit trailer beat-look <jobId> --beat <n>get_trailer_beat_look
Preview a capture beat's screen look<br><small>trailer.beats.captureLook.preview</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look/preview<br>story:readsleeperhit trailer beat-look <jobId> --beat <n> --preview [the set flags]preview_trailer_beat_look
Set a capture beat's screen look<br><small>trailer.beats.captureLook.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look<br>story:writesleeperhit trailer beat-look <jobId> --beat <n> [--preset screen|trailer] [--overrides <json> | --clear-overrides] [--cursor-skin arrow|hand|auto] [--cursor-size <px>] [--cursor-colour <#rrggbb>] [--cursor-shadow <0-0.8>] [--cursor-shadow-offset <x,y>] [--cursor-shadow-blur <px>] [--cursor-motion-blur <0-1>] [--click-sparks on|off] [--click-bounce <0-2>] [--cursor-smoothing <0-1>] [--cursor-glide-min <150-600>] [--cursor-glide-max <300-1000>] [--pre-click-pause <0-400>] [--click-press <0.8-1>] [--click-press-ms <40-250>] [--cursor-lift <0-1>] [--click-ring <0-1>] [--click-spark-size <0.5-2>] [--pointer-lean <0-20>] [--background-stops <#rrggbb,…>] [--background-motion still|drift|waves] [--background-drift-seconds <4-60>] [--background-drift-reach <0-0.1>] [--background-source brand|scene] [--aurora-wash <0-0.6>] [--aurora-glow <0-2>] [--aurora-edges <0.3-1>] [--preview] [--dry-run] | --reset | --easeset_trailer_beat_look
Set how fast a capture beat's waits play<br><small>trailer.beats.captureSpeedUp</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> --speed-up off|gentle|standard|brisk|defaultrefine_trailer_beat
See where a capture beat's picture stutters<br><small>trailer.beats.captureStutter</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/trailers/{jobId}/beats<br>story:readsleeperhit trailer beats <jobId>get_trailer_beats
Set a capture beat's look and tuning<br><small>trailer.beats.depth</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> [--depth-preset screen|trailer] [--depth-overrides <json> | --clear-depth-overrides]refine_trailer_beat
Cut a trailer beat's line out, keep the rest of its footage<br><small>trailer.beats.dropLine</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/drop-line<br>story:writesleeperhit trailer drop-line <jobId> --beat <beatIndex> [--line <n>] [--keep before|after] [--to <beatIndex>]drop_trailer_beat_line
Read a trailer's beats<br><small>trailer.beats.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/beats<br>story:readsleeperhit trailer beats <jobId>get_trailer_beats
Keep a beat's own sound<br><small>trailer.beats.keepsSound</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> --keep-sound | --no-soundrefine_trailer_beat
Override the repair decision on one trailer take<br><small>trailer.beats.overrideTakeRepair</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/take-repair-override<br>story:writesleeperhit trailer override-repair <jobId> --beat <n> --call <callId> --take <n> --keep|--restore|--rewatchoverride_trailer_take_repair
Refine one trailer beat<br><small>trailer.beats.refine</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> [--story-beat <text>] [--shot-type <text>] [--motion-prompt <text>] [--transition-prompt <text>] [--transition-in <text>] [--text <words>] [--text-style statement|thought|typed|reveal|label|stat|directed] [--text-tempo calm|standard|brisk] [--text-place centre|lower|upper|left|right] [--text-enter-on cut|vo:<word>|downbeat] [--text-emphasis <a,b>] [--clear-text] [--composition image|text|both|capture] [--capture <captureId>] [--keep-sound | --no-sound] [--depth-preset screen|trailer] [--depth-overrides <json> | --clear-depth-overrides] [--visible-characters <a,b>] [--featured-character <name>] [--location <key>] [--duration <4..30>] [--shots <json>] [--character-action <text>] [--staging-notes <text>] [--arc-stage setup|escalation|turn|closing_question] [--advances-question <text>] [--why-it-follows <text>] [--montage | --no-montage] [--narration <text>] [--spoken-line <text>] [--spoken-line-character <name>] [--picture-notes <text>]refine_trailer_beat
Render one trailer beat again<br><small>trailer.beats.renderClip</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/render-clip<br>artifact:publishsleeperhit trailer render-clip <jobId> --beat <n> [--call <callId>] [--confirm]render_trailer_beat_clip
Repair one take of a trailer call in place<br><small>trailer.beats.repairTake</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/repair-take<br>artifact:publishsleeperhit trailer repair-take <jobId> --beat <n> --call <callId> --take <n> [--confirm]repair_trailer_take
Choose the music under a beat's own sound<br><small>trailer.beats.scoreUnderOwnSound</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/beats/refine<br>story:writesleeperhit trailer refine <jobId> --beat <n> --score-under-sound duck|out|hold [--own-sound-gain <dB> | --clear-own-sound-gain]refine_trailer_beat
Select a take of one trailer call<br><small>trailer.beats.selectTake</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/select-take<br>story:writesleeperhit trailer select-take <jobId> --beat <n> --call <callId> --take <n>select_trailer_take
Stage one trailer take's line as a voice-over<br><small>trailer.beats.stageVoiceOver</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/stage-voice-over<br>artifact:publishsleeperhit trailer stage-voice-over <jobId> --beat <n> --call <callId> --take <n> [--confirm]stage_trailer_take_as_voice_over
Preview a trailer beat's words<br><small>trailer.beats.textPreview</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview<br>story:readsleeperhit trailer text-preview <jobId> --beat <n> [--mp4]preview_trailer_text
Make a 480p preview of a trailer beat's words<br><small>trailer.beats.textPreviewRender</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview/render<br>story:readsleeperhit trailer text-preview <jobId> --beat <n> --mp4preview_trailer_text
Trim one take of a trailer call<br><small>trailer.beats.trimTake</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/beats/{beatIndex}/trim-take<br>story:writesleeperhit trailer trim-take <jobId> --beat <n> --call <callId> --take <n> --keep <start>-<end>trim_trailer_take
Read the trailer camera motion<br><small>trailer.camera.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/camera<br>story:readsleeperhit trailer camera <jobId>get_trailer_camera
Set the trailer camera motion<br><small>trailer.camera.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/camera<br>story:writesleeperhit trailer camera <jobId> [--handheld off|subtle|medium] [--snap <beatIndex>:<shot>:<NAME>[@<zoom>]]… [--reframe <beatIndex>:<shot>:<FROM>><TARGET>]… [--clear <beatIndex>]… [--off]set_trailer_camera
Stop a trailer's render<br><small>trailer.cancelRender</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/cancel-render<br>artifact:publishsleeperhit trailer cancel-render <jobId>cancel_trailer_render
Read the trailer capture depth<br><small>trailer.captureDepth.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosGET /api/v1/trailers/{jobId}/capture-depth<br>story:readsleeperhit trailer capture-depth <jobId>get_trailer_capture_depth
Set the trailer capture depth<br><small>trailer.captureDepth.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/trailers/{jobId}/capture-depth<br>story:writesleeperhit trailer capture-depth <jobId> [--preset screen] [--overrides <json> | --clear-overrides] [--cursor-skin arrow|hand|auto] [--cursor-size <px>] [--cursor-colour <#rrggbb>] [--cursor-shadow <0-0.8>] [--cursor-shadow-offset <x,y>] [--cursor-shadow-blur <px>] [--cursor-motion-blur <0-1>] [--click-sparks on|off] [--click-bounce <0-2>] [--cursor-smoothing <0-1>] [--cursor-glide-min <150-600>] [--cursor-glide-max <300-1000>] [--pre-click-pause <0-400>] [--click-press <0.8-1>] [--click-press-ms <40-250>] [--cursor-lift <0-1>] [--click-ring <0-1>] [--click-spark-size <0.5-2>] [--pointer-lean <0-20>] [--background-stops <#rrggbb,…>] [--background-motion still|drift|waves] [--background-drift-seconds <4-60>] [--background-drift-reach <0-0.1>] [--background-source brand|scene] [--aurora-wash <0-0.6>] [--aurora-glow <0-2>] [--aurora-edges <0.3-1>]set_trailer_capture_depth
Set a trailer's closing sequence<br><small>trailer.closingSequence.update</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/closing-sequence<br>story:writesleeperhit trailer closing-sequence <jobId> [--quote <text> [--quote-attribution <source>] | --no-quote] [--coming-soon <text>] [--production-credit <text>] [--on|--off] [--logo-card|--no-logo-card] [--end-card-app-name <text>] [--end-card-reason <text>] [--end-card-url <https>] [--end-card-line <text>] [--end-card-label <text>] | --clearupdate_trailer_closing_sequence
Make a trailer from app captures<br><small>trailer.create_capture_only</small>availableWriters Lab project Videos<br>/dashboard/writing-lab/:projectId/videosPOST /api/v1/story-projects/{projectId}/trailers<br>story:writesleeperhit trailer create --project <projectId> --capture-only --title <text> [--aspect 16:9|9:16|1:1] [--capture <captureId>] [--capture-keep <start>-<end>]create_capture_trailer
Delete a trailer<br><small>trailer.delete</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosDELETE /api/v1/trailers/{jobId}<br>story:writesleeperhit trailer delete <jobId> [--confirm]delete_trailer
Duplicate a trailer from its plan<br><small>trailer.duplicate</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/duplicate<br>story:writesleeperhit trailer duplicate <jobId> [--title <text>]duplicate_trailer
Finish the trailer<br><small>trailer.finish</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/finish<br>artifact:publishsleeperhit trailer finish <jobId> [--resolution 720p|1080p] [--confirm] [--acknowledge-video-coverage]finish_trailer
Read a trailer's intent<br><small>trailer.intent.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/intent<br>story:readsleeperhit trailer intent <jobId>get_video_intent
Edit a draft trailer's intent<br><small>trailer.intent.update</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/intent<br>story:writesleeperhit trailer intent <jobId> [--purpose <text>] [--audience <text>] [--logline <text>] [--theme <text>] [--central-question <text>] [--stakes <text>] [--viewer-promise <text>] [--ending <text>] [--arc <json>]update_video_intent
Set a trailer's black interludes<br><small>trailer.interludes.update</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/interludes<br>story:writesleeperhit trailer interludes <jobId> --json <list> | --file <path> | --clearupdate_trailer_interludes
Read the trailer finish<br><small>trailer.look.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/look<br>story:readsleeperhit trailer look <jobId>get_trailer_look
Set the trailer finish<br><small>trailer.look.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/look<br>story:writesleeperhit trailer look <jobId> <camera|period-35mm|night-interior|none> [--intensity light|standard|strong] [--adjust <effect>=<level>,…]set_trailer_look
Let the trailer's automatic fixes try more<br><small>trailer.moreFixes</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/more-fixes<br>artifact:publishsleeperhit trailer more-fixes <jobId> [--confirm]allow_more_trailer_fixes
Read the trailer motion blur<br><small>trailer.motionBlur.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/motion-blur<br>story:readsleeperhit trailer motion-blur <jobId>get_trailer_motion_blur
Set the trailer motion blur<br><small>trailer.motionBlur.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/motion-blur<br>story:writesleeperhit trailer motion-blur <jobId> [--beat <beatIndex>[:<shot>,…|moving|none]]… [--strength standard|subtle] [--off]set_trailer_motion_blur
Read the trailer narrator<br><small>trailer.narrator.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/narrator<br>story:readsleeperhit trailer narrator <jobId>get_trailer_narrator
Cast the trailer narrator<br><small>trailer.narrator.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/narrator<br>story:writesleeperhit trailer narrator <jobId> --voice-id <voiceId> [--provider <name>] | --clearset_trailer_narrator
Plan a new trailer<br><small>trailer.plan</small>availableTrailer workspace and Slug<br>/dashboard/writing-lab/:projectIdPOST /api/v1/conversations/{conversationId}/trailer-plan<br>story:writesleeperhit trailer plan <conversationId> [--notes <text>] [--target-seconds <n>] [--aspect-ratio <ratio>] [--shot-density <density>] [--title <text>]plan_trailer
Approve the trailer plan into the render<br><small>trailer.plan.approve</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/plan/approve<br>story:writesleeperhit trailer approve-plan <jobId> [--confirm] [--acknowledge-plan-coverage "<reason>" [--waive-veto <veto>="<reason>"]…]approve_trailer_plan
Read the trailer quiet track<br><small>trailer.quietTrack.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/quiet-track<br>story:readsleeperhit trailer quiet-track <jobId>get_trailer_quiet_track
Set the trailer quiet track<br><small>trailer.quietTrack.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/quiet-track<br>story:writesleeperhit trailer quiet-track <jobId> --track silence|room_tone | --offset_trailer_quiet_track
Re-assemble a trailer whose assembly failed, or rebuild its master<br><small>trailer.reassemble</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/reassemble<br>story:writesleeperhit trailer reassemble <jobId>reassemble_trailer
Rename a trailer<br><small>trailer.rename</small>availableWriters Lab trailer list<br>/dashboard/writing-lab/:projectId/:scriptId/videosPATCH /api/v1/trailers/{jobId}<br>story:writesleeperhit trailer rename <jobId> <title> [--automatic]rename_trailer
Read every trailer beat's render state and credit trail<br><small>trailer.renderStates.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/render-states<br>story:readsleeperhit trailer render-status <jobId>get_trailer_render_states
Re-render a finished capture-only trailer's depth under the current look<br><small>trailer.rerenderDepth</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/rerender-depth<br>story:writesleeperhit trailer rerender-depth <jobId>rerender_trailer_capture_depth
Read the trailer delivery class<br><small>trailer.resolution.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/resolution<br>story:readsleeperhit trailer resolution <jobId>get_trailer_resolution
Choose the trailer delivery class<br><small>trailer.resolution.set</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/resolution<br>story:writesleeperhit trailer resolution <jobId> --resolution <720p|1080p> | --defaultset_trailer_resolution
Read per-beat music and sound effects<br><small>trailer.sceneAudio.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/storyboard/audio<br>story:readsleeperhit trailer audio <jobId>get_trailer_scene_audio
Score one beat's music<br><small>trailer.sceneMusic.mutate</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/music<br>story:writesleeperhit trailer music <score|update|remove|apply-library> <jobId> --beat <n> [flags]score_trailer_scene_music/update_trailer_scene_music/remove_trailer_scene_music/apply_trailer_scene_music_from_library
Place sound effects on one beat<br><small>trailer.sceneSfx.mutate</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/sfx<br>story:writesleeperhit trailer sfx <add|update|remove|apply-library> <jobId> --beat <n> [flags]add_trailer_scene_sfx/update_trailer_scene_sfx/remove_trailer_scene_sfx/apply_trailer_scene_sfx_from_library
Read the trailer's score to picture<br><small>trailer.scoreToPicture.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/score-to-picture<br>story:readsleeperhit trailer score-to-picture <jobId> showget_trailer_score_to_picture
Revert the trailer to its scene beds<br><small>trailer.scoreToPicture.revert</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/score-to-picture/revert<br>story:writesleeperhit trailer score-to-picture <jobId> revertrevert_trailer_score_to_picture
Score the trailer to picture<br><small>trailer.scoreToPicture.start</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/score-to-picture<br>artifact:publishsleeperhit trailer score-to-picture <jobId> start [--direction <text>] [--confirm]score_trailer_to_picture
Read a trailer's public watch-page state<br><small>trailer.share.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/share<br>story:readsleeperhit trailer share <jobId> [--json]get_trailer_share
Publish a trailer to its public watch page<br><small>trailer.share.publish</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/publish<br>story:writesleeperhit trailer publish <jobId> [--confirm]publish_trailer
Unpublish a trailer<br><small>trailer.share.unpublish</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/unpublish<br>story:writesleeperhit trailer unpublish <jobId> [--confirm]unpublish_trailer
Check a published trailer's watch page is reachable logged out<br><small>trailer.share.watchCheck</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/watch-check<br>story:readsleeperhit trailer watch-check <jobId>check_trailer_watch_page
Read the trailer sound map<br><small>trailer.soundMap.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/storyboard/sound-map<br>story:readsleeperhit trailer sound-map <jobId> [--beat <n>]get_trailer_sound_map
Read the trailer sound pass<br><small>trailer.soundPass.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/storyboard/sound-pass<br>story:readsleeperhit trailer sound-pass <jobId>get_trailer_sound_pass
Lay a trailer sound pass<br><small>trailer.soundPass.lay</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/sound-pass<br>story:writesleeperhit trailer sound-pass <jobId> laylay_trailer_sound_pass
Add a trailer beat or a text card<br><small>trailer.storyboard.addBeat</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/add-beat<br>story:writesleeperhit trailer add-beat <jobId> [--at <n> | --after <n>] [--text <words> [--text-style statement|thought|typed|reveal|stat]]add_trailer_beat
Read a trailer beat's earlier cuts<br><small>trailer.storyboard.beatTakes</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/storyboard/takes<br>story:readsleeperhit trailer takes <jobId> [--beat <n>]get_trailer_beat_takes
Generate trailer plan coverage<br><small>trailer.storyboard.coverage.generate</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coveragePOST /api/v1/trailers/{jobId}/storyboard/coverage<br>story:writesleeperhit trailer coverage <jobId> --generategenerate_storyboard_coverage
Read trailer plan coverage<br><small>trailer.storyboard.coverage.get</small>availableWriters Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverageGET /api/v1/trailers/{jobId}/storyboard/coverage<br>story:readsleeperhit trailer coverage <jobId>get_storyboard_coverage
Direct how a trailer beat's text moves<br><small>trailer.storyboard.directTextMotion</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/direct-text-motion<br>story:writesleeperhit trailer direct-text-motion <jobId> --beat <n> --direction <text> | --closing-element quote|coming-soon|production-credit --direction <text> | --cleardirect_trailer_text_motion
Move a trailer beat to another position<br><small>trailer.storyboard.moveBeat</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/move-beat<br>story:writesleeperhit trailer move-beat <jobId> --from <n> --to <n>move_trailer_beat
Remove a trailer beat<br><small>trailer.storyboard.removeBeat</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/remove-beat<br>story:writesleeperhit trailer remove-beat <jobId> --beat <n>remove_trailer_beat
Put an earlier cut of a beat back<br><small>trailer.storyboard.restoreTake</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/storyboard/restore-take<br>story:writesleeperhit trailer restore-take <jobId> --beat <n> --url <url>restore_trailer_take
Read a trailer version<br><small>trailer.versions.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/versions/{number}<br>story:readsleeperhit trailer version-clips <jobId> <number> [--download <dir>]get_trailer_version
List the trailer versions<br><small>trailer.versions.list</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/versions<br>story:readsleeperhit trailer versions <jobId>list_trailer_versions
Ask for a trailer version zip<br><small>trailer.versions.zip</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/versions/{number}/zip<br>story:writesleeperhit trailer version-clips <jobId> <number> --ziprequest_trailer_version_zip
Re-stitch the finished trailer master<br><small>trailer.video.export</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/video-export<br>story:writesleeperhit trailer export <jobId> [--target site|youtube|x]export_trailer_video
Cover the trailer video again<br><small>trailer.videoCoverage.generate</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosPOST /api/v1/trailers/{jobId}/video-coverage<br>story:writesleeperhit trailer video-coverage <jobId> --generategenerate_video_coverage
Read trailer video coverage<br><small>trailer.videoCoverage.get</small>availableWriters Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videosGET /api/v1/trailers/{jobId}/video-coverage<br>story:readsleeperhit trailer video-coverage <jobId>get_video_coverage

video_deliverables workflows

OperationStatusUIAPICLIMCP
Start a destination video deliverable<br><small>videoDeliverables.create</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/deliverables<br>story:writesleeperhit deliverable create <projectId> --title <title> --destination <key>create_video_deliverable
Build the submission packet<br><small>videoDeliverables.export</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/export<br>story:readsleeperhit deliverable export <deliverableId>export_deliverable_submission
Read one destination video deliverable<br><small>videoDeliverables.get</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}<br>story:readsleeperhit deliverable get <deliverableId>get_video_deliverable
List the project's destination video deliverables<br><small>videoDeliverables.list</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/story-projects/{projectId}/deliverables<br>story:readsleeperhit deliverable list <projectId>list_video_deliverables
Read the submission packet<br><small>videoDeliverables.packet</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdGET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/packet<br>story:readsleeperhit deliverable packet <deliverableId>get_submission_packet
Save the deliverable's surface scout<br><small>videoDeliverables.scout</small>availableplannedPOST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/scout<br>story:writesleeperhit deliverable scout <deliverableId> --file <path>save_video_deliverable_scout
Edit one case of the script in place<br><small>videoDeliverables.scriptCaseEdit</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPATCH /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script/cases/{caseId}<br>story:writesleeperhit deliverable case-edit <deliverableId> <caseId> --file <path> --script-version <n>update_deliverable_script_case
Import the deliverable's own test-case script<br><small>videoDeliverables.scriptImport</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script<br>story:writesleeperhit deliverable script <deliverableId> --file <path>write_deliverable_script
Check a variant against its destination spec<br><small>videoDeliverables.variants.check</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check<br>story:writesleeperhit deliverable check <deliverableId> <variantKey>check_deliverable_variant
Derive a destination variant<br><small>videoDeliverables.variants.derive</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdPOST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants<br>story:writesleeperhit deliverable derive <deliverableId> --destination <key>derive_deliverable_variant

video_destinations workflows

OperationStatusUIAPICLIMCP
Read a video destination<br><small>videoDestinations.get</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdGET /api/v1/video-destinations/{key}<br>source:readsleeperhit destination get <key>get_video_destination
List video destinations<br><small>videoDestinations.list</small>availableWriters Lab project conversation<br>/dashboard/writing-lab/:projectIdGET /api/v1/video-destinations<br>source:readsleeperhit destination listlist_video_destinations

voices workflows

OperationStatusUIAPICLIMCP
Mint a voice-clone recording link<br><small>voices.cloneLink</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/clone-link<br>story:writesleeperhit voices clonecreate_voice_clone_link
Mint a voice consent link<br><small>voices.consentLink</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/{voiceId}/consent-link<br>story:writesleeperhit voices consent <voiceId>create_voice_consent_link
Delete a library voice<br><small>voices.delete</small>availableWriters Lab<br>/dashboard/writing-labDELETE /api/v1/voices/{voiceId}<br>story:writesleeperhit voices delete <voiceId> [--confirm]delete_voice
List my studio voices<br><small>voices.list</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/voices<br>story:readsleeperhit voices listlist_voices
Migrate a voice everywhere it is used<br><small>voices.migrate</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voice-migrations<br>story:writesleeperhit voices migrate <fromVoiceId> --to <toVoiceId> [--to-provider <p>] [--to-name <n>] [--project <projectId>] [--character <c>] [--confirm]migrate_voice
Undo a voice migration<br><small>voices.migrationUndo</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voice-migrations/{migrationId}/undo<br>story:writesleeperhit voices migration-undo <migrationId>undo_voice_migration
List voice migrations<br><small>voices.migrations</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/voice-migrations<br>story:readsleeperhit voices migrations [--voice <voiceId>]list_voice_migrations
Hear a voice say a line<br><small>voices.preview</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/preview<br>story:writesleeperhit voices preview <voiceId> (--text <line> | --artifact <artifactId> --character <c>) [--provider <p>] [--direction <text>]preview_voice
Poll a Pro voice clone<br><small>voices.pro.get</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/voices/pro/{jobId}<br>story:readsleeperhit voices pro status <jobId>get_pro_voice_clone
Read the Pro voice clone recording script<br><small>voices.pro.script</small>availableWriters Lab<br>/dashboard/writing-labGET /api/v1/voices/pro/script<br>story:readsleeperhit voices pro scriptget_pro_voice_clone_script
Start a Pro voice clone<br><small>voices.pro.start</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/pro/start<br>story:writesleeperhit voices clone --pro --name <name> [--language <iso>] [--upgrade-from <voiceId>]create_pro_voice_clone_link
Start Pro voice clone training<br><small>voices.pro.train</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/pro/train<br>story:writesleeperhit voices pro train <jobId>start_pro_voice_clone_training
Remove every retired voice<br><small>voices.removeRetired</small>availableWriters Lab<br>/dashboard/writing-labDELETE /api/v1/voices/retired<br>story:writesleeperhit voices remove-retired [--confirm]remove_retired_voices
Rename a library voice<br><small>voices.rename</small>availableWriters Lab<br>/dashboard/writing-labPATCH /api/v1/voices/{voiceId}<br>story:writesleeperhit voices rename <voiceId> --name <name>rename_voice
Withdraw a cloned voice's consent<br><small>voices.revokeConsent</small>availableWriters Lab<br>/dashboard/writing-labPOST /api/v1/voices/{voiceId}/revoke-consent<br>story:writesleeperhit voices revoke-consent <voiceId> --confirmrevoke_voice_consent

Account

EndpointOperation IDScopeIdempotentSchemas
PUT /api/v1/account/craft-focussetCraftFocusaccount:writenorequest:SetCraftFocusRequest<br>response:CraftFocusChange
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
GET /api/v1/account/profilegetWriterProfileaccount:readnoresponse:WriterProfileResponse
PATCH /api/v1/account/profileupdateWriterProfileaccount:writenorequest:WriterProfileUpdateRequest<br>response:WriterProfileResponse
GET /api/v1/account/workspace-rolegetWorkspaceRoleaccount:readnoresponse:WorkspaceRole
PUT /api/v1/account/workspace-rolesetWorkspaceRoleaccount:writenorequest:SetWorkspaceRoleRequest<br>response:WorkspaceRoleChange

Admin

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/admin/capture-grantslistCaptureGrantsaccount:writenoresponse:CaptureGrantList
DELETE /api/v1/admin/capture-grants/{grantId}revokeCaptureGrantaccount:writenoresponse:CaptureGrant
GET /api/v1/admin/capture-runnerslistCaptureRunnersaccount:readnoresponse:CaptureRunners
DELETE /api/v1/admin/capture-runners/allow/{connectionId}disallowCaptureRunnerConnectionaccount:writenoresponse:CaptureRunnerAllowChange
PUT /api/v1/admin/capture-runners/allow/{connectionId}allowCaptureRunnerConnectionaccount:writenorequest:CaptureRunnerAllowRequest<br>response:CaptureRunnerAllowChange
POST /api/v1/admin/capture-runners/previewpreviewCaptureRouteaccount:readnorequest:CaptureRouteRequest<br>response:CaptureRoute
GET /api/v1/admin/demo-accountslistDemoAccountsaccount:readnoresponse:DemoAccounts
DELETE /api/v1/admin/demo-accounts/{userId}removeDemoAccountaccount:writenoresponse:DemoAccountChange
PUT /api/v1/admin/demo-accounts/{userId}addDemoAccountaccount:writenoresponse:DemoAccountChange
POST /api/v1/admin/demo-accounts/{userId}/capture-grantsissueCaptureGrantaccount:writenorequest:CaptureGrantIssueRequest<br>response:CaptureGrantIssue
POST /api/v1/admin/demo-accounts/{userId}/sessionsmintDemoSessionaccount:writenorequest:DemoSessionMintRequest<br>response:DemoSessionMint
DELETE /api/v1/admin/demo-sessions/{sessionId}revokeDemoSessionaccount:writenoresponse:DemoSessionRevoke
GET /api/v1/admin/shows-runninggetShowsRunningaccount:readnoresponse:ShowsRunning
PUT /api/v1/admin/shows-runningsetShowsRunningaccount:writenorequest:ShowsRunningRequest<br>response:ShowsRunning
DELETE /api/v1/admin/users/{userId}/unlimited-creditsdisableUnlimitedCreditsaccount:writenoresponse:UnlimitedCreditsChange
PUT /api/v1/admin/users/{userId}/unlimited-creditsenableUnlimitedCreditsaccount:writenoresponse:UnlimitedCreditsChange
DELETE /api/v1/admin/users/{userId}/workspace-role-switchdisableWorkspaceRoleSwitchaccount:writenoresponse:WorkspaceRoleSwitchChange
PUT /api/v1/admin/users/{userId}/workspace-role-switchenableWorkspaceRoleSwitchaccount:writenoresponse:WorkspaceRoleSwitchChange

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:RefineArtifactEnvelope
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
GET /api/v1/story-projects/{projectId}/brand-coveragelistBrandCoveragestory:readnoresponse:BrandCoverageList

Credits

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/creditsgetCreditscredits:readnoresponse:CreditsSummary
PATCH /api/v1/credits/billingupdateCreditBillingaccount:writenorequest:UpdateCreditBillingRequest<br>response:UpdateCreditBillingResult
GET /api/v1/generation-healthgetGenerationHealthstory:readnoresponse:GenerationHealthEnvelope
GET /api/v1/referralsgetReferralscredits:readnoresponse:Referrals

Discovery

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

Integrations

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/integrationslistIntegrationsstory:readnoresponse:IntegrationCatalog
DELETE /api/v1/integrations/{integrationId}disconnectIntegrationstory:writenoresponse:IntegrationDisconnectResult
GET /api/v1/integrations/{integrationId}/originslistIntegrationOriginsstory:readnoresponse:IntegrationOrigins
PUT /api/v1/integrations/{integrationId}/originssetIntegrationOriginsstory:writenorequest:SetIntegrationOriginsRequest<br>response:IntegrationOrigins
POST /api/v1/integrations/{integrationId}/syncsyncIntegrationstory:writenoresponse:IntegrationSyncResult
POST /api/v1/integrations/providers/{slug}/connectconnectIntegrationstory:writenorequest:IntegrationConnectRequest<br>response:IntegrationConnectResult
DELETE /api/v1/integrations/providers/{slug}/interestwithdrawIntegrationRequeststory:writenoresponse:IntegrationInterestResult
POST /api/v1/integrations/providers/{slug}/interestrequestIntegrationstory:writenorequest:IntegrationInterestRequest<br>response:IntegrationInterestResult
GET /api/v1/integrations/providers/{slug}/walkthroughgetIntegrationWalkthroughstory:readnoresponse:IntegrationWalkthrough
GET /api/v1/organization/memberslistOrganizationMembersstory:readnoresponse:OrganizationMembers
POST /api/v1/organization/membersaddOrganizationMemberstory:writenorequest:AddOrganizationMemberRequest<br>response:OrganizationMemberChange
DELETE /api/v1/organization/members/{userId}removeOrganizationMemberstory:writenoresponse:OrganizationMemberChange
PATCH /api/v1/organization/members/{userId}updateOrganizationMemberstory:writenorequest:UpdateOrganizationMemberRequest<br>response:OrganizationMemberChange
PUT /api/v1/season-runs/{runId}/integration-feedsetSeasonIntegrationFeedstory:writenorequest:SeasonIntegrationFeedRequest<br>response:SeasonIntegrationFeedResult
GET /api/v1/season-runs/{runId}/source-candidateslistSeasonSourceCandidatesstory:readnoresponse:SeasonSourceCandidates
POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/acceptacceptSeasonSourceCandidatestory:writenoresponse:SourceCandidateReviewResult
POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/rejectrejectSeasonSourceCandidatestory:writenoresponse:SourceCandidateReviewResult
POST /api/v1/season-runs/{runId}/source-candidates/bulk-reviewbulkReviewSeasonSourceCandidatesstory:writenorequest:BulkReviewSourceCandidatesRequest<br>response:BulkReviewSourceCandidatesResult
GET /api/v1/story-projects/{projectId}/integration-feedgetProjectIntegrationFeedsstory:readnoresponse:ProjectIntegrationFeeds
PUT /api/v1/story-projects/{projectId}/integration-feedsetProjectIntegrationFeedstory:writenorequest:ProjectIntegrationFeedRequest<br>response:ProjectIntegrationFeedResult

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/castlistMyLibraryCaststory:readnoresponse:MyLibraryCast

Pitch deck

EndpointOperation IDScopeIdempotentSchemas
POST /api/v1/conversations/{conversationId}/pitch-deck-planplanPitchDeckstory:writeyes

Pitch Deck

EndpointOperation IDScopeIdempotentSchemas
DELETE /api/v1/pitch-decks/{jobId}deletePitchDeckstory:writeno
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/addaddPitchDeckChapterstory:writeyesrequest:PitchDeckAddChapterRequest<br>response:PitchDeckAddChapterAck
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:PitchDeckRenderClipAnswer
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:PitchDeckPlanApproveAnswer
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/musicscorePitchDeckSceneMusicstory: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:writeyesrequest:VideoExportRequest<br>response: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
GET /api/v1/story-projects/{projectId}/pitch-deckslistProjectPitchDecksstory:readno

Plans

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-plans/{planId}getStoryPlanstory:readnoresponse:StoryPlanEnvelopeResponse
PATCH /api/v1/story-plans/{planId}renameStoryPlanstory:writenorequest:ArtifactRenameRequest<br>response:StoryPlanEnvelopeResponse
GET /api/v1/story-plans/{planId}/advicegetStoryPlanAdvicestory:readnoresponse:PlanAdviceResponse
POST /api/v1/story-plans/{planId}/adviceapplyStoryPlanAdvicestory:writenorequest:PlanAdviceApplyRequest<br>response:PlanAdviceApplyResponse
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/conversationslistConversationsstory:readnoresponse:ConversationList
PATCH /api/v1/conversations/{conversationId}/video-editing-scopesetVideoEditingScopestory:writenorequest:SetVideoEditingScopeRequest<br>response:VideoEditingScopeResult
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
POST /api/v1/story-projects/{projectId}/cast-canon/from-personacastProjectPersonastory:writeyesrequest:CastFromPersonaRequest<br>response:CastFromPersonaResponse
POST /api/v1/story-projects/{projectId}/cast-filmcastProjectStoryFilmartifact:publishyesrequest:CastStoryFilmRequest<br>response:CastStoryFilmEnvelope
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}/character-notesgetProjectCharacterNotesstory:readnoresponse:CharacterNotesRead
PATCH /api/v1/story-projects/{projectId}/character-notesupdateProjectCharacterNotesstory:writenorequest:CharacterNotesPatch<br>response:CharacterNotesSaved
GET /api/v1/story-projects/{projectId}/claims-ledgergetClaimsLedgerstory:readnoresponse:ClaimsLedgerResponse
POST /api/v1/story-projects/{projectId}/claims-ledger/{claimId}decideClaimstory:writenorequest:DecideClaimBody<br>response:DecideClaimResult
GET /api/v1/story-projects/{projectId}/deliverableslistVideoDeliverablesstory:readnoresponse:VideoDeliverableList
POST /api/v1/story-projects/{projectId}/deliverablescreateVideoDeliverablestory:writenorequest:VideoDeliverableCreateRequest<br>response:VideoDeliverableEnvelope
GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}getVideoDeliverablestory:readnoresponse:VideoDeliverableEnvelope
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/exportexportDeliverableSubmissionstory:readnorequest:VideoDeliverableExportRequest<br>response:VideoDeliverableExportResult
GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/packetgetSubmissionPacketstory:readnoresponse:VideoDeliverableExportResult
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/scoutsaveDeliverableScoutstory:writeno
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/scriptwriteDeliverableScriptstory:writenorequest:VideoDeliverableScriptImportRequest<br>response:VideoDeliverableScriptImportResult
PATCH /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script/cases/{caseId}updateDeliverableScriptCasestory:writenorequest:VideoDeliverableScriptCaseEditRequest<br>response:VideoDeliverableScriptCaseEditResult
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variantsderiveDeliverableVariantstory:writenorequest:VideoDeliverableVariantRequest<br>response:VideoDeliverableVariantEnvelope
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/checkcheckDeliverableVariantstory:writenorequest:VideoDeliverableCheckRequest<br>response:VideoDeliverableCheckResult
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}/memberslistProjectMembersstory:readnoresponse:ProjectMembers
POST /api/v1/story-projects/{projectId}/membersaddProjectMemberstory:writenorequest:AddProjectMemberRequest<br>response:ProjectMemberChange
DELETE /api/v1/story-projects/{projectId}/members/{userId}removeProjectMemberstory:writenoresponse:ProjectMemberChange
PATCH /api/v1/story-projects/{projectId}/members/{userId}updateProjectMemberstory:writenorequest:UpdateProjectMemberRequest<br>response:ProjectMemberChange
POST /api/v1/story-projects/{projectId}/mergemergeStoryProjectstory:writeyesrequest:MergeProjectRequest<br>response:ProjectMergeResult
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
GET /api/v1/story-projects/{projectId}/seasonslistProjectSeasonsstory:readnoresponse:ProjectArc
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:SeriesBibleGenerationStarted
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
POST /api/v1/story-projects/{projectId}/series-bible/coverage/acknowledgeacknowledgeProjectSeriesBibleCoveragestory:writenorequest:SeriesBibleCoverageAcknowledgeRequest<br>response:SeriesBibleCoverageAcknowledgeResult
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
POST /api/v1/publishing-series/{seriesId}/generate-cover-artgeneratePublishingSeriesCoverArtpublishing:writenorequest:PublishingCoverArtGenerateRequest<br>response:PublishingCoverArtGenerateResponse
GET /api/v1/publishing-series/{seriesId}/ready-recordingslistPublishingReadyRecordingspublishing:readnoresponse:PublishingReadyRecordingList
DELETE /api/v1/publishing-series/{seriesId}/ready-recordings/{sourceArtifactId}removePublishingReadyRecordingpublishing:writeno
GET /api/v1/publishing-series/{seriesId}/releaseslistPublishingReleasespublishing:readnoresponse:PublishingReleaseList
POST /api/v1/publishing-series/{seriesId}/releasescreatePublishingReleasepublishing:writeyesrequest:PublishingReleaseCreateRequest<br>response:PublishingReleaseEnvelope
GET /api/v1/publishing/tiktok/connectgetPublishingTikTokConnectLinkpublishing:connectnoresponse:PublishingConnectLink
GET /api/v1/publishing/youtube/connectgetPublishingYouTubeConnectLinkpublishing:connectnoresponse:PublishingConnectLink
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
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}/coverage/acknowledgegetScreenplayCoverageGateartifact:readnoresponse:ScreenplayCoverageGateResponse
POST /api/v1/scripts/{scriptUploadId}/coverage/acknowledgeacknowledgeScreenplayCoveragestory:writenorequest:ScreenplayCoverageAcknowledgeRequest<br>response:ScreenplayCoverageAcknowledgeResult
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/characters/rewrite-directionsrewriteScriptTableReadCharacterDirectionsstory:writenorequest:RewriteActingDirectionsRequest<br>response:RewriteActingDirectionsResult
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
DELETE /api/v1/season-runs/{runId}deleteStorySeasonRunstory:writenoresponse:SeasonRunDeleteResult
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
POST /api/v1/season-runs/{runId}/endendStorySeasonRunstory:writeyesrequest:SeasonRunEndRequest<br>response:SeasonRunEndEnvelope
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

Shows

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/publishing-series/{seriesId}/showgetShowpublishing:readnoresponse:ShowRead
PATCH /api/v1/publishing-series/{seriesId}/showsetUpShowpublishing:writenorequest:ShowSetupUpdateRequest<br>response:ShowRead
POST /api/v1/publishing-series/{seriesId}/show/check-sourcescheckShowSourcespublishing:writenorequest:ShowCheckSourcesRequest<br>response:ShowCheckSourcesResponse
POST /api/v1/publishing-series/{seriesId}/show/domainsetShowDomainpublishing:writenorequest:ShowDomainRequest<br>response:ShowRead
POST /api/v1/publishing-series/{seriesId}/show/episodesmakeShowEpisodepublishing:writeyesrequest:MakeShowEpisodeRequest<br>response:MakeShowEpisodeResponse
GET /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}getShowEpisodepublishing:readnoresponse:ShowEpisode
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/dropdropShowEpisodepublishing:writenorequest:ShowConfirmRequest<br>response:ShowEpisodeAction
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/fix-linefixShowEpisodeLinepublishing:writeyesrequest:FixShowEpisodeLineRequest<br>response:FixShowEpisodeLineResponse
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/publishpublishShowEpisodepublishing:writenorequest:ShowConfirmRequest<br>response:ShowEpisodeAction
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/refinishrefinishShowEpisodepublishing:writeyesrequest:ShowConfirmRequest<br>response:RefinishShowEpisodeResponse
GET /api/v1/publishing-series/{seriesId}/show/runslistShowRunspublishing:readnoresponse:ShowRuns
POST /api/v1/publishing-series/{seriesId}/show/statesetShowStatepublishing:writenorequest:ShowStateRequest<br>response:ShowRead
GET /api/v1/show-source-suggestionssuggestShowSourcespublishing:readnoresponse:ShowSourceSuggestions

Sources

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-projects/{projectId}/app-connectionslistAppConnectionssource:readnoresponse:AppConnectionList
POST /api/v1/story-projects/{projectId}/app-connectionscreateAppConnectionapp:connectyesrequest:AppConnectionCreate<br>response:AppConnectionEnvelope
DELETE /api/v1/story-projects/{projectId}/app-connections/{connectionId}deleteAppConnectionapp:connectnoresponse:AppConnectionDeleted
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}getAppConnectionsource:readnoresponse:AppConnectionDetail
PATCH /api/v1/story-projects/{projectId}/app-connections/{connectionId}updateAppConnectionapp:connectnorequest:AppConnectionUpdate<br>response:AppConnectionEnvelope
PUT /api/v1/story-projects/{projectId}/app-connections/{connectionId}/secrets/{kind}saveAppConnectionSecretapp:connectnorequest:AppConnectionSecretValue<br>response:AppConnectionEnvelope
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-logingetAppConnectionTestLoginsource:readnoresponse:AppConnectionTestLogin
POST /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-logintestAppConnectionLoginapp:connectnorequest:TestAppConnectionLoginRequest<br>response:AppConnectionTestLogin
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/previewgetAppConnectionTestPreviewsource:readnoresponse:AppConnectionTestPreviewResponse
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview/framegetAppConnectionTestPreviewFramesource:readno
GET /api/v1/story-projects/{projectId}/captureslistAppCapturessource:readnoresponse:AppCaptureList
POST /api/v1/story-projects/{projectId}/capturescreateAppCapturesource:writeyesrequest:AppCaptureCreate<br>response:AppCaptureCreateResult
DELETE /api/v1/story-projects/{projectId}/captures/{captureId}deleteAppCapturesource:writenoresponse:AppCaptureDeleted
GET /api/v1/story-projects/{projectId}/captures/{captureId}getAppCapturesource:readnoresponse:AppCaptureEnvelope
PATCH /api/v1/story-projects/{projectId}/captures/{captureId}setAppCaptureFeaturesource:writenorequest:AppCaptureSetFeature<br>response:AppCaptureEnvelope
POST /api/v1/story-projects/{projectId}/captures/{captureId}/finalizefinalizeAppCapturesource:writenoresponse:AppCaptureEnvelope
POST /api/v1/story-projects/{projectId}/captures/match-featuresmatchAppCaptureFeaturessource:writenorequest:AppCaptureMatchFeatures<br>response:AppCaptureFeatureMatchList
GET /api/v1/story-projects/{projectId}/feature-inventorygetFeatureInventorysource:readnoresponse:FeatureInventoryResponse
POST /api/v1/story-projects/{projectId}/feature-inventorylearnFromSitesource:writenorequest:LearnFromSiteBody<br>response:FeatureInventoryLearnStarted
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
GET /api/v1/story-projects/{projectId}/tourslistTourssource:readnoresponse:TourList
POST /api/v1/story-projects/{projectId}/tourscreateToursource:writeyesrequest:TourCreate<br>response:TourEnvelope
DELETE /api/v1/story-projects/{projectId}/tours/{tourId}deleteToursource:writenoresponse:TourDeleted
GET /api/v1/story-projects/{projectId}/tours/{tourId}getToursource:readnoresponse:TourEnvelope
PATCH /api/v1/story-projects/{projectId}/tours/{tourId}updateToursource:writenorequest:TourUpdate<br>response:TourEnvelope
POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordingsquoteTourRecordingsource:writeno
DELETE /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}cancelTourRecordingsource:writeno
GET /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}getTourRecordingsource:readno
POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}confirmTourRecordingsource:writeno
POST /api/v1/story-projects/{projectId}/tours/checkcheckToursource:readnorequest:TourCheckRequest
POST /api/v1/story-projects/{projectId}/tours/draft-missingstartMissingTourDraftssource:writenorequest:StartMissingTourDraftsBody
GET /api/v1/story-projects/{projectId}/tours/draftslistTourDraftssource:readnoresponse:TourDraftsResponse
POST /api/v1/story-projects/{projectId}/tours/draftsstartTourDraftsource:writenorequest:StartTourDraftBody<br>response:TourDraftStarted
GET /api/v1/story-projects/{projectId}/tours/drafts/{runId}getTourDraftsource:readnoresponse:TourDraftResponse
POST /api/v1/story-projects/{projectId}/tours/record-missingquoteMissingTourRecordingssource:writenoresponse:MissingTourRecordingsQuote
POST /api/v1/story-projects/{projectId}/tours/record-missing/cancelcancelMissingTourRecordingssource:writenorequest:CancelMissingTourRecordingsBody<br>response:MissingTourRecordingsCancelled
POST /api/v1/story-projects/{projectId}/tours/record-missing/confirmconfirmMissingTourRecordingssource:writenorequest:ConfirmMissingTourRecordingsBody<br>response:MissingTourRecordingsBooked
GET /api/v1/video-destinationslistVideoDestinationssource:readnoresponse:VideoDestinationList
GET /api/v1/video-destinations/{key}getVideoDestinationsource:readnoresponse:VideoDestinationEnvelope

Story Films

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-projects/{projectId}/story-filmslistProductStoriesstory:readnoresponse:ProductStoriesListResponse
POST /api/v1/story-projects/{projectId}/story-filmspitchProductStoriesstory:writeyesrequest:PitchProductStoriesRequest<br>response:ProductStoryPitchQueued
GET /api/v1/story-projects/{projectId}/story-films/{storyId}getProductStorystory:readnoresponse:ProductStoryFilm
GET /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchorgetStoryFilmBeatAnchorstory:readnoresponse:StoryFilmBeatAnchor
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchorsetStoryFilmBeatAnchorstory:writenorequest:SetStoryFilmBeatAnchorRequest<br>response:StoryFilmBeatAnchor
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/soundsetStoryFilmBeatSoundstory:writenorequest:SetStoryFilmBeatSoundRequest<br>response:StoryFilmBeatSound
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/voicesetStoryFilmBeatVoicestory:writenorequest:SetStoryFilmBeatVoiceRequest<br>response:StoryFilmBeatVoice
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/worldsetStoryFilmWorldBeatstory:writenorequest:SetStoryFilmWorldBeatRequest<br>response:StoryFilmWorldBeats
GET /api/v1/story-projects/{projectId}/story-films/{storyId}/briefgetProductFilmBriefstory:readnoresponse:ProductFilmBriefResponse
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/briefsetProductFilmBriefstory:writenorequest:SetProductFilmBriefRequest<br>response:ProductFilmBriefResponse
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/moments/{momentId}/recordingsetStoryFilmMomentRecordingstory:writenorequest:SetStoryFilmMomentRecordingRequest<br>response:StoryFilmScript
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/screen-viewsetStoryFilmScreenViewstory:writenorequest:SetStoryFilmScreenViewRequest<br>response:StoryFilmScreenView
POST /api/v1/story-projects/{projectId}/story-films/{storyId}/scriptwriteStoryFilmstory:writeyesrequest:WriteStoryFilmRequest<br>response:StoryFilmScript

Strategy

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/strategy/action-itemslistStrategyActionItemsstory:readnoresponse:StrategyActionItemList
DELETE /api/v1/strategy/action-items/{actionItemId}deleteStrategyActionItemstory:writenoresponse:StrategyActionItemDeleted
PATCH /api/v1/strategy/action-items/{actionItemId}updateStrategyActionItemstory:writenorequest:UpdateStrategyActionItemRequest<br>response:StrategyActionItemEnvelope
POST /api/v1/strategy/action-items/{actionItemId}/completecompleteStrategyActionItemstory:writenorequest:CompleteStrategyActionItemRequest<br>response:StrategyActionItemEnvelope
GET /api/v1/strategy/contactslistStrategyContactsstory:readnoresponse:StrategyContactList
POST /api/v1/strategy/contactscreateStrategyContactstory:writeyesrequest:CreateStrategyContactRequest<br>response:StrategyContactEnvelope
PATCH /api/v1/strategy/contacts/{contactId}updateStrategyContactstory:writenorequest:UpdateStrategyContactRequest<br>response:StrategyContactEnvelope
GET /api/v1/strategy/opportunitieslistOpportunitiesstory:readnoresponse:OpportunityList
DELETE /api/v1/strategy/opportunities/{opportunityId}deleteOpportunitystory:writenoresponse:OpportunityDeleted
POST /api/v1/strategy/opportunities/{opportunityId}/archivearchiveOpportunitystory:writenoresponse:OpportunityEnvelope
POST /api/v1/strategy/opportunities/{opportunityId}/promotepromoteOpportunitystory:writenorequest:PromoteOpportunityRequest<br>response:PromoteOpportunityResult
POST /api/v1/strategy/opportunities/{opportunityId}/save-to-researchsaveOpportunityToResearchstory:writeyesrequest:SaveOpportunityToResearchRequest<br>response:SaveOpportunityToResearchResult
GET /api/v1/strategy/pursuitslistPursuitsstory:readnoresponse:PursuitList
POST /api/v1/strategy/pursuitscreatePursuitstory:writeyesrequest:CreatePursuitRequest<br>response:PursuitEnvelope
PATCH /api/v1/strategy/pursuits/{pursuitId}updatePursuitstory:writenorequest:UpdatePursuitRequest<br>response:PursuitEnvelope
POST /api/v1/strategy/pursuits/{pursuitId}/action-itemsaddStrategyActionItemstory:writeyesrequest:AddStrategyActionItemRequest<br>response:StrategyActionItemEnvelope
GET /api/v1/strategy/watcheslistOpportunityWatchesstory:readnoresponse:OpportunityWatchList
POST /api/v1/strategy/watchescreateOpportunityWatchstory:writeyesrequest:CreateOpportunityWatchRequest<br>response:OpportunityWatchEnvelope
DELETE /api/v1/strategy/watches/{watchId}deleteOpportunityWatchstory:writenoresponse:OpportunityWatchDeleted
PATCH /api/v1/strategy/watches/{watchId}updateOpportunityWatchstory:writenorequest:UpdateOpportunityWatchRequest<br>response:OpportunityWatchEnvelope
POST /api/v1/strategy/watches/{watchId}/runrunOpportunityWatchNowstory:writenoresponse:RunOpportunityWatchResult

Table Read

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

trailer

EndpointOperation IDScopeIdempotentSchemas
POST /api/v1/conversations/{conversationId}/trailer-planplanTrailerstory:writeyes

Trailer

EndpointOperation IDScopeIdempotentSchemas
GET /api/v1/story-projects/{projectId}/product-video-planslistProductVideoPlansstory:readnoresponse:ProductVideoPlanList
POST /api/v1/story-projects/{projectId}/product-video-plansplanProductVideostory:writeyesrequest:PlanProductVideoRequest<br>response:ProductVideoPlanEnvelope
GET /api/v1/story-projects/{projectId}/product-video-plans/{runId}getProductVideoPlanstory:readno
POST /api/v1/story-projects/{projectId}/referencesfindReferencesstory:readnoresponse:FindReferencesResponse
GET /api/v1/story-projects/{projectId}/trailerslistProjectTrailersstory:readno
POST /api/v1/story-projects/{projectId}/trailerscreateCaptureOnlyTrailerstory:writeyesrequest:CaptureOnlyTrailerRequest<br>response:CaptureOnlyTrailer
DELETE /api/v1/trailers/{jobId}deleteTrailerstory:writeno
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
GET /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-lookgetTrailerBeatCaptureLookstory:readnoresponse:TrailerBeatCaptureLookView
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-looksetTrailerBeatCaptureLookstory:writeyesrequest:TrailerBeatCaptureLookSetRequest<br>response:TrailerBeatCaptureLookSetAck
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look/previewpreviewTrailerBeatCaptureLookstory:readnorequest:TrailerBeatCaptureLookPreviewRequest<br>response:TrailerBeatCaptureLookPreview
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
GET /api/v1/trailers/{jobId}/beats/{beatIndex}/text-previewgetTrailerBeatTextPreviewstory:readnoresponse:TrailerTextPreview
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview/renderrenderTrailerBeatTextPreviewstory:readyesresponse:TrailerTextPreviewRender
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:TrailerRenderClipAnswer
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
GET /api/v1/trailers/{jobId}/capture-depthgetTrailerCaptureDepthstory:readnoresponse:TrailerCaptureDepthView
POST /api/v1/trailers/{jobId}/capture-depthsetTrailerCaptureDepthstory:writeyesrequest:TrailerCaptureDepthSetRequest<br>response:TrailerCaptureDepthSetAck
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:TrailerPlanApproveAnswer
GET /api/v1/trailers/{jobId}/product-plan-coveragegetProductVideoPlanCoveragestory:readnoresponse:ProductVideoPlanCoverageEnvelope
POST /api/v1/trailers/{jobId}/publishpublishTrailerstory:writeyesrequest:TrailerShareConfirmBody<br>response:TrailerPublish
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
POST /api/v1/trailers/{jobId}/reference-checkcheckTrailerReferencestory:writeyesresponse:CheckTrailerReferenceResponse
DELETE /api/v1/trailers/{jobId}/referenceclearTrailerReferencestory:writenoresponse:TrailerReferenceResponse
GET /api/v1/trailers/{jobId}/referencegetTrailerReferencestory:readnoresponse:TrailerReferenceResponse
PUT /api/v1/trailers/{jobId}/referencechooseTrailerReferencestory:writenoresponse:TrailerReferenceResponse
GET /api/v1/trailers/{jobId}/render-statesgetTrailerRenderStatesstory:readnoresponse:TrailerBeatRenderStates
POST /api/v1/trailers/{jobId}/rerender-depthrerenderTrailerCaptureDepthstory:writeyesresponse:RerenderTrailerCaptureDepthAck
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}/sharegetTrailerSharestory:readnoresponse:TrailerShareState
POST /api/v1/trailers/{jobId}/storyboard/add-beataddTrailerBeatstory:writeyesrequest:TrailerAddBeatRequest<br>response:TrailerBeatOrderAck
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/move-beatmoveTrailerBeatstory:writeyesrequest:TrailerMoveBeatRequest<br>response:TrailerBeatOrderAck
POST /api/v1/trailers/{jobId}/storyboard/musicscoreTrailerSceneMusicstory:writeyes
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/sound-passgetTrailerSoundPassstory:readno
POST /api/v1/trailers/{jobId}/storyboard/sound-passlayTrailerSoundPassstory:writeyes
GET /api/v1/trailers/{jobId}/storyboard/takesgetTrailerBeatTakesstory:readnoresponse:TrailerBeatTakes
POST /api/v1/trailers/{jobId}/unpublishunpublishTrailerstory:writeyesrequest:TrailerShareConfirmBody<br>response:TrailerUnpublish
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:writeyesrequest:VideoExportRequest<br>response:TrailerExportAck
GET /api/v1/trailers/{jobId}/watch-checkcheckTrailerWatchPagestory:readnoresponse:TrailerWatchCheck

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
DELETE /api/v1/voices/retiredremoveRetiredVoicesstory:writenoresponse:RetiredVoicesRemovalResponse

Example recipes

RecipeStatusScopesSteps
Discover supported features before integrating<br><small>discover-capabilities</small>availablestory:readGET /capabilities
Check Studio Credit balance before generating<br><small>check-credits</small>availablecredits:readGET /credits
Recover from auth, rate limit, and idempotency errors<br><small>handle-errors</small>availablecredits:readGET /credits
Create a project and attach an inline text source<br><small>create-project-and-attach-text-source</small>availablestory:write<br>source:writePOST /story-projects<br>POST /story-projects/{projectId}/sources
Read, save, or generate a project Series Bible<br><small>project-series-bible</small>availablestory:read<br>story:writePOST /story-projects/{projectId}/series-bible<br>POST /story-projects/{projectId}/series-bible/coverage
Create a StoryPlan from sources and poll until terminal<br><small>generate-story-plan</small>availablestory:write<br>story:readPOST /story-projects/{projectId}/story-plans<br>GET /story-plans/{planId}<br>POST /story-plans/{planId}/approve
Ingest a PDF source (async, polled)<br><small>ingest-pdf-source</small>availablesource:write<br>source:readPOST /story-projects/{projectId}/sources
Ingest a URL source (async, polled)<br><small>ingest-url-source</small>availablesource:write<br>source:readPOST /story-projects/{projectId}/sources<br>GET /story-projects/{projectId}/sources/{sourceId}
Refine a table read artifact with a free-form instruction<br><small>refine-table-read</small>availableartifact:publish<br>story:read<br>artifact:readPOST /artifacts/{artifactId}/refine<br>GET /story-jobs/{jobId}
Apply a voice effect to a range of lines<br><small>modify-voice-range</small>availableartifact:publishPOST /artifacts/{artifactId}/voice-modification
Render a trailer, choose its takes, and finish it<br><small>render-and-finish-a-trailer</small>availablestory:read<br>story:write<br>artifact:publishPOST /trailers/{jobId}/plan/approve<br>POST /trailers/{jobId}/plan/approve<br>GET /trailers/{jobId}/beats<br>POST /trailers/{jobId}/beats/{beatIndex}/select-take<br>GET /trailers/{jobId}/video-coverage<br>POST /trailers/{jobId}/finish<br>POST /trailers/{jobId}/finish
Render a pitch deck, choose its takes, and finish it<br><small>render-and-finish-a-pitch-deck</small>availablestory:read<br>story:write<br>artifact:publishPOST /pitch-decks/{jobId}/plan/approve<br>POST /pitch-decks/{jobId}/plan/approve<br>GET /pitch-decks/{jobId}/chapters<br>POST /pitch-decks/{jobId}/chapters/{chapterIndex}/select-take<br>GET /pitch-decks/{jobId}/video-coverage<br>POST /pitch-decks/{jobId}/finish<br>POST /pitch-decks/{jobId}/finish
Regenerate a character avatar, restyle the cast, and poll the enriched cast<br><small>recast-avatars</small>availableartifact:publish<br>artifact:readPOST /artifacts/{artifactId}/avatar<br>POST /artifacts/{artifactId}/cast<br>GET /artifacts/{artifactId}/cast
Finalize a table read artifact as a durable MP3<br><small>finalize-audio-mp3</small>availableartifact:publishPOST /artifacts/{artifactId}/finalize<br>GET /artifacts/{artifactId}
Promote a finalized table-read artifact to a podcast feed<br><small>publish-finalized-table-read-podcast</small>availablepublishing:write<br>publishing:publish<br>publishing:readPOST /story-projects/{projectId}/publishing-series<br>POST /publishing-series/{seriesId}/releases<br>POST /publishing-releases/{releaseId}/schedule<br>POST /publishing-releases/{releaseId}/refresh-media<br>GET /publishing-feeds/{seriesSlug}.xml
Safely retry expensive POSTs with Idempotency-Key<br><small>idempotent-post-recipe</small>plannedstory:writePOST /story-jobs
Generate a table read from an approved plan, then read the share URLs<br><small>generate-table-read</small>availablestory:write<br>story:read<br>artifact:readPOST /story-jobs<br>GET /story-jobs/{jobId}<br>GET /artifacts/{artifactId}/script?scope=page&page=1<br>GET /artifacts/{artifactId}

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 another account's and not shared with this one.
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).
capture_not_foundThe app capture does not exist in this project, was deleted, or is owned by another account.
capture_not_uploadedFinalize found no file for the capture yet: PUT the file to the capture's upload URL first (it works for an hour; after that, start a new capture). Nothing changed.
capture_job_not_foundNo recording job with that id in this tour and project (it was deleted, or it is another project's or another tour's), so nothing was read, confirmed, cancelled or refunded.
app_connection_not_foundThe app connection (a stored app login) does not exist in this project, was deleted, or is owned by another account.
app_connection_limit_reachedThe project already holds the most app connections (details.limit). Delete one you no longer use, then connect again. Nothing was created.
app_connection_sealing_unavailableThis server has no key to seal a secret with, so nothing was saved. Reads of connections still work. Try again later.
app_connection_test_limitedToo many test sign-ins: at most 5 an hour per person, and 10 a day aimed at one app from all accounts (details.scope, details.limit, details.window, details.retryAfterSeconds). Nothing was started; try again after the wait.
app_connection_test_changedThis sign-in check is no longer the connection’s current check. Open the current check from Connected apps; do not retry or automatically follow a replacement test.
video_destination_not_foundNo switched-on video destination has this key. List them with GET /video-destinations.
video_destination_unavailableThe video destination's row is there but its spec fails its check, so it cannot be used until the row is fixed. details.reason names the field. Nothing is guessed.
video_deliverable_not_foundThe destination video deliverable does not exist in this project, was deleted, or is owned by another account.
deliverable_script_version_conflictThe deliverable's script changed since the version this edit was based on, so nothing was written. details.expectedScriptVersion is the version you sent and details.currentScriptVersion the version stored now: read the script again and send the edit with scriptVersion set to the stored version.
admin_requiredOnly an admin can call this endpoint: the credential's account is not an admin right now (checked on every call). Nothing was changed.
role_switch_not_enabledSwitching the workspace role is not turned on for this account. Only an admin can turn it on (PUT /admin/users/{userId}/workspace-role-switch, or the admin Users tab). Asking again changes nothing until then. Nothing was changed.
product_kind_not_for_roleProduct projects (videos of a software product) belong to Content creator and Business workspaces, and this account's workspace role is Screenwriter. details.kind is the kind asked for. Nothing was created or changed. Make a story project (or name no kind), or switch the workspace role first; do not retry.
organization_requiredConnected products belong to a business organization, and this account is not a member of one (or of the one named). Create or join one on the Integrations page. Nothing was changed.
organization_member_not_foundNo teammate with that account in your organization, or no account has that email (the person signs up first). List the team with GET /organization/members. Nothing was changed.
organization_member_elsewhereThat account already belongs to another organization; a person belongs to one, and leaves that one first. Nothing was changed.
organization_forbiddenOnly the owner and admins change the team, never above their own role, and the owner's place never changes. Nothing was changed.
integration_not_foundNo such connected product or connection in this account's organization, or it was disconnected. List them with GET /integrations.
integration_forbiddenThe account's role in its organization cannot do this: owners and admins connect, choose places and disconnect; editors also review and run a check. Nothing was changed.
integration_unavailableThe product cannot do this right now: it is not switched on, its app is not set up, reading from it is not built yet, it has no places chosen, or it refused us (message says which). Nothing was changed.
project_read_onlyThe project is shared with this account as a viewer: it can read the project but not change it. Ask the owner to make it an editor. Nothing was changed.
project_owner_onlyOnly the project's owner (or an admin, for its members) can do this: deleting a project and managing who it is shared with are never a member's. Nothing was changed.
project_members_product_onlyOnly a product project can be shared for now. Nothing was changed.
project_member_not_foundNo member with that account on this project, or no account with that email. An account must exist before it can be added. Nothing was changed.
demo_account_not_allowedThe account is not a usable demo account: it is not on the demo-account allowlist, no longer exists, is banned, or is an admin (a demo account never is). message says which. Nothing was changed.
demo_session_not_foundNo live demo session has that id: it was revoked, it ended, or it was never a minted demo session.
demo_session_credential_refusedA demo session is minted with the CLI's sign-in or an API key, never through a connected app's OAuth grant, even an admin's. Nothing was minted.
unlimited_credits_not_allowedUnlimited Studio Credits are only for the studio's own accounts: an admin, or an account on the demo-account allowlist (never a writer's, and never a banned one). Nothing was changed; do not retry.
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. When auto top-up is on but did not cover the spend, details.autoTopup says why: pending (a top-up is being charged; retry in a moment), over_cap (this month's spending cap is reached; raise it with PATCH /credits/billing), too_small (one pack would not cover it; buy a bigger one on the Billing page) or failed (the charge did not go through). It is absent when auto top-up is off. 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, has not cleared its own screenplay coverage, or is not cast (script_not_finalized, screenplay_coverage_before_cast, 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.
capture_in_useThe app capture was not deleted: a film still plays it. details.uses names each film and where it holds the capture — a trailer by its trailerJobId, title and beats, a story film by its storyId and title ({ kind, … }, whose kind is trailer or story-film); give each of those beats or moments another capture or a text card first, then delete the capture 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: Strategy on a plan without the Writers Lab, a watch past the plan's active-watch cap (pause or delete one first), 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 restore window (restorableUntil) has passed, or its purge has started (message says which). Its episodes went private with the project and are deleted with it at the purge.
project_merge_refusedThe project cannot be merged into the other one: it is the same project, the two are of different kinds, it has published an episode, or something in it is still recording, writing or rendering. message says which. Nothing moved.
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 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}/show episodeCap / monthlyCap, with userConfirmed: true) or wait for the next month; do not retry: the same step refuses the same way.
spend_cap_reachedA top-up would take this calendar month's card charges for Studio Credits (UTC, net of refunds) past the writer's monthly spending cap, so nothing was charged. details = { capUsd, spentUsd, packUsd, resetsAt, suggestedCapUsd }. The writer raises the cap on the Billing page (or PATCH /credits/billing spendCapUsd), or waits for resetsAt; do not retry.
credit_billing_invalidAn auto top-up or spending-cap setting the account cannot honor, so nothing changed: details.problem is no_card (no top-up has saved a card yet), no_cap / cap_below_pack (auto top-up needs a monthly cap of at least the pack price), threshold_too_high / threshold_too_low (the threshold must be at least 1 and below the pack's credits), unknown_pack, plan_without_topups or topups_held (a payment dispute is open). A cap that is not a whole number of dollars from 1 to 10,000 (or null) is validation_failed. details.fixUrl is where the writer fixes it.
project_kind_lockedA project's kind (story | product) may change only before the project has production, because the two kinds have different Bibles and coverage rubrics. details.kind, details.requestedKind and details.production (a line per existing script, plan, job, capture or release) say why. Nothing changed. Start a new project of the requested kind instead; do not retry.
project_kind_conflictChanging a project's kind would invalidate the saved rubric report that scored its current Bible (details.invalidatedReport: reportId and rubric). Nothing changed. Send the same PATCH again with confirmKindChange: true to accept that the project is re-graded on the new kind's rubric.
project_not_storyThe work is a story project's and this is a product project, whose Bible lists features rather than episodes: a season run, a show (setting one up, or turning it on), an episode outline (read, write or coverage) or a screenplay draft. details.kind is product, details.requiredKind story, and details.work names the work (season_run, recurring_show, outline, screenplay_draft). Nothing was created, queued or charged. STATE, not payload: the same call refuses the same way, so do not retry — make the product's videos from its app captures; a story told through a cast of people is a story film on this same project (POST /story-projects/{projectId}/story-films), made from its recordings.
project_not_productProduct-only work asked of a story project: a video from app captures (POST /story-projects/{projectId}/trailers with captureOnly: true), "Learn from your site" (POST /story-projects/{projectId}/feature-inventory) or deciding a claim (POST /story-projects/{projectId}/claims-ledger/{claimId}). details.kind is story, details.requiredKind product, and details.work names the work (capture_video, learn_from_site, decide_claim). Nothing was created or changed. STATE, not payload: do not retry — PATCH the project with kind: "product" first (allowed until it has production), or plan the story's video from a story plan.
show_made_outsideThe show is made outside Sleeper: an app holding its standing approval with its own API key makes and publishes its episodes, so Sleeper makes previews of it only. An extra episode, publishing an episode, and turning the show on (POST /publishing-series/{seriesId}/show/state on) are refused. details.keyName names the key and details.website the app's site. Nothing changed. STATE, not payload: do not retry. The creator moves the show into Sleeper by revoking its standing approval first (the Show tab, or standingApprovalKeyId: null on the series).
show_item_already_airedThis preview covers an item the show already aired (details.itemKeys), so publishing it would air the item twice. Nothing was claimed or published. STATE: drop the preview instead (POST /publishing-series/{seriesId}/show/episodes/{episodeId}/drop).
show_episode_not_queuedThe episode could not be queued: one for it is already queued. An episode that was to be made is marked failed (failureCode: not_queued) and nothing was claimed or charged; a refinish leaves the episode as it was. Retryable: try again when the queued one finishes.
show_episode_not_foundThe show has no episode with that id. List its runs (GET /publishing-series/{seriesId}/show/runs) for the ids it has.
show_not_readyThe show cannot make an episode for a reason of its own (details.reason): pseudonym_key_missing (the show makes up commenter names and the platform's key for them is not set; name commenters by their handles meanwhile), or generation_unavailable (no writer the episode needs can be reached right now; GET /generation-health). A Series Bible field longer than its plan field is never a refusal: the plan takes the field's lead and the writer reads all of it. Nothing was spent. STATE: the show's readiness says when it clears.
claim_not_foundThe product's claims ledger lists no claim with that id (ids are claim-…, from GET /story-projects/{projectId}/claims-ledger). Nothing changed. Read the ledger again: a refresh of the site can drop an undecided claim.
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/developers).
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.
tour_not_foundNo tour with that id in this project (it was deleted, or it is another project's or another account's), so nothing was read, changed, checked or deleted. GET /story-projects/{projectId}/tours lists the tours this project holds.
tour_revision_conflictThe tour changed since you last read it, so nothing was written. details.revision is the revision stored now. Read the tour again and send the change with expectedRevision set to the revision you last read.
tour_limit_reachedThe project already holds the most tours it can (details.limit, 200). Delete one you no longer use, then create again. Nothing was created.
tour_draft_not_foundNo tour-draft run with that id in this project (it was deleted, or it is another project's or another account's), so nothing was read, routed, charged or changed.
product_video_plan_not_foundNo product video plan run with that id in this project, whether it never existed or belongs to another account (nothing about one is ever visible to you). List the runs (GET /story-projects/{projectId}/product-video-plans; MCP list_product_video_plans; CLI sleeperhit product-video runs). Nothing was changed.
product_video_no_capturesThe project has no ready capture in the shape this plan asked for, so nothing was started or charged. details.byAspect counts the ready captures each shape has. Record or import a capture of that shape (a video plays the captures exactly as recorded), then plan again.
product_video_not_readyThe project cannot plan this video, make this series or pitch or write this story film yet, so nothing was started or charged. message is the one readiness step to do first, details.step its step and details.next its verb (connect_app, test_app_login, learn_from_site, draft_tour or record_tour; read the whole check with the project's readiness). A video plan or a series waits on one shipped feature with a recording; a story film starts from the same recordings, and with none it waits on the app connected and signed in to and one shipped feature. A story film moment that no recording shows drafts a new tour only through a connection Sleeper has proven signed in. For a plan of a feature with no recording of its own, details.featureId names it and details.recordedFeatures lists the features that can be planned now.
references_unavailableReferences by refs are not available for this request: the feature is switched off, it is in a closed preview this account is not in, no refs client is configured, or this destination deliverable does not take a reference (message says which). Nothing was searched, chosen, reserved or charged.
reference_not_foundrefs lists no film with that REF id (details.refsId). Find references for the video (POST /story-projects/{projectId}/references) and choose one of the refsIds it shows. Nothing was changed.
reference_not_chosenThe video has no reference chosen, so there is nothing to compare it with. Choose one first (PUT /trailers/{jobId}/reference). Nothing was reserved or charged.
reference_check_no_masterThe video has no preview or finished master yet, so there is nothing to measure against the reference. Render its preview (approve the plan) first. Nothing was reserved or charged.
reference_allowance_reachedThe shared monthly reference allowance — or this account's or this project's share of it, or the day's free finds — is used up (message says which), so nothing was searched or compared and nothing was charged. It resets at the start of the next UTC month (finds: the next UTC day).
strategy_item_not_foundNo watch, opportunity, pursuit, action item, contact or script with that id in your Strategy (details.item names which), whether it never existed or is another writer's. Nothing was changed. List them with the matching GET /strategy/… read.
strategy_unavailableStrategy, or its opportunity watches, is switched off right now. Nothing was changed; the same call works again once it is back on.
strategy_watch_not_runnableThe watch cannot run right now: details.reason is paused (resume it with PATCH /strategy/watches/{watchId} and active: true, then run it) or ran_recently (it ran within the last minute; try again after details.retryAfterSeconds). Nothing was queued.