This page is generated from the live contract code used by the app, Story API, CLI, and MCP server. Do not hand-edit operation lists in documentation; update the contract sources below 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
Coverage
- Operations: 333
- OpenAPI operations: 331
- Example recipes: 17
- Complete UI/API/CLI/MCP operations: 333 / 333
| Surface | Bound operations |
|---|---|
| UI | 333 / 333 |
| API | 333 / 333 |
| CLI | 333 / 333 |
| MCP | 333 / 333 |
Surface gaps
No surface gaps.
Development flow warnings
Complete the Series Bible before screenplay pages
- Stage:
before_screenplay_generation - Blocking: no
- Surfaces:
ui,api,cli,mcp - Guidance: Before planning or generating a screenplay-backed table_read artifact, read, save, or generate the project Series Bible and confirm the format, audience, season arc, episode map, character roster, canon/world rules, visual style, audio style, and open questions are usable. The planner and screenplay adapter auto-load the saved Series Bible as project canon; if the user proceeds anyway, carry the missing areas into the StoryPlan review instead of silently ignoring them.
Finish the project stage a refusal names — do not retry it
- Stage:
before_planning_or_generation - Blocking: yes
- Surfaces:
ui,api,cli,mcp - Guidance: Planning, drafting episodes, casting, keeping or rendering mood board frames, writing the episode map, and generating project media are refused until the project reaches the stage each one needs. The refusal is a 409
project_precondition_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, unless the project is audio-only (Series Bible productionMedium "audio"), a headshot, body shot and character sheet; a narrated read also needs a narrator voice. A job that adopts a finalized screenplay (scriptUploadId) needs that screenplay's episode cast complete. The refusal is a 409
cast_precondition_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.
Complete the Series Bible Mood board before rendering
- Stage:
before_storyboard_rendering - Blocking: yes
- Surfaces:
ui,api,cli,mcp - Guidance: Image and video rendering are locked until the Series Bible has explicit production medium, visual style, character design, visual truths, production design, color palette, lighting rules, camera language, and location truths. Read document.readiness.moodBoard on the shared Series Bible response and resolve every missing field before rendering.
Run one coverage round after the screenplay exists
- Stage:
after_screenplay_exists - Blocking: no
- Surfaces:
ui,api,cli,mcp - Guidance: Once a screenplay-backed table_read artifact exists, read or poll the first coverage report before treating the script as ready for finalization, pitch packaging, or later installment generation. Table-read jobs queue the initial coverage pass when pages are created; request a new report only if none exists or the user wants another pass. Use the report, especially top fixes, to drive one revision pass. This is guidance, not an enforcement gate.
Operations by workflow
account
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Cancel the account's deletion<br><small>account.deletion.cancel</small> | 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> | 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> | 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> | 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> | 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 |
artifacts
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Animate a character's portrait<br><small>artifacts.avatarVideo</small> | 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 table-read cast<br><small>artifacts.cast</small> | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | GET /api/v1/artifacts/{artifactId}<br>artifact:read | sleeperhit cast <artifactId> | get_cast |
| Read a Black List analysis<br><small>artifacts.coverage.blacklist</small> | 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> | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/artifacts/{artifactId}/coverage<br>story:write | sleeperhit coverage generate <artifactId> | generate_coverage |
| Read script coverage<br><small>artifacts.coverage.get</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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] [--emotions a,b] | refine_performance |
| Read a render's publishable state<br><small>artifacts.publishState.get</small> | 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> | 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> | 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> | 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> | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/voice<br>artifact:publish | sleeperhit voice set <artifactId> --character <c> --voice-id <id> --voice-name <name> [--no-canon] | recast_voice |
| Refine a table read<br><small>artifacts.refine</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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] | replace_artifact_script |
| Read script content by scene<br><small>artifacts.script.scene</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | Writers Lab table-read studio<br>/dashboard/writing-lab/:projectId/:scriptId/table-read | POST /api/v1/artifacts/{artifactId}/voice-modification<br>artifact:publish | sleeperhit modify-voice <artifactId> --start <n> --end <n> | modify_voice |
brand
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Analyze brand storytelling coverage<br><small>brand.coverage.analyze</small> | Writers Lab coverage panel<br>/dashboard/writing-lab/:projectId/:scriptId/coverage | POST /api/v1/brand-coverage<br>story:write | sleeperhit brand-coverage generate <content|-> [--type <text>] [--audience <text>] [--industry <text>] [--channel <text>] [--voice <text>] | analyze_brand_coverage |
| Read brand coverage report<br><small>brand.coverage.get</small> | 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 |
| Generate brand storytelling<br><small>brand.narrative.generate</small> | 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 |
casting
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Prepare an episode's table read<br><small>scripts.tableRead.prepare</small> | Writers Lab cast<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> | Writers Lab cast<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 |
credits
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read Studio Credit balance<br><small>credits.read</small> | Dashboard credit meter<br>/dashboard | GET /api/v1/credits<br>credits:read | sleeperhit credits | get_credits |
discovery
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read agent guidance<br><small>agent-guidance</small> | Developer console and docs<br>/dashboard/api | GET /api/v1/agent-guidance<br>story:read | sleeperhit guidance | get_agent_guidance |
| Discover live capabilities<br><small>capabilities</small> | Developer console and docs<br>/dashboard/api | GET /api/v1/capabilities<br>story:read | sleeperhit capabilities | sleeperhit://capabilities |
episode_overrides
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read an episode's overrides<br><small>scripts.overrides.get</small> | 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> | Writers Lab episode overrides<br>/dashboard/writing-lab/:projectId/:scriptId/cast | PATCH /api/v1/scripts/{scriptUploadId}/overrides<br>story:write | sleeperhit script overrides set <scriptUploadId> [--avatar <text>] [--theater <text>] [--soundscape <text>] [--pitch-deck <text>] [--locations <text>] [--clear <override>] | update_script_overrides |
health
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Check generation health<br><small>generation.health</small> | Dashboard background activity<br>/dashboard | GET /api/v1/generation-health<br>story:read | sleeperhit generation-health | get_generation_health |
jobs
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read background activity<br><small>activity.get</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Import reusable audio<br><small>library.audio.import</small> | 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> | My Library<br>/dashboard/library | GET /api/v1/library/audio<br>story:read | sleeperhit library audio list [--kind music|sfx|soundscape] [--query <text>] [--limit N] [--cursor C] | list_my_library_audio |
| Rename a reusable audio asset<br><small>library.audio.rename</small> | 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 images<br><small>library.images.list</small> | My Library<br>/dashboard/library | GET /api/v1/library/images<br>story:read | sleeperhit library images [--limit N] [--cursor C] | list_my_library_images |
likeness
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Mint a likeness approval link<br><small>likeness.link</small> | 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> | 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> | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read the pitch-deck audio timeline<br><small>pitch-deck.audioTimeline.get</small> | 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> | 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|remove-sfx> [flags] (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>') | generate_pitch_deck_timeline_music |
| Read per-scene music and sound effects<br><small>pitch-deck.sceneAudio.get</small> | 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> | 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 |
| Place sound effects on one scene<br><small>pitch-deck.sceneSfx.mutate</small> | 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 |
| Read the pitch-deck sound map<br><small>pitch-deck.soundMap.get</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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 |
| Cut a pitch deck chapter's line out, keep the rest of its footage<br><small>pitchDeck.chapters.dropLine</small> | 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> | 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 |
| Insert a blank pitch deck chapter<br><small>pitchDeck.chapters.insert</small> | Writers Lab videos pitch-deck review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/pitch-decks/{jobId}/chapters/insert<br>story:write | sleeperhit pitch-deck add-chapter <jobId> [--at <position> | --after <chapterIndex>] | add_pitch_deck_chapter |
| Override the repair decision on one pitch deck take<br><small>pitchDeck.chapters.overrideTakeRepair</small> | 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> | 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> | 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> | 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> | 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> | 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 |
| Select a take of one pitch deck call<br><small>pitchDeck.chapters.selectTake</small> | 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> | 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> | 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> | 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] | --clear | update_pitch_deck_closing_sequence |
| Delete a pitch deck<br><small>pitchDeck.delete</small> | 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> | delete_pitch_deck |
| Duplicate a pitch deck from its plan<br><small>pitchDeck.duplicate</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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 |
| Approve the pitch deck plan into the render<br><small>pitchDeck.plan.approve</small> | 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>"] | approve_pitch_deck_plan |
| Publish a pitch deck<br><small>pitchDeck.publish</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | export_pitch_deck_video |
| Cover the pitch deck video again<br><small>pitchDeck.videoCoverage.generate</small> | 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> | 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> | 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> | 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> | 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 |
plans
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Approve a StoryPlan<br><small>plans.approve</small> | Writers Lab project page plans<br>/dashboard/writing-lab/:projectId | 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> | 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> | Writers Lab project page plans<br>/dashboard/writing-lab/:projectId | GET /api/v1/story-plans/{planId}<br>story:read | sleeperhit plans get <planId> | get_plan |
| List StoryPlans<br><small>plans.list</small> | Writers Lab project page plans<br>/dashboard/writing-lab/:projectId | 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> | Writers Lab project page plans<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-plans/{planId}/reject<br>story:write | sleeperhit plans reject <planId> | reject_plan |
| Rename a plan<br><small>plans.rename</small> | Writers Lab plans waiting for you<br>/dashboard/writing-lab/:projectId | PATCH /api/v1/story-plans/{planId}<br>story:write | sleeperhit plans rename <planId> <title> | rename_plan |
| Resume a StoryPlan<br><small>plans.resume</small> | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read a project cast canon<br><small>projects.cast-canon.get</small> | Writers Lab project canon<br>/dashboard/writing-lab | 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> | Writers Lab project canon<br>/dashboard/writing-lab | PATCH /api/v1/story-projects/{projectId}/cast-canon<br>story:write | sleeperhit cast-canon save <projectId> --json '<object>' | --file <json> [--replace] | save_cast_canon |
| Read cast look directions<br><small>projects.cast-look.get</small> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab cast<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> | Writers Lab cast<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> | Writers Lab cast<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 |
| Create a story project<br><small>projects.create</small> | Writers Lab project library<br>/dashboard/writing-lab | POST /api/v1/story-projects<br>story:write | sleeperhit projects create --name <name> | create_project |
| Create a project around a script<br><small>projects.createFromScript</small> | 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> | 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> | 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> | Writers Lab Seasons & episodes<br>/dashboard/writing-lab/:projectId | 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> | Writers Lab episode map<br>/dashboard/writing-lab/:projectId | 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> | 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> | Writers Lab project library<br>/dashboard/writing-lab | GET /api/v1/story-projects<br>story:read | sleeperhit projects list | list_projects |
| Drop a frame from the mood board<br><small>projects.mood-board.dropFrame</small> | 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> | 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> | 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> | 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> | Project Overview outline coverage<br>/dashboard/writing-lab/:projectId/tools | 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> | Project Overview outline coverage<br>/dashboard/writing-lab/:projectId/tools | 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> | Writers Lab Outline tab<br>/dashboard/writing-lab/:projectId/:scriptId/tools/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> | Writers Lab Outline tab<br>/dashboard/writing-lab/:projectId/:scriptId/tools/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> | 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> | Writers Lab Seasons & episodes<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/seasons<br>story:write | sleeperhit projects seasons add <projectId> [--name <text>] | create_project_season |
| Read one Series Bible character<br><small>projects.series-bible.character.get</small> | 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> | 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 |
| Generate Series Bible coverage<br><small>projects.series-bible.coverage.generate</small> | 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] | generate_series_bible_coverage |
| Read Series Bible coverage<br><small>projects.series-bible.coverage.get</small> | 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] | get_series_bible_coverage |
| Generate a project Series Bible<br><small>projects.series-bible.generate</small> | 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> | 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> | 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> | 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> | 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] | update_project |
publishing
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| List publishing analytics<br><small>publishing.analytics.list</small> | Writers Lab publishing listening numbers<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/publishing-releases/{releaseId}/publish<br>publishing:publish | sleeperhit publishing releases publish <releaseId> --confirm | publish_publishing_release |
| Refresh published release media<br><small>publishing.releases.refresh_media</small> | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/:scriptId/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 |
| Schedule a publishing release<br><small>publishing.releases.schedule</small> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing episode editor<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/story-projects/{projectId}/publishing-series<br>publishing:write | sleeperhit publishing series create <projectId> [--title <title>] | create_publishing_series |
| List a show's episodes<br><small>publishing.series.episodes</small> | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/publishing-series/{seriesId}/episodes<br>publishing:read | sleeperhit publishing series episodes <seriesId> | list_show_episodes |
| Generate podcast cover art<br><small>publishing.series.generateCoverArt</small> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/publishing-series/{seriesId}/generate-cover-art<br>publishing:write | sleeperhit publishing series generate-cover-art <seriesId> [--title <title>] [--description <text>] [--podcast-category <text>] [--podcast-subcategory <text>] | generate_publishing_cover_art |
| Read a publishing series<br><small>publishing.series.get</small> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/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> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/story-projects/{projectId}/publishing-series<br>publishing:read | sleeperhit publishing series list <projectId> | list_publishing_series |
| Preview a show's sources<br><small>publishing.series.previewSources</small> | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/publishing-series/{seriesId}/source-preview<br>publishing:read | sleeperhit publishing series preview-sources <seriesId> [--sources <json>] [--lookback-days <n>] | preview_show_sources |
| Make a show episode now (a preview until live)<br><small>publishing.series.produceEpisode</small> | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/publishing-series/{seriesId}/episodes<br>publishing:write | sleeperhit publishing series produce <seriesId> [--prompt <text>] [--episode-type <key>] [--live] [--confirm] | produce_show_episode |
| Quote a recurring show<br><small>publishing.series.quote</small> | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/publishing-series/{seriesId}/quote<br>publishing:read | sleeperhit publishing series quote <seriesId> | get_show_quote |
| Update a publishing series<br><small>publishing.series.update</small> | Writers Lab publishing<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | PATCH /api/v1/publishing-series/{seriesId}<br>publishing:write | sleeperhit publishing series update <seriesId> [--title <title>] [--status <status>] [--standing-approval-key <keyId|self|null>] [--episode-credit-cap <n>] [--monthly-credit-cap <n>] [--publish-policy auto|hold] [--confirm] | update_publishing_series |
| List interesting recurring sources<br><small>publishing.showSourceTemplates.list</small> | Writers Lab publishing — Show<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/show-source-templates<br>publishing:read | sleeperhit publishing series templates | list_show_source_templates |
| Advance a coverage-gated season episode<br><small>seasons.advance</small> | Writers Lab publishing season runner<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/season-runs/{runId}/advance<br>story:write, artifact:publish, publishing:write | sleeperhit seasons 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>seasons.approve</small> | Writers Lab publishing season runner<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | POST /api/v1/season-runs/{runId}/approve<br>story:write | sleeperhit seasons approve <runId> --expected-map-version <n> --confirm | approve_season_map |
| Create a conversational season run<br><small>seasons.create</small> | Writers Lab Seasons & episodes<br>/dashboard/writing-lab/:projectId | POST /api/v1/story-projects/{projectId}/season-runs<br>story:write, publishing:write | sleeperhit seasons create <projectId> | create_season_run |
| Map one season episode<br><small>seasons.episodes.map</small> | Writers Lab publishing season runner<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | PATCH /api/v1/season-runs/{runId}/episodes/{episodeId}<br>story:write | sleeperhit seasons map <runId> <episodeId> --expected-map-version <n> --patch <json> [--confirm] | map_season_episode |
| Read a season run<br><small>seasons.get</small> | Writers Lab publishing season runner<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/season-runs/{runId}<br>story:read | sleeperhit seasons get <runId> | get_season_run |
| List season runs<br><small>seasons.list</small> | Writers Lab publishing season runner<br>/dashboard/writing-lab/:projectId/:scriptId/publishing | GET /api/v1/story-projects/{projectId}/season-runs<br>story:read | sleeperhit seasons list <projectId> | list_season_runs |
scripts
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Write a version's text<br><small>scripts.content.write</small> | 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 |
| Delete a whole script<br><small>scripts.delete</small> | Writers Lab script delete<br>/dashboard/writing-lab/:projectId/:scriptId/overview | 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> | 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> | 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> | 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> | 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> | 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] [--emotions <a,b,c> [--volume N]] | edit_script_line |
| Share a table read<br><small>scripts.share.create</small> | 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> | 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> | Writers Lab script details<br>/dashboard/writing-lab | PATCH /api/v1/scripts/{scriptUploadId}<br>story:write | sleeperhit script update <scriptId> [--title <t>] [--slug <s>] [--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> | Writers Lab upload<br>/dashboard/writing-lab | POST /api/v1/scripts<br>story:write | sleeperhit script upload --title <title> --file <path> [--format text|fountain|fdx] | upload_script |
| Delete one version of a script<br><small>scripts.versions.delete</small> | Writers Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptId/overview | 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> | Writers Lab script versions<br>/dashboard/writing-lab/:projectId/:scriptId/overview | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Attach a source<br><small>sources.create</small> | Writers Lab project workflow<br>/dashboard/writing-lab | 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> | Writers Lab project workflow<br>/dashboard/writing-lab | 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> | Writers Lab project workflow<br>/dashboard/writing-lab | 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> | Writers Lab project workflow<br>/dashboard/writing-lab | GET /api/v1/story-projects/{projectId}/sources<br>source:read | sleeperhit sources list <projectId> | list_sources |
table_read
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Retry a failed creative analysis<br><small>scripts.tableRead.retryAnalysis</small> | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Mint a Performance Booth recording link<br><small>tableRead.performanceBooth.start</small> | 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> | 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
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Read the trailer aspect ratio<br><small>trailer.aspect.get</small> | 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> | 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> | 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> | 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> | 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|remove-sfx> [flags] (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>') | generate_trailer_timeline_music |
| Let one trailer take still out at the provider go<br><small>trailer.beats.abandonTake</small> | 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 |
| Cut a trailer beat's line out, keep the rest of its footage<br><small>trailer.beats.dropLine</small> | 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> | 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 |
| Override the repair decision on one trailer take<br><small>trailer.beats.overrideTakeRepair</small> | 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> | 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>] [--caption <text>] [--composition image|text|both] [--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>] [--montage | --no-montage] | refine_trailer_beat |
| Render one trailer beat again<br><small>trailer.beats.renderClip</small> | 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> | 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 |
| Select a take of one trailer call<br><small>trailer.beats.selectTake</small> | 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> | 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 |
| Trim one take of a trailer call<br><small>trailer.beats.trimTake</small> | 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> | 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> | 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> | 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 |
| Set a trailer's closing sequence<br><small>trailer.closingSequence.update</small> | 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] | --clear | update_trailer_closing_sequence |
| Delete a trailer<br><small>trailer.delete</small> | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | DELETE /api/v1/trailers/{jobId}<br>story:write | sleeperhit trailer delete <jobId> | delete_trailer |
| Duplicate a trailer from its plan<br><small>trailer.duplicate</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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 |
| Approve the trailer plan into the render<br><small>trailer.plan.approve</small> | 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>"] | approve_trailer_plan |
| Read the trailer quiet track<br><small>trailer.quietTrack.get</small> | 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> | 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> | 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> | 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> | 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 |
| Read the trailer delivery class<br><small>trailer.resolution.get</small> | 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> | 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> | 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> | 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 |
| Place sound effects on one beat<br><small>trailer.sceneSfx.mutate</small> | 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 |
| Read the trailer's score to picture<br><small>trailer.scoreToPicture.get</small> | 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> | 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> | 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 the trailer sound map<br><small>trailer.soundMap.get</small> | 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 a trailer beat's earlier cuts<br><small>trailer.storyboard.beatTakes</small> | 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> | 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> | 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> | 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 |
| Insert a blank trailer beat<br><small>trailer.storyboard.insertBeat</small> | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/insert-beat<br>story:write | sleeperhit trailer insert-beat <jobId> [--at <n> | --after <n>] | insert_trailer_beat |
| Move a trailer beat to another position<br><small>trailer.storyboard.moveBeat</small> | 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 |
| Render one trailer text layer<br><small>trailer.storyboard.regenerateText</small> | Writers Lab videos trailer review<br>/dashboard/writing-lab/:projectId/:scriptId/videos | POST /api/v1/trailers/{jobId}/storyboard/regenerate-text<br>artifact:publish | sleeperhit trailer regenerate-text <jobId> --beat <n> [--confirm] | regenerate_trailer_text |
| Remove a trailer beat<br><small>trailer.storyboard.removeBeat</small> | 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> | 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> | 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> | 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> | 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> | 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> | export_trailer_video |
| Cover the trailer video again<br><small>trailer.videoCoverage.generate</small> | 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> | 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 |
voices
| Operation | UI | API | CLI | MCP |
|---|---|---|---|---|
| Mint a voice-clone recording link<br><small>voices.cloneLink</small> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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>] | preview_voice |
| Poll a Pro voice clone<br><small>voices.pro.get</small> | 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> | 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> | 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> | 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 |
| Rename a library voice<br><small>voices.rename</small> | 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> | 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 |
OpenAPI endpoint summary
| Endpoint | Operation ID | Scope | Idempotent | Schemas |
|---|---|---|---|---|
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/agent-guidance | getAgentGuidance | story:read | no | response:AgentGuidance |
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:StoryJobEnvelope |
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/background-activity | getBackgroundActivity | story:read | no | |
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/capabilities | getCapabilities | story:read | no | response:Capabilities |
GET /api/v1/credits | getCredits | credits:read | no | response:CreditsSummary |
DELETE /api/v1/device/credential | revokeDeviceCredential | no | ||
POST /api/v1/device/credential | exchangeDeviceCode | no | ||
GET /api/v1/examples | getApiExamples | no | ||
GET /api/v1/generation-health | getGenerationHealth | story:read | no | response:GenerationHealthEnvelope |
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/images | listMyLibraryImages | story:read | no | response:MyLibraryImages |
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 |
DELETE /api/v1/pitch-decks/{jobId} | deletePitchDeck | story:write | no | response:VideoDeleteResult |
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/insert | insertPitchDeckChapter | story:write | yes | request:PitchDeckInsertChapterRequest<br>response:PitchDeckInsertChapterAck |
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:PitchDeckRenderAnswer |
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:PitchDeckRenderAnswer |
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 | editPitchDeckSceneMusic | 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 | 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/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 |
GET /api/v1/publishing-series/{seriesId}/episodes | listShowEpisodes | publishing:read | no | response:ShowEpisodeList |
POST /api/v1/publishing-series/{seriesId}/episodes | produceShowEpisode | publishing:write | yes | response:ShowEpisodeProduce |
POST /api/v1/publishing-series/{seriesId}/generate-cover-art | generatePublishingSeriesCoverArt | publishing:write | no | request:PublishingCoverArtGenerateRequest<br>response:PublishingCoverArtGenerateResponse |
GET /api/v1/publishing-series/{seriesId}/quote | getShowQuote | publishing:read | no | response:ShowQuote |
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 |
POST /api/v1/publishing-series/{seriesId}/source-preview | previewShowSources | publishing:read | no | response:ShowSourcePreview |
GET /api/v1/screenplay-drafts/{scriptUploadId} | getScreenplayDraft | story:read | no | response:ScreenplayDraftStatus |
POST /api/v1/screenplay-drafts/{scriptUploadId} | startScreenplayDraft | story:write | yes | response:ScreenplayDraftStatus |
POST /api/v1/scripts | uploadScript | story:write | yes | request:ScriptUploadRequest<br>response:ScriptUploadResponse |
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}/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/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 |
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 |
PATCH /api/v1/season-runs/{runId}/episodes/{episodeId} | updateStorySeasonEpisode | story:write | no | request:SeasonRunEpisodeUpdateRequest<br>response:SeasonRunEnvelope |
GET /api/v1/show-source-templates | listShowSourceTemplates | publishing:read | no | response:ShowSourceCatalog |
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 |
GET /api/v1/story-jobs/{jobId}/artifacts | listStoryJobArtifacts | artifact:read | no | response:StoryArtifactListResponse |
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 |
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 |
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 | 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 |
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}/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}/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 |
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 |
POST /api/v1/story-projects/{projectId}/restore | restoreStoryProject | story:write | yes | response:ProjectRestoreResult |
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 |
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:SeriesBibleSaveResult |
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 |
GET /api/v1/story-projects/{projectId}/sounds | listProjectSounds | story:read | no | |
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}/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 |
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 |
GET /api/v1/table-read/performance-booth | getPerformanceBoothStatus | story:read | no | |
POST /api/v1/table-read/performance-booth | startPerformanceBoothSession | story:write | yes | |
DELETE /api/v1/trailers/{jobId} | deleteTrailer | story:write | no | response:VideoDeleteResult |
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 |
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 |
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:TrailerRenderAnswer |
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 |
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:TrailerRenderAnswer |
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 |
GET /api/v1/trailers/{jobId}/render-states | getTrailerRenderStates | story:read | no | response:TrailerBeatRenderStates |
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}/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/insert-beat | insertTrailerBeat | story:write | yes | request:TrailerInsertBeatRequest<br>response:TrailerBeatOrderAck |
POST /api/v1/trailers/{jobId}/storyboard/move-beat | moveTrailerBeat | story:write | yes | request:TrailerMoveBeatRequest<br>response:TrailerBeatOrderAck |
POST /api/v1/trailers/{jobId}/storyboard/music | editTrailerSceneMusic | story:write | yes | |
POST /api/v1/trailers/{jobId}/storyboard/regenerate-text | regenerateTrailerText | artifact:publish | yes | request:TrailerBeatIndexRequest<br>response:TrailerTextRenderAnswer |
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/takes | getTrailerBeatTakes | story:read | no | response:TrailerBeatTakes |
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 | response:TrailerExportAck |
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 |
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 | GET /capabilities | |
| 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} |