Intégration en production
Une liste de contrôle avant lancement pour une intégration capable de se rétablir — le bon modèle, des clés et un solde protégés, des coûts confirmés, un suivi durable des tâches, des callbacks fiables et les tests à mener avant la mise en ligne.
Servez-vous de cette page comme d’une liste de contrôle avant que de vrais utilisateurs ou de l’argent réel dépendent de votre intégration. Chaque section indique quoi faire, pourquoi c’est important et où trouver les détails. Si vous n’avez pas encore fait de premier appel, commencez par Préparer votre compte et le démarrage rapide.
Choisir un modèle et un protocole
- Choisissez un modèle que votre clé peut réellement appeler. Appelez
GET /api/v1/modelsavec votre clé API et n’utilisez que les modèles dontenabledetavailablevalent tous deuxtrue. Lisez dans cette même réponse l’inputSchemadu modèle (la liste des champs qu’il accepte) et sesexamples. La page d’un modèle sur le site vous dit ce qu’il sait faire ; elle ne prouve pas que votre clé a le droit de l’appeler en ce moment. Voir Modèles et points de terminaison. - Passez par le bon point d’entrée. Les tâches d’image, de vidéo et d’autres médias passent par l’API de tâches sous
/api/v1(createTask, puisrecordInfoou un callback). Les modèles de texte peuvent aussi être appelés par des clients compatibles OpenAI ou Anthropic sous/v1, ou par des clients compatibles Gemini sous/v1beta. Voir Texte et streaming. - Authentifiez-vous uniquement avec une clé API. Un cookie de connexion à la console n’est pas un identifiant d’API et ne doit jamais être copié dans du code.
Protéger vos clés et votre solde
- Gardez la clé sur votre serveur. Placez-la dans une variable d’environnement (
SPICY_API_KEY) de votre backend, jamais dans du code exécuté par le navigateur, dans une application mobile ou dans un dépôt public. Voir Authentification. - Une clé par environnement et par service. Nommez chaque clé d’après ce qui l’utilise (par exemple « production-worker »), pour pouvoir en révoquer une sans arrêter les autres.
- Fixez des limites sur la clé de production : un plafond quotidien dimensionné pour une mauvaise journée, un budget mensuel, des modèles autorisés et, pour les appels côté serveur, une liste d’adresses IP autorisées. Voir les restrictions par clé. Quand vous modifiez une clé, rappelez-vous qu’un plafond vide signifie aucune limite.
- Surveillez les dates d’expiration. Une clé dotée d’une date d’expiration cesse de fonctionner à la fin de ce jour (UTC) et renvoie le même
401qu’une clé révoquée. Notez la date dans votre agenda, ou n’en fixez pas pour un backend appelé à durer. - Ne tombez pas à court d’argent au milieu d’un lot. Une tâche refusée faute de solde renvoie
40201et n’est jamais mise en file d’attente. Activez l’Alerte de solde faible dans Notifications, et envisagez la recharge automatique. - Les limites d’équipe s’appliquent aussi. Si votre clé appartient à une équipe, les limites quotidiennes et mensuelles de l’équipe peuvent bloquer des tâches avec
40202même lorsque les plafonds propres à la clé ne sont pas atteints, et chaque tâche est payée sur le solde du propriétaire de l’équipe. Voir Plafonds de dépense. - Planifiez le renouvellement de la clé de signature des webhooks. Renouveler la clé dans la console ne laisse aucune période de chevauchement : l’ancienne clé cesse immédiatement de signer. Les livraisons encore en cours de nouvelle tentative sont signées avec la nouvelle clé. Renouvelez-la pendant une période calme, déployez tout de suite la nouvelle clé sur votre récepteur, et rattrapez ce qui a été manqué avec
recordInfo. Voir Webhooks.
Préparer les entrées sur votre serveur
- Validez par rapport au schéma actuel. Respectez les types de champs, les valeurs autorisées et les champs obligatoires sous condition définis dans
inputSchema, et validez à nouveau après un changement de modèle : chaque modèle a le sien. - Envoyez les médias par une voie prise en charge. Utilisez une URL
https://accessible publiquement ou une entrée Base64 prise en charge. Pour des fichiers locaux, demandez une URL de téléversement, envoyez les octets avecPUT, appelezfiles/{fileId}/commit, puis passez l’URIspicy://renvoyée dans le champ d’entrée du modèle. Voir Médias. - Utilisez chaque fichier téléversé pendant sa durée de vie. Une URI
spicy://fonctionne jusqu’à l’expiresAtindiqué dans la réponse de validation (1 jour par défaut). Ne demandez pas en masse des URL de téléversement que vous n’utiliserez jamais : celles qui restent inutilisées comptent dans une limite. Voir Limites de débit.
Demander un devis avant d’accepter une dépense
- Montrez le prix avant de dépenser de l’argent. Envoyez
model,inputetcallBackUrl, au complet, àPOST /api/v1/jobs/quote. MontrezestimatedCost,maxCharge, la devise (USD) etexpiresAtà la personne qui paie. Un devis est gratuit : il ne crée aucune tâche et ne réserve aucun fonds. - Soumettez ce qui a été confirmé. Un devis dure cinq minutes. Après confirmation, envoyez la même requête à
createTasken y ajoutantquoteIdetexpectedCost. - Gérez
40901. Ce code signifie que le devis a expiré, que l’entrée a changé ou que le prix a changé depuis le devis. Demandez un nouveau devis et affichez le nouveau montant ; n’acceptez jamais en silence un montant plus élevé. Voir Devis. - Gardez des montants exacts. Les montants sont des chaînes décimales comme
"0.008". Stockez-les et additionnez-les avec une arithmétique décimale, pas en virgule flottante. Voir Facturation.
Garder la trace de l’opération métier
Ce sont vos propres enregistrements qui vous permettent de vous rétablir quand un appel réseau échoue à mi-parcours.
- Enregistrez avant l’envoi : votre propre identifiant de commande ou d’opération, une courte description de la requête sans secret ni prompt complet (de quoi la reconnaître plus tard), et l’
Idempotency-Keyque vous allez envoyer. - Enregistrez après l’acceptation : le
taskIdet lerequest_idde la réponse. - Réutilisez la clé pour la même soumission. Renvoyez l’
Idempotency-Keyd’origine pour le même compte, la même clé API et la même requête dans les 24 heures : vous récupérez la tâche d’origine au lieu d’être facturé une seconde fois. Voir Idempotence. - Traitez un dépassement de délai comme « inconnu », pas comme « échoué ». Récupérez la soumission d’origine avec sa clé avant de décider d’en créer une nouvelle. Voir Dépannage et reprise.
- Sachez ce que coûte une relance. Relancer une tâche déjà échouée crée une nouvelle tâche, aux conditions et aux prix du moment.
Traiter les callbacks et les résultats de façon fiable
- Vérifiez chaque callback. Contrôlez la signature et l’horodatage sur les octets bruts de la requête avant de l’analyser, puis dédupliquez et enregistrez l’événement. Voir Webhooks.
- Accusez réception rapidement. Répondez immédiatement par un
2xxet effectuez les traitements lents dans votre propre file d’attente. - Attendez-vous à des doublons et à des retards. Décidez quoi faire en fonction du
statede la tâche, pas de l’ordre d’arrivée des callbacks. - Gardez le polling comme solution de secours. Si un callback tarde, lisez
recordInfoavec des pauses de plus en plus longues plutôt que toutes les secondes. - Lisez le bon signal. Le HTTP
202renvoyé parcreateTasksignifie que la tâche a été acceptée.state: "succeeded"signifie que la génération est terminée.settled: truesignifie que le montant facturé est définitif.
Limiter la concurrence et conserver les résultats
- Limitez le nombre de tâches en cours par compte, et fixez des échéances à vos propres requêtes. Chaque tâche acceptée réserve des fonds jusqu’à son règlement.
- Respectez
Retry-Afteren cas de429, et évitez que de nombreux clients interrogent le service toutes les secondes, tous au même rythme. Voir Limites de débit. - Mettez les données du catalogue en cache brièvement et en privé, et ne traitez jamais un devis comme une grille tarifaire permanente.
- Archivez les résultats que vous devez garder. Les liens de téléchargement durent 20 minutes ; les médias générés sont conservés au plus environ 14 jours et les téléversements un jour. Vous pouvez raccourcir ces durées, ou supprimer plus tôt le contenu d’une tâche avec
POST /api/v1/jobs/purge. Raccourcir une durée de conservation peut aussi supprimer les résultats de tâches déjà exécutées — voir Conservation. - Ne comptez pas sur une déconnexion pour arrêter le travail. Une tâche acceptée continue de s’exécuter et ne peut pas être annulée.
Valider avant le lancement
Commencez par les appels gratuits : le catalogue (GET /api/v1/models), votre solde (GET /api/v1/chat/credit) et un devis. Lancez ensuite une vraie génération, de petite taille, en passant par votre propre parcours de confirmation des coûts : elle est facturée comme n’importe quelle autre tâche. Vérifiez que votre intégration gère chacun des cas suivants :
| Scénario | Comment le provoquer | Ce que doit faire votre intégration |
|---|---|---|
| Succès | Une petite tâche normale | Enregistrer le résultat, afficher le cost final une fois que settled vaut true |
| Entrée invalide | Envoyer une valeur hors du schéma | Signaler le problème ; ne pas réessayer (400) |
| Combinaison non prise en charge | Un réglage que le modèle ne sait pas servir (s’il en existe un) | Demander une autre valeur ; ne pas réessayer (40004) |
| Solde insuffisant | Une clé sur un compte dont le solde est trop faible | Inviter l’utilisateur à ajouter des fonds ; ne pas réessayer (40201) |
| Limite de dépense atteinte | Une clé avec un plafond quotidien très bas | Indiquer quelle limite a été atteinte ; ne pas réessayer (40202) |
| Clé révoquée ou expirée | Révoquer une clé de test, puis appeler avec elle | Alerter un opérateur ; ne pas réessayer (401) |
| Dépassement de délai après l’envoi | Couper la connexion juste après createTask | Renvoyer avec le même Idempotency-Key et récupérer la tâche d’origine |
| Le modèle refuse le contenu | Difficile à provoquer à la demande : dans vos tests, simulez une réponse recordInfo avec state: "failed" et errorCode: "content_rejected" | Afficher la raison tirée de errorMessage ; ne pas réessayer automatiquement |
| Callback en double | Rejouer un callback déjà reçu | Ne le traiter qu’une seule fois |
| Lien de téléchargement expiré | Attendre plus de 20 minutes | Demander un nouveau lien |
Journalisez request_id, taskId, l’heure, le state et les montants. Tenez les clés API et les prompts complets à l’écart des journaux généraux.
Parcours associés
Devis et compatibilité des protocoles · Modèles et points de terminaison · Médias · Webhooks · Erreurs · Dépannage et reprise · Facturation · Conservation
Remplacement de personne
Une seule boîte à outils, deux formes. Les modèles à un appel remplacent un visage ou une tête en une requête ; les modèles à deux appels analysent d’abord le clip pour que vous choisissiez qui change.
SDK TypeScript
Un guide pas à pas du SDK TypeScript @spicyapi/sdk pour l’installer, obtenir votre premier résultat et retrouver chaque méthode, option et erreur expliquée avec des mots simples. Les SDK Python, Go, PHP et Java sont documentés sur leurs propres pages.

