spicyapiDocumentation
Agents et CLI
Contenu principal

Outil en ligne de commande (CLI)

Utilisez la commande spicyapi pour parcourir les modèles, vérifier les prix, générer des images et des vidéos et télécharger les résultats depuis un terminal, sans écrire de code.

Ce qu’est la CLI

spicyapi est un petit programme qui s’exécute dans un terminal, la fenêtre où l’on tape des commandes au lieu de cliquer sur des boutons. Chaque commande remplit une seule fonction : lister les modèles que votre compte peut utiliser, vous dire ce que coûtera une génération, lancer une génération d’image ou de vidéo, attendre qu’elle se termine et vous donner un lien pour télécharger le résultat.

Vous n’écrivez aucun code. Vous tapez une commande, vous appuyez sur Entrée et vous lisez la réponse.

Elle est tout indiquée quand vous voulez :

  • essayer des modèles et comparer les prix avant que quiconque écrive une intégration ;
  • générer des images ou des vidéos depuis votre propre ordinateur et enregistrer les fichiers ;
  • répéter le même type de génération sans refaire tous les clics sur une page à chaque fois ;
  • vérifier les réglages exacts d’un modèle avant de construire quelque chose par-dessus.

La CLI couvre la génération d’images et de vidéos. Les modèles de texte et de chat s’appellent via les points de terminaison compatibles chat décrits dans Texte et streaming.

Il existe trois autres outils officiels. Choisissez la CLI si vous voulez taper les commandes vous-même :

OutilChoisissez-le quand
SDKVous écrivez un programme JavaScript ou TypeScript qui appelle SpicyAPI
Serveur MCPVous voulez qu’un assistant de code IA exécute ces mêmes étapes pour vous
Agent SkillVous voulez apprendre à un agent IA la manière sûre d’utiliser SpicyAPI

Vous écrivez dans un autre langage ? Il existe aussi des SDK officiels pour Python, Go, PHP et Java.

Rien sur cette page ne dépense d’argent par accident

Seules deux commandes peuvent coûter de l’argent : tasks create et tasks retry. Toutes deux s’arrêtent et vous demandent votre accord avant la moindre facturation. Tout le reste est gratuit, aussi souvent que vous le voulez.

Ce que vous pouvez faire

Je veux…CommandePayant ?Clé API nécessaire ?
Vérifier que SpicyAPI est joignablespicyapi statusNonNon
Chercher dans cette documentationspicyapi docs search <words>NonNon
Voir les modèles que je peux utiliser, et leurs prixspicyapi models listNonOui
Voir les réglages qu’accepte un modèlespicyapi models get <model>NonOui
Consulter mon soldespicyapi balanceNonOui
Voir combien une clé a dépenséspicyapi usageNonOui
Connaître le prix exact d’une génération sans la lancerspicyapi tasks quoteNonOui
Lancer une génération d’image ou de vidéospicyapi tasks createOui, après vous avoir demandéOui
Attendre qu’une génération se terminespicyapi tasks wait <task-id>NonOui
Consulter une génération et ses liens de résultatspicyapi tasks get <task-id>NonOui
Lister mes générations récentesspicyapi tasks listNonOui
Relancer une génération échouéespicyapi tasks retry <task-id>Oui, après vous avoir demandéOui
Supprimer définitivement les fichiers et le prompt d’une générationspicyapi tasks purge <task-id>Non, et rien n’est rembourséOui
Téléverser une image, une vidéo ou un fichier audio à utiliser comme entréespicyapi files upload <path>NonOui
Obtenir un nouveau lien de téléchargement pour un résultatspicyapi files download-url <task-id>NonOui
Vérifier qu’un callback vient vraiment de SpicyAPIspicyapi webhooks verifyNonNon, elle utilise votre clé de signature des webhooks

Dans les commandes ci-dessus, un mot entre chevrons comme <task-id> signifie « mettez ici votre propre valeur », sans les chevrons.

Avant de commencer

Il vous faut quatre choses : un terminal, Node.js, une clé API et un moyen de lancer la CLI. Comptez une dizaine de minutes la première fois.

Ouvrir un terminal

Un terminal est une fenêtre de texte qui sert à exécuter des commandes. Tout ce qui figure sur cette page se tape ou se colle là, puis s’exécute avec Entrée.

Appuyez sur Cmd + Espace, tapez Terminal et appuyez sur Entrée. Une fenêtre s’ouvre avec une ligne qui se termine par % ou $ : c’est là que vous tapez. Collez avec Cmd + V.

Installer Node.js 22.13 ou plus récent

La CLI fonctionne grâce à Node.js, un programme gratuit. Vérifiez s’il est déjà installé :

node -v

Si la commande affiche v22.13.0 ou un numéro plus élevé, comme v22.14.0 ou v24.4.1, vous êtes prêt. Si elle affiche un numéro inférieur, ou indique command not found ou is not recognized :

  1. Allez sur nodejs.org, ouvrez la page de téléchargement et choisissez la version LTS pour votre système.
  2. Lancez l’installeur et acceptez les options par défaut.
  3. Fermez le terminal et ouvrez-en un nouveau, puis relancez node -v.

Node.js est fourni avec npm et npx, les deux utilitaires dont se sert la dernière étape.

Créer une clé API

La clé API permet à SpicyAPI de savoir que la requête vient de votre compte.

  1. Créez un compte sur spicyapi.ai/register. Les comptes peuvent être ouverts par vagues ; si l’inscription n’est pas encore ouverte pour vous, rejoignez la liste d’attente.
  2. Approvisionnez votre solde dans Facturation, dans la console. Les générations sont payées sur votre solde, en dollars américains.
  3. Ouvrez Clés API et cliquez sur Créer une clé. Donnez-lui un nom que vous reconnaîtrez plus tard, comme my laptop. Seul le nom est obligatoire.
  4. Copiez la clé immédiatement. Elle commence par sk-spicy- et n’est affichée qu’une seule fois. Vous pouvez aussi utiliser Enregistrer dans un fichier.

Les nouvelles clés n’ont aucun plafond de dépense tant que vous n’en réglez pas un. Un plafond quotidien évite qu’une erreur ou une clé divulguée fasse grimper la facture, et vous pourrez le modifier plus tard sur la même page.

Traitez la clé comme un mot de passe

Quiconque possède votre clé peut dépenser votre solde. Ne l’envoyez ni par messagerie ni par e-mail, ne la montrez ni sur une capture d’écran ni dans une demande d’assistance, et ne l’enregistrez jamais dans un dossier de projet destiné à Git ou à GitHub. Si elle a fuité, révoquez-la sur la page Clés API et créez-en une nouvelle.

Placer la clé dans SPICY_API_KEY

La CLI n’a pas de commande de connexion et n’accepte jamais la clé comme option de commande. Elle lit une variable d’environnement nommée SPICY_API_KEY : une valeur nommée que votre terminal transmet aux programmes qu’il lance.

