API reference
REST API
https://steadyshot.ai.Resources
Jump to a resource group:
- characters(4)
- brand-kits(7)
- generate(1)
- scenes(1)
- generate-multi(1)
- storybook(1)
- comics(7)
- library(2)
- credits(1)
- api-keys(3)
characters
/api/charactersList all characters
Returns all characters belonging to the authenticated user, ordered by creation date (newest first).
Responses
200Array of characters
No properties.
/api/characters/{id}Get character details
Returns a character's details including all reference images.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | Character UUID |
Responses
200Character with references
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| name | string | — |
| description | string | — |
| style_notes | string | — |
| source_image_url | string | — |
| face_mode | string | — |
| created_at | string<date-time> | — |
| references | array<ReferenceImage> | — |
404Character not found
| Field | Type | Description |
|---|---|---|
| error | string | — |
/api/charactersCreate 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
| Field | Type | Description |
|---|---|---|
| namerequired | string | Character name |
| descriptionrequired | string | Detailed character description (appearance, clothing, features) |
| style_notes | string | Art style notes, e.g. 'watercolor', 'Pixar 3D', 'anime' |
| image | string<binary> | Optional source/reference image of the character |
Responses
201Character created
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| name | string | — |
| description | string | — |
| style_notes | string | — |
| source_image_url | string | — |
| face_mode | string | — |
| created_at | string<date-time> | — |
| warning | string | Warning if multiple people detected in the source image |
/api/characters/{id}Delete a character
Permanently deletes a character and all its data (reference images, generated images, storage files).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | Character UUID |
Responses
200Character deleted
| Field | Type | Description |
|---|---|---|
| deleted | boolean | — |
| id | string | — |
brand-kits
/api/brand-kitsList brand kits
Responses
200Array of brand kits
No properties.
/api/brand-kits/{id}Get brand kit with assets
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | — |
Responses
200Brand kit with embedded assets
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| name | string | — |
| logo_image_url | string | — |
| palette | array<PaletteColor> | — |
| brand_voice | string | — |
| created_at | string<date-time> | — |
| assets | array<BrandAsset> | — |
/api/brand-kitsCreate 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
| Field | Type | Description |
|---|---|---|
| namerequired | string | — |
| logo | string<binary> | Logo image (PNG with transparency preferred) |
| palette | string | JSON-encoded array of {name, hex} |
| brand_voice | string | — |
Responses
201Brand kit created
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| name | string | — |
| logo_image_url | string | — |
| palette | array<PaletteColor> | — |
| brand_voice | string | — |
| created_at | string<date-time> | — |
/api/brand-kits/{id}/assetsUpload a brand asset (logo variant, product, packaging)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | — |
Request bodymultipart/form-data
| Field | Type | Description |
|---|---|---|
| kindrequired | enum: "logo" | "product" | "packaging" | "reference" | — |
| labelrequired | string | Short human label, e.g. 'hero-product-front' |
| imagerequired | string<binary> | — |
Responses
201Asset uploaded
/api/brand-kits/{id}Update brand kit metadata
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | — |
Request bodyapplication/json
| Field | Type | Description |
|---|---|---|
| name | string | — |
| brand_voice | string | — |
| palette | array<object> | — |
Responses
200Updated brand kit
/api/brand-kits/{id}Delete a brand kit
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | — |
Responses
200Brand kit deleted
/api/brand-kits/{id}/assetsDelete a brand asset
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string | — |
| asset_idrequired | query | string | — |
Responses
200Asset deleted
generate
/api/generateGenerate 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
| Field | Type | Description |
|---|---|---|
| character_id | string<uuid> | Character UUID. Required unless brand_kit_id is provided. |
| brand_kit_id | string<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_ids | array<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_id | string<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). |
| promptrequired | string | Scene description, e.g. 'reading a book under a cherry blossom tree' |
| art_style | string | Optional art style override, e.g. 'Pixar 3D', 'anime', 'watercolor' |
| max_retries | integer | Maximum generation attempts (1-5)Default: 3 |
| min_score | number | Minimum combined consistency score to accept (0-1)Default: 0.95 |
| no_cache | boolean | Force regeneration even if a cached result existsDefault: false |
Responses
200Generated scene image
| Field | Type | Description |
|---|---|---|
| image_id | string<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_url | string | URL of the generated image |
| consistency_score | integer | 0-100 combined score |
| character_score | integer | 0-100, present when character_id was supplied |
| brand_score | integer | 0-100, present when brand_kit_id was supplied |
| attempts | integer | — |
| passed | boolean | Whether the score met the minimum threshold |
| reasoning | string | — |
| issues | array<string> | — |
| cached | boolean | True if returned from cache |
400Missing parameters or no reference images
| Field | Type | Description |
|---|---|---|
| error | string | — |
402Insufficient credits
| Field | Type | Description |
|---|---|---|
| error | string | — |
404Character not found
| Field | Type | Description |
|---|---|---|
| error | string | — |
scenes
/api/scenes/{image_id}/varyGenerate 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
| Name | In | Type | Description |
|---|---|---|---|
| image_idrequired | path | string<uuid> | UUID of the source generated_image to vary |
Request bodyapplication/json
| Field | Type | Description |
|---|---|---|
| varyrequired | enum: "expression" | "outfit" | "lighting" | "angle" | "pose" | "background" | The single dimension to change. Everything else is held constant. |
| targetrequired | string | The new value for the chosen dimension, e.g. 'frowning' for expression or 'golden hour' for lighting. |
| count | integer | How many variations to generate (1-4).Default: 4 |
Responses
200Variations generated
| Field | Type | Description |
|---|---|---|
| source_image_id | string<uuid> | — |
| vary | string | — |
| target | string | — |
| requested | integer | — |
| generated | integer | — |
| failed | integer | — |
| variants | array<object> | — |
| failures | array<object> | — |
400Invalid dimension, missing target, or source is brand-only
| Field | Type | Description |
|---|---|---|
| error | string | — |
404Source scene not found or not owned by caller
| Field | Type | Description |
|---|---|---|
| error | string | — |
generate-multi
/api/generate-multiGenerate 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
| Field | Type | Description |
|---|---|---|
| character_idsrequired | array<string> | Array of 2-4 character UUIDs |
| promptrequired | string | Scene description, e.g. 'Milo and Aria playing chess in a garden' |
| art_style | string | Optional art style override |
| max_retries | integer | — |
| min_score | number | — |
Responses
200Generated multi-character scene
| Field | Type | Description |
|---|---|---|
| image_url | string | — |
| characters | array<object> | — |
| average_score | integer | — |
| attempts | integer | — |
| passed | boolean | — |
| reasoning | string | — |
| issues | array<string> | — |
| mode | enum: "illustrated" | "pulid" | — |
400Invalid parameters
| Field | Type | Description |
|---|---|---|
| error | string | — |
402Insufficient credits
| Field | Type | Description |
|---|---|---|
| error | string | — |
storybook
/api/storybookGenerate 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
| Field | Type | Description |
|---|---|---|
| character_id | string<uuid> | Single character UUID (use this OR character_ids) |
| character_ids | array<string> | Array of 2-4 character UUIDs for multi-character storybook |
| pagesrequired | array<string> | Array of scene descriptions, one per page |
| art_style | string | Art style override for the entire storybook |
| consistency_check | boolean | Check consistency on each page and retry low-scoring onesDefault: false |
| export_pdf | boolean | Assemble all pages into a PDF and return the download URLDefault: false |
Responses
200Generated storybook
| Field | Type | Description |
|---|---|---|
| character_ids | array<string> | — |
| character_names | array<string> | — |
| total_pages | integer | — |
| generated | integer | — |
| failed | integer | — |
| pages | array<object> | — |
| pdf_url | string | PDF download URL (if export_pdf was true) |
comics
/api/comicsList your comics
Returns the caller's comics newest-first, with the page-1 thumbnail attached for list rendering.
Responses
200List of comics
| Field | Type | Description |
|---|---|---|
| comics | array<Comic> | — |
/api/comics/{id}Fetch a comic + its pages
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | — |
Responses
200Comic + ordered pages
| Field | Type | Description |
|---|---|---|
| comic | object | — |
| pages | array<ComicPanel> | — |
/api/comicsCreate 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
| Field | Type | Description |
|---|---|---|
| titlerequired | string | — |
| character_idsrequired | array<string> | Locked SteadyShot character IDs that may appear in panels |
| style_preset | enum: "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_prompt | string | — |
| setting | string | Single shared location text injected into every panel prompt |
| outfit_locks | array<OutfitLock> | — |
Responses
200Created comic
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| title | string | — |
| story_prompt | string | — |
| character_ids | array<string> | — |
| status | enum: "generating" | "ready" | "failed" | — |
| page_count | integer | — |
| setting | string | — |
| outfit_locks | array<OutfitLock> | — |
| style_preset | enum: "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_lock | string | — |
| setting_anchor_url | string<uri> | Internal establishing-shot reference. Used as a style+setting anchor for every panel. |
| created_at | string<date-time> | — |
| cover_image_url | string<uri> | Page-1 image_url; populated by list endpoint for thumbnails. |
/api/comics/{id}/panelsGenerate 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
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | — |
Request bodyapplication/json
| Field | Type | Description |
|---|---|---|
| page_numberrequired | integer | 1-indexed slot. If a panel already exists at this slot it is regenerated; otherwise inserted. |
| actionrequired | string | What HAPPENS in this panel — poses, motion, expressions. Do not re-describe setting or outfits (locked on the comic). |
| shot | enum: "establishing" | "wide" | "two_shot" | "medium" | "closeup" | "reaction_closeup" | "over_shoulder" | "splash" | Camera framing for a single panel.Default: "wide" |
| caption | string | Text rendered in the overlay bubble. Hard limit ~10 words for legibility. |
| caption_type | enum: "narration" | "dialogue" | — |
| speaker | string | Character name; required when caption_type='dialogue' |
| continue_from | integer | page_number of a prior panel to use as a style continuity anchor |
Responses
200Generated panel
| Field | Type | Description |
|---|---|---|
| panel | object | — |
| image_url | string<uri> | — |
/api/comics/{id}/renderAssemble 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
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | — |
Request bodyapplication/json
| Field | Type | Description |
|---|---|---|
| page_number | integer | Render just one page; omit for all |
Responses
200Assembled comic
| Field | Type | Description |
|---|---|---|
| comic | object | — |
| pages | array<ComicPanel> | — |
/api/comics/generateOne-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
| Field | Type | Description |
|---|---|---|
| titlerequired | string | — |
| story_promptrequired | string | — |
| character_idsrequired | array<string> | — |
| page_count | integer | — |
| style_preset | enum: "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
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| status | enum: "generating" | — |
| page_count | integer | — |
/api/comics/{id}Delete a comic (cascades to pages)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| idrequired | path | string<uuid> | — |
Responses
200Deleted
| Field | Type | Description |
|---|---|---|
| deleted | boolean | — |
library
/api/libraryBrowse the character library
Browse pre-built characters available for import. No auth required.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| search | query | string | Search by name or appearance |
| limit | query | integer | Max results to return |
Responses
200Library characters
| Field | Type | Description |
|---|---|---|
| characters | array<LibraryCharacter> | — |
| total | integer | — |
/api/library/importImport 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
| Field | Type | Description |
|---|---|---|
| library_character_idrequired | string<uuid> | The library character's UUID |
Responses
201Character imported
| Field | Type | Description |
|---|---|---|
| character_id | string<uuid> | — |
| name | string | — |
credits
/api/creditsGet credit balance
Returns the authenticated user's current credit balance and plan.
Responses
200Credit balance
| Field | Type | Description |
|---|---|---|
| credits | integer | — |
| plan | string | — |
api-keys
/api/api-keysList your API keys
Returns all API keys for the authenticated user (key values are not returned, only prefixes).
Responses
200API keys
| Field | Type | Description |
|---|---|---|
| keys | array<ApiKey> | — |
/api/api-keysCreate 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
| Field | Type | Description |
|---|---|---|
| name | string | A label for the key, e.g. 'ChatGPT' or 'Discord Bot'Default: "Default" |
Responses
201API key created
| Field | Type | Description |
|---|---|---|
| id | string<uuid> | — |
| name | string | — |
| key_prefix | string | First 12 chars of the key |
| created_at | string<date-time> | — |
| last_used_at | string<date-time> | — |
| revoked_at | string<date-time> | — |
| key | string | The full API key (only shown once) |
| warning | string | — |
/api/api-keysRevoke an API key
Request bodyapplication/json
| Field | Type | Description |
|---|---|---|
| key_idrequired | string<uuid> | The key's UUID to revoke |
Responses
200Key revoked
| Field | Type | Description |
|---|---|---|
| revoked | boolean | — |