Référence API
Référence complète de l'API REST Sprite AI. Endpoints pour générer sprites et animations, formats de requête et de réponse, paramètres et exemples d'appels.
GET/api/me
Votre compte. Forfait, solde et limite de débit.
curl https://www.sprite-ai.art/api/me \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch("https://www.sprite-ai.art/api/me", {
headers: { Authorization: "Bearer sai_sk_your_key_here" },
});
const account = await res.json();import requests
account = requests.get(
"https://www.sprite-ai.art/api/me",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json(){
"user_id": "...",
"email": "you@example.com",
"plan": "studio",
"rate_limit_per_minute": 300,
"monthly_token_allotment": 400,
"monthly_tokens_used": 140,
"purchased_token_balance": 0,
"total_token_balance": 260,
"monthly_renews_at": "2026-07-01T00:00:00.000Z",
"billing_period": "monthly"
}GET/api/balance
Le solde de jetons seulement, un sous-ensemble de /api/me.
curl https://www.sprite-ai.art/api/balance \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch("https://www.sprite-ai.art/api/balance", {
headers: { Authorization: "Bearer sai_sk_your_key_here" },
});
const { total_token_balance } = await res.json();import requests
balance = requests.get(
"https://www.sprite-ai.art/api/balance",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json(){
"plan": "studio",
"total_token_balance": 260,
"purchased_token_balance": 0,
"monthly_token_allotment": 400,
"monthly_tokens_used": 140,
"monthly_renews_at": "2026-07-01T00:00:00.000Z",
"billing_period": "monthly"
}GET/api/asset-types
Chaque type d'asset, avec son coût en jetons et la plage de tailles où il est dessiné.
curl https://www.sprite-ai.art/api/asset-types \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch("https://www.sprite-ai.art/api/asset-types", {
headers: { Authorization: "Bearer sai_sk_your_key_here" },
});
const { asset_types } = await res.json();import requests
asset_types = requests.get(
"https://www.sprite-ai.art/api/asset-types",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json()["asset_types"]| Type | Coût en jetons | Taille (px) |
|---|---|---|
character | 1 | 32 à 400 |
creature | 1 | 32 à 400 |
prop | 1 | 32 à 400 |
weapon | 1 | 32 à 400 |
vehicle | 1 | 32 à 400 |
tile | 1 | 32 à 400 |
background | 1 | 32 à 400 |
ui | 1 | 32 à 400 |
effect | 1 | 32 à 400 |
item | 1 | 32 à 400 |
item est un ancien nom de prop. Il est encore accepté ici, mais envoyez prop dans du nouveau code. Les outils MCP n'offrent pas item.
GET/api/limits
La limite de débit de votre clé, les bornes de génération et le prix de chaque appel payant.
curl https://www.sprite-ai.art/api/limits \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch("https://www.sprite-ai.art/api/limits", {
headers: { Authorization: "Bearer sai_sk_your_key_here" },
});
const limits = await res.json();import requests
limits = requests.get(
"https://www.sprite-ai.art/api/limits",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json(){
"rate_limit_per_minute": 60,
"sprite": { "min_size": 32, "max_size": 400, "prompt_max_length": 1500, "reference_supported": true },
"animation": { "min_frames": 4, "max_frames": 16, "frames_must_be_even": true },
"token_costs": {
"sprite": 1,
"animation": { "4": 14, "6": 14, "8": 14, "10": 16, "12": 16, "14": 18, "16": 20 },
"restyle": { "normal": 2, "pro": 9 },
"combine": { "normal": 3, "pro": 9 },
"touch_up": 1,
"rotation": 12,
"normal_map_per_frame": 1,
"background_removal": { "standard": 0, "refined": 1 }
}
}POST/api/sprites
Génère un sprite fixe. Le PNG revient dans la réponse. Coûte 1 jeton.
| Champ | Type | Requis | Description |
|---|---|---|---|
prompt | string | Oui | Quoi dessiner. Accepte 3 à 1500 caractères. |
width | integer | Non | Largeur en pixels. Accepte 32 à 400. Par défaut 64. |
height | integer | Non | Hauteur en pixels. Accepte 32 à 400. Par défaut 64. |
asset_type | string | Non | Déduit du prompt si omis. Accepte character, creature, prop, weapon, vehicle, tile, background, ui, effect, item. |
direction | string | Non | Direction du regard. Accepte none, south, south-west, west, north-west, north, north-east, east, south-east. |
camera_perspective | string | Non | Angle de caméra. Accepte none, front, side, top_down, three_quarter, isometric. |
public | boolean | Non | Ajoute à la galerie publique. Par défaut false. |
reference_asset_id | string (uuid) | Non | UUID d'un sprite à vous. Le nouveau sprite est redessiné à partir de lui et garde son sujet et son angle de caméra. C'est une image de départ, pas une indication de style. |
palette_id | string (uuid) | Non | Une palette de votre bibliothèque (voir Palettes). Le sprite est dessiné dedans, y reste contraint et s'en souvient. Animations, restyles et combinaisons gardent donc les mêmes couleurs. |
curl https://www.sprite-ai.art/api/sprites \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "prompt": "a knight with a blue cape", "asset_type": "character" }'const res = await fetch("https://www.sprite-ai.art/api/sprites", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
prompt: "a knight with a blue cape",
asset_type: "character",
}),
});
const data = await res.json(); // data.image.pngBase64import base64, requests
res = requests.post(
"https://www.sprite-ai.art/api/sprites",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"prompt": "a knight with a blue cape", "asset_type": "character"},
)
data = res.json()
with open("knight.png", "wb") as f:
f.write(base64.b64decode(data["image"]["pngBase64"])){
"id": "a1b2c3d4-...",
"status": "completed",
"width": 64,
"height": 64,
"assetType": "character",
"tokensSpent": 1,
"image": { "format": "png", "pngBase64": "iVBORw0KGgoAAAANS..." }
}Le PNG est dans image.pngBase64. GET /api/sprites/{id}/download sert le même PNG sans clé.
Un sprite qui prend plus de temps que la requête peut attendre répond 504 avec code: "provider_timeout" et l'id du sprite dans details.id. Il continue de tourner et n'est facturé que s'il se termine. Lisez GET /api/sprites/{id} jusqu'à ce que son status soit completed ou failed, puis téléchargez-le. Ne renvoyez pas la requête. Ça ferait, et facturerait, un deuxième sprite.
{
"code": "provider_timeout",
"message": "Generation is taking longer than usual and is still running. ...",
"details": { "id": "a1b2c3d4-..." }
}POST/api/sprites/import
Ajoute un sprite que vous avez déjà (un PNG local ou tout sprite pixel) et renvoie un id que vous pouvez animer (source_generation_id) ou redessiner en un nouveau sprite (reference_asset_id). Gratuit. Importer ne dépense aucun jeton et ne lance aucune IA.
L'image doit être un sprite unique (PNG, JPEG ou WebP), 16–256 px de côté, pas une sprite sheet. Les sprites importés sont toujours privés.
| Champ | Type | Requis | Description |
|---|---|---|---|
image | string | Oui | Le sprite, en base64 ou en URL data:image/...;base64. Accepte au moins 1 caractères. |
title | string | Non | Étiquette du sprite. Si omis, "Imported sprite". Accepte au plus 200 caractères. |
asset_type | string | Non | Étiquette de type d'asset, métadonnée seulement. Accepte character, creature, prop, weapon, vehicle, tile, background, ui, effect, item. |
palette_id | string (uuid) | Non | Une palette de votre bibliothèque. Le sprite en est marqué pour que les outils suivants la respectent. Les pixels ne changent pas. |
curl https://www.sprite-ai.art/api/sprites/import \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "image": "<png base64>", "title": "hero" }'import { readFileSync } from "node:fs";
const image = readFileSync("hero.png").toString("base64");
const res = await fetch("https://www.sprite-ai.art/api/sprites/import", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({ image, title: "hero" }),
});
const { id } = await res.json(); // animate with source_generation_id: idimport base64, requests
image = base64.b64encode(open("hero.png", "rb").read()).decode()
res = requests.post(
"https://www.sprite-ai.art/api/sprites/import",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"image": image, "title": "hero"},
).json()
sprite_id = res["id"] # animate with source_generation_id{
"id": "a1b2c3d4-...",
"status": "completed",
"width": 64,
"height": 64,
"title": "hero"
}GET/api/sprites/{id}
Un de vos sprites ou animations, en métadonnées sans octets d'image. Un sprite encore en cours avance d'abord d'une étape, donc le lire suffit à livrer une génération qui a expiré.
curl https://www.sprite-ai.art/api/sprites/a1b2c3d4-... \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch(
"https://www.sprite-ai.art/api/sprites/a1b2c3d4-...",
{ headers: { Authorization: "Bearer sai_sk_your_key_here" } },
);
const sprite = await res.json();import requests
sprite = requests.get(
"https://www.sprite-ai.art/api/sprites/a1b2c3d4-...",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json()GET/api/sprites/{id}/download
Le PNG d'un sprite, ou la sprite sheet d'une animation, en octets. Aucune clé n'est requise, parce que l'id sert de clé. Un script ou un build de jeu enregistre donc le fichier en un seul appel. Un id inconnu répond 404.
curl -o knight.png https://www.sprite-ai.art/api/sprites/a1b2c3d4-.../downloadimport { writeFile } from "node:fs/promises";
const res = await fetch("https://www.sprite-ai.art/api/sprites/" + id + "/download");
await writeFile("knight.png", Buffer.from(await res.arrayBuffer()));import requests
png = requests.get("https://www.sprite-ai.art/api/sprites/" + sprite_id + "/download").content
open("knight.png", "wb").write(png)GET/api/sprites
Liste vos sprites et animations, du plus récent au plus ancien.
| Champ | Type | Requis | Description |
|---|---|---|---|
limit | integer | Non | Combien en renvoyer. Accepte 1 à 100. Par défaut 20. |
offset | integer | Non | Combien en sauter, pour la pagination. Accepte au moins 0. Par défaut 0. |
status | string | Non | Filtre par statut. Seuls les sprites livrés sont listés, donc toute valeur autre que completed ne retourne rien. |
asset_type | string | Non | Filtre par type, p. ex. animation. |
curl "https://www.sprite-ai.art/api/sprites?limit=20" \
-H "Authorization: Bearer sai_sk_your_key_here"const res = await fetch(
"https://www.sprite-ai.art/api/sprites?limit=20",
{ headers: { Authorization: "Bearer sai_sk_your_key_here" } },
);
const { sprites } = await res.json();import requests
sprites = requests.get(
"https://www.sprite-ai.art/api/sprites?limit=20",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
).json()["sprites"]POST/api/palettes/generate
Quelques options de palette pour une description, rien d'enregistré. Montrez-les à la personne, laissez-la en choisir une ou redemander, puis enregistrez son choix avec POST /api/palettes. Le prompt est lu comme un thème, une couleur principale et des ambiances. Un nombre dans le texte fixe le nombre de couleurs. Gratuit.
| Champ | Type | Requis | Description |
|---|---|---|---|
prompt | string | Oui | À quoi sert la palette, p. ex. "mossy dungeon, 16 colours". Accepte 3 à 200 caractères. |
count | integer | Non | Couleurs par option. Si omis, le nombre dans le prompt. Sans nombre nulle part, les options viennent une par taille, 8, 16, 24 et 32. Accepte 4 à 64. |
options | integer | Non | Nombre d'options. Si omis, 4. Accepte 2 à 4. |
{
"prompt": "mossy dungeon, 16 colours",
"read_as": "theme forest, main colour green, mood dark",
"options": [
{ "option": 1, "colors": ["#1a2a1c", "..."], "recipe": { "count": 16, "seed": 91827364, "theme": "forest", "primary": "green", "moods": ["dark"] } },
{ "option": 2, "colors": ["..."], "recipe": { "count": 16, "seed": 5550123, "theme": "forest", "primary": "green", "moods": ["dark"] } }
]
}POST/api/palettes
Enregistre le choix. Passez la recipe de l'option choisie telle que renvoyée, ou des colors explicites, et un name. Une recette est régénérée côté serveur, donc la palette enregistrée est exactement l'option montrée. L'id renvoyé est le palette_id pour POST /api/sprites et POST /api/sprites/import. Gratuit.
| Champ | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Un nom court. Accepte 1 à 80 caractères. |
recipe | object | Non | La recette de l'option choisie, venant de /api/palettes/generate, telle que renvoyée. Envoyez ceci ou colors. |
colors | string[] | Non | Des couleurs #rrggbb au lieu d'une recette. Envoyez ceci ou recipe. Accepte 2 à 256 éléments, chacun correspond à ^#[0-9a-fA-F]{6}$. |
{
"id": "5f0c2a7e-...",
"name": "Mossy dungeon",
"colors": ["#1a2a1c", "..."],
"count": 16,
"source": "generated",
"created_at": "2026-09-11T22:00:00.000Z"
}GET/api/palettes
Vos palettes, de la plus récente à la plus ancienne, sous la forme { "palettes": [ ... ] } avec la même structure que ci-dessus. GET /api/palettes/{id} en renvoie une. Chaque objet sprite porte paletteId, null quand le sprite n'a pas de palette.
POST/api/animations
Lance une tâche d'animation à partir d'un sprite source. C'est asynchrone. Vous recevez un id tout de suite, puis vous l'interrogez jusqu'à la fin (~15 s). Les animations tournent une à la fois par compte, donc un lot de N finit en environ N x 15 s. Le coût en jetons suit frame_count.
Référencez la source par source_generation_id, l'id d'un sprite à vous, venant de POST /api/sprites (génération) ou de POST /api/sprites/import. Aucun octet d'image ne passe par cet appel. Nous les récupérons côté serveur. La source doit être un sprite fixe unique, 32-256 px de côté, pas une sprite sheet ni une animation existante.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite fixe généré ou importé par vous. |
preset | string | Oui | Préréglage de mouvement, ou Custom pour un mouvement dans vos mots. Tous les préréglages coûtent le même prix. Accepte Idle, Walk, Jump, Run, Attack, Hurt, Death, Custom. |
frame_count | integer | Non | Pair. Détermine le coût en jetons. Accepte 4 à 16. Par défaut 8. |
custom_prompt | string | Non | Mouvement en texte libre. Requis quand preset est Custom. Accepte au plus 1500 caractères. |
palette_extras | integer | Non | Couleurs que l'animation peut ajouter au-delà de celles du sprite source. 0 garde sa palette exacte. Montez-le seulement quand le mouvement apporte des couleurs que le sprite n'a pas (feu, lueur magique, étincelles). Si omis, il prend le défaut du préréglage, dans le tableau ci-dessous. Accepte 0 à 256. |
framing_margin | integer | Non | Pourcentage d'agrandissement du canevas avant l'animation, pour qu'un saut ou un effet projeté ait de la place au lieu d'être coupé au bord du sprite. Le résultat revient à la taille agrandie. Si omis, il prend le défaut du préréglage, dans le tableau ci-dessous. Accepte 0 à 25. |
framing_anchor | string | Non | Où le sprite se place dans ce canevas agrandi. bottom garde les pieds au sol dans un saut. Un coin du bas opposé au regard du sprite ouvre de la place devant pour un effet projeté. Si omis, il prend le défaut du préréglage, dans le tableau ci-dessous. Accepte top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right. |
public | boolean | Non | Ajoute à la galerie publique. Par défaut false. |
Chaque préréglage a ses propres défauts pour les trois champs que vous pouvez omettre. Seul Jump agrandit le canevas de lui-même.
| Préréglage | palette_extras | framing_margin | framing_anchor |
|---|---|---|---|
Idle | 0 | 0 | center |
Walk | 0 | 0 | center |
Jump | 0 | 25 | bottom |
Run | 0 | 0 | center |
Attack | 12 | 0 | center |
Hurt | 0 | 0 | center |
Death | 0 | 0 | center |
Custom | 12 | 0 | center |
curl https://www.sprite-ai.art/api/animations \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-...", "preset": "Walk", "frame_count": 8 }'const res = await fetch("https://www.sprite-ai.art/api/animations", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: spriteId, // from generate or import
preset: "Walk",
frame_count: 8,
}),
});
const { id } = await res.json(); // poll GET /api/animations/{id}import requests
job = requests.post(
"https://www.sprite-ai.art/api/animations",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"source_generation_id": sprite_id, "preset": "Walk", "frame_count": 8},
).json()
job_id = job["id"] # poll GET /api/animations/{id}{ "id": "a1b2c3d4-...", "status": "processing" }GET/api/animations/{id}
Interroge une tâche d'animation. En cours, la réponse est 200 avec status: "processing" et un progress optionnel (0–1). Quand status est completed, la sprite sheet est dans image.spritesheetBase64. Une tâche échouée répond plutôt avec un statut d'erreur et le corps d'erreur, comme 502 provider_failure ou 504 provider_timeout, et ses jetons sont remboursés. Attendez environ 6 secondes, puis interrogez toutes les 4.
# poll every ~4s until status is completed, or the answer is an error
curl https://www.sprite-ai.art/api/animations/a1b2c3d4-... \
-H "Authorization: Bearer sai_sk_your_key_here"const headers = { Authorization: "Bearer sai_sk_your_key_here" };
await new Promise((r) => setTimeout(r, 6000));
while (true) {
const res = await fetch("https://www.sprite-ai.art/api/animations/" + id, { headers });
const job = await res.json();
if (!res.ok) { console.error(job.code, job.message); break; } // failed, tokens refunded
if (job.status === "completed") { console.log(job.image.spritesheetBase64); break; }
await new Promise((r) => setTimeout(r, 4000));
}import time, requests
headers = {"Authorization": "Bearer sai_sk_your_key_here"}
time.sleep(6)
while True:
res = requests.get("https://www.sprite-ai.art/api/animations/" + job_id, headers=headers)
job = res.json()
if not res.ok:
print(job["code"], job["message"]); break # failed, tokens refunded
if job["status"] == "completed":
print(job["image"]["spritesheetBase64"]); break
time.sleep(4){
"id": "a1b2c3d4-...",
"status": "completed",
"frameWidth": 64,
"frameHeight": 64,
"frameCount": 8,
"fps": 12,
"image": { "format": "png", "spritesheetBase64": "iVBORw0KGgoAAAANS..." }
}Un seul PNG en bande horizontale. Découpez-le avec frameCount, frameWidth, frameHeight.
POST/api/animations/{id}/cancel
Annule une tâche en cours et rembourse ses jetons. Une tâche déjà terminée ou échouée répond 409 avec code: "job_finished", et un id qui n'est pas à vous répond 404.
curl -X POST https://www.sprite-ai.art/api/animations/a1b2c3d4-.../cancel \
-H "Authorization: Bearer sai_sk_your_key_here"await fetch(
"https://www.sprite-ai.art/api/animations/" + id + "/cancel",
{ method: "POST", headers: { Authorization: "Bearer sai_sk_your_key_here" } },
);import requests
requests.post(
"https://www.sprite-ai.art/api/animations/" + job_id + "/cancel",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
){ "id": "a1b2c3d4-...", "status": "cancelled" }POST/api/restyles
Modifie un sprite à vous en gardant le personnage. Changez son style, mettez-le dans une nouvelle pose ou échangez l'objet qu'il tient. mode dit lequel. C'est asynchrone comme les animations. Vous recevez un id tout de suite, puis vous l'interrogez jusqu'à la fin (~15 s au palier normal, jusqu'à une minute en pro). Le coût dépend du palier. 2 jetons en normal, 9 en pro. Préréglages et prompts personnalisés coûtent le même prix.
Référencez la source par source_generation_id, l'id d'un sprite à vous, venant de POST /api/sprites (génération) ou de POST /api/sprites/import. Aucun octet d'image ne passe par cet appel. Nous les récupérons côté serveur. La source doit faire 32-256 px de côté. Le résultat revient à la taille de la source, sauf si framing_margin agrandit le canevas d'abord.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite généré ou importé par vous, 32-256 px de côté. |
preset | string | Non | Style verrouillé. Un préréglage implique toujours mode restyle. Envoyez ceci ou custom_prompt, pas les deux. Accepte fire, ice, gold, zombie, holy, cursed, poison, royal, shadow, steampunk. |
custom_prompt | string | Non | Quoi changer, dans vos mots, lu avec mode. Envoyez ceci ou preset, pas les deux. Accepte 1 à 500 caractères. |
mode | string | Non | restyle repeint et les couleurs peuvent changer. pose bouge le personnage et garde tout le reste. item échange un objet nommé. custom couvre tout le reste. Accepte restyle, pose, item, custom. Par défaut restyle. |
tier | string | Non | Pro reste plus fidèle au personnage et gagne sur les échanges d'objet. Normal gagne sur les poses. Change le prix. Accepte normal, pro. Par défaut normal. |
palette_extras | integer | Non | Couleurs que la modification peut utiliser au-delà de celles du sprite. 0 garde sa palette exacte. Si omis, il prend le défaut du mode, dans le tableau ci-dessous. Accepte 0 à 256. |
framing_margin | integer | Non | Pourcentage d'agrandissement du canevas avant la modification, pour qu'une pose ait de la place. Le résultat revient à la taille agrandie. Si omis, 0. Accepte 0 à 25. |
framing_anchor | string | Non | Où le sprite se place dans ce canevas agrandi, p. ex. bottom pour garder les pieds du personnage au sol. Si omis, center. Accepte top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right. |
public | boolean | Non | Ajoute à la galerie publique. Par défaut false. |
Chaque mode a son propre défaut pour palette_extras. La ligne combine est le défaut de POST /api/combines.
| Mode | palette_extras |
|---|---|
restyle | 16 |
pose | 4 |
item | 12 |
custom | 12 |
combine | 4 |
curl https://www.sprite-ai.art/api/restyles \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-...", "preset": "gold" }'const res = await fetch("https://www.sprite-ai.art/api/restyles", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: spriteId, // from generate or import
preset: "gold", // or custom_prompt: "obsidian armor, glowing runes"
}),
});
const { id } = await res.json(); // poll GET /api/restyles/{id}import requests
job = requests.post(
"https://www.sprite-ai.art/api/restyles",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"source_generation_id": sprite_id, "preset": "gold"},
).json()
job_id = job["id"] # poll GET /api/restyles/{id}{ "id": "a1b2c3d4-...", "status": "processing" }GET/api/restyles/{id}
Interroge une tâche de restyle. En cours, la réponse est 200 avec status: "processing". Quand status est completed, le sprite est dans image.pngBase64 en résolution native. Une tâche échouée répond plutôt avec un statut d'erreur et le corps d'erreur, et ses jetons sont remboursés. Attendez environ 4 secondes, puis interrogez toutes les 3.
# poll every ~3s until status is completed, or the answer is an error
curl https://www.sprite-ai.art/api/restyles/a1b2c3d4-... \
-H "Authorization: Bearer sai_sk_your_key_here"const headers = { Authorization: "Bearer sai_sk_your_key_here" };
await new Promise((r) => setTimeout(r, 4000));
while (true) {
const res = await fetch("https://www.sprite-ai.art/api/restyles/" + id, { headers });
const job = await res.json();
if (!res.ok) { console.error(job.code, job.message); break; } // failed, tokens refunded
if (job.status === "completed") { console.log(job.image.pngBase64); break; }
await new Promise((r) => setTimeout(r, 3000));
}import time, requests
headers = {"Authorization": "Bearer sai_sk_your_key_here"}
time.sleep(4)
while True:
res = requests.get("https://www.sprite-ai.art/api/restyles/" + job_id, headers=headers)
job = res.json()
if not res.ok:
print(job["code"], job["message"]); break # failed, tokens refunded
if job["status"] == "completed":
print(job["image"]["pngBase64"]); break
time.sleep(3){
"id": "a1b2c3d4-...",
"status": "completed",
"width": 64,
"height": 64,
"isPublic": false,
"slug": null,
"image": { "format": "png", "pngBase64": "iVBORw0KGgoAAAANS..." }
}POST/api/restyles/{id}/cancel
Annule un restyle en cours et rembourse ses jetons. Une tâche déjà terminée ou échouée répond 409 avec code: "job_finished", et un id qui n'est pas à vous répond 404.
curl -X POST https://www.sprite-ai.art/api/restyles/a1b2c3d4-.../cancel \
-H "Authorization: Bearer sai_sk_your_key_here"await fetch(
"https://www.sprite-ai.art/api/restyles/" + id + "/cancel",
{ method: "POST", headers: { Authorization: "Bearer sai_sk_your_key_here" } },
);import requests
requests.post(
"https://www.sprite-ai.art/api/restyles/" + job_id + "/cancel",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
){ "id": "a1b2c3d4-...", "status": "cancelled" }POST/api/combines
Place un objet d'un de vos sprites dans un autre de vos sprites. Le premier sprite garde son identité et ses dimensions exactes. Le second est celui d'où l'objet est copié, donc sa forme et ses couleurs sont ce que vous obtenez. Le résultat est verrouillé aux palettes des deux sprites, donc un objet ne revient jamais repeint dans les couleurs du personnage. C'est asynchrone comme les restyles. Vous recevez un id tout de suite, puis vous l'interrogez jusqu'à la fin (~20 s en normal, 3-4 minutes en pro). Le coût dépend du palier. 3 jetons en normal, 9 en pro.
Utilisez-le quand l'objet existe comme sprite. Pour un échange vers quelque chose que vous n'avez qu'en mots, utilisez plutôt POST /api/restyles avec mode: "item".
Les deux sprites sont référencés par id, venant de POST /api/sprites (génération) ou de POST /api/sprites/import. Aucun octet d'image ne passe par cet appel. Nous les récupérons côté serveur, ce qui veut aussi dire que les deux sprites doivent être à vous. Chacun doit faire 32-256 px de côté, et les deux ids doivent différer. Le résultat revient à la taille du premier sprite, même quand framing_margin agrandit le canevas d'abord.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID du sprite qui garde son identité. Ses dimensions sont celles du résultat. |
item_generation_id | string (uuid) | Oui | UUID du sprite d'où l'objet est copié. Doit différer de source_generation_id. |
prompt | string | Oui | Où va l'objet. Dites le placement, pas l'objet, parce que l'objet vient de l'image. Accepte 1 à 500 caractères. |
tier | string | Non | Normal met l'objet dans les mains du personnage. Pro reste plus fidèle au personnage mais place l'objet moins bien. Change le prix. Accepte normal, pro. Par défaut normal. |
palette_extras | integer | Non | Couleurs que la combinaison peut utiliser au-delà de l'union des deux sprites. 0 la verrouille exactement à leurs palettes. Si omis, il prend la ligne combine du tableau des modes sous POST /api/restyles. Accepte 0 à 256. |
framing_margin | integer | Non | Pourcentage d'agrandissement du canevas avant la modification, pour qu'un objet tendu ait de la place. Le sprite revient quand même à la taille du premier sprite. Si omis, 0. Accepte 0 à 25. |
framing_anchor | string | Non | Où le sprite se place dans ce canevas agrandi, p. ex. bottom pour garder les pieds du personnage au sol. Si omis, center. Accepte top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right. |
public | boolean | Non | Ajoute à la galerie publique. Par défaut false. |
curl https://www.sprite-ai.art/api/combines \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-...", "item_generation_id": "e5f6a7b8-...", "prompt": "holding this shield in his free hand" }'const res = await fetch("https://www.sprite-ai.art/api/combines", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: characterId, // keeps its identity and its size
item_generation_id: shieldId, // where the item comes from
prompt: "holding this shield in his free hand",
}),
});
const { id } = await res.json(); // poll GET /api/combines/{id}import requests
job = requests.post(
"https://www.sprite-ai.art/api/combines",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={
"source_generation_id": character_id,
"item_generation_id": shield_id,
"prompt": "holding this shield in his free hand",
},
).json()
job_id = job["id"] # poll GET /api/combines/{id}{ "id": "a1b2c3d4-...", "status": "processing" }GET/api/combines/{id}
Interroge une tâche de combinaison. En cours, la réponse est 200 avec status: "processing". Quand status est completed, le sprite est dans image.pngBase64 à la taille du premier sprite. Une tâche échouée répond plutôt avec un statut d'erreur et le corps d'erreur, et ses jetons sont remboursés. Attendez environ 4 secondes, puis interrogez toutes les 4. En palier normal, c'est souvent fini au premier ou au deuxième appel. Pro prend des minutes.
# poll every ~4s until status is completed, or the answer is an error
curl https://www.sprite-ai.art/api/combines/a1b2c3d4-... \
-H "Authorization: Bearer sai_sk_your_key_here"const headers = { Authorization: "Bearer sai_sk_your_key_here" };
let res, job;
do {
await new Promise((r) => setTimeout(r, 4000));
res = await fetch("https://www.sprite-ai.art/api/combines/" + id, { headers });
job = await res.json();
} while (res.ok && job.status === "processing");
if (!res.ok) console.error(job.code, job.message); // failed, tokens refundedimport time, requests
headers = {"Authorization": "Bearer sai_sk_your_key_here"}
while True:
time.sleep(4)
res = requests.get("https://www.sprite-ai.art/api/combines/" + job_id, headers=headers)
job = res.json()
if not res.ok:
print(job["code"], job["message"]); break # failed, tokens refunded
if job["status"] == "completed":
break{
"id": "a1b2c3d4-...",
"status": "completed",
"width": 64,
"height": 64,
"isPublic": false,
"slug": null,
"image": { "format": "png", "pngBase64": "iVBORw0KGgo..." }
}POST/api/combines/{id}/cancel
Annule une combinaison en cours et rembourse ses jetons. Une tâche déjà terminée ou échouée répond 409 avec code: "job_finished", et un id qui n'est pas à vous répond 404.
curl -X POST https://www.sprite-ai.art/api/combines/a1b2c3d4-.../cancel \
-H "Authorization: Bearer sai_sk_your_key_here"await fetch(
"https://www.sprite-ai.art/api/combines/" + id + "/cancel",
{ method: "POST", headers: { Authorization: "Bearer sai_sk_your_key_here" } },
);import requests
requests.post(
"https://www.sprite-ai.art/api/combines/" + job_id + "/cancel",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
){ "id": "a1b2c3d4-...", "status": "cancelled" }POST/api/touch-ups
Répare une partie d'un sprite à vous et laisse chaque autre pixel intact. Donnez-lui une région et une phrase. La zone choisie est redessinée dans les couleurs du sprite, et tout ce qui est en dehors revient identique à l'octet près. Le résultat est enregistré comme un nouveau sprite id que vous pouvez animer, pivoter ou changer de style. Synchrone, environ 15 à 30 secondes. Coût : 1 jeton.
Cet outil répare un détail. Ce n'est pas un outil d'échange d'objet. Quand on lui a demandé de changer une arme, il a dessiné la nouvelle une fois sur quatre, alors que POST /api/restyles avec le préréglage item l'a fait à tout coup. Utilisez la retouche pour des yeux, un visage, une main, une bosse sur un casque. Le sprite revient à sa taille d'origine, et le prix est le même en 64 px ou en 512 px.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite fixe à vous, 32-1024 px de côté. |
prompt | string | Oui | Quoi corriger, p. ex. "glowing red eyes in the visor". Accepte 1 à 300 caractères. |
region | object | Oui | La zone à réparer, en pixels du sprite, avec l'origine en haut à gauche. |
region.x | integer | Oui | Bord gauche. Accepte 0 à 4096. |
region.y | integer | Oui | Bord du haut. Accepte 0 à 4096. |
region.width | integer | Oui | Largeur. Accepte 1 à 4096. |
region.height | integer | Oui | Hauteur. Accepte 1 à 4096. |
public | boolean | Non | Publie le résultat dans la galerie publique. Par défaut false. |
La région est rognée au sprite, et la boîte rognée est renvoyée dans la réponse pour que vous puissiez la dessiner sur le résultat. Le plafond de la région est d'environ 200x200 pixels, peu importe la taille du sprite. Une fenêtre est découpée autour, puis recomposée. Un grand sprite passe, une grande région est refusée. Pour changer un sprite entier, utilisez POST /api/restyles.
curl https://www.sprite-ai.art/api/touch-ups \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"source_generation_id": "a1b2c3d4-...",
"prompt": "glowing red eyes in the visor",
"region": { "x": 32, "y": 10, "width": 12, "height": 11 }
}'const res = await fetch("https://www.sprite-ai.art/api/touch-ups", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: spriteId,
prompt: "glowing red eyes in the visor",
region: { x: 32, y: 10, width: 12, height: 11 },
}),
});
const fixed = await res.json(); // completed inline, no polling
// fixed.id is a new sprite; fixed.region is what was actually repairedimport base64, requests
fixed = requests.post(
"https://www.sprite-ai.art/api/touch-ups",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={
"source_generation_id": sprite_id,
"prompt": "glowing red eyes in the visor",
"region": {"x": 32, "y": 10, "width": 12, "height": 11},
},
).json()
with open("sprite_fixed.png", "wb") as f:
f.write(base64.b64decode(fixed["image"]["pngBase64"])){
"id": "f7a8b9c0-...",
"status": "completed",
"width": 64,
"height": 64,
"region": { "x": 32, "y": 10, "width": 12, "height": 11 },
"isPublic": false,
"slug": null,
"image": { "format": "png", "pngBase64": "iVBORw0KGgoAAAANS..." }
}POST/api/rotations
Transforme un sprite fixe à vous en un jeu complet de 8 directions, S, SE, E, NE, N, NW, W, SW, même personnage et même palette. Renvoie une bande horizontale de 8 frames égales dans cet ordre de rotation, plus un score de fidélité. La sprite sheet est calibrée contre la source et un essai au score faible est refait automatiquement. Synchrone. Une requête, la bande finie dans la réponse, environ une minute et jusqu'à 2,5 minutes quand le contrôle qualité force un second essai. Coût : 12 jetons.
La source doit être un sprite fixe, 32-256 px de côté, pas une animation. Le résultat est enregistré comme une ligne d'animation, donc GET /api/sprites/{id} et l'URL de téléchargement traitent la bande comme une sprite sheet. Découpez-la tous les frameWidth pixels pour obtenir chaque direction.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite fixe à vous, 32-256 px de côté. |
public | boolean | Non | Publie le jeu dans la galerie publique. Par défaut false. |
curl https://www.sprite-ai.art/api/rotations \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-..." }'const res = await fetch("https://www.sprite-ai.art/api/rotations", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({ source_generation_id: spriteId }), // a still, 32-256px
});
const set = await res.json(); // completed inline, ~1-2 minutes
// set.directions lists the 8 frames left to right: s, se, e, ne, n, nw, w, swimport base64, requests
rotation = requests.post(
"https://www.sprite-ai.art/api/rotations",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"source_generation_id": sprite_id},
).json()
with open("knight_8dir.png", "wb") as f:
f.write(base64.b64decode(rotation["image"]["spritesheetBase64"])){
"id": "c9d0e1f2-...",
"status": "completed",
"frameWidth": 64,
"frameHeight": 64,
"frameCount": 8,
"fps": 6,
"directions": ["s", "se", "e", "ne", "n", "nw", "w", "sw"],
"calibrationScore": 0.94,
"isPublic": false,
"image": { "format": "png", "spritesheetBase64": "iVBORw0KGgoAAAANS..." }
}POST/api/normal-maps
Génère une normal map en espace tangent pour un sprite ou une animation à vous, pour l'éclairage dynamique dans un moteur de jeu. Notre propre modèle, entraîné sur de la vraie géométrie 3D plutôt que sur des heuristiques de détection de contours. La sortie encode la forme réelle du sujet, et son canal alpha est une copie au pixel près de la silhouette source. Synchrone. Le PNG fini revient dans la réponse en quelques secondes, aucune tâche à interroger. Coût : 1 jeton par frame.
Une animation source est traitée frame par frame automatiquement (le modèle est déterministe, donc les frames ne scintillent jamais) et revient en bande horizontale de même disposition. Chargez-la dans votre moteur exactement comme l'animation elle-même.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite ou d'une animation à vous. Les frames doivent faire 32-256 px de côté. |
strength | number | Non | Injection de détail. 0 est le plus fidèle à la géométrie. Autour de 2.5, l'ombrage dessiné du sprite revient pour un rendu fait main. Accepte 0 à 5. Par défaut 0. |
flip_green | boolean | Non | Inverse le vert pour les moteurs DirectX et +Y vers le bas (Unreal). false donne OpenGL et +Y vers le haut (Godot, Unity, WebGL). Par défaut false. |
columns | integer | Non | Seulement pour un sprite fixe qui est en fait une sprite sheet, son nombre de colonnes. Ignoré pour les animations, dont la disposition est connue. columns x rows vaut au plus 24. Accepte 1 à 24. Par défaut 1. |
rows | integer | Non | Le nombre de lignes de la sheet, avec columns. Accepte 1 à 24. Par défaut 1. |
curl https://www.sprite-ai.art/api/normal-maps \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-..." }'const res = await fetch("https://www.sprite-ai.art/api/normal-maps", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: spriteId, // a sprite OR an animation
}),
});
const map = await res.json(); // completed inline, no polling
// convention most engines auto-detect: save as <sprite-name>_n.pngimport base64, requests
map = requests.post(
"https://www.sprite-ai.art/api/normal-maps",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"source_generation_id": sprite_id},
).json()
with open("sprite_n.png", "wb") as f:
f.write(base64.b64decode(map["image"]["pngBase64"])){
"id": "e5f6a7b8-...",
"status": "completed",
"width": 64,
"height": 64,
"frameCount": 1,
"tokensSpent": 1,
"image": { "format": "png", "pngBase64": "iVBORw0KGgoAAAANS..." }
}POST/api/background-removals
Retire un arrière-plan uni d'un sprite ou d'une animation à vous et renvoie un PNG transparent, enregistré comme un nouveau sprite id que vous pouvez animer, changer de style ou passer en normal map. Deux méthodes, les deux mêmes que l'outil Suppression d'arrière-plan du studio. standard est un chroma key, gratuit. refined est un matting par palette contre les couleurs du sprite, 1 jeton. Refined donne le bord le plus propre sur du pixel art généré par IA. La couleur d'arrière-plan est échantillonnée aux quatre coins, sauf si vous passez matte_color. Synchrone, bien en dessous d'une seconde.
Les sprites générés ici ont déjà un arrière-plan transparent. Cet endpoint sert aux captures d'écran et rendus importés sur une couleur unie. Une source dont les coins sont déjà transparents est refusée. Une animation est traitée comme une seule bande et revient en animation. Les découpes sont toujours privées.
| Champ | Type | Requis | Description |
|---|---|---|---|
source_generation_id | string (uuid) | Oui | UUID d'un sprite ou d'une animation à vous. |
method | string | Non | standard est un chroma key gratuit. refined est un matting par palette et coûte 1 jeton. Accepte standard, refined. Par défaut standard. |
matte_color | string | Non | Couleur d'arrière-plan à retirer, en #rrggbb. Si omise, elle est échantillonnée aux coins. Doit correspondre à ^#?[0-9a-fA-F]{6}$. |
tolerance | integer | Non | standard seulement. Distance maximale à la couleur d'arrière-plan pour qu'un pixel soit quand même retiré. Accepte 0 à 300. Par défaut 200. |
palette_size | integer | Non | refined seulement. Plafond de couleurs du sprite utilisées pour le matting. Accepte 16 à 256. Par défaut 64. |
alpha_threshold | number | Non | refined seulement. Couverture au-dessus de laquelle un pixel de bord reste opaque. Accepte 0.3 à 0.9. Par défaut 0.7. |
curl https://www.sprite-ai.art/api/background-removals \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "source_generation_id": "a1b2c3d4-...", "method": "refined" }'const res = await fetch("https://www.sprite-ai.art/api/background-removals", {
method: "POST",
headers: {
Authorization: "Bearer sai_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
source_generation_id: spriteId, // an imported screenshot or render
method: "refined", // omit for the free standard method
}),
});
const cutout = await res.json(); // completed inline, no polling
// cutout.id is a new sprite: animate or restyle it like any otherimport base64, requests
cutout = requests.post(
"https://www.sprite-ai.art/api/background-removals",
headers={"Authorization": "Bearer sai_sk_your_key_here"},
json={"source_generation_id": sprite_id, "method": "refined"},
).json()
with open("sprite_cutout.png", "wb") as f:
f.write(base64.b64decode(cutout["image"]["pngBase64"])){
"id": "f7a8b9c0-...",
"status": "completed",
"method": "refined",
"width": 64,
"height": 64,
"frameCount": null,
"matteColor": "#ff00ff",
"tokensSpent": 1,
"image": { "format": "png", "pngBase64": "iVBORw0KGgoAAAANS..." }
}Nouvelles tentatives et Idempotency-Key
Chaque POST qui peut facturer accepte un en-tête Idempotency-Key optionnel. Une requête renvoyée après une connexion coupée ne fait donc jamais, ni ne facture, un deuxième sprite. Ce sont POST /api/sprites, /api/animations, /api/restyles, /api/combines, /api/touch-ups, /api/rotations, /api/normal-maps et /api/background-removals. Prenez une nouvelle clé, comme un UUID, pour chaque nouvelle requête, et renvoyez la même clé avec le même corps quand vous réessayez.
curl https://www.sprite-ai.art/api/sprites \
-H "Authorization: Bearer sai_sk_your_key_here" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c6a52-8d4e-4c1b-9f0a-2b7e5d9c4a10" \
-d '{ "prompt": "a knight with a blue cape", "asset_type": "character" }'- La même clé avec le même corps dans les 24 heures reçoit la première réponse, et rien ne roule de nouveau.
- Un renvoi pendant que la première requête roule encore répond
409aveccode: "idempotency_key_in_use"et un en-têteRetry-After. Renvoyez-la après ce nombre de secondes. - La même clé avec un autre corps répond
422aveccode: "idempotency_key_reused". Une nouvelle requête prend une nouvelle clé. - Une clé fait de 1 à 255 caractères visibles, sans espace. Autrement, la réponse est
400aveccode: "invalid_idempotency_key". - Une requête qui a échoué sans rien facturer libère sa clé, donc un nouvel essai avec elle roule de nouveau.
- Les clés appartiennent à votre compte, peu importe la clé d'API qui les envoie.
Une requête sans cet en-tête roule chaque fois qu'elle est envoyée.
Erreurs
Chaque erreur renvoie la même structure JSON. Testez code, pas message.
{ "code": "invalid_request", "message": "...", "details": {} }| HTTP | Code | Quand |
|---|---|---|
400 | invalid_json | Le corps n'est pas du JSON valide. |
400 | invalid_request | Le corps n'a pas passé la validation (details.issues liste chaque problème), ou un sprite source est absent, pas à vous, pas prêt ou de la mauvaise taille. |
400 | invalid_palette | La palette n'a pas pu être enregistrée. |
400 | run_not_approvable | L'exécution de l'agent n'attend pas d'approbation. |
400 | run_not_cancellable | L'exécution de l'agent ne peut plus être annulée. |
400 | invalid_idempotency_key | L'Idempotency-Key est vide, trop longue ou contient des espaces. |
401 | missing_api_key | Aucun en-tête Authorization. |
401 | invalid_api_key | La clé n'est pas reconnue. |
401 | unauthorized | Une route de l'agent n'a reçu ni clé ni session connectée. |
402 | insufficient_tokens | Pas assez de jetons. Rien n'a roulé. |
402 | limit_reached | Réservé à une limite de forfait. Aucune route ne l'envoie aujourd'hui. |
402 | upgrade_required | Réservé à un outil qui demande un forfait plus élevé, nommé dans details.required_plan. Aucun outil n'en demande aujourd'hui. |
403 | api_key_revoked | La clé a été révoquée. |
403 | api_key_expired | La clé a expiré. |
404 | not_found | Aucun sprite ni tâche de ce nom, ou il n'est pas à vous. |
409 | idempotency_key_in_use | Une requête avec cette Idempotency-Key roule encore. Renvoyez-la après Retry-After secondes. |
409 | job_finished | La tâche est déjà terminée ou échouée, il n'y a donc rien à annuler. |
422 | content_policy | Le prompt a été refusé par le filtre de contenu ou par le fournisseur. Aucun jeton n'a été dépensé. |
422 | feature_unavailable | La demande revient à un autre outil, comme une animation tapée dans POST /api/sprites. Le message nomme l'outil. |
422 | plan_failed | L'agent n'a pas pu planifier le prompt, ou le plan coûte plus que cap. |
422 | idempotency_key_reused | Cette Idempotency-Key est déjà venue avec un autre corps. |
429 | rate_limited | Trop de requêtes. Attendez Retry-After secondes. |
500 | internal_error | Quelque chose d'imprévu a échoué. Réessayez. |
502 | provider_failure | Le rendu a échoué. Les jetons sont remboursés. |
503 | service_unavailable | La génération est en pause. Réessayez après Retry-After secondes. |
504 | provider_timeout | Le rendu a manqué de temps. Sur POST /api/sprites, le sprite est encore en cours et details.id le nomme. |
Packs d'assets
Un prompt peut planifier un pack complet. Le sprite d'ancrage, ses directions, une animation par direction, des restyles et des cartes d'éclairage, chiffrés étape par étape et lancés seulement après votre approbation du total. Les quatre endpoints (POST /api/agent, POST /api/agent/{id}/run, GET /api/agent/{id}, POST /api/agent/{id}/cancel) sont sur la page Agent de sprites.
Mis à jour le 22 octobre 2026