Pour la fenêtre actuelle uniquement (la valeur est oubliée quand vous fermez la fenêtre) :

export SPICY_API_KEY="sk-spicy-paste-your-key-here"

De façon permanente, ajoutez cette même ligne export à la fin du fichier de démarrage de votre shell, qui s’exécute à chaque ouverture d’un terminal. Sur macOS, ce fichier est ~/.zshrc ; sur la plupart des systèmes Linux, c’est ~/.bashrc.

nano ~/.zshrc

Collez la ligne export tout en bas, appuyez sur Ctrl + O puis sur Entrée pour enregistrer, et sur Ctrl + X pour quitter. Sous Linux, utilisez plutôt nano ~/.bashrc. Ouvrez une nouvelle fenêtre de terminal pour que la modification prenne effet.

Vérifiez que la variable est définie, sans afficher la clé entière :

echo "${SPICY_API_KEY:0:9}"

La commande doit afficher sk-spicy-.

Où la clé peut se trouver, et où elle ne doit jamais aller

Le fichier de démarrage de votre shell et les réglages de votre compte Windows restent sur cet ordinateur, ce qui convient pour un usage personnel. Ne mettez jamais la clé dans un fichier à l’intérieur d’un projet, ne la versionnez jamais et ne la collez jamais dans un document partagé. Les terminaux gardent aussi en mémoire les commandes que vous tapez : sur un ordinateur partagé, préférez le fichier de démarrage ou la boîte de dialogue des réglages Windows plutôt que de taper la clé dans une commande.

Choisir comment lancer la CLI

Il y a deux façons de faire, et les commandes sont les mêmes.

npx télécharge la CLI quand c’est nécessaire et l’exécute :

npx @spicyapi/cli status

La première fois, npm demande Need to install the following packages: @spicyapi/cli@… Ok to proceed? (y). Appuyez sur y puis sur Entrée.

Avec cette méthode, écrivez npx @spicyapi/cli partout où cette page écrit spicyapi. Par exemple, spicyapi models list devient npx @spicyapi/cli models list.

Votre premier résultat

Ce parcours génère une image et la télécharge. Chaque étape montre la commande, à peu près ce que vous verrez, et ce qui vient de se passer. Vos chiffres, vos identifiants et vos horaires seront différents.

Remplacez MODEL_ID_FROM_CATALOG par un vrai identifiant de modèle

MODEL_ID_FROM_CATALOG est un emplacement réservé, pas un modèle. L’étape 3 montre comment choisir un vrai identifiant dans le catalogue en direct (live catalog) avec spicyapi models list, qui renvoie la même liste que GET /api/v1/models. Collez votre identifiant partout où cette page affiche l’emplacement réservé. Envoyer l’emplacement réservé lui-même ne renvoie qu’une erreur « not found ».

Vérifier la connexion

spicyapi status
SpicyAPI is reachable — api.spicyapi.ai answered in 523 ms.

Ce qui s’est passé : la CLI a demandé à SpicyAPI s’il fonctionne. Cela ne demande aucune clé et ne coûte rien. Si vous voyez « could not be reached », vérifiez votre connexion internet ou votre proxy ; voir Dépannage.

Consulter votre solde

spicyapi balance
available: 12.34
held: 0.06
total: 12.40

Ce qui s’est passé : c’est la première commande qui utilise votre clé. Les montants sont en dollars américains. available est ce que vous pouvez dépenser maintenant, held est mis de côté pour des générations encore en cours, et total est la somme des deux. Vous pouvez aussi voir une ligne funding qui répartit le solde entre fonds prépayés et dotations promotionnelles.

Si vous voyez Error: SPICY_API_KEY is required for authenticated API operations, la clé n’est pas définie dans cette fenêtre de terminal. La ligne Next: juste en dessous indique comment la définir ; voir aussi Avant de commencer.

Choisir un modèle

spicyapi models list --modality image --json
{
  "total": 1,
  "items": [
    {
      "model": "MODEL_ID_FROM_CATALOG",
      "displayName": "Example image model",
      "modality": "image",
      "tasks": ["text-to-image"],
      "enabled": true,
      "available": true,
      "pricing": [
        { "variant": "", "unit": "per_image", "price": "0.03", "currency": "USD" }
      ]
    }
  ]
}

Cet exemple est raccourci : la vraie liste contient davantage de modèles et de champs.

Ce qui s’est passé : la CLI a récupéré les modèles que votre compte peut appeler aujourd’hui, à vos prix. Choisissez-en un dont enabled et available valent tous deux true, et copiez sa valeur model, par exemple en la sélectionnant à la souris. Cette valeur est l’identifiant de modèle. Les identifiants ont la forme maker/model/task.

  • price est en dollars américains par unit : per_image, per_second de vidéo, per_request ou per_1k_tokens.
  • Plusieurs entrées dans pricing signifient que le prix dépend de vos réglages, comme la résolution.
  • Pour trouver un modèle par son nom, ajoutez --search suivi d’une partie de son nom.

--json affiche la liste sous forme de JSON lisible et indenté. Sans cette option, toute la liste est tassée sur une seule longue ligne.

Voir les réglages qu’accepte ce modèle

spicyapi models get MODEL_ID_FROM_CATALOG --json
{
  "model": "MODEL_ID_FROM_CATALOG",
  "enabled": true,
  "available": true,
  "inputSchema": {
    "type": "object",
    "required": ["prompt"],
    "properties": {
      "prompt": { "type": "string" },
      "aspect_ratio": { "type": "string", "enum": ["1:1", "16:9", "9:16"] }
    },
    "additionalProperties": false
  }
}

Ce qui s’est passé : inputSchema est la liste des réglages du modèle, que la suite de cette page appelle l’entrée.

  • required liste les réglages que vous devez envoyer. Ici, uniquement prompt.
  • properties liste tous les réglages que le modèle accepte, et rien d’autre n’est autorisé : un seul nom inconnu ou mal orthographié suffit à faire refuser toute la requête.
  • enum liste les seules valeurs autorisées pour ce réglage.

Chaque modèle a ses propres réglages : lisez-les donc toujours pour le modèle que vous avez choisi. Pour obtenir des entrées toutes prêtes, déjà validées par le serveur, lancez spicyapi models list --search <name> --include-examples --json et regardez examples.

Écrire votre entrée dans un fichier

Placez l’entrée dans un fichier nommé input.json, dans le dossier où se trouve votre terminal. Un fichier évite les problèmes de guillemets, surtout sous Windows.

Collez les trois lignes d’un coup :

cat > input.json <<'EOF'
{"prompt": "A paper lantern glowing on a rainy street at night, cinematic light"}
EOF

Ce qui s’est passé : vous avez décrit ce qu’il faut générer, avec les noms de réglages de l’étape précédente. Les guillemets doivent être des guillemets droits ordinaires ("), pas des guillemets courbes.

Vérifier le prix

spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.json
quoteId: eyJ2IjoxLCJtIjoi…
model: MODEL_ID_FROM_CATALOG
estimatedCost: 0.03
maxCharge: 0.03
currency: USD
quantity: 1
unit: per_image
expiresAt: 2026-09-17T08:05:00Z

Ce qui s’est passé : SpicyAPI a calculé le prix de cette requête précise. Rien n’a été lancé et rien n’a été facturé. estimatedCost est ce que la génération devrait coûter, et maxCharge le maximum qu’elle peut coûter. Cette étape est facultative : la commande suivante redemande le prix et vous l’affiche avant de dépenser quoi que ce soit.

Lancer la génération et l’attendre

spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait

La CLI affiche d’abord le prix et vous demande de confirmer :

Estimated charge: USD 0.03; maximum charge: USD 0.03. Quote expires: 2026-09-17T08:05:00Z.
Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
Create a billable task with model MODEL_ID_FROM_CATALOG? Estimated charge: USD 0.03; maximum charge: USD 0.03. Quote expires: 2026-09-17T08:05:00Z. Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241. Continue? [y/N]

Tapez y et appuyez sur Entrée. Toute autre réponse annule, et rien n’est facturé. Répondez dans les cinq minutes, avant que le devis expire.

Dès que SpicyAPI accepte le travail, la CLI affiche son identifiant de tâche :

Accepted: job_01k3m8x9q2z4v7n5p6r8s0t1w3
If waiting is interrupted: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3

Une image prend généralement quelques secondes, une vidéo quelques minutes. Quand la génération est terminée, le résultat s’affiche :

idempotencyKey: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
accepted: {"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3","state":"queued","estimatedCost":"0.03","deadlineAt":"2026-09-17T08:30:00Z"}
task: {"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3","model":"MODEL_ID_FROM_CATALOG","state":"succeeded","output":{"assets":[{"key":"tasks/…/result.png","url":"https://…","expiresAt":"2026-09-17T08:20:00Z","mime":"image/png","width":1024,"height":1024}]},"cost":"0.03","settled":true,…}

Ce qui s’est passé : après votre y, SpicyAPI a accepté la génération, que l’on appelle désormais une tâche, et a mis de côté le montant estimé sur votre solde. La CLI a ensuite consulté la tâche toutes les quelques secondes jusqu’à ce qu’elle se termine. Sur la dernière ligne, cherchez "state":"succeeded" et l’"url" à l’intérieur de output. cost est le montant facturé définitif une fois que settled vaut true. Ajoutez --json à la commande si vous préférez un résultat réparti sur plusieurs lignes lisibles.

Fermer la fenêtre n’annule pas la tâche

Une fois acceptée, une tâche va toujours jusqu’au bout et est facturée normalement. Appuyer sur Ctrl + C ou fermer le terminal n’arrête que l’attente. Gardez l’identifiant de la tâche et reprenez le suivi avec spicyapi tasks wait <task-id> ; voir Reprendre une tâche après une attente interrompue.

Télécharger le résultat

L’url est un lien de téléchargement direct qui fonctionne pendant environ 20 minutes et ne demande aucune clé. Collez-le dans un navigateur et enregistrez le fichier, ou téléchargez-le depuis le terminal (gardez les guillemets, car le lien contient des caractères &) :

curl -L -o result.png "PASTE_THE_URL_HERE"

Utilisez l’extension de fichier qui correspond à mime : .png pour image/png, .jpg pour image/jpeg, .mp4 pour video/mp4.

Si le lien a expiré, obtenez-en un nouveau avec spicyapi files download-url <task-id>, ou lancez spicyapi tasks get <task-id>, qui renvoie des liens neufs.

Ce qui s’est passé : vous avez copié le résultat sur votre propre ordinateur. Ne tardez pas : SpicyAPI conserve les fichiers générés environ 14 jours au plus (moins si votre compte est réglé sur une durée plus courte), puis les supprime définitivement. Voir Conservation et destruction.

Lire ce qu’affiche la CLI

  • L’affichage normal montre une paire name: value par ligne. Les valeurs composées de plusieurs parties, comme output ou retention, sont affichées en JSON sur une seule ligne.
  • --json affiche la réponse complète en JSON indenté. L’option fonctionne avec toutes les commandes, avant ou après le nom de la commande : spicyapi --json balance et spicyapi balance --json reviennent au même.
  • Les résultats vont sur la sortie normale de l’écran ; les messages vont sur la sortie d’erreur. Les prix, la clé d’idempotence, les lignes Accepted: et les erreurs sont des messages. Ainsi, spicyapi --json tasks get <task-id> > task.json n’enregistre que le résultat dans task.json, tandis que les messages continuent de s’afficher à l’écran.
  • Les erreurs ressemblent à Error: <what went wrong> (request req_…), généralement suivies d’une ligne Next: qui indique quoi faire. Avec --json, une erreur est un objet JSON sur une seule ligne avec error, type, status, code et requestId, sans ligne Next:. Quand aucune clé n’est définie, type vaut MissingApiKeyError. Citez la valeur req_… si vous contactez l’assistance.
  • Les montants sont des dollars américains écrits en texte simple, sans signe $, comme 0.03.
  • Les heures sont en UTC. Le Z à la fin de 2026-09-17T08:05:00Z signifie UTC.
  • Le code de sortie vaut 0 quand une commande réussit et une autre valeur quand elle échoue, ce que les scripts peuvent vérifier.

Référence des commandes

Chaque commande a aussi une aide intégrée : ajoutez --help, par exemple spicyapi tasks create --help.

Options globales et variables d’environnement

Ces options fonctionnent avec toutes les commandes.

OptionCe qu’elle faitPar défautObligatoire
--jsonAffiche le résultat complet en JSONDésactivéeNon
--timeout-ms <milliseconds>Combien de temps attendre une réponse de SpicyAPI avant d’abandonner, de 1 à 12000030000 (30 secondes)Non
--max-retries <count>Combien de fois réessayer automatiquement après une erreur réseau, un 429 ou une erreur serveur, pour les requêtes qui peuvent être répétées sans risque, de 0 à 52Non
--api-base-url <url>Envoie les requêtes API à une autre adresse. Normalement, vous n’en avez jamais besoinhttps://api.spicyapi.ai/api/v1Non
--service-base-url <url>L’adresse que vérifie status. Normalement, vous n’en avez jamais besoinhttps://api.spicyapi.aiNon
-V, --versionAffiche la version de la CLI—Non
-h, --helpAffiche l’aide de la commande—Non
Variable d’environnementÀ quoi elle sert
SPICY_API_KEYVotre clé API. Nécessaire pour toutes les commandes sauf status, docs search et webhooks verify
SPICY_WEBHOOK_SECRETVotre clé de signature des webhooks, lue par webhooks verify
SPICY_API_BASE_URL, SPICY_SERVICE_BASE_URLÉquivalents des deux options d’adresse ci-dessus. Les adresses doivent utiliser https://

status

Ce qu’elle fait : vérifie que SpicyAPI fonctionne et qu’il est joignable depuis votre ordinateur.

spicyapi status

Aucune option. Aucune clé nécessaire. Gratuit.

Ce qui s’affiche : une phrase. SpicyAPI is reachable — … answered in … ms. signifie que tout va bien. could not be reached signifie que votre ordinateur n’a obtenu aucune réponse : vérifiez votre réseau ou votre proxy. is not healthy ou reports it is not ready signalent un problème de notre côté ; les incidents en cours sont listés sur status.spicyapi.ai.

Avec --json, vous voyez les vérifications brutes. operational: true est la réponse qui compte ; une entrée readiness avec le statut 404 est normale sur l’adresse publique.

Ce qu’elle fait : trouve la page de documentation qui traite d’un sujet. Elle cherche dans un petit index intégré à la CLI : elle fonctionne donc sans clé et sans appeler SpicyAPI. Chaque résultat renvoie vers la page correspondante de ce site de documentation, docs.spicyapi.ai.

spicyapi docs search [words] [--limit <count>]
Argument ou optionCe qu’il faitPar défautObligatoire
wordsLes mots à chercher. Omettez-les pour lister les pagesVideNon
--limit <count>Nombre maximal de résultats, de 1 à 2510Non
spicyapi docs search retention
slug: retention
title: Retention and destruction
summary: What the platform caps are, how far down you can dial them, how to destroy a task's content, and what we cannot promise.
keywords: ["privacy","delete","storage","retention","per-request retention","purge","destroy"]
url: https://docs.spicyapi.ai/docs/retention

Quand il y a plusieurs résultats, ils s’affichent les uns après les autres, et chacun commence par slug:. Si rien ne correspond, la commande le dit et se termine quand même avec le code 0 :

No documentation matched "refnd". Try fewer or different words, or run `spicyapi docs search` without words to browse pages.

Avec --json, l’absence de résultat affiche une liste vide, []. Gratuit.

models list

Ce qu’elle fait : liste les modèles que votre compte peut appeler aujourd’hui, aux prix que paie votre compte.

spicyapi models list [options]
OptionCe qu’elle faitPar défautObligatoire
--modality <type>Uniquement les modèles image, video ou text. L’option accepte aussi audio, mais aucun modèle audio n’est proposé aujourd’huiTousNon
--task <task>Uniquement un type de travail, comme text-to-image, edit, image-to-video, text-to-video ou reference-to-videoTousNon
--provider <name>Uniquement les modèles d’un créateur de modèles, c’est-à-dire l’entreprise ou le laboratoire qui a conçu le modèle. Doit correspondre exactement à la valeur providerTousNon
--search <text>Uniquement les modèles dont l’identifiant ou le nom affiché contient ce texte, sans tenir compte des majuscules et des minusculesAucunNon
--include-schemaAjoute les réglages complets de chaque modèle (inputSchema). Rend l’affichage beaucoup plus volumineuxDésactivéeNon
--include-examplesAjoute des exemples d’entrées tout prêts, déjà validés par le serveur (examples)DésactivéeNon
spicyapi models list --modality video --task image-to-video --json

Ce qui s’affiche : total et items. Utilisez --json, car sans cette option tous les éléments s’affichent sur une seule ligne. Les champs les plus utiles de chaque élément :

ChampSignification
modelL’identifiant de modèle à utiliser dans les autres commandes
displayName, provider, modality, tasksLe nom, le créateur du modèle, le type de résultat produit et le type de travail
enabled, availableUtilisez les modèles pour lesquels les deux valent true
pricingUne entrée par niveau de prix : variant (par exemple une résolution), unit, price en USD, plus regularPrice et offerLabel quand une remise s’applique
taskTimeoutSecondsCombien de temps une génération peut durer avant de se terminer en expired
maxOutputDurationSecondsLa durée de vidéo maximale que ce modèle autorise, quand il en fixe une

Gratuit. La liste des modèles compte dans le débit de requêtes de votre compte : inutile de la lancer avant chaque génération.

models get

Ce qu’elle fait : affiche un modèle en détail, y compris les réglages qu’il accepte.

spicyapi models get <model>
ArgumentCe qu’il faitPar défautObligatoire
modelL’identifiant de modèle exact. Les barres obliques qu’il contient s’écrivent telles quelles—Oui
spicyapi models get MODEL_ID_FROM_CATALOG --json

Ce qui s’affiche : les mêmes champs que models list, plus inputSchema. Dans inputSchema, lisez required (les réglages à envoyer obligatoirement), properties (chaque réglage autorisé et son type), enum (les seules valeurs autorisées), minimum et maximum (les bornes des nombres) et default (la valeur utilisée si vous omettez le réglage). Les entrées nommées x-ui sont des indications pour construire des formulaires ; vous pouvez les ignorer. Gratuit.

balance

Ce qu’elle fait : indique combien d’argent est disponible sur votre compte.

spicyapi balance

Aucune option. Gratuit.

Ce qui s’affiche : available (ce que vous pouvez dépenser maintenant), held (mis de côté pour des tâches encore en cours) et total, le tout en dollars américains. L’affichage peut aussi inclure funding, qui répartit le solde entre fonds prépayés et dotations promotionnelles, avec la date d’expiration des dotations et les modèles qu’elles financent. Inutile de vérifier le solde avant chaque génération : tasks create le fait pour vous.

usage

Ce qu’elle fait : indique combien de générations la clé API actuelle a exécutées et ce qu’elles ont coûté, regroupées par jour et par modèle.

spicyapi usage [--from <date>] [--to <date>]
OptionCe qu’elle faitPar défautObligatoire
--from <date>Premier jour à inclure, au format YYYY-MM-DD en UTCLes sept derniers jours, aujourd’hui comprisNon
--to <date>Le jour qui suit le dernier jour à inclure, au format YYYY-MM-DD en UTC. La plage peut couvrir 92 jours au plusLes sept derniers jours, aujourd’hui comprisNon
spicyapi usage --from 2026-09-01 --to 2026-10-01

Cette commande couvre tout le mois de septembre : --to est le premier jour non inclus. Omettez les deux options pour voir les sept derniers jours, aujourd’hui compris.

Ce qui s’affiche : from, to, currency, totalCalls, totalSpend, puis days (par jour : calls, succeeded, failed, spend) et models (les mêmes chiffres par modèle). totalSpend ne compte que les montants définitivement facturés. days et models décrivent les mêmes tâches de deux façons : ne les additionnez donc pas. Pour votre compte entier plutôt que pour une seule clé, utilisez la page Consommation de la console.

Gratuit. La commande est limitée à 30 appels par minute : servez-vous-en pour vérifier des totaux, pas dans une boucle.

tasks quote

Ce qu’elle fait : vous dit exactement ce que coûterait une génération, sans la lancer et sans mettre d’argent de côté.

spicyapi tasks quote --model <model> --input-file <path>
OptionCe qu’elle faitPar défautObligatoire
--model <model>L’identifiant de modèle exact—Oui
--input-file <path>Lit l’entrée dans un fichier JSON. Utilisez - pour la lire depuis ce qui est redirigé vers la commande—Celle-ci ou --input-json
--input-json <json>Fournit l’entrée directement sous forme de texte JSON. Les guillemets sont plus simples à gérer avec --input-file—Celle-ci ou --input-file
--callback-url <url>L’adresse de callback que vous comptez utiliser, puisqu’elle fait partie de la requête dont le prix est calculéAucuneNon

Ce qui s’affiche : quoteId, model, estimatedCost, maxCharge, currency, quantity (par exemple le nombre de secondes facturées), unit et expiresAt. Un devis est valable cinq minutes.

Gratuit, sans confirmation. Servez-vous-en pour comparer des modèles ou des réglages. Vous n’êtes pas obligé de la lancer avant tasks create, qui obtient son propre devis.

tasks create

Ce qu’elle fait : lance une génération d’image ou de vidéo. Elle coûte de l’argent. La CLI affiche toujours le prix et demande d’abord votre accord.

spicyapi tasks create --model <model> --input-file <path> [options]
OptionCe qu’elle faitPar défautObligatoire
--model <model>L’identifiant de modèle exact—Oui
--input-file <path>Lit l’entrée dans un fichier JSON. - la lit depuis ce qui est redirigé vers la commande, ce qui exige aussi --yes—Celle-ci ou --input-json
--input-json <json>Fournit l’entrée directement sous forme de texte JSON—Celle-ci ou --input-file
--waitReste jusqu’à la fin de la tâche, puis affiche le résultatDésactivée : affiche l’identifiant de la tâche et rend la mainNon
--yesSaute la question de confirmation. À n’utiliser qu’une fois le prix connu, en général dans des scriptsDésactivée : la question est poséeNon
--idempotency-key <key>Un nom pour « cette génération-là ». Relancer la commande avec la même clé dans les 24 heures vous rend la même tâche au lieu d’en créer une nouvelle. Jusqu’à 128 caractèresUne nouvelle clé aléatoire à chaque exécutionNon
--retention <duration>Supprime plus tôt que d’habitude les médias générés, le résultat, le prompt et les autres textes d’entrée de cette tâche : 30m, 1h, 7d ou un nombre de secondes. Ne peut que raccourcir. 0 les supprime dès que la tâche se termine. Les enregistrements de facturation sont toujours conservésLe réglage de votre compteNon
--callback-url <url>Une adresse publique commençant par https:// que SpicyAPI appelle quand la tâche se termine. Les adresses en http:// simple, localhost et les adresses de réseau privé sont refusées. Utile uniquement si vous gérez un serveur ; voir WebhooksAucuneNon
--poll-interval-ms <milliseconds>Avec --wait : intervalle entre deux vérifications, en millisecondes, de 100 à 60000Commence à 2 secondes et ralentit jusqu’à 10 secondesNon
--wait-timeout-ms <milliseconds>Avec --wait : arrête d’attendre au bout de cette durée, de 1 à 86400000. La tâche continue de s’exécuter600000 (10 minutes)Non

Ce qui se passe, dans l’ordre :

  1. La CLI lit votre entrée et vérifie qu’il s’agit d’un objet JSON. Si vous n’avez fourni aucune entrée, elle s’arrête ici.
  2. Si personne ne peut répondre à une question, par exemple dans un script, et que vous n’avez pas passé --yes, elle s’arrête ici.
  3. Elle obtient un devis et affiche le montant estimé, le montant maximal, l’heure d’expiration du devis et la clé d’idempotence.
  4. Elle demande Continue? [y/N]. Seuls y ou yes permettent de continuer. La réponse par défaut est non.
  5. Elle crée la tâche au prix du devis. Le montant estimé est mis de côté sur votre solde, et ce montant est aussi le maximum que la tâche peut coûter.
  6. Sans --wait, elle affiche idempotencyKey, taskId, state (queued), estimatedCost et deadlineAt, puis rend la main. Avec --wait, elle affiche aussitôt Accepted: <task-id> et une commande de reprise, attend, puis affiche idempotencyKey, accepted et la task terminée.

deadlineAt est l’heure limite à laquelle la tâche peut se terminer avant de passer en expired. Ce n’est pas l’heure d’expiration de votre lien de téléchargement ni de vos fichiers.

spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait

Sur macOS et Linux, vous pouvez aussi fournir l’entrée directement dans la commande :

spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-json '{"prompt": "A paper lantern on a rainy street"}'

Si l’attente échoue, la tâche continue

Une attente peut se terminer prématurément à cause de la limite de temps, d’un problème réseau ou d’un Ctrl + C. La tâche elle-même continue et est facturée normalement. La ligne Accepted: affichée au début contient son identifiant ; poursuivez avec spicyapi tasks wait <task-id>. Ne relancez pas simplement la même commande de création sans --idempotency-key : cela lancerait, et facturerait, une seconde génération.

Quand l’attente échoue sur une erreur (et non sur un Ctrl + C), les dernières lignes répètent tout ce dont vous avez besoin : inutile de remonter chercher la ligne Accepted:.

Error: task job_01k3m8x9q2z4v7n5p6r8s0t1w3 did not reach a terminal state within 600000ms
Task job_01k3m8x9q2z4v7n5p6r8s0t1w3 was accepted and may still be running; only the wait stopped.
Recover: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3
To replay the same request without creating a second task, reuse --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241.

Si l’erreur fait partie de celles qui ont une solution connue, comme un 429 ou une erreur serveur, une ligne Next: suit. Avec --json, les mêmes informations se trouvent dans l’objet d’erreur, sous taskId, idempotencyKey et recover.

tasks wait

Ce qu’elle fait : attend qu’une tâche déjà lancée se termine.

spicyapi tasks wait <task-id> [options]
Argument ou optionCe qu’il faitPar défautObligatoire
task-idL’identifiant de la tâche, comme job_01k3m8x9q2z4v7n5p6r8s0t1w3—Oui
--poll-interval-ms <milliseconds>Intervalle entre deux vérifications, en millisecondes, de 100 à 60000Commence à 2 secondes et ralentit jusqu’à 10 secondesNon
--wait-timeout-ms <milliseconds>Arrête d’attendre au bout de cette durée, de 1 à 86400000600000 (10 minutes)Non
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000

Ce qui s’affiche : la tâche terminée, avec les mêmes champs que tasks get, une fois que son état est succeeded, failed ou expired. Si la tâche a réussi mais que ses fichiers sont encore en cours de copie, la commande attend encore un peu.

Si la limite de temps est atteinte, vous voyez Error: task … did not reach a terminal state within 600000ms. Ce n’est pas un échec : la tâche est toujours en cours. Attendez de nouveau, avec un --wait-timeout-ms plus long si nécessaire. Arrêter une attente n’annule jamais une tâche. Gratuit.

tasks get

Ce qu’elle fait : montre une tâche à l’instant présent : son état, son coût, ses liens de résultat et la date à laquelle son contenu sera supprimé.

spicyapi tasks get <task-id>
ArgumentCe qu’il faitPar défautObligatoire
task-idL’identifiant de la tâche—Oui

Utilisez la même clé API que celle qui a créé la tâche : une autre clé obtient « not found ».

Champs affichés :

ChampSignification
statequeued (en attente de démarrage), running, succeeded, failed ou expired (temps écoulé). Les tâches plus anciennes peuvent aussi afficher canceled
output.assetsLes résultats. Chacun a une url (un lien de téléchargement valable environ 20 minutes), expiresAt (le moment où ce lien cesse de fonctionner), mime (le type de fichier), des informations de taille et une key. pending: true signifie que le fichier est encore en cours de copie : réessayez dans quelques secondes. unavailable: true signifie qu’il ne peut pas être récupéré
errorCode, errorMessagePourquoi la tâche a échoué. Voir Erreurs
cost, settledLe montant facturé en USD. Il est définitif une fois que settled vaut true
inputLes réglages que vous avez envoyés. Supprimés quand la durée de conservation de votre prompt arrive à son terme
createdAt, completedAt, deadlineAtQuand elle a été créée, quand elle s’est terminée, et l’heure limite à laquelle elle pouvait se terminer
contentStatepresent (contenu toujours stocké), expired (supprimé par les règles de conservation) ou purged (vous l’avez détruit)
retentionoutputsExpireAt (quand les fichiers de résultat sont supprimés), promptsExpireAt (quand le texte de votre prompt est effacé) et source (le réglage qui en a décidé)
sourceTaskIdPrésent quand cette tâche est la relance d’une autre tâche

L’affichage normal se termine par un résumé en langage courant, comme Outputs expire: … ou Content: Destroyed — you removed the outputs …. Chaque appel renvoie des liens de téléchargement neufs. Gratuit.

tasks list

Ce qu’elle fait : liste les tâches créées avec la clé API actuelle, une page à la fois.

spicyapi tasks list [options]
OptionCe qu’elle faitPar défautObligatoire
--from <date>Premier jour à inclure, YYYY-MM-DD en UTCUne fenêtre de sept jours qui se termine aujourd’huiNon
--to <date>Le jour qui suit le dernier jour à inclure, YYYY-MM-DD en UTC. La plage peut couvrir 92 jours au plusVoir ci-dessusNon
--state <state>Uniquement les tâches dans un état donné : queued, running, succeeded, failed, canceled ou expiredTousNon
--model <model>Uniquement les tâches d’un identifiant de modèle exactTousNon
--limit <count>Nombre de tâches par page, de 1 à 10020Non
--cursor <cursor>Reprend à la suite de la page précédente, à l’aide de sa valeur nextCursorPremière pageNon
spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --state failed

Ce qui s’affiche : items (chacun avec taskId, model, state, cost, settled, createdAt, deadlineAt et completedAt), hasMore et nextCursor. Si hasMore vaut true, relancez la même commande avec les mêmes --from et --to, en ajoutant --cursor suivi de la valeur nextCursor. La liste ne contient aucun lien de téléchargement ; utilisez tasks get pour la tâche qui vous intéresse. Gratuit.

tasks retry

Ce qu’elle fait : relance une tâche failed ou expired, sous la forme d’une nouvelle tâche avec un nouvel identifiant. Elle coûte de l’argent.

spicyapi tasks retry <task-id> [options]
Argument ou optionCe qu’il faitPar défautObligatoire
task-idLa tâche échouée ou expirée à relancer—Oui
--waitReste jusqu’à la fin de la nouvelle tâcheDésactivéeNon
--yesSaute la question de confirmationDésactivée : la question est poséeNon
--idempotency-key <key>Relancer la relance avec la même clé vous rend la même nouvelle tâche au lieu d’en créer une autreUne nouvelle clé aléatoire à chaque exécutionNon
--poll-interval-ms <milliseconds>Avec --wait : la fréquence des vérificationsCommence à 2 secondes et ralentit jusqu’à 10 secondesNon
--wait-timeout-ms <milliseconds>Avec --wait : arrête d’attendre au bout de cette durée600000 (10 minutes)Non

La commande demande Retry source task … Continue? [y/N]. Contrairement à tasks create, elle n’affiche aucun prix avant de poser la question. La nouvelle tâche est facturée au prix actuel du modèle : si le prix compte pour vous, vérifiez-le d’abord avec spicyapi models get <model>.

Ce qui s’affiche : idempotencyKey, le nouveau taskId, sourceTaskId (la tâche d’origine), state, estimatedCost (le montant mis de côté) et deadlineAt.

  • Seules les tâches failed et expired peuvent être relancées, ainsi que les anciennes tâches canceled. Pour obtenir une autre version d’un résultat réussi, utilisez tasks create.
  • L’entrée d’origine est réutilisée telle quelle : une relance n’aide donc que si l’échec était temporaire. Vérifiez d’abord errorCode ; voir Relancer une tâche échouée et Erreurs.
  • Si l’entrée pointait vers un fichier téléversé qui a expiré depuis, la relance échoue ; téléversez de nouveau le fichier et utilisez tasks create.
  • La relance conserve le réglage de conservation de la tâche d’origine.
  • Si tasks create a perdu la connexion avant que vous voyiez un identifiant de tâche, il ne s’agit pas d’une tâche échouée. Suivez plutôt les étapes de Reprendre une tâche après une attente interrompue.

tasks purge

Ce qu’elle fait : supprime définitivement les médias générés, le résultat (les données de résultat stockées), le prompt et les autres textes d’entrée d’une tâche terminée, immédiatement, au lieu d’attendre qu’ils expirent.

spicyapi tasks purge <task-id> [--yes]
Argument ou optionCe qu’il faitPar défautObligatoire
task-idUne tâche terminée : succeeded, failed, expired ou canceled—Oui
--yesSaute la question de confirmationDésactivée : la question est poséeNon

Le contenu d’une tâche encore queued ou running ne peut pas être détruit. Une telle tâche ne peut pas non plus être annulée, car il n’existe ni commande ni API d’annulation : attendez qu’elle se termine avec spicyapi tasks wait <task-id>, puis détruisez son contenu.

La commande explique ce qui va être supprimé et vous demande de confirmer, car l’opération est irréversible. Téléchargez d’abord tout ce que vous voulez garder.

Ce qui s’affiche : taskId, contentState (purged), purgedAt, contentRemovedBy (user), billingRetained (toujours true) et mediaDeletionPending, puis une ligne qui nomme ce qui a été détruit et indique que les médias stockés sont supprimés en une minute environ. Si contentState vaut encore present, rien n’a été supprimé cette fois-ci ; réessayez plus tard.

Gratuit, et ce n’est pas un remboursement : l’écriture comptable, le montant facturé, le modèle, l’état, les horodatages et l’identifiant de requête restent enregistrés. Voir Conservation et destruction.

files upload

Ce qu’elle fait : téléverse un fichier depuis votre ordinateur, comme l’image de départ d’une génération image-vers-vidéo, et vous donne une adresse spicy:// à placer dans votre entrée.

spicyapi files upload <path> [--content-type <type>]
Argument ou optionCe qu’il faitPar défautObligatoire
pathLe fichier à téléverser—Oui
--content-type <type>Le type du fichier, quand il ne peut pas être déduit de son nom : image/jpeg, image/png, image/webp, image/gif, video/mp4, video/webm, audio/mpeg ou audio/wavDéduit de l’extensionNon

Les fichiers acceptés sont les images .jpg, .jpeg, .png, .webp et .gif jusqu’à 10 MiB, les vidéos .mp4 et .webm et les fichiers audio .mp3 et .wav jusqu’à 90 MiB et 600 secondes. Un modèle peut fixer ses propres limites, plus basses.

spicyapi files upload ./start-frame.jpg
fileId: fil_01k3m8x9q2z4v7n5p6r8s0t1w3
status: ready
bytes: 402118
contentType: image/jpeg
sha256: a91f4c2e5b7d16809e3f2a4c8d0b61e7c4a890e5d2f71b3c609ae8427d15f0c6
uri: spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3
expiresAt: 2026-09-18T09:12:11Z
width: 1280
height: 720

Ce qui s’affiche : copiez la valeur uri exactement telle qu’elle est affichée dans le réglage de fichier du modèle, souvent image_url. Elle est utilisable jusqu’à expiresAt, normalement pendant un jour. Passé ce délai, téléversez de nouveau le fichier. Le téléversement est gratuit.

files download-url

Ce qu’elle fait : crée un nouveau lien de téléchargement pour le résultat d’une tâche terminée. Elle affiche le lien ; elle n’enregistre pas le fichier.

spicyapi files download-url <task-id> [--key <key>]
Argument ou optionCe qu’il faitPar défautObligatoire
task-idUne tâche qui a réussi—Oui
--key <key>Le résultat visé, quand une tâche en a produit plusieurs. Utilisez la valeur key de output.assets dans tasks getLe premier résultatNon

Ce qui s’affiche : key, url et expiresAt. Le lien fonctionne pendant environ 20 minutes ; ouvrez-le dans un navigateur ou téléchargez-le avec curl. Une tâche qui n’a pas encore réussi répond « not found ». Si le fichier est encore en cours de copie, vous obtenez une erreur de conflit ; attendez quelques secondes et réessayez. Une fois les fichiers de la tâche supprimés, plus aucun lien ne peut être créé. Gratuit.

webhooks verify

Ce qu’elle fait : si vous gérez un serveur qui reçoit les callbacks de SpicyAPI (voir --callback-url), elle vérifie qu’un callback enregistré est authentique et n’a pas été modifié. Elle s’exécute entièrement sur votre ordinateur et ne demande aucune clé API.

spicyapi webhooks verify --body-file <path> --timestamp <seconds> --signature <base64> --payload-version <version>
OptionCe qu’elle faitPar défautObligatoire
--body-file <path>Un fichier contenant le corps du callback exactement tel qu’il a été reçu, octet pour octet—Oui
--timestamp <seconds>La valeur de l’en-tête X-Webhook-Timestamp—Oui
--signature <base64>La valeur de l’en-tête X-Webhook-Signature—Oui
--payload-version <version>La valeur de l’en-tête X-Webhook-Payload-Version : 1 ou 2—Oui
--secret-env <name>Le nom de la variable d’environnement qui contient votre clé de signature des webhooks. La clé elle-même n’est jamais tapée dans la ligne de commandeSPICY_WEBHOOK_SECRETNon
--tolerance-seconds <seconds>L’écart autorisé entre l’horodatage et l’horloge de votre ordinateur300Non

Ce qui s’affiche : en cas de succès, payload (le contenu du callback), payloadVersion, taskId, deliveryId (version 2) et timestamp. Si quoi que ce soit ne correspond pas, la commande affiche une erreur et se termine avec un code différent de zéro. Gratuit.

Une clé de signature est créée automatiquement à l’inscription, mais sa valeur n’est jamais affichée. Pour en obtenir une que vous pouvez copier, ouvrez Webhooks dans la console et cliquez sur Générer (ou sur Renouveler si une clé est déjà configurée). La nouvelle clé n’est affichée qu’une seule fois. Le renouvellement prend effet immédiatement, sans période de chevauchement : l’ancienne clé cesse aussitôt de signer. Voir Webhooks.

Recettes courantes

Générer une image

spicyapi models list --modality image --json
spicyapi models get MODEL_ID_FROM_CATALOG --json
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait

Choisissez un identifiant avec la première commande, construisez input.json à partir des réglages affichés par la deuxième, puis lancez la troisième et confirmez avec y. Le parcours Votre premier résultat explique chaque étape.

Transformer une image en vidéo

Trouver un modèle image-vers-vidéo et ses réglages

spicyapi models list --modality video --task image-to-video --json
spicyapi models get MODEL_ID_FROM_CATALOG --json

Dans inputSchema, repérez le réglage de l’image de départ (généralement image_url), le réglage de durée (généralement duration_seconds) et tout ce qui figure dans required.

Téléverser votre image

spicyapi files upload ./start-frame.jpg

Copiez la valeur uri, qui commence par spicy://.

Écrire l’entrée

Créez input.json comme dans Votre premier résultat, avec les noms de réglages du modèle et votre propre uri :

{
  "prompt": "Slow push-in, rain running down the window",
  "image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
  "duration_seconds": 5
}

Vérifier le prix, puis générer

spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.json
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait --wait-timeout-ms 1800000

Les vidéos sont généralement facturées à la seconde : la durée que vous choisissez modifie donc le prix. Une vidéo peut prendre plusieurs minutes, c’est pourquoi cet exemple attend jusqu’à 30 minutes au lieu des 10 par défaut. Téléchargez le .mp4 depuis l’url comme dans Votre premier résultat.

L’image téléversée est utilisable pendant un jour. Passé ce délai, téléversez-la de nouveau.

Reprendre une tâche après une attente interrompue

Une tâche continue de s’exécuter même si le terminal se ferme, si le réseau coupe, si votre ordinateur se met en veille ou si l’attente arrive à son terme. La façon de la retrouver dépend de ce que vous avez vu :

  • Vous avez vu Accepted: job_…, ou une ligne Recover: sous l’erreur. Vous avez l’identifiant de la tâche. Attendez de nouveau, ou consultez-la simplement :

    spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000
    spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3
  • Vous n’avez vu que la ligne Idempotency-Key:, par exemple parce que la connexion a coupé pendant la création de la tâche. Relancez la même commande, avec le même modèle et la même entrée, et ajoutez cette clé :

    spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241 --wait

    La CLI affiche le prix et redemande votre accord, mais si la première tentative a été acceptée, SpicyAPI vous rend cette même tâche au lieu d’en lancer et d’en facturer une seconde. Cela fonctionne pendant 24 heures avec la même clé API. Si la première tentative n’est jamais arrivée, la tâche est créée maintenant, une seule fois.

  • Vous n’avez ni l’un ni l’autre. Listez vos tâches récentes et retrouvez la bonne d’après l’heure et le modèle :

    spicyapi --json tasks list --limit 10

Relancer une tâche échouée

Commencez par savoir pourquoi elle a échoué :

spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3

Lisez ensuite errorCode. Les tâches échouées ou expirées libèrent normalement toute la réservation. Certains refus de contenu sont facturés au devis accepté, uniquement si la page du modèle indique explicitement cette exception. Consultez settled et cost pour connaître le montant final. tasks retry renvoie la même entrée : elle n’aide donc que si la cause était temporaire.

errorCodeQue faire
rate_limited, upstream_unavailable, timeout, upstream_failedAttendez un peu, puis relancez une fois. Si la tâche échoue de nouveau, arrêtez les relances : pour timeout, essayez une durée plus courte ou une résolution plus basse avec tasks create
generation_failedNe relancez pas. Modifiez le prompt ou l’image, puis utilisez tasks create : la même entrée échoue généralement de la même façon
invalid_assetNe relancez pas, car une relance réutilise l’ancien fichier. Téléversez de nouveau le fichier, puis utilisez tasks create avec la nouvelle uri
invalid_request, unsupported_combinationNe relancez pas sans modification. Changez les réglages, puis utilisez tasks create
content_rejectedNe relancez pas sans modification. Le modèle a refusé cette requête : changez le prompt ou choisissez un autre modèle, puis utilisez tasks create

La liste complète se trouve dans Erreurs.

Quand une relance a du sens, lancez-la. Elle crée, et facture, une nouvelle tâche :

spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait

Exporter votre consommation

Enregistrez dans un fichier un mois de consommation de la clé actuelle :

spicyapi --json usage --from 2026-09-01 --to 2026-10-01 > usage-2026-09.json

Le fichier contient les totaux par jour et par modèle. Pour une liste tâche par tâche, enregistrez de la même façon spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --limit 100, en suivant nextCursor tant que hasMore vaut true. Les chiffres à l’échelle du compte et les factures se trouvent dans la console.

Lancer la CLI depuis un script

Dans un script, personne ne peut répondre à Continue? [y/N] : les commandes payantes refusent donc de s’exécuter sans --yes. Si vous l’ajoutez :

  • demandez d’abord un devis et vérifiez le prix dans le script ;
  • donnez à chaque génération sa propre --idempotency-key fixe, comme poster-2026-09-17-v1, pour qu’exécuter le script deux fois ne facture pas deux fois ;
  • ajoutez --json et lisez state dans le résultat : une commande qui se termine avec le code 0 n’a pas forcément produit une tâche réussie ;
  • fixez des plafonds de dépense sur la clé dans la console.
spicyapi --json tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key poster-2026-09-17-v1 --yes --wait > result.json

Coûts, confirmation et sécurité

Quelles commandes coûtent de l’argent. Uniquement tasks create et tasks retry. Les prix sont en dollars américains. Demander un devis, lister, consulter, téléverser, télécharger et supprimer sont des opérations gratuites.

Voir le prix d’abord. tasks quote calcule le prix d’une requête sans rien lancer. tasks create obtient son propre devis et affiche Estimated charge et maximum charge avant de poser la question. Quand la tâche est acceptée, le montant estimé est mis de côté (held) et c’est aussi le maximum qui peut vous être facturé. Quand la tâche réussit, vous payez ce qui a réellement été produit, jamais plus que ce montant, et le reliquat revient sur votre solde.

La confirmation. Continue? [y/N] signifie que la réponse est non tant que vous ne tapez pas y. --yes répond à votre place : ne l’utilisez donc qu’une fois le prix connu. Si la CLI s’exécute dans un contexte où elle ne peut pas poser la question, comme un script ou une entrée redirigée, et qu’il n’y a pas de --yes, elle refuse au lieu de supposer un oui. tasks purge demande confirmation de la même façon, car une suppression est irréversible. tasks retry la demande aussi, mais sans afficher de prix au préalable.

La clé d’idempotence, en termes simples. C’est une étiquette pour une génération, comme un numéro de commande. Chaque tasks create et chaque tasks retry en affiche une. Si votre connexion internet coupe et que vous ne savez pas si la génération a démarré, relancez la même commande avec --idempotency-key et la valeur affichée : vous récupérez la tâche d’origine et vous n’êtes pas facturé deux fois. L’étiquette fonctionne pendant 24 heures avec la même clé API. Ne la réutilisez pas pour une autre génération : la même clé avec une entrée différente est refusée.

Pas d’annulation. Une fois acceptée, une tâche ne peut pas être annulée. Ctrl + C, la fermeture du terminal ou la révocation de la clé n’arrêtent que l’attente ; la tâche se termine et est facturée normalement.

Les tâches échouées ou expirées libèrent normalement toute la réservation. Certains refus de contenu sont facturés au devis accepté, uniquement si la page du modèle indique explicitement cette exception. Consultez settled et cost pour connaître le montant final.

Téléchargez ce que vous voulez garder. Les fichiers de résultat sont conservés environ 14 jours au plus, ou moins si votre compte ou --retention le prévoit, puis supprimés définitivement. Les liens de téléchargement durent environ 20 minutes, mais vous pouvez toujours en demander un nouveau tant que le fichier existe. Les fichiers téléversés sont utilisables pendant un jour. Le texte des prompts est effacé au bout de 30 jours par défaut. Les enregistrements de facturation sont conservés. Voir Conservation et destruction.

Plafonds de dépense. Chaque clé peut avoir un plafond quotidien, mensuel et cumulé, à régler sur la page Clés API. Les nouvelles clés n’ont aucun plafond tant que vous n’en réglez pas un. Une tâche qui dépasserait un plafond est refusée avant de démarrer.

Votre clé. La CLI lit la clé uniquement dans SPICY_API_KEY, ne l’affiche jamais et, dans les indications d’erreur, n’en montre au plus que les neuf premiers caractères (sk-spicy-).

Pour aller plus loin : Facturation, Idempotence, Engagement et relance.

Dépannage

Cherchez le message que vous voyez. Les erreurs renvoyées par SpicyAPI se terminent par (request req_…) ; indiquez cette valeur si vous contactez l’assistance, mais n’envoyez jamais votre clé.

Tous les codes d’erreur sont expliqués dans Erreurs, et les étapes de reprise dans Dépannage et reprise.

Le code source

Le paquet est sous licence MIT et développé au grand jour sur github.com/spicyapi-ai/spicy-cli. C’est là qu’on lit le code derrière chaque commande de cette page, qu’on signale un comportement qui s’écarte de ce qui est décrit ici et qu’on propose une modification.

Étapes suivantes

Sur cette page