{"openapi":"3.1.0","info":{"title":"Spritekick API","version":"1.0.0","termsOfService":"https://spritekick.com/terms","contact":{"name":"Spritekick support","url":"https://spritekick.com/support"},"description":"Create character references and animations with the same one-shot pipeline as Spritekick Studio. Download transparent PNG sheets, frame ZIPs and manifests directly through the API. Export controls use the same frame rates, sizes, scale and layout as Studio. Generation requests never reroll or retry a provider result. Token purchase and refill operations are intentionally not exposed."},"servers":[{"url":"/api/v1","description":"Current origin"},{"url":"https://spritekick.com/api/v1","description":"Production"}],"externalDocs":{"description":"API guide, in HTML and Markdown","url":"https://spritekick.com/api/docs"},"tags":[{"name":"Catalog","description":"Supported cameras, styles, qualities, and animations."},{"name":"Characters","description":"Characters, objects and textures: identity and canonical-reference generation. A `kind` field says which one a resource is."},{"name":"Animations","description":"Animation generation, revisions, metadata, and sprite exports."},{"name":"Jobs","description":"Generation progress and feedback."},{"name":"Tokens","description":"Read the current balance. Refills are available only in the web application."}],"paths":{"/animations/{animationId}/renders":{"post":{"tags":["Animations"],"summary":"Request a sprite export","security":[{"bearerApiKey":[]}],"description":"Requires write scope. Exports cost no tokens. Use Studio export settings; custom trim ranges are not supported in v1. Cached results are free to read. New exports are limited to 10 per minute per API key. Non-default exports expire after 7 days.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Completed animation id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderSettings"}}}},"responses":{"200":{"description":"Cached ready export","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderEnvelope"}}}},"202":{"description":"Export queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderEnvelope"}}},"headers":{"Location":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation is not complete"},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"New-export rate limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}":{"get":{"tags":["Animations"],"summary":"Read an export","security":[{"bearerApiKey":[]}],"parameters":[{"name":"renderId","in":"path","required":true,"description":"Export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Export","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/animations/{animationId}/sheet.png":{"get":{"tags":["Animations"],"summary":"Download sheet.png","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}/sheet.png":{"get":{"tags":["Animations"],"summary":"Download sheet.png","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready.","parameters":[{"name":"renderId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/animations/{animationId}/sheet.zip":{"get":{"tags":["Animations"],"summary":"Download sheet.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds the PNG sheet and its manifest.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}/sheet.zip":{"get":{"tags":["Animations"],"summary":"Download sheet.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds the PNG sheet and its manifest.","parameters":[{"name":"renderId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/animations/{animationId}/frames.zip":{"get":{"tags":["Animations"],"summary":"Download frames.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds individual PNG frames and the same manifest.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}/frames.zip":{"get":{"tags":["Animations"],"summary":"Download frames.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds individual PNG frames and the same manifest.","parameters":[{"name":"renderId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/animations/{animationId}/manifest.json":{"get":{"tags":["Animations"],"summary":"Download manifest.json","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SheetManifest"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}/manifest.json":{"get":{"tags":["Animations"],"summary":"Download manifest.json","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready.","parameters":[{"name":"renderId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SheetManifest"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/animations/{animationId}/godot.zip":{"get":{"tags":["Animations"],"summary":"Download godot.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds one Godot 4 folder: the PNG sheet, a SpriteFrames resource with every frame, the rate and the loop flag, and an AnimatedSprite2D scene whose origin is the character's footing.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/renders/{renderId}/godot.zip":{"get":{"tags":["Animations"],"summary":"Download godot.zip","security":[{"bearerApiKey":[]}],"description":"Requires read scope. Animation routes return the default export. A pending export returns JSON with Retry-After; poll until ready. The ZIP holds one Godot 4 folder: the PNG sheet, a SpriteFrames resource with every frame, the rate and the loop flag, and an AnimatedSprite2D scene whose origin is the character's footing.","parameters":[{"name":"renderId","in":"path","required":true,"description":"Owned animation or export id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private sprite export","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"Export pending","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"Retry-After":{"schema":{"type":"integer","example":3}}}},"206":{"description":"Partial binary download"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Animation has no export source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Export failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/catalog":{"get":{"tags":["Catalog"],"summary":"List all generation options","security":[{"bearerApiKey":[]}],"responses":{"200":{"description":"Catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/tokens":{"get":{"tags":["Tokens"],"summary":"Get the token balance","security":[{"bearerApiKey":[]}],"responses":{"200":{"description":"Token balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBalance"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/characters":{"get":{"tags":["Characters"],"summary":"List characters","security":[{"bearerApiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor returned by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Character page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterPage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"tags":["Characters"],"summary":"Create a character and generate its reference","security":[{"bearerApiKey":[]}],"description":"Send JSON for text-only input or multipart/form-data to attach source_image and/or a custom style_reference.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCharacter"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateCharacterMultipart"}}}},"responses":{"202":{"description":"Generation queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterEnvelope"}}},"headers":{"Location":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientTokens"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"description":"Upload request is larger than 21 MiB."},"503":{"description":"Generation could not start, including an unavailable input check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/characters/{characterId}":{"get":{"tags":["Characters"],"summary":"Get a character","security":[{"bearerApiKey":[]}],"parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Character","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"patch":{"tags":["Characters"],"summary":"Set character visibility","security":[{"bearerApiKey":[]}],"parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["visibility"],"properties":{"visibility":{"type":"string","enum":["public","private"]}}}}}},"responses":{"200":{"description":"Character","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"tags":["Characters"],"summary":"Delete a character and all its animations","security":[{"bearerApiKey":[]}],"parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/characters/{characterId}/reference":{"post":{"tags":["Characters"],"summary":"Generate a missing or failed character reference","security":[{"bearerApiKey":[]}],"description":"This is refused while a reference job is active or after a reference is complete.","parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Generation queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientTokens"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"503":{"description":"Generation could not start, including an unavailable input check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/characters/{characterId}/reference.png":{"get":{"tags":["Characters"],"summary":"Download the character reference","security":[{"bearerApiKey":[]}],"parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}},{"name":"Range","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"PNG reference"},"206":{"description":"Byte range"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/characters/{characterId}/texture.png":{"get":{"tags":["Characters"],"summary":"Download a texture tile","security":[{"bearerApiKey":[]}],"description":"Textures only. Every size is the 1024-pixel tile reduced by a power of two, so it repeats exactly.","parameters":[{"name":"characterId","in":"path","required":true,"description":"Texture ID","schema":{"type":"string","format":"uuid"}},{"name":"size","in":"query","schema":{"type":"integer","enum":[1024,512,256,128,64,32],"default":1024}}],"responses":{"200":{"description":"PNG tile"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/characters/{characterId}/animations":{"get":{"tags":["Animations"],"summary":"List a character's animations","security":[{"bearerApiKey":[]}],"parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor returned by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Animation page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationPage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"tags":["Animations"],"summary":"Generate one animation","security":[{"bearerApiKey":[]}],"description":"A custom animation requires customPoseLabel and customPoseDescription.","parameters":[{"name":"characterId","in":"path","required":true,"description":"Character ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnimation"}}}},"responses":{"202":{"description":"Generation queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationGenerationEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientTokens"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"503":{"description":"Generation could not start, including an unavailable input check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/animations/{animationId}":{"get":{"tags":["Animations"],"summary":"Get an animation and its Studio viewer link","security":[{"bearerApiKey":[]}],"parameters":[{"name":"animationId","in":"path","required":true,"description":"Animation job ID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Animation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"patch":{"tags":["Animations"],"summary":"Name or favorite an animation","security":[{"bearerApiKey":[]}],"parameters":[{"name":"animationId","in":"path","required":true,"description":"Animation job ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"favorite":{"type":"boolean"}},"minProperties":1}}}},"responses":{"200":{"description":"Animation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}}},"delete":{"tags":["Animations"],"summary":"Delete an animation","security":[{"bearerApiKey":[]}],"parameters":[{"name":"animationId","in":"path","required":true,"description":"Animation job ID","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/animations/{animationId}/revisions":{"post":{"tags":["Animations"],"summary":"Generate a revised animation","security":[{"bearerApiKey":[]}],"description":"A revision is a new paid one-shot request and must include a note that says what to change.","parameters":[{"name":"animationId","in":"path","required":true,"description":"Previous animation job ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quality","note"],"properties":{"quality":{"$ref":"#/components/schemas/Quality"},"resolution":{"$ref":"#/components/schemas/Resolution"},"note":{"type":"string","minLength":1,"maxLength":400}}}}}},"responses":{"202":{"description":"Generation queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationGenerationEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientTokens"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"503":{"description":"Generation could not start, including an unavailable input check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/jobs/{jobId}":{"get":{"tags":["Jobs"],"summary":"Get generation status","security":[{"bearerApiKey":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"description":"Generation job ID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/jobs/{jobId}/feedback":{"post":{"tags":["Jobs"],"summary":"Rate a completed generation","security":[{"bearerApiKey":[]}],"description":"rating is 1 for works and -1 for missed. A missed rating must include a note.","parameters":[{"name":"jobId","in":"path","required":true,"description":"Generation job ID","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rating"],"properties":{"rating":{"type":"integer","enum":[1,-1]},"note":{"type":"string","maxLength":600}}}}}},"responses":{"200":{"description":"Recorded feedback","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}}}}},"components":{"securitySchemes":{"bearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_… or sk_test_…","description":"Create, reveal, scope, and revoke the key from the authenticated Account page. Never put it in a URL."}},"schemas":{"TokenBalance":{"type":"object","required":["balance"],"properties":{"balance":{"type":"integer","minimum":0}}},"Catalog":{"type":"object","required":["kinds","tilings","textureSizes","orientations","styles","qualities","animations","customAnimation","characterTokenCost"],"properties":{"kinds":{"type":"array","items":{"type":"object"}},"tilings":{"type":"array","items":{"type":"object"}},"textureSizes":{"type":"array","items":{"type":"integer"}},"orientations":{"type":"array","items":{"type":"object"}},"styles":{"type":"array","items":{"type":"object"}},"qualities":{"type":"array","items":{"type":"object"}},"resolutions":{"type":"array","items":{"$ref":"#/components/schemas/Resolution"}},"animations":{"type":"array","items":{"type":"object"},"description":"Each animation names the `kind` it is for: `character` or `object`."},"customAnimation":{"type":"object"},"characterTokenCost":{"type":"integer","description":"The token cost of one character, object or texture."}}},"Character":{"type":"object","required":["id","kind","name","description","orientation","tiling","style","visibility","createdAt","updatedAt","links"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/AssetKind"},"tiling":{"anyOf":[{"$ref":"#/components/schemas/Tiling"},{"type":"null"}],"description":"Textures only."},"name":{"type":"string"},"visibility":{"type":"string","enum":["public","private"],"default":"public","description":"Web links to public characters and animations open without sign-in. Versioned API endpoints still require an API key."},"description":{"type":"string"},"orientation":{"anyOf":[{"$ref":"#/components/schemas/Orientation"},{"type":"null"}],"description":"Null for a texture, which is seen from straight above."},"style":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"sourceType":{"type":"string"},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"reference":{"anyOf":[{"type":"object"},{"type":"null"}]},"links":{"type":"object"}}},"RenderSettings":{"type":"object","additionalProperties":false,"properties":{"clip":{"type":"string","enum":["cycle","full"],"default":"cycle","description":"Measured cycle, or whole animation when no cycle is found."},"fps":{"type":"integer","enum":[8,10,12,15,24],"default":15,"description":"Requested frame rate. On a measured cycle, playback may be retimed to the pose tempo."},"spriteHeight":{"type":"integer","enum":[32,48,64,96,128,192,306],"default":306},"scalePercentage":{"type":"integer","minimum":1,"maximum":100,"default":100},"layout":{"type":"string","enum":["grid","row"],"default":"grid"}}},"SpriteRender":{"type":"object","required":["id","animationId","status","settings","createdAt","updatedAt","expiresAt","error","links"],"properties":{"id":{"type":"string","format":"uuid"},"animationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","rendering","ready","failed"]},"settings":{"$ref":"#/components/schemas/RenderSettings"},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"expiresAt":{"type":["integer","null"],"description":"Expiry timestamp in milliseconds, or null for the default export."},"error":{"type":["object","null"]},"links":{"type":"object","required":["self"],"properties":{"self":{"type":"string","format":"uri"},"png":{"type":"string","format":"uri"},"sheetZip":{"type":"string","format":"uri"},"frames":{"type":"string","format":"uri"},"manifest":{"type":"string","format":"uri"},"godot":{"type":"string","format":"uri"}},"description":"Download links are present only when ready."}}},"RenderEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/SpriteRender"}}},"SheetManifest":{"type":"object","required":["schema","width","height","frameWidth","frameHeight","pivotX","pivotY","columns","rows","frames","fps","loop","samples"],"properties":{"schema":{"const":"spritekick/pose-v1"},"generator":{"type":"string"},"pose":{"type":"string"},"label":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"frameWidth":{"type":"integer"},"frameHeight":{"type":"integer"},"pivotX":{"type":"integer"},"pivotY":{"type":"integer"},"columns":{"type":"integer"},"rows":{"type":"integer"},"frames":{"type":"integer"},"order":{"const":"row-major"},"fps":{"type":"number"},"loop":{"type":"boolean"},"spriteHeight":{"type":"integer"},"scalePercentage":{"type":"integer"},"flat":{"type":"boolean"},"sampling":{"type":"string","enum":["nearest","smooth"]},"samples":{"type":"array","items":{"type":"object","required":["takeSeconds","sourceFrame"],"properties":{"takeSeconds":{"type":"number","description":"Sample timestamp in the stored animation."},"sourceFrame":{"type":"integer"}}}}}},"Animation":{"type":"object","required":["id","characterId","favorite","status","stage","progress","tokenCost","createdAt","updatedAt","links"],"properties":{"id":{"type":"string","format":"uuid"},"characterId":{"type":"string","format":"uuid"},"pose":{"type":["string","null"]},"poseLabel":{"type":["string","null"]},"name":{"type":["string","null"]},"note":{"type":["string","null"]},"favorite":{"type":"boolean"},"status":{"type":"string"},"stage":{"type":"string"},"progress":{"type":"integer"},"tokenCost":{"type":"integer"},"resolution":{"$ref":"#/components/schemas/Resolution"},"rating":{"type":["integer","null"]},"parentAnimationId":{"type":["string","null"]},"pipelineVersion":{"type":"string"},"take":{"type":["object","null"],"properties":{"durationSeconds":{"type":"number"},"fps":{"type":"number"},"frameCount":{"type":"integer"},"cycle":{"type":["object","null"],"properties":{"found":{"type":"boolean"},"startSeconds":{"type":"number"},"endSeconds":{"type":"number"}}}},"description":"Measured once at export time; null before measurement."},"sheet":{"anyOf":[{"$ref":"#/components/schemas/SpriteRender"},{"type":"null"}]},"error":{"anyOf":[{"type":"object"},{"type":"null"}]},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"completedAt":{"type":["integer","null"]},"links":{"type":"object"}}},"PageMeta":{"type":"object","required":["nextCursor"],"properties":{"nextCursor":{"type":["string","null"]}}},"PageLinks":{"type":"object","required":["next"],"properties":{"next":{"type":["string","null"],"format":"uri"}}},"CharacterEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Character"}}},"AnimationEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Animation"}}},"GenerationResult":{"type":"object","required":["characterId","jobId","tokenCost","balance"],"properties":{"characterId":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid"},"tokenCost":{"type":"integer","minimum":0},"balance":{"type":"integer","minimum":0}}},"AnimationGenerationResult":{"allOf":[{"$ref":"#/components/schemas/GenerationResult"},{"type":"object","required":["links"],"properties":{"links":{"type":"object"}}}]},"GenerationEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/GenerationResult"}}},"AnimationGenerationEnvelope":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AnimationGenerationResult"}}},"CharacterPage":{"type":"object","required":["data","meta","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Character"}},"meta":{"$ref":"#/components/schemas/PageMeta"},"links":{"$ref":"#/components/schemas/PageLinks"}}},"AnimationPage":{"type":"object","required":["data","meta","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Animation"}},"meta":{"$ref":"#/components/schemas/PageMeta"},"links":{"$ref":"#/components/schemas/PageLinks"}}},"JobEnvelope":{"type":"object","required":["data"],"properties":{"data":{"type":"object"}}},"Orientation":{"type":"string","enum":["platformer","threeQuarter","highAngle"]},"AssetKind":{"type":"string","enum":["character","object","texture"],"default":"character","description":"`character` is a figure with a body. `object` is a building, prop, vehicle or other entity; it uses the object animations. `texture` is a flat, seamless, top-down tile with no animations."},"Tiling":{"type":"string","enum":["both","horizontal","vertical"],"default":"both","description":"The directions a texture repeats in. `horizontal` and `vertical` keep the other axis's edges as drawn."},"Quality":{"type":"string","enum":["standard","premium"]},"Resolution":{"type":"string","enum":["standard","low"],"default":"standard","description":"Optional. `low` draws the animation at the lowest available resolution for any style: softer detail at the same token cost. Omitted, null, or `standard` uses the style's normal resolution."},"Style":{"type":"string","description":"A preset ID, custom, or a saved style ID returned by GET /catalog.","anyOf":[{"enum":["anime","pixel","cel","painted","rendered","clay","custom"]},{"pattern":"^saved:[0-9a-f-]+$"}]},"CreateCharacter":{"type":"object","required":["name","description","style"],"properties":{"kind":{"$ref":"#/components/schemas/AssetKind"},"tiling":{"$ref":"#/components/schemas/Tiling"},"orientation":{"$ref":"#/components/schemas/Orientation","description":"Required for a character or object. Ignored for a texture."},"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","minLength":1,"maxLength":1200},"style":{"$ref":"#/components/schemas/Style"},"customStyleName":{"type":"string","minLength":1,"maxLength":80},"customStyleDescription":{"type":"string","minLength":1,"maxLength":800}}},"CreateCharacterMultipart":{"allOf":[{"$ref":"#/components/schemas/CreateCharacter"},{"type":"object","properties":{"source_image":{"type":"string","format":"binary"},"style_reference":{"type":"string","format":"binary"},"custom_style_name":{"type":"string","minLength":1,"maxLength":80},"custom_style_description":{"type":"string","minLength":1,"maxLength":800}}}]},"CreateAnimation":{"type":"object","required":["pose","quality"],"properties":{"pose":{"type":"string","enum":["idle","walk","run","jump","attack","punch","kick","block","hurt","hit-react","dodge","dodge-lean","death","shoot","cast","pickup","push","pull","throw","wave","sit","kneel","point","sleep","victory","dance","talk","dash","fall","climb","swim","crouch","roll","fly","slide","object-idle","object-working","object-glow","object-move","object-open","object-attack","object-hit","object-destroyed","custom"],"description":"The animation must be for the asset's kind; see `kind` on each catalog animation. Textures have no animations."},"quality":{"$ref":"#/components/schemas/Quality"},"resolution":{"$ref":"#/components/schemas/Resolution"},"note":{"type":"string","maxLength":400},"customPoseLabel":{"type":"string","minLength":1,"maxLength":40},"customPoseDescription":{"type":"string","minLength":1,"maxLength":400}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"responses":{"BadRequest":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing, malformed, revoked, or unknown API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource does not exist or belongs to another account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"Resource state does not allow this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InsufficientTokens":{"description":"The account does not have enough tokens","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}