Skip to main content
POST
Regenerate one named view (synchronous)
POST /v1/characters/{id}/refs/{view}/regenerate re-renders one of the eight named views and returns the updated character. A view the character does not have yet is added. Every character created on or after 2026-09-14 carries all eight views, so on a new character this route only re-renders. Characters created before that date carry six — head_front, upper_front, lower_front, upper_back, lower_back, full_left — and this route is the only way to add full_right to one while it is ready. (Resynthesize, available while reviewing or failed, also brings an older character to eight.) full_front can also be reached through the deprecated body form ({ "pose": "front" }), which aliases onto it. The call is synchronous: it blocks until the view is rendered. A render takes 60–180 seconds — set a client timeout of at least 300 seconds.
A view holding a photo you uploaded cannot be regenerated. Your photo is the ground truth the character is rendered from, so re-rolling it would discard the identity and charge you for the privilege: the call returns 400 reference_uploaded with param: view, and nothing is charged. Replace it with PUT /v1/characters/{id}/refs/{view} instead, or remove it from a draft with DELETE /v1/characters/{id}/refs/{view} and let a build render it. Check views[].statusuploaded means this route will refuse.
The request is charged before the render is dispatched. Aborting the HTTP request client-side does not cancel the render and does not refund the credits — you simply stop waiting for a response you already paid for. A credit refund happens only when the render itself fails server-side. If your HTTP client’s default timeout is 30 or 60 seconds, raise it before you call this route.

When to use

  • One view came back wrong and the rest are fine.
  • An older six-view character needs full_front or full_right for a video or an edit — this route is the only way to add full_right to a ready one. A reviewing or failed character can instead be brought to eight with Resynthesize.
For a whole new set, use Resynthesize.

Path parameters

Examples

Limits

  • Cost: build.per_view_credits (read it from the character; do not hardcode). Charged up front; refunded automatically if the render fails.
  • Rate limit: bucket characters_synthesize — 15 requests/min sustained, 30 burst per team. Shared across POST /v1/characters, POST /v1/characters/{id}/refs/regenerate, POST /v1/characters/{id}/refs/{view}/regenerate, POST /v1/characters/{id}/resynthesize and POST /v1/characters/{id}/build — five routes, one bucket.
  • Idempotency: pass Idempotency-Key. Because the view is part of the path, use one key per view — reusing a key across two views returns 409 idempotency_key_in_use.

Errors

Common pitfalls

  • The legacy body form POST /v1/characters/{id}/refs/regenerate with { "pose": ... } still works but reaches only four views through a fixed alias table — see its page. Its 2xx responses carry Deprecation: true and a Link header pointing here. Prefer this route.
  • views[] and refs[] describe the same references; refs[].pose keeps the original five-value label for compatibility, refs[].view carries the view name. See Views and lifecycle.
  • Check views[].status before offering a regenerate in your UI: generated can be re-rolled here, uploaded cannot.
These changes ship on the existing 2026-08-26 contract. No Aurous-Version pin isolates them: the version catalogue carries image and video pricing pointers only, not character pricing or the size of the reference set. Pinning an earlier Aurous-Version restores neither the smaller reference set nor the previous price. A character created before 2026-09-14 keeps the references it already has — add either of the two newer views on demand with POST /v1/characters/{id}/refs/{view}/regenerate; every character created on or after that date carries eight.

Authorizations

X-Api-Key
string
header
required

Your team API key (starts with al_live_).

Headers

Idempotency-Key
string

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). One key per view: the view is part of the path, so reusing a key across two views returns 409 idempotency_key_in_use.

Aurous-Version
string

Optional API version pin (YYYY-MM-DD). Omit the header to receive the platform default, currently 2026-08-26.

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2026-08-26"

Path Parameters

id
string
required

Opaque character ID

Example:

"char_01HXMQ7Z3K8Y2NABCDEFGHJKMR"

view
enum<string>
required

The view to render

Available options:
head_front,
upper_front,
lower_front,
upper_back,
lower_back,
full_left,
full_front,
full_right

Response

View rendered; updated character returned

id
string
required

Opaque character ID.

Example:

"char_01HXMQ7Z3K8Y2NABCDEFGHJKMR"

object
enum<string>
required

Discriminator

Available options:
character
Example:

"character"

name
string
required

Display name.

Example:

"Aurora the Adventurer"

status
enum<string>
required

Lifecycle state. draft: references are being assembled; nothing has been charged and the character cannot be used for generation. New lifecycle states may be added in future — treat any status other than ready as "not yet usable". synthesizing: references are being built. ready: usable on POST /v1/images — both create flows advance here on their own. reviewing: reached only after POST /:id/resynthesize or POST /:id/build; call POST /:id/save to return to ready. failed: the build failed; error_message carries the reason and POST /:id/build (builder characters) or POST /:id/resynthesize retries. deleted: soft-deleted (filtered out of the list endpoint).

Available options:
draft,
synthesizing,
reviewing,
ready,
failed,
deleted
Example:

"ready"

nudity
enum<string>
required

What the reference set is rendered as — nude unless you chose clothed, or — when you omitted nudity — your team's default is clothed. An explicit value always wins. Fixed once the references are built.

Available options:
nude,
clothed
Example:

"clothed"

refs
object[]
required

Reference images, one per view the character has. A character built today has eight; an older one can have fewer than eight (typically six, some of the oldest four). Do not assume a count — read views[], the canonical read model for new integrations, or build.missing_views. refs[] lists only the references that exist.

views
object[]
required

One entry per named view, in canonical order — every reference that maps to a named view, keyed by view, plus what is missing or was rejected. A reference from before named views existed (refs[].view is other) appears only in refs[].

build
object
required

What a build would render and cost right now. Always present.

created_at
string
required

Creation timestamp (ISO 8601).

Example:

"2026-05-08T10:00:00Z"

updated_at
string
required

Last-update timestamp (ISO 8601).

Example:

"2026-05-08T10:00:00Z"

client_reference_id
string | null

Caller-supplied reference echoed back (the value sent on create). Null if unset.

Example:

"bot_8472"

attributes
object | null

Character attributes. Null when unset.

error_message
string | null

Machine-readable failure code from the most recent synthesize/resynthesize attempt. One of synthesis_failed, synthesis_timeout, provider_unavailable — a closed set to switch on, not customer-facing prose. Null when the most recent attempt succeeded (or none has run yet). Set on failed, but NOT failed-exclusive: a failed resynthesize restores the character to its prior working status (reviewing) rather than overwriting a good generation, so a reviewing row can carry a non-null code here — check this field for failure, not status. Cleared on the next resynthesize attempt and on success.

Example:

null

aurous_version
string

API contract version applied at the time this row was minted (D25 — frozen for replay across future version bumps).

Example:

"2026-08-26"