API reference

REST API

Auto-generated from public/openapi.json. Every endpoint requires a Bearer API key from /api-keys unless noted. Base URL: https://steadyshot.ai.
New to the API? Start with REST API overview for auth, error codes, and rate limiting context — then come back here for endpoint-level detail.

Resources

Jump to a resource group:

characters

GET/api/characters

List all characters

Returns all characters belonging to the authenticated user, ordered by creation date (newest first).

Responses

200Array of characters

No properties.

GET/api/characters/{id}

Get character details

Returns a character's details including all reference images.

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>Character UUID

Responses

200Character with references
FieldTypeDescription
idstring<uuid>
namestring
descriptionstring
style_notesstring
source_image_urlstring
face_modestring
created_atstring<date-time>
referencesarray<ReferenceImage>
404Character not found
FieldTypeDescription
errorstring
POST/api/characters

Create a new character

Create a character with a name, description, and optional source image. If an image is provided, it will be analyzed for multiple people (returns a warning if detected).

Request bodymultipart/form-data

FieldTypeDescription
namerequiredstringCharacter name
descriptionrequiredstringDetailed character description (appearance, clothing, features)
style_notesstringArt style notes, e.g. 'watercolor', 'Pixar 3D', 'anime'
imagestring<binary>Optional source/reference image of the character

Responses

201Character created
FieldTypeDescription
idstring<uuid>
namestring
descriptionstring
style_notesstring
source_image_urlstring
face_modestring
created_atstring<date-time>
warningstringWarning if multiple people detected in the source image
DELETE/api/characters/{id}

Delete a character

Permanently deletes a character and all its data (reference images, generated images, storage files).

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>Character UUID

Responses

200Character deleted
FieldTypeDescription
deletedboolean
idstring

brand-kits

GET/api/brand-kits

List brand kits

Responses

200Array of brand kits

No properties.

GET/api/brand-kits/{id}

Get brand kit with assets

Parameters

NameInTypeDescription
idrequiredpathstring

Responses

200Brand kit with embedded assets
FieldTypeDescription
idstring<uuid>
namestring
logo_image_urlstring
palettearray<PaletteColor>
brand_voicestring
created_atstring<date-time>
assetsarray<BrandAsset>
POST/api/brand-kits

Create a brand kit

Create a new brand kit. Supply name, optional logo, optional palette (JSON array of {name, hex}), and optional brand_voice text. Returns the created brand kit.

Request bodymultipart/form-data

FieldTypeDescription
namerequiredstring
logostring<binary>Logo image (PNG with transparency preferred)
palettestringJSON-encoded array of {name, hex}
brand_voicestring

Responses

201Brand kit created
FieldTypeDescription
idstring<uuid>
namestring
logo_image_urlstring
palettearray<PaletteColor>
brand_voicestring
created_atstring<date-time>
POST/api/brand-kits/{id}/assets

Upload a brand asset (logo variant, product, packaging)

Parameters

NameInTypeDescription
idrequiredpathstring

Request bodymultipart/form-data

FieldTypeDescription
kindrequiredenum: "logo" | "product" | "packaging" | "reference"
labelrequiredstringShort human label, e.g. 'hero-product-front'
imagerequiredstring<binary>

Responses

201Asset uploaded
PATCH/api/brand-kits/{id}

Update brand kit metadata

Parameters

NameInTypeDescription
idrequiredpathstring

Request bodyapplication/json

FieldTypeDescription
namestring
brand_voicestring
palettearray<object>

Responses

200Updated brand kit
DELETE/api/brand-kits/{id}

Delete a brand kit

Parameters

NameInTypeDescription
idrequiredpathstring

Responses

200Brand kit deleted
DELETE/api/brand-kits/{id}/assets

Delete a brand asset

Parameters

NameInTypeDescription
idrequiredpathstring
asset_idrequiredquerystring

Responses

200Asset deleted

generate

