Delete a character
curl --request DELETE \
--url https://api.aurous-labs.com/v1/characters/{id} \
--header 'X-Api-Key: <api-key>'import requests
url = "https://api.aurous-labs.com/v1/characters/{id}"
headers = {"X-Api-Key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://api.aurous-labs.com/v1/characters/{id}', 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/characters/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.aurous-labs.com/v1/characters/{id}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.aurous-labs.com/v1/characters/{id}")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurous-labs.com/v1/characters/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "char_01HXMQ7Z3K8Y2NABCDEFGHJKMR",
"object": "character",
"deleted": true
}{
"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"
}
}Characters
Delete a character
Cancel-review a reviewing character or soft-delete any other state.
DELETE
/
v1
/
characters
/
{id}
Delete a character
curl --request DELETE \
--url https://api.aurous-labs.com/v1/characters/{id} \
--header 'X-Api-Key: <api-key>'import requests
url = "https://api.aurous-labs.com/v1/characters/{id}"
headers = {"X-Api-Key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://api.aurous-labs.com/v1/characters/{id}', 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/characters/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.aurous-labs.com/v1/characters/{id}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.aurous-labs.com/v1/characters/{id}")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurous-labs.com/v1/characters/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "char_01HXMQ7Z3K8Y2NABCDEFGHJKMR",
"object": "character",
"deleted": true
}{
"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"
}
}DELETE /v1/characters/{id} removes a character. The branching is automatic, based on status:
draft→ hard-delete. Nothing was ever charged for a draft, so the row goes and the id stops resolving. Photos you uploaded are removed when the draft is deleted or purged; a rejected upload is discarded after its 24-hour ticket window. This is how you clean up drafts you abandoned.reviewing→ hard-delete (cancel-review). Every reference is discarded — the generated ones and the photos you uploaded — and the row is removed entirely. Subsequent retrieval returns 404. Use this when synthesis produced refs you don’t want to keep; callPOST /v1/characters/{id}/savefirst if you want to keep any of them.synthesizing→ cancel. The pending render is stopped, the up-front charge is refunded, and the row plus any partial refs are hard-deleted; acharacter.cancelledwebhook fires. If the render finishes in the same instant it is finalized instead and the row settles in its terminal state — either way it is gone from list and retrieve.- Any other status (
ready,failed) → soft-delete. Setsdeleted_at, transitionsstatustodeleted. The row remains for ID stability (you can stillGET /v1/characters/{id}for audit), but it is excluded fromGET /v1/charactersand rejected byPOST /v1/imagesorPOST /v1/videos.
When to use
- Drop a draft: you started a builder character and changed your mind. A draft costs nothing to keep, but it does show up in
GET /v1/characters— delete it and it is gone for good. - Cancel-review: the synthesize flow produced refs you reject; you want the character gone, not archived.
- Soft-delete
ready: retire a character you no longer plan to use. Past generations that already reference it onGET /v1/images/{id}are unaffected, but the character can no longer be attached to new requests. - Soft-delete
failed: clean up a failed synthesis attempt you don’t want to retry. To retry instead, callPOST /v1/characters/{id}/resynthesize— no delete needed. Only fall back to delete + recreate (with freshupload_ids) if resynthesize returns422 uploads_expired.
Examples
curl -X DELETE https://api.aurous-labs.com/v1/characters/char_01HXMQ7Z3K8Y2VNABCDEFGHJKM \
-H "X-Api-Key: $AUROUS_API_KEY"
const result = await fetch(
`https://api.aurous-labs.com/v1/characters/${id}`,
{ method: "DELETE", headers: { "X-Api-Key": process.env.AUROUS_API_KEY! } },
).then((r) => r.json());
console.log(result.deleted); // true
import os, requests
r = requests.delete(
f"https://api.aurous-labs.com/v1/characters/{character_id}",
headers={"X-Api-Key": os.environ["AUROUS_API_KEY"]},
).json()
print(r["deleted"]) # True
Limits
- Rate limit: bucket
characters_post— 30 requests/min sustained, 60 burst per team.
Errors
| Code | HTTP | When |
|---|---|---|
resource_not_found | 404 | Unknown ID or cross-team. The 404 is intentional — cross-team existence is never leaked. |
character_busy | 409 | A draft started building in the same instant the delete ran. Re-read GET /v1/characters/{id} and retry after Retry-After seconds. |
Common pitfalls
- A
draftand areviewingcharacter are hard-deleted — the row vanishes. SubsequentGET /v1/characters/{id}returns 404, and there is no undo. On areviewingcharacter, callPOST /v1/characters/{id}/savefirst if you cared about the refs — cancelling takes the photos you uploaded with it, not only the generated views. On a draft, the same is true: deleting it takes your uploaded photos with it, not just the character record — photos you uploaded are removed when the draft is deleted or purged; a rejected upload is discarded after its 24-hour ticket window. - Deleting a single view is a different route:
DELETE /v1/characters/{id}/refs/{view}, which empties one slot on a draft and leaves the character in place. - Soft-deleting a
readycharacter does not affect generations you already produced — theiroutput_urlscontinue to work and the character ID still appears on pastGET /v1/images/{id}responses. - Calling DELETE a second time on the same character returns 404, since soft-deleted rows are filtered out for IDOR safety. Treat the first 200 as the only success signal you need.
Authorizations
Your team API key (starts with al_live_).
Headers
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
Opaque character ID
Example:
"char_01HXMQ7Z3K8Y2NABCDEFGHJKMR"

