Create a character
Upload existing ref images or synthesize 4 ref poses from a description.
POST /v1/characters creates a character — a reusable identity asset you can attach to any image generation via character_id. There are two mutually exclusive flows:
- Upload flow: pass
upload_ids(1–6) collected fromPOST /v1/characters/uploads/init. The platform moves the bytes to character storage and the response comes back withstatus: ready— immediately usable. - Synthesize flow: pass
generate: trueplus anattributesobject describing who the character is. The platform dispatches a multi-image generation task that produces 4 ref poses (portrait,front,side,back). The response returnsstatus: synthesizingwhile generation is in flight, orstatus: reviewingif synthesis completed before the response returned (typical for fast runs). Either way, pollGET /v1/characters/{id}untilstatus: reviewing, then callPOST /v1/characters/{id}/saveto mark itready.
upload_ids or generate: true — never both, never neither.
Sending both or neither returns 400 parameter_invalid_combination.Upload flow
Use this when you already have ref images. Mint oneupload_id per file via POST /v1/characters/uploads/init, PUT the bytes, then create the character.
Synthesize flow
Use this when you want the platform to generate the refs from a description. Theattributes object is locked at v1.0 to a small set of typed fields plus a free-text additional_details catch-all. Synthesize burns credits at create time (4 generation dispatches), so prefer to estimate cost via POST /v1/images/estimate on the equivalent prompt if you need a budget guardrail in your UI.
Status transitions
| Flow | Initial | After processing | Customer action |
|---|---|---|---|
| Upload | ready | — | Use immediately on POST /v1/images. |
| Synthesize | synthesizing (or reviewing if synth completed before the 201 returned) | reviewing | Poll GET /v1/characters/{id}. When reviewing, call POST /v1/characters/{id}/save to publish; or call POST /v1/characters/{id}/resynthesize to retry. |
| Synthesize (failed) | synthesizing | failed | error_message populated. Call POST /v1/characters/{id}/resynthesize to retry. |
Limits
- Rate limit: bucket
characters_synthesize— 6 requests/min sustained, 12 burst per team. Both flows ride this bucket since the synthesize discriminator is decided server-side after the request lands. - Idempotency: pass
Idempotency-Key(any opaque value, 1–256 chars). Same key + same body within 24h replays the cached response withAurous-Idempotent-Replayed: true. Same key + different body returns409 idempotency_key_in_use. See Idempotency for details.
Idempotency-Key on synthesize-flow create — it dispatches
4 paid generations, so a network retry without a key can double-charge.Errors
| Code | HTTP | When |
|---|---|---|
parameter_invalid_combination | 400 | Sent both upload_ids and generate: true, or neither. |
upload_invalid | 400 | One of the upload_ids is unknown, expired, or already consumed. |
insufficient_credits | 402 | Synthesize-flow dispatch when team credits < cost. |
idempotency_key_in_use | 409 | Same Idempotency-Key was used with a different body. |
rate_limit_exceeded | 429 | Burst > 12 or sustained > 6/min. |
Common pitfalls
- The synthesize flow returns 201 immediately, but the character is not usable until it transitions to
ready— either automatically (upload flow) or viaPOST /v1/characters/{id}/save(synthesize flow). CallingPOST /v1/imageswith asynthesizingorreviewingcharacter_idreturns400 character_not_ready. - An upload flow with a single ref still works, but synthesis needs at least the typed
attributesto anchor identity. Don’t pass emptyattributes. - The
attributesschema is locked for v1.0; new attributes go intoadditional_detailsuntil a v1.1 bump introduces them as typed fields.
Authorizations
Your team API key (starts with al_live_).
Headers
Optional API version pin (YYYY-MM-DD). Defaults to your team's pinned version, or the system default 2026-05-15 for unauthenticated requests.
^\d{4}-\d{2}-\d{2}$"2026-05-15"
Stripe-style idempotency key (1-256 chars). Same key + same canonical-JSON body returns the cached response with Aurous-Idempotent-Replayed: true. Same key against a different route (e.g. previously used on /v1/images) returns 409 invalid_request / idempotency_key_in_use. Replay window is 24 hours. Absent header is treated as non-idempotent (each call processes anew).
Body
Display name for the character (1-80 chars).
1 - 80"Aurora the Adventurer"
Selects the synthesize flow when true (the platform generates 4 ref poses from attributes). When omitted/false, upload_ids must be provided to attach customer-supplied refs. Mutually exclusive with upload_ids.
false
Upload tickets from POST /v1/characters/uploads/init (1-6). When set, the upload flow is used and the server moves bytes from upload storage to character storage on create (uploads are consumed). Mutually exclusive with generate: true.
1 - 6 elements["upl_01HXMQ7Z3K8Y2NABCDEFGHJKMR"]Character attributes used by the synthesize flow. Required when generate: true. Optional on the upload flow (used as descriptive metadata only).
Optional caller-supplied reference, echoed back on GET /v1/characters/{id} and in every character webhook for this character. Use it to correlate the webhook with the originating record in your system (Stripe-style). Immutable after create. Max 256 chars.
256"bot_8472"
Response
Character accepted; synthesis dispatched (status: synthesizing, refs: []).
Opaque character ID.
"char_01HXMQ7Z3K8Y2NABCDEFGHJKMR"
Discriminator
character "character"
Display name.
"Aurora the Adventurer"
Lifecycle state. synthesizing: synthesize flow running. reviewing: synthesize completed, awaiting POST /:id/save. ready: usable on POST /v1/images. failed: synthesize failed; use POST /:id/resynthesize to retry. deleted: soft-deleted (filtered out of list endpoint).
synthesizing, reviewing, ready, failed, deleted "ready"
Reference images (typically 4 poses).
Creation timestamp (ISO 8601).
"2026-05-08T10:00:00Z"
Last-update timestamp (ISO 8601).
"2026-05-08T10:00:00Z"
Caller-supplied reference echoed back (the value sent on create). Null if unset.
"bot_8472"
Character attributes. Null when unset.
Error message when status is failed. Null otherwise.
null
API contract version applied at the time this row was minted (D25 — frozen for replay across future version bumps).
"2026-05-15"