POST/api/generate

Generate a scene image

Generate a scene image featuring a character. Uses multiple reference images for consistency. Includes automatic retry with consistency checking and scene accuracy validation. Costs 1 credit.

Request bodyapplication/json

FieldTypeDescription
character_idstring<uuid>Character UUID. Required unless brand_kit_id is provided.
brand_kit_idstring<uuid>Brand kit UUID. When set (alone or with character_id), the brand kit's logo, palette, and product references are locked into the generation. Required unless character_id is provided.
brand_asset_idsarray<string>Optional subset of brand_asset IDs to lock into the scene as visual references. If omitted, the backend auto-picks (logo + products + packaging, capped at 4).
previous_image_idstring<uuid>Optional id of a previously generated image for the SAME character_id (returned as `image_id` from a prior /api/generate call). When set, the prior image is threaded as the highest-priority visual reference, anchoring the new scene against the prior generation rather than only the canonical reference sheet. Use this to chain scenes in storybook flows — cross-page outfit/lighting drift drops significantly. Must belong to the auth user and the same character_id (400 otherwise).
promptrequiredstringScene description, e.g. 'reading a book under a cherry blossom tree'
art_stylestringOptional art style override, e.g. 'Pixar 3D', 'anime', 'watercolor'
max_retriesintegerMaximum generation attempts (1-5)Default: 3
min_scorenumberMinimum combined consistency score to accept (0-1)Default: 0.95
no_cachebooleanForce regeneration even if a cached result existsDefault: false

Responses

200Generated scene image
FieldTypeDescription
image_idstring<uuid>UUID of the new generated_images row. Pass this back as `previous_image_id` on the next /api/generate call to chain scenes for cross-page coherence.
image_urlstringURL of the generated image
consistency_scoreinteger0-100 combined score
character_scoreinteger0-100, present when character_id was supplied
brand_scoreinteger0-100, present when brand_kit_id was supplied
attemptsinteger
passedbooleanWhether the score met the minimum threshold
reasoningstring
issuesarray<string>
cachedbooleanTrue if returned from cache
400Missing parameters or no reference images
FieldTypeDescription
errorstring
402Insufficient credits
FieldTypeDescription
errorstring
404Character not found
FieldTypeDescription
errorstring

scenes

POST/api/scenes/{image_id}/vary

Generate single-attribute variations of an existing scene

Take an existing generated scene as the source and produce N near-clones that differ in ONE specified dimension (expression, outfit, lighting, angle, pose, or background) while preserving everything else. Internally fans out N parallel /api/generate calls anchored on the source image. Costs 1 credit per generated variant (count). Only supported for character-anchored scenes (brand-only generations have no chain anchor).

Parameters

NameInTypeDescription
image_idrequiredpathstring<uuid>UUID of the source generated_image to vary

Request bodyapplication/json

FieldTypeDescription
varyrequiredenum: "expression" | "outfit" | "lighting" | "angle" | "pose" | "background"The single dimension to change. Everything else is held constant.
targetrequiredstringThe new value for the chosen dimension, e.g. 'frowning' for expression or 'golden hour' for lighting.
countintegerHow many variations to generate (1-4).Default: 4

Responses

200Variations generated
FieldTypeDescription
source_image_idstring<uuid>
varystring
targetstring
requestedinteger
generatedinteger
failedinteger
variantsarray<object>
failuresarray<object>
400Invalid dimension, missing target, or source is brand-only
FieldTypeDescription
errorstring
404Source scene not found or not owned by caller
FieldTypeDescription
errorstring

generate-multi

POST/api/generate-multi

Generate a multi-character scene

Generate a scene image featuring 2-4 characters together. Includes character count verification and per-character consistency checking. Costs 2 credits.

Request bodyapplication/json

FieldTypeDescription
character_idsrequiredarray<string>Array of 2-4 character UUIDs
promptrequiredstringScene description, e.g. 'Milo and Aria playing chess in a garden'
art_stylestringOptional art style override
max_retriesinteger
min_scorenumber

