Storyboards

Change a storyboard

Exactly ONE of mutations, name or project_id per call (the page's rule). mutations are the page's own operations, each { op, ...fields }, applied all or nothing on the latest version — an operation whose target is gone refuses the whole list with the reason (400). You choose every id (unique, at most 80 characters). The main ones:

  • addCastEntry { entry: { entityId } }, addPlace { entry: { entityId } }
  • addPanel { id, beat }, updatePanel { id, patch: { beat, castIds, placeId, camera, image: { generationId } | { assetId } } }, removePanel { id }
  • connect { segmentId, fromPanelId, toPanelId }, updateSegment { id, patch: { prompt, durationS, join, model } }, removeSegment { id }
  • addLine { segmentId, line: { id, atS, text, who?, how? } } (atS = seconds from the segment's start, who = a cast entity id), updateLine, removeLine
  • addDecision { id, atPanelId, firstOptionId, firstLabel }, addOption { decisionId, optionId, label, segmentId, toPanelId }, removeDecision { id }
  • setIdea { patch: { text, tone, aspectRatio, defaultModel } }, setStart { id }
  • How a moment arrives and its sound: updateSegment { id, patch: { enter: { kind: cut | dissolve | dip, s }, soundTail: { s }, soundLead: { s } } } (null = automatic again; GET says what plays in each path's timeline[].enter), trimTake { target: { kind: "segment", id } | { kind: "ending", panelId }, takeId, patch: { inS, outS, ramp: { fromS, toS, rate } } } (seconds into the clip; rate 0.5 to 3; null clears)
  • The film's sound list: addSound { sound: { id, name, kind: music | atmosphere | upload, path, prompt?, durationMs? } } (path an uploaded /uploads/audio/ file), removeSound { id } (refused while the title music, an end screen or a place uses it: the message says where)
  • setAmbience { placeId, sound: { soundId, volume? } | null }: the place's sound, looped while the film is there, crossfaded when the place changes
  • updateTitleScreen { patch: { posterId?, music?: { soundId, volume?, loop? } | null } } (the start screen of a shared film; its words are the storyboard's name), setPoster { generationId, ifPosterIs? } (picks one of the film's posters; a new id joins the list; with ifPosterIs it is chosen only when that is still the poster in use), removePoster { generationId }, updateEndScreen { panelId, patch: { title?, image?: { generationId } | { assetId }, music? } } (panelId: a keyframe a path ends on; no music: the title music returns; null clears a field)

Each committed change is one entry in the storyboard's log, signed as the agent. Answers the storyboard as GET does. PUT is accepted too.

patch/v1/storyboards/{id}

Request

  • Base URL: https://nanostudiopro.com/api
  • URL: https://nanostudiopro.com/api/v1/storyboards/{id}
  • Auth: HTTP bearer

Request body

namestring
project_idstring nullable

Response

The storyboard as changed

idstring
namestring
project_idstring nullable
urlstring uri

The storyboard's page, where the owner watches.

revinteger
can_undoboolean
can_redoboolean
read_onlyboolean

Saved by a newer version of the app: doc is null and nothing can change.

docobject nullable

idea, cast, places, panels (keyframes), segments, decisions, cues, startPanelId, agentSpend; and when set: theme (the title music), sounds (the film's sound list), ambience (place id -> its sound), endScreens (ending keyframe id -> its end screen), mix (the sound layers' levels set by hand), score (the music on the timeline: cues, each {id, soundId, fromPanelId, toPanelId?, path?, offsetS?, fadeInS?, fadeOutS?, level?, scored?}); each take's effects (sound effects at a second of its clip: {id, soundId, atS, level?, pitch?, rise?}).

acknowledgedstring[]

The issue keys marked as intended (doc.acknowledged).

ai_feedbackobject

What the owner said of each AI continuity finding, by its key: {verdict: intended|wrong|correct, note?, at, version (of the check), text (what it said), takeIds}. Set with the mutation {op: "setAiFeedback", key, verdict, note?} (note up to 300 characters; verdict null clears it). "intended" also marks it as intended; "wrong" hides it and a re-run on the same takes does not raise it again; the note is told to the next check of that clip or cut.

Example response

{
  "issues": [
    {
      "rule": "continuity.outfit",
      "key": "segment:s1:continuity.outfit:mira"
    }
  ],
  "paths": [
    {
      "timeline": [
        {
          "enter": {
            "why": "same place"
          },
          "after_choice": {
            "why": "same place"
          }
        }
      ]
    }
  ]
}

Changes

No recorded changes to this operation across all 2 revisions of this API.