Mint a character upload URL
Get a signed PUT URL for one character reference image.
POST /v1/characters/uploads/init is the first step of the upload flow for creating a character. It returns a short-lived signed PUT URL plus an opaque upload_id. Upload your image bytes to that URL, then pass the upload_id to POST /v1/characters (or call POST /v1/characters/uploads/classify first to detect the pose).
You typically call this endpoint once per reference image. A character supports 1–6 refs.
When to use
- You already have ref images on disk or in your own storage and want to attach them to a new character without round-tripping bytes through your API.
- You want to capture pose metadata before committing the character (use
upload-classify).
generate: true + attributes to POST /v1/characters (the synthesize flow).
Lifecycle
POST /v1/characters/uploads/init→{ upload_id, upload_url, expires_at }.PUT <upload_url>with the image bytes (any well-formed PUT, no extra headers required).- Optional:
POST /v1/characters/uploads/classifywith the sameupload_idto detect the pose. POST /v1/characterswith{ upload_ids: [upl_..., ...] }to consume the uploads and create the character.
Example
Limits
- Rate limit: bucket
characters_post— 30 requests/min sustained, 60 burst per team. - Upload URL TTL: 15 minutes. Mint a fresh URL if the PUT lands later.
- Upload ticket TTL: 24 hours. After that the bytes are evicted and
upload_idis no longer accepted onPOST /v1/characters.
Common pitfalls
- The
upload_urlis not authenticated — the signature is in the query string. Do not addX-Api-Keyto the PUT. - One ticket = one image. Mint multiple tickets in parallel for multi-ref characters.
- Browsers may need a CORS-aware proxy in front of the PUT — the V1 surface targets server-side integrators and does not advertise CORS headers on the upload host.
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"
Body
Original filename (used for Content-Disposition; not stored as the storage key).
1 - 120"front-portrait.jpg"
File extension. Must match content_type; mismatched combinations return 400.
jpeg, jpg, png, webp "jpg"
MIME type. Must match extension; mismatched combinations return 400.
image/jpeg, image/png, image/webp "image/jpeg"
Response
Upload ticket minted
Upload ticket ID. Use as upload_id on POST /v1/characters/uploads/classify and POST /v1/characters.
"upl_01HXMQ7Z3K8Y2NABCDEFGHJKMR"
Pre-signed PUT URL — upload bytes via HTTP PUT with the headers from upload_headers. The URL expires at expires_at.
"https://aurous.storage/.../upload?signature=…"
HTTP headers to include on the PUT request (Content-Type matches the request payload).
{ "Content-Type": "image/jpeg" }
Upload URL expiration (ISO 8601). Re-mint via /uploads/init if you need to retry past this point.
"2026-05-08T10:15:00Z"