Responses

200Generated multi-character scene
FieldTypeDescription
image_urlstring
charactersarray<object>
average_scoreinteger
attemptsinteger
passedboolean
reasoningstring
issuesarray<string>
modeenum: "illustrated" | "pulid"
400Invalid parameters
FieldTypeDescription
errorstring
402Insufficient credits
FieldTypeDescription
errorstring

storybook

POST/api/storybook

Generate a storybook

Generate a full storybook with multiple pages. Supports single or multiple characters, optional consistency checking per page, style continuity between pages, and PDF export. Costs 1 credit per page.

Request bodyapplication/json

FieldTypeDescription
character_idstring<uuid>Single character UUID (use this OR character_ids)
character_idsarray<string>Array of 2-4 character UUIDs for multi-character storybook
pagesrequiredarray<string>Array of scene descriptions, one per page
art_stylestringArt style override for the entire storybook
consistency_checkbooleanCheck consistency on each page and retry low-scoring onesDefault: false
export_pdfbooleanAssemble all pages into a PDF and return the download URLDefault: false

Responses

200Generated storybook
FieldTypeDescription
character_idsarray<string>
character_namesarray<string>
total_pagesinteger
generatedinteger
failedinteger
pagesarray<object>
pdf_urlstringPDF download URL (if export_pdf was true)

comics

GET/api/comics

List your comics

Returns the caller's comics newest-first, with the page-1 thumbnail attached for list rendering.

Responses

200List of comics
FieldTypeDescription
comicsarray<Comic>
GET/api/comics/{id}

Fetch a comic + its pages

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>

Responses

200Comic + ordered pages
FieldTypeDescription
comicobject
pagesarray<ComicPanel>
POST/api/comics

Create an empty comic shell

Spec §4 primitive. Creates a comic project with cast + style + optional setting and outfit locks. No panels are generated — call POST /api/comics/{id}/panels to add panels one at a time, or use POST /api/comics/generate for one-shot plan+generate.

Request bodyapplication/json

FieldTypeDescription
titlerequiredstring
character_idsrequiredarray<string>Locked SteadyShot character IDs that may appear in panels
style_presetenum: "classic_american" | "manga_bw" | "european_tintin" | "indie_webcomic" | "newspaper_sunday"Locked visual language for the whole comic. Stays consistent across every panel.Default: "classic_american"
story_promptstring
settingstringSingle shared location text injected into every panel prompt
outfit_locksarray<OutfitLock>

Responses

200Created comic
FieldTypeDescription
idstring<uuid>
titlestring
story_promptstring
character_idsarray<string>
statusenum: "generating" | "ready" | "failed"
page_countinteger
settingstring
outfit_locksarray<OutfitLock>
style_presetenum: "classic_american" | "manga_bw" | "european_tintin" | "indie_webcomic" | "newspaper_sunday"Locked visual language for the whole comic. Stays consistent across every panel.Default: "classic_american"
style_lockstring
setting_anchor_urlstring<uri>Internal establishing-shot reference. Used as a style+setting anchor for every panel.
created_atstring<date-time>
cover_image_urlstring<uri>Page-1 image_url; populated by list endpoint for thumbnails.
POST/api/comics/{id}/panels

Generate one comic panel

Spec §4 primitive. Generates a single panel image using the comic's locked setting + outfit locks + style. The bubble overlay is derived from caption/caption_type/speaker. Costs 1 credit; refunded on failure.

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>

Request bodyapplication/json

