---
title: "Direct how a deck's text looks and moves (a chapter's caption, the title sequence's words, or the closing sequence's cards)."
method: POST
path: "/pitch-decks/{jobId}/storyboard/direct-text-motion"
tags: ["Pitch Deck"]
---

# Direct how a deck's text looks and moves (a chapter's caption, the title sequence's words, or the closing sequence's cards).

`POST /pitch-decks/{jobId}/storyboard/direct-text-motion`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/pitch-decks/{jobId}/storyboard/direct-text-motion`
- Auth: HTTP bearer

Say in plain words how one chapter's on-screen text should move — "type it out letter by letter, then draw an underline beneath it" — and it is compiled into the bounded motion spec that chapter's text layer executes. NOT metered and NOT confirmed: it costs no credits and renders nothing, and re-directing REPLACES the treatment rather than adding to it, so there is nothing a confirmation would protect. Your own words are saved beside the compiled spec, so the next direction is not authored blind. Nothing MOVES on screen until the text layer is re-rendered with `storyboard/regenerate-text`, which IS metered. A chapter with nothing to move is refused with a 409 before anything is compiled — a chapter that is footage only, or one whose caption is still empty — and the refusal names the fix. THE TITLE SEQUENCE'S WORDS: send `titleElement` (title, epigraph, sourceCredit, nameSupers) instead of `chapterIndex` to direct how one looks and moves ("KARAMAZOV huge, blood red, the ends cut off by the frame"), or `clear: true` to put it back in the sequence's own type; the title sequence is drawn by the master, so a rendered deck's master is stitched again (free, `reassembling`) and no chapter renders. A title sequence with no such words (no epigraph yet, name supers off) is refused with a 409. THE CLOSING SEQUENCE'S CARDS: send `closingElement` (quote, comingSoon, productionCredit) to direct one the same way, or `clear: true` to put it back in the opening's look; a closing with no quote yet refuses `quote` with a 409. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- PitchDeckDirectTextMotionRequest: Say in plain words how one chapter's on-screen text should move (`chapterIndex` + `direction`) — or how one of the title sequence's words should look and move (`titleElement` + `direction`), or put one of those back in the sequence's own type (`titleElement` + `clear: true`) — or one of the closing sequence's cards (`closingElement` + `direction`, or + `clear: true` to put it back in the opening's look). Exactly one of `chapterIndex`, `titleElement` and `closingElement`. Free — no `confirmed` field, because there is no spend to confirm. 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 face on the left or the right, over the top of the picture, or under it; never over a face). The director compiles the sentence into a motion-text spec — the face (the show's, or a bundled grotesque or condensed grotesque), the colour, the size (up to edge to edge, wider than the frame so the frame cuts the first and last letters), how it moves, and a seeded background behind it (film grain, a breathing vignette, a flickering warm light, banks of fog rolling across the frame, slowly falling motes), as quiet or as strong and moving as asked ("the same fog as the verse, but stronger"), held under the words' own brightness (behind the blood-red title it is a haze of the same red) — and saves it with the sentence on the title sequence (`textMotion`). The words stay the sequence's: a direction says how they look, never what they say. `clear: true` puts an element back in the sequence's own type. Free: an LLM call, no credits; a rendered deck's master is stitched again with it, and nothing else renders (no chapter, no shot). A save of the title sequence keeps every direction (an element whose words are removed loses its own).
  - `chapterIndex` integer: The chapter whose on-screen text should move. The chapter's `chapterIndex`, exactly as the chapters read returns it: a key, not a position — a plan may key its chapters from 0 or from 1. A person's "chapter 2" is the chapter whose `chapterNumber` is 2; pass that chapter's `chapterIndex`.
  - `titleElement` 'title' | 'epigraph' | 'sourceCredit' | 'nameSupers': Instead of a chapter: one of the title sequence's words — title, epigraph (with where it is from), sourceCredit, or nameSupers (every super alike).
  - `closingElement` 'quote' | 'comingSoon' | 'productionCredit': Instead of a chapter: one of the closing sequence's cards — quote (with where it is from), comingSoon, or productionCredit.
  - `direction` string: How the text should look and move, in the writer's own words — e.g. "type it out letter by letter, then draw an underline beneath it", or "KARAMAZOV huge, blood red, a stark sans, the ends cut off by the frame". Required unless `clear` is true.
  - `clear` true: With `titleElement`: put it back in the title sequence's own type. With `closingElement`: put the card back in the opening's look.

## Response `200`

The direction now on the chapter (plus a link to watch it), or on the title sequence's word (with the sequence as every read shows it).

- PitchDeckDirectTextMotionAck: The direction now on the chapter (or on one of the title sequence's words). Nothing was charged. A chapter's text layer is re-rendered to see it move; a title sequence word is drawn by the master, which a rendered deck stitches again (free; `reassembling`).
  - `success` boolean, required
  - `chapterIndex` integer: The chapter directed (a chapter direction).
  - `titleElement` 'title' | 'epigraph' | 'sourceCredit' | 'nameSupers': The title sequence word directed (a title direction).
  - `direction` string, nullable, required: The writer's own words, saved beside the compiled spec so the next direction is not authored blind; null when a title sequence word was put back in its own type. A title direction is read back from the stored deck before it is reported (one another plan edit replaced is refused with 409 `pitch_deck_state_invalid`).
  - `look` string, nullable: What the master draws for a directed title sequence word, read from the stored spec rather than the writer's sentence: the face, size and colour of its words, or that the direction is a background only under its own type. Null when it was put back in its own type.
  - `previewUrl` string: Shareable link to watch this chapter's current render — so seeing what the direction did costs nothing (a chapter direction).
  - `titleSequence` PitchDeckTitleSequenceView: 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 made a still, silent close from the deck's own takes or another rendered deck of the project (free), never one in which anyone speaks or moves; a still canon portrait image only when the writer asks for one (`flashSource: 'portrait'`); then the title (`title`, one word, in capitals) in a bold sans on black. The flash cuts and the title run `seconds` (3 to 5). With `nameSupers: true` each flash cut carries the person's NAME in the TITLE'S LOOK — the face and colour the title is drawn in (blood red, the heavy condensed sans, when the title is directed so), uppercase, large enough to read at 480p — on the bell beat with the face, set in the black BESIDE the picture (or over the top of it), never over the face: LABEL is the first word of the person's canon name in capitals unless their cast entry sets `label`, and `role` (up to 40 characters, optional) is a smaller line under it; a person `inShadow` gets no name unless their `label` is set (the shadow withholds who they are); how the names look and where they sit is directed with `titleElement: nameSupers`. With `beatGrid: true` the intros cut on the bell's beat: from the sequence's first frame a beat every `beatSeconds` (0.5 to 4; 2 when left out), each flash cut starting on a beat and holding exactly one beat (the one in shadow too), the title on the next beat for `titleBeats` beats (1 to 8; 2 when left out) — their seconds are then derived (beats × beatSeconds), and a score composed to the deck strikes its bell on every intro and on the title. Saving it is free: nothing is rendered for it (a motion close is its own priced step). `enabled: false` keeps it without playing it. How its words look and move is directed separately (`titleElement` on the direct-text-motion call; read back as `textMotion`), and a save keeps those directions.
    - `enabled` boolean, required: Whether the deck opens on it. False keeps it without playing it.
    - `title` string, required: One word, shown in capitals ("KARAMAZOV").
    - `cast` object[], required: Who the flash cuts go to, in order: the father first, then each son, the one in shadow last. Each must be in the cast canon when the project has one.
      - `name` string, required: An exact canon cast name, or an alias the canon lists.
      - `inShadow` boolean: Show them in shadow: a dark flash, the face half-lost. A person in shadow gets no name super unless their `label` is set.
      - `role` string: A smaller line under their name ("the father"), shown when `nameSupers` is on. Leave it out for the name alone (the default).
      - `label` string: The name their super shows, set in capitals, instead of the first word of their canon name ("GRUSHENKA"). Setting it is also what gives a person in shadow a super.
      - `flashSource` 'deck' | 'project' | 'motion' | 'portrait': Where their flash cut is taken from first: `motion` (their living portrait: into the lens, still, breathing, rendered for the flash, priced first), `deck` (a still, silent close from this deck's shots), `project` (a still, silent close from another rendered deck of the project, free) or `portrait` (their STILL portrait image — only when the writer asks for one). Left out: their living portrait, else a still, silent close from this deck, then the project; a close in which anyone speaks or moves is never used.
    - `seconds` number, required: How long the flash cuts and the title run.
    - `epigraph` object: An epigraph shown first, alone on black, held long enough to read (about 3 words a second, at least 4 s).
      - `text` string, required: Its words, exactly as the source gives them.
      - `attribution` string: Where the words are from ("John 12:24").
    - `sourceCredit` string: A credit shown after the epigraph and before the title ("From the novel by Fyodor Dostoevsky").
    - `nameSupers` boolean, required: Whether the flash cuts carry name supers (false when the sequence leaves it out).
    - `beatGrid` boolean: Cut the intros on the bell's beat: from the sequence's first frame a beat every `beatSeconds`, each flash cut starting on a beat and holding exactly one beat (the one in shadow too), the title on the next beat for `titleBeats` beats. Their seconds are then derived (beats × beatSeconds; `seconds` is not used), and a score composed to the deck strikes its bell on every intro and on the title. Off when left out. Free.
    - `beatSeconds` number: The bell's beat in seconds (0.5 to 4; 2 when left out), kept to the millisecond.
    - `titleBeats` integer: On the grid, how many whole beats the title holds (1 to 8; 2 when left out — 4 s on a 2 s bell, long enough for a score to give the title its own section).
    - `playing` boolean, required: True when it plays in the master (enabled, with a title, someone to cut to, and a chapter after it).
    - `textMotion` object: How its words look and move, as directed (absent for words in the sequence's own type). Set by POST /pitch-decks/{jobId}/storyboard/direct-text-motion with a `titleElement`, never by a save of the sequence (which keeps them). 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 face on the left or the right, over the top of the picture, or under it; never over a face). The director compiles the sentence into a motion-text spec — the face (the show's, or a bundled grotesque or condensed grotesque), the colour, the size (up to edge to edge, wider than the frame so the frame cuts the first and last letters), how it moves, and a seeded background behind it (film grain, a breathing vignette, a flickering warm light, banks of fog rolling across the frame, slowly falling motes), as quiet or as strong and moving as asked ("the same fog as the verse, but stronger"), held under the words' own brightness (behind the blood-red title it is a haze of the same red) — and saves it with the sentence on the title sequence (`textMotion`). The words stay the sequence's: a direction says how they look, never what they say. `clear: true` puts an element back in the sequence's own type. Free: an LLM call, no credits; a rendered deck's master is stitched again with it, and nothing else renders (no chapter, no shot). A save of the title sequence keeps every direction (an element whose words are removed loses its own).
      - `title` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
      - `epigraph` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
      - `sourceCredit` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
      - `nameSupers` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
    - `beatTimeline` object, nullable, required: The bell beat grid (null when `beatGrid` is off): the beat, the derived length of the flash cuts and the title (`beats` × `beatSeconds` = `seconds`), and where each intro and the title land — the beat each starts on, its frames, and its start in the sequence and in the master (frames and seconds; the master's are null while the sequence does not play).
      - `beatSeconds` number, required
      - `titleBeats` integer, required: How many beats the title holds (2 when the sequence leaves `titleBeats` out).
      - `fps` integer, required
      - `beats` integer, required: The intros (one beat each) and the title's beats.
      - `seconds` number, required: The derived length of the flash cuts and the title.
      - `intros` object[], required
        - `name` string, required
        - `beat` integer, required: The beat it starts on (beat 0 is the sequence's first frame).
        - `frames` integer, required: How long it holds: exactly one beat.
        - `sequenceFrame` integer, required
        - `sequenceSeconds` number, required
        - `masterFrame` integer, nullable, required
        - `masterSeconds` number, nullable, required
      - `title` object, required
        - `beat` integer, required
        - `beats` integer, required: Whole beats the title holds.
        - `frames` integer, required
        - `sequenceFrame` integer, required
        - `sequenceSeconds` number, required
        - `masterFrame` integer, nullable, required
        - `masterSeconds` number, nullable, required
    - `supers` object[], required: Each person's name super as the plan resolves it now, from the cast canon, in the cast's order.
      - `name` string, required
      - `text` string, nullable, required: How the super reads (`LABEL · role`, or `LABEL`), or null when they get none (supers off, or in shadow without a label).
    - `durationMs` integer, required: How long it runs in the master, its cards included.
    - `flashes` object[], required: What each flash cut goes to, once an assembly has resolved them (empty before the first). Every intro is a LIVING PORTRAIT (owner, 2026-10-07: "They should just be looking at the camera and breathing but not in motion … we don't want them to be speaking unless we're using words"). Each person's flash is, in order: their living portrait (`source: motion`: one short WAN shot rendered for the flash from their cast portrait, the person looking straight into the lens, still, breathing, an occasional blink, lips closed, lit and graded like the deck, 480p, a few seconds, PRICED FIRST through the motion-close step and never spent silently; one another deck of the project made is reused free); until one is made, a STILL, SILENT close of them from the deck's own cut (`source: cut`, free) or another rendered deck of the project (`source: reuse`, free; `fromDeck` names it), with `needsMotionClose: true` while their living portrait is not made. A close stands in only when nobody speaks on camera in its shot, the mouth check and the take watcher saw no mouth move there, the person is alone, and its picture measured still (no walk, gesture, turn or camera move) — in motion means speaking with words, and a flash plays the score, never a line, so a close in which anyone speaks or moves never opens an intro. A person `inShadow` stays in shadow, as still. A cast entry's `flashSource` (`motion`, `deck`, `project` or `portrait`) puts that source first; `portrait` is their still canon portrait image, used only when asked for. With neither, `source` is `missing` with `needsMotionClose: true`: their beat stays black, and `motionClosesNeeded` prices the living portrait that would fill it.
      - `name` string, required
      - `inShadow` boolean, required
      - `source` 'cut' | 'reuse' | 'motion' | 'portrait' | 'missing', required: `motion`: their living portrait; `cut`: a still, silent close from the deck's own cut; `reuse`: a still, silent close from another rendered deck of the project (free); `portrait`: their still portrait image (only when asked for); `missing`: nothing to cut to (the beat stays black; the note says what to do).
      - `moving` boolean, required: True when the flash is footage (a living portrait or a close), not a still image.
      - `url` string, nullable, required
      - `startSeconds` number, nullable, required: Where in its video the flash starts (a moving flash).
      - `chapterNumber` integer, nullable, required: The chapter of this deck the close comes from, by its place in the deck from 1 (a `cut` flash).
      - `framing` string, nullable, required
      - `note` string, nullable, required
      - `nameSuper` string, nullable, required: The name this flash cut carried when the master was last assembled (with its role after a ` · ` when one is given), or null.
      - `fromDeck` object, nullable, required: The other deck of the project a reused close (or a reused motion close) is from.
        - `jobId` string, required
        - `chapterNumber` integer, nullable, required: Its chapter's place in that deck (null for a motion close).
      - `needsMotionClose` boolean, required: True when their living portrait is not made: it is what would fill their beat, or replace the still close standing in.
    - `motionCloses` object[], required: The living portraits rendered (or on their way) for the intros. A motion close is a person's LIVING PORTRAIT for their title intro: one WAN shot of their face and shoulders from their cast portrait, the person looking straight into the lens and holding still — breath, an occasional blink, lips closed — lit and graded like the deck (its Series Bible's look), at 480p, silent, 3 seconds on the 2 s bell (the flash's beat plus room), in shadow when the sequence keeps them in shadow. PRICED FIRST — TWO CALLS on the API and the CLI, two tools on MCP and in chat (quote_render_pitch_deck_title_motion_closes, then render_pitch_deck_title_motion_closes): without `confirmed` it prices every person whose intro is not yet their living portrait (`motionClosesNeeded` in the read: about 6 people × 3 s at 480p for a father and his sons), or the people named in `names` (a new take of someone who has one is priced again), and spends nothing; with `confirmed: true` it reserves exactly those lines and renders them. Allowed while the deck is in review or complete. When each lands it is checked like a take (a file that decodes, silent, its length) and the master is re-assembled with it, free; a render that fails or is refused is released (nothing charged). Read each one back as `titleSequence.motionCloses` (`livingPortrait` false: a moving close made before 2026-10-07, which no longer opens an intro).
      - `name` string, required
      - `take` integer, required
      - `status` 'queued' | 'rendering' | 'accepted' | 'failed', required: `accepted`: it plays; `failed`: released, nothing charged.
      - `url` string, nullable, required
      - `seconds` number, required
      - `credits` number, required
      - `inShadow` boolean, required
      - `failure` string, nullable, required
      - `requestedAt` string, date-time, required
      - `livingPortrait` boolean, required: True for a living portrait; false for a moving close made before 2026-10-07, which no longer opens an intro.
    - `motionClosesNeeded` object[], required: Whose intro is not yet their living portrait (nothing fills their beat, or a still close stands in), with the price of each. Empty when every intro opens on one.
      - `name` string, required
      - `seconds` number, required
      - `credits` number, required
      - `renderable` boolean, required: False when they have no cast portrait to render from (give them one first).
  - `closingElement` 'quote' | 'comingSoon' | 'productionCredit': The closing card directed (a closing direction).
  - `closingSequence` ClosingSequenceView: 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 and out and held long enough to read. It ADDS to the deck's length: no chapter is shortened for it. When the title sequence cuts on its bell beat grid, each card starts on a beat of that same grid and the bell lane accents it. Across it the music (the score or the beds) and the bell lane fade out smoothly to silence on the master's last frame: what still sounds at the last chapter's cut plays on under the cards. A card with no direction of its own wears the opening's look (the quote the epigraph's, the credit the source credit's, "Coming Soon" the title's or the epigraph's background), so the deck is sandwiched by one style. It is free: nothing is rendered for it, and a rendered deck's master is stitched again with it. `enabled: false` keeps it without playing it. How its words look and move is directed separately (`closingElement` on the direct-text-motion call; read back as `textMotion`), and a save keeps those directions. THE LOGO CARD (`logoCard: true`, off when left out) ends the sequence on the project's brand logo, alone on black after the production credit, faded in and out and held 3 seconds. The logo is the project's (`brandLogoUrl` on the project, set on the site's Closing card, with the Story API project update's `brandLogo`, or on the CLI with `projects update --brand-logo-file`); a save that turns the card on while the project has no logo is refused, and the save copies the logo the project has at that moment (read back as `logoUrl`), so save the closing again after replacing the logo. Free like the rest of the sequence.
    - `enabled` boolean, required: Whether the deck or trailer ends on it. False keeps it without playing it.
    - `quote` object: A closing quote shown first, alone on black, held long enough to read (about 3 words a second, at least 4 s).
      - `text` string, required: Its words, exactly as the source gives them.
      - `attribution` string: Where the words are from, cited exactly.
    - `comingSoon` string, required: "Coming Soon" as the master sets it (the default when left out).
    - `productionCredit` string, required: The production credit as the master sets it (the studio's name when left out).
    - `logoCard` boolean, required: Whether it ends on the project's brand logo.
    - `logoUrl` string, nullable, required: The logo the logo card shows: the project's brand logo as it was when the closing was saved with the card on (null while the card is off).
    - `logo` object: The logo as stored on the closing (READ ONLY: copied from the project by the save that turns the logo card on).
      - `url` string, required
    - `playing` boolean, required: True when it plays in the master (enabled, and a chapter or beat before it).
    - `durationMs` integer, required: How long it runs in the master: what it adds to the deck's or trailer's length.
    - `startSeconds` number, nullable, required: Where it starts in the master (null while it does not play).
    - `onBeatGrid` boolean, required: Whether its cards keep the title sequence's bell beat grid (each starting on a beat).
    - `textMotion` object: How its cards look and move, as directed (absent for a card that wears the opening's look or its own type). Set by POST /pitch-decks/{jobId}/storyboard/direct-text-motion with a `closingElement`, never by a save (which keeps them). The closing sequence's words are directed like the title sequence's, in the writer's own words, through the same direct-text-motion call with a `closingElement` instead of a `chapterIndex`: `quote`, `comingSoon` or `productionCredit` ("the same candlelight and grain as the epigraph", "Coming Soon wide and slow, a faint vignette breathing behind it"). The same director compiles the sentence into a motion-text spec (face, colour, size, motion and a quiet background) and saves it with the sentence on the closing sequence (`textMotion`). The words stay the closing's: a direction says how they look, never what they say. `clear: true` puts a card back in the opening's look (or its own type). Free: an LLM call, no credits; a rendered deck's master is stitched again with it, and nothing else renders.
      - `quote` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
      - `comingSoon` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
      - `productionCredit` PitchDeckTitleTextMotion: One of the title sequence's words, directed: the writer's sentence and the motion-text spec compiled from it, which the master executes.
        - `direction` string, required: The writer's own words for how it looks and moves.
        - `spec` object, required: The motion-text spec: version, layers (each a text, atmosphere, particle… layer with its face, fit, colours and keyframed steps).
    - `cards` object[], required: Its cards in order: the quote (when it has one), "Coming Soon", the production credit, and the project's logo (when the logo card is on).
      - `card` 'quote' | 'comingSoon' | 'productionCredit' | 'logo', required
      - `text` string, required: Its words (empty on the logo card).
      - `attribution` string, nullable, required
      - `imageUrl` string, nullable, required: The image it shows: the project's logo on the logo card, else null.
      - `seconds` number, required: How long it is on screen, its fades included.
      - `startSeconds` number, nullable, required: Where it starts in the master (null while the closing does not play).
      - `beat` integer, nullable, required: The bell beat it starts on, on the grid (null off the grid).
      - `look` 'own' | 'opening' | 'null', nullable, required: `own`: its own direction; `opening`: the opening's look, borrowed; null: its own type on black.
      - `lookFrom` 'title' | 'epigraph' | 'sourceCredit' | 'nameSupers' | 'null', nullable, required: The opening element its look is borrowed from.
      - `backgroundOnly` boolean, required: True when only a background is borrowed: the card keeps its own type over it.
    - `fadeOut` object, nullable, required: Where the master fades the music (the score or the beds) and the bell lane out: from the closing's first frame to silence on the master's last (null while it does not play).
      - `fromSeconds` number, required
      - `toSeconds` number, required
  - `reassembling` boolean: True when the deck's master is stitched again with it (a rendered deck; free — no chapter renders).

## Other responses

- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: The named project or source does not exist or is owned by another account.
- `409`: This chapter has no on-screen text for a motion direction to act on, and nothing was compiled or saved. Either the chapter is footage only (give it a caption, or set it to text/both) or its caption is still empty. A 409 rather than a 400 because the request body is fine — the same call succeeds once the chapter is put right — and the message says which of the two it is.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/4534f5d25540?raw)
