Skip to content

Sleeper Hit Studio — Public Discovery changelog

studio.sleeperhit/public-discovery

6 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • llms.txt +12 −10

    https://sleeperhit.studio/llms.txt

    − > A story-creation and production workspace for developing, writing, performing, packaging, and publishing narrative work. Start from an initial premise, notes, research, or an existing screenplay. An existing screenplay is not required.− - Search opted-in creator profiles, project summaries, and creator-approved public assets through the public MCP server (https://sleeperhit.studio/api/mcp) or the public discovery API (https://sleeperhit.studio/api/public/v1), which needs no MCP client.− You cannot complete the app's browser OAuth from inside a chat or a sandboxed shell: the browser cannot reach your sandbox's callback, so your user approves and no token arrives. Do not run that browser login yourself, and do not retry it. A device sign-in needs no callback and does finish inside a sandbox: `sleeperhit login --no-browser` in the CLI prints a code and a URL for your user to approve in their own browser, then polls and saves the key, so it works when your user can approve while yo− Claude Code takes the same key as a header: `claude mcp add --transport http sleeperhit https://sleeperhit.studio/mcp --header "Authorization: Bearer $SLEEPERHIT_API_KEY"`. Every client's setup: https://sleeperhit.studio/mcp#api-key− - **Public discovery:** `https://sleeperhit.studio/api/mcp` — unauthenticated and read-only. It exposes only opted-in creator profiles and creator-approved public assets.− - **The same public data over plain HTTP, no MCP client:** `https://sleeperhit.studio/api/public/v1` — unauthenticated, read-only REST. It is the index that names every public endpoint (writer profiles, their projects, and their approved assets), and it answers 200 with no account, so an agent that cannot speak MCP can still search.− - **Product videos from app recordings:** Make videos of a software product: a product Bible, product coverage, recordings (captures) of the app following a tour per feature, then a video made from the captures alone. Start with `get_project` → `get_series_bible` → `list_app_captures`.− - **Pitch deck rendering:** Approve a pitch deck plan into a priced 480p render, review and choose takes chapter by chapter, then finish the deck at 720p (or 1080p) and export it. Start with `get_pitch_deck_chapters` → `quote_approve_pitch_deck_plan` → `approve_pitch_deck_plan`.− - **Trailer rendering:** Approve a trailer plan into a priced 480p render, review and choose takes, then finish the cut at 720p (or 1080p) and export it. Start with `get_trailer_beats` → `quote_approve_trailer_plan` → `approve_trailer_plan`.− - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `capture:read`, `credits:read`, `account:read`, `account:write`.+ > A production studio for podcasts and video episodes: develop, write, perform, package and publish them, with trailers, pitch decks and product videos beside them. Start from an initial premise, notes, research, or an existing screenplay. An existing screenplay is not required.+ - Read the published shows (public whether or not any creator has opted in) and search opted-in creator profiles, project summaries, and creator-approved public assets through the public MCP server (https://sleeperhit.studio/api/mcp) or the public discovery API (https://sleeperhit.studio/api/public/v1), which needs no MCP client.+ You cannot complete the app's browser OAuth from inside a chat or a sandboxed shell: the browser cannot reach your sandbox's callback, so your user approves and no token arrives. Do not run that browser login yourself, and do not retry it. A device sign-in needs no callback and does finish inside a sandbox: `sleeperhit login --no-browser` in the CLI prints a code and a URL for your user to approve in their own browser, then polls and saves the key, so it works when your user can approve while yo+ Claude Code takes the same key as a header: `claude mcp add --transport http sleeperhit https://sleeperhit.studio/mcp --header "Authorization: Bearer $SLEEPERHIT_API_KEY"`. Every client's setup: https://sleeperhit.studio/docs/connect+ - **Public discovery:** `https://sleeperhit.studio/api/mcp` — unauthenticated and read-only. It exposes only opted-in creator profiles, creator-approved public assets and published shows; the published shows are public whether or not any creator profile is, so read them first.+ - **The same public data over plain HTTP, no MCP client:** `https://sleeperhit.studio/api/public/v1` — unauthenticated, read-only REST. It is the index that names every public endpoint (published shows first, then writer profiles, their projects, and their approved assets), and it answers 200 with no account, so an agent that cannot speak MCP can still search — and an empty creator list there means no creator has opted in, never an empty studio. Send a `User-Agent` that names your agent and how + - **Product videos from app recordings:** Make videos of a software product: recordings (captures) of the app following a tour per feature, then a video made from the captures alone; the product Bible those recordings are written from and its one product coverage pass come after them. Start with `get_project` → `get_series_bible` → `list_app_captures`.+ - **Research notes: what an episode knows:** An episode's research notes (the Notes tab's Research page): list them, search their words, read one with its body, and start, edit or delete one. Start with `list_research_notes` → `search_research_notes`.+ - **Pitch deck rendering:** Approve a pitch deck plan into a priced 480p render, review and choose takes chapter by chapter, then finish the deck at 720p (or 1080p) and export it. Start with `create_plan` → `get_plan` → `create_job` → `get_pitch_deck_chapters`.+ - **Trailer rendering:** Approve a trailer plan into a priced 480p render, review and choose takes, then finish the cut at 720p (or 1080p) and export it. Start with `plan_trailer` → `get_trailer_beats` → `quote_approve_trailer_plan` → `approve_trailer_plan`.+ - Keys are scoped, on one of two access levels the Developers page offers: it opens on **Read-only** (every read the API has) and **Full access** is the one press that widens it. A key's scopes cannot be edited after creation, so widening a key means making a new key.+ - The scope ids: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `capture:read`, `credits:read`, `account:read`, `account:write`.

  • Resources +1
    • + Published shows

  • llms.txt +29 −11

    https://sleeperhit.studio/llms.txt

    − - Search opted-in creator profiles, project summaries, and creator-approved public assets through the public MCP server or the public discovery API.− You cannot complete the sign-in from inside a chat or a sandboxed shell: the browser cannot reach your sandbox's callback, so your user approves and no token arrives. Do not run the login yourself, and do not retry it. Ask your user to do the one-time sign-in in their app:− Verify with the `whoami` tool (or `sleeperhit whoami` in a terminal). It answers `source: "oauth"`, or `source: "api_key"` with the key's scopes; to create and generate, a key needs story:write and source:write.− - Do not use `/api/mcp` for private projects or generation; it intentionally has no creation tools.− - **Orientation and account:** Confirm the connected identity and load live backend guidance before choosing a workflow. Start with `whoami` → `get_agent_guidance`.− - **Planning and screenwriting:** Create a reviewable plan, generate an installment, inspect real pages, and revise the same artifact. Start with `create_plan` → `get_plan`.− - **Pitch deck rendering:** Approve a pitch deck plan into a priced 480p render, review and choose takes chapter by chapter, then finish the deck at 720p (or 1080p) and export it. Start with `get_pitch_deck_chapters` → `approve_pitch_deck_plan`.− - **Trailer rendering:** Approve a trailer plan into a priced 480p render, review and choose takes, then finish the cut at 720p (or 1080p) and export it. Start with `get_trailer_beats` → `approve_trailer_plan`.− - **Shows:** Set up and run a show: a podcast that makes its own episodes from what its sources give (a feed, a topic in the news, Hacker News, a site, a repository), on its schedule, within spending caps the user agrees, after a preview the user hears, each episode credited in its show notes. Or read one an outside app makes under its standing approval. The user owns the show, its episodes and its feed. Start with `create_project` → `save_series_bible` → `get_show` → `set_up_show` → `check_show− - Send `Authorization: Bearer sh_<prefix>_<secret>` on every request.− - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `credits:read`, `account:read`, `account:write`.+ - Search opted-in creator profiles, project summaries, and creator-approved public assets through the public MCP server (https://sleeperhit.studio/api/mcp) or the public discovery API (https://sleeperhit.studio/api/public/v1), which needs no MCP client.+ You cannot complete the app's browser OAuth from inside a chat or a sandboxed shell: the browser cannot reach your sandbox's callback, so your user approves and no token arrives. Do not run that browser login yourself, and do not retry it. A device sign-in needs no callback and does finish inside a sandbox: `sleeperhit login --no-browser` in the CLI prints a code and a URL for your user to approve in their own browser, then polls and saves the key, so it works when your user can approve while yo+ Verify with the `whoami` tool (or `sleeperhit whoami` in a terminal). It answers `source: "oauth"`, or `source: "api_key"` with the key's scopes. A key for the flow below needs `story:read` and `credits:read` — the guidance and the balance every agent reads first — plus `artifact:read` for the job and artifact reads that follow, `story:write` with `source:write` to create and generate, and `source:read` to poll a URL or PDF source until it is ready.+ - **The same public data over plain HTTP, no MCP client:** `https://sleeperhit.studio/api/public/v1` — unauthenticated, read-only REST. It is the index that names every public endpoint (writer profiles, their projects, and their approved assets), and it answers 200 with no account, so an agent that cannot speak MCP can still search.+ - Do not use `/api/mcp` or `/api/public/v1` for private projects or generation; they intentionally have no creation tools.+ - **Orientation and account:** Confirm the connected identity and load live backend guidance before choosing a workflow. Start with `whoami` → `get_capabilities` → `get_agent_guidance`.+ - **Planning and screenwriting:** Create a reviewable plan, generate an installment, inspect real pages, and revise the same artifact — and read the writer's notices (a show episode held or failed, a renewal or auto top-up that failed, a refunded payment, a login that stopped signing in) with list_notifications and mark_notifications_read, or GET and POST /api/v1/notifications. Start with `create_plan` → `get_plan`.+ - **Pitch deck rendering:** Approve a pitch deck plan into a priced 480p render, review and choose takes chapter by chapter, then finish the deck at 720p (or 1080p) and export it. Start with `get_pitch_deck_chapters` → `quote_approve_pitch_deck_plan` → `approve_pitch_deck_plan`.+ - **Trailer rendering:** Approve a trailer plan into a priced 480p render, review and choose takes, then finish the cut at 720p (or 1080p) and export it. Start with `get_trailer_beats` → `quote_approve_trailer_plan` → `approve_trailer_plan`.+ - **Shows:** Set up and run a show: a podcast that makes its own episodes from what its sources give (a feed, a topic in the news, Hacker News, a site, a repository), on its schedule, within spending caps the user agrees, after a preview the user hears, each episode credited in its show notes. Or read one an outside app makes under its standing approval. The user owns the show, its episodes and its feed. Start with `create_project` → `save_series_bible` → `get_show` → `set_up_show` → `check_show+ - [Public discovery API](https://sleeperhit.studio/api/public/v1): the no-account REST index of the public writer, project, asset and show endpoints; read it with no key and no MCP client.+ - Send `Authorization: Bearer sh_<prefix>_<secret>` on every request that reads or writes an account.+ - These answer with no key at all (and the same to a bad one), so an agent with none starts here:+ - `GET https://sleeperhit.studio/api/v1/capabilities` — The live feature manifest.+ - `GET https://sleeperhit.studio/api/v1/examples` — Worked request examples, the auth header format and the error codes.+ - `POST https://sleeperhit.studio/api/auth/device/code` — Start a device sign-in: the code your user approves and the device code to poll with.+ - `POST https://sleeperhit.studio/api/v1/device/credential` — Exchange an approved device code for an API key.+ - `GET https://sleeperhit.studio/api/v1/publishing-feeds/{seriesSlug}.xml` — A show's public RSS feed.+ - `GET https://sleeperhit.studio/api/v1/publishing-feeds/{seriesSlug}/episodes/{releaseId}.mp3` — One published episode's audio file.+ - `GET https://sleeperhit.studio/api/v1/cli/sleeperhit-cli.tgz` — The published CLI tarball, the address the install command names (a counted install).+ - `GET https://sleeperhit.studio/api/public/v1` — The public discovery index of opted-in writers and shows.+ - `GET https://sleeperhit.studio/api/public/v1/shows` — Published shows, with their own site and podcast feed.+ - `GET https://sleeperhit.studio/api/public/v1/writers` — Search public writer profiles by name, genre, format or specialty.+ - `GET https://sleeperhit.studio/api/public/v1/writers/{writerSlug}` — One public writer profile, with their public projects and assets.+ - `GET https://sleeperhit.studio/api/public/v1/writers/{writerSlug}/projects` — A public writer's public projects.+ - `GET https://sleeperhit.studio/api/public/v1/writers/{writerSlug}/projects/{projectSlug}` — One of a public writer's public projects.+ - `GET https://sleeperhit.studio/api/public/v1/writers/{writerSlug}/assets` — Every public asset a writer approved.+ - `GET https://sleeperhit.studio/api/public/v1/writers/{writerSlug}/projects/{projectSlug}/assets` — The public assets of one of a writer's public projects.+ - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `capture:read`, `credits:read`, `account:read`, `account:write`.

  • llms.txt +26 −200

    https://sleeperhit.studio/llms.txt

    − Status: production-stable identity, auth, credits, discovery, source ingestion, project Series Bibles, conversational season runs, StoryPlans, story jobs, live table reads, pitch decks, and post-creation artifact mutations. Remaining artifact adapters and webhooks ship in follow-on phases. Always read `/api/v1/capabilities` before integrating a flow.− ## Capability manifest− - [`https://sleeperhit.studio/capabilities.json`](https://sleeperhit.studio/capabilities.json) — the single authoritative machine-readable manifest for the MCP connector (authenticated + public), the Story API, and the CLI. Versioned, unauthenticated, and it states the auth requirement and scopes for every capability. Read it first.− Anyone 18 or older can sign up at https://sleeperhit.studio/signup, where they confirm their age and accept the Terms of Service (https://sleeperhit.studio/terms) and Privacy Policy (https://sleeperhit.studio/privacy). An agent cannot create an account or accept the Terms for a user. Hand the human the link that matches them, then stop:− - Business and brand storytelling (Companies, agencies, and brand or marketing teams producing narrative work.) — https://sleeperhit.studio/signup?intent=business− - Independent creator (Solo creators and small studios publishing their own shows, podcasts, and short-form video.) — https://sleeperhit.studio/signup?intent=creator− - Screenwriter (Screenwriters developing scripts, pilots, features, and pitch material.) — https://sleeperhit.studio/signup?intent=writer− ## MCP endpoints− - **Authenticated creation and production:** `https://sleeperhit.studio/mcp` — OAuth-protected Streamable HTTP. This is the preferred remote connector for Codex and other supported MCP clients.− - **Public discovery:** `https://sleeperhit.studio/api/mcp` — unauthenticated and read-only. It exposes only opted-in creator profiles and creator-approved public assets.− - Do not use `/api/mcp` for private projects or generation; it intentionally has no creation tools.− If your user can't do a browser sign-in, they can create an API key at https://sleeperhit.studio/dashboard/api (Dashboard → Developers), set it as SLEEPERHIT_API_KEY and add it as a bearer token: `codex mcp add sleeperhit --url https://sleeperhit.studio/mcp --bearer-token-env-var SLEEPERHIT_API_KEY`. Never ask your user to paste a key into the chat.− Verify with the `whoami` tool. It answers `source: "oauth"`, or `source: "api_key"` with the key's scopes; to create and generate, a key needs story:write and source:write.− - **Recurring shows:** Set up and run a recurring podcast or show: a cast and format, a source it reads (a feed, a site, a repository, Hacker News), a schedule, spending caps the user agrees, one preview episode the user hears, then live — each episode made unattended from new source material and credited in its show notes. The user owns the show, its episodes and its feed. Start with `create_project` → `save_series_bible` → `create_publishing_series` → `preview_show_sources` → `get_show_quote` − - [Live feature availability](https://sleeperhit.studio/api/v1/capabilities): which artifacts, sources, and docs surfaces are live right now. Needs an API key (`story:read`).− - [Agent guidance](https://sleeperhit.studio/api/v1/agent-guidance): backend-managed workflow guidance for Story API, CLI, and MCP agents, including MCP server instructions plus tool/resource descriptions. Needs an API key. Read this before creating or refining table reads.− - [Examples](https://sleeperhit.studio/api/v1/examples): cURL + Node recipes for the polling-only happy path, error recovery, and idempotent POSTs.− - [Agent integration guide](https://sleeperhit.studio/llms-full.txt): long-form prose for agents — auth, idempotency, rate limits, error recovery, what is and is not live.− - Create production API keys at https://sleeperhit.studio/dashboard/api. Tokens are shown once.− - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `credits:read`, `webhook:write`, `account:read`, `account:write`.− ## Conventions− - Errors use a stable envelope: `{ error: { code, message, requestId } }`. Match on `code`, not `message`.− - Per-request `X-Request-Id` is echoed in response headers and inside error envelopes — quote it when reporting issues.− - Rate limit headers (`RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`) are returned on every response. `429` responses include `Retry-After`.− - Idempotent POSTs require `Idempotency-Key`. Retry-safe with the same key; the API replays the original response.− - Studio Credits are the single shared meter. Read balance from `/api/v1/credits` before triggering a job.− - Development flow warnings are non-blocking for one-off artifacts: complete the full project Series Bible before screenplay generation and review coverage afterward. Season runs add hard gates: all imported episode briefs and the complete map require human confirmation; every episode plan, failed-coverage revision, and RSS publish action requires a later explicit human decision; durable audio is held until coverage passes.− - Anything that reaches the first-party RSS feed is a human boundary, whichever route you take: `POST /season-runs/{runId}/advance` with `{ action: "publish" }`, `POST /publishing-releases/{releaseId}/publish`, `POST /publishing-releases/{releaseId}/schedule`, and — because a date there enqueues the same publish — `POST /publishing-series/{seriesId}/releases` or `PATCH /publishing-releases/{releaseId}` carrying a non-null `scheduledAt`. Each requires `userConfirmed: true` after the user approves− - The one thing that does stand in for it is a show's STANDING APPROVAL, granted once by the owner (Publishing tab, or `PATCH /publishing-series/{seriesId}` with `{ standingApprovalKeyId, userConfirmed: true }`; arming a cadence grants one too). It is bound to ONE API key (never an OAuth connection) and covers only that show: `POST /story-plans/{planId}/approve` for a table-read plan in the show's project, and `POST /publishing-releases/{releaseId}/publish` for one of its audio releases — each c− - A recurring show spends only within its CAPS, agreed with the owner: `episodeCreditCap` (one episode) and `monthlyCreditCap` (a calendar month's episodes, in the series' timezone), set on `PATCH /publishing-series/{seriesId}` with `userConfirmed: true`. Arming a cadence is refused without both, and refused while the project cannot make an episode (its Bible gate, its cast canon). `GET /publishing-series/{seriesId}/quote` gives one episode's quote from the pricing library and the caps suggested− - A show goes live only after a PREVIEW (owner, 2026-10-09): `POST /publishing-series/{seriesId}/episodes` makes one episode now — quoted without `userConfirmed`, charged and queued with it — held for the owner to hear and never published; arming refuses until one is `ready`. So: create the show unarmed, `POST /publishing-series/{seriesId}/source-preview` to read its sources now (free, guarded fetch; what an episode would get, what is already covered, which sources fail), set caps from the quote− ## Endpoints (live today)− - `GET /api/v1/capabilities` — requires scope `story:read`. Capability manifest.− - `GET /api/v1/agent-guidance` — requires scope `story:read`. Current backend-managed agent workflow guidance.− - `GET /api/v1/credits` — requires scope `credits:read`. Studio Credit summary, plus `costs`: what each operation costs, the list the Billing page shows (a rate names its unit in `per`; a pitch deck and a trailer are priced per second; `ops` names the ledger op keys a line's charges carry), and the ledger behind the number: `usage` (what the credits actually went on, each charge named the way the Billing page names it, with the screenplay it was spent on; grants and refunds are shown but are not− - `GET|POST /api/v1/account/export` — `account:read`. "Download my data": POST (with `Idempotency-Key`) builds one zip of everything the account holds (scripts as Fountain and Final Draft, projects' documents as JSON and Markdown, coverage as JSON, Markdown and PDF, links to every audio and video master, shows and feeds, consent records, credits and payments, voices, chats, forum posts); GET says where it stands and, when `ready`, gives `download.url`, a signed link that works for an hour (read − - `GET /api/v1/account/deletion` (`account:read`), `POST /api/v1/account/deletion` and `DELETE /api/v1/account/deletion` (`account:write`). Delete the account and everything it made (scripts, projects, reads, decks, trailers, shows and feeds, voices here and at the voice provider, stored files, keys, connected apps). POST needs `confirmEmail` (the account's email; 400 `account_email_mismatch`) and `Idempotency-Key`, and schedules the purge 7 days out; the owner is emailed and can cancel with DEL− - `POST /api/v1/story-projects` — `story:write`. Create a project workspace.− - `GET /api/v1/story-projects` — `story:read`. Cursor-paginated project list.− - `GET|PATCH|DELETE /api/v1/story-projects/{id}` — read, update, delete a project. DELETE hides it at once and keeps it restorable for 30 days (`restorableUntil`; `GET /api/v1/story-projects/deleted`, `POST /api/v1/story-projects/{id}/restore`, 409 `project_not_restorable` after), then purges it with its Bible, cast, mood board, sources, app captures, stored app logins, plans, season runs, show, decks, trailers and destination videos; its episodes go with it: private during the window, restored + Anyone 18 or older can sign up at https://sleeperhit.studio/signup?utm_source=assistant&utm_medium=mcp&utm_campaign=mcp, where they confirm their age and accept the Terms of Service (https://sleeperhit.studio/terms) and Privacy Policy (https://sleeperhit.studio/privacy). An agent cannot create an account or accept the Terms for a user. Hand the human the link that matches them, then stop:+ - Business and brand storytelling (Companies, agencies, and brand or marketing teams producing narrative work.) — https://sleeperhit.studio/signup?intent=business&utm_source=assistant&utm_medium=mcp&utm_campaign=mcp+ - Independent creator (Solo creators and small studios publishing their own shows, podcasts, and short-form video.) — https://sleeperhit.studio/signup?intent=creator&utm_source=assistant&utm_medium=mcp&utm_campaign=mcp+ - Screenwriter (Screenwriters developing scripts, pilots, features, and pitch material.) — https://sleeperhit.studio/signup?intent=writer&utm_source=assistant&utm_medium=mcp&utm_campaign=mcp+ ## What it makes+ Sleeper Hit Studio is for writers, producers, and small studios making narrative audio and video. From a premise, a screenplay, or a folder of sources it develops a project Series Bible, plans a season, writes and performs episodes, makes live table reads, and publishes a first-party show feed; the same project is packaged as pitch decks, trailers, and product videos. Every spend is quoted in Studio Credits before it is charged.+ Agents do the same work for a signed-in user over the authenticated MCP connector (or the Story API and CLI): develop and read a project, plan an episode, create a table read, poll a job, refine the result, and ask the human at every publish boundary.+ ## Connect in one step+ If your user can't do a browser sign-in, they can create an API key at https://sleeperhit.studio/dashboard/developers (Dashboard → Developers), set it as SLEEPERHIT_API_KEY and add it as a bearer token: `codex mcp add sleeperhit --url https://sleeperhit.studio/mcp --bearer-token-env-var SLEEPERHIT_API_KEY`. Never ask your user to paste a key into the chat.+ Verify with the `whoami` tool (or `sleeperhit whoami` in a terminal). It answers `source: "oauth"`, or `source: "api_key"` with the key's scopes; to create and generate, a key needs story:write and source:write.+ ### MCP endpoints+ - **Authenticated creation and production:** `https://sleeperhit.studio/mcp` — OAuth-protected Streamable HTTP. This is the preferred remote connector for Codex and other supported MCP clients.+ - **Public discovery:** `https://sleeperhit.studio/api/mcp` — unauthenticated and read-only. It exposes only opted-in creator profiles and creator-approved public assets.+ - Do not use `/api/mcp` for private projects or generation; it intentionally has no creation tools.+ - **Connected products (business):** For a business organization: connect the systems the team works in — Notion and Linear can be connected today, and list_integrations names every product this account can connect. Choose what each brings in, feed a project's seasons from them, and review what they find. Read-only connections; nothing joins a season until someone keeps it. Start with `list_integrations` → `get_integration_walkthrough`.+ - **Strategy: watches, opportunities, pursuits and contacts:** The writer's career strategy outside any project: recurring watches that find opportunities, pursuits with action items, and contacts. Start with `list_opportunity_watches` → `list_opportunities` → `list_pursuits`.+ - **Shows:** Set up and run a show: a podcast that makes its own episodes from what its sources give (a feed, a topic in the news, Hacker News, a site, a repository), on its schedule, within spending caps the user agrees, after a preview the user hears, each episode credited in its show notes. Or read one an outside app makes under its standing approval. The user owns the show, its episodes and its feed. Start with `create_project` → `save_series_bible` → `get_show` → `set_up_show` → `check_show+ - [Agent integration guide](https://sleeperhit.studio/llms-full.txt): the full manual — auth, idempotency, rate limits, error recovery, every live endpoint with its scopes and conventions, the StoryPlan contract, and what is and is not live. Read the endpoint you are about to call.+ - [Live feature availability](https://sleeperhit.studio/api/v1/capabilities): which artifacts, sources, and docs surfaces are live right now. Needs no key.+ - [Agent guidance](https://sleeperhit.studio/api/v1/agent-guidance): backend-managed workflow guidance for Story API, CLI, and MCP agents, with the structured development-flow warnings. The MCP server instructions and the workflow router arrive with the connection, so they are not repeated here. Needs an API key. Read this before creating or refining table reads.+ - [Examples](https://sleeperhit.studio/api/v1/examples): cURL + Node recipes for the happy path, error recovery, and idempotent POSTs.+ - Create production API keys at https://sleeperhit.studio/dashboard/developers. Tokens are shown once.+ - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `credits:read`, `account:read`, `account:write`.+ ## Endpoint reference+ Every endpoint, its scope and its conventions are in the [agent integration guide](https://sleeperhit.studio/llms-full.txt#endpoint-reference): read the one you are about to call. [The capability manifest](https://sleeperhit.studio/capabilities.json) is the authoritative list of what exists at all.+ Status: production-stable identity, auth, credits, discovery, source ingestion, project Series Bibles, conversational season runs, StoryPlans, story jobs (including signed completion callbacks), live table reads, pitch decks, and post-creation artifact mutations. Remaining artifact adapters ship in follow-on phases. Always read `/api/v1/capabilities` before integrating a flow.

    Showing the first 40 of each.

  • llms.txt +102 −44

    https://sleeperhit.studio/llms.txt

    − Access is waitlist-gated — there is no self-serve signup, and an agent cannot create an account for a user. Hand the human the link that matches them, then stop:− - Business and brand storytelling (Companies, agencies, and brand or marketing teams producing narrative work.) — https://sleeperhit.studio/waitlist?intent=business− - Independent creator (Solo creators and small studios publishing their own shows, podcasts, and short-form video.) — https://sleeperhit.studio/waitlist?intent=creator− - Screenwriter (Screenwriters developing scripts, pilots, features, and pitch material.) — https://sleeperhit.studio/waitlist?intent=writer− - `codex mcp add` registers the server. `codex mcp login` starts OAuth and opens or directs the user to browser authorization.− - Complete authorization in the browser. Authentication success and tool-roster refresh are separate events; reopen or refresh the active Codex task if Sleeper Hit tools do not appear.− - [Capabilities manifest](https://sleeperhit.studio/api/v1/capabilities): live feature availability (auth, sources, artifacts, docs).− - [Agent guidance](https://sleeperhit.studio/api/v1/agent-guidance): backend-managed workflow guidance for Story API, CLI, and MCP agents, including MCP server instructions plus tool/resource descriptions. Read this before creating or refining table reads.− - Remote MCP clients should prefer OAuth at `/mcp`; no API key is pasted into Codex.− - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `credits:read`, `webhook:write`.− - `GET /api/v1/credits` — requires scope `credits:read`. Studio Credit summary, plus `costs`: what each operation costs, the list the Billing page shows (a rate names its unit in `per`; a pitch deck and a trailer are priced per second; `ops` names the ledger op keys a line's charges carry).− - `GET|PATCH|DELETE /api/v1/story-projects/{id}` — read, update, soft-delete a project.− - `GET|POST /api/v1/story-projects/{id}/series-bible/coverage` — read or queue a versioned Series Bible-rubric report in the shared coverage lifecycle, calibrated against 72 provenance-backed craft profiles. Series script coverage waits for a current 7.0+ report.− - `POST /api/v1/story-projects/{id}/cast-portraits/design` — `artifact:publish`. Draw N HEADSHOT candidates (default 3, at most 4) for one named cast member, from the Series Bible's appearance with the person's LOOK after it (`direction`, else their cast canon look direction; `age` likewise). METERED, TWO CALLS: without `confirmed` it prices them (one cast headshot each) and draws nothing; with `confirmed: true` it reserves and queues the draw and answers `designId`. Poll `GET .../cast-portraits− - `POST /api/v1/story-projects/{id}/sources` — `source:write`. Attach inline text, markdown, URL, or PDF. Set `metadata.sourceContextMode="full"` when the planner and final artifact writer must receive the complete hash-verified retained text; full mode fails instead of clipping. A producer sending one source per item adds `producer` + `externalId`: the project keeps one live source per item and a repeat returns it with `deduplicated: true`, even while it is still PENDING/EXTRACTING (delete it t− - `POST /api/v1/artifacts/{artifactId}/render-video` — `artifact:publish`. Opt-in MP4 render for a table read (separate charge). Requires `Idempotency-Key`.− - `POST /api/v1/artifacts/{artifactId}/refine` — `artifact:publish`. Conversational in-place revision. Requires `Idempotency-Key`. Body: `{ instruction, scope? }`. Returns `{ storyJob }` to poll. Reserves TABLE_READ_REFINE (8 credits). Artifact id + share URLs stay stable.− - `POST /api/v1/voices/preview` — `story:write`. Hear any voice say `text`, or a character's first line in a read (`artifactId` + `character`), before assigning it; answers `preview.url`. Free; the same words in the same voice are voiced once (`cached`). Requires `Idempotency-Key`.− - `POST /api/v1/artifacts/{artifactId}/performance` — `artifact:publish`. Refine the delivery (emotion / speed / volume / cadence) of ALL of one character's lines in place (no new revision, no charge). `character` is a name, `"NARRATOR"`, or `"ALL"`. Use `speedFactor`/`volumeFactor` (per-line multipliers, e.g. 1.2 = +20%) for relative asks like "speed the narrator up by 20%"; `speed`/`volume` are the absolute equivalents. Cadence = `speed` + `pauseAfterMs`; flatten with `emotions:["neutral"]` + − - `POST /api/v1/artifacts/{artifactId}/finalize` — `artifact:publish`. Durable render. Requires `Idempotency-Key`. Body: `{ mode? }` — `"audio"` (default, 6 credits) or `"video"` (12 credits). Replay-safe. Poll GET artifact for `manifest.audio.finalize.status` (audio) or `manifest.video.status` (video).− A story job runs queued artifact generation against an APPROVED StoryPlan. Table reads, pitch decks, trailers, and reviewed dialogue production videos are live adapters; check `/api/v1/capabilities.artifacts` for the current inventory.− - Create with POST `/story-jobs`, body `{ storyPlanId, artifactRequests?, projectId? }`. The plan must be `APPROVED`. `artifactRequests` defaults to the plan's own requests; if supplied it overrides them (max 6). For table reads, preserve or set `narrationPolicy` (`auto | include | suppress`) when overriding the request. A table read performs the project cast and never makes one: from a plan it starts only when the project cast canon covers every character (a voice for everyone and, unless the p− - Refine with POST `/artifacts/{artifactId}/refine` (scope `artifact:publish`, Idempotency-Key required). Body: `{ instruction, scope? }`. Returns `{ storyJob }` to poll. TABLE_READ_REFINE costs 8 credits. The artifact id, share token, and player URLs are stable across refines.− - Finalize with POST `/artifacts/{artifactId}/finalize` (scope `artifact:publish`, Idempotency-Key required). Body: `{ mode? }` — `"audio"` (default, TABLE_READ_FINALIZE_AUDIO, 6 credits) or `"video"` (TABLE_READ_FINALIZE_VIDEO, 12 credits). Replay-safe. Poll GET artifact for `manifest.audio.finalize.status` (audio) or `manifest.video.status` (video).− A `pitch_deck` artifact request plans a chapter plan and moves through `draft → rendering → review → finishing → complete` (or `failed`) under `/pitch-decks/{jobId}`. There are no stills and no storyboard or draft approval: each chapter is a few short shots in one room, and its poster frame is taken from its takes. A pitch deck job always stops at its plan: it plans the chapters onto a `draft` deck (the job's `progress.pitchDeckJobId`) and renders and reserves nothing, so planning is free. The n− - Price: A pitch deck is priced at 2 credits / second (720p). Planning is free. The exact price is quoted per shot once the plan is ready, before anything renders: 1 credit / second to render, plus 1 credit / second to finish at 720p. A 1080p finish is 4 credits / second instead (5 credits / second in all). Location plates and on-screen text are itemized in the same quotes.− - A CHAPTER'S OWN SOUND: A chapter that keeps its scene sound plays the sound its own render made (harness bells, singers, a crowd: voices and all) under the score; every other chapter plays only its cast's lines over quiet room tone. On a chapter with no spoken line it also decides whether the render is made with sound, so keeping the sound of takes made silent needs them rendered again; any other change re-cuts the chapter from the takes it has, free. Mark it with `chapters/refine` (`keepsScen− - THE TITLE SEQUENCE: A deck's title sequence opens its master, before the first chapter: optionally an epigraph (`epigraph`: its words and where they are from) and a source credit (`sourceCredit`), each quiet on black and held long enough to read; then flash cuts of six to ten frames to the people it names (`cast`, in order; `inShadow` darkens one), each the person's LIVING PORTRAIT — looking into the lens, still, breathing, rendered for the flash (priced first, its own step) — and until it is − - THE CLOSING SEQUENCE: A deck's closing sequence ends its master, after the last chapter, and mirrors its title sequence: optionally a closing quote (`quote`: its words, quoted exactly, and where they are from, cited exactly — one that answers the opening's epigraph, often from the same source), then "Coming Soon" (`comingSoon`, up to 40 characters; "Coming Soon" when left out), then the production credit (`productionCredit`; "Sleeper Hit Studio" when left out), each quiet on black, faded in an− - THE INTENT: Every deck and trailer is planned from an explicit intent — what the video is for, its logline, theme, central question, stakes, what a first-time viewer is promised, a four-stage arc (setup, escalation, turn, closing question) and how the ending lands the question. Every chapter or beat names the arc stage it serves (`arcStage`), how it advances the central question (`advancesQuestion`) and, after the first, why it follows the one before it (`whyItFollows`: the visible link — a ca− - Choose a take with POST `/pitch-decks/{jobId}/chapters/{chapterIndex}/select-take` `{ callId, take }` (free; a re-voiced take is never selected). Stage a re-voiced line as a voice-over in a new take with POST `/pitch-decks/{jobId}/chapters/{chapterIndex}/stage-voice-over` `{ callId, take, confirmed? }` (priced like a new take: quote, then confirm). Every take is watched with its sound and remedied by rule at our cost (each take's `watch`, `repair`, `lineage`); repair one take in place with POS− - Finish with POST `/pitch-decks/{jobId}/finish` `{ deliveryResolution?, confirmed?, acknowledgeVideoCoverage? }` (scope `artifact:publish`, TWO CALLS): the selected takes are upscaled to the delivery class, the text layers laid over the finished cuts, the finished master stitched, and the PDF laid out from poster frames of the finished takes. Refused while a call has no selected take or a footage chapter has not rendered, and while the deck's video coverage holds it (`blocksFinish`: 409 `pitch_− A `trailer` artifact request plans a beat plan and moves through `draft → rendering → review → finishing → complete` (or `failed`) under `/trailers/{jobId}`. A trailer job always stops at its plan: it plans the beats onto a `draft` trailer (the job's `progress.trailerJobId`) and renders and reserves nothing, so planning is free. The next step is approve_trailer_plan (POST /trailers/{jobId}/plan/approve; CLI: trailer approve-plan <jobId>): without `confirmed` it returns the 480p render quote and − - Price: A trailer is priced at 2 credits / second (720p). Planning is free. The exact price is quoted per shot once the plan is ready, before anything renders: 1 credit / second to render, plus 1 credit / second to finish at 720p. A 1080p finish is 4 credits / second instead (5 credits / second in all). Location plates and on-screen text are itemized in the same quotes.− - Choose a take with POST `/trailers/{jobId}/beats/{beatIndex}/select-take` `{ callId, take }` (free; a re-voiced take is never selected). Stage a re-voiced line as a voice-over in a new take with POST `/trailers/{jobId}/beats/{beatIndex}/stage-voice-over` `{ callId, take, confirmed? }` (priced like a new take: quote, then confirm). Every take is watched with its sound and remedied by rule at our cost (each take's `watch`, `repair`, `lineage`); repair one take in place with POST `/trailers/{jobI− - Finish with POST `/trailers/{jobId}/finish` `{ deliveryResolution?, confirmed?, acknowledgeVideoCoverage? }` (scope `artifact:publish`, TWO CALLS): the selected takes are upscaled to the delivery class, the text layers composited and the finished master stitched. Refused while a call has no selected take, and while the trailer's video coverage holds it (`blocksFinish`: 409 `trailer_video_coverage_failed`, `details.videoCoverage` with the score, the bar and the findings) — fix the shots it name− - `audio.finalize` — tracks the durable MP3 render state. Fields: `{ status, finalizeUrl, error }`. Auto-triggered on ready; also callable explicitly via POST `/artifacts/{artifactId}/finalize` with `mode:"audio"`. Progresses through `not_finalized → queued → rendering → uploading → complete` (or `failed`). Poll GET `/artifacts/{artifactId}` until terminal.− Reserves TABLE_READ_REFINE (8 Studio Credits) at job create time.− - `"audio"` (6 credits — TABLE_READ_FINALIZE_AUDIO) — freezes the current completed Pipecat/Daily table-read recording into a durable MP3. If no completed recording exists yet, finalize returns `needs_recording` and does not reserve credits. Poll GET artifact: `manifest.audio.finalize.status` (`needs_recording`, or `queued → rendering → uploading → complete`). On complete: `manifest.audio.recordingUrl` (MP3) and `manifest.audio.recordingDurationMs`.− - `"video"` (12 credits — TABLE_READ_FINALIZE_VIDEO) — queues the Remotion MP4 export. Poll GET artifact: `manifest.video.status` and `manifest.video.url`.+ Anyone 18 or older can sign up at https://sleeperhit.studio/signup, where they confirm their age and accept the Terms of Service (https://sleeperhit.studio/terms) and Privacy Policy (https://sleeperhit.studio/privacy). An agent cannot create an account or accept the Terms for a user. Hand the human the link that matches them, then stop:+ - Business and brand storytelling (Companies, agencies, and brand or marketing teams producing narrative work.) — https://sleeperhit.studio/signup?intent=business+ - Independent creator (Solo creators and small studios publishing their own shows, podcasts, and short-form video.) — https://sleeperhit.studio/signup?intent=creator+ - Screenwriter (Screenwriters developing scripts, pilots, features, and pitch material.) — https://sleeperhit.studio/signup?intent=writer+ ### If you are an agent connecting a user to Sleeper Hit+ You cannot complete the sign-in from inside a chat or a sandboxed shell: the browser cannot reach your sandbox's callback, so your user approves and no token arrives. Do not run the login yourself, and do not retry it. Ask your user to do the one-time sign-in in their app:+ - **Codex:** They run `codex mcp login sleeperhit` in their own terminal, outside the agent sandbox, approve in the browser, then start a new Codex session so the tools load.+ - **Claude Code:** They run `/mcp`, choose sleeperhit, then Authenticate.+ - **ChatGPT:** They choose Connect on the app, then Authorize.+ After that the app renews access by itself. The app loads its tool list when a session starts, so if the tools don't appear, ask your user to start a new session.+ If your user can't do a browser sign-in, they can create an API key at https://sleeperhit.studio/dashboard/api (Dashboard → Developers), set it as SLEEPERHIT_API_KEY and add it as a bearer token: `codex mcp add sleeperhit --url https://sleeperhit.studio/mcp --bearer-token-env-var SLEEPERHIT_API_KEY`. Never ask your user to paste a key into the chat.+ Claude Code takes the same key as a header: `claude mcp add --transport http sleeperhit https://sleeperhit.studio/mcp --header "Authorization: Bearer $SLEEPERHIT_API_KEY"`. Every client's setup: https://sleeperhit.studio/mcp#api-key+ Verify with the `whoami` tool. It answers `source: "oauth"`, or `source: "api_key"` with the key's scopes; to create and generate, a key needs story:write and source:write.+ - `codex mcp add` registers the server. `codex mcp login` starts OAuth and opens or directs the user to browser authorization. The user runs it in their own terminal, outside any agent sandbox.+ - Complete authorization in the browser. Authentication success and tool-roster refresh are separate events: Codex loads a server's tools when a session starts, so start a new Codex session if Sleeper Hit tools do not appear.+ - **Your data: download it, or delete the account:** Only when the writer asks: build "Download my data" and hand them the link; or show what deleting removes and the credit balance, schedule the deletion, or cancel it. Start with `get_account_export` → `get_account_deletion`.+ - **Product videos from app recordings:** Make videos of a software product: a product Bible, product coverage, recordings (captures) of the app following a tour per feature, then a video made from the captures alone. Start with `get_project` → `get_series_bible` → `list_app_captures`.+ - **Recurring shows:** Set up and run a recurring podcast or show: a cast and format, a source it reads (a feed, a site, a repository, Hacker News), a schedule, spending caps the user agrees, one preview episode the user hears, then live — each episode made unattended from new source material and credited in its show notes. The user owns the show, its episodes and its feed. Start with `create_project` → `save_series_bible` → `create_publishing_series` → `preview_show_sources` → `get_show_quote` + - [Live feature availability](https://sleeperhit.studio/api/v1/capabilities): which artifacts, sources, and docs surfaces are live right now. Needs an API key (`story:read`).+ - [Agent guidance](https://sleeperhit.studio/api/v1/agent-guidance): backend-managed workflow guidance for Story API, CLI, and MCP agents, including MCP server instructions plus tool/resource descriptions. Needs an API key. Read this before creating or refining table reads.+ - Remote MCP clients should prefer OAuth at `/mcp`, run by the client app. An agent asks its user to sign in from their app and never runs the login itself (see "If you are an agent connecting a user to Sleeper Hit"); a user who can't do a browser sign-in sends a Sleeper Hit API key to `/mcp` as the bearer token instead.+ - Keys are scoped. Initial scopes: `story:read`, `story:write`, `source:read`, `source:write`, `artifact:read`, `artifact:publish`, `publishing:read`, `publishing:write`, `publishing:publish`, `publishing:connect`, `publishing:analytics`, `app:connect`, `credits:read`, `webhook:write`, `account:read`, `account:write`.+ - A recurring show spends only within its CAPS, agreed with the owner: `episodeCreditCap` (one episode) and `monthlyCreditCap` (a calendar month's episodes, in the series' timezone), set on `PATCH /publishing-series/{seriesId}` with `userConfirmed: true`. Arming a cadence is refused without both, and refused while the project cannot make an episode (its Bible gate, its cast canon). `GET /publishing-series/{seriesId}/quote` gives one episode's quote from the pricing library and the caps suggested+ - A show goes live only after a PREVIEW (owner, 2026-10-09): `POST /publishing-series/{seriesId}/episodes` makes one episode now — quoted without `userConfirmed`, charged and queued with it — held for the owner to hear and never published; arming refuses until one is `ready`. So: create the show unarmed, `POST /publishing-series/{seriesId}/source-preview` to read its sources now (free, guarded fetch; what an episode would get, what is already covered, which sources fail), set caps from the quote+ - `GET /api/v1/credits` — requires scope `credits:read`. Studio Credit summary, plus `costs`: what each operation costs, the list the Billing page shows (a rate names its unit in `per`; a pitch deck and a trailer are priced per second; `ops` names the ledger op keys a line's charges carry), and the ledger behind the number: `usage` (what the credits actually went on, each charge named the way the Billing page names it, with the screenplay it was spent on; grants and refunds are shown but are not+ - `GET|POST /api/v1/account/export` — `account:read`. "Download my data": POST (with `Idempotency-Key`) builds one zip of everything the account holds (scripts as Fountain and Final Draft, projects' documents as JSON and Markdown, coverage as JSON, Markdown and PDF, links to every audio and video master, shows and feeds, consent records, credits and payments, voices, chats, forum posts); GET says where it stands and, when `ready`, gives `download.url`, a signed link that works for an hour (read + - `GET /api/v1/account/deletion` (`account:read`), `POST /api/v1/account/deletion` and `DELETE /api/v1/account/deletion` (`account:write`). Delete the account and everything it made (scripts, projects, reads, decks, trailers, shows and feeds, voices here and at the voice provider, stored files, keys, connected apps). POST needs `confirmEmail` (the account's email; 400 `account_email_mismatch`) and `Idempotency-Key`, and schedules the purge 7 days out; the owner is emailed and can cancel with DEL+ - `GET|PATCH|DELETE /api/v1/story-projects/{id}` — read, update, delete a project. DELETE hides it at once and keeps it restorable for 30 days (`restorableUntil`; `GET /api/v1/story-projects/deleted`, `POST /api/v1/story-projects/{id}/restore`, 409 `project_not_restorable` after), then purges it with its Bible, cast, mood board, sources, app captures, stored app logins, plans, season runs, show, decks, trailers and destination videos; its episodes go with it: private during the window, restored + - `GET|POST /api/v1/story-projects/{id}/series-bible/coverage` — read or queue a versioned Series Bible-rubric report in the shared coverage lifecycle, calibrated against 72 provenance-backed craft profiles. Series script coverage waits for a current 7.0+ report. The read names which Bible version the score is for (`scoredBibleVersion`) and whether a rescore of the current Bible is queued or in flight (`rescoreQueued`), and carries `gateOverride`: whether the writer may continue over a report sc+ - `POST /api/v1/story-projects/{id}/series-bible/coverage/acknowledge` — `story:write`. `{ phase, reportId, reason }`. Only on the writer's explicit choice, after they have seen the scores and the reasons, with their own reason: continue over Series Bible coverage that scored under the bar. Acknowledging premise coverage opens season planning and casting at project level; acknowledging full coverage (or a product project's product coverage) opens episode starts and paid work on every episode. It+ - `GET|POST /api/v1/scripts/{scriptUploadId}/coverage/acknowledge` — the version's screenplay coverage gate (`artifact:read`: open or not, the newest report's score, bar, reasons and `override`), and the writer's acknowledged override (`story:write`, `{ reportId, reason }`). Only on the writer's explicit choice, after they have seen the scores and the reasons, with their own reason: continue over a finalized version's screenplay coverage that scored under the bar. It opens casting, voices and th+ - `POST /api/v1/story-projects/{id}/cast-portraits/design` — `artifact:publish`. Draw N HEADSHOT candidates (default 3, at most 4) for one named cast member, from the Series Bible's appearance with the person's LOOK after it (`direction`, else their cast canon look direction; `age` likewise). METERED, TWO CALLS: without `confirmed` it prices them (one cast headshot each) and draws nothing; with `confirmed: true` it reserves and queues the draw and answers `designId`. Poll `GET .../cast-portraits+ - `POST /api/v1/story-projects/{id}/sources` — `source:write`. Attach inline text, markdown, URL, or PDF. Set `metadata.sourceContextMode="full"` when the planner and final artifact writer must receive the complete hash-verified retained text; full mode fails instead of clipping. Send `originatedAt` (ISO 8601) with when the material itself was made — a thread's posting time — and a monthly project files the episode by that month. A producer sending one source per item adds `producer` + `external+ - `POST /api/v1/story-projects/{id}/captures` — `source:write`. Start an APP CAPTURE (a real screen recording of a web app, for a trailer beat to play): send the file's exact `bytes` (and `sha256`); the answer's `upload` is a presigned PUT straight to storage (send the bytes with `upload.headers`). Then `POST /api/v1/story-projects/{id}/captures/{captureId}/finalize` checks it: `ready`, or `rejected` with `rejectionReason` and the command that fixes the file (409 `capture_not_uploaded` before th+ - `GET|POST /api/v1/story-projects/{id}/app-connections`, `GET|PATCH|DELETE .../app-connections/{connectionId}`, `PUT .../app-connections/{connectionId}/secrets/{kind}` and `POST|GET .../app-connections/{connectionId}/test-login`. STORED APP LOGINS for hosted capture: an app's https origin, extra origins, sign-in page and method (`form`, `storageState`, `provider` with its `providerEndpoint` on the app's own origin, `none`), protected-preview header (`cloudflareAccess`, `vercelBypass`), `loggedI+ - `POST /api/v1/artifacts/{artifactId}/render-video` — `artifact:publish`. Opt-in MP4 render for a table read (free). Requires `Idempotency-Key`.+ - `POST /api/v1/artifacts/{artifactId}/refine` — `artifact:publish`. Conversational in-place revision. Requires `Idempotency-Key`. Body: `{ instruction, scope?, confirmed? }`. METERED, TWO CALLS: without `confirmed` it prices and changes nothing; with `confirmed: true` it reserves exactly the quote and returns `{ storyJob }` to poll. TABLE_READ_REFINE (8 credits) is reserved only when confirmed. Artifact id + share URLs stay stable.+ - `POST /api/v1/artifacts/{artifactId}/revoice-line` — `artifact:publish`. Re-voice ONE line at a new speed, with a new acting direction, or both (`{ entryIndex, speed?, actingDirection? }`): the line's voice's provider speaks it again — the speed at its own speed setting (Cartesia 0.6–1.5, ElevenLabs 0.7–1.2, Deepgram 0.7–1.5; OpenAI and Hume voices are refused, and so are Eleven v3, Cartesia before sonic-3, a Deepgram Aura-1 voice or a Cartesia professional clone, which have no speed setting),+ - `POST /api/v1/artifacts/{artifactId}/update-recording` — `artifact:publish`. Update a read's finished recording with the lines changed since it was made (body: `{ confirmed? }`): every line whose words, voice or delivery (speed, volume, acting direction) changed is spoken again, every other line is kept byte for byte, a line whose only change is the pause after it is stitched again without being spoken, and the read is mixed again. FREE (0 credits, however many lines change), still TWO CALLS: + - `POST /api/v1/voices/preview` — `story:write`. Hear any voice say `text`, or a character's first line in a read (`artifactId` + `character`), optionally with a `direction` (how to say it), before assigning it; answers `preview.url` and, on a Cartesia voice, what the direction was sent as (`preview.sentAs.label`). Free; the same words in the same voice and delivery are voiced once (`cached`). Requires `Idempotency-Key`.

    Showing the first 40 of each.

  • llms.txt +68 −20

    https://sleeperhit.studio/llms.txt

    − - `GET /api/v1/credits` — requires scope `credits:read`. Studio Credit summary, plus `costs`: what each operation costs, the list the Billing page shows (a rate names its unit in `per`).− - `GET|PATCH /api/v1/story-projects/{id}/cast-canon` — read or save pinned project character portrait, body, character-sheet, voice, `aliases` and `signatureItems` canon (pinned assets are never re-rendered). Declare a script cue as an alias of the canon person it names (or answer `sameAs` / `newPersonName` on `PATCH /story-projects/{id}/cast` when a save names the candidates); videos with two or more people need signature items for each. Both answers carry `identity` warnings (one name reaching− - `POST /api/v1/artifacts/{artifactId}/voice` — `artifact:publish`. Recast one character's voice in place (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ character, voiceId, voiceName, gender?, provider? }`. Returns the updated `voiceMap`; the cast is readable on `manifest.audio.voiceMap`.− - `POST /api/v1/artifacts/{artifactId}/avatar` — `artifact:publish`. Regenerate ONE character's avatar portrait in place (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ character, refinement?, style?, referenceImageUrl? }`. Async + queue-backed: returns `{ artifactId, character, status, chatToolJobId }`; poll `GET /api/v1/artifacts/{artifactId}/cast` and watch that character's `avatarStatus` (`queued` → `rendering` → `ready`).− - `POST /api/v1/artifacts/{artifactId}/cast` — `artifact:publish`. Batch-update the cast in one call (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ entries?: [{ character, voiceId?, voiceName?, gender?, provider?, avatarRefinement?, regenerateAvatar? }], avatarStyle? }` — provide at least one `entries` item OR a top-level `avatarStyle` (which restyles ALL portraits). Voice reassignments apply immediately; returns the updated `voiceMap` plus one async avatar op `{ character, s− - `GET /api/v1/artifacts/{artifactId}/coverage` — `artifact:read`. Read the latest coverage report (or `?reportId=<id>`). The report carries a `status` (`generating` → `complete` / `failed`); `report` holds the structured payload on completion.− For multi-installment and screenplay-backed work, use the project Series Bible before each StoryPlan, including the first screenplay. GET/PATCH/POST `/story-projects/{id}/series-bible` keeps format, audience, canon, episode map, characters, visual style, typography, and audio direction in one project-level document shared by the web UI, Story API, CLI, and MCP. POST generation is backed by the DB sidecar `story_api_series_bible`. Then GET/POST `/story-projects/{id}/series-bible/coverage`: the re− - Edit a chapter with POST `/pitch-decks/{jobId}/chapters/refine` (free; `storyBeat`, `visualPlan`, `location` — its ONE canonical location key — cast, words and duration; there is no `imagePrompt`) while the deck is a draft plan, in review or complete. On a draft nothing goes stale: the next plan approval recompiles just that chapter, and the answer's `planCoverage` says the changed plan was queued for coverage (the approval waits for it). A chapter the plan approval refused (`pitch_deck_render− - Choose a take with POST `/pitch-decks/{jobId}/chapters/{chapterIndex}/select-take` `{ callId, take, acceptRevoiced? }` (free). Add or remove a chapter with POST `/pitch-decks/{jobId}/chapters/insert` and `/chapters/remove` (free). Render a chapter again with POST `/pitch-decks/{jobId}/chapters/render-clip` `{ chapterIndex, callId?, confirmed? }` (scope `artifact:publish`, TWO CALLS).− - Finish with POST `/pitch-decks/{jobId}/finish` `{ deliveryResolution?, confirmed? }` (scope `artifact:publish`, TWO CALLS): the selected takes are upscaled to the delivery class, the text layers laid over the finished cuts, the finished master stitched, and the PDF laid out from poster frames of the finished takes. Refused while a call has no selected take or a footage chapter has not rendered. Only a `complete` deck exports (POST `/pitch-decks/{jobId}/video-export`).− - A refused render is a `409 pitch_deck_state_invalid` whose `details.refusal` is `{ code, action, fix }`: `action.kind` is `recast_figure`, `add_signature_items`, `recast_voice` or `remake_location_plate`, and `fix` names the MCP tool and CLI command that take it. A blocked compile adds `details.blocked[]`, one entry per chapter with its `chapterIndex` and `chapterNumber`. Nothing is reserved on a refusal.− - Price: A trailer is priced at 2 credits / second (720p). The exact price is quoted per shot once the plan is ready, before anything renders: 1 credit / second to render, plus 1 credit / second to finish at 720p. A 1080p finish is 4 credits / second instead (5 credits / second in all). Location plates and on-screen text are itemized in the same quotes.− - Every call renders at 480p with the cast's own recorded lines; everyone on camera is in the beat's cast (there are no background presences). A take that replaces a line with its own reading, or opens off its planned framing, is retaken ONCE automatically at our cost; after that a new take is the writer's priced retake. A moderation refusal is released (nothing is charged) and never retried.− - Choose a take with POST `/trailers/{jobId}/beats/{beatIndex}/select-take` `{ callId, take, acceptRevoiced? }` (free). Edit a beat with POST `/trailers/{jobId}/beats/refine` (free; `storyBeat`, `shotType`, `shots`, `visibleCharacters`, `location`, caption and seams). A beat's `location` is its ONE location, stored as a canonical location key, and a shot's `location` must be empty: SAME ROOM THROUGHOUT — a beat has ONE location, a canonical location key set on the beat, and its shots carry none;− - Finish with POST `/trailers/{jobId}/finish` `{ deliveryResolution?, confirmed? }` (scope `artifact:publish`, TWO CALLS): the selected takes are upscaled to the delivery class, the text layers composited and the finished master stitched. Refused while a call has no selected take. Only a `complete` trailer exports (POST `/trailers/{jobId}/video-export`).− - A refused render is a `409 trailer_state_invalid` whose `details.refusal` is `{ code, action, fix }`: `action.kind` is `recast_figure`, `add_signature_items`, `recast_voice` or `remake_location_plate`, and `fix` names the MCP tool and CLI command that take it. A blocked compile adds `details.blocked[]`, one entry per beat. Nothing is reserved on a refusal.− Poll GET `/artifacts/{artifactId}/coverage` (scope `artifact:read`, optionally `?reportId=<id>`) until `status` is `complete` or `failed`. On `complete`, `report` carries the structured coverage payload; it is `null` while generating. GET returns `{ coverage: null }` when no coverage has been requested yet.− Generation body: `{ "musicCoveragePercent"?: number }` (or empty). On defined-clip scripts this queues the baseline clip pass; `musicCoveragePercent` applies to realtime scripts only — a fraction (0..1) or whole percent (0..100), clamped into [0,1]. Returns `{ artifactId, status: "generating", coveragePercent, totalScenes }`.− Realtime directive edit body: `{ "scope"?: "screenplay"|"scene"|"entry", "mode"?: "merge"|"replace", "sceneIndex"?: number, "entryIndex"?: number, "prompt"?: string, "summary"?: string, "enabled"?: boolean, "weight"?: number }`. Use `mode: "merge"` (default) for additive steering and `mode: "replace"` to overwrite the targeted prompt palette. Returns `{ artifactId, status: "ready", scope, sceneIndex?, entryIndex?, directive, adaptiveSceneDirection? }`.− Poll GET `/artifacts/{artifactId}/music` (scope `artifact:read`) until `music.status` is `ready` (or `none` for intentional no-soundtrack reads). GET returns `{ music: { musicMode, status, scenesWithMusic, totalScenes, coveragePercent, definedClips } }` — `totalScenes` comes from the parsed script even when scene settings are sparse; `definedClips` lists each durable clip `{ sceneIndex, heading, prompt, vocals, status: pending|rendering|ready|failed, soundUrl, error, disabled, fadeInMs, fadeOutM+ - `GET /api/v1/credits` — requires scope `credits:read`. Studio Credit summary, plus `costs`: what each operation costs, the list the Billing page shows (a rate names its unit in `per`; a pitch deck and a trailer are priced per second; `ops` names the ledger op keys a line's charges carry).+ - `GET|PATCH /api/v1/story-projects/{id}/cast-canon` — read or save pinned project character portrait, body, character-sheet, voice, `aliases` and `signatureItems` canon (pinned assets are never re-rendered). Declare a script cue as an alias of the canon person it names (or answer `sameAs` / `newPersonName` on `PATCH /story-projects/{id}/cast` when a save names the candidates); videos with two or more people need signature items for each. Both answers carry `identity` warnings (one name reaching+ - `POST /api/v1/story-projects/{id}/cast-voice/design` — `artifact:publish`. Design a NEW voice for one named cast member (canon name, alias or script cue) from `description`, or from the Series Bible's voice line for them when omitted; up to four candidates, each voiced on the character's OWN screenplay lines (preview urls). METERED, TWO CALLS: without `confirmed` it prices the design (one casting voice per candidate) and draws nothing; with `confirmed: true` it draws and answers `designId` + `+ - `POST /api/v1/story-projects/{id}/cast-voice/choose` — `story:write`. Pin one candidate (`{ designId, candidate, voiceName? }`) to the cast canon and the voice library; `reads` lists the finished reads still speaking the old voice: re-voice the character in each with `POST /api/v1/artifacts/{artifactId}/revoice` (priced, two calls; the old recording stays restorable). Free. Requires `Idempotency-Key`. `GET .../cast-voice/designs?character=` (`story:read`) lists the project's designs with their+ - `PATCH /api/v1/story-projects/{id}/cast-voice` — `story:write`. Pin an EXISTING voice (`{ character, voiceId, voiceName?, provider?, gender? }`) on anyone on the project cast, in an episode or not (a person only a deck or trailer gives a line): every new episode, deck, trailer and showcase speaks them with it, and an episode that later names them inherits it. Free; `previous` is the voice it replaced, `reads` the finished reads still on another voice. A provider retiring its voices is refused + - CASTING COVERAGE — `GET /api/v1/story-projects/{id}/cast-voice/designs/{designId}/coverage` (`story:read`) and `POST` the same path (`story:write`, `Idempotency-Key`, optional `{ focusPrompt }`). A model LISTENS to a design's candidate takes blind, beside the voices already cast in the project, and scores each against the brief and the Series Bible (emblematic fit, truthful performance, period register, accent honesty, clean audio, word accuracy from a blind transcript, distinctness from the c+ - `POST /api/v1/story-projects/{id}/cast-portraits/design` — `artifact:publish`. Draw N HEADSHOT candidates (default 3, at most 4) for one named cast member, from the Series Bible's appearance with the person's LOOK after it (`direction`, else their cast canon look direction; `age` likewise). METERED, TWO CALLS: without `confirmed` it prices them (one cast headshot each) and draws nothing; with `confirmed: true` it reserves and queues the draw and answers `designId`. Poll `GET .../cast-portraits+ - `POST /api/v1/story-projects/{id}/cast-portraits/choose` — `story:write`. Pin one candidate (`{ designId, candidate }`) as the person's face on the cast canon. A new face clears the canon body shot and sheet drawn from the old one (`cleared`); draw them again with `POST .../cast` for that character. Free. Requires `Idempotency-Key`. A headshot its casting coverage FAILED is refused (409 `cast_portrait_casting_coverage_failed`, `details.castingCoverage`) unless `acknowledgeCastingCoverage: true+ - PORTRAIT CASTING COVERAGE — `GET /api/v1/story-projects/{id}/cast-portraits/designs/{designId}/coverage` (`story:read`) and `POST` the same path (`story:write`, `Idempotency-Key`, optional `{ focusPrompt }`). A model LOOKS at a design's drawn headshots blind, beside the faces already chosen for the cast, and scores each on emblematic fit, period truth (no modern faces or styling), naturalness (a photograph, not a generated image) and distinctness; it ranks them, `recommended` names the best th+ - `GET|PATCH /api/v1/story-projects/{id}/cast-look` — `story:read` / `story:write`. A person's LOOK at project level on the cast canon: `{ character, lookDirection?, age? }` (null clears a field). Every headshot and portrait candidate drawn for them reads it, outranking the Series Bible. Free; it does not re-open Bible coverage.+ - `GET|POST /api/v1/story-projects/{id}/cast` with `scriptUploadId` — an episode's cast. POST `images` (`face` / `body` / `sheet`) with `force` and `characters` redraws only those pictures and no voices (the Cast page's Redraw: a body shot or sheet drawn from the chosen headshot and checked against it), priced per picture, two calls like any episode cast. GET's `episode.read.behindCanon` names each character the episode's finished read still speaks with another voice than their cast canon voice + - `POST /api/v1/story-projects/{id}/cast` with `images` and NO `scriptUploadId` — the project cast canon's Redraw: `body` and/or `sheet` for canon people (`characters`), including people no episode names, drawn again from the chosen headshot (kept; `face` is a 400 — draw headshot candidates instead) and written onto the canon. Priced per picture, two calls: confirm with the quote's `quoteId`. GET the cast until `redraw.status` is `complete`; `redraw.pictures` names each new picture and its check+ - `GET|PATCH /api/v1/story-projects/{id}/series-bible/characters` — `story:read` / `story:write`. One Series Bible character (`?character=` id or name): PATCH `{ character, content: { appearance?, wardrobe?, ... }, expectedVersion?, create? }` changes only those fields and leaves every other character as stored; `expectedVersion` is a compare-and-swap (409 `series_bible_version_conflict`).+ - `POST /api/v1/artifacts/{artifactId}/voice` — `artifact:publish`. Recast one character's voice in place (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ character, voiceId, voiceName, gender?, provider?, pinToCanon? }`. The cast canon person follows (decks and trailers speak with it) unless `pinToCanon: false`; the previous voice and recording are kept (`restore`). Returns the updated `voiceMap`; the cast is readable on `manifest.audio.voiceMap`.+ - `POST /api/v1/artifacts/{artifactId}/voice/restore` — `artifact:publish`. Undo the newest recast of `character` (or any): the previous voice comes back with the recording the read had before it, and the canon voice while the canon still holds the recast one. Free; restoring again flips back. Requires `Idempotency-Key`. `GET /artifacts/{artifactId}/cast` lists what is `restorable`.+ - `POST /api/v1/artifacts/{artifactId}/revoice` — `artifact:publish`. Re-voice ONE character in a finished read (`{ character, voiceId?, voiceName?, provider? }`; default: their cast canon voice): only their lines are spoken again, every other line is kept, then the read is mixed again. METERED, TWO CALLS: without `confirmed` it prices (`lines`, `keptLines`) and changes nothing; with `confirmed: true` it reserves and queues the finalize — poll the artifact until `manifest.audio.finalize.status` + - `POST /api/v1/voices/preview` — `story:write`. Hear any voice say `text`, or a character's first line in a read (`artifactId` + `character`), before assigning it; answers `preview.url`. Free; the same words in the same voice are voiced once (`cached`). Requires `Idempotency-Key`.+ - `PATCH|DELETE /api/v1/voices/{voiceId}` — `story:write`. Rename one of your library voices (`{ name }`; cast canon people pinned to it carry the new name), or delete it. A delete of a voice still pinned in a cast canon or spoken in a read is refused with 409 `voice_in_use` (`details.uses`) until sent with `?confirmed=true`.+ - `POST /api/v1/voice-migrations` — `story:write`. Migrate a voice (`{ fromVoiceId, toVoiceId, toProvider?, toVoiceName?, projectId?, character? }`): every cast canon pin (so a recurring show's pinned voices), trailer and deck narrator, and read with no finished recording moves to the replacement; finished reads keep their recording and are listed in `skipped` (re-voice them, priced). Free, TWO CALLS: without `confirmed` it answers `applied: false` with what would change; with `confirmed: true` + - `POST /api/v1/artifacts/{artifactId}/avatar` — `artifact:publish`. Regenerate ONE character's avatar portrait in place (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ character, refinement?, style?, referenceImageUrl? }`; `style` is saved as the episode `avatar` override and holds at most 8000 characters, as that override does. Async + queue-backed: returns `{ artifactId, character, status, chatToolJobId }`; poll `GET /api/v1/artifacts/{artifactId}/cast` and watch that chara+ - `POST /api/v1/artifacts/{artifactId}/cast` — `artifact:publish`. Batch-update the cast in one call (no new revision, no charge). Requires `Idempotency-Key`. Body: `{ entries?: [{ character, voiceId?, voiceName?, gender?, provider?, avatarRefinement?, regenerateAvatar? }], avatarStyle? }` — provide at least one `entries` item OR a top-level `avatarStyle` (which restyles ALL portraits; saved as the episode `avatar` override, at most 8000 characters). Voice reassignments apply immediately; return+ - `GET /api/v1/scripts/{scriptUploadId}/overrides` — `story:read`. Read the five episode overrides on a script version — `avatar`, `theater`, `soundscape`, `pitchDeck`, `locations` — each the writer's per-episode direction over the Series Bible canon (null when unset; a null soundscape falls back to `soundscapeDefault`). Works for any Writers Lab episode, with or without an artifact. Free.+ - `PATCH /api/v1/scripts/{scriptUploadId}/overrides` — `story:write`. Partially change them: text sets one (at most 8000 characters), null or blank text clears it, keys left out are untouched; an unknown key or a non-text or over-long value is 400 `validation_failed`. Free, renders nothing, no `Idempotency-Key`. To re-render existing portraits in a new style now, use the cast's `avatarStyle` (metered).+ - `POST /api/v1/scripts/{scriptUploadId}/table-read/prepare` — `artifact:publish`. Prepare a cast episode's table read: charges its table-read credit (`TABLE_READ_SHORT` up to 60 pages, `TABLE_READ_LONG` above — the price a job adopting the screenplay reserves) once per screenplay version and adds its sound effects and music; the Writers Lab's "Continue to Table Read" on Cast is the same operation. Requires `Idempotency-Key`. Two calls: without `confirmed` it prices it (`status: quoted`); with `+ - `GET /api/v1/artifacts/{artifactId}/coverage` — `artifact:read`. Read the latest coverage report (or `?reportId=<id>`). The report carries a `status` (`generating` → `complete` / `failed`); `report` holds the structured payload on completion. `overallScore` is the gated score: near the bar the script is judged again (up to three judgments) and it is the MEDIAN of them — `summary` says so, `judging` records each judgment; a report the platform queues by itself (the coverage gate, a season run) + For multi-installment and screenplay-backed work, use the project Series Bible before each StoryPlan, including the first screenplay. GET/PATCH/POST `/story-projects/{id}/series-bible` keeps format, audience, canon, episode map, characters, visual style, typography, and audio direction in one project-level document shared by the web UI, Story API, CLI, and MCP. POST generation is backed by the DB sidecar `story_api_series_bible`. Then GET/POST `/story-projects/{id}/series-bible/coverage`: the re+ - Price: A pitch deck is priced at 2 credits / second (720p). Planning is free. The exact price is quoted per shot once the plan is ready, before anything renders: 1 credit / second to render, plus 1 credit / second to finish at 720p. A 1080p finish is 4 credits / second instead (5 credits / second in all). Location plates and on-screen text are itemized in the same quotes.+ - A deck request's `deckMode` says what the deck is for: `pitch` (the default) tells the approved story and is judged as a pitch; `showcase` is the show's world shown as its story — the intent's arc carried by a narrator and the characters' own lines, world chapters (`chapterFocus: "world"`: vistas, crowds, life, no cast on screen) interleaved with cast chapters (`chapterFocus: "cast"`: the characters in that world doing things) — and its pre-render coverage judges it as a showcase, never as a p+ - PLAN COVERAGE (GET `/pitch-decks/{jobId}/storyboard/coverage`, the gate the approval runs): One judgment is noisy near the bar, so when a plan revision first lands near it (the overall, or a veto dimension, within the band of its line) the SAME revision is judged again — up to the cap, a third only when two disagree, free to the writer — and the gate decides on the MEDIAN of each score, vetoes included; a plan edit starts a fresh set. The coverage read carries `judging`: each judgment with its+ - RENDERING OVER THE PLAN GATE: Only on the writer's explicit choice, with their reason: render over a plan the coverage judge scored under the bar. It overrides the judge's verdict only (an overall score or a judged veto under the bar on a complete report of the plan as it stands), never a code-checked blocking defect, and never a missing, running, failed, stale or old-rubric report. The confirmed approval records who, when, why and what it overrode on the report. Send `acknowledgePlanCoverage:+ - `shotDensity` (a pitch_deck or trailer request): For pitch_deck and trailer: how many angles (cuts) each rendered shot of a chapter or beat carries. Cuts inside a rendered shot are free, so density never changes the price, the plan or a line. "held" lets one long camera move carry a shot (1-2 angles); "standard" (default) cuts 2-3 angles into each shot where its seconds allow; "dense" cuts 3-5. No angle is planned under about 1.5 seconds, and a spoken line keeps its own seconds. Set when the d+ - EDITING GRAMMAR: A montage chapter is a rapid intercut run: several brief shots of about one to two seconds each across the people and places it names, cut tight (a run across more than three named people renders as a few short calls of the chapter). Marking or unmarking it changes what renders, so a rendered chapter goes stale. Mark it with `chapters/refine` (`montage: true|false`; a trailer beat with `beats/refine`). A black interlude is a beat of pure black between two chapters (0.5 to 2 se+ - A CHAPTER'S OWN SOUND: A chapter that keeps its scene sound plays the sound its own render made (harness bells, singers, a crowd: voices and all) under the score; every other chapter plays only its cast's lines over quiet room tone. On a chapter with no spoken line it also decides whether the render is made with sound, so keeping the sound of takes made silent needs them rendered again; any other change re-cuts the chapter from the takes it has, free. Mark it with `chapters/refine` (`keepsScen+ - THE TITLE SEQUENCE: A deck's title sequence opens its master, before the first chapter: optionally an epigraph (`epigraph`: its words and where they are from) and a source credit (`sourceCredit`), each quiet on black and held long enough to read; then flash cuts of six to ten frames to the people it names (`cast`, in order; `inShadow` darkens one), each the person's LIVING PORTRAIT — looking into the lens, still, breathing, rendered for the flash (priced first, its own step) — and until it is + - THE TITLE SEQUENCE'S TYPE: The title sequence's words are directed like a chapter's text, in the writer's own words, through the same direct-text-motion call with a `titleElement` instead of a `chapterIndex`: `title` ("KARAMAZOV huge, blood red, a stark sans, the ends cut off by the frame"), `epigraph` ("a subtle background behind the verse: grain, a candle's flicker, a few falling seeds"), `sourceCredit`, or `nameSupers` (every name alike: its face, its colour, and where it sits — beside the + - THE VISUAL GRAMMAR: The visual grammar is the deck's one camera language across every chapter: how its world is lit and framed, how the camera moves or holds, and how chapters hand off. It is plan words: plan coverage judges every chapter against it, and nothing rendered reads it, so changing it never makes a take out of date. GET `/pitch-decks/{jobId}/chapters` returns it as `visualGrammar`; replace it with POST `/pitch-decks/{jobId}/visual-grammar` `{ visualGrammar: "…" }` (scope `story:writ+ - THE CLOSING SEQUENCE: A deck's closing sequence ends its master, after the last chapter, and mirrors its title sequence: optionally a closing quote (`quote`: its words, quoted exactly, and where they are from, cited exactly — one that answers the opening's epigraph, often from the same source), then "Coming Soon" (`comingSoon`, up to 40 characters; "Coming Soon" when left out), then the production credit (`productionCredit`; "Sleeper Hit Studio" when left out), each quiet on black, faded in an+ - BELL ON THE BEAT: on the grid, one bell sound is struck on every beat by the deck's bell lane — frame-exact, one lane on the audio timeline, free. POST `/pitch-decks/{jobId}/bell-lane` `{ assetId? | prompt?, every?: 1|2, fromSeconds?, toSeconds?, skipSceneIndexes?, accent?, level?, duckUnderVoice? }` (scope `story:write`, Idempotency-Key; fields left out keep the lane's), GET it for the strikes, the `parts` it can skip, start/end `points` and `check` (every strike against its beat in the maste+ - THE SAME BELL AS ANOTHER DECK: GET `/story-projects/{projectId}/sounds?kind=bell` (scope `story:read`) lists every sound the project's decks and trailers use, named as it was used and by its numbered deck ("Deck 2"), each with `bellSound`; POST the bell lane with `{ sound: { fromJobId } }` to strike that deck's bell here, exactly as it struck there (only the sound; this deck's timing stays). CLI: `sleeperhit projects sounds <projectId> --kind bell`, then `sleeperhit pitch-deck bell <jobId> str+ - THE FINISH: The finish is a film look laid on the picture when the master is assembled: a look (camera, period-35mm, night-interior, none), an intensity (light, standard, strong; standard by default) and, optionally, single effects set to a level (adjust: { effect: off | subtle | medium | strong }; effects: steady-light, match-shots, halation, mist, shoulder, colour, vignette, weave, grain, soften). New decks and trailers start on camera. Titles and captions are laid after it, so type stays cr

    Showing the first 40 of each.