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
| Surface | Path |
|---|---|
| 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
| Surface | Bound operations |
|---|---|
| UI | 535 / 535 |
| API | 533 / 535 |
| CLI | 533 / 535 |
| MCP | 529 / 535 |
Surface gaps
| Operation | Missing surfaces | Planned |
|---|---|---|
admin.captureGrants.issue | MCP | MCP, 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.list | MCP | MCP, 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.revoke | MCP | MCP, 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.testLoginPreviewFrame | CLI, MCP | |
captures.record | API, MCP | API, 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.ownerGuide | API, CLI, MCP | API, 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_failedwhoseerror.details.stagenames the stage the project has not finished (premise, premise_coverage, planning, full_coverage) withmissingFields,canPlanandcanStartEpisode. 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_failedbefore anything is created or charged, withdetails.reasonanddetails.missing. Once the job has written its screenplay, a speaker the cast does not cover fails the job (failureCodecast_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
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Set the craft focus<br><small>account.craftFocus.set</small> | available | Profile craft focus<br>/dashboard/profile | PUT /api/v1/account/craft-focus<br>account:write | sleeperhit craft-focus set <focus> | sleeperhit craft-focus clear | set_craft_focus |
| Cancel the account's deletion<br><small>account.deletion.cancel</small> | available | Profile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=security | DELETE /api/v1/account/deletion<br>account:write | sleeperhit account cancel-deletion | cancel_account_deletion |
| Read where the account's deletion stands<br><small>account.deletion.get</small> | available | Profile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=security | GET /api/v1/account/deletion<br>account:read | sleeperhit account deletion | get_account_deletion |
| Delete the account<br><small>account.deletion.request</small> | available | Profile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=security | POST /api/v1/account/deletion<br>account:write | sleeperhit account delete --confirm-email <email> | request_account_deletion |
| Read the "Download my data" archive<br><small>account.export.get</small> | available | Profile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=security | GET /api/v1/account/export<br>account:read | sleeperhit account export --status | get_account_export |
| Download my data<br><small>account.export.request</small> | available | Profile, Sign-in & Security: Download my data, Delete account<br>/dashboard/profile?tab=security | POST /api/v1/account/export<br>account:read | sleeperhit account export [--wait] [--download <dir>] | request_account_export |
| Read the writer's profile<br><small>account.profile.get</small> | available | Profile page<br>/dashboard/profile | GET /api/v1/account/profile<br>account:read | sleeperhit profile | get_profile |
| Change the writer's profile<br><small>account.profile.update</small> | available | Profile page<br>/dashboard/profile | PATCH /api/v1/account/profile<br>account:write | sleeperhit 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> | available | Account menu<br>/dashboard | GET /api/v1/account/workspace-role<br>account:read | sleeperhit role | get_workspace_role |
| Switch the workspace role<br><small>account.workspaceRole.set</small> | available | Account menu<br>/dashboard | PUT /api/v1/account/workspace-role<br>account:write | sleeperhit role set <writer|creator|business> | set_workspace_role |
admin workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Issue an integration grant for a demo account<br><small>admin.captureGrants.issue</small> | available | planned | POST /api/v1/admin/demo-accounts/{userId}/capture-grants<br>account:write | sleeperhit admin capture-grant issue --user <userId> [--days 90] [--label <text>] [--out <file>] | planned |
| List integration grants<br><small>admin.captureGrants.list</small> | available | planned | GET /api/v1/admin/capture-grants<br>account:write | sleeperhit admin capture-grants | planned |
| Revoke an integration grant<br><small>admin.captureGrants.revoke</small> | available | planned | DELETE /api/v1/admin/capture-grants/{grantId}<br>account:write | sleeperhit admin capture-grant revoke <grantId> | planned |
| Let a connection record on a shared-host runner<br><small>admin.captureRunners.allow</small> | available | Admin Capture runners tab<br>/admin | PUT /api/v1/admin/capture-runners/allow/{connectionId}<br>account:write | sleeperhit 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> | available | Admin Capture runners tab<br>/admin | DELETE /api/v1/admin/capture-runners/allow/{connectionId}<br>account:write | sleeperhit admin capture-runner disallow <connectionId> | disallow_capture_runner_connection |
| List capture runners<br><small>admin.captureRunners.list</small> | available | Admin Capture runners tab<br>/admin | GET /api/v1/admin/capture-runners<br>account:read | sleeperhit admin capture-runners | list_capture_runners |
| Preview where a take would record<br><small>admin.captureRunners.route</small> | available | Admin Capture runners tab<br>/admin | POST /api/v1/admin/capture-runners/preview<br>account:read | sleeperhit 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> | available | Admin Users tab<br>/admin | PUT /api/v1/admin/demo-accounts/{userId}<br>account:write | sleeperhit admin demo-account add <userId> | add_demo_account |
| List demo accounts<br><small>admin.demoAccounts.list</small> | available | Admin Users tab<br>/admin | GET /api/v1/admin/demo-accounts<br>account:read | sleeperhit admin demo-accounts | list_demo_accounts |
| Stop an account being a demo account<br><small>admin.demoAccounts.remove</small> | available | Admin Users tab<br>/admin | DELETE /api/v1/admin/demo-accounts/{userId}<br>account:write | sleeperhit admin demo-account remove <userId> | remove_demo_account |
| Sign in as a demo account (a demo session)<br><small>admin.demoSessions.mint</small> | available | Admin Users tab<br>/admin | POST /api/v1/admin/demo-accounts/{userId}/sessions<br>account:write | sleeperhit admin demo-session --user <userId> [--ttl 2h] [--out <file>] | mint_demo_session |
| End a demo session<br><small>admin.demoSessions.revoke</small> | available | Admin Users tab<br>/admin | DELETE /api/v1/admin/demo-sessions/{sessionId}<br>account:write | sleeperhit admin demo-session revoke <sessionId> | revoke_demo_session |
| Read whether shows are running across Sleeper<br><small>admin.showsRunning.get</small> | available | Admin Settings tab<br>/admin | GET /api/v1/admin/shows-running<br>account:read | sleeperhit admin shows-running | set_shows_running |
| Turn shows running on or off across Sleeper<br><small>admin.showsRunning.set</small> | available | Admin Settings tab<br>/admin | PUT /api/v1/admin/shows-running<br>account:write | sleeperhit admin shows-running on|off | set_shows_running |
| Take away an account's unlimited Studio Credits<br><small>admin.unlimitedCredits.disable</small> | available | Admin Users tab<br>/admin | DELETE /api/v1/admin/users/{userId}/unlimited-credits<br>account:write | sleeperhit admin unlimited-credits off <userId> | set_unlimited_credits |
| Give an account unlimited Studio Credits<br><small>admin.unlimitedCredits.enable</small> | available | Admin Users tab<br>/admin | PUT /api/v1/admin/users/{userId}/unlimited-credits<br>account:write | sleeperhit admin unlimited-credits on <userId> | set_unlimited_credits |
| Stop an account switching its workspace role<br><small>admin.workspaceRoleSwitch.disable</small> | available | Admin Users tab<br>/admin | DELETE /api/v1/admin/users/{userId}/workspace-role-switch<br>account:write | sleeperhit admin role-switch disable <userId> | set_workspace_role_switch |
| Allow an account to switch its workspace role<br><small>admin.workspaceRoleSwitch.enable</small> | available | Admin Users tab<br>/admin | PUT /api/v1/admin/users/{userId}/workspace-role-switch<br>account:write | sleeperhit admin role-switch enable <userId> | set_workspace_role_switch |
| Check generation health<br><small>generation.health</small> | available | Dashboard background activity<br>/dashboard | GET /api/v1/generation-health<br>story:read | sleeperhit generation-health | get_generation_health |
artifacts workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Animate a character's portrait<br><small>artifacts.avatarVideo</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/avatar-video<br>artifact:publish | sleeperhit cast animate <artifactId> --character <name> [--description <text>] | animate_avatar |
| Read a Black List analysis<br><small>artifacts.coverage.blacklist</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/artifacts/{artifactId}/coverage/blacklist<br>artifact:read | sleeperhit coverage blacklist <artifactId> [--report <reportId>] | get_blacklist_analysis |
| Generate script coverage<br><small>artifacts.coverage.generate</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/artifacts/{artifactId}/coverage<br>story:write | sleeperhit coverage generate <artifactId> [--focus <text>] [--confirm] | generate_coverage |
| Read script coverage<br><small>artifacts.coverage.get</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/artifacts/{artifactId}/coverage<br>artifact:read | sleeperhit coverage get <artifactId> | get_coverage |
| List a screenplay's coverage history<br><small>artifacts.coverage.versions</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/artifacts/{artifactId}/coverage/versions<br>artifact:read | sleeperhit coverage versions <artifactId> | list_coverage_versions |
| Finalize a durable MP3 or MP4<br><small>artifacts.finalize</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/finalize<br>artifact:publish | sleeperhit finalize <artifactId> --mode audio|video [--refresh] | finalize_artifact |
| Retry a failed or stalled durable MP3 finalize<br><small>artifacts.finalize.retry</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/finalize/retry<br>artifact:publish | sleeperhit finalize <artifactId> --retry | retry_artifact_finalize |
| Read an artifact<br><small>artifacts.get</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | GET /api/v1/artifacts/{artifactId}<br>artifact:read | sleeperhit artifacts get <artifactId> | get_artifact |
| Read the enriched cast<br><small>artifacts.getCast</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/cast<br>artifact:read | sleeperhit cast <artifactId> | get_cast |
| List job artifacts<br><small>artifacts.list</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | GET /api/v1/story-jobs/{jobId}/artifacts<br>artifact:read | sleeperhit jobs artifacts <jobId> | list_artifacts |
| Read the location plates<br><small>artifacts.locationPlates.get</small> | available | Writers Lab videos asset panel<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/artifacts/{artifactId}/location-plates<br>artifact:read | sleeperhit locations get <artifactId> | get_location_plates |
| Remake one location plate<br><small>artifacts.locationPlates.remake</small> | available | Writers Lab videos asset panel<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/artifacts/{artifactId}/location-plates/{plateKey}/remake<br>artifact:publish | sleeperhit locations remake <artifactId> <plateKey> [--confirm] | remake_location_plate |
| Generate scene music<br><small>artifacts.music.generate</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/music<br>artifact:publish | sleeperhit music generate <artifactId> [--coverage <0..1|0..100>] [--scenes 0,2,5] | generate_music |
| Read scene music status<br><small>artifacts.music.get</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/music<br>artifact:read | sleeperhit music get <artifactId> | get_music |
| Update scene music<br><small>artifacts.music.update</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/music<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/noun-imagery<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/noun-imagery<br>artifact:read | sleeperhit noun-imagery get <artifactId> | get_noun_imagery |
| Refine character performance<br><small>artifacts.performance</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/performance<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read publish button<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/publish-state<br>artifact:read | sleeperhit artifacts publish-state <artifactId> | get_publish_state |
| Send a render to Publishing (or remove it)<br><small>artifacts.publishState.set</small> | available | Writers Lab table-read publish button<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/publish-state<br>artifact:publish | sleeperhit artifacts publish <artifactId> [--off] | mark_publishable/unmark_publishable |
| Regenerate a character avatar<br><small>artifacts.recastAvatar</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/avatar<br>artifact:publish | sleeperhit avatar set <artifactId> --character <c> [--refine <text>] [--style <style>] [--confirm] | recast_avatar |
| Regenerate a character figure<br><small>artifacts.recastFigure</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/figure<br>artifact:publish | sleeperhit figure set <artifactId> --character <c> [--refine <text>] [--reference-image-url <url>] [--confirm] | recast_figure |
| Recast a character voice<br><small>artifacts.recastVoice</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/voice<br>artifact:publish | sleeperhit voice recast <artifactId> --character <c> --voice-id <id> --voice-name <name> [--no-canon] | recast_voice |
| Refine a table read<br><small>artifacts.refine</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/refine<br>artifact:publish | sleeperhit refine <artifactId> <instruction...> [--scope auto|screenplay|plan] [--confirm] | refine_artifact |
| Rename a result<br><small>artifacts.rename</small> | available | Writers Lab script details and video lists<br>/dashboard/writing-lab | PATCH /api/v1/artifacts/{artifactId}<br>story:write | sleeperhit artifacts rename <artifactId> <title> | rename_artifact |
| Render a table-read video<br><small>artifacts.renderVideo</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/render-video<br>artifact:publish | sleeperhit artifacts render-video <artifactId> | render_artifact_video |
| Read render status + share link<br><small>artifacts.renderVideo.status</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/render-video<br>artifact:read | sleeperhit artifacts render-status <artifactId> | get_artifact_share |
| Restore a character's previous voice<br><small>artifacts.restoreVoice</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/voice/restore<br>artifact:publish | sleeperhit voice restore <artifactId> [--character <c>] | restore_voice |
| Flag a table-read line for review<br><small>artifacts.reviewItems.flag</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/review-items<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/review-items<br>artifact:read | sleeperhit script review list <artifactId> | list_line_reviews |
| Remove a table-read line's review flag<br><small>artifacts.reviewItems.unflag</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | DELETE /api/v1/artifacts/{artifactId}/review-items/{entryIndex}<br>artifact:publish | sleeperhit script review unflag <artifactId> <entryIndex> | unflag_line_for_review |
| Re-voice one character in a finished read<br><small>artifacts.revoiceCharacter</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/revoice<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/revoice-line<br>artifact:publish | sleeperhit voice revoice-line <artifactId> --entry <index> [--speed <x>] [--direction <text> | --no-direction] [--confirm] | revoice_line |
| Read character lines<br><small>artifacts.script.character</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/script<br>artifact:read | sleeperhit script character <artifactId> <character...> | get_character_lines |
| Read table-read script content<br><small>artifacts.script.get</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/script<br>artifact:read | sleeperhit script get <artifactId> | get_table_read_script |
| Read script content by page<br><small>artifacts.script.page</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/script<br>artifact:read | sleeperhit script page <artifactId> <page> | get_script_page |
| Replace a table-read screenplay exactly<br><small>artifacts.script.replace</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/script<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/script<br>artifact:read | sleeperhit script scene <artifactId> <sceneIndex> | get_script_scene |
| List sound effects<br><small>artifacts.sfx.list</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/sfx<br>artifact:read | sleeperhit sfx list <artifactId> | list_sfx |
| Manage sound effects<br><small>artifacts.sfx.manage</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/sfx<br>artifact:publish | sleeperhit sfx add|update|remove <artifactId> | add_sfx/update_sfx/remove_sfx |
| List soundscape beds and regions<br><small>artifacts.soundscapes.list</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/soundscapes<br>artifact:read | sleeperhit soundscapes list <artifactId> | get_soundscapes |
| Edit soundscape beds and regions<br><small>artifacts.soundscapes.manage</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/soundscapes<br>artifact:publish | sleeperhit soundscapes update-bed|add|update|attach|remove <artifactId> | update_soundscape/remove_soundscape |
| Write scene backdrop prompts<br><small>artifacts.theater.backdropPrompts</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/theater-backdrop-prompts<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/theater-fx-cues<br>artifact:publish | sleeperhit theater fx-cues <artifactId> --scene <n> | generate_scene_fx_cues |
| Read the theater presentation<br><small>artifacts.theater.get</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}/theater<br>artifact:read | sleeperhit theater get <artifactId> | get_theater_settings |
| Change one scene's theater<br><small>artifacts.theater.scene</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/theater-scene<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/theater<br>artifact:publish | sleeperhit 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> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/artifacts/{artifactId}/theater-canvas<br>artifact:publish | sleeperhit artifacts theater-canvas <artifactId> --scene <n> --beats <json-array> | apply_theater_canvas |
| Generate a theater motion background clip<br><small>artifacts.theaterMotion.clip</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/artifacts/{artifactId}/theater-motion-clip<br>artifact:publish | sleeperhit 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> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/artifacts/{artifactId}/theater-motion<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/cast<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/update-recording<br>artifact:publish | sleeperhit recording update <artifactId> [--confirm] | update_recording |
| Modify voices over a range<br><small>artifacts.voiceModification</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/voice-modification<br>artifact:publish | sleeperhit voice modify <artifactId> --start <n> --end <n> | modify_voice |
brand workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Analyze brand storytelling coverage<br><small>brand.coverage.analyze</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/brand-coverage<br>story:write | sleeperhit 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> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/brand-coverage/{reportId}<br>story:read | sleeperhit brand-coverage get <reportId> | get_brand_coverage |
| List a project's brand coverage reports<br><small>brand.coverage.list</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/story-projects/{projectId}/brand-coverage<br>story:read | sleeperhit brand-coverage list --project <projectId> [--limit <n>] [--cursor <cursor>] | list_brand_coverage |
| Generate brand storytelling<br><small>brand.narrative.generate</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/brand-narrative<br>story:write | sleeperhit brand-narrative generate <brief|-> [--type <text>] [--audience <text>] [--industry <text>] [--channel <text>] [--voice <text>] [--length <text>] [--facts <file>] | generate_brand_narrative |
captures workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Connect an app to record<br><small>appConnections.create</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | POST /api/v1/story-projects/{projectId}/app-connections<br>app:connect | sleeperhit 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> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | DELETE /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>app:connect | sleeperhit app delete <connectionId> --project <projectId> | delete_app_connection |
| Read a stored app login<br><small>appConnections.get</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>source:read | sleeperhit app get <connectionId> --project <projectId> | list_app_connections |
| List stored app logins<br><small>appConnections.list</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/app-connections<br>source:read | sleeperhit app list --project <projectId> | list_app_connections |
| Save a stored app login's secret<br><small>appConnections.secrets.save</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | PUT /api/v1/story-projects/{projectId}/app-connections/{connectionId}/secrets/{kind}<br>app:connect | sleeperhit app secret <connectionId> <kind> --project <projectId> (--value-stdin | --value-env <VAR>) | connect_app |
| Test sign-in<br><small>appConnections.testLogin</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | POST /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login<br>app:connect | sleeperhit app test <connectionId> --project <projectId> | test_app_login |
| Read one sign-in check preview<br><small>appConnections.testLoginPreview</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview<br>source:read | sleeperhit app preview <connectionId> <testId> --project <projectId> | get_app_login_test_preview |
| View one sign-in check picture<br><small>appConnections.testLoginPreviewFrame</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /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> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login<br>source:read | sleeperhit app test <connectionId> --project <projectId> --result | get_app_login_test |
| Change a stored app login<br><small>appConnections.update</small> | available | Writers Lab project Connected apps<br>/dashboard/writing-lab/:projectId?tab=connected-apps | PATCH /api/v1/story-projects/{projectId}/app-connections/{connectionId}<br>app:connect | sleeperhit 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> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/captures<br>source:write | sleeperhit 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> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:write | sleeperhit capture delete <captureId> --project <projectId> | delete_app_capture |
| Check an uploaded app capture<br><small>captures.finalize</small> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/captures/{captureId}/finalize<br>source:write | sleeperhit capture finalize <captureId> --project <projectId> | import_app_capture |
| Read an app capture<br><small>captures.get</small> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:read | sleeperhit capture get <captureId> --project <projectId> | list_app_captures |
| List app captures<br><small>captures.list</small> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/captures<br>source:read | sleeperhit capture list --project <projectId> [--feature-id <featureId>] [--tour-id <tourId>] | list_app_captures |
| Match app captures to features<br><small>captures.matchFeatures</small> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/captures/match-features<br>source:write | sleeperhit capture match-features --project <projectId> [--apply] | match_capture_features |
| Record an app capture from a tour<br><small>captures.record</small> | available | planned | planned | sleeperhit 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> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-projects/{projectId}/captures/{captureId}<br>source:write | sleeperhit 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> | available | Writers Lab project page captures<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/captures<br>source:read | sleeperhit capture list --project <projectId> | list_app_captures |
| Give back recordings of every feature without one<br><small>missingRecordings.cancel</small> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/record-missing/cancel<br>source:write | sleeperhit 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> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/record-missing/confirm<br>source:write | sleeperhit 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> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/record-missing<br>source:write | sleeperhit tour record-missing --project <projectId> | record_missing_tours |
| Cancel a tour recording<br><small>recordings.cancel</small> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:write | sleeperhit tour job cancel <jobId> --project <projectId> --tour-id <tourId> | record_tour |
| Confirm a tour recording<br><small>recordings.confirm</small> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:write | sleeperhit tour record --project <projectId> --tour-id <tourId> --job-id <jobId> --confirm | record_tour |
| Read a tour recording job<br><small>recordings.get</small> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId}<br>source:read | sleeperhit tour job get <jobId> --project <projectId> --tour-id <tourId> | get_capture_job |
| Quote a tour recording<br><small>recordings.quote</small> | available | Writers Lab project page recordings<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings<br>source:write | sleeperhit tour record --project <projectId> --tour-id <tourId> | record_tour |
| Read a tour draft run<br><small>tourDrafts.get</small> | available | Writers Lab project page tour drafts<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/tours/drafts/{runId}<br>source:read | sleeperhit tour draft-status <runId> --project <projectId> | get_tour_draft |
| List tour draft runs<br><small>tourDrafts.list</small> | available | Writers Lab project page tour drafts<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/tours/drafts<br>source:read | sleeperhit tour drafts --project <projectId> [--feature <featureId>] | list_tour_drafts |
| Draft a tour for a feature<br><small>tourDrafts.start</small> | available | Writers Lab project page tour drafts<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/drafts<br>source:write | sleeperhit 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> | available | Writers Lab project page tour drafts<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/draft-missing<br>source:write | sleeperhit tour draft-missing --project <projectId> [--story <storyId>] [--connection <connectionId>] | draft_missing_tours |
| Check a tour document<br><small>tours.check</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours/check<br>source:read | sleeperhit tour check [<tourId>] [--file <tour.json>] --project <projectId> | check_tour |
| Create a tour<br><small>tours.create</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/tours<br>source:write | sleeperhit tour create --project <projectId> --feature <featureId> --file <tour.json> [--label <text>] | create_tour |
| Delete a tour<br><small>tours.delete</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:write | sleeperhit tour delete <tourId> --project <projectId> | delete_tour |
| Read a tour<br><small>tours.get</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:read | sleeperhit tour get <tourId> --project <projectId> | get_tour |
| List tours<br><small>tours.list</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/tours<br>source:read | sleeperhit tour list --project <projectId> [--feature <featureId>] | list_tours |
| Change a tour<br><small>tours.update</small> | available | Writers Lab project page tours<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-projects/{projectId}/tours/{tourId}<br>source:write | sleeperhit tour update <tourId> --project <projectId> [--file <tour.json>] [--feature <featureId>] [--label <text>] [--expected-revision <n>] | update_tour |
casting workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Prepare an episode's table read<br><small>scripts.tableRead.prepare</small> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | POST /api/v1/scripts/{scriptUploadId}/table-read/prepare<br>artifact:publish | sleeperhit script table-read prepare <scriptUploadId> [--confirm] | prepare_table_read |
| Remove a character from a read<br><small>scripts.tableRead.removeCharacter</small> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | POST /api/v1/scripts/{scriptUploadId}/table-read/characters/remove<br>story:write | sleeperhit script table-read remove-character <scriptUploadId> --character <name> | remove_character |
| Rewrite a character's acting directions<br><small>scripts.tableRead.rewriteCharacterDirections</small> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | POST /api/v1/scripts/{scriptUploadId}/table-read/characters/rewrite-directions<br>story:write | sleeperhit script table-read rewrite-directions <scriptUploadId> --character <name> [--direction <text>] [--apply] | rewrite_character_acting_directions |
credits workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Set auto top-up and the monthly spending cap<br><small>credits.billing.update</small> | available | Billing spending card<br>/dashboard/billing | PATCH /api/v1/credits/billing<br>account:write | sleeperhit credits auto-topup|cap | update_credit_billing |
| Read Studio Credit balance<br><small>credits.read</small> | available | Dashboard credit meter<br>/dashboard | GET /api/v1/credits<br>credits:read | sleeperhit credits [topup [--pack 25]] | get_credits |
| Read your referral program<br><small>referrals.read</small> | available | Billing referral panel<br>/dashboard/billing | GET /api/v1/referrals<br>credits:read | sleeperhit referrals | get_referrals |
discovery workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read agent guidance<br><small>agent-guidance</small> | available | Developer console and docs<br>/dashboard/developers | GET /api/v1/agent-guidance<br>story:read | sleeperhit guidance | get_agent_guidance |
| Discover live capabilities<br><small>capabilities</small> | available | Developer console and docs<br>/dashboard/developers | GET /api/v1/capabilities<br> | sleeperhit capabilities | sleeperhit://capabilities |
episode_overrides workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read an episode's overrides<br><small>scripts.overrides.get</small> | available | Writers Lab episode overrides<br>/dashboard/writing-lab/:projectId/:scriptId/cast | GET /api/v1/scripts/{scriptUploadId}/overrides<br>story:read | sleeperhit script overrides get <scriptUploadId> | get_script_overrides |
| Set or clear an episode's overrides<br><small>scripts.overrides.update</small> | available | Writers Lab episode overrides<br>/dashboard/writing-lab/:projectId/:scriptId/cast | PATCH /api/v1/scripts/{scriptUploadId}/overrides<br>story:write | sleeperhit script overrides update <scriptUploadId> [--avatar <text>] [--theater <text>] [--soundscape <text>] [--pitch-deck <text>] [--locations <text>] [--clear <override>] | update_script_overrides |
integrations workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Start connecting a product (a link for a person to open)<br><small>integrations.connect</small> | available | Integrations page Connect drawer<br>/dashboard/integrations | POST /api/v1/integrations/providers/{slug}/connect<br>story:write | sleeperhit integrations connect <slug> | connect_integration |
| Disconnect a product<br><small>integrations.disconnect</small> | available | Integrations page<br>/dashboard/integrations | DELETE /api/v1/integrations/{integrationId}<br>story:write | sleeperhit integrations disconnect <integrationId> | disconnect_integration |
| List connectable products and this organization's connections<br><small>integrations.list</small> | available | Integrations page<br>/dashboard/integrations | GET /api/v1/integrations<br>story:read | sleeperhit integrations list | list_integrations |
| List the places a connection can bring in<br><small>integrations.origins.list</small> | available | Integrations page Connect drawer<br>/dashboard/integrations | GET /api/v1/integrations/{integrationId}/origins<br>story:read | sleeperhit integrations origins <integrationId> | list_integration_origins |
| Choose what a connection brings in<br><small>integrations.origins.set</small> | available | Integrations page Connect drawer<br>/dashboard/integrations | PUT /api/v1/integrations/{integrationId}/origins<br>story:write | sleeperhit 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> | available | Admin Integrations tab<br>/admin | planned | planned | |
| Request another product<br><small>integrations.request</small> | available | Integrations page<br>/dashboard/integrations | POST /api/v1/integrations/providers/{slug}/interest<br>story:write | sleeperhit integrations request <slug> [--note <text>] | request_integration |
| Withdraw a product request<br><small>integrations.request.withdraw</small> | available | Integrations page<br>/dashboard/integrations | DELETE /api/v1/integrations/providers/{slug}/interest<br>story:write | sleeperhit integrations withdraw-request <slug> | withdraw_integration_request |
| Check a connection now<br><small>integrations.sync</small> | available | Integrations page<br>/dashboard/integrations | POST /api/v1/integrations/{integrationId}/sync<br>story:write | sleeperhit integrations sync <integrationId> | sync_integration |
| Add a teammate to your organization<br><small>integrations.team.add</small> | available | Integrations page Team card<br>/dashboard/integrations | POST /api/v1/organization/members<br>story:write | sleeperhit integrations team add <email> --role admin|editor|viewer | add_organization_member |
| List your organization's team<br><small>integrations.team.list</small> | available | Integrations page Team card<br>/dashboard/integrations | GET /api/v1/organization/members<br>story:read | sleeperhit integrations team list | list_organization_members |
| Remove a teammate<br><small>integrations.team.remove</small> | available | Integrations page Team card<br>/dashboard/integrations | DELETE /api/v1/organization/members/{userId}<br>story:write | sleeperhit integrations team remove <userId> | remove_organization_member |
| Change a teammate's role<br><small>integrations.team.update</small> | available | Integrations page Team card<br>/dashboard/integrations | PATCH /api/v1/organization/members/{userId}<br>story:write | sleeperhit integrations team update <userId> admin|editor|viewer | update_organization_member |
| Read a product's step-by-step connect walkthrough<br><small>integrations.walkthrough</small> | available | Integrations page Connect drawer<br>/dashboard/integrations | GET /api/v1/integrations/providers/{slug}/walkthrough<br>story:read | sleeperhit integrations walkthrough <slug> | get_integration_walkthrough |
| Feed a season from a connected product<br><small>season-runs.integrationFeed.set</small> | available | Writers Lab Seasons tab season Sources<br>/dashboard/writing-lab/:projectId?tab=seasons | PUT /api/v1/season-runs/{runId}/integration-feed<br>story:write | sleeperhit 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> | available | Integrations page season review queue<br>/dashboard/integrations | POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/accept<br>story:write | sleeperhit 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> | available | Integrations page season review queue<br>/dashboard/integrations | POST /api/v1/season-runs/{runId}/source-candidates/bulk-review<br>story:write | sleeperhit 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> | available | Integrations page season review queue<br>/dashboard/integrations | GET /api/v1/season-runs/{runId}/source-candidates<br>story:read | sleeperhit 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> | available | Integrations page season review queue<br>/dashboard/integrations | POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/reject<br>story:write | sleeperhit 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> | available | Integrations page<br>/dashboard/integrations | GET /api/v1/story-projects/{projectId}/integration-feed<br>story:read | sleeperhit integrations feeds <projectId> | get_project_integration_feeds |
| Feed a project's seasons from a connected product<br><small>story-projects.integrationFeed.set</small> | available | Integrations page Connect drawer<br>/dashboard/integrations | PUT /api/v1/story-projects/{projectId}/integration-feed<br>story:write | sleeperhit integrations feed <projectId> --product <slug> [--places <key,key,...>] [--off] | set_project_integration_feed |
jobs workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read background activity<br><small>activity.get</small> | available | Dashboard background activity<br>/dashboard | GET /api/v1/background-activity<br>story:read | sleeperhit activity | background_activity |
| Cancel a story job<br><small>jobs.cancel</small> | available | Dashboard background activity<br>/dashboard | POST /api/v1/story-jobs/{jobId}/cancel<br>story:write | sleeperhit jobs cancel <jobId> | cancel_job |
| Create a story job<br><small>jobs.create</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/story-jobs<br>story:write | sleeperhit jobs create <planId> [--script <scriptUploadId>] | create_job |
| Read a story job<br><small>jobs.get</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | GET /api/v1/story-jobs/{jobId}<br>story:read | sleeperhit jobs get <jobId> | get_job |
| List story jobs<br><small>jobs.list</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | GET /api/v1/story-jobs<br>story:read | sleeperhit jobs list | list_jobs |
| Resume a story job<br><small>jobs.resume</small> | available | Dashboard background activity<br>/dashboard | POST /api/v1/story-jobs/{jobId}/resume<br>story:write | sleeperhit jobs resume <jobId> | resume_story_job |
| Read screenplay drafting progress<br><small>screenplay-drafts.get</small> | available | Writers Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptId | GET /api/v1/screenplay-drafts/{scriptUploadId}<br>story:read | sleeperhit screenplay-draft status <scriptUploadId> | screenplay_draft_status |
| Draft or resume an episode scene by scene<br><small>screenplay-drafts.start</small> | available | Writers Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptId | POST /api/v1/screenplay-drafts/{scriptUploadId}<br>story:write | sleeperhit screenplay-draft start|resume <scriptUploadId> [--file <scene-plan.json>] | draft_episode/resume_screenplay_draft |
library workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Import reusable audio<br><small>library.audio.import</small> | available | My Library<br>/dashboard/library | POST /api/v1/library/audio<br>story:write | sleeperhit 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> | available | My Library<br>/dashboard/library | GET /api/v1/library/audio<br>story:read | sleeperhit 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> | available | Writers Lab table-read sound picker<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | PATCH /api/v1/library/audio/{assetId}<br>story:write | sleeperhit library audio rename <assetId> <label> | rename_my_library_audio |
| List My-Library characters<br><small>library.cast.list</small> | available | My Library<br>/dashboard/library | GET /api/v1/library/cast<br>story:read | sleeperhit library cast [--query <text>] [--project <id>] [--limit N] [--cursor C] | list_my_library_cast |
likeness workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Mint a likeness approval link<br><small>likeness.link</small> | available | My Library likeness approvals<br>/dashboard/library | POST /api/v1/likeness-consents/links<br>story:write | sleeperhit likeness link <name> [--email <email>] | create_likeness_consent_link |
| List likeness approvals<br><small>likeness.list</small> | available | My Library likeness approvals<br>/dashboard/library | GET /api/v1/likeness-consents<br>story:read | sleeperhit likeness list | list_likeness_consents |
| Withdraw a likeness approval<br><small>likeness.revoke</small> | available | My Library likeness approvals<br>/dashboard/library | POST /api/v1/likeness-consents/{consentId}/revoke<br>story:write | sleeperhit likeness revoke <consentId> --confirm | revoke_likeness_consent |
pitch-deck workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read the pitch-deck audio timeline<br><small>pitch-deck.audioTimeline.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline<br>story:read | sleeperhit pitch-deck timeline <jobId> show | get_pitch_deck_audio_timeline |
| Edit the pitch-deck audio timeline<br><small>pitch-deck.audioTimeline.mutate</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/storyboard/audio<br>story:read | sleeperhit pitch-deck audio <jobId> | get_pitch_deck_scene_audio |
| Score one scene's music<br><small>pitch-deck.sceneMusic.mutate</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/storyboard/music<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/storyboard/sfx<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/storyboard/sound-map<br>story:read | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/bell-lane<br>story:read | sleeperhit pitch-deck bell <jobId> show | get_pitch_deck_bell_lane |
| Take the bell off the pitch deck<br><small>pitchDeck.bellLane.remove</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/bell-lane/remove<br>story:write | sleeperhit pitch-deck bell <jobId> remove | remove_pitch_deck_bell_lane |
| Strike a bell on every beat of the pitch deck<br><small>pitchDeck.bellLane.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/bell-lane<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/camera<br>story:read | sleeperhit pitch-deck camera <jobId> | get_pitch_deck_camera |
| Set the pitch deck camera motion<br><small>pitchDeck.camera.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/camera<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/cancel-render<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/abandon-take<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/add<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/chapters<br>story:read | sleeperhit pitch-deck chapters <jobId> | get_pitch_deck_chapters |
| Override the repair decision on one pitch deck take<br><small>pitchDeck.chapters.overrideTakeRepair</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/take-repair-override<br>story:write | sleeperhit pitch-deck override-repair <jobId> --chapter <chapterIndex> --call <callId> --take <n> --keep|--restore|--rewatch | override_pitch_deck_take_repair |
| Refine one pitch deck chapter<br><small>pitchDeck.chapters.refine</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/remove<br>story:write | sleeperhit pitch-deck remove-chapter <jobId> --chapter <chapterIndex> | remove_pitch_deck_chapter |
| Render one pitch deck chapter again<br><small>pitchDeck.chapters.renderClip</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/render-clip<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/reorder<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/repair-take<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/select-take<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/stage-voice-over<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/trim-take<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/closing-sequence<br>story:write | sleeperhit 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] | --clear | update_pitch_deck_closing_sequence |
| Delete a pitch deck<br><small>pitchDeck.delete</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | DELETE /api/v1/pitch-decks/{jobId}<br>story:write | sleeperhit pitch-deck delete <jobId> [--confirm] | delete_pitch_deck |
| Duplicate a pitch deck from its plan<br><small>pitchDeck.duplicate</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/duplicate<br>story:write | sleeperhit pitch-deck duplicate <jobId> [--title <text>] | duplicate_pitch_deck |
| Finish the pitch deck<br><small>pitchDeck.finish</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/finish<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/intent<br>story:read | sleeperhit pitch-deck intent <jobId> | get_video_intent |
| Edit a draft pitch deck's intent<br><small>pitchDeck.intent.update</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/intent<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/interludes<br>story:write | sleeperhit pitch-deck interludes <jobId> --json <list> | --file <path> | --clear | update_pitch_deck_interludes |
| Read the pitch deck finish<br><small>pitchDeck.look.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/look<br>story:read | sleeperhit pitch-deck look <jobId> | get_pitch_deck_look |
| Set the pitch deck finish<br><small>pitchDeck.look.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/look<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/more-fixes<br>artifact:publish | sleeperhit pitch-deck more-fixes <jobId> [--confirm] | allow_more_pitch_deck_fixes |
| Read the pitch deck motion blur<br><small>pitchDeck.motionBlur.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/motion-blur<br>story:read | sleeperhit pitch-deck motion-blur <jobId> | get_pitch_deck_motion_blur |
| Set the pitch deck motion blur<br><small>pitchDeck.motionBlur.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/motion-blur<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/narrator<br>story:read | sleeperhit pitch-deck narrator <jobId> | get_pitch_deck_narrator |
| Cast the pitch deck narrator<br><small>pitchDeck.narrator.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/narrator<br>story:write | sleeperhit pitch-deck narrator <jobId> --voice-id <voiceId> [--provider <name>] | --clear | set_pitch_deck_narrator |
| Render a finished pitch deck's PDF<br><small>pitchDeck.pdf.request</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/pdf<br>story:write | sleeperhit pitch-deck pdf <jobId> | render_pitch_deck_pdf |
| Open a new deck planning conversation<br><small>pitchDeck.plan</small> | available | Pitch deck workspace and Slug<br>/dashboard/writing-lab/:projectId | POST /api/v1/conversations/{conversationId}/pitch-deck-plan<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/plan/approve<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/publish<br>story:write | sleeperhit pitch-deck publish <jobId> | publish_pitch_deck |
| Read the pitch deck quiet track<br><small>pitchDeck.quietTrack.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/quiet-track<br>story:read | sleeperhit pitch-deck quiet-track <jobId> | get_pitch_deck_quiet_track |
| Set the pitch deck quiet track<br><small>pitchDeck.quietTrack.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/quiet-track<br>story:write | sleeperhit pitch-deck quiet-track <jobId> --track silence|room_tone | --off | set_pitch_deck_quiet_track |
| Re-assemble a pitch deck whose assembly failed, or rebuild its master<br><small>pitchDeck.reassemble</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/reassemble<br>story:write | sleeperhit pitch-deck reassemble <jobId> | reassemble_pitch_deck |
| Rename a pitch deck<br><small>pitchDeck.rename</small> | available | Writers Lab deck list<br>/dashboard/writing-lab/:projectId/:scriptId/videos | PATCH /api/v1/pitch-decks/{jobId}<br>story:write | sleeperhit pitch-deck rename <jobId> <title> [--automatic] | rename_pitch_deck |
| Read the pitch deck delivery class<br><small>pitchDeck.resolution.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/resolution<br>story:read | sleeperhit pitch-deck resolution <jobId> | get_pitch_deck_resolution |
| Choose the pitch deck delivery class<br><small>pitchDeck.resolution.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/resolution<br>story:write | sleeperhit pitch-deck resolution <jobId> --resolution <720p|1080p> | --default | set_pitch_deck_resolution |
| Read the pitch deck's score to picture<br><small>pitchDeck.scoreToPicture.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/score-to-picture<br>story:read | sleeperhit pitch-deck score-to-picture <jobId> show | get_pitch_deck_score_to_picture |
| Revert the pitch deck to its scene beds<br><small>pitchDeck.scoreToPicture.revert</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/score-to-picture/revert<br>story:write | sleeperhit pitch-deck score-to-picture <jobId> revert | revert_pitch_deck_score_to_picture |
| Score the pitch deck to picture<br><small>pitchDeck.scoreToPicture.start</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/score-to-picture<br>artifact:publish | sleeperhit 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> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/pitch-decks/{jobId}/storyboard/coverage<br>story:write | sleeperhit pitch-deck coverage <jobId> --generate | generate_storyboard_coverage |
| Read pitch deck plan coverage<br><small>pitchDeck.storyboard.coverage.get</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/pitch-decks/{jobId}/storyboard/coverage<br>story:read | sleeperhit pitch-deck coverage <jobId> | get_storyboard_coverage |
| Direct how a deck's text looks and moves<br><small>pitchDeck.storyboard.directTextMotion</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/storyboard/direct-text-motion<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/storyboard/regenerate-text<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/title-sequence/motion-closes<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/title-sequence<br>story:write | sleeperhit 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] | --clear | update_pitch_deck_title_sequence |
| Unpublish a pitch deck<br><small>pitchDeck.unpublish</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/unpublish<br>story:write | sleeperhit pitch-deck unpublish <jobId> | unpublish_pitch_deck |
| Read a pitch deck version<br><small>pitchDeck.versions.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/versions/{number}<br>story:read | sleeperhit pitch-deck version-clips <jobId> <number> [--download <dir>] | get_pitch_deck_version |
| List the pitch deck versions<br><small>pitchDeck.versions.list</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/versions<br>story:read | sleeperhit pitch-deck versions <jobId> | list_pitch_deck_versions |
| Ask for a pitch deck version zip<br><small>pitchDeck.versions.zip</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/versions/{number}/zip<br>story:write | sleeperhit pitch-deck version-clips <jobId> <number> --zip | request_pitch_deck_version_zip |
| Re-stitch the finished deck master from its current chapters and audio<br><small>pitchDeck.video.export</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/video-export<br>story:write | sleeperhit pitch-deck export <jobId> [--target site|youtube|x] | export_pitch_deck_video |
| Cover the pitch deck video again<br><small>pitchDeck.videoCoverage.generate</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/video-coverage<br>story:write | sleeperhit pitch-deck video-coverage <jobId> --generate | generate_video_coverage |
| Read pitch deck video coverage<br><small>pitchDeck.videoCoverage.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/video-coverage<br>story:read | sleeperhit pitch-deck video-coverage <jobId> | get_video_coverage |
| Read the pitch deck video model<br><small>pitchDeck.videoModel.get</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/pitch-decks/{jobId}/video-model<br>story:read | sleeperhit pitch-deck video-model <jobId> | get_pitch_deck_video_model |
| Set the pitch deck video model<br><small>pitchDeck.videoModel.set</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/video-model<br>story:write | sleeperhit pitch-deck video-model <jobId> --model wan3-prime|vidu-q4 | set_pitch_deck_video_model |
| Set a pitch deck's visual grammar<br><small>pitchDeck.visualGrammar.update</small> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/visual-grammar<br>story:write | sleeperhit 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> | available | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/story-projects/{projectId}/pitch-decks<br>story:read | sleeperhit pitch-deck list <projectId> [--season N | --episode <episodeId>] | list_pitch_decks |
plans workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Make a plan's advised change<br><small>plans.advice.apply</small> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-plans/{planId}/advice<br>story:write | sleeperhit 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> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-plans/{planId}/advice<br>story:read | sleeperhit plans advice <planId> | get_plan_advice |
| Approve a StoryPlan<br><small>plans.approve</small> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-plans/{planId}/approve<br>story:write | sleeperhit plans approve <planId> --confirm | approve_plan |
| Generate a StoryPlan<br><small>plans.create</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/story-projects/{projectId}/story-plans<br>story:write | sleeperhit plans create <projectId> --target ... --artifact ... | create_plan |
| Read a StoryPlan<br><small>plans.get</small> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-plans/{planId}<br>story:read | sleeperhit plans get <planId> | get_plan |
| List StoryPlans<br><small>plans.list</small> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-projects/{projectId}/story-plans<br>story:read | sleeperhit plans list <projectId> | list_plans |
| Reject a StoryPlan<br><small>plans.reject</small> | available | Writers Lab Seasons tab plans<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-plans/{planId}/reject<br>story:write | sleeperhit plans reject <planId> | reject_plan |
| Rename a plan<br><small>plans.rename</small> | available | Writers Lab plans waiting for you<br>/dashboard/writing-lab/:projectId?tab=seasons | PATCH /api/v1/story-plans/{planId}<br>story:write | sleeperhit plans rename <planId> <title> | rename_plan |
| Resume a StoryPlan<br><small>plans.resume</small> | available | Writers Lab project workflow<br>/dashboard/writing-lab | POST /api/v1/story-plans/{planId}/resume<br>story:write | sleeperhit plans resume <planId> | resume_story_plan |
projects workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Confirm, reject or reopen a claim<br><small>claimsLedger.decide</small> | available | Writers Lab project page claims the site makes<br>/dashboard/writing-lab/:projectId?tab=connected-apps | POST /api/v1/story-projects/{projectId}/claims-ledger/{claimId}<br>story:write | sleeperhit app claim <claimId> --project <projectId> (--confirm | --reject | --reopen) [--note <text>] | decide_claim |
| Read the product's claims ledger<br><small>claimsLedger.get</small> | available | Writers Lab project page claims the site makes<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/claims-ledger<br>story:read | sleeperhit app claims --project <projectId> | get_claims_ledger |
| List your Slug conversations<br><small>conversations.list</small> | available | Slug pane conversations<br>/dashboard/writing-lab/:projectId | GET /api/v1/conversations<br>story:read | sleeperhit conversations | list_conversations |
| Set Slug video editing scope<br><small>conversations.videoEditingScope.set</small> | available | Trailer and pitch deck conversation scope<br>/dashboard/writing-lab/:projectId/videos | PATCH /api/v1/conversations/{conversationId}/video-editing-scope<br>story:write | sleeperhit 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> | available | Writers Lab videos Closing line<br>/dashboard/writing-lab/:projectId/:scriptId/videos | PATCH /api/v1/story-projects/{projectId}<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-canon/from-persona<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-canon<br>story:read | sleeperhit cast-canon get <projectId> | get_cast_canon |
| Save a project cast canon<br><small>projects.cast-canon.save</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | PATCH /api/v1/story-projects/{projectId}/cast-canon<br>story:write | sleeperhit cast-canon save <projectId> --json '<object>' | --file <json> [--replace] | save_cast_canon |
| Cast a story film's people<br><small>projects.cast-film</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-film<br>artifact:publish | sleeperhit cast film <projectId> [--script <id>] [--person <json>]... [--confirm] | cast_story_film |
| Read cast look directions<br><small>projects.cast-look.get</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-look<br>story:read | sleeperhit cast direction <projectId> [--character <c>] | get_cast_look_direction |
| Set a cast member's look direction<br><small>projects.cast-look.set</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | PATCH /api/v1/story-projects/{projectId}/cast-look<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-portraits/choose<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage<br>story:read | sleeperhit cast-portrait coverage <projectId> --design <designId> | get_portrait_coverage |
| Draw headshot candidates for a cast member<br><small>projects.cast-portraits.design</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-portraits/design<br>artifact:publish | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-portraits/designs<br>story:read | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-voice/choose<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage<br>story:write | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage<br>story:read | sleeperhit cast-voice coverage <projectId> --design <designId> | get_casting_coverage |
| Design a cast member's voice<br><small>projects.cast-voice.design</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | POST /api/v1/story-projects/{projectId}/cast-voice/design<br>artifact:publish | sleeperhit 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> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/cast-voice/designs<br>story:read | sleeperhit cast-voice designs <projectId> [--character <c>] | list_cast_voice_designs |
| Set a cast member's voice<br><small>projects.cast-voice.set</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | PATCH /api/v1/story-projects/{projectId}/cast-voice<br>story:write | sleeperhit 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> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | PATCH /api/v1/story-projects/{projectId}/cast<br>story:write | sleeperhit cast direction <projectId> --script <scriptUploadId> --character <name> --json <direction> | update_character_direction |
| Generate the project cast<br><small>projects.cast.generate</small> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | POST /api/v1/story-projects/{projectId}/cast<br>artifact:publish | sleeperhit 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> | available | Writers Lab episode casting<br>/dashboard/writing-lab/:projectId/:scriptId/cast | GET /api/v1/story-projects/{projectId}/cast<br>story:read | sleeperhit cast status <projectId> [--script <scriptUploadId>] | get_project_cast |
| Read character notes<br><small>projects.character-notes.get</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | GET /api/v1/story-projects/{projectId}/character-notes<br>story:read | sleeperhit character-notes <projectId> [--character <c>] | get_character_notes |
| Change a character's notes<br><small>projects.character-notes.update</small> | available | Project Cast<br>/dashboard/writing-lab/:projectId/cast | PATCH /api/v1/story-projects/{projectId}/character-notes<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | PATCH /api/v1/story-projects/{projectId}<br>story:write | sleeperhit 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> | available | Writers Lab New Project<br>/dashboard/writing-lab | POST /api/v1/story-projects<br>story:write | sleeperhit projects create --name <name> [--kind story|product] [--role writer|creator|business] | create_project |
| Create a project around a script<br><small>projects.createFromScript</small> | available | Writers Lab sidebar<br>/dashboard/writing-lab/:scriptId/:scriptId | POST /api/v1/story-projects/from-script<br>story:write | sleeperhit projects from-script <scriptId> | --script <scriptUploadId> | create_project_from_script |
| Delete a story project<br><small>projects.delete</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}<br>story:write | sleeperhit projects delete <projectId> | delete_project |
| List deleted projects that can still be restored<br><small>projects.deleted.list</small> | available | Writers Lab project library recently deleted<br>/dashboard/writing-lab | GET /api/v1/story-projects/deleted<br>story:read | sleeperhit projects deleted | list_deleted_projects |
| List a project's episodes, versions and videos<br><small>projects.episodes.list</small> | available | Writers Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-projects/{projectId}/episodes<br>story:read | sleeperhit projects episodes <projectId> [--season N] | list_project_episodes |
| Start a Series Bible episode as a draft<br><small>projects.episodes.start</small> | available | Writers Lab episode map<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-projects/{projectId}/episodes<br>story:write | sleeperhit projects episodes start <projectId> <episodeId> | start_planned_episode |
| Read a story project<br><small>projects.get</small> | available | Writers Lab project library<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}<br>story:read | sleeperhit projects get <projectId> | get_project |
| List story projects<br><small>projects.list</small> | available | Writers Lab project library<br>/dashboard/writing-lab | GET /api/v1/story-projects<br>story:read | sleeperhit projects list [--role writer|creator|business] | list_projects |
| Share a project with an account<br><small>projects.members.add</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/members<br>story:write | sleeperhit projects members add <projectId> <email> --role editor|viewer | add_project_member |
| List who a project is shared with<br><small>projects.members.list</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/members<br>story:read | sleeperhit projects members list <projectId> | list_project_members |
| Stop sharing a project with a member<br><small>projects.members.remove</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}/members/{userId}<br>story:write | sleeperhit projects members remove <projectId> <userId> | remove_project_member |
| Change a project member's role<br><small>projects.members.update</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-projects/{projectId}/members/{userId}<br>story:write | sleeperhit projects members update <projectId> <userId> editor|viewer | update_project_member |
| Merge a project into another<br><small>projects.merge</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/merge<br>story:write | sleeperhit projects merge <projectId> --into <projectId> | merge_project |
| Drop a frame from the mood board<br><small>projects.mood-board.dropFrame</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | DELETE /api/v1/story-projects/{projectId}/mood-board/frames/{frameId}<br>story:write | sleeperhit mood-board drop <projectId> <frameId> | drop_mood_board_frame |
| Read a project mood board<br><small>projects.mood-board.get</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/mood-board<br>story:read | sleeperhit mood-board get <projectId> | get_mood_board |
| Keep a frame on the mood board<br><small>projects.mood-board.keepFrame</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | POST /api/v1/story-projects/{projectId}/mood-board/frames<br>story:write | sleeperhit mood-board keep <projectId> --json '<frame>' | --file <json> | keep_mood_board_frame |
| Render candidate mood board frames<br><small>projects.mood-board.renderFrames</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | POST /api/v1/story-projects/{projectId}/mood-board/render-frames<br>artifact:publish | sleeperhit 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> | available | Project Overview outline coverage<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/outline-map/coverage<br>story:write | sleeperhit outline coverage <projectId> --generate | generate_outline_coverage |
| Read outline coverage<br><small>projects.outline-map.coverage.get</small> | available | Project Overview outline coverage<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/outline-map/coverage<br>story:read | sleeperhit outline coverage <projectId> | get_outline_coverage |
| Save an episode outline<br><small>projects.outline-map.episode.save</small> | available | Writers Lab Notes Outline<br>/dashboard/writing-lab/:projectId/:scriptId/notes/outline | PATCH /api/v1/story-projects/{projectId}/outline-map<br>story:write | sleeperhit outline save <projectId> <episodeId> --json <outline> | save_episode_outline |
| Read episode outlines<br><small>projects.outline-map.get</small> | available | Writers Lab Notes Outline<br>/dashboard/writing-lab/:projectId/:scriptId/notes/outline | GET /api/v1/story-projects/{projectId}/outline-map<br>story:read | sleeperhit outline get <projectId> | get_outline_map |
| Restore a deleted project<br><small>projects.restore</small> | available | Writers Lab project library recently deleted<br>/dashboard/writing-lab | POST /api/v1/story-projects/{projectId}/restore<br>story:write | sleeperhit projects restore <projectId> | restore_project |
| Name a new season<br><small>projects.seasons.create</small> | available | Writers Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-projects/{projectId}/seasons<br>story:write | sleeperhit 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> | available | Writers Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-projects/{projectId}/seasons<br>story:read | sleeperhit projects seasons list <projectId> [--season N] | list_project_seasons |
| Read one Series Bible character<br><small>projects.series-bible.character.get</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/series-bible/characters<br>story:read | sleeperhit bible character <projectId> <character> | get_series_bible_character |
| Edit one Series Bible character<br><small>projects.series-bible.character.update</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | PATCH /api/v1/story-projects/{projectId}/series-bible/characters<br>story:write | sleeperhit 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> | available | Series Bible coverage step<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/series-bible/coverage/acknowledge<br>story:write | sleeperhit 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> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/story-projects/{projectId}/series-bible/coverage<br>story:write | sleeperhit bible coverage <projectId> --generate [--phase premise|full|product] | generate_series_bible_coverage |
| Read Series Bible coverage<br><small>projects.series-bible.coverage.get</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/story-projects/{projectId}/series-bible/coverage<br>story:read | sleeperhit bible coverage <projectId> [--phase premise|full|product] | get_series_bible_coverage |
| Generate a project Series Bible<br><small>projects.series-bible.generate</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | POST /api/v1/story-projects/{projectId}/series-bible<br>story:write | sleeperhit bible generate <projectId> | generate_series_bible |
| Read a project Series Bible<br><small>projects.series-bible.get</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/series-bible<br>story:read | sleeperhit bible get <projectId> | get_series_bible |
| Save a project Series Bible<br><small>projects.series-bible.save</small> | available | Writers Lab project canon<br>/dashboard/writing-lab | PATCH /api/v1/story-projects/{projectId}/series-bible<br>story:write | sleeperhit bible save <projectId> --json <object> | save_series_bible |
| List the sounds a project uses<br><small>projects.sounds.list</small> | available | Writers Lab project library<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/sounds<br>story:read | sleeperhit projects sounds <projectId> [--kind bell|music|sfx] [--query <text>] | list_project_sounds |
| Update a story project<br><small>projects.update</small> | available | Writers Lab project page actions menu<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-projects/{projectId}<br>story:write | sleeperhit 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
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| List publishing analytics<br><small>publishing.analytics.list</small> | available | Writers Lab publishing listening numbers<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/analytics<br>publishing:analytics | sleeperhit publishing analytics list <seriesId> | list_publishing_analytics |
| List publishing destinations<br><small>publishing.destinations.list</small> | available | Writers Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/destinations<br>publishing:read | sleeperhit publishing destinations list <seriesId> | list_publishing_destinations |
| Connect a publishing destination<br><small>publishing.destinations.upsert</small> | available | Writers Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/destinations<br>publishing:connect | sleeperhit publishing destinations upsert <seriesId> --provider rss | upsert_publishing_destination |
| Read RSS feed<br><small>publishing.feed</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /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> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-provider-configs<br>publishing:connect | sleeperhit publishing provider-configs list | list_publishing_provider_configs |
| Upsert publishing provider config<br><small>publishing.providerConfigs.upsert</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-provider-configs<br>publishing:connect | sleeperhit publishing provider-configs upsert --provider <provider> --medium <medium> | upsert_publishing_provider_config |
| Cancel a publishing release<br><small>publishing.releases.cancel</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/cancel<br>publishing:publish | sleeperhit publishing releases cancel <releaseId> | cancel_publishing_release |
| Promote an artifact into a publishing release<br><small>publishing.releases.create</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/releases<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/description/generate<br>publishing:write | sleeperhit publishing releases generate-description <releaseId> [--direction <text>] | generate_publishing_release_description |
| Read a publishing release<br><small>publishing.releases.get</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-releases/{releaseId}<br>publishing:read | sleeperhit publishing releases get <releaseId> | get_publishing_release |
| List publishing releases<br><small>publishing.releases.list</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/releases<br>publishing:read | sleeperhit publishing releases list <seriesId> | list_publishing_releases |
| Publish a release<br><small>publishing.releases.publish</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/publish<br>publishing:publish | sleeperhit publishing releases publish <releaseId> --confirm | publish_publishing_release |
| List what is ready to add to the feed<br><small>publishing.releases.ready</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/ready-recordings<br>publishing:read | sleeperhit publishing releases ready <seriesId> | list_publishing_ready_recordings |
| Refresh published release media<br><small>publishing.releases.refresh_media</small> | available | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/refresh-media<br>publishing:publish | sleeperhit 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> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | DELETE /api/v1/publishing-series/{seriesId}/ready-recordings/{sourceArtifactId}<br>publishing:write | sleeperhit publishing releases remove-ready <seriesId> <sourceArtifactId> | remove_publishing_ready_recording |
| Schedule a publishing release<br><small>publishing.releases.schedule</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/schedule<br>publishing:publish | sleeperhit publishing releases schedule <releaseId> --at <iso> --confirm | schedule_publishing_release |
| List publishing release targets<br><small>publishing.releases.targets</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-releases/{releaseId}/targets<br>publishing:read | sleeperhit publishing releases targets <releaseId> | list_publishing_release_targets |
| Unpublish a published release<br><small>publishing.releases.unpublish</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-releases/{releaseId}/unpublish<br>publishing:publish | sleeperhit publishing releases unpublish <releaseId> --confirm | unpublish_publishing_release |
| Update publishing release metadata<br><small>publishing.releases.update</small> | available | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/publishing | PATCH /api/v1/publishing-releases/{releaseId}<br>publishing:write | sleeperhit publishing releases update <releaseId> [--title <title>] [--description <text>] | update_publishing_release |
| Create a publishing series<br><small>publishing.series.create</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/story-projects/{projectId}/publishing-series<br>publishing:write | sleeperhit publishing series create <projectId> [--title <title>] | create_publishing_series |
| Generate podcast cover art<br><small>publishing.series.generateCoverArt</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/generate-cover-art<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}<br>publishing:read | sleeperhit publishing series get <seriesId> | get_publishing_series |
| List publishing series<br><small>publishing.series.list</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/story-projects/{projectId}/publishing-series<br>publishing:read | sleeperhit publishing series list <projectId> | list_publishing_series |
| Update a publishing series<br><small>publishing.series.update</small> | available | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/publishing | PATCH /api/v1/publishing-series/{seriesId}<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing/tiktok/connect<br>publishing:connect | sleeperhit publishing connect tiktok [--series <seriesId>] [--return-to <url>] | get_publishing_connect_link |
| Connect a YouTube account<br><small>publishing.youtube.connect</small> | available | Writers Lab publishing Destinations<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing/youtube/connect<br>publishing:connect | sleeperhit publishing connect youtube [--series <seriesId>] [--return-to <url>] | get_publishing_connect_link |
| Advance a coverage-gated season episode<br><small>season-runs.advance</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/season-runs/{runId}/advance<br>story:write, artifact:publish, publishing:write | sleeperhit season-runs advance <runId> | replan <runId> [--instruction <text>] --confirm | retry-coverage <runId> --confirm | revise <runId> (--instruction <text> | --screenplay-file <path>) --confirm | publish <runId> --confirm | advance_season_run |
| Approve a complete season map<br><small>season-runs.approve</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/season-runs/{runId}/approve<br>story:write | sleeperhit season-runs approve <runId> --expected-map-version <n> --confirm | approve_season_map |
| Create a conversational season run<br><small>season-runs.create</small> | available | Writers Lab Seasons tab<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/story-projects/{projectId}/season-runs<br>story:write, publishing:write | sleeperhit season-runs create <projectId> | create_season_run |
| Delete a season run<br><small>season-runs.delete</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | DELETE /api/v1/season-runs/{runId}<br>story:write | sleeperhit season-runs delete <runId> --confirm | delete_season_run |
| End a season run<br><small>season-runs.end</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | POST /api/v1/season-runs/{runId}/end<br>story:write | sleeperhit season-runs end <runId> --confirm | end_season_run |
| Map one season episode<br><small>season-runs.episodes.map</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | PATCH /api/v1/season-runs/{runId}/episodes/{episodeId}<br>story:write | sleeperhit 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> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/season-runs/{runId}<br>story:read | sleeperhit season-runs get <runId> | get_season_run |
| List season runs<br><small>season-runs.list</small> | available | Writers Lab Seasons tab season run<br>/dashboard/writing-lab/:projectId?tab=seasons | GET /api/v1/story-projects/{projectId}/season-runs<br>story:read | sleeperhit season-runs list <projectId> | list_season_runs |
| Check a show's sources<br><small>show.checkSources</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/check-sources<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/domain<br>publishing:write | sleeperhit show domain <seriesId> <domain|--remove> [--redirects <file.json>] | set_show_domain |
| Drop a show episode<br><small>show.episode.drop</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/drop<br>publishing:write | sleeperhit show drop <seriesId> <episodeId> --confirm | drop_show_episode |
| Fix one line of a show episode<br><small>show.episode.fixLine</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/fix-line<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}<br>publishing:read | sleeperhit show episode <seriesId> <episodeId> | get_show_episode |
| Publish a held or preview episode<br><small>show.episode.publish</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/publish<br>publishing:write | sleeperhit show publish <seriesId> <episodeId> --confirm | publish_show_episode |
| Read a show<br><small>show.get</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/show<br>publishing:read | sleeperhit show get <seriesId> | get_show |
| Make a show episode now (a preview or an extra)<br><small>show.makeEpisode</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/episodes<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/refinish<br>publishing:write | sleeperhit show refinish <seriesId> <episodeId> [--confirm] | refinish_show_episode |
| List a show's runs<br><small>show.runs.list</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/publishing-series/{seriesId}/show/runs<br>publishing:read | sleeperhit show runs <seriesId> [--limit <n>] | list_show_runs |
| Set up or change a show<br><small>show.setUp</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | PATCH /api/v1/publishing-series/{seriesId}/show<br>publishing:write | sleeperhit 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> | available | Writers Lab publishing — Show, Slug pane<br>/dashboard/writing-lab/:projectId/publishing | GET /api/v1/show-source-suggestions<br>publishing:read | sleeperhit show suggest-sources [--topic <topic>] | suggest_show_sources |
| Turn a show on, pause it, or turn it off<br><small>show.state.set</small> | available | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/publishing | POST /api/v1/publishing-series/{seriesId}/show/state<br>publishing:write | sleeperhit show on|pause|resume|off <seriesId> [--confirm] | set_show_state |
scripts workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Write a version's text<br><small>scripts.content.write</small> | available | Writers Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptId | PATCH /api/v1/scripts/{scriptUploadId}/content<br>story:write | sleeperhit script write <scriptUploadId> --file <path> [--expected-file <path>] | write_script_content |
| Continue over screenplay coverage<br><small>scripts.coverage.acknowledge</small> | available | Coverage tab<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/scripts/{scriptUploadId}/coverage/acknowledge<br>story:write | sleeperhit script acknowledge <scriptUploadId> --report <reportId> --reason <text> | acknowledge_screenplay_coverage |
| Read a version's screenplay coverage gate<br><small>scripts.coverage.gate</small> | available | Coverage tab<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/scripts/{scriptUploadId}/coverage/acknowledge<br>artifact:read | sleeperhit script acknowledge <scriptUploadId> | acknowledge_screenplay_coverage |
| Delete a whole script<br><small>scripts.delete</small> | available | Writers Lab script delete<br>/dashboard/writing-lab/:projectId/:scriptId | DELETE /api/v1/scripts/{scriptUploadId}<br>story:write | sleeperhit script delete <scriptId> --confirm | delete_script |
| Export a screenplay as Fountain, Final Draft or PDF<br><small>scripts.export</small> | available | Writers Lab export<br>/dashboard/writing-lab/:projectId/:scriptId | GET /api/v1/scripts/{scriptUploadId}/export<br>story:read | sleeperhit 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> | available | Writers Lab screenplay editor<br>/dashboard/writing-lab/:projectId/:scriptId | POST /api/v1/scripts/{scriptUploadId}/finish<br>story:write | sleeperhit script finish <scriptUploadId> [--coverage adopt|fresh] | finish_draft |
| Read a script<br><small>scripts.get</small> | available | Writers Lab script details<br>/dashboard/writing-lab | GET /api/v1/scripts/{scriptUploadId}<br>story:read | sleeperhit script show <scriptId> | get_script |
| Read one table-read line<br><small>scripts.lines.get</small> | available | Writers Lab table-read line detail<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}<br>story:read | sleeperhit script line get <scriptUploadId> <entryIndex> [--json] | get_script_line_tuning |
| Edit one table-read line<br><small>scripts.lines.update</small> | available | Writers Lab table-read line detail<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | PATCH /api/v1/scripts/{scriptUploadId}/lines/{entryIndex}<br>story:write | sleeperhit 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> | available | Writers Lab table-read share dialog<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/scripts/{scriptUploadId}/share<br>artifact:publish | sleeperhit 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> | available | Writers Lab table-read share dialog<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/scripts/{scriptUploadId}/share<br>story:read | sleeperhit script share get <scriptUploadId> [--json] | get_script_share |
| Change a script's title, logline, format, genre or season<br><small>scripts.update</small> | available | Writers Lab script details<br>/dashboard/writing-lab | PATCH /api/v1/scripts/{scriptUploadId}<br>story:write | sleeperhit 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> | available | Writers Lab upload<br>/dashboard/writing-lab | POST /api/v1/scripts<br>story:write | sleeperhit 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> | available | Writers Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptId | DELETE /api/v1/scripts/{scriptUploadId}/versions/{versionId}<br>story:write | sleeperhit script versions delete <scriptId> <scriptUploadId> --confirm | delete_script_version |
| Upload a new version of a script<br><small>scripts.versions.upload</small> | available | Writers Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptId | POST /api/v1/scripts/{scriptUploadId}/versions<br>story:write | sleeperhit script versions add <scriptId> (--file <path> | --source <sourceId> | --file-url <url> [--file-name <name>]) [--format text|fountain|fdx] | upload_script_version |
sources workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read the product's feature inventory<br><small>featureInventory.get</small> | available | Writers Lab project Connected apps features<br>/dashboard/writing-lab/:projectId?tab=connected-apps | GET /api/v1/story-projects/{projectId}/feature-inventory<br>source:read | sleeperhit app inventory --project <projectId> | get_feature_inventory |
| Learn the product from its site<br><small>featureInventory.learn</small> | available | Writers Lab project Connected apps features<br>/dashboard/writing-lab/:projectId?tab=connected-apps | POST /api/v1/story-projects/{projectId}/feature-inventory<br>source:write | sleeperhit app learn --project <projectId> [--url <site>] [--connection <connectionId>] [--public-only] [--wait] | learn_from_site |
| Attach a source<br><small>sources.create</small> | available | Writers Lab project Sources<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/sources<br>source:write | sleeperhit 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> | available | Writers Lab project Sources<br>/dashboard/writing-lab/:projectId | DELETE /api/v1/story-projects/{projectId}/sources/{sourceId}<br>source:write | sleeperhit sources delete <projectId> <sourceId> | delete_source |
| Read a source<br><small>sources.get</small> | available | Writers Lab project Sources<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/sources/{sourceId}<br>source:read | sleeperhit sources get <projectId> <sourceId> | get_source |
| List sources<br><small>sources.list</small> | available | Writers Lab project Sources<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/sources<br>source:read | sleeperhit sources list <projectId> | list_sources |
story-films workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Anchor a story beat's cut to a mark<br><small>story_film.beat.anchor</small> | available | Writers Lab project Videos Slug pane<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor<br>story:write | sleeperhit 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> | available | Writers Lab project Videos Slug pane<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor<br>story:read | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/sound<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/voice<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/story-films/{storyId}/brief<br>story:read | sleeperhit story-films brief show <storyId> --project <projectId> | get_story_film_brief |
| Set a story film's brief<br><small>story_film.brief.set</small> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/brief<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/story-films/{storyId}<br>story:read | sleeperhit story-films get <storyId> --project <projectId> | get_story_film |
| List a project's story films<br><small>story_film.list</small> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/story-films<br>story:read | sleeperhit story-films list --project <projectId> | list_story_films |
| Choose the recording a story film moment uses<br><small>story_film.moment.recording</small> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/moments/{momentId}/recording<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/story-projects/{projectId}/story-films<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/screen-view<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/world<br>story:write | sleeperhit 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> | available | Writers Lab project Videos story films<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/story-projects/{projectId}/story-films/{storyId}/script<br>story:write | sleeperhit 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
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Add an action item<br><small>strategy.actionItems.add</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/strategy/pursuits/{pursuitId}/action-items<br>story:write | sleeperhit 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> | available | Strategy Action Items tab<br>/dashboard/strategy | POST /api/v1/strategy/action-items/{actionItemId}/complete<br>story:write | sleeperhit strategy action-items complete <actionItemId> [--undo] | complete_action_item |
| Remove an action item<br><small>strategy.actionItems.delete</small> | available | Writers Lab<br>/dashboard/writing-lab | DELETE /api/v1/strategy/action-items/{actionItemId}<br>story:write | sleeperhit strategy action-items delete <actionItemId> | delete_action_item |
| List your action items<br><small>strategy.actionItems.list</small> | available | Strategy Action Items tab<br>/dashboard/strategy | GET /api/v1/strategy/action-items<br>story:read | sleeperhit strategy action-items list [--all] [--pursuit <pursuitId>] | list_action_items |
| Change an action item<br><small>strategy.actionItems.update</small> | available | Writers Lab<br>/dashboard/writing-lab | PATCH /api/v1/strategy/action-items/{actionItemId}<br>story:write | sleeperhit 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> | available | Strategy Contacts conversation<br>/dashboard/strategy | POST /api/v1/strategy/contacts<br>story:write | sleeperhit 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> | available | Strategy Contacts tab<br>/dashboard/strategy | GET /api/v1/strategy/contacts<br>story:read | sleeperhit strategy contacts list | list_contacts |
| Change a contact<br><small>strategy.contacts.update</small> | available | Strategy Contacts conversation<br>/dashboard/strategy | PATCH /api/v1/strategy/contacts/{contactId}<br>story:write | sleeperhit 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> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/strategy/opportunities/{opportunityId}/archive<br>story:write | sleeperhit strategy opportunities archive <opportunityId> | archive_opportunity |
| Delete an opportunity<br><small>strategy.opportunities.delete</small> | available | Writers Lab<br>/dashboard/writing-lab | DELETE /api/v1/strategy/opportunities/{opportunityId}<br>story:write | sleeperhit strategy opportunities delete <opportunityId> | delete_opportunity |
| List the opportunities your watches found<br><small>strategy.opportunities.list</small> | available | Strategy Opportunities tab<br>/dashboard/strategy | GET /api/v1/strategy/opportunities<br>story:read | sleeperhit 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> | available | Strategy Opportunities tab<br>/dashboard/strategy | POST /api/v1/strategy/opportunities/{opportunityId}/promote<br>story:write | sleeperhit strategy opportunities promote <opportunityId> [--script <scriptUploadId>] | promote_opportunity |
| Save an opportunity to a script's research<br><small>strategy.opportunities.saveToResearch</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/strategy/opportunities/{opportunityId}/save-to-research<br>story:write | sleeperhit strategy opportunities save <opportunityId> --script <scriptId> [--notes "<text>"] | save_opportunity_to_research |
| Start a pursuit<br><small>strategy.pursuits.create</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/strategy/pursuits<br>story:write | sleeperhit 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> | available | Strategy Pursuits tab<br>/dashboard/strategy | GET /api/v1/strategy/pursuits<br>story:read | sleeperhit strategy pursuits list [--status active|completed|archived] | list_pursuits |
| Change a pursuit<br><small>strategy.pursuits.update</small> | available | Strategy Pursuits tab<br>/dashboard/strategy | PATCH /api/v1/strategy/pursuits/{pursuitId}<br>story:write | sleeperhit 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> | available | Strategy conversation<br>/dashboard/strategy | POST /api/v1/strategy/watches<br>story:write | sleeperhit 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> | available | Strategy Watches tab<br>/dashboard/strategy | DELETE /api/v1/strategy/watches/{watchId}<br>story:write | sleeperhit strategy watches delete <watchId> | delete_opportunity_watch |
| List your opportunity watches<br><small>strategy.watches.list</small> | available | Strategy Watches tab<br>/dashboard/strategy | GET /api/v1/strategy/watches<br>story:read | sleeperhit strategy watches list | list_opportunity_watches |
| Run a watch now<br><small>strategy.watches.run</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/strategy/watches/{watchId}/run<br>story:write | sleeperhit strategy watches run <watchId> | run_opportunity_watch_now |
| Change, pause or resume a watch<br><small>strategy.watches.update</small> | available | Strategy Watches tab<br>/dashboard/strategy | PATCH /api/v1/strategy/watches/{watchId}<br>story:write | sleeperhit strategy watches update <watchId> [--name "<name>"] [--query "<query>"] [--cadence <cadence>] [--category <category>] [--script <scriptId>|--no-script] [--pause|--resume] | update_opportunity_watch |
table_read workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Retry a failed creative analysis<br><small>scripts.tableRead.retryAnalysis</small> | available | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/scripts/{scriptUploadId}/table-read/retry-analysis<br>story:write | sleeperhit script table-read retry-analysis <scriptUploadId> | retry_creative_analysis |
table-read workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Mint a Performance Booth recording link<br><small>tableRead.performanceBooth.start</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/table-read/performance-booth<br>story:write | sleeperhit performance-booth <jobId> | create_performance_booth_link |
| Read which table-read lines have a performed take<br><small>tableRead.performanceBooth.status</small> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/table-read/performance-booth<br>story:read | sleeperhit performance-booth <jobId> --status | get_performance_booth_status |
trailer workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Plan a product video from the feature map<br><small>productVideos.plan</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/story-projects/{projectId}/product-video-plans<br>story:write | sleeperhit 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> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/trailers/{jobId}/product-plan-coverage<br>story:read | sleeperhit product-video coverage <jobId> | get_product_video_plan_coverage |
| Read a product video plan run<br><small>productVideos.plans.get</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/product-video-plans/{runId}<br>story:read | sleeperhit product-video run <runId> --project <projectId> | get_product_video_plan |
| List the product video plan runs<br><small>productVideos.plans.list</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/story-projects/{projectId}/product-video-plans<br>story:read | sleeperhit product-video runs --project <projectId> | list_product_video_plans |
| List a project's trailers<br><small>projects.trailers.list</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/story-projects/{projectId}/trailers<br>story:read | sleeperhit trailer list <projectId> [--season N | --episode <episodeId>] | list_trailers |
| Compare a video with its reference<br><small>references.check</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/reference-check<br>story:write | sleeperhit product-video check-reference <jobId> [--confirm] | check_trailer_reference |
| Choose a video's reference<br><small>references.choose</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | PUT /api/v1/trailers/{jobId}/reference<br>story:write | sleeperhit product-video reference <jobId> --choose <REF-id> | choose_trailer_reference |
| Clear a video's reference<br><small>references.clear</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | DELETE /api/v1/trailers/{jobId}/reference<br>story:write | sleeperhit product-video reference <jobId> --clear | clear_trailer_reference |
| Find reference films for a business video<br><small>references.find</small> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/story-projects/{projectId}/references<br>story:read | sleeperhit 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> | available | Writers Lab project Videos planner<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/trailers/{jobId}/reference<br>story:read | sleeperhit product-video reference <jobId> | get_trailer_reference |
| Read the trailer aspect ratio<br><small>trailer.aspect.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/aspect<br>story:read | sleeperhit trailer aspect <jobId> | get_trailer_aspect |
| Choose the trailer aspect ratio<br><small>trailer.aspect.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/aspect<br>story:write | sleeperhit trailer aspect <jobId> <9:16|16:9|1:1> | set_trailer_aspect |
| Choose the trailer audio policy<br><small>trailer.audioPolicy.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/audio-policy<br>story:write | sleeperhit trailer audio-policy <jobId> [narrate|suppress] | set_trailer_audio_policy |
| Read the trailer audio timeline<br><small>trailer.audioTimeline.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/storyboard/audio-timeline<br>story:read | sleeperhit trailer timeline <jobId> show | get_trailer_audio_timeline |
| Edit the trailer audio timeline<br><small>trailer.audioTimeline.mutate</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/audio-timeline<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/abandon-take<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit trailer refine <jobId> --beat <n> --capture-keep <start>-<end> | --capture-keep whole | refine_trailer_beat |
| Read a capture beat's screen look<br><small>trailer.beats.captureLook.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look<br>story:read | sleeperhit trailer beat-look <jobId> --beat <n> | get_trailer_beat_look |
| Preview a capture beat's screen look<br><small>trailer.beats.captureLook.preview</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look/preview<br>story:read | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look<br>story:write | sleeperhit 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 | --ease | set_trailer_beat_look |
| Set how fast a capture beat's waits play<br><small>trailer.beats.captureSpeedUp</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit trailer refine <jobId> --beat <n> --speed-up off|gentle|standard|brisk|default | refine_trailer_beat |
| See where a capture beat's picture stutters<br><small>trailer.beats.captureStutter</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/trailers/{jobId}/beats<br>story:read | sleeperhit trailer beats <jobId> | get_trailer_beats |
| Set a capture beat's look and tuning<br><small>trailer.beats.depth</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/drop-line<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/beats<br>story:read | sleeperhit trailer beats <jobId> | get_trailer_beats |
| Keep a beat's own sound<br><small>trailer.beats.keepsSound</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit trailer refine <jobId> --beat <n> --keep-sound | --no-sound | refine_trailer_beat |
| Override the repair decision on one trailer take<br><small>trailer.beats.overrideTakeRepair</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/take-repair-override<br>story:write | sleeperhit trailer override-repair <jobId> --beat <n> --call <callId> --take <n> --keep|--restore|--rewatch | override_trailer_take_repair |
| Refine one trailer beat<br><small>trailer.beats.refine</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/render-clip<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/repair-take<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/beats/refine<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/select-take<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/stage-voice-over<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview<br>story:read | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview/render<br>story:read | sleeperhit trailer text-preview <jobId> --beat <n> --mp4 | preview_trailer_text |
| Trim one take of a trailer call<br><small>trailer.beats.trimTake</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/beats/{beatIndex}/trim-take<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/camera<br>story:read | sleeperhit trailer camera <jobId> | get_trailer_camera |
| Set the trailer camera motion<br><small>trailer.camera.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/camera<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/cancel-render<br>artifact:publish | sleeperhit trailer cancel-render <jobId> | cancel_trailer_render |
| Read the trailer capture depth<br><small>trailer.captureDepth.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | GET /api/v1/trailers/{jobId}/capture-depth<br>story:read | sleeperhit trailer capture-depth <jobId> | get_trailer_capture_depth |
| Set the trailer capture depth<br><small>trailer.captureDepth.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/trailers/{jobId}/capture-depth<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/closing-sequence<br>story:write | sleeperhit 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>] | --clear | update_trailer_closing_sequence |
| Make a trailer from app captures<br><small>trailer.create_capture_only</small> | available | Writers Lab project Videos<br>/dashboard/writing-lab/:projectId/videos | POST /api/v1/story-projects/{projectId}/trailers<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | DELETE /api/v1/trailers/{jobId}<br>story:write | sleeperhit trailer delete <jobId> [--confirm] | delete_trailer |
| Duplicate a trailer from its plan<br><small>trailer.duplicate</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/duplicate<br>story:write | sleeperhit trailer duplicate <jobId> [--title <text>] | duplicate_trailer |
| Finish the trailer<br><small>trailer.finish</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/finish<br>artifact:publish | sleeperhit trailer finish <jobId> [--resolution 720p|1080p] [--confirm] [--acknowledge-video-coverage] | finish_trailer |
| Read a trailer's intent<br><small>trailer.intent.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/intent<br>story:read | sleeperhit trailer intent <jobId> | get_video_intent |
| Edit a draft trailer's intent<br><small>trailer.intent.update</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/intent<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/interludes<br>story:write | sleeperhit trailer interludes <jobId> --json <list> | --file <path> | --clear | update_trailer_interludes |
| Read the trailer finish<br><small>trailer.look.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/look<br>story:read | sleeperhit trailer look <jobId> | get_trailer_look |
| Set the trailer finish<br><small>trailer.look.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/look<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/more-fixes<br>artifact:publish | sleeperhit trailer more-fixes <jobId> [--confirm] | allow_more_trailer_fixes |
| Read the trailer motion blur<br><small>trailer.motionBlur.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/motion-blur<br>story:read | sleeperhit trailer motion-blur <jobId> | get_trailer_motion_blur |
| Set the trailer motion blur<br><small>trailer.motionBlur.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/motion-blur<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/narrator<br>story:read | sleeperhit trailer narrator <jobId> | get_trailer_narrator |
| Cast the trailer narrator<br><small>trailer.narrator.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/narrator<br>story:write | sleeperhit trailer narrator <jobId> --voice-id <voiceId> [--provider <name>] | --clear | set_trailer_narrator |
| Plan a new trailer<br><small>trailer.plan</small> | available | Trailer workspace and Slug<br>/dashboard/writing-lab/:projectId | POST /api/v1/conversations/{conversationId}/trailer-plan<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/plan/approve<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/quiet-track<br>story:read | sleeperhit trailer quiet-track <jobId> | get_trailer_quiet_track |
| Set the trailer quiet track<br><small>trailer.quietTrack.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/quiet-track<br>story:write | sleeperhit trailer quiet-track <jobId> --track silence|room_tone | --off | set_trailer_quiet_track |
| Re-assemble a trailer whose assembly failed, or rebuild its master<br><small>trailer.reassemble</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/reassemble<br>story:write | sleeperhit trailer reassemble <jobId> | reassemble_trailer |
| Rename a trailer<br><small>trailer.rename</small> | available | Writers Lab trailer list<br>/dashboard/writing-lab/:projectId/:scriptId/videos | PATCH /api/v1/trailers/{jobId}<br>story:write | sleeperhit trailer rename <jobId> <title> [--automatic] | rename_trailer |
| Read every trailer beat's render state and credit trail<br><small>trailer.renderStates.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/render-states<br>story:read | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/rerender-depth<br>story:write | sleeperhit trailer rerender-depth <jobId> | rerender_trailer_capture_depth |
| Read the trailer delivery class<br><small>trailer.resolution.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/resolution<br>story:read | sleeperhit trailer resolution <jobId> | get_trailer_resolution |
| Choose the trailer delivery class<br><small>trailer.resolution.set</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/resolution<br>story:write | sleeperhit trailer resolution <jobId> --resolution <720p|1080p> | --default | set_trailer_resolution |
| Read per-beat music and sound effects<br><small>trailer.sceneAudio.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/storyboard/audio<br>story:read | sleeperhit trailer audio <jobId> | get_trailer_scene_audio |
| Score one beat's music<br><small>trailer.sceneMusic.mutate</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/music<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/sfx<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/score-to-picture<br>story:read | sleeperhit trailer score-to-picture <jobId> show | get_trailer_score_to_picture |
| Revert the trailer to its scene beds<br><small>trailer.scoreToPicture.revert</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/score-to-picture/revert<br>story:write | sleeperhit trailer score-to-picture <jobId> revert | revert_trailer_score_to_picture |
| Score the trailer to picture<br><small>trailer.scoreToPicture.start</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/score-to-picture<br>artifact:publish | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/share<br>story:read | sleeperhit trailer share <jobId> [--json] | get_trailer_share |
| Publish a trailer to its public watch page<br><small>trailer.share.publish</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/publish<br>story:write | sleeperhit trailer publish <jobId> [--confirm] | publish_trailer |
| Unpublish a trailer<br><small>trailer.share.unpublish</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/unpublish<br>story:write | sleeperhit trailer unpublish <jobId> [--confirm] | unpublish_trailer |
| Check a published trailer's watch page is reachable logged out<br><small>trailer.share.watchCheck</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/watch-check<br>story:read | sleeperhit trailer watch-check <jobId> | check_trailer_watch_page |
| Read the trailer sound map<br><small>trailer.soundMap.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/storyboard/sound-map<br>story:read | sleeperhit trailer sound-map <jobId> [--beat <n>] | get_trailer_sound_map |
| Read the trailer sound pass<br><small>trailer.soundPass.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/storyboard/sound-pass<br>story:read | sleeperhit trailer sound-pass <jobId> | get_trailer_sound_pass |
| Lay a trailer sound pass<br><small>trailer.soundPass.lay</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/sound-pass<br>story:write | sleeperhit trailer sound-pass <jobId> lay | lay_trailer_sound_pass |
| Add a trailer beat or a text card<br><small>trailer.storyboard.addBeat</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/add-beat<br>story:write | sleeperhit 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> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/storyboard/takes<br>story:read | sleeperhit trailer takes <jobId> [--beat <n>] | get_trailer_beat_takes |
| Generate trailer plan coverage<br><small>trailer.storyboard.coverage.generate</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/trailers/{jobId}/storyboard/coverage<br>story:write | sleeperhit trailer coverage <jobId> --generate | generate_storyboard_coverage |
| Read trailer plan coverage<br><small>trailer.storyboard.coverage.get</small> | available | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | GET /api/v1/trailers/{jobId}/storyboard/coverage<br>story:read | sleeperhit trailer coverage <jobId> | get_storyboard_coverage |
| Direct how a trailer beat's text moves<br><small>trailer.storyboard.directTextMotion</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/direct-text-motion<br>story:write | sleeperhit trailer direct-text-motion <jobId> --beat <n> --direction <text> | --closing-element quote|coming-soon|production-credit --direction <text> | --clear | direct_trailer_text_motion |
| Move a trailer beat to another position<br><small>trailer.storyboard.moveBeat</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/move-beat<br>story:write | sleeperhit trailer move-beat <jobId> --from <n> --to <n> | move_trailer_beat |
| Remove a trailer beat<br><small>trailer.storyboard.removeBeat</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/remove-beat<br>story:write | sleeperhit trailer remove-beat <jobId> --beat <n> | remove_trailer_beat |
| Put an earlier cut of a beat back<br><small>trailer.storyboard.restoreTake</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/restore-take<br>story:write | sleeperhit trailer restore-take <jobId> --beat <n> --url <url> | restore_trailer_take |
| Read a trailer version<br><small>trailer.versions.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/versions/{number}<br>story:read | sleeperhit trailer version-clips <jobId> <number> [--download <dir>] | get_trailer_version |
| List the trailer versions<br><small>trailer.versions.list</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/versions<br>story:read | sleeperhit trailer versions <jobId> | list_trailer_versions |
| Ask for a trailer version zip<br><small>trailer.versions.zip</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/versions/{number}/zip<br>story:write | sleeperhit trailer version-clips <jobId> <number> --zip | request_trailer_version_zip |
| Re-stitch the finished trailer master<br><small>trailer.video.export</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/video-export<br>story:write | sleeperhit trailer export <jobId> [--target site|youtube|x] | export_trailer_video |
| Cover the trailer video again<br><small>trailer.videoCoverage.generate</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/video-coverage<br>story:write | sleeperhit trailer video-coverage <jobId> --generate | generate_video_coverage |
| Read trailer video coverage<br><small>trailer.videoCoverage.get</small> | available | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | GET /api/v1/trailers/{jobId}/video-coverage<br>story:read | sleeperhit trailer video-coverage <jobId> | get_video_coverage |
video_deliverables workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Start a destination video deliverable<br><small>videoDeliverables.create</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/deliverables<br>story:write | sleeperhit deliverable create <projectId> --title <title> --destination <key> | create_video_deliverable |
| Build the submission packet<br><small>videoDeliverables.export</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/export<br>story:read | sleeperhit deliverable export <deliverableId> | export_deliverable_submission |
| Read one destination video deliverable<br><small>videoDeliverables.get</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}<br>story:read | sleeperhit deliverable get <deliverableId> | get_video_deliverable |
| List the project's destination video deliverables<br><small>videoDeliverables.list</small> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/deliverables<br>story:read | sleeperhit deliverable list <projectId> | list_video_deliverables |
| Read the submission packet<br><small>videoDeliverables.packet</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/packet<br>story:read | sleeperhit deliverable packet <deliverableId> | get_submission_packet |
| Save the deliverable's surface scout<br><small>videoDeliverables.scout</small> | available | planned | POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/scout<br>story:write | sleeperhit deliverable scout <deliverableId> --file <path> | save_video_deliverable_scout |
| Edit one case of the script in place<br><small>videoDeliverables.scriptCaseEdit</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script/cases/{caseId}<br>story:write | sleeperhit 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> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script<br>story:write | sleeperhit deliverable script <deliverableId> --file <path> | write_deliverable_script |
| Check a variant against its destination spec<br><small>videoDeliverables.variants.check</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check<br>story:write | sleeperhit deliverable check <deliverableId> <variantKey> | check_deliverable_variant |
| Derive a destination variant<br><small>videoDeliverables.variants.derive</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants<br>story:write | sleeperhit deliverable derive <deliverableId> --destination <key> | derive_deliverable_variant |
video_destinations workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Read a video destination<br><small>videoDestinations.get</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | GET /api/v1/video-destinations/{key}<br>source:read | sleeperhit destination get <key> | get_video_destination |
| List video destinations<br><small>videoDestinations.list</small> | available | Writers Lab project conversation<br>/dashboard/writing-lab/:projectId | GET /api/v1/video-destinations<br>source:read | sleeperhit destination list | list_video_destinations |
voices workflows
| Operation | Status | UI | API | CLI | MCP |
|---|---|---|---|---|---|
| Mint a voice-clone recording link<br><small>voices.cloneLink</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/clone-link<br>story:write | sleeperhit voices clone | create_voice_clone_link |
| Mint a voice consent link<br><small>voices.consentLink</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/{voiceId}/consent-link<br>story:write | sleeperhit voices consent <voiceId> | create_voice_consent_link |
| Delete a library voice<br><small>voices.delete</small> | available | Writers Lab<br>/dashboard/writing-lab | DELETE /api/v1/voices/{voiceId}<br>story:write | sleeperhit voices delete <voiceId> [--confirm] | delete_voice |
| List my studio voices<br><small>voices.list</small> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/voices<br>story:read | sleeperhit voices list | list_voices |
| Migrate a voice everywhere it is used<br><small>voices.migrate</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voice-migrations<br>story:write | sleeperhit 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> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voice-migrations/{migrationId}/undo<br>story:write | sleeperhit voices migration-undo <migrationId> | undo_voice_migration |
| List voice migrations<br><small>voices.migrations</small> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/voice-migrations<br>story:read | sleeperhit voices migrations [--voice <voiceId>] | list_voice_migrations |
| Hear a voice say a line<br><small>voices.preview</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/preview<br>story:write | sleeperhit 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> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/voices/pro/{jobId}<br>story:read | sleeperhit voices pro status <jobId> | get_pro_voice_clone |
| Read the Pro voice clone recording script<br><small>voices.pro.script</small> | available | Writers Lab<br>/dashboard/writing-lab | GET /api/v1/voices/pro/script<br>story:read | sleeperhit voices pro script | get_pro_voice_clone_script |
| Start a Pro voice clone<br><small>voices.pro.start</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/pro/start<br>story:write | sleeperhit 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> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/pro/train<br>story:write | sleeperhit voices pro train <jobId> | start_pro_voice_clone_training |
| Remove every retired voice<br><small>voices.removeRetired</small> | available | Writers Lab<br>/dashboard/writing-lab | DELETE /api/v1/voices/retired<br>story:write | sleeperhit voices remove-retired [--confirm] | remove_retired_voices |
| Rename a library voice<br><small>voices.rename</small> | available | Writers Lab<br>/dashboard/writing-lab | PATCH /api/v1/voices/{voiceId}<br>story:write | sleeperhit voices rename <voiceId> --name <name> | rename_voice |
| Withdraw a cloned voice's consent<br><small>voices.revokeConsent</small> | available | Writers Lab<br>/dashboard/writing-lab | POST /api/v1/voices/{voiceId}/revoke-consent<br>story:write | sleeperhit voices revoke-consent <voiceId> --confirm | revoke_voice_consent |
Account
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
PUT /api/v1/account/craft-focus | setCraftFocus | account:write | no | request:SetCraftFocusRequest<br>response:CraftFocusChange |
DELETE /api/v1/account/deletion | cancelAccountDeletion | account:write | no | response:AccountDeletionStatus |
GET /api/v1/account/deletion | getAccountDeletion | account:read | no | response:AccountDeletionStatus |
POST /api/v1/account/deletion | requestAccountDeletion | account:write | yes | request:AccountDeletionRequest<br>response:AccountDeletionStatus |
GET /api/v1/account/export | getAccountExport | account:read | no | response:AccountExportStatus |
POST /api/v1/account/export | requestAccountExport | account:read | yes | response:AccountExportStatus |
GET /api/v1/account/profile | getWriterProfile | account:read | no | response:WriterProfileResponse |
PATCH /api/v1/account/profile | updateWriterProfile | account:write | no | request:WriterProfileUpdateRequest<br>response:WriterProfileResponse |
GET /api/v1/account/workspace-role | getWorkspaceRole | account:read | no | response:WorkspaceRole |
PUT /api/v1/account/workspace-role | setWorkspaceRole | account:write | no | request:SetWorkspaceRoleRequest<br>response:WorkspaceRoleChange |
Admin
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/admin/capture-grants | listCaptureGrants | account:write | no | response:CaptureGrantList |
DELETE /api/v1/admin/capture-grants/{grantId} | revokeCaptureGrant | account:write | no | response:CaptureGrant |
GET /api/v1/admin/capture-runners | listCaptureRunners | account:read | no | response:CaptureRunners |
DELETE /api/v1/admin/capture-runners/allow/{connectionId} | disallowCaptureRunnerConnection | account:write | no | response:CaptureRunnerAllowChange |
PUT /api/v1/admin/capture-runners/allow/{connectionId} | allowCaptureRunnerConnection | account:write | no | request:CaptureRunnerAllowRequest<br>response:CaptureRunnerAllowChange |
POST /api/v1/admin/capture-runners/preview | previewCaptureRoute | account:read | no | request:CaptureRouteRequest<br>response:CaptureRoute |
GET /api/v1/admin/demo-accounts | listDemoAccounts | account:read | no | response:DemoAccounts |
DELETE /api/v1/admin/demo-accounts/{userId} | removeDemoAccount | account:write | no | response:DemoAccountChange |
PUT /api/v1/admin/demo-accounts/{userId} | addDemoAccount | account:write | no | response:DemoAccountChange |
POST /api/v1/admin/demo-accounts/{userId}/capture-grants | issueCaptureGrant | account:write | no | request:CaptureGrantIssueRequest<br>response:CaptureGrantIssue |
POST /api/v1/admin/demo-accounts/{userId}/sessions | mintDemoSession | account:write | no | request:DemoSessionMintRequest<br>response:DemoSessionMint |
DELETE /api/v1/admin/demo-sessions/{sessionId} | revokeDemoSession | account:write | no | response:DemoSessionRevoke |
GET /api/v1/admin/shows-running | getShowsRunning | account:read | no | response:ShowsRunning |
PUT /api/v1/admin/shows-running | setShowsRunning | account:write | no | request:ShowsRunningRequest<br>response:ShowsRunning |
DELETE /api/v1/admin/users/{userId}/unlimited-credits | disableUnlimitedCredits | account:write | no | response:UnlimitedCreditsChange |
PUT /api/v1/admin/users/{userId}/unlimited-credits | enableUnlimitedCredits | account:write | no | response:UnlimitedCreditsChange |
DELETE /api/v1/admin/users/{userId}/workspace-role-switch | disableWorkspaceRoleSwitch | account:write | no | response:WorkspaceRoleSwitchChange |
PUT /api/v1/admin/users/{userId}/workspace-role-switch | enableWorkspaceRoleSwitch | account:write | no | response:WorkspaceRoleSwitchChange |
Artifacts
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/artifacts/{artifactId} | getStoryArtifact | artifact:read | no | response:StoryArtifactEnvelope |
PATCH /api/v1/artifacts/{artifactId} | renameStoryArtifact | story:write | no | request:ArtifactRenameRequest<br>response:RenamedArtifact |
POST /api/v1/artifacts/{artifactId}/avatar-video | animateArtifactAvatar | artifact:publish | yes | request:TableReadAvatarVideoRequest<br>response:TableReadAvatarVideoResponse |
POST /api/v1/artifacts/{artifactId}/avatar | recastArtifactAvatar | artifact:publish | yes | request:AvatarRecastRequest |
GET /api/v1/artifacts/{artifactId}/cast | getArtifactCast | artifact:read | no | response:CastEnvelope |
POST /api/v1/artifacts/{artifactId}/cast | updateArtifactCast | artifact:publish | yes | request:CastBatchRequest |
GET /api/v1/artifacts/{artifactId}/coverage | getArtifactCoverage | artifact:read | no | response:CoverageReportEnvelope |
POST /api/v1/artifacts/{artifactId}/coverage | generateArtifactCoverage | story:write | yes | response:CoverageDispatchAck |
GET /api/v1/artifacts/{artifactId}/coverage/blacklist | getBlackListAnalysis | artifact:read | no | response:BlackListAnalysisResponse |
GET /api/v1/artifacts/{artifactId}/coverage/versions | listCoverageVersions | artifact:read | no | response:CoverageVersionsResponse |
POST /api/v1/artifacts/{artifactId}/figure | recastArtifactFigure | artifact:publish | yes | request:FigureRecastRequest |
POST /api/v1/artifacts/{artifactId}/finalize | finalizeArtifact | artifact:publish | yes | |
POST /api/v1/artifacts/{artifactId}/finalize/retry | retryArtifactFinalize | artifact:publish | yes | response:ArtifactFinalizeAck |
GET /api/v1/artifacts/{artifactId}/location-plates | getArtifactLocationPlates | artifact:read | no | response:LocationPlatesEnvelope |
POST /api/v1/artifacts/{artifactId}/location-plates/{plateKey}/remake | remakeArtifactLocationPlate | artifact:publish | yes | request:LocationPlateRemakeRequest<br>response:LocationPlateRemakeEnvelope |
GET /api/v1/artifacts/{artifactId}/music | getArtifactMusic | artifact:read | no | response:MusicStatusEnvelope |
POST /api/v1/artifacts/{artifactId}/music | generateArtifactMusic | artifact:publish | yes | request:MusicGenerateRequest<br>response:MusicGenerateResponse |
GET /api/v1/artifacts/{artifactId}/noun-imagery | getArtifactNounImagery | artifact:read | no | response:TableReadNounImageryResponse |
POST /api/v1/artifacts/{artifactId}/noun-imagery | generateArtifactNounImagery | artifact:publish | yes | request:TableReadNounImageryRequest<br>response:TableReadNounImageryQueued |
POST /api/v1/artifacts/{artifactId}/performance | updateArtifactPerformance | artifact:publish | yes | request:PerformanceDirectiveRequest<br>response:PerformanceDirectiveResponse |
GET /api/v1/artifacts/{artifactId}/publish-state | getArtifactPublishState | artifact:read | no | response:ArtifactPublishState |
POST /api/v1/artifacts/{artifactId}/publish-state | setArtifactPublishState | artifact:publish | no | request:ArtifactPublishStateRequest<br>response:ArtifactPublishStateResult |
POST /api/v1/artifacts/{artifactId}/refine | refineArtifact | artifact:publish | yes | request:RefineArtifactRequest<br>response:RefineArtifactEnvelope |
GET /api/v1/artifacts/{artifactId}/render-video | getArtifactRenderStatus | artifact:read | no | response:ArtifactRenderStatus |
POST /api/v1/artifacts/{artifactId}/render-video | renderArtifactVideo | artifact:publish | yes | response:ArtifactRenderAck |
GET /api/v1/artifacts/{artifactId}/review-items | listLineReviews | artifact:read | no | response:LineReviewList |
POST /api/v1/artifacts/{artifactId}/review-items | flagLineForReview | artifact:publish | no | request:LineReviewFlag<br>response:LineReviewFlagResult |
DELETE /api/v1/artifacts/{artifactId}/review-items/{entryIndex} | unflagLineForReview | artifact:publish | no | |
POST /api/v1/artifacts/{artifactId}/revoice-line | revoiceArtifactLine | artifact:publish | yes | request:RevoiceLineRequest<br>response:RevoiceLineEnvelope |
POST /api/v1/artifacts/{artifactId}/revoice | revoiceArtifactCharacter | artifact:publish | yes | request:RevoiceRequest<br>response:RevoiceEnvelope |
GET /api/v1/artifacts/{artifactId}/script | getArtifactScript | artifact:read | no | response:ArtifactScriptContentEnvelope |
POST /api/v1/artifacts/{artifactId}/script | replaceArtifactScript | artifact:publish | yes | request:ArtifactScriptReplacementRequest<br>response:RefineArtifactEnvelope |
GET /api/v1/artifacts/{artifactId}/sfx | listArtifactSfx | artifact:read | no | response:SfxListResponse |
POST /api/v1/artifacts/{artifactId}/sfx | manageArtifactSfx | artifact:publish | yes | request:SfxManageRequest<br>response:SfxMutationResponse |
GET /api/v1/artifacts/{artifactId}/soundscapes | listArtifactSoundscapes | artifact:read | no | response:TableReadSoundscapesResponse |
POST /api/v1/artifacts/{artifactId}/soundscapes | manageArtifactSoundscapes | artifact:publish | yes | request:TableReadSoundscapeRequest<br>response:TableReadSoundscapeResponse |
POST /api/v1/artifacts/{artifactId}/theater-backdrop-prompts | writeArtifactTheaterBackdropPrompts | artifact:publish | yes | request:TableReadBackdropPromptsRequest<br>response:TableReadBackdropPromptsResponse |
POST /api/v1/artifacts/{artifactId}/theater-canvas | applyTheaterCanvas | artifact:publish | yes | request:TheaterCanvasRequest<br>response:TheaterMotionResult |
POST /api/v1/artifacts/{artifactId}/theater-fx-cues | generateArtifactTheaterFxCues | artifact:publish | yes | request:TableReadFxCuesRequest<br>response:TableReadFxCuesResponse |
POST /api/v1/artifacts/{artifactId}/theater-motion-clip | generateTheaterMotionClip | artifact:publish | yes | request:TheaterMotionClipRequest<br>response:TheaterMotionResult |
POST /api/v1/artifacts/{artifactId}/theater-motion | directTheaterMotionBeat | artifact:publish | yes | request:TheaterMotionBeatRequest<br>response:TheaterMotionResult |
POST /api/v1/artifacts/{artifactId}/theater-scene | updateArtifactTheaterScene | artifact:publish | yes | request:TableReadTheaterSceneRequest<br>response:TableReadTheaterSceneResponse |
GET /api/v1/artifacts/{artifactId}/theater | getArtifactTheater | artifact:read | no | response:TableReadTheaterResponse |
POST /api/v1/artifacts/{artifactId}/theater | updateArtifactTheater | artifact:publish | yes | request:TableReadTheaterUpdateRequest<br>response:TableReadTheaterUpdateResponse |
POST /api/v1/artifacts/{artifactId}/update-recording | updateArtifactRecording | artifact:publish | yes | request:UpdateRecordingRequest<br>response:UpdateRecordingEnvelope |
POST /api/v1/artifacts/{artifactId}/voice-modification | modifyArtifactVoice | artifact:publish | yes | request:VoiceModificationRequest<br>response:VoiceModificationResponse |
POST /api/v1/artifacts/{artifactId}/voice | recastArtifactVoice | artifact:publish | yes | |
POST /api/v1/artifacts/{artifactId}/voice/restore | restoreArtifactVoice | artifact:publish | yes | request:VoiceRestoreRequest<br>response:VoiceRestoreResponse |
GET /api/v1/story-jobs/{jobId}/artifacts | listStoryJobArtifacts | artifact:read | no | response:StoryArtifactListResponse |
Brand
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
POST /api/v1/brand-coverage | analyzeBrandCoverage | story:write | yes | request:BrandCoverageRequest<br>response:BrandCoverageAck |
GET /api/v1/brand-coverage/{reportId} | getBrandCoverage | story:read | no | response:BrandCoverageReport |
POST /api/v1/brand-narrative | generateBrandNarrative | story:write | yes | request:BrandNarrativeRequest<br>response:BrandNarrativeResponse |
GET /api/v1/story-projects/{projectId}/brand-coverage | listBrandCoverage | story:read | no | response:BrandCoverageList |
Credits
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/credits | getCredits | credits:read | no | response:CreditsSummary |
PATCH /api/v1/credits/billing | updateCreditBilling | account:write | no | request:UpdateCreditBillingRequest<br>response:UpdateCreditBillingResult |
GET /api/v1/generation-health | getGenerationHealth | story:read | no | response:GenerationHealthEnvelope |
GET /api/v1/referrals | getReferrals | credits:read | no | response:Referrals |
Discovery
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/agent-guidance | getAgentGuidance | story:read | no | response:AgentGuidance |
GET /api/v1/capabilities | getCapabilities | no | response:Capabilities | |
DELETE /api/v1/device/credential | revokeDeviceCredential | no | ||
POST /api/v1/device/credential | exchangeDeviceCode | no | ||
GET /api/v1/examples | getApiExamples | no |
Integrations
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/integrations | listIntegrations | story:read | no | response:IntegrationCatalog |
DELETE /api/v1/integrations/{integrationId} | disconnectIntegration | story:write | no | response:IntegrationDisconnectResult |
GET /api/v1/integrations/{integrationId}/origins | listIntegrationOrigins | story:read | no | response:IntegrationOrigins |
PUT /api/v1/integrations/{integrationId}/origins | setIntegrationOrigins | story:write | no | request:SetIntegrationOriginsRequest<br>response:IntegrationOrigins |
POST /api/v1/integrations/{integrationId}/sync | syncIntegration | story:write | no | response:IntegrationSyncResult |
POST /api/v1/integrations/providers/{slug}/connect | connectIntegration | story:write | no | request:IntegrationConnectRequest<br>response:IntegrationConnectResult |
DELETE /api/v1/integrations/providers/{slug}/interest | withdrawIntegrationRequest | story:write | no | response:IntegrationInterestResult |
POST /api/v1/integrations/providers/{slug}/interest | requestIntegration | story:write | no | request:IntegrationInterestRequest<br>response:IntegrationInterestResult |
GET /api/v1/integrations/providers/{slug}/walkthrough | getIntegrationWalkthrough | story:read | no | response:IntegrationWalkthrough |
GET /api/v1/organization/members | listOrganizationMembers | story:read | no | response:OrganizationMembers |
POST /api/v1/organization/members | addOrganizationMember | story:write | no | request:AddOrganizationMemberRequest<br>response:OrganizationMemberChange |
DELETE /api/v1/organization/members/{userId} | removeOrganizationMember | story:write | no | response:OrganizationMemberChange |
PATCH /api/v1/organization/members/{userId} | updateOrganizationMember | story:write | no | request:UpdateOrganizationMemberRequest<br>response:OrganizationMemberChange |
PUT /api/v1/season-runs/{runId}/integration-feed | setSeasonIntegrationFeed | story:write | no | request:SeasonIntegrationFeedRequest<br>response:SeasonIntegrationFeedResult |
GET /api/v1/season-runs/{runId}/source-candidates | listSeasonSourceCandidates | story:read | no | response:SeasonSourceCandidates |
POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/accept | acceptSeasonSourceCandidate | story:write | no | response:SourceCandidateReviewResult |
POST /api/v1/season-runs/{runId}/source-candidates/{candidateId}/reject | rejectSeasonSourceCandidate | story:write | no | response:SourceCandidateReviewResult |
POST /api/v1/season-runs/{runId}/source-candidates/bulk-review | bulkReviewSeasonSourceCandidates | story:write | no | request:BulkReviewSourceCandidatesRequest<br>response:BulkReviewSourceCandidatesResult |
GET /api/v1/story-projects/{projectId}/integration-feed | getProjectIntegrationFeeds | story:read | no | response:ProjectIntegrationFeeds |
PUT /api/v1/story-projects/{projectId}/integration-feed | setProjectIntegrationFeed | story:write | no | request:ProjectIntegrationFeedRequest<br>response:ProjectIntegrationFeedResult |
Jobs
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/background-activity | getBackgroundActivity | story:read | no | |
GET /api/v1/screenplay-drafts/{scriptUploadId} | getScreenplayDraft | story:read | no | response:ScreenplayDraftStatus |
POST /api/v1/screenplay-drafts/{scriptUploadId} | startScreenplayDraft | story:write | yes | response:ScreenplayDraftStatus |
GET /api/v1/story-jobs | listStoryJobs | story:read | no | response:StoryJobList |
POST /api/v1/story-jobs | createStoryJob | story:write | yes | request:StoryJobCreate<br>response:StoryJobEnvelope |
GET /api/v1/story-jobs/{jobId} | getStoryJob | story:read | no | response:StoryJobEnvelope |
POST /api/v1/story-jobs/{jobId}/cancel | cancelStoryJob | story:write | yes | response:StoryJobEnvelope |
POST /api/v1/story-jobs/{jobId}/resume | resumeStoryJob | story:write | yes | response:StoryJobResumeResponse |
Library
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/library/audio | listMyLibraryAudio | story:read | no | response:MyLibraryAudio |
POST /api/v1/library/audio | importMyLibraryAudio | story:write | yes | request:MyLibraryAudioImportRequest<br>response:MyLibraryAudioImportResponse |
PATCH /api/v1/library/audio/{assetId} | renameMyLibraryAudio | story:write | no | request:MyLibraryAudioRenameRequest<br>response:MyLibraryAudioRenameResponse |
GET /api/v1/library/cast | listMyLibraryCast | story:read | no | response:MyLibraryCast |
Pitch deck
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
POST /api/v1/conversations/{conversationId}/pitch-deck-plan | planPitchDeck | story:write | yes |
Pitch Deck
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
DELETE /api/v1/pitch-decks/{jobId} | deletePitchDeck | story:write | no | |
PATCH /api/v1/pitch-decks/{jobId} | renamePitchDeck | story:write | no | request:ArtifactRenameRequest<br>response:RenamedVideo |
GET /api/v1/pitch-decks/{jobId}/bell-lane | getPitchDeckBellLane | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/bell-lane | strikePitchDeckBellOnTheBeat | story:write | yes | |
POST /api/v1/pitch-decks/{jobId}/bell-lane/remove | removePitchDeckBellLane | story:write | yes | |
GET /api/v1/pitch-decks/{jobId}/camera | getPitchDeckCamera | story:read | no | response:CameraView |
POST /api/v1/pitch-decks/{jobId}/camera | setPitchDeckCamera | story:write | yes | request:CameraSetRequest<br>response:CameraSetAck |
POST /api/v1/pitch-decks/{jobId}/cancel-render | cancelPitchDeckRender | artifact:publish | yes | response:RenderCancelResult |
GET /api/v1/pitch-decks/{jobId}/chapters | getPitchDeckChapters | story:read | no | response:PitchDeckChapters |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/abandon-take | abandonPitchDeckTake | artifact:publish | yes | request:TakeAbandonRequest<br>response:TakeAbandonResult |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/drop-line | dropPitchDeckChapterLine | story:write | yes | request:PitchDeckDropLineRequest<br>response:PitchDeckDropLineAnswer |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/repair-take | repairPitchDeckTake | artifact:publish | yes | request:TakeRepairRequest<br>response:TakeRepairAnswer |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/select-take | selectPitchDeckTake | story:write | yes | request:PitchDeckSelectTakeRequest<br>response:PitchDeckSelectTakeAck |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/stage-voice-over | stageVoiceOverPitchDeckTake | artifact:publish | yes | request:StageVoiceOverRequest<br>response:StageVoiceOverAnswer |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/take-repair-override | overridePitchDeckTakeRepair | story:write | yes | request:TakeRepairOverrideRequest<br>response:TakeRepairOverrideAck |
POST /api/v1/pitch-decks/{jobId}/chapters/{chapterIndex}/trim-take | trimPitchDeckTake | story:write | yes | request:TakeTrimRequest<br>response:TakeTrimQueued |
POST /api/v1/pitch-decks/{jobId}/chapters/add | addPitchDeckChapter | story:write | yes | request:PitchDeckAddChapterRequest<br>response:PitchDeckAddChapterAck |
POST /api/v1/pitch-decks/{jobId}/chapters/refine | refinePitchDeckChapter | story:write | yes | request:PitchDeckChapterRefineRequest<br>response:PitchDeckChapterRefineAck |
POST /api/v1/pitch-decks/{jobId}/chapters/remove | removePitchDeckChapter | story:write | yes | request:PitchDeckRemoveChapterRequest<br>response:PitchDeckRemoveChapterAck |
POST /api/v1/pitch-decks/{jobId}/chapters/render-clip | renderPitchDeckChapterClip | artifact:publish | yes | request:PitchDeckRenderClipRequest<br>response:PitchDeckRenderClipAnswer |
POST /api/v1/pitch-decks/{jobId}/chapters/reorder | reorderPitchDeckChapters | story:write | yes | request:PitchDeckReorderChaptersRequest<br>response:PitchDeckReorderChaptersAck |
POST /api/v1/pitch-decks/{jobId}/closing-sequence | updatePitchDeckClosingSequence | story:write | yes | request:PitchDeckClosingSequenceUpdateRequest<br>response:PitchDeckClosingSequenceUpdateAck |
POST /api/v1/pitch-decks/{jobId}/duplicate | duplicatePitchDeck | story:write | yes | request:PitchDeckDuplicateRequest<br>response:PitchDeckDuplicate |
POST /api/v1/pitch-decks/{jobId}/finish | finishPitchDeck | artifact:publish | yes | request:PitchDeckFinishRequest<br>response:PitchDeckFinishAnswer |
GET /api/v1/pitch-decks/{jobId}/intent | getPitchDeckIntent | story:read | no | response:VideoIntent |
POST /api/v1/pitch-decks/{jobId}/intent | updatePitchDeckIntent | story:write | yes | request:VideoIntentEditRequest<br>response:VideoIntentEditAck |
POST /api/v1/pitch-decks/{jobId}/interludes | updatePitchDeckInterludes | story:write | yes | request:PitchDeckInterludesUpdateRequest<br>response:PitchDeckInterludesUpdateAck |
GET /api/v1/pitch-decks/{jobId}/look | getPitchDeckLook | story:read | no | response:FinishView |
POST /api/v1/pitch-decks/{jobId}/look | setPitchDeckLook | story:write | yes | request:FinishSetRequest<br>response:FinishSetAck |
POST /api/v1/pitch-decks/{jobId}/more-fixes | allowMorePitchDeckFixes | artifact:publish | yes | request:MoreFixesRequest<br>response:MoreFixesAnswer |
GET /api/v1/pitch-decks/{jobId}/motion-blur | getPitchDeckMotionBlur | story:read | no | response:MotionBlurView |
POST /api/v1/pitch-decks/{jobId}/motion-blur | setPitchDeckMotionBlur | story:write | yes | request:MotionBlurSetRequest<br>response:MotionBlurSetAck |
GET /api/v1/pitch-decks/{jobId}/narrator | getPitchDeckNarrator | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/narrator | setPitchDeckNarrator | story:write | yes | |
POST /api/v1/pitch-decks/{jobId}/pdf | requestPitchDeckPdf | story:write | yes | response:PitchDeckPdf |
POST /api/v1/pitch-decks/{jobId}/plan/approve | approvePitchDeckPlan | story:write | yes | request:PitchDeckPlanApproveRequest<br>response:PitchDeckPlanApproveAnswer |
POST /api/v1/pitch-decks/{jobId}/publish | publishPitchDeck | story:write | yes | response:PitchDeckPublish |
GET /api/v1/pitch-decks/{jobId}/quiet-track | getPitchDeckQuietTrack | story:read | no | response:QuietTrackView |
POST /api/v1/pitch-decks/{jobId}/quiet-track | setPitchDeckQuietTrack | story:write | yes | request:QuietTrackSetRequest<br>response:QuietTrackSetAck |
POST /api/v1/pitch-decks/{jobId}/reassemble | reassemblePitchDeck | story:write | yes | response:RenderReassembleAck |
GET /api/v1/pitch-decks/{jobId}/resolution | getPitchDeckResolution | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/resolution | setPitchDeckResolution | story:write | yes | |
GET /api/v1/pitch-decks/{jobId}/score-to-picture | getPitchDeckScoreToPicture | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/score-to-picture | scorePitchDeckToPicture | artifact:publish | yes | |
POST /api/v1/pitch-decks/{jobId}/score-to-picture/revert | revertPitchDeckScoreToPicture | story:write | yes | |
GET /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline | getPitchDeckAudioTimeline | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/storyboard/audio-timeline | editPitchDeckAudioTimeline | story:write | yes | |
GET /api/v1/pitch-decks/{jobId}/storyboard/audio | getPitchDeckSceneAudio | story:read | no | |
GET /api/v1/pitch-decks/{jobId}/storyboard/coverage | getPitchDeckStoryboardCoverage | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/storyboard/coverage | generatePitchDeckStoryboardCoverage | story:write | yes | |
POST /api/v1/pitch-decks/{jobId}/storyboard/direct-text-motion | directPitchDeckTextMotion | story:write | yes | request:PitchDeckDirectTextMotionRequest<br>response:PitchDeckDirectTextMotionAck |
POST /api/v1/pitch-decks/{jobId}/storyboard/music | scorePitchDeckSceneMusic | story:write | yes | |
POST /api/v1/pitch-decks/{jobId}/storyboard/regenerate-text | regeneratePitchDeckText | artifact:publish | yes | request:PitchDeckChapterIndexRequest<br>response:PitchDeckTextRenderAnswer |
POST /api/v1/pitch-decks/{jobId}/storyboard/sfx | editPitchDeckSceneSfx | story:write | yes | |
GET /api/v1/pitch-decks/{jobId}/storyboard/sound-map | getPitchDeckSoundMap | story:read | no | |
POST /api/v1/pitch-decks/{jobId}/title-sequence | updatePitchDeckTitleSequence | story:write | yes | request:PitchDeckTitleSequenceUpdateRequest<br>response:PitchDeckTitleSequenceUpdateAck |
POST /api/v1/pitch-decks/{jobId}/title-sequence/motion-closes | renderPitchDeckTitleMotionCloses | artifact:publish | yes | request:PitchDeckTitleMotionClosesRequest<br>response:PitchDeckTitleMotionClosesAnswer |
POST /api/v1/pitch-decks/{jobId}/unpublish | unpublishPitchDeck | story:write | yes | response:PitchDeckUnpublish |
GET /api/v1/pitch-decks/{jobId}/versions | listPitchDeckVersions | story:read | no | response:PitchDeckVersions |
GET /api/v1/pitch-decks/{jobId}/versions/{number} | getPitchDeckVersion | story:read | no | response:PitchDeckVersionRead |
POST /api/v1/pitch-decks/{jobId}/versions/{number}/zip | requestPitchDeckVersionZip | story:write | yes | response:VideoVersionZipAck |
GET /api/v1/pitch-decks/{jobId}/video-coverage | getPitchDeckVideoCoverage | story:read | no | response:VideoCoverageEnvelope |
POST /api/v1/pitch-decks/{jobId}/video-coverage | generatePitchDeckVideoCoverage | story:write | yes | request:VideoCoverageGenerateRequest<br>response:VideoCoverageEnvelope |
POST /api/v1/pitch-decks/{jobId}/video-export | exportPitchDeckVideo | story:write | yes | request:VideoExportRequest<br>response:PitchDeckExportAck |
GET /api/v1/pitch-decks/{jobId}/video-model | getPitchDeckVideoModel | story:read | no | response:PitchDeckVideoModelView |
POST /api/v1/pitch-decks/{jobId}/video-model | setPitchDeckVideoModel | story:write | yes | request:PitchDeckVideoModelSetRequest<br>response:PitchDeckVideoModelSetAck |
POST /api/v1/pitch-decks/{jobId}/visual-grammar | updatePitchDeckVisualGrammar | story:write | yes | request:PitchDeckVisualGrammarUpdateRequest<br>response:PitchDeckVisualGrammarUpdateAck |
GET /api/v1/story-projects/{projectId}/pitch-decks | listProjectPitchDecks | story:read | no |
Plans
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/story-plans/{planId} | getStoryPlan | story:read | no | response:StoryPlanEnvelopeResponse |
PATCH /api/v1/story-plans/{planId} | renameStoryPlan | story:write | no | request:ArtifactRenameRequest<br>response:StoryPlanEnvelopeResponse |
GET /api/v1/story-plans/{planId}/advice | getStoryPlanAdvice | story:read | no | response:PlanAdviceResponse |
POST /api/v1/story-plans/{planId}/advice | applyStoryPlanAdvice | story:write | no | request:PlanAdviceApplyRequest<br>response:PlanAdviceApplyResponse |
POST /api/v1/story-plans/{planId}/approve | approveStoryPlan | story:write | yes | request:StoryPlanApprovalRequest<br>response:StoryPlanEnvelopeResponse |
POST /api/v1/story-plans/{planId}/reject | rejectStoryPlan | story:write | yes | response:StoryPlanEnvelopeResponse |
POST /api/v1/story-plans/{planId}/resume | resumeStoryPlan | story:write | yes | response:StoryPlanEnvelopeResponse |
GET /api/v1/story-projects/{projectId}/story-plans | listStoryPlans | story:read | no | response:StoryPlanList |
POST /api/v1/story-projects/{projectId}/story-plans | createStoryPlan | story:write | yes | request:StoryPlanCreate<br>response:StoryPlanEnvelopeResponse |
Projects
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/conversations | listConversations | story:read | no | response:ConversationList |
PATCH /api/v1/conversations/{conversationId}/video-editing-scope | setVideoEditingScope | story:write | no | request:SetVideoEditingScopeRequest<br>response:VideoEditingScopeResult |
GET /api/v1/story-projects | listStoryProjects | story:read | no | response:StoryProjectList |
POST /api/v1/story-projects | createStoryProject | story:write | yes | request:StoryProjectCreate<br>response:StoryProjectEnvelope |
DELETE /api/v1/story-projects/{projectId} | deleteStoryProject | story:write | no | response:ProjectDeletionResult |
GET /api/v1/story-projects/{projectId} | getStoryProject | story:read | no | response:StoryProjectDetailEnvelope |
PATCH /api/v1/story-projects/{projectId} | updateStoryProject | story:write | no | request:StoryProjectPatch<br>response:StoryProjectEnvelope |
GET /api/v1/story-projects/{projectId}/cast-canon | getProjectCastCanon | story:read | no | response:CastCanonEnvelope |
PATCH /api/v1/story-projects/{projectId}/cast-canon | saveProjectCastCanon | story:write | no | request:CastCanonPatch<br>response:CastCanonEnvelope |
POST /api/v1/story-projects/{projectId}/cast-canon/from-persona | castProjectPersona | story:write | yes | request:CastFromPersonaRequest<br>response:CastFromPersonaResponse |
POST /api/v1/story-projects/{projectId}/cast-film | castProjectStoryFilm | artifact:publish | yes | request:CastStoryFilmRequest<br>response:CastStoryFilmEnvelope |
GET /api/v1/story-projects/{projectId}/cast-look | getProjectCastLook | story:read | no | response:CastLookRead |
PATCH /api/v1/story-projects/{projectId}/cast-look | setProjectCastLook | story:write | no | request:CastLookPatch<br>response:CastLookSaved |
POST /api/v1/story-projects/{projectId}/cast-portraits/choose | chooseProjectCastPortrait | story:write | yes | request:CastPortraitChooseRequest<br>response:CastPortraitChooseResponse |
POST /api/v1/story-projects/{projectId}/cast-portraits/design | designProjectCastPortraits | artifact:publish | yes | request:CastPortraitDesignRequest<br>response:CastPortraitDesignEnvelope |
GET /api/v1/story-projects/{projectId}/cast-portraits/designs | listProjectCastPortraitDesigns | story:read | no | response:CastPortraitDesignListResponse |
GET /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage | getProjectCastPortraitCoverage | story:read | no | response:CastingPortraitCoverageResponse |
POST /api/v1/story-projects/{projectId}/cast-portraits/designs/{designId}/coverage | generateProjectCastPortraitCoverage | story:write | yes | request:CastingCoverageGenerateRequest<br>response:CastingPortraitCoverageResponse |
PATCH /api/v1/story-projects/{projectId}/cast-voice | setProjectCastVoice | story:write | no | request:CastVoiceSetRequest<br>response:CastVoiceSetResponse |
POST /api/v1/story-projects/{projectId}/cast-voice/choose | chooseProjectCastVoice | story:write | yes | request:CastVoiceChooseRequest<br>response:CastVoiceChooseResponse |
POST /api/v1/story-projects/{projectId}/cast-voice/design | designProjectCastVoice | artifact:publish | yes | request:CastVoiceDesignRequest<br>response:CastVoiceDesignEnvelope |
GET /api/v1/story-projects/{projectId}/cast-voice/designs | listProjectCastVoiceDesigns | story:read | no | response:CastVoiceDesignListResponse |
GET /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage | getProjectCastVoiceCoverage | story:read | no | response:CastingCoverageResponse |
POST /api/v1/story-projects/{projectId}/cast-voice/designs/{designId}/coverage | generateProjectCastVoiceCoverage | story:write | yes | request:CastingCoverageGenerateRequest<br>response:CastingCoverageResponse |
GET /api/v1/story-projects/{projectId}/cast | getProjectCast | story:read | no | response:ProjectCastReadEnvelope |
PATCH /api/v1/story-projects/{projectId}/cast | updateEpisodeCharacterDirection | story:write | no | request:EpisodeCharacterDirectionRequest<br>response:EpisodeCharacterDirectionResult |
POST /api/v1/story-projects/{projectId}/cast | generateProjectCast | artifact:publish | yes | request:GenerateProjectCastRequest<br>response:ProjectCastEnvelope |
GET /api/v1/story-projects/{projectId}/character-notes | getProjectCharacterNotes | story:read | no | response:CharacterNotesRead |
PATCH /api/v1/story-projects/{projectId}/character-notes | updateProjectCharacterNotes | story:write | no | request:CharacterNotesPatch<br>response:CharacterNotesSaved |
GET /api/v1/story-projects/{projectId}/claims-ledger | getClaimsLedger | story:read | no | response:ClaimsLedgerResponse |
POST /api/v1/story-projects/{projectId}/claims-ledger/{claimId} | decideClaim | story:write | no | request:DecideClaimBody<br>response:DecideClaimResult |
GET /api/v1/story-projects/{projectId}/deliverables | listVideoDeliverables | story:read | no | response:VideoDeliverableList |
POST /api/v1/story-projects/{projectId}/deliverables | createVideoDeliverable | story:write | no | request:VideoDeliverableCreateRequest<br>response:VideoDeliverableEnvelope |
GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId} | getVideoDeliverable | story:read | no | response:VideoDeliverableEnvelope |
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/export | exportDeliverableSubmission | story:read | no | request:VideoDeliverableExportRequest<br>response:VideoDeliverableExportResult |
GET /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/packet | getSubmissionPacket | story:read | no | response:VideoDeliverableExportResult |
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/scout | saveDeliverableScout | story:write | no | |
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script | writeDeliverableScript | story:write | no | request:VideoDeliverableScriptImportRequest<br>response:VideoDeliverableScriptImportResult |
PATCH /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/script/cases/{caseId} | updateDeliverableScriptCase | story:write | no | request:VideoDeliverableScriptCaseEditRequest<br>response:VideoDeliverableScriptCaseEditResult |
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants | deriveDeliverableVariant | story:write | no | request:VideoDeliverableVariantRequest<br>response:VideoDeliverableVariantEnvelope |
POST /api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check | checkDeliverableVariant | story:write | no | request:VideoDeliverableCheckRequest<br>response:VideoDeliverableCheckResult |
GET /api/v1/story-projects/{projectId}/episodes | listProjectEpisodes | story:read | no | response:ProjectEpisodesResponse |
POST /api/v1/story-projects/{projectId}/episodes | startPlannedEpisode | story:write | yes | request:StartPlannedEpisodeRequest<br>response:StartPlannedEpisodeResponse |
GET /api/v1/story-projects/{projectId}/members | listProjectMembers | story:read | no | response:ProjectMembers |
POST /api/v1/story-projects/{projectId}/members | addProjectMember | story:write | no | request:AddProjectMemberRequest<br>response:ProjectMemberChange |
DELETE /api/v1/story-projects/{projectId}/members/{userId} | removeProjectMember | story:write | no | response:ProjectMemberChange |
PATCH /api/v1/story-projects/{projectId}/members/{userId} | updateProjectMember | story:write | no | request:UpdateProjectMemberRequest<br>response:ProjectMemberChange |
POST /api/v1/story-projects/{projectId}/merge | mergeStoryProject | story:write | yes | request:MergeProjectRequest<br>response:ProjectMergeResult |
GET /api/v1/story-projects/{projectId}/mood-board | getProjectMoodBoard | story:read | no | response:MoodBoardEnvelope |
POST /api/v1/story-projects/{projectId}/mood-board/frames | keepProjectMoodBoardFrame | story:write | yes | request:MoodBoardFrameKeepRequest<br>response:MoodBoardEnvelope |
DELETE /api/v1/story-projects/{projectId}/mood-board/frames/{frameId} | dropProjectMoodBoardFrame | story:write | no | response:MoodBoardEnvelope |
POST /api/v1/story-projects/{projectId}/mood-board/render-frames | renderProjectMoodBoardFrames | artifact:publish | yes | request:MoodBoardRenderRequest<br>response:MoodBoardRenderEnvelope |
GET /api/v1/story-projects/{projectId}/outline-map | getProjectOutlineMap | story:read | no | response:OutlineMapEnvelope |
PATCH /api/v1/story-projects/{projectId}/outline-map | saveProjectEpisodeOutline | story:write | no | request:SaveEpisodeOutlineRequest<br>response:OutlineMapEnvelope |
GET /api/v1/story-projects/{projectId}/outline-map/coverage | getProjectOutlineCoverage | story:read | no | response:OutlineCoverageEnvelope |
POST /api/v1/story-projects/{projectId}/outline-map/coverage | generateProjectOutlineCoverage | story:write | yes | request:OutlineCoverageGenerateRequest<br>response:OutlineCoverageEnvelope |
POST /api/v1/story-projects/{projectId}/restore | restoreStoryProject | story:write | yes | response:ProjectRestoreResult |
GET /api/v1/story-projects/{projectId}/seasons | listProjectSeasons | story:read | no | response:ProjectArc |
POST /api/v1/story-projects/{projectId}/seasons | createProjectSeason | story:write | yes | request:ProjectSeasonCreateRequest<br>response:ProjectSeasonCreateResponse |
GET /api/v1/story-projects/{projectId}/series-bible | getProjectSeriesBible | story:read | no | response:SeriesBibleEnvelope |
PATCH /api/v1/story-projects/{projectId}/series-bible | saveProjectSeriesBible | story:write | no | request:SeriesBiblePatch<br>response:SeriesBibleSaveResult |
POST /api/v1/story-projects/{projectId}/series-bible | generateProjectSeriesBible | story:write | yes | request:SeriesBibleGenerateRequest<br>response:SeriesBibleGenerationStarted |
GET /api/v1/story-projects/{projectId}/series-bible/characters | getSeriesBibleCharacter | story:read | no | response:SeriesBibleCharacterResult |
PATCH /api/v1/story-projects/{projectId}/series-bible/characters | updateSeriesBibleCharacter | story:write | no | request:SeriesBibleCharacterUpdateRequest<br>response:SeriesBibleCharacterResult |
GET /api/v1/story-projects/{projectId}/series-bible/coverage | getProjectSeriesBibleCoverage | story:read | no | response:SeriesBibleCoverageEnvelope |
POST /api/v1/story-projects/{projectId}/series-bible/coverage | generateProjectSeriesBibleCoverage | story:write | yes | request:SeriesBibleCoverageGenerateRequest<br>response:SeriesBibleCoverageEnvelope |
POST /api/v1/story-projects/{projectId}/series-bible/coverage/acknowledge | acknowledgeProjectSeriesBibleCoverage | story:write | no | request:SeriesBibleCoverageAcknowledgeRequest<br>response:SeriesBibleCoverageAcknowledgeResult |
GET /api/v1/story-projects/{projectId}/sounds | listProjectSounds | story:read | no | |
GET /api/v1/story-projects/deleted | listDeletedStoryProjects | story:read | no | response:DeletedStoryProjectList |
POST /api/v1/story-projects/from-script | createStoryProjectFromScript | story:write | yes | request:StoryProjectFromScript<br>response:StoryProjectFromScriptEnvelope |
Publishing
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/publishing-feeds/{seriesSlug}.xml | getPublishingRssFeed | no | ||
GET /api/v1/publishing-provider-configs | listPublishingProviderConfigs | publishing:connect | no | response:PublishingProviderConfigList |
POST /api/v1/publishing-provider-configs | upsertPublishingProviderConfig | publishing:connect | yes | request:PublishingProviderConfigUpsertRequest<br>response:PublishingProviderConfigEnvelope |
GET /api/v1/publishing-releases/{releaseId} | getPublishingRelease | publishing:read | no | response:PublishingReleaseEnvelope |
PATCH /api/v1/publishing-releases/{releaseId} | updatePublishingRelease | publishing:write | no | request:PublishingReleaseUpdateRequest<br>response:PublishingReleaseEnvelope |
POST /api/v1/publishing-releases/{releaseId}/cancel | cancelPublishingRelease | publishing:publish | yes | response:PublishingReleaseEnvelope |
POST /api/v1/publishing-releases/{releaseId}/description/generate | generatePublishingReleaseDescription | publishing:write | yes | response:PublishingReleaseEnvelope |
POST /api/v1/publishing-releases/{releaseId}/publish | publishPublishingRelease | publishing:publish | yes | response:PublishingReleaseEnvelope |
POST /api/v1/publishing-releases/{releaseId}/refresh-media | refreshPublishedReleaseMedia | publishing:publish | yes | request:PublishingReleaseRefreshMediaRequest<br>response:PublishingReleaseEnvelope |
POST /api/v1/publishing-releases/{releaseId}/schedule | schedulePublishingRelease | publishing:publish | yes | response:PublishingReleaseEnvelope |
GET /api/v1/publishing-releases/{releaseId}/targets | listPublishingReleaseTargets | publishing:read | no | response:PublishingTargetList |
POST /api/v1/publishing-releases/{releaseId}/unpublish | unpublishPublishingRelease | publishing:publish | yes | response:PublishingReleaseEnvelope |
GET /api/v1/publishing-series/{seriesId} | getPublishingSeries | publishing:read | no | response:PublishingSeriesEnvelope |
PATCH /api/v1/publishing-series/{seriesId} | updatePublishingSeries | publishing:write | no | request:PublishingSeriesUpdateRequest<br>response:PublishingSeriesEnvelope |
GET /api/v1/publishing-series/{seriesId}/analytics | listPublishingAnalyticsSnapshots | publishing:analytics | no | response:PublishingAnalyticsList |
GET /api/v1/publishing-series/{seriesId}/destinations | listPublishingDestinations | publishing:read | no | response:PublishingDestinationList |
POST /api/v1/publishing-series/{seriesId}/destinations | upsertPublishingDestination | publishing:connect | yes | request:PublishingDestinationUpsertRequest<br>response:PublishingDestinationEnvelope |
POST /api/v1/publishing-series/{seriesId}/generate-cover-art | generatePublishingSeriesCoverArt | publishing:write | no | request:PublishingCoverArtGenerateRequest<br>response:PublishingCoverArtGenerateResponse |
GET /api/v1/publishing-series/{seriesId}/ready-recordings | listPublishingReadyRecordings | publishing:read | no | response:PublishingReadyRecordingList |
DELETE /api/v1/publishing-series/{seriesId}/ready-recordings/{sourceArtifactId} | removePublishingReadyRecording | publishing:write | no | |
GET /api/v1/publishing-series/{seriesId}/releases | listPublishingReleases | publishing:read | no | response:PublishingReleaseList |
POST /api/v1/publishing-series/{seriesId}/releases | createPublishingRelease | publishing:write | yes | request:PublishingReleaseCreateRequest<br>response:PublishingReleaseEnvelope |
GET /api/v1/publishing/tiktok/connect | getPublishingTikTokConnectLink | publishing:connect | no | response:PublishingConnectLink |
GET /api/v1/publishing/youtube/connect | getPublishingYouTubeConnectLink | publishing:connect | no | response:PublishingConnectLink |
GET /api/v1/story-projects/{projectId}/publishing-series | listPublishingSeries | publishing:read | no | response:PublishingSeriesList |
POST /api/v1/story-projects/{projectId}/publishing-series | createPublishingSeries | publishing:write | yes | request:PublishingSeriesCreateRequest<br>response:PublishingSeriesEnvelope |
Scripts
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
POST /api/v1/scripts | uploadScript | story:write | yes | request:ScriptUploadRequest |
DELETE /api/v1/scripts/{scriptUploadId} | deleteScript | story:write | no | |
GET /api/v1/scripts/{scriptUploadId} | getScript | story:read | no | response:WriterScriptEnvelope |
PATCH /api/v1/scripts/{scriptUploadId} | updateScript | story:write | no | request:ScriptMetadataPatch<br>response:WriterScriptEnvelope |
PATCH /api/v1/scripts/{scriptUploadId}/content | writeScriptContent | story:write | no | request:ScriptContentWriteRequest<br>response:ScriptContentWriteResponse |
GET /api/v1/scripts/{scriptUploadId}/coverage/acknowledge | getScreenplayCoverageGate | artifact:read | no | response:ScreenplayCoverageGateResponse |
POST /api/v1/scripts/{scriptUploadId}/coverage/acknowledge | acknowledgeScreenplayCoverage | story:write | no | request:ScreenplayCoverageAcknowledgeRequest<br>response:ScreenplayCoverageAcknowledgeResult |
GET /api/v1/scripts/{scriptUploadId}/export | exportScript | story:read | no | response:ScriptExportResponse |
POST /api/v1/scripts/{scriptUploadId}/finish | finishDraft | story:write | yes | request:FinishDraftRequest<br>response:FinishDraftResponse |
GET /api/v1/scripts/{scriptUploadId}/lines/{entryIndex} | getScriptLineTuning | story:read | no | response:ScriptLineTuning |
PATCH /api/v1/scripts/{scriptUploadId}/lines/{entryIndex} | updateScriptLine | story:write | no | request:ScriptLineEdit<br>response:ScriptLineTuning |
GET /api/v1/scripts/{scriptUploadId}/overrides | getScriptOverrides | story:read | no | response:ScriptOverrides |
PATCH /api/v1/scripts/{scriptUploadId}/overrides | updateScriptOverrides | story:write | no | request:ScriptOverridesPatch<br>response:ScriptOverrides |
GET /api/v1/scripts/{scriptUploadId}/share | getScriptShare | story:read | no | response:ScriptShareState |
POST /api/v1/scripts/{scriptUploadId}/share | createScriptShare | artifact:publish | no | request:CreateScriptShareRequest<br>response:CreateScriptShareResult |
POST /api/v1/scripts/{scriptUploadId}/table-read/characters/remove | removeScriptTableReadCharacter | story:write | no | request:RemoveCharacterRequest<br>response:RemoveCharacterResult |
POST /api/v1/scripts/{scriptUploadId}/table-read/characters/rewrite-directions | rewriteScriptTableReadCharacterDirections | story:write | no | request:RewriteActingDirectionsRequest<br>response:RewriteActingDirectionsResult |
POST /api/v1/scripts/{scriptUploadId}/table-read/prepare | prepareScriptTableRead | artifact:publish | yes | request:PrepareTableReadRequest<br>response:TableReadPrepareEnvelope |
POST /api/v1/scripts/{scriptUploadId}/table-read/retry-analysis | retryScriptTableReadAnalysis | story:write | no | response:RetryCreativeAnalysisResult |
POST /api/v1/scripts/{scriptUploadId}/versions | uploadScriptVersion | story:write | yes | request:ScriptVersionUploadRequest |
DELETE /api/v1/scripts/{scriptUploadId}/versions/{versionId} | deleteScriptVersion | story:write | no | response:ScriptVersionDeleteResponse |
Seasons
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
DELETE /api/v1/season-runs/{runId} | deleteStorySeasonRun | story:write | no | response:SeasonRunDeleteResult |
GET /api/v1/season-runs/{runId} | getStorySeasonRun | story:read | no | response:SeasonRunEnvelope |
POST /api/v1/season-runs/{runId}/advance | advanceStorySeasonRun | story:write, artifact:publish, publishing:write | yes | request:SeasonRunAdvanceRequest<br>response:SeasonRunEnvelope |
POST /api/v1/season-runs/{runId}/approve | approveStorySeasonMap | story:write | yes | request:SeasonRunApprovalRequest<br>response:SeasonRunEnvelope |
POST /api/v1/season-runs/{runId}/end | endStorySeasonRun | story:write | yes | request:SeasonRunEndRequest<br>response:SeasonRunEndEnvelope |
PATCH /api/v1/season-runs/{runId}/episodes/{episodeId} | updateStorySeasonEpisode | story:write | no | request:SeasonRunEpisodeUpdateRequest<br>response:SeasonRunEnvelope |
GET /api/v1/story-projects/{projectId}/season-runs | listStorySeasonRuns | story:read | no | response:SeasonRunList |
POST /api/v1/story-projects/{projectId}/season-runs | createStorySeasonRun | story:write, publishing:write | yes | request:SeasonRunCreateRequest<br>response:SeasonRunEnvelope |
Shows
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/publishing-series/{seriesId}/show | getShow | publishing:read | no | response:ShowRead |
PATCH /api/v1/publishing-series/{seriesId}/show | setUpShow | publishing:write | no | request:ShowSetupUpdateRequest<br>response:ShowRead |
POST /api/v1/publishing-series/{seriesId}/show/check-sources | checkShowSources | publishing:write | no | request:ShowCheckSourcesRequest<br>response:ShowCheckSourcesResponse |
POST /api/v1/publishing-series/{seriesId}/show/domain | setShowDomain | publishing:write | no | request:ShowDomainRequest<br>response:ShowRead |
POST /api/v1/publishing-series/{seriesId}/show/episodes | makeShowEpisode | publishing:write | yes | request:MakeShowEpisodeRequest<br>response:MakeShowEpisodeResponse |
GET /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId} | getShowEpisode | publishing:read | no | response:ShowEpisode |
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/drop | dropShowEpisode | publishing:write | no | request:ShowConfirmRequest<br>response:ShowEpisodeAction |
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/fix-line | fixShowEpisodeLine | publishing:write | yes | request:FixShowEpisodeLineRequest<br>response:FixShowEpisodeLineResponse |
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/publish | publishShowEpisode | publishing:write | no | request:ShowConfirmRequest<br>response:ShowEpisodeAction |
POST /api/v1/publishing-series/{seriesId}/show/episodes/{episodeId}/refinish | refinishShowEpisode | publishing:write | yes | request:ShowConfirmRequest<br>response:RefinishShowEpisodeResponse |
GET /api/v1/publishing-series/{seriesId}/show/runs | listShowRuns | publishing:read | no | response:ShowRuns |
POST /api/v1/publishing-series/{seriesId}/show/state | setShowState | publishing:write | no | request:ShowStateRequest<br>response:ShowRead |
GET /api/v1/show-source-suggestions | suggestShowSources | publishing:read | no | response:ShowSourceSuggestions |
Sources
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/story-projects/{projectId}/app-connections | listAppConnections | source:read | no | response:AppConnectionList |
POST /api/v1/story-projects/{projectId}/app-connections | createAppConnection | app:connect | yes | request:AppConnectionCreate<br>response:AppConnectionEnvelope |
DELETE /api/v1/story-projects/{projectId}/app-connections/{connectionId} | deleteAppConnection | app:connect | no | response:AppConnectionDeleted |
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId} | getAppConnection | source:read | no | response:AppConnectionDetail |
PATCH /api/v1/story-projects/{projectId}/app-connections/{connectionId} | updateAppConnection | app:connect | no | request:AppConnectionUpdate<br>response:AppConnectionEnvelope |
PUT /api/v1/story-projects/{projectId}/app-connections/{connectionId}/secrets/{kind} | saveAppConnectionSecret | app:connect | no | request:AppConnectionSecretValue<br>response:AppConnectionEnvelope |
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login | getAppConnectionTestLogin | source:read | no | response:AppConnectionTestLogin |
POST /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login | testAppConnectionLogin | app:connect | no | request:TestAppConnectionLoginRequest<br>response:AppConnectionTestLogin |
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview | getAppConnectionTestPreview | source:read | no | response:AppConnectionTestPreviewResponse |
GET /api/v1/story-projects/{projectId}/app-connections/{connectionId}/test-login/{testId}/preview/frame | getAppConnectionTestPreviewFrame | source:read | no | |
GET /api/v1/story-projects/{projectId}/captures | listAppCaptures | source:read | no | response:AppCaptureList |
POST /api/v1/story-projects/{projectId}/captures | createAppCapture | source:write | yes | request:AppCaptureCreate<br>response:AppCaptureCreateResult |
DELETE /api/v1/story-projects/{projectId}/captures/{captureId} | deleteAppCapture | source:write | no | response:AppCaptureDeleted |
GET /api/v1/story-projects/{projectId}/captures/{captureId} | getAppCapture | source:read | no | response:AppCaptureEnvelope |
PATCH /api/v1/story-projects/{projectId}/captures/{captureId} | setAppCaptureFeature | source:write | no | request:AppCaptureSetFeature<br>response:AppCaptureEnvelope |
POST /api/v1/story-projects/{projectId}/captures/{captureId}/finalize | finalizeAppCapture | source:write | no | response:AppCaptureEnvelope |
POST /api/v1/story-projects/{projectId}/captures/match-features | matchAppCaptureFeatures | source:write | no | request:AppCaptureMatchFeatures<br>response:AppCaptureFeatureMatchList |
GET /api/v1/story-projects/{projectId}/feature-inventory | getFeatureInventory | source:read | no | response:FeatureInventoryResponse |
POST /api/v1/story-projects/{projectId}/feature-inventory | learnFromSite | source:write | no | request:LearnFromSiteBody<br>response:FeatureInventoryLearnStarted |
GET /api/v1/story-projects/{projectId}/sources | listStorySources | source:read | no | response:StorySourceList |
POST /api/v1/story-projects/{projectId}/sources | createStorySource | source:write | yes | request:StorySourceCreate<br>response:StorySourceCreateResult |
DELETE /api/v1/story-projects/{projectId}/sources/{sourceId} | deleteStorySource | source:write | no | response:DeletionAck |
GET /api/v1/story-projects/{projectId}/sources/{sourceId} | getStorySource | source:read | no | response:StorySourceEnvelope |
GET /api/v1/story-projects/{projectId}/tours | listTours | source:read | no | response:TourList |
POST /api/v1/story-projects/{projectId}/tours | createTour | source:write | yes | request:TourCreate<br>response:TourEnvelope |
DELETE /api/v1/story-projects/{projectId}/tours/{tourId} | deleteTour | source:write | no | response:TourDeleted |
GET /api/v1/story-projects/{projectId}/tours/{tourId} | getTour | source:read | no | response:TourEnvelope |
PATCH /api/v1/story-projects/{projectId}/tours/{tourId} | updateTour | source:write | no | request:TourUpdate<br>response:TourEnvelope |
POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings | quoteTourRecording | source:write | no | |
DELETE /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId} | cancelTourRecording | source:write | no | |
GET /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId} | getTourRecording | source:read | no | |
POST /api/v1/story-projects/{projectId}/tours/{tourId}/recordings/{jobId} | confirmTourRecording | source:write | no | |
POST /api/v1/story-projects/{projectId}/tours/check | checkTour | source:read | no | request:TourCheckRequest |
POST /api/v1/story-projects/{projectId}/tours/draft-missing | startMissingTourDrafts | source:write | no | request:StartMissingTourDraftsBody |
GET /api/v1/story-projects/{projectId}/tours/drafts | listTourDrafts | source:read | no | response:TourDraftsResponse |
POST /api/v1/story-projects/{projectId}/tours/drafts | startTourDraft | source:write | no | request:StartTourDraftBody<br>response:TourDraftStarted |
GET /api/v1/story-projects/{projectId}/tours/drafts/{runId} | getTourDraft | source:read | no | response:TourDraftResponse |
POST /api/v1/story-projects/{projectId}/tours/record-missing | quoteMissingTourRecordings | source:write | no | response:MissingTourRecordingsQuote |
POST /api/v1/story-projects/{projectId}/tours/record-missing/cancel | cancelMissingTourRecordings | source:write | no | request:CancelMissingTourRecordingsBody<br>response:MissingTourRecordingsCancelled |
POST /api/v1/story-projects/{projectId}/tours/record-missing/confirm | confirmMissingTourRecordings | source:write | no | request:ConfirmMissingTourRecordingsBody<br>response:MissingTourRecordingsBooked |
GET /api/v1/video-destinations | listVideoDestinations | source:read | no | response:VideoDestinationList |
GET /api/v1/video-destinations/{key} | getVideoDestination | source:read | no | response:VideoDestinationEnvelope |
Story Films
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/story-projects/{projectId}/story-films | listProductStories | story:read | no | response:ProductStoriesListResponse |
POST /api/v1/story-projects/{projectId}/story-films | pitchProductStories | story:write | yes | request:PitchProductStoriesRequest<br>response:ProductStoryPitchQueued |
GET /api/v1/story-projects/{projectId}/story-films/{storyId} | getProductStory | story:read | no | response:ProductStoryFilm |
GET /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor | getStoryFilmBeatAnchor | story:read | no | response:StoryFilmBeatAnchor |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/anchor | setStoryFilmBeatAnchor | story:write | no | request:SetStoryFilmBeatAnchorRequest<br>response:StoryFilmBeatAnchor |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/sound | setStoryFilmBeatSound | story:write | no | request:SetStoryFilmBeatSoundRequest<br>response:StoryFilmBeatSound |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/voice | setStoryFilmBeatVoice | story:write | no | request:SetStoryFilmBeatVoiceRequest<br>response:StoryFilmBeatVoice |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/beats/{beatId}/world | setStoryFilmWorldBeat | story:write | no | request:SetStoryFilmWorldBeatRequest<br>response:StoryFilmWorldBeats |
GET /api/v1/story-projects/{projectId}/story-films/{storyId}/brief | getProductFilmBrief | story:read | no | response:ProductFilmBriefResponse |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/brief | setProductFilmBrief | story:write | no | request:SetProductFilmBriefRequest<br>response:ProductFilmBriefResponse |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/moments/{momentId}/recording | setStoryFilmMomentRecording | story:write | no | request:SetStoryFilmMomentRecordingRequest<br>response:StoryFilmScript |
PUT /api/v1/story-projects/{projectId}/story-films/{storyId}/screen-view | setStoryFilmScreenView | story:write | no | request:SetStoryFilmScreenViewRequest<br>response:StoryFilmScreenView |
POST /api/v1/story-projects/{projectId}/story-films/{storyId}/script | writeStoryFilm | story:write | yes | request:WriteStoryFilmRequest<br>response:StoryFilmScript |
Strategy
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/strategy/action-items | listStrategyActionItems | story:read | no | response:StrategyActionItemList |
DELETE /api/v1/strategy/action-items/{actionItemId} | deleteStrategyActionItem | story:write | no | response:StrategyActionItemDeleted |
PATCH /api/v1/strategy/action-items/{actionItemId} | updateStrategyActionItem | story:write | no | request:UpdateStrategyActionItemRequest<br>response:StrategyActionItemEnvelope |
POST /api/v1/strategy/action-items/{actionItemId}/complete | completeStrategyActionItem | story:write | no | request:CompleteStrategyActionItemRequest<br>response:StrategyActionItemEnvelope |
GET /api/v1/strategy/contacts | listStrategyContacts | story:read | no | response:StrategyContactList |
POST /api/v1/strategy/contacts | createStrategyContact | story:write | yes | request:CreateStrategyContactRequest<br>response:StrategyContactEnvelope |
PATCH /api/v1/strategy/contacts/{contactId} | updateStrategyContact | story:write | no | request:UpdateStrategyContactRequest<br>response:StrategyContactEnvelope |
GET /api/v1/strategy/opportunities | listOpportunities | story:read | no | response:OpportunityList |
DELETE /api/v1/strategy/opportunities/{opportunityId} | deleteOpportunity | story:write | no | response:OpportunityDeleted |
POST /api/v1/strategy/opportunities/{opportunityId}/archive | archiveOpportunity | story:write | no | response:OpportunityEnvelope |
POST /api/v1/strategy/opportunities/{opportunityId}/promote | promoteOpportunity | story:write | no | request:PromoteOpportunityRequest<br>response:PromoteOpportunityResult |
POST /api/v1/strategy/opportunities/{opportunityId}/save-to-research | saveOpportunityToResearch | story:write | yes | request:SaveOpportunityToResearchRequest<br>response:SaveOpportunityToResearchResult |
GET /api/v1/strategy/pursuits | listPursuits | story:read | no | response:PursuitList |
POST /api/v1/strategy/pursuits | createPursuit | story:write | yes | request:CreatePursuitRequest<br>response:PursuitEnvelope |
PATCH /api/v1/strategy/pursuits/{pursuitId} | updatePursuit | story:write | no | request:UpdatePursuitRequest<br>response:PursuitEnvelope |
POST /api/v1/strategy/pursuits/{pursuitId}/action-items | addStrategyActionItem | story:write | yes | request:AddStrategyActionItemRequest<br>response:StrategyActionItemEnvelope |
GET /api/v1/strategy/watches | listOpportunityWatches | story:read | no | response:OpportunityWatchList |
POST /api/v1/strategy/watches | createOpportunityWatch | story:write | yes | request:CreateOpportunityWatchRequest<br>response:OpportunityWatchEnvelope |
DELETE /api/v1/strategy/watches/{watchId} | deleteOpportunityWatch | story:write | no | response:OpportunityWatchDeleted |
PATCH /api/v1/strategy/watches/{watchId} | updateOpportunityWatch | story:write | no | request:UpdateOpportunityWatchRequest<br>response:OpportunityWatchEnvelope |
POST /api/v1/strategy/watches/{watchId}/run | runOpportunityWatchNow | story:write | no | response:RunOpportunityWatchResult |
Table Read
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/table-read/performance-booth | getPerformanceBoothStatus | story:read | no | |
POST /api/v1/table-read/performance-booth | startPerformanceBoothSession | story:write | yes |
trailer
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
POST /api/v1/conversations/{conversationId}/trailer-plan | planTrailer | story:write | yes |
Trailer
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/story-projects/{projectId}/product-video-plans | listProductVideoPlans | story:read | no | response:ProductVideoPlanList |
POST /api/v1/story-projects/{projectId}/product-video-plans | planProductVideo | story:write | yes | request:PlanProductVideoRequest<br>response:ProductVideoPlanEnvelope |
GET /api/v1/story-projects/{projectId}/product-video-plans/{runId} | getProductVideoPlan | story:read | no | |
POST /api/v1/story-projects/{projectId}/references | findReferences | story:read | no | response:FindReferencesResponse |
GET /api/v1/story-projects/{projectId}/trailers | listProjectTrailers | story:read | no | |
POST /api/v1/story-projects/{projectId}/trailers | createCaptureOnlyTrailer | story:write | yes | request:CaptureOnlyTrailerRequest<br>response:CaptureOnlyTrailer |
DELETE /api/v1/trailers/{jobId} | deleteTrailer | story:write | no | |
PATCH /api/v1/trailers/{jobId} | renameTrailer | story:write | no | request:ArtifactRenameRequest<br>response:RenamedVideo |
GET /api/v1/trailers/{jobId}/aspect | getTrailerAspect | story:read | no | |
POST /api/v1/trailers/{jobId}/aspect | setTrailerAspect | story:write | yes | |
POST /api/v1/trailers/{jobId}/audio-policy | setTrailerAudioPolicy | story:write | yes | |
GET /api/v1/trailers/{jobId}/beats | getTrailerBeats | story:read | no | response:TrailerBeats |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/abandon-take | abandonTrailerTake | artifact:publish | yes | request:TakeAbandonRequest<br>response:TakeAbandonResult |
GET /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look | getTrailerBeatCaptureLook | story:read | no | response:TrailerBeatCaptureLookView |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look | setTrailerBeatCaptureLook | story:write | yes | request:TrailerBeatCaptureLookSetRequest<br>response:TrailerBeatCaptureLookSetAck |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/capture-look/preview | previewTrailerBeatCaptureLook | story:read | no | request:TrailerBeatCaptureLookPreviewRequest<br>response:TrailerBeatCaptureLookPreview |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/drop-line | dropTrailerBeatLine | story:write | yes | request:TrailerDropLineRequest<br>response:TrailerDropLineAnswer |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/repair-take | repairTrailerTake | artifact:publish | yes | request:TakeRepairRequest<br>response:TakeRepairAnswer |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/select-take | selectTrailerTake | story:write | yes | request:TrailerSelectTakeRequest<br>response:TrailerSelectTakeAck |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/stage-voice-over | stageVoiceOverTrailerTake | artifact:publish | yes | request:StageVoiceOverRequest<br>response:StageVoiceOverAnswer |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/take-repair-override | overrideTrailerTakeRepair | story:write | yes | request:TakeRepairOverrideRequest<br>response:TakeRepairOverrideAck |
GET /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview | getTrailerBeatTextPreview | story:read | no | response:TrailerTextPreview |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/text-preview/render | renderTrailerBeatTextPreview | story:read | yes | response:TrailerTextPreviewRender |
POST /api/v1/trailers/{jobId}/beats/{beatIndex}/trim-take | trimTrailerTake | story:write | yes | request:TakeTrimRequest<br>response:TakeTrimQueued |
POST /api/v1/trailers/{jobId}/beats/refine | refineTrailerBeat | story:write | yes | request:TrailerBeatRefineRequest<br>response:TrailerBeatPreview |
POST /api/v1/trailers/{jobId}/beats/render-clip | renderTrailerBeatClip | artifact:publish | yes | request:TrailerRenderClipRequest<br>response:TrailerRenderClipAnswer |
GET /api/v1/trailers/{jobId}/camera | getTrailerCamera | story:read | no | response:CameraView |
POST /api/v1/trailers/{jobId}/camera | setTrailerCamera | story:write | yes | request:CameraSetRequest<br>response:CameraSetAck |
POST /api/v1/trailers/{jobId}/cancel-render | cancelTrailerRender | artifact:publish | yes | response:RenderCancelResult |
GET /api/v1/trailers/{jobId}/capture-depth | getTrailerCaptureDepth | story:read | no | response:TrailerCaptureDepthView |
POST /api/v1/trailers/{jobId}/capture-depth | setTrailerCaptureDepth | story:write | yes | request:TrailerCaptureDepthSetRequest<br>response:TrailerCaptureDepthSetAck |
POST /api/v1/trailers/{jobId}/closing-sequence | updateTrailerClosingSequence | story:write | yes | request:TrailerClosingSequenceUpdateRequest<br>response:TrailerClosingSequenceUpdateAck |
POST /api/v1/trailers/{jobId}/duplicate | duplicateTrailer | story:write | yes | request:TrailerDuplicateRequest<br>response:TrailerDuplicate |
POST /api/v1/trailers/{jobId}/finish | finishTrailer | artifact:publish | yes | request:TrailerFinishRequest<br>response:TrailerFinishAnswer |
GET /api/v1/trailers/{jobId}/intent | getTrailerIntent | story:read | no | response:VideoIntent |
POST /api/v1/trailers/{jobId}/intent | updateTrailerIntent | story:write | yes | request:VideoIntentEditRequest<br>response:VideoIntentEditAck |
POST /api/v1/trailers/{jobId}/interludes | updateTrailerInterludes | story:write | yes | request:TrailerInterludesUpdateRequest<br>response:TrailerInterludesUpdateAck |
GET /api/v1/trailers/{jobId}/look | getTrailerLook | story:read | no | response:FinishView |
POST /api/v1/trailers/{jobId}/look | setTrailerLook | story:write | yes | request:FinishSetRequest<br>response:FinishSetAck |
POST /api/v1/trailers/{jobId}/more-fixes | allowMoreTrailerFixes | artifact:publish | yes | request:MoreFixesRequest<br>response:MoreFixesAnswer |
GET /api/v1/trailers/{jobId}/motion-blur | getTrailerMotionBlur | story:read | no | response:MotionBlurView |
POST /api/v1/trailers/{jobId}/motion-blur | setTrailerMotionBlur | story:write | yes | request:MotionBlurSetRequest<br>response:MotionBlurSetAck |
GET /api/v1/trailers/{jobId}/narrator | getTrailerNarrator | story:read | no | |
POST /api/v1/trailers/{jobId}/narrator | setTrailerNarrator | story:write | yes | |
POST /api/v1/trailers/{jobId}/plan/approve | approveTrailerPlan | story:write | yes | request:TrailerPlanApproveRequest<br>response:TrailerPlanApproveAnswer |
GET /api/v1/trailers/{jobId}/product-plan-coverage | getProductVideoPlanCoverage | story:read | no | response:ProductVideoPlanCoverageEnvelope |
POST /api/v1/trailers/{jobId}/publish | publishTrailer | story:write | yes | request:TrailerShareConfirmBody<br>response:TrailerPublish |
GET /api/v1/trailers/{jobId}/quiet-track | getTrailerQuietTrack | story:read | no | response:QuietTrackView |
POST /api/v1/trailers/{jobId}/quiet-track | setTrailerQuietTrack | story:write | yes | request:QuietTrackSetRequest<br>response:QuietTrackSetAck |
POST /api/v1/trailers/{jobId}/reassemble | reassembleTrailer | story:write | yes | response:RenderReassembleAck |
POST /api/v1/trailers/{jobId}/reference-check | checkTrailerReference | story:write | yes | response:CheckTrailerReferenceResponse |
DELETE /api/v1/trailers/{jobId}/reference | clearTrailerReference | story:write | no | response:TrailerReferenceResponse |
GET /api/v1/trailers/{jobId}/reference | getTrailerReference | story:read | no | response:TrailerReferenceResponse |
PUT /api/v1/trailers/{jobId}/reference | chooseTrailerReference | story:write | no | response:TrailerReferenceResponse |
GET /api/v1/trailers/{jobId}/render-states | getTrailerRenderStates | story:read | no | response:TrailerBeatRenderStates |
POST /api/v1/trailers/{jobId}/rerender-depth | rerenderTrailerCaptureDepth | story:write | yes | response:RerenderTrailerCaptureDepthAck |
GET /api/v1/trailers/{jobId}/resolution | getTrailerResolution | story:read | no | |
POST /api/v1/trailers/{jobId}/resolution | setTrailerResolution | story:write | yes | |
GET /api/v1/trailers/{jobId}/score-to-picture | getTrailerScoreToPicture | story:read | no | |
POST /api/v1/trailers/{jobId}/score-to-picture | scoreTrailerToPicture | artifact:publish | yes | |
POST /api/v1/trailers/{jobId}/score-to-picture/revert | revertTrailerScoreToPicture | story:write | yes | |
GET /api/v1/trailers/{jobId}/share | getTrailerShare | story:read | no | response:TrailerShareState |
POST /api/v1/trailers/{jobId}/storyboard/add-beat | addTrailerBeat | story:write | yes | request:TrailerAddBeatRequest<br>response:TrailerBeatOrderAck |
GET /api/v1/trailers/{jobId}/storyboard/audio-timeline | getTrailerAudioTimeline | story:read | no | |
POST /api/v1/trailers/{jobId}/storyboard/audio-timeline | editTrailerAudioTimeline | story:write | yes | |
GET /api/v1/trailers/{jobId}/storyboard/audio | getTrailerSceneAudio | story:read | no | |
GET /api/v1/trailers/{jobId}/storyboard/coverage | getTrailerStoryboardCoverage | story:read | no | |
POST /api/v1/trailers/{jobId}/storyboard/coverage | generateTrailerStoryboardCoverage | story:write | yes | |
POST /api/v1/trailers/{jobId}/storyboard/direct-text-motion | directTrailerTextMotion | story:write | yes | request:TrailerDirectTextMotionRequest<br>response:TrailerDirectTextMotionAck |
POST /api/v1/trailers/{jobId}/storyboard/move-beat | moveTrailerBeat | story:write | yes | request:TrailerMoveBeatRequest<br>response:TrailerBeatOrderAck |
POST /api/v1/trailers/{jobId}/storyboard/music | scoreTrailerSceneMusic | story:write | yes | |
POST /api/v1/trailers/{jobId}/storyboard/remove-beat | removeTrailerBeat | story:write | yes | request:TrailerRemoveBeatRequest<br>response:TrailerBeatOrderAck |
POST /api/v1/trailers/{jobId}/storyboard/restore-take | restoreTrailerTake | story:write | yes | request:TrailerRestoreTakeRequest<br>response:TrailerRestoreTakeAck |
POST /api/v1/trailers/{jobId}/storyboard/sfx | editTrailerSceneSfx | story:write | yes | |
GET /api/v1/trailers/{jobId}/storyboard/sound-map | getTrailerSoundMap | story:read | no | |
GET /api/v1/trailers/{jobId}/storyboard/sound-pass | getTrailerSoundPass | story:read | no | |
POST /api/v1/trailers/{jobId}/storyboard/sound-pass | layTrailerSoundPass | story:write | yes | |
GET /api/v1/trailers/{jobId}/storyboard/takes | getTrailerBeatTakes | story:read | no | response:TrailerBeatTakes |
POST /api/v1/trailers/{jobId}/unpublish | unpublishTrailer | story:write | yes | request:TrailerShareConfirmBody<br>response:TrailerUnpublish |
GET /api/v1/trailers/{jobId}/versions | listTrailerVersions | story:read | no | response:TrailerVersions |
GET /api/v1/trailers/{jobId}/versions/{number} | getTrailerVersion | story:read | no | response:TrailerVersionRead |
POST /api/v1/trailers/{jobId}/versions/{number}/zip | requestTrailerVersionZip | story:write | yes | response:VideoVersionZipAck |
GET /api/v1/trailers/{jobId}/video-coverage | getTrailerVideoCoverage | story:read | no | response:VideoCoverageEnvelope |
POST /api/v1/trailers/{jobId}/video-coverage | generateTrailerVideoCoverage | story:write | yes | request:VideoCoverageGenerateRequest<br>response:VideoCoverageEnvelope |
POST /api/v1/trailers/{jobId}/video-export | exportTrailerVideo | story:write | yes | request:VideoExportRequest<br>response:TrailerExportAck |
GET /api/v1/trailers/{jobId}/watch-check | checkTrailerWatchPage | story:read | no | response:TrailerWatchCheck |
Voices
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
GET /api/v1/likeness-consents | listLikenessConsents | story:read | no | response:LikenessConsentList |
POST /api/v1/likeness-consents/{consentId}/revoke | revokeLikenessConsent | story:write | yes | response:StudioLikenessConsent |
POST /api/v1/likeness-consents/links | createLikenessConsentLink | story:write | yes | response:LikenessConsentLinkResponse |
GET /api/v1/voice-migrations | listVoiceMigrations | story:read | no | response:VoiceMigrationListResponse |
POST /api/v1/voice-migrations | migrateVoice | story:write | yes | request:VoiceMigrationRequest<br>response:VoiceMigrationEnvelope |
POST /api/v1/voice-migrations/{migrationId}/undo | undoVoiceMigration | story:write | yes | response:VoiceMigrationUndoResponse |
GET /api/v1/voices | listStudioVoices | story:read | no | response:StudioVoiceListResponse |
DELETE /api/v1/voices/{voiceId} | deleteStudioVoice | story:write | no | response:StudioVoiceDeleteResponse |
PATCH /api/v1/voices/{voiceId} | renameStudioVoice | story:write | no | request:StudioVoiceRenameRequest<br>response:StudioVoiceRenameResponse |
POST /api/v1/voices/{voiceId}/consent-link | createVoiceConsentLink | story:write | yes | response:VoiceConsentLinkResponse |
POST /api/v1/voices/{voiceId}/revoke-consent | revokeVoiceConsent | story:write | yes | response:VoiceConsentRevokeResponse |
POST /api/v1/voices/clone-link | createVoiceCloneLink | story:write | yes | response:VoiceCloneLinkResponse |
POST /api/v1/voices/preview | previewStudioVoice | story:write | yes | request:VoicePreviewRequest<br>response:VoicePreviewResponse |
GET /api/v1/voices/pro/{jobId} | getProVoiceClone | story:read | no | response:ProVoiceCloneStatus |
GET /api/v1/voices/pro/script | getProVoiceCloneScript | story:read | no | response:ProVoiceCloneScript |
POST /api/v1/voices/pro/start | startProVoiceClone | story:write | yes | request:ProVoiceCloneStartRequest<br>response:ProVoiceCloneStartResult |
POST /api/v1/voices/pro/train | startProVoiceCloneTraining | story:write | yes | request:ProVoiceCloneTrainRequest<br>response:ProVoiceCloneTrainResult |
DELETE /api/v1/voices/retired | removeRetiredVoices | story:write | no | response:RetiredVoicesRemovalResponse |
Example recipes
| Recipe | Status | Scopes | Steps |
|---|---|---|---|
| Discover supported features before integrating<br><small>discover-capabilities</small> | available | story:read | GET /capabilities |
| Check Studio Credit balance before generating<br><small>check-credits</small> | available | credits:read | GET /credits |
| Recover from auth, rate limit, and idempotency errors<br><small>handle-errors</small> | available | credits:read | GET /credits |
| Create a project and attach an inline text source<br><small>create-project-and-attach-text-source</small> | available | story:write<br>source:write | POST /story-projects<br>POST /story-projects/{projectId}/sources |
| Read, save, or generate a project Series Bible<br><small>project-series-bible</small> | available | story:read<br>story:write | POST /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> | available | story:write<br>story:read | POST /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> | available | source:write<br>source:read | POST /story-projects/{projectId}/sources |
| Ingest a URL source (async, polled)<br><small>ingest-url-source</small> | available | source:write<br>source:read | POST /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> | available | artifact:publish<br>story:read<br>artifact:read | POST /artifacts/{artifactId}/refine<br>GET /story-jobs/{jobId} |
| Apply a voice effect to a range of lines<br><small>modify-voice-range</small> | available | artifact:publish | POST /artifacts/{artifactId}/voice-modification |
| Render a trailer, choose its takes, and finish it<br><small>render-and-finish-a-trailer</small> | available | story:read<br>story:write<br>artifact:publish | POST /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> | available | story:read<br>story:write<br>artifact:publish | POST /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> | available | artifact:publish<br>artifact:read | POST /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> | available | artifact:publish | POST /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> | available | publishing:write<br>publishing:publish<br>publishing:read | POST /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> | planned | story:write | POST /story-jobs |
| Generate a table read from an approved plan, then read the share URLs<br><small>generate-table-read</small> | available | story:write<br>story:read<br>artifact:read | POST /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.
| Code | Meaning |
|---|---|
authentication_required | No bearer API key was supplied in the Authorization header. |
invalid_api_key | The API key is malformed, unknown, or does not match the stored secret. |
api_key_revoked | The API key has been revoked by an account owner. |
api_key_expired | The API key has passed its configured expiration timestamp. |
account_disabled | The account that owns this API key has been disabled. |
ip_not_allowed | The request originated from an IP that is not in the key allowlist. |
insufficient_scope | The 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_limited | The per-key + per-IP rate limit for this route family was exceeded. |
idempotency_key_required | The endpoint requires an Idempotency-Key header for safe retries. |
idempotency_conflict | A request with the supplied Idempotency-Key is already processing or used incompatible parameters. |
validation_failed | The request payload failed validation. The error message names the offending field. |
project_not_found | The story project does not exist, was deleted, or is another account's and not shared with this one. |
source_not_found | The story source does not exist, was deleted, or is owned by another account. |
source_type_unsupported | The requested source type is not yet supported by this API phase. Check /api/v1/capabilities. |
source_too_large | The source payload exceeds the documented size limit. See details.maxBytes. |
source_incomplete | A source declared as full context failed its producer-specific completeness proof and was rejected before generation. |
source_fetch_failed | A URL or PDF source could not be safely fetched (SSRF block, redirect limit, size limit, content-type mismatch, or upstream error). |
capture_not_found | The app capture does not exist in this project, was deleted, or is owned by another account. |
capture_not_uploaded | Finalize 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_found | No 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_found | The app connection (a stored app login) does not exist in this project, was deleted, or is owned by another account. |
app_connection_limit_reached | The project already holds the most app connections (details.limit). Delete one you no longer use, then connect again. Nothing was created. |
app_connection_sealing_unavailable | This server has no key to seal a secret with, so nothing was saved. Reads of connections still work. Try again later. |
app_connection_test_limited | Too 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_changed | This 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_found | No switched-on video destination has this key. List them with GET /video-destinations. |
video_destination_unavailable | The 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_found | The destination video deliverable does not exist in this project, was deleted, or is owned by another account. |
deliverable_script_version_conflict | The 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_required | Only 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_enabled | Switching 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_role | Product 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_required | Connected 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_found | No 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_elsewhere | That account already belongs to another organization; a person belongs to one, and leaves that one first. Nothing was changed. |
organization_forbidden | Only the owner and admins change the team, never above their own role, and the owner's place never changes. Nothing was changed. |
integration_not_found | No such connected product or connection in this account's organization, or it was disconnected. List them with GET /integrations. |
integration_forbidden | The 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_unavailable | The 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_only | The 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_only | Only 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_only | Only a product project can be shared for now. Nothing was changed. |
project_member_not_found | No 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_allowed | The 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_found | No live demo session has that id: it was revoked, it ended, or it was never a minted demo session. |
demo_session_credential_refused | A 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_allowed | Unlimited 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_found | The story plan does not exist, was deleted, or is owned by another account. |
story_plan_state_invalid | The story plan is in a state that does not allow the requested operation. See details.status and details.allowed. |
story_plan_failed | StoryPlan generation or refinement failed. See details for the underlying reason when available. |
season_run_not_found | The season run does not exist, was deleted, or is owned by another account. |
season_run_state_invalid | The season run or episode is not at the required lifecycle state. Reload it and follow nextAction before retrying. |
story_job_not_found | The story job does not exist, was deleted, or is owned by another account. |
story_job_state_invalid | The 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_found | The story artifact does not exist or is owned by another account. |
artifact_not_ready | The 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_failed | The artifact adapter failed to produce a shareable output. The job and artifact rows stay inspectable; see the artifact failureCode / failureMessage. |
publishing_series_not_found | The publishing series does not exist, was deleted, or is owned by another account. |
publishing_destination_not_found | The publishing destination does not exist, was deleted, or is owned by another account. |
publishing_release_not_found | The publishing release does not exist, was deleted, or is owned by another account. |
publishing_release_state_invalid | The publishing release is in a state that does not allow the requested operation. See details.status and details.allowed. |
publishing_asset_not_ready | The release does not have a finalized, ready asset for the requested publish operation. |
publishing_asset_stale | The source artifact changed after the release asset was promoted. Finalize the current source before publishing. |
project_precondition_failed | The 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_unresolved | The 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_credits | The 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_error | The Sleeper Hit Story API failed unexpectedly. Retrying with the same Idempotency-Key is safe. |
trailer_not_found | No trailer with that id, or it belongs to another account. |
trailer_state_invalid | The 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_found | No pitch deck with that id, or it belongs to another account. |
pitch_deck_state_invalid | The 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_found | The 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_found | The 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_resumable | The job exists but has no resumable checkpoint — it either finished or failed past the point a resume can start from. |
script_not_found | No screenplay with that id, or it belongs to another account. |
cast_precondition_failed | A 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_prepared | The 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_failed | The 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_found | No voice clone with that id, or it belongs to another account. |
mood_board_full | The mood board already holds the maximum number of frames that can bind a render. Drop one before keeping another. |
fal_account_locked | The upstream generation provider has locked the studio account, usually for billing. Nothing was charged. |
location_plate_not_found | The 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_failed | The 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_found | No 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_found | No 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_use | The 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_failed | The 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_use | The 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_use | The 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_invalid | The 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_reached | Your 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_reached | This 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_failed | The 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_failed | The 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_retired | A 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_required | A 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_revoked | The 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_mismatch | confirmEmail is not this account's email address, so no deletion was scheduled. Ask the account owner for the address on the account. |
account_deletion_refused | This 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_restorable | The 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_refused | The 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_refused | The 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_hold | Publishing 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_unavailable | The 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_required | The 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_owned | A 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_found | No likeness approval with that id belongs to this account. List them with GET /likeness-consents. |
character_not_found | Nobody 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_found | No 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_conflict | The 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_reached | A 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_reached | A 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_invalid | An 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_locked | A 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_conflict | Changing 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_story | The 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_product | Product-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_outside | The 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_aired | This 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_queued | The 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_found | The show has no episode with that id. List its runs (GET /publishing-series/{seriesId}/show/runs) for the ids it has. |
show_not_ready | The 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_found | The 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_key | A 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_found | No endpoint at that path. This is a routing problem, not an authentication or method one — check the path against the API reference. |
method_not_allowed | The path exists but does not accept that HTTP method. The Allow response header lists the methods it does accept. |
tour_not_found | No 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_conflict | The 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_reached | The 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_found | No 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_found | No 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_captures | The 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_ready | The 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_unavailable | References 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_found | refs 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_chosen | The 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_master | The 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_reached | The 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_found | No 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_unavailable | Strategy, 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_runnable | The 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. |