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
Response
The storyboard as changed
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.