curl --request POST \
--url https://api.aurous-labs.com/v1/images \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"prompt": "A golden sunset over mountains, cinematic lighting, 8k resolution",
"lora_id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"width": 1472,
"height": 1472,
"size": "1_5k_1_1",
"count": 1,
"enhance_prompt": false,
"reference_image_urls": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/ref2.jpg"
],
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_urls": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"
]
}
],
"context_images": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/outfit.jpg"
],
"action_id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"output_format": "jpeg"
}
'import requests
url = "https://api.aurous-labs.com/v1/images"
payload = {
"prompt": "A golden sunset over mountains, cinematic lighting, 8k resolution",
"lora_id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"width": 1472,
"height": 1472,
"size": "1_5k_1_1",
"count": 1,
"enhance_prompt": False,
"reference_image_urls": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN", "https://example.com/ref2.jpg"],
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_urls": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"]
}
],
"context_images": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN", "https://example.com/outfit.jpg"],
"action_id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"output_format": "jpeg"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'A golden sunset over mountains, cinematic lighting, 8k resolution',
lora_id: 'lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
character_id: 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
width: 1472,
height: 1472,
size: '1_5k_1_1',
count: 1,
enhance_prompt: false,
reference_image_urls: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN', 'https://example.com/ref2.jpg'],
subjects: [
{
type: 'character',
character_id: 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
image_urls: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN']
}
],
context_images: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN', 'https://example.com/outfit.jpg'],
action_id: '3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c',
output_format: 'jpeg'
})
};
fetch('https://api.aurous-labs.com/v1/images', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aurous-labs.com/v1/images",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'A golden sunset over mountains, cinematic lighting, 8k resolution',
'lora_id' => 'lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'character_id' => 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'width' => 1472,
'height' => 1472,
'size' => '1_5k_1_1',
'count' => 1,
'enhance_prompt' => false,
'reference_image_urls' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN',
'https://example.com/ref2.jpg'
],
'subjects' => [
[
'type' => 'character',
'character_id' => 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'image_urls' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN'
]
]
],
'context_images' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN',
'https://example.com/outfit.jpg'
],
'action_id' => '3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c',
'output_format' => 'jpeg'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aurous-labs.com/v1/images"
payload := strings.NewReader("{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aurous-labs.com/v1/images")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurous-labs.com/v1/images")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}"
response = http.request(request)
puts response.read_body{
"object": "inference",
"id": "img_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"status": "succeeded",
"prompt": "A golden sunset over mountains, cinematic lighting",
"created_at": "2026-05-04T10:00:00Z",
"media_type": "image",
"output_urls": [
"https://api.aurous-labs.com/v1/images/img_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output/0"
],
"video_url": "https://api.aurous-labs.com/v1/videos/vid_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output?token=...",
"reference_image_urls": [
"https://example.com/ref1.jpg"
],
"error_message": "Content policy violation",
"error_code": "generation_interrupted",
"duration_ms": 14820,
"cost": {
"amount": 6.5,
"currency": "credit",
"breakdown": {
"base": 6.5,
"size_tier": "standard"
}
},
"width": 1472,
"height": 1472,
"image_count": 1,
"size_preset": "1_5k_1_1",
"inference_type": "t2i",
"cfg_rescale": 0.7,
"denoise_strength": 0.6,
"seed": 819572108,
"video_duration": 5,
"video_resolution": "480p",
"video_ratio": "16:9",
"video_generate_audio": true,
"video_task": "reference",
"extend_direction": "forward",
"reference_video_url": "https://cdn.example.com/clips/dance-loop.mp4",
"reference_audio_url": "https://cdn.example.com/audio/voiceover.mp3",
"video_lora_id": "action_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"video_lora_name": "Cinematic Pan",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_count": 1
},
{
"type": "reference",
"character_id": null,
"image_count": 2
}
],
"context_images": {
"image_count": 3
},
"action": {
"id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"name": "Over-the-shoulder"
},
"style": {
"id": "lora_06AAAAAAAAAAAAAAAAAAAAAAAA",
"name": "Ring-Light Creator"
},
"warnings": [
{
"code": "style_retired_plain",
"param": "lora_id",
"message": "Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer applies a style — this request generates without one."
}
],
"enhancer_outcome": "succeeded",
"loras": [
{
"id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"name": "Sunset Style"
}
],
"aurous_version": "2026-08-26",
"creation_request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"completed_at": "2026-05-04T10:00:14Z"
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}Create an image
Submit an image generation. Optionally anchor identity with a character.
curl --request POST \
--url https://api.aurous-labs.com/v1/images \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"prompt": "A golden sunset over mountains, cinematic lighting, 8k resolution",
"lora_id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"width": 1472,
"height": 1472,
"size": "1_5k_1_1",
"count": 1,
"enhance_prompt": false,
"reference_image_urls": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/ref2.jpg"
],
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_urls": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"
]
}
],
"context_images": [
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/outfit.jpg"
],
"action_id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"output_format": "jpeg"
}
'import requests
url = "https://api.aurous-labs.com/v1/images"
payload = {
"prompt": "A golden sunset over mountains, cinematic lighting, 8k resolution",
"lora_id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"width": 1472,
"height": 1472,
"size": "1_5k_1_1",
"count": 1,
"enhance_prompt": False,
"reference_image_urls": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN", "https://example.com/ref2.jpg"],
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_urls": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"]
}
],
"context_images": ["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN", "https://example.com/outfit.jpg"],
"action_id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"output_format": "jpeg"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'A golden sunset over mountains, cinematic lighting, 8k resolution',
lora_id: 'lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
character_id: 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
width: 1472,
height: 1472,
size: '1_5k_1_1',
count: 1,
enhance_prompt: false,
reference_image_urls: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN', 'https://example.com/ref2.jpg'],
subjects: [
{
type: 'character',
character_id: 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
image_urls: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN']
}
],
context_images: ['file_01HXMQ7Z3K8Y2NABCDEFGHJKMN', 'https://example.com/outfit.jpg'],
action_id: '3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c',
output_format: 'jpeg'
})
};
fetch('https://api.aurous-labs.com/v1/images', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aurous-labs.com/v1/images",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'A golden sunset over mountains, cinematic lighting, 8k resolution',
'lora_id' => 'lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'character_id' => 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'width' => 1472,
'height' => 1472,
'size' => '1_5k_1_1',
'count' => 1,
'enhance_prompt' => false,
'reference_image_urls' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN',
'https://example.com/ref2.jpg'
],
'subjects' => [
[
'type' => 'character',
'character_id' => 'char_01HXMQ7Z3K8Y2VNABCDEFGHJKM',
'image_urls' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN'
]
]
],
'context_images' => [
'file_01HXMQ7Z3K8Y2NABCDEFGHJKMN',
'https://example.com/outfit.jpg'
],
'action_id' => '3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c',
'output_format' => 'jpeg'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aurous-labs.com/v1/images"
payload := strings.NewReader("{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aurous-labs.com/v1/images")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurous-labs.com/v1/images")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"A golden sunset over mountains, cinematic lighting, 8k resolution\",\n \"lora_id\": \"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"width\": 1472,\n \"height\": 1472,\n \"size\": \"1_5k_1_1\",\n \"count\": 1,\n \"enhance_prompt\": false,\n \"reference_image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/ref2.jpg\"\n ],\n \"subjects\": [\n {\n \"type\": \"character\",\n \"character_id\": \"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM\",\n \"image_urls\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\"\n ]\n }\n ],\n \"context_images\": [\n \"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN\",\n \"https://example.com/outfit.jpg\"\n ],\n \"action_id\": \"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c\",\n \"output_format\": \"jpeg\"\n}"
response = http.request(request)
puts response.read_body{
"object": "inference",
"id": "img_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"status": "succeeded",
"prompt": "A golden sunset over mountains, cinematic lighting",
"created_at": "2026-05-04T10:00:00Z",
"media_type": "image",
"output_urls": [
"https://api.aurous-labs.com/v1/images/img_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output/0"
],
"video_url": "https://api.aurous-labs.com/v1/videos/vid_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output?token=...",
"reference_image_urls": [
"https://example.com/ref1.jpg"
],
"error_message": "Content policy violation",
"error_code": "generation_interrupted",
"duration_ms": 14820,
"cost": {
"amount": 6.5,
"currency": "credit",
"breakdown": {
"base": 6.5,
"size_tier": "standard"
}
},
"width": 1472,
"height": 1472,
"image_count": 1,
"size_preset": "1_5k_1_1",
"inference_type": "t2i",
"cfg_rescale": 0.7,
"denoise_strength": 0.6,
"seed": 819572108,
"video_duration": 5,
"video_resolution": "480p",
"video_ratio": "16:9",
"video_generate_audio": true,
"video_task": "reference",
"extend_direction": "forward",
"reference_video_url": "https://cdn.example.com/clips/dance-loop.mp4",
"reference_audio_url": "https://cdn.example.com/audio/voiceover.mp3",
"video_lora_id": "action_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"video_lora_name": "Cinematic Pan",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"subjects": [
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_count": 1
},
{
"type": "reference",
"character_id": null,
"image_count": 2
}
],
"context_images": {
"image_count": 3
},
"action": {
"id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"name": "Over-the-shoulder"
},
"style": {
"id": "lora_06AAAAAAAAAAAAAAAAAAAAAAAA",
"name": "Ring-Light Creator"
},
"warnings": [
{
"code": "style_retired_plain",
"param": "lora_id",
"message": "Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer applies a style — this request generates without one."
}
],
"enhancer_outcome": "succeeded",
"loras": [
{
"id": "lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"name": "Sunset Style"
}
],
"aurous_version": "2026-08-26",
"creation_request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"completed_at": "2026-05-04T10:00:14Z"
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}{
"error": {
"type": "invalid_request",
"code": "balance_too_low",
"message": "Team available balance is 1.5 credits, generation requires 2.0.",
"doc_url": "https://docs.aurous-labs.com/errors#balance_too_low",
"request_id": "req_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"param": "prompt",
"reason": "wrong_view",
"detected_view": "full_left"
}
}POST /v1/images submits an image generation request. Admitting the generation places a hold for the full price and reduces your available balance immediately — see Image pricing for the rate card and how the hold settles; the generation is processed asynchronously. Poll GET /v1/images/{id} for status, or register a webhook endpoint for a push callback when the generation completes or fails.
For a step-by-step walkthrough, see the Quickstart. The full request shape, including all generation parameters, is in the playground below.
Using a style
Styles come fromGET /v1/loras; pass a style’s id (opaque lora_* or slug) as lora_id. The field is tri-state:
| You send | What happens |
|---|---|
| (omitted) | Style matching runs automatically: when your prompt clearly names a look (e.g. “golden-hour film photo”), a matching style is applied. Matching is conservative — most prompts resolve to no style. |
"lora_…" or a slug | That style is pinned and applied. |
null | Style matching is disabled for this request — the image generates without a style. |
style: { id, name } (or null), and style.id round-trips — pass it back as lora_id to reuse the style.
Styles compose with composition acts and subjects — pin a style and an action_id together and both apply. One special case: some catalog entries are composition acts. Sending an act’s id as lora_id pins the act itself, so combining it with a different action_id returns 400 parameter_invalid_combination. The same applies to subjects: the few styles that pick their own model still return 400 parameter_invalid_combination when combined with subjects. lora_id remains incompatible with context_images.
Retired styles
Retired style ids keep working — how depends on the style:- Aliased — the id applies its designated successor style; the response
styleechoes the successor. Update your stored id at your convenience. - Plain — the request succeeds but generates without a style, and the response carries a
warnings[]entry with codestyle_retired_plain. - Discontinued — a small set of styles no longer generate at all:
400with codestyle_retired. Pick a current style fromGET /v1/loras.
Batching with count
count (1–4, whole number) generates that many images in parallel and bills per image. If some images in the batch fail, you receive the ones that succeeded and the difference is refunded automatically — the response image_count reflects the number actually delivered, and output_urls contains one URL per delivered image.
Warnings
The 201 body (and the estimate response) may carrywarnings[] — non-fatal adjustments the platform made to your request:
{
"warnings": [
{
"code": "style_retired_plain",
"param": "lora_id",
"message": "Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer applies a style — this request generates without one."
}
]
}
style_retired_plain (see above) and parameter_ignored (a parameter you sent has no effect on the generation path your request selected — for example seed on a styled generation). The key is omitted when there is nothing to report, appears only on the create and estimate responses (never on GETs, lists, or webhooks), and the code set is open — ignore codes you don’t recognize. Idempotent replays return the original warnings verbatim.
Response fields echo the request parameters as sent, not as used: an ignored parameter (flagged in warnings[]) is echoed back with exactly the value you sent, not the value that was actually applied.
Using a character
Whencharacter_id is set, the platform attaches the character’s saved references to the generation as visual anchors for identity consistency: the cover reference (head_front) is the identity anchor on the default engine, and on the multi-reference engine up to six of the character’s views go in. That up-to-six fan-in applies to the top-level character_id field only; a character entry in subjects[] always contributes its cover reference and nothing else. The dispatch path is image-to-image, so denoise_strength becomes effective and influences how closely the output follows the refs vs the prompt.
The character must be in status: ready. Use a synthesizing / reviewing / failed character, or a soft-deleted one, and the request returns 400 character_not_ready.
character_id and reference_image_urls are mutually exclusive. Sending
both returns 400 mutually_exclusive_input. Pick one path per generation.curl -X POST https://api.aurous-labs.com/v1/images \
-H "X-Api-Key: $AUROUS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"prompt": "Aurora at golden hour on a windswept cliff, cinematic",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"size": "1_5k_2_3"
}'
head_front) as the identity anchor on the default engine; on the multi-reference engine it sends up to six views. The up-to-six fan-in belongs to the top-level character_id; a character subject in subjects[] always contributes exactly its cover reference. There is no way to choose the subset yourself.
Size
Specify image dimensions one of two ways — never both: Named preset viasize:
| Tier | Bills at | Available aspect ratios |
|---|---|---|
1_5k | standard | 1:1, 3:2, 2:3, 4:3, 3:4, 16:9, 9:16, 21:9 |
2k | large | 1:1, 3:2, 2:3, 4:3, 3:4, 16:9, 9:16, 21:9 |
4k | large | 1:1, 3:2, 2:3, 4:3, 3:4, 16:9, 9:16, 21:9 |
<tier>_<ratio> form, e.g. 1_5k_16_9, 2k_1_1, 4k_2_3.
Omitting size (and not passing width/height either) defaults to 1_5k_1_1 — the cheapest, standard-tier preset.
See Image pricing for the credit rate per tier and exactly how the tier is decided.
Custom dimensions via width and height:
- Both required when used.
- Range
[1024, 4096]per side. - Snapped server-side to the nearest multiple of 32.
size and width/height returns 400 parameter_invalid_combination. Sending only one of width/height returns 400 missing_field.
The response’s width/height (and size_preset, for the named-preset path) echo your resolved request — the post-snap dimensions for a custom size, or the preset’s fixed dimensions. For most requests that’s also the delivered file’s actual pixel size, but not always: a very large request can render at a smaller size than requested, and when that happens the response still reports the dimensions you requested, not the delivered file’s.
Idempotency
PassIdempotency-Key (any opaque value, 1–256 chars; UUID v4 recommended). Same key + same body within 24h replays the cached response with Aurous-Idempotent-Replayed: true. Same key + different body returns 409 idempotency_key_in_use. The 24h window and 1–256 char bound are documented in Idempotency.
Webhooks
Register a webhook endpoint subscribed toimage.completed / image.failed (POST /v1/webhook_endpoints) to receive a POST callback when the generation reaches a terminal state. The event payload is { event: "image.completed" | "image.failed", data: {...} } where data matches the GET /v1/images/{id} response. See Webhooks for signature verification.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 + different body returns 409 invalid_request / idempotency_key_in_use. UUID v4 recommended. Replay window is 24 hours. Absent header is treated as non-idempotent (each call processes anew).
Optional API version pin (YYYY-MM-DD). Omit the header to receive the platform default, currently 2026-08-26.
^\d{4}-\d{2}-\d{2}$"2026-08-26"
Body
The text prompt describing the image to generate. 1-4000 characters; whitespace-only is rejected.
1 - 4000"A golden sunset over mountains, cinematic lighting, 8k resolution"
Optional. Style identifier (lora_*) or slug, from GET /v1/loras. Tri-state: omit and matching runs automatically when your prompt names a look; send null to disable style matching for this request; send an id to pin that style. Styles now compose with action_id and subjects — a composition-act id in this field cannot be combined with a different action_id. Retired style ids keep working: aliased ids apply their successor style (echoed in response.style); other retired ids generate without a style and add a warnings[] entry.
"lora_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Optional character ID (char_<ulid> from POST /v1/characters; UUID also accepted for legacy back-compat). When set, the character's reference images are sent to the model as visual anchors for identity consistency. The character must be in status: ready — referencing a synthesizing / reviewing / failed character returns 400 character_not_ready. Cross-team character_ids return 404 (existence is never leaked). Mutually exclusive with reference_image_urls: sending both returns 400 mutually_exclusive_input. The output follows your prompt. Superseded by subjects[]; fully supported — successful responses carry an advisory Deprecation: true header when this field is used.
"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Custom output image width in pixels. Use with height OR use size (preset), not both. Range [1024, 4096]; snapped server-side to the nearest multiple of 32. Output pixels (width × height) <= 2,360,000 bill the standard tier; above that, the large tier — see GET /v1/models for current per-tier pricing. Sending both size and custom dimensions returns 400 with code parameter_invalid_combination. Sending only one of width/height returns 400 with code missing_field.
1024 <= x <= 40961472
Custom output image height in pixels. Use with width OR use size (preset), not both. Range [1024, 4096]; snapped server-side to the nearest multiple of 32. Output pixels (width × height) <= 2,360,000 bill the standard tier; above that, the large tier — see GET /v1/models for current per-tier pricing. Sending both size and custom dimensions returns 400 with code parameter_invalid_combination. Sending only one of width/height returns 400 with code missing_field.
1024 <= x <= 40961472
Image size as a named preset. Use this OR custom width/height, not both. Format is <tier>_<ratio> where tier is 1_5k, 2k, or 4k and ratio matches the supported aspect-ratio set. Defaults to 1_5k_1_1 (1472×1472, standard tier) when omitted. Output pixels (width × height) <= 2,360,000 bill the standard tier; above that, the large tier — see GET /v1/models for current per-tier pricing. Sending both size and custom dimensions returns 400 with code parameter_invalid_combination.
1_5k_1_1, 1_5k_3_2, 1_5k_2_3, 1_5k_4_3, 1_5k_3_4, 1_5k_16_9, 1_5k_9_16, 1_5k_21_9, 2k_1_1, 2k_3_2, 2k_2_3, 2k_4_3, 2k_3_4, 2k_16_9, 2k_9_16, 2k_21_9, 4k_1_1, 4k_3_2, 4k_2_3, 4k_4_3, 4k_3_4, 4k_16_9, 4k_9_16, 4k_21_9 "1_5k_1_1"
Number of images to generate in this request (1-4, whole number). Images generate in parallel and you are billed per image; if some images in the batch fail, you receive the ones that succeeded and the difference is refunded automatically — the response image_count reflects the number actually delivered.
1 <= x <= 41
When true, an LLM rewrites your prompt before generation to a more detailed, model-friendly form; the rewritten prompt is what reaches the model. This is the only customer-facing prompt-shaping toggle in the public API. It is price-neutral on image generations: turning it on never adds a surcharge, cost.amount is unaffected, and breakdown carries no line item for it. Styled generations (a pinned or auto-matched style) always shape the prompt around the style through a separate, built-in pass — distinct from this flag, never fails a request, and — like this flag — never bills anything extra.
false
Up to 6 reference images. Each entry can be either:
- an opaque file ID
file_<ulid>returned byPOST /v1/files, or - an
https://URL pointing at a public host (max 2048 chars). URLs are server-side fetched through an SSRF-pinned client (rejects private IPs / loopback / link-local / cloud metadata) and materialized as a 24h-TTL file under your team. Image files only — afile_<ulid>uploaded with purposereference_video/reference_audiois rejected (400invalid_format). Pricing matches the reference-image rate (see Pricing). Empty array or omitted is treated as "no references". Mutually exclusive withcharacter_id— sending both returns 400mutually_exclusive_input. Superseded bysubjects[]; fully supported — successful responses carry an advisoryDeprecation: trueheader when this field is used.
6[
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/ref2.jpg"
]
Ordered subjects composed into one image (Image 1, Image 2, …). Max 10 subjects and 10 input images total. Mutually exclusive with character_id/reference_image_urls (both → 400 mutually_exclusive_input). Composes with lora_id when it names a style; the few styles that pick their own model still return 400 parameter_invalid_combination. Omit or [] for text-to-image/style.
10Show child attributes
Show child attributes
Up to 10 loose reference images for multi-image composition, interpreted from your prompt — no identity grouping or per-subject framing is applied, and no identity consistency is guaranteed. Positions follow array order and can be addressed in the prompt as "Image 1" … "Image 10" (e.g. "the outfit in Image 3"). Each entry is a file_<ulid> ID from POST /v1/files or an https URL to a public host (max 2048 chars). Empty array or omitted is treated as "no context images". Mutually exclusive with subjects, character_id, and reference_image_urls (400 mutually_exclusive_input) and with lora_id (400 parameter_invalid_combination — multi-image composition picks its own model; styles cannot be stacked). The response echoes only a count (context_images: { image_count }), never the image URLs.
10[
"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN",
"https://example.com/outfit.jpg"
]
Pin a composition act from GET /v1/actions. Treat the id as opaque — it comes from the catalog and nowhere else. With subjects, the act must support your subject count (see supported_character_counts) — an unsupported count returns 400 action_not_available. Without subjects, the act renders with a new person described by your prompt. Omit to let act detection run automatically; send null to disable detection for this request. Combinable with lora_id when that id names a prompt style (the act and the style compose); a composition-act id sent in lora_id already acts as the pin, so it cannot be combined with a DIFFERENT action_id (400 parameter_invalid_combination). Mutually exclusive with context_images (400 mutually_exclusive_input). An id that is unknown or not visible to your team returns 404 resource_not_found — the same uniform 404 as GET /v1/actions/{id}.
"3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c"
Output format. png yields a transparent background where the composition supports it. Default jpeg.
jpeg, png "jpeg"
Response
Generation created and pending processing
Discriminator — always inference. Mirrors OpenAI's object-field convention so SDK clients can branch on the resource type without inspecting the ID prefix. A single canonical value (inference) covers both image and video generations; use media_type to distinguish the rendering kind.
inference "inference"
Opaque generation ID
"img_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Current generation status. Lifecycle: pending (created, awaiting dispatch) → processing (running) → one of the terminal values succeeded / failed / cancelled. Additional terminal values may be introduced in future API versions and will be announced via the changelog before they appear on the wire.
pending, processing, succeeded, failed, cancelled "succeeded"
The text prompt used for generation, echoing the prompt submitted on the request. null when the generation was created without one — for example a video driven by a pinned video model (video_lora_id alone, or with a cast). Always read this field as nullable.
"A golden sunset over mountains, cinematic lighting"
Creation timestamp (ISO 8601)
"2026-05-04T10:00:00Z"
Distinguishes image vs video generation. May be null for older rows minted before this column existed.
image, video "image"
Generated image proxy URLs. Each URL is anonymous-read (no auth header required) and edge-cached for 24 hours. Available for ~24 hours after generation. Save what you want to keep — long-term storage is intentionally not part of the platform. URLs return 410 Gone after expiry.
[
"https://api.aurous-labs.com/v1/images/img_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output/0"
]
Generated video proxy URL (only present on media_type: video). Same 24h TTL as image output_urls.
"https://api.aurous-labs.com/v1/videos/vid_01HXMQ7Z3K8Y2VNABCDEFGHJKM/output?token=..."
The reference image URLs you supplied as visual anchors for this generation, echoed back (snapshotted at inference time). Present only when the generation was driven by your own reference images (reference_image_urls or reference subjects). Omitted entirely for character-driven generations — a character's reference images are managed platform assets and are never echoed.
["https://example.com/ref1.jpg"]
Human-readable error message if the generation failed. Non-contractual prose — do not parse or match on this value. Switch on error_code instead.
"Content policy violation"
Machine-readable failure reason when status is failed, for the cases where you need to branch in code. null on every successful generation, on failures recorded before this field existed, and on failure paths that have no stable code — error_message is human-facing copy that is re-tuned over time, so never pattern-match it. Currently emitted: generation_interrupted, reference_preparation_failed, content_filtered, generation_failed, first_frame_too_small (an https:// first_frame_url attached to a video model whose dimensions were below the minimum — a file_<ulid> frame is rejected with the same code as a 400 before any credits are held; see Errors), reference_blocked (a supplied reference image was declined by a content check — the same code POST requests receive synchronously when our own pre-generation check rejects a reference; here it surfaces asynchronously on a failed generation instead, see Errors), and output_moderation_rejected (a content check declined the rendered output itself, after generation — always async, since there is nothing to check before the output exists; the hold is fully refunded (cost.refunded: true) and no output URLs are ever produced for that id, see Errors). The set is additive: new codes may appear, so treat an unrecognized value as a generic failure, keep a default branch in your switch statement, and fall back to error_message.
"generation_interrupted"
Processing duration in milliseconds (set on terminal status)
14820
Per-generation cost breakdown — same shape as the estimated_cost returned by POST /v1/{images,videos}/estimate. May be null for older rows from before this field existed; populated for all new generations. The amount reflects the committed charge for terminal-status rows — 0 (with refunded: true) on a failed generation, since the reserved hold was released, never charged.
Show child attributes
Show child attributes
{
"amount": 6.5,
"currency": "credit",
"breakdown": { "base": 6.5, "size_tier": "standard" }
}
Resolved output image width in pixels (image generations only). This is the post-snap REQUESTED dimension: it may differ from a custom-requested width by up to 31 px due to multiple-of-32 snapping, and combined with height it is what determined the billing tier — output pixels (width × height) <= 2,360,000 bill the standard tier, above that the large tier (see GET /v1/models). It is NOT a guarantee of the delivered file: a request carrying subjects[], character_id, reference_image_urls or context_images renders under a 4,624,220 px (~4.6 MP) output ceiling and is scaled down to fit, preserving aspect ratio, so the delivered image is smaller than this value. Read the returned image for its true size.
1472
Resolved output image height in pixels (image generations only). This is the post-snap REQUESTED dimension: it may differ from a custom-requested height by up to 31 px due to multiple-of-32 snapping, and combined with width it is what determined the billing tier — output pixels (width × height) <= 2,360,000 bill the standard tier, above that the large tier (see GET /v1/models). It is NOT a guarantee of the delivered file: a request carrying subjects[], character_id, reference_image_urls or context_images renders under a 4,624,220 px (~4.6 MP) output ceiling and is scaled down to fit, preserving aspect ratio, so the delivered image is smaller than this value. Read the returned image for its true size.
1472
Number of images in the batch. Reflects the requested count while the generation is running; on a terminal status it reflects the number actually DELIVERED — when part of a batch fails you receive the successful images, this count re-stamps to match, and the difference is refunded automatically.
1
Named size preset applied to this generation. null when the request used custom width/height instead of a preset. Format is <tier>_<ratio> where tier is 1_5k, 2k, or 4k. Every 1_5k_* preset bills the standard pricing tier (output pixels <= 2,360,000); every 2k_*/4k_* preset bills the large tier — see GET /v1/models.
1_5k_1_1, 1_5k_3_2, 1_5k_2_3, 1_5k_4_3, 1_5k_3_4, 1_5k_16_9, 1_5k_9_16, 1_5k_21_9, 2k_1_1, 2k_3_2, 2k_2_3, 2k_4_3, 2k_3_4, 2k_16_9, 2k_9_16, 2k_21_9, 4k_1_1, 4k_3_2, 4k_2_3, 4k_4_3, 4k_3_4, 4k_16_9, 4k_9_16, 4k_21_9 "1_5k_1_1"
Inference mode dispatched. Images: t2i (text-to-image) — reference images and characters are supplementary inputs to the t2i flow, not a separate mode. Videos (this list also returns vid_* rows): t2v (text-to-video), i2v (image-to-video — frame-driven, subject-driven, or a pinned video model on its own), or r2v (reference mode — the generation was driven by a motion reference). r2v does NOT imply you supplied that reference: it covers BOTH your own clip sent as reference_video_url AND a platform-built reference, produced when a first frame rides with a video model (pinned via video_lora_id, or auto-matched from the image). On the platform-built variant reference_video_url is null — branch on that field, not on inference_type, to tell the two apart. Treat any value not listed here as opaque — the set grows over time.
"t2i"
CFG rescale factor the customer supplied on the request body, echoed back here. Range 0.0-1.0. Omitted when the customer did not supply a per-request value (the platform applied a precedence-chain default — LoRA, character override, or the global 0.7 — which is not exposed on the response).
0 <= x <= 10.7
Denoising strength the customer supplied on the request body, echoed back here. Range 0.0-1.0. Omitted when the customer did not supply a value or when the generation was a bare text-to-image request (denoise is only applied when reference images or a character are attached).
0 <= x <= 10.6
The random seed the model actually used for this image generation. Populated even when you omit seed on the request — the platform requests a random seed and records the concrete value the provider rolled, so you can reproduce the result by passing it back as seed. Available once status is succeeded; null before then and for failed/cancelled generations. For multi-image batches (image_count > 1) this is the seed of the first image (output_urls[0]); per-image seeds are not yet exposed. Image generations only.
819572108
Video duration in seconds (video generations only)
5
Video resolution (video generations only)
480p, 720p, 1080p "480p"
Video aspect ratio (video generations only)
16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive "16:9"
Whether the generated video includes synchronized audio (video generations only). This is the audio setting actually applied. It normally matches your generate_audio, or the selected video model's default when you omit it, but the platform resolves the final value for the request. Read this field rather than assuming your request value.
true
Resolved reference-video task (video generations only). reference: the generation borrows the clip's motion for a new scene. extend: the generation continues the clip itself. null on every generation that did not supply reference_video_url (including all pre-existing rows). Additional task types may be introduced in future API versions — treat an unrecognized value as opaque.
"reference"
Resolved extend direction (video generations only). Non-null only when video_task is extend; null otherwise (including every reference-mode and non-reference generation).
forward, backward "forward"
The reference video URL you submitted, echoed back VERBATIM as you sent it — never re-signed, never a storage path. null for generations that did not supply reference_video_url (including every dashboard-originated row, and including an inference_type: "r2v" generation whose motion reference the platform built from a first frame plus a pinned or matched video model — this field, not inference_type, is what distinguishes your own clip from a platform-built reference).
"https://cdn.example.com/clips/dance-loop.mp4"
The reference audio URL you submitted, echoed back VERBATIM as you sent it. null for generations that did not supply reference_audio_url.
"https://cdn.example.com/audio/voiceover.mp3"
The video model (an id or slug from GET /v1/video_loras) behind this generation (video generations only) — either the video_lora_id you pinned on the request, or the model the platform auto-matched to your prompt when none was pinned. null for a plain (no video model) generation, and always null on image generations.
"action_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Display name of the video model in video_lora_id, if any. Omitted for plain generations (no pinned or matched video model).
"Cinematic Pan"
Character ID supplied on the request (char_<ulid> or legacy UUID), echoed back. null when no character was attached to this generation.
"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Ordered subjects composed into this generation (positional — entry N echoes entry N of the identity inputs sent on create; legacy character_id / reference_image_urls inputs are normalized into the same projection). Character entries carry the opaque char_<ulid>; reference entries echo only their image count, never URLs. Video generations echo their cast the same way (up to 2 entries), matching the subjects[] array accepted by POST /v1/videos. Character entries on generations created before cast snapshotting may carry character_id: null; the id is never substituted with an internal identifier. null for generations that did not compose subjects (plain prompt-only or style generations, and context-image generations). The engine is not exposed.
Show child attributes
Show child attributes
[
{
"type": "character",
"character_id": "char_01HXMQ7Z3K8Y2VNABCDEFGHJKM",
"image_count": 1
},
{
"type": "reference",
"character_id": null,
"image_count": 2
}
]
Count-only echo of the context_images[] sent on create — the number of loose reference images supplied, never the image URLs themselves. null for every generation that did not use context_images (plain prompt-only, style, subject, and video generations).
Show child attributes
Show child attributes
{ "image_count": 3 }
The composition act applied to this generation, echoed as { id, name }. An act is applied either because you pinned it with action_id or because act detection matched one automatically. id is the act identifier from GET /v1/actions; name is its display name (or null when the name was not recorded). null for every generation that did not apply an act — plain prompt-only, style, context-image, and video generations. A new, always-present, nullable key: existing integrations that do not read it are unaffected.
Show child attributes
Show child attributes
{
"id": "3f2b6c1e-8a4d-4e2b-9c7a-1d5e8f0a2b3c",
"name": "Over-the-shoulder"
}
The prompt style applied to this generation, echoed as { id, name }. A style is applied either because you pinned it with lora_id or because style matching resolved one from your prompt — the echo always reflects the style that actually ran (a retired id that aliases to a successor echoes the successor). id is the lora_* identifier from GET /v1/loras and round-trips into lora_id. null for every generation without a style — including lora_id: null requests, retired styles that generate plain, video generations, and all rows minted before styles shipped. A new, always-present, nullable key: existing integrations that do not read it are unaffected.
Show child attributes
Show child attributes
{
"id": "lora_06AAAAAAAAAAAAAAAAAAAAAAAA",
"name": "Ring-Light Creator"
}
Non-fatal request adjustments, present ONLY on the POST /v1/images 201 body (and the estimate response) — never on GET reads, list rows, or webhook payloads. Omitted entirely when empty. Current codes: parameter_ignored, style_retired_plain; new codes may be added without a version bump — ignore unknown codes. Idempotent replays return the original warnings verbatim.
Show child attributes
Show child attributes
[
{
"code": "style_retired_plain",
"param": "lora_id",
"message": "Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer applies a style — this request generates without one."
}
]
Outcome of the prompt-optimization step, echoed for observability. Current values: no_request (the request did not invoke it), succeeded, identical, refused, transport_error, length_overflow; null on rows minted before this field existed. INFORMATIONAL and deliberately an OPEN set (no schema enum — codegen clients must not mint a closed union): do not branch control flow on it; new values may be added without a version bump.
"succeeded"
LoRAs applied to this generation. null for prompt-only and pure-reference generations.
Show child attributes
Show child attributes
API contract version applied at the time this row was minted (D25 — frozen for replay across future version bumps).
"2026-08-26"
Aurous-Request-Id of the POST that created this row. Quote in support tickets to trace the original create request.
"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM"
Terminal-status timestamp (ISO 8601). NULL until the generation reaches a terminal state.
"2026-05-04T10:00:14Z"

