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 an image or video generation via character_id (see Create an image or Create a video). 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 7 typed fields plus a free-text additional_details catch-all; on this synthesize flow every field drives generation (on the upload flow only additional_details is used, and only as a best-effort hint — see Upload flow). 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
Limits
- Rate limit: bucket
characters_synthesize— 15 requests/min sustained, 30 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
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/imagesorPOST /v1/videoswith asynthesizingorreviewingcharacter_idreturns400 character_not_ready. - An upload flow with a single ref still works. On the upload flow your reference images define identity, so the 7 typed
attributes(gender, age, etc.) are stored and echoed back but do not shape the generated refs — onlyadditional_detailsis applied there, and only as a best-effort hint (your reference images are the primary signal). The synthesize flow (generate: true) is the opposite: allattributesdrive generation, so don’t send emptyattributesthere. - 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
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).
Optional API version pin (YYYY-MM-DD). Defaults to your team's pinned version, or the system default 2026-07-16 for unauthenticated requests.
^\d{4}-\d{2}-\d{2}$"2026-07-16"
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 elementsCharacter attributes. Required when generate: true (synthesize flow), where ALL fields drive generation. Optional on the upload flow, where the 7 typed fields (gender, age, ethnicity, hair_color, hair_style, eye_color, body_type) are stored and echoed back but do NOT shape the generated refs — your uploaded images define identity. additional_details is the exception: it is also applied on the upload flow as a free-text styling hint, but treat it as best-effort — your uploaded reference images are the primary signal, so supply a reference image for any trait you need to guarantee.
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-07-16"