FieldTypeDescription
page_numberrequiredinteger1-indexed slot. If a panel already exists at this slot it is regenerated; otherwise inserted.
actionrequiredstringWhat HAPPENS in this panel — poses, motion, expressions. Do not re-describe setting or outfits (locked on the comic).
shotenum: "establishing" | "wide" | "two_shot" | "medium" | "closeup" | "reaction_closeup" | "over_shoulder" | "splash"Camera framing for a single panel.Default: "wide"
captionstringText rendered in the overlay bubble. Hard limit ~10 words for legibility.
caption_typeenum: "narration" | "dialogue"
speakerstringCharacter name; required when caption_type='dialogue'
continue_fromintegerpage_number of a prior panel to use as a style continuity anchor

Responses

200Generated panel
FieldTypeDescription
panelobject
image_urlstring<uri>
POST/api/comics/{id}/render

Assemble a comic for compositing

Spec §4 primitive. Returns the comic + its panels (with bubble specs + shot + image URLs) so the caller can composite layout client-side. A future iteration may return a server-rendered PNG/PDF.

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>

Request bodyapplication/json

FieldTypeDescription
page_numberintegerRender just one page; omit for all

Responses

200Assembled comic
FieldTypeDescription
comicobject
pagesarray<ComicPanel>
POST/api/comics/generate

One-shot: plan + create + generate a full comic

Convenience macro that wraps the spec-aligned primitives. Plans the setting + outfit locks + N panels (caption, action, shot) from a story idea using Claude, then runs panel generation in the background. Returns immediately with the comic id; the caller polls GET /api/comics/{id} to watch panels fill in. Costs 1 credit per panel; refunded per failed panel.

Request bodyapplication/json

FieldTypeDescription
titlerequiredstring
story_promptrequiredstring
character_idsrequiredarray<string>
page_countinteger
style_presetenum: "classic_american" | "manga_bw" | "european_tintin" | "indie_webcomic" | "newspaper_sunday"Locked visual language for the whole comic. Stays consistent across every panel.Default: "classic_american"

Responses

200Comic created; panels generating in the background
FieldTypeDescription
idstring<uuid>
statusenum: "generating"
page_countinteger
DELETE/api/comics/{id}

Delete a comic (cascades to pages)

Parameters

NameInTypeDescription
idrequiredpathstring<uuid>

Responses

200Deleted
FieldTypeDescription
deletedboolean

library

GET/api/library

Browse the character library

Browse pre-built characters available for import. No auth required.

Parameters

NameInTypeDescription
searchquerystringSearch by name or appearance
limitqueryintegerMax results to return

Responses

200Library characters
FieldTypeDescription
charactersarray<LibraryCharacter>
totalinteger
POST/api/library/import

Import a library character

Import a pre-built character from the library into your account. Creates a copy with reference images ready for scene generation.

Request bodyapplication/json

FieldTypeDescription
library_character_idrequiredstring<uuid>The library character's UUID

Responses

201Character imported
FieldTypeDescription
character_idstring<uuid>
namestring

credits

GET/api/credits

Get credit balance

Returns the authenticated user's current credit balance and plan.

Responses

200Credit balance
FieldTypeDescription
creditsinteger
planstring

api-keys

GET/api/api-keys

List your API keys

Returns all API keys for the authenticated user (key values are not returned, only prefixes).

Responses

200API keys
FieldTypeDescription
keysarray<ApiKey>
POST/api/api-keys

Create a new API key

Generate a new API key. The full key is only returned once — save it immediately. Maximum 5 active keys per user.

Request bodyapplication/json

FieldTypeDescription
namestringA label for the key, e.g. 'ChatGPT' or 'Discord Bot'Default: "Default"

Responses

201API key created
FieldTypeDescription
idstring<uuid>
namestring
key_prefixstringFirst 12 chars of the key
created_atstring<date-time>
last_used_atstring<date-time>
revoked_atstring<date-time>
keystringThe full API key (only shown once)
warningstring
DELETE/api/api-keys

Revoke an API key

Request bodyapplication/json

FieldTypeDescription
key_idrequiredstring<uuid>The key's UUID to revoke

Responses

200Key revoked
FieldTypeDescription
revokedboolean