{"openapi":"3.1.0","info":{"title":"Lumorig API","version":"1.0.0","description":"Generate new mascots or rebuild existing ones as rigged vectors, animate them (instant presets or described motion), and export Lottie, SVG, video, stickers, and live embeds.\n\nAuthenticate with `Authorization: Bearer lr_sk_…`. Long-running work (generation, rebuilds, custom motion, exports) returns a Job — poll `GET /jobs/{id}?wait=60` or stream `GET /jobs/{id}/events` (SSE), or register a webhook."},"servers":[{"url":"https://lumorig.com/api/v1"}],"security":[{"bearer":[]}],"tags":[{"name":"Mascots"},{"name":"Animations"},{"name":"Exports"},{"name":"Canvases"},{"name":"Jobs"},{"name":"Uploads"},{"name":"Webhooks"},{"name":"Workspace"},{"name":"Account"},{"name":"Catalog"}],"paths":{"/uploads":{"post":{"summary":"Upload an image","tags":["Uploads"],"responses":{"201":{"description":"Uploaded file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}},"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}}}}}}}},"/mascots":{"get":{"summary":"List mascots","tags":["Mascots"],"responses":{"200":{"description":"Mascots","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Mascot"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a mascot","tags":["Mascots"],"description":"`prompt` designs a new mascot; `upload_id`/`image_url` rebuilds an existing one as a rigged vector; `spec` imports a MascotSpec directly (synchronous, 201).","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":2000},"style":{"type":"string","maxLength":400},"upload_id":{"type":"string"},"image_url":{"type":"string","format":"uri"},"name":{"type":"string","maxLength":80},"notes":{"type":"string","maxLength":1000},"detail":{"description":"high: richer rendering at a higher credit price","type":"string","enum":["standard","high"]},"max_cost_usd":{"type":"number","minimum":0,"exclusiveMinimum":true}},"additionalProperties":false},{"type":"object","required":["spec"],"properties":{"spec":{"$ref":"#/components/schemas/MascotSpec"},"name":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Mascot and its generation job","content":{"application/json":{"schema":{"type":"object","properties":{"mascot":{"$ref":"#/components/schemas/Mascot"},"job":{"$ref":"#/components/schemas/Job"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}":{"get":{"summary":"Get a mascot","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"include","in":"query","schema":{"const":"spec"}}],"responses":{"200":{"description":"Mascot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mascot"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"summary":"Update a mascot","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"public":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Mascot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mascot"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a mascot","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/spec":{"get":{"summary":"Get the MascotSpec","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"version","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Spec","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MascotSpec"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Replace the MascotSpec (new version)","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MascotSpec"}}}},"responses":{"200":{"description":"Mascot","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/recolor":{"post":{"summary":"Recolor (instant)","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["palette"],"properties":{"palette":{"type":"object","additionalProperties":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}}}}}},"responses":{"200":{"description":"Mascot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mascot"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/edit":{"post":{"summary":"Edit by instruction","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instruction"],"properties":{"instruction":{"type":"string"},"max_cost_usd":{"type":"number"}}}}}},"responses":{"202":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/variants":{"post":{"summary":"Create a rig-compatible look variant","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","instruction"],"properties":{"name":{"type":"string"},"instruction":{"type":"string"}}}}}},"responses":{"202":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/versions":{"get":{"summary":"List versions","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"responses":{"200":{"description":"Versions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/versions/{versionId}/restore":{"post":{"summary":"Restore a version","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Mascot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mascot"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/preview":{"get":{"summary":"Render a still","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"format","in":"query","schema":{"type":"string"}},{"name":"animation","in":"query","schema":{"type":"string"}},{"name":"t","in":"query","schema":{"type":"number"}},{"name":"size","in":"query","schema":{"type":"number"}},{"name":"v","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Image","content":{"image/png":{},"image/svg+xml":{}}}}}},"/mascots/{id}/bundle":{"get":{"summary":"Player bundle for <lumorig-player>","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"token","in":"query","schema":{"type":"string"},"description":"Signed share token for private mascots"}],"responses":{"200":{"description":"Bundle","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[]}},"/mascots/{id}/share":{"post":{"summary":"Create an expiring share link","tags":["Mascots"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ttl_seconds":{"type":"integer"}}}}}},"responses":{"200":{"description":"Share link","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/animations":{"get":{"summary":"List animations","tags":["Animations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"responses":{"200":{"description":"Animations","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Animation"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create an animation","tags":["Animations"],"description":"`preset` is instant and free (201). `prompt` runs the motion designer (202 + job). `reference_upload_id` (an uploaded MP4/MOV/WebM) makes the mascot perform the motion in the video (202 + job). `clip` saves a hand-authored AnimationClip.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"preset":{"type":"string","enum":["idle","wave","nod","shake","bounce","celebrate","jump","talk","sad","surprised","dance","think","working","listen","sleep"]},"intensity":{"type":"number","minimum":0.25,"maximum":2},"duration":{"type":"number","minimum":0.3,"maximum":20},"name":{"type":"string","maxLength":60}},"required":["preset"],"additionalProperties":false},{"type":"object","properties":{"prompt":{"type":"string","minLength":3,"maxLength":1000},"duration":{"type":"number","minimum":0.3,"maximum":20},"name":{"type":"string","maxLength":60},"max_cost_usd":{"type":"number","minimum":0,"exclusiveMinimum":true}},"required":["prompt"],"additionalProperties":false},{"type":"object","properties":{"clip":{},"name":{"type":"string","maxLength":60}},"required":["clip","name"],"additionalProperties":false},{"type":"object","properties":{"reference_upload_id":{"type":"string","description":"An uploaded MP4/MOV/WebM whose motion the mascot should perform"},"prompt":{"type":"string","maxLength":1000},"duration":{"type":"number","minimum":0.3,"maximum":12},"name":{"type":"string","maxLength":60},"max_cost_usd":{"type":"number","minimum":0,"exclusiveMinimum":true}},"required":["reference_upload_id"],"additionalProperties":false}]}}}},"responses":{"201":{"description":"Animation (preset/clip) or {job} (prompt)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/animations/{animationId}":{"get":{"summary":"Get an animation (with clip)","tags":["Animations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"animationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Animation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animation"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete an animation","tags":["Animations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"animationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/scenes":{"post":{"summary":"Create an illustrated vector scene","tags":["Exports"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string"},"size":{"enum":["square","wide","banner","portrait"]},"animation":{"type":"string"},"t":{"type":"number"},"max_cost_usd":{"type":"number"}}}}}},"responses":{"202":{"description":"Job (result.svg, result.png)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/animations/batch":{"post":{"summary":"Create several described animations","tags":["Animations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompts"],"properties":{"prompts":{"type":"array","maxItems":8,"items":{"type":"string"}},"duration":{"type":"number"}}}}}},"responses":{"202":{"description":"Jobs","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/suggestions":{"post":{"summary":"Suggest signature animations","tags":["Animations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"use_case":{"type":"string"}}}}}},"responses":{"200":{"description":"Finished job (result.suggestions)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/exports":{"post":{"summary":"Export","tags":["Exports"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","enum":["gif","mp4","webm","webp","apng","sprite","lottie","animated-svg","png","svg","sticker","logo","logo-png"]},"animation":{"type":"string"},"size":{"type":"integer","minimum":64,"maximum":2048},"fps":{"type":"integer","minimum":6,"maximum":60},"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"t":{"type":"number","minimum":0},"version_id":{"type":"string"}},"required":["format"],"additionalProperties":false}}}},"responses":{"202":{"description":"Job (result.file)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/canvases":{"get":{"summary":"List canvases","tags":["Canvases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"responses":{"200":{"description":"Canvases","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a canvas","tags":["Canvases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"template":{"enum":["chatbot","ai_agent","onboarding"]},"graph":{"$ref":"#/components/schemas/CanvasGraph"}}}}}},"responses":{"201":{"description":"Canvas","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/mascots/{id}/canvases/{canvasId}":{"patch":{"summary":"Update a canvas","tags":["Canvases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"canvasId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"graph":{"$ref":"#/components/schemas/CanvasGraph"}}}}}},"responses":{"200":{"description":"Canvas","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a canvas","tags":["Canvases"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Mascot id (msc_…)"},{"name":"canvasId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs":{"get":{"summary":"List jobs","tags":["Jobs"],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"type","in":"query","schema":{"type":"string"}},{"name":"mascot_id","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Jobs","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}":{"get":{"summary":"Get a job (long-poll with ?wait=seconds, max 120)","tags":["Jobs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"wait","in":"query","schema":{"type":"integer","maximum":120}}],"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}/events":{"get":{"summary":"Stream job events (SSE)","tags":["Jobs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"after","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"text/event-stream: queued, started, progress, tool_call, tool_input_delta, draft, usage, finished","content":{"text/event-stream":{}}}}}},"/jobs/{id}/cancel":{"post":{"summary":"Cancel a job","tags":["Jobs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/files/{id}":{"get":{"summary":"Download a file","tags":["Exports"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"download","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"File bytes"}}}},"/analyze":{"post":{"summary":"Mascot concepts from a website","tags":["Mascots"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"}}}}}},"responses":{"202":{"description":"Job (result: brand analysis + 3 concepts)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/webhooks":{"get":{"summary":"List webhooks","tags":["Webhooks"],"responses":{"200":{"description":"Webhooks","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a webhook","tags":["Webhooks"],"description":"Deliveries are signed: `Lumorig-Signature: t=<unix>,v1=<hex HMAC-SHA256 of \"t.body\">`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"enum":["job.succeeded","job.failed","job.canceled","*"]}}}}}}},"responses":{"201":{"description":"Webhook (secret shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/keys/{id}":{"delete":{"summary":"Revoke an API key","tags":["Account"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/webhooks/{id}":{"delete":{"summary":"Delete a webhook","tags":["Webhooks"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspace":{"get":{"summary":"Get the current workspace","tags":["Workspace"],"description":"Name, plan, your role and seats (`limit`, `members`, `pending`, `used`, `available`). With an API key: the key's workspace. With a studio session: the active workspace (the `Lumorig-Workspace` header selects another one you belong to).","responses":{"200":{"description":"Workspace","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspace/members":{"get":{"summary":"List members","tags":["Workspace"],"responses":{"200":{"description":"Members (owner first)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspace/invites":{"get":{"summary":"List pending invites","tags":["Workspace"],"description":"Admins and the owner. Studio session only.","responses":{"200":{"description":"Invites","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Invite someone by email","tags":["Workspace"],"description":"Studio session only (API keys get 403 `session_required`). A pending invite holds a seat for 7 days; beyond the plan's seats the response is 402 `seat_limit` with `details: { seats, used, members, pending }`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"role":{"enum":["member","admin"]}}}}}},"responses":{"201":{"description":"Invite and its link (shown once)","content":{"application/json":{"schema":{"type":"object","properties":{"invite":{"type":"object"},"invite_url":{"type":"string"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/keys":{"get":{"summary":"List API keys","tags":["Account"],"responses":{"200":{"description":"Keys","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create an API key","tags":["Account"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Key (shown once)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/usage":{"get":{"summary":"Usage and spend","tags":["Account"],"responses":{"200":{"description":"Usage","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/credits":{"get":{"summary":"Credit balance, plan, and per-action prices","tags":["Account"],"description":"Model-backed jobs hold credits up front and refund them on failure. Without enough credits they return 402 insufficient_credits.","responses":{"200":{"description":"Credits","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/presets":{"get":{"summary":"List animation presets","tags":["Catalog"],"responses":{"200":{"description":"Presets","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[]}},"/styles":{"get":{"summary":"List style presets","tags":["Catalog"],"responses":{"200":{"description":"Styles","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[]}},"/canvas-templates":{"get":{"summary":"List canvas templates","tags":["Catalog"],"responses":{"200":{"description":"Templates","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[]}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"lr_sk_… API key"}},"schemas":{"MascotSpec":{"type":"object","properties":{"specVersion":{"type":"number","const":1},"name":{"type":"string","minLength":1},"description":{"type":"string"},"archetype":{"type":"string","enum":["biped","quadruped","blob","winged","object","custom"]},"canvas":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["width","height"],"additionalProperties":false},"palette":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Token referenced from SVG as $name, e.g. fill=\"$fur\""},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["name","color"],"additionalProperties":false}},"parts":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"parent":{"anyOf":[{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},{"type":"null"}],"description":"Parent part id, or null for the root"},"z":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Global draw order; higher draws on top"},"pivot":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2,"description":"Joint location in canvas coordinates; rotation and scale happen around it"},"rotateLimits":{"anyOf":[{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2},{"type":"null"}],"description":"Allowed rotation range in degrees [min, max], or null if this part should not rotate"},"svg":{"type":"string","description":"SVG fragment (restricted subset) in canvas coordinates at rest pose"},"states":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"State name, e.g. open, closed, happy, smile, o"},"svg":{"type":"string","description":"SVG fragment drawn instead of the part's base svg when this state is active"}},"required":["name","svg"],"additionalProperties":false},"description":"Alternate drawings; empty if none"},"defaultState":{"anyOf":[{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},{"type":"null"}],"description":"Which state shows at rest, or null to use `svg`"}},"required":["id","parent","z","pivot","rotateLimits","svg","states","defaultState"],"additionalProperties":false}},"anchors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"part":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Part the anchor moves with"},"at":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"required":["name","part","at"],"additionalProperties":false}}},"required":["specVersion","name","description","archetype","canvas","palette","parts","anchors"],"additionalProperties":false},"AnimationClip":{"type":"object","properties":{"clipVersion":{"type":"number","const":1},"name":{"type":"string","minLength":1},"duration":{"type":"number","minimum":0.2,"maximum":20,"description":"Seconds"},"loop":{"type":"boolean"},"tracks":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"part":{"type":"string"},"prop":{"type":"string","enum":["rotate","translateX","translateY","scaleX","scaleY","opacity"]},"keys":{"minItems":1,"type":"array","items":{"type":"object","properties":{"t":{"type":"number","minimum":0,"maximum":1,"description":"Normalized time 0..1 within the clip"},"v":{"type":"number"},"ease":{"type":"string","enum":["linear","easeIn","easeOut","easeInOut","easeInBack","easeOutBack","easeOutElastic","easeOutBounce","step"],"description":"Easing used to arrive at this key from the previous one"}},"required":["t","v","ease"],"additionalProperties":false}}},"required":["part","prop","keys"],"additionalProperties":false},{"type":"object","properties":{"part":{"type":"string"},"prop":{"type":"string","const":"state"},"keys":{"minItems":1,"type":"array","items":{"type":"object","properties":{"t":{"type":"number","minimum":0,"maximum":1},"v":{"type":"string","description":"State name to switch to at time t"}},"required":["t","v"],"additionalProperties":false}}},"required":["part","prop","keys"],"additionalProperties":false}]}},"modifiers":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"breathing"},"part":{"type":"string","description":"Usually the torso/root"},"amount":{"type":"number","minimum":0,"maximum":0.1,"description":"Scale amplitude, e.g. 0.02"},"cycles":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Breaths per clip loop (integer so it loops)"}},"required":["type","part","amount","cycles"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"blink"},"part":{"type":"string"},"closedState":{"type":"string"},"count":{"type":"integer","minimum":1,"maximum":4,"description":"Blinks per clip loop"},"duration":{"type":"number","minimum":0.05,"maximum":0.4,"description":"Seconds the eyes stay closed"}},"required":["type","part","closedState","count","duration"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"follow"},"part":{"type":"string","description":"A dangling part (tail, ear, antenna) that lags behind its parent's motion"},"strength":{"type":"number","minimum":0,"maximum":2,"description":"How much it swings, 1 = natural"},"stiffness":{"type":"number","minimum":10,"maximum":400},"damping":{"type":"number","minimum":1,"maximum":40}},"required":["type","part","strength","stiffness","damping"],"additionalProperties":false}]}}},"required":["clipVersion","name","duration","loop","tracks","modifiers"],"additionalProperties":false},"CanvasGraph":{"type":"object","properties":{"canvasVersion":{"type":"number","enum":[1]},"inputs":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"type":{"type":"string","enum":["boolean","number","trigger"]},"default":{"nullable":true,"anyOf":[{"type":"boolean"},{"type":"number"}]}},"required":["name","type","default"],"additionalProperties":false}},"states":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"animation":{"type":"string"},"loop":{"type":"boolean"},"then":{"nullable":true,"type":"string","pattern":"^[a-z][a-z0-9_]*$"}},"required":["id","animation","loop","then"],"additionalProperties":false}},"initial":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"transitions":{"type":"array","items":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},{"type":"string","enum":["*"]}]},"to":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"when":{"minItems":1,"type":"array","items":{"type":"object","properties":{"input":{"type":"string","pattern":"^[a-z][a-z0-9_]*$"},"op":{"type":"string","enum":["is_true","is_false","eq","gt","lt","fired"]},"value":{"nullable":true,"type":"number"}},"required":["input","op","value"],"additionalProperties":false},"description":"All conditions must hold"},"blend":{"type":"number","minimum":0,"maximum":2,"description":"Seconds of pose blending"}},"required":["from","to","when","blend"],"additionalProperties":false}}},"required":["canvasVersion","inputs","states","initial","transitions"],"additionalProperties":false},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}},"File":{"type":"object","properties":{"id":{"type":"string"},"object":{"const":"file"},"kind":{"type":"string"},"mime":{"type":"string"},"bytes":{"type":"integer"},"url":{"type":"string"},"created_at":{"type":"string"}}},"Job":{"type":"object","properties":{"id":{"type":"string"},"object":{"const":"job"},"type":{"enum":["generate","reconstruct","edit","variant","animate","export","analyze","suggest","scene"]},"status":{"enum":["queued","running","succeeded","failed","canceled"]},"mascot_id":{"type":["string","null"]},"result":{},"error":{"type":["string","null"]},"cost_usd":{"type":"number"},"created_at":{"type":"string"},"started_at":{"type":["string","null"]},"finished_at":{"type":["string","null"]}}},"Animation":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"source":{"enum":["preset","prompt","custom"]},"preset":{"enum":["idle","wave","nod","shake","bounce","celebrate","jump","talk","sad","surprised","dance","think","working","listen","sleep"]},"duration":{"type":"number"},"loop":{"type":"boolean"},"clip":{"$ref":"#/components/schemas/AnimationClip"}}},"Mascot":{"type":"object","properties":{"id":{"type":"string"},"object":{"const":"mascot"},"name":{"type":"string"},"status":{"enum":["generating","ready","failed"]},"source":{"enum":["prompt","image","svg"]},"fidelity":{"type":["number","null"],"description":"Rebuild similarity to the upload (0–1)"},"needs_review":{"type":"boolean"},"palette":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"}}}},"parts":{"type":"array","items":{"type":"object"}},"animations":{"type":"array","items":{"$ref":"#/components/schemas/Animation"}},"preview_url":{"type":["string","null"]},"bundle_url":{"type":"string"}}},"ExportFormat":{"enum":["gif","mp4","webm","webp","apng","sprite","lottie","animated-svg","png","svg","sticker","logo","logo-png"]}}}}