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"
200 OK
{
"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"
200 OK
{
"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"
TypeCoût en jetonsTaille (px)
character132 à 400
creature132 à 400
prop132 à 400
weapon132 à 400
vehicle132 à 400
tile132 à 400
background132 à 400
ui132 à 400
effect132 à 400
item132 à 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"
200 OK
{
"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.

ChampTypeRequisDescription
promptstringOuiQuoi dessiner. Accepte 3 à 1500 caractères.
widthintegerNonLargeur en pixels. Accepte 32 à 400. Par défaut 64.
heightintegerNonHauteur en pixels. Accepte 32 à 400. Par défaut 64.
asset_typestringNonDéduit du prompt si omis. Accepte character, creature, prop, weapon, vehicle, tile, background, ui, effect, item.
directionstringNonDirection du regard. Accepte none, south, south-west, west, north-west, north, north-east, east, south-east.
camera_perspectivestringNonAngle de caméra. Accepte none, front, side, top_down, three_quarter, isometric.
publicbooleanNonAjoute à la galerie publique. Par défaut false.
reference_asset_idstring (uuid)NonUUID 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_idstring (uuid)NonUne 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" }'
201 Created
{
"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.

504 Gateway Timeout
{
"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.

ChampTypeRequisDescription
imagestringOuiLe sprite, en base64 ou en URL data:image/...;base64. Accepte au moins 1 caractères.
titlestringNonÉtiquette du sprite. Si omis, "Imported sprite". Accepte au plus 200 caractères.
asset_typestringNonÉtiquette de type d'asset, métadonnée seulement. Accepte character, creature, prop, weapon, vehicle, tile, background, ui, effect, item.
palette_idstring (uuid)NonUne 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" }'
201 Created
{
"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"

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-.../download

GET/api/sprites

Liste vos sprites et animations, du plus récent au plus ancien.

ChampTypeRequisDescription
limitintegerNonCombien en renvoyer. Accepte 1 à 100. Par défaut 20.
offsetintegerNonCombien en sauter, pour la pagination. Accepte au moins 0. Par défaut 0.
statusstringNonFiltre par statut. Seuls les sprites livrés sont listés, donc toute valeur autre que completed ne retourne rien.
asset_typestringNonFiltre par type, p. ex. animation.
curl "https://www.sprite-ai.art/api/sprites?limit=20" \
-H "Authorization: Bearer sai_sk_your_key_here"

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.

ChampTypeRequisDescription
promptstringOuiÀ quoi sert la palette, p. ex. "mossy dungeon, 16 colours". Accepte 3 à 200 caractères.
countintegerNonCouleurs 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.
optionsintegerNonNombre d'options. Si omis, 4. Accepte 2 à 4.
200 OK
{
"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.

ChampTypeRequisDescription
namestringOuiUn nom court. Accepte 1 à 80 caractères.
recipeobjectNonLa recette de l'option choisie, venant de /api/palettes/generate, telle que renvoyée. Envoyez ceci ou colors.
colorsstring[]NonDes couleurs #rrggbb au lieu d'une recette. Envoyez ceci ou recipe. Accepte 2 à 256 éléments, chacun correspond à ^#[0-9a-fA-F]{6}$.
201 Created
{
"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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite fixe généré ou importé par vous.
presetstringOuiPré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_countintegerNonPair. Détermine le coût en jetons. Accepte 4 à 16. Par défaut 8.
custom_promptstringNonMouvement en texte libre. Requis quand preset est Custom. Accepte au plus 1500 caractères.
palette_extrasintegerNonCouleurs 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_marginintegerNonPourcentage 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_anchorstringNonOù 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.
publicbooleanNonAjoute à 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églagepalette_extrasframing_marginframing_anchor
Idle00center
Walk00center
Jump025bottom
Run00center
Attack120center
Hurt00center
Death00center
Custom120center
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 }'
202 Accepted
{ "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"
200 OK (completed)
{
"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"
200 OK
{ "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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite généré ou importé par vous, 32-256 px de côté.
presetstringNonStyle 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_promptstringNonQuoi changer, dans vos mots, lu avec mode. Envoyez ceci ou preset, pas les deux. Accepte 1 à 500 caractères.
modestringNonrestyle 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.
tierstringNonPro 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_extrasintegerNonCouleurs 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_marginintegerNonPourcentage 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_anchorstringNonOù 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.
publicbooleanNonAjoute à 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.

Modepalette_extras
restyle16
pose4
item12
custom12
combine4
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" }'
202 Accepted
{ "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"
200 OK (completed)
{
"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"
200 OK
{ "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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID du sprite qui garde son identité. Ses dimensions sont celles du résultat.
item_generation_idstring (uuid)OuiUUID du sprite d'où l'objet est copié. Doit différer de source_generation_id.
promptstringOuiOù va l'objet. Dites le placement, pas l'objet, parce que l'objet vient de l'image. Accepte 1 à 500 caractères.
tierstringNonNormal 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_extrasintegerNonCouleurs 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_marginintegerNonPourcentage 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_anchorstringNonOù 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.
publicbooleanNonAjoute à 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" }'
202 Accepted
{ "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"
200 OK
{
"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"
200 OK
{ "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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite fixe à vous, 32-1024 px de côté.
promptstringOuiQuoi corriger, p. ex. "glowing red eyes in the visor". Accepte 1 à 300 caractères.
regionobjectOuiLa zone à réparer, en pixels du sprite, avec l'origine en haut à gauche.
region.xintegerOuiBord gauche. Accepte 0 à 4096.
region.yintegerOuiBord du haut. Accepte 0 à 4096.
region.widthintegerOuiLargeur. Accepte 1 à 4096.
region.heightintegerOuiHauteur. Accepte 1 à 4096.
publicbooleanNonPublie 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 }
}'
201 Created
{
"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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite fixe à vous, 32-256 px de côté.
publicbooleanNonPublie 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-..." }'
201 Created
{
"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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite ou d'une animation à vous. Les frames doivent faire 32-256 px de côté.
strengthnumberNonInjection 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_greenbooleanNonInverse 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.
columnsintegerNonSeulement 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.
rowsintegerNonLe 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-..." }'
201 Created
{
"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.

ChampTypeRequisDescription
source_generation_idstring (uuid)OuiUUID d'un sprite ou d'une animation à vous.
methodstringNonstandard est un chroma key gratuit. refined est un matting par palette et coûte 1 jeton. Accepte standard, refined. Par défaut standard.
matte_colorstringNonCouleur d'arrière-plan à retirer, en #rrggbb. Si omise, elle est échantillonnée aux coins. Doit correspondre à ^#?[0-9a-fA-F]{6}$.
toleranceintegerNonstandard 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_sizeintegerNonrefined seulement. Plafond de couleurs du sprite utilisées pour le matting. Accepte 16 à 256. Par défaut 64.
alpha_thresholdnumberNonrefined 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" }'
201 Created
{
"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 409 avec code: "idempotency_key_in_use" et un en-tête Retry-After. Renvoyez-la après ce nombre de secondes.
  • La même clé avec un autre corps répond 422 avec code: "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 400 avec code: "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": {} }
HTTPCodeQuand
400invalid_jsonLe corps n'est pas du JSON valide.
400invalid_requestLe 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.
400invalid_paletteLa palette n'a pas pu être enregistrée.
400run_not_approvableL'exécution de l'agent n'attend pas d'approbation.
400run_not_cancellableL'exécution de l'agent ne peut plus être annulée.
400invalid_idempotency_keyL'Idempotency-Key est vide, trop longue ou contient des espaces.
401missing_api_keyAucun en-tête Authorization.
401invalid_api_keyLa clé n'est pas reconnue.
401unauthorizedUne route de l'agent n'a reçu ni clé ni session connectée.
402insufficient_tokensPas assez de jetons. Rien n'a roulé.
402limit_reachedRéservé à une limite de forfait. Aucune route ne l'envoie aujourd'hui.
402upgrade_requiredRéservé à un outil qui demande un forfait plus élevé, nommé dans details.required_plan. Aucun outil n'en demande aujourd'hui.
403api_key_revokedLa clé a été révoquée.
403api_key_expiredLa clé a expiré.
404not_foundAucun sprite ni tâche de ce nom, ou il n'est pas à vous.
409idempotency_key_in_useUne requête avec cette Idempotency-Key roule encore. Renvoyez-la après Retry-After secondes.
409job_finishedLa tâche est déjà terminée ou échouée, il n'y a donc rien à annuler.
422content_policyLe prompt a été refusé par le filtre de contenu ou par le fournisseur. Aucun jeton n'a été dépensé.
422feature_unavailableLa demande revient à un autre outil, comme une animation tapée dans POST /api/sprites. Le message nomme l'outil.
422plan_failedL'agent n'a pas pu planifier le prompt, ou le plan coûte plus que cap.
422idempotency_key_reusedCette Idempotency-Key est déjà venue avec un autre corps.
429rate_limitedTrop de requêtes. Attendez Retry-After secondes.
500internal_errorQuelque chose d'imprévu a échoué. Réessayez.
502provider_failureLe rendu a échoué. Les jetons sont remboursés.
503service_unavailableLa génération est en pause. Réessayez après Retry-After secondes.
504provider_timeoutLe 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

Nous utilisons des témoins (cookies) pour améliorer votre expérience. Les essentiels sont requis pour que le site fonctionne. Acceptez-les tous ou seulement les essentiels.

En savoir plus