Strumento a riga di comando (CLI)
Usa il comando spicyapi per sfogliare i modelli, controllare i prezzi, generare immagini e video e scaricare i risultati da un terminale, senza scrivere codice.
Che cos’è la CLI
spicyapi è un piccolo programma che esegui in un terminale, la finestra in cui scrivi comandi invece di fare clic sui pulsanti. Ogni comando svolge un solo compito: elencare i modelli che il tuo account può usare, dirti quanto costerà una generazione, avviare la generazione di un’immagine o di un video, attendere che finisca e darti un link per scaricare il risultato.
Non scrivi alcun codice. Digiti un comando, premi Invio e leggi la risposta.
È la scelta giusta quando vuoi:
- provare i modelli e confrontarne i prezzi prima che qualcuno scriva un’integrazione;
- generare immagini o video dal tuo computer e salvare i file;
- ripetere lo stesso tipo di generazione senza dover cliccare ogni volta attraverso una pagina;
- controllare le impostazioni esatte di un modello prima di costruirci sopra qualcosa.
La CLI copre la generazione di immagini e video. I modelli di testo e di chat si chiamano tramite gli endpoint compatibili con la chat descritti in Testo e streaming.
Esistono altri tre strumenti ufficiali. Scegli la CLI se vuoi digitare i comandi tu stesso:
| Strumento | Sceglilo quando |
|---|---|
| SDK | Stai scrivendo un programma JavaScript o TypeScript che chiama SpicyAPI |
| Server MCP | Vuoi che un assistente di programmazione IA esegua questi stessi passaggi al posto tuo |
| Agent Skill | Vuoi insegnare a un agente IA il modo sicuro di usare SpicyAPI |
Scrivi in un altro linguaggio? Ci sono SDK ufficiali anche per Python, Go, PHP e Java.
Niente in questa pagina spende denaro per sbaglio
Solo due comandi possono costare denaro: tasks create e tasks retry. Entrambi si fermano e ti chiedono conferma prima che venga addebitato qualsiasi importo. Tutti gli altri sono gratuiti e puoi eseguirli tutte le volte che vuoi.
Che cosa puoi fare
| Voglio… | Comando | Costa denaro? | Serve una chiave API? |
|---|---|---|---|
| Verificare che SpicyAPI sia raggiungibile | spicyapi status | No | No |
| Cercare in questa documentazione | spicyapi docs search <words> | No | No |
| Vedere quali modelli posso usare e i loro prezzi | spicyapi models list | No | Sì |
| Vedere quali impostazioni accetta un modello | spicyapi models get <model> | No | Sì |
| Controllare il mio saldo | spicyapi balance | No | Sì |
| Vedere quanto ha speso una chiave | spicyapi usage | No | Sì |
| Conoscere il prezzo esatto di una generazione senza avviarla | spicyapi tasks quote | No | Sì |
| Avviare la generazione di un’immagine o di un video | spicyapi tasks create | Sì, dopo averti chiesto conferma | Sì |
| Attendere che una generazione finisca | spicyapi tasks wait <task-id> | No | Sì |
| Consultare una generazione e i link ai suoi risultati | spicyapi tasks get <task-id> | No | Sì |
| Elencare le mie generazioni recenti | spicyapi tasks list | No | Sì |
| Ripetere una generazione fallita | spicyapi tasks retry <task-id> | Sì, dopo averti chiesto conferma | Sì |
| Eliminare per sempre i file e il prompt di una generazione | spicyapi tasks purge <task-id> | No, e non viene rimborsato nulla | Sì |
| Caricare un’immagine, un video o un file audio da usare come input | spicyapi files upload <path> | No | Sì |
| Ottenere un nuovo link di download per un risultato | spicyapi files download-url <task-id> | No | Sì |
| Verificare che una callback arrivi davvero da SpicyAPI | spicyapi webhooks verify | No | No, usa la tua chiave di firma dei webhook |
Nei comandi qui sopra, una parola tra parentesi angolari come <task-id> significa «metti qui il tuo valore», senza le parentesi.
Prima di iniziare
Ti servono quattro cose: un terminale, Node.js, una chiave API e un modo per eseguire la CLI. La prima volta richiede una decina di minuti.
Apri un terminale
Un terminale è una finestra di testo in cui si eseguono comandi. Tutto ciò che trovi in questa pagina va digitato o incollato lì, poi eseguito con Invio.
Premi Cmd + Spazio, digita Terminal e premi Invio. Si apre una finestra con una riga che termina con % o $: è lì che scrivi. Per incollare usa Cmd + V.
Installa Node.js 22.13 o successivo
La CLI funziona con Node.js, un programma gratuito. Controlla se ce l’hai già:
node -vSe stampa v22.13.0 o un numero più alto, come v22.14.0 o v24.4.1, sei pronto. Se stampa un numero più basso, oppure risponde command not found o is not recognized:
- Vai su nodejs.org, apri la pagina di download e scegli la versione LTS per il tuo sistema.
- Avvia l’installer e accetta le opzioni predefinite.
- Chiudi il terminale e aprine uno nuovo, poi esegui di nuovo
node -v.
Node.js include npm e npx, i due strumenti usati nell’ultimo passaggio.
Crea una chiave API
La chiave API è il modo in cui SpicyAPI sa che la richiesta arriva dal tuo account.
- Crea un account su spicyapi.ai/register. Gli account possono essere aperti a scaglioni; se la registrazione per te non è ancora aperta, iscriviti alla lista d’attesa.
- Aggiungi fondi in Fatturazione nella console. Le generazioni vengono pagate con il tuo saldo, in dollari statunitensi.
- Apri Chiavi API e fai clic su Crea chiave. Dalle un nome che riconoscerai in seguito, come
my laptop. Serve solo il nome. - Copia subito la chiave. Inizia con
sk-spicy-e viene mostrata una sola volta. Puoi anche usare Salva come file.
Le chiavi nuove non hanno alcun limite di spesa finché non ne imposti uno. Un limite giornaliero evita che un errore o una chiave trapelata generino una fattura salata, e puoi modificarlo in seguito nella stessa pagina.
Tratta la chiave come una password
Chiunque abbia la tua chiave può spendere il tuo saldo. Non inviarla in chat o via email, non mostrarla in uno screenshot o in una richiesta di assistenza e non salvarla mai in una cartella di progetto che finisce in Git o su GitHub. Se trapela, revocala nella pagina Chiavi API e creane una nuova.
Salva la chiave in SPICY_API_KEY
La CLI non ha un comando di login e non accetta mai la chiave come opzione di un comando. La legge da una variabile d’ambiente chiamata SPICY_API_KEY: un valore con un nome che il terminale passa ai programmi che avvia.
Solo per la finestra attuale (viene dimenticata quando chiudi la finestra):
export SPICY_API_KEY="sk-spicy-paste-your-key-here"In modo permanente, aggiungi la stessa riga export in fondo al file di avvio della tua shell, che viene eseguito ogni volta che apri un terminale. Su macOS il file è ~/.zshrc; sulla maggior parte dei sistemi Linux è ~/.bashrc.
nano ~/.zshrcIncolla la riga export in fondo al file, premi Ctrl + O e poi Invio per salvare, e Ctrl + X per uscire. Su Linux usa invece nano ~/.bashrc. Apri una nuova finestra del terminale perché la modifica abbia effetto.
Verifica che sia impostata, senza stampare l’intera chiave:
echo "${SPICY_API_KEY:0:9}"Dovrebbe stampare sk-spicy-.
Dove la chiave può stare e dove no
Il file di avvio della shell e le impostazioni del tuo account Windows restano su questo computer, e per un uso personale va bene. Non mettere mai la chiave in un file dentro un progetto, non includerla mai in un commit e non incollarla mai in un documento condiviso. I terminali ricordano anche i comandi che digiti, quindi su un computer condiviso preferisci il file di avvio o la finestra delle impostazioni di Windows invece di scrivere la chiave dentro un comando.
Scegli come eseguire la CLI
Ci sono due modi, e i comandi sono gli stessi.
npx scarica la CLI quando serve e la esegue:
npx @spicyapi/cli statusLa prima volta npm chiede Need to install the following packages: @spicyapi/cli@… Ok to proceed? (y). Premi y e poi Invio.
Con questo metodo, scrivi npx @spicyapi/cli ovunque questa pagina scriva spicyapi. Per esempio, spicyapi models list diventa npx @spicyapi/cli models list.
Il tuo primo risultato
Questo percorso guidato genera un’immagine e la scarica. Ogni passaggio mostra il comando, più o meno che cosa vedrai e che cosa è appena successo. I tuoi numeri, ID e orari saranno diversi.
Sostituisci MODEL_ID_FROM_CATALOG con un ID del modello reale
MODEL_ID_FROM_CATALOG è un segnaposto, non un modello. Il passaggio 3 mostra come scegliere un ID reale dal catalogo in tempo reale (live catalog): spicyapi models list, lo stesso elenco di GET /api/v1/models. Incolla il tuo ID ovunque questa pagina mostri il segnaposto. Se invii il segnaposto così com’è, ottieni solo un errore «not found».
Controlla la connessione
spicyapi statusSpicyAPI is reachable — api.spicyapi.ai answered in 523 ms.Che cosa è successo: la CLI ha chiesto a SpicyAPI se è in funzione. Non serve la chiave e non costa nulla. Se leggi «could not be reached», controlla la connessione a internet o il proxy; vedi Risoluzione dei problemi.
Controlla il saldo
spicyapi balanceavailable: 12.34
held: 0.06
total: 12.40Che cosa è successo: è il primo comando che usa la tua chiave. Gli importi sono in dollari statunitensi. available è quanto puoi spendere adesso, held è l’importo accantonato per le generazioni ancora in corso e total è la somma dei due. Potresti vedere anche una riga funding che suddivide il saldo tra fondi prepagati e bonus promozionali.
Se leggi Error: SPICY_API_KEY is required for authenticated API operations, la chiave non è impostata in questa finestra del terminale. La riga Next: subito sotto spiega come impostarla; vedi anche Prima di iniziare.
Scegli un modello
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" }
]
}
]
}Questo esempio è accorciato: l’elenco reale contiene più modelli e più campi.
Che cosa è successo: la CLI ha recuperato i modelli che il tuo account può chiamare oggi, con i tuoi prezzi. Scegline uno in cui enabled e available valgano entrambi true e copia il suo valore model, per esempio selezionandolo con il mouse. Quel valore è l’ID del modello. Gli ID hanno la forma maker/model/task.
priceè in dollari statunitensi perunit:per_image,per_seconddi video,per_requestoppureper_1k_tokens.- Più voci in
pricingsignificano che il prezzo dipende dalle tue impostazioni, per esempio dalla risoluzione. - Per trovare un modello per nome, aggiungi
--searche una parte del nome.
--json stampa l’elenco come JSON leggibile e indentato. Senza, l’intero elenco viene schiacciato su un’unica lunga riga.
Guarda quali impostazioni accetta quel modello
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
}
}Che cosa è successo: inputSchema è l’elenco delle impostazioni del modello, che nel resto di questa pagina chiamiamo input.
requiredelenca le impostazioni che devi inviare. Qui soloprompt.propertieselenca tutte le impostazioni che il modello accetta, e nient’altro è ammesso: basta un nome sconosciuto o scritto male perché l’intera richiesta venga rifiutata.enumelenca gli unici valori ammessi per quell’impostazione.
Ogni modello ha le proprie impostazioni, quindi leggile sempre per il modello che hai scelto. Per avere input già pronti e già verificati dal server, esegui spicyapi models list --search <name> --include-examples --json e guarda examples.
Scrivi l’input in un file
Metti l’input in un file chiamato input.json, nella cartella in cui si trova il terminale. Un file evita i problemi con le virgolette, soprattutto su Windows.
Incolla tutte e tre le righe in una volta:
cat > input.json <<'EOF'
{"prompt": "A paper lantern glowing on a rainy street at night, cinematic light"}
EOFChe cosa è successo: hai descritto che cosa generare, usando i nomi delle impostazioni visti nel passaggio precedente. Le virgolette devono essere quelle dritte ("), non quelle tipografiche.
Controlla il prezzo
spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.jsonquoteId: eyJ2IjoxLCJtIjoi…
model: MODEL_ID_FROM_CATALOG
estimatedCost: 0.03
maxCharge: 0.03
currency: USD
quantity: 1
unit: per_image
expiresAt: 2026-09-17T08:05:00ZChe cosa è successo: SpicyAPI ha calcolato il prezzo di questa richiesta esatta. Non è stato avviato nulla e non è stato addebitato nulla. estimatedCost è il costo previsto e maxCharge è il massimo che può costare. Questo passaggio è facoltativo: il comando successivo richiede di nuovo il prezzo e te lo mostra prima di spendere qualsiasi cosa.
Avvia la generazione e attendila
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitPer prima cosa la CLI mostra il prezzo e ti chiede di confermare:
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]Digita y e premi Invio. Qualsiasi altra risposta annulla, e non viene addebitato nulla. Rispondi entro cinque minuti, prima che il preventivo scada.
Non appena SpicyAPI accetta il lavoro, la CLI stampa il suo ID attività:
Accepted: job_01k3m8x9q2z4v7n5p6r8s0t1w3
If waiting is interrupted: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Di solito le immagini richiedono qualche secondo e i video qualche minuto. Quando la generazione finisce, compare il risultato:
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,…}Che cosa è successo: dopo il tuo y, SpicyAPI ha accettato la generazione, che da quel momento si chiama attività, e ha accantonato dal tuo saldo l’importo stimato. La CLI ha poi controllato l’attività ogni pochi secondi finché non è finita. Nell’ultima riga cerca "state":"succeeded" e l’"url" dentro output. cost è l’addebito definitivo quando settled vale true. Se preferisci vedere il risultato distribuito su più righe leggibili, aggiungi --json al comando.
Chiudere la finestra non annulla l’attività
Una volta accettata, un’attività arriva sempre fino in fondo e viene addebitata normalmente. Premere Ctrl + C o chiudere il terminale interrompe soltanto l’attesa. Conserva l’ID attività e riprendila con spicyapi tasks wait <task-id>; vedi Riprendere un’attività dopo un’attesa interrotta.
Scarica il risultato
L’url è un link di download diretto che funziona per circa 20 minuti e non richiede la chiave. Incollalo in un browser e salva il file, oppure scaricalo dal terminale (lascia le virgolette, perché il link contiene caratteri &):
curl -L -o result.png "PASTE_THE_URL_HERE"Usa l’estensione che corrisponde a mime: .png per image/png, .jpg per image/jpeg, .mp4 per video/mp4.
Se il link è scaduto, ottienine uno nuovo con spicyapi files download-url <task-id>, oppure esegui spicyapi tasks get <task-id>, che restituisce link nuovi.
Che cosa è successo: hai copiato il risultato sul tuo computer. Fallo presto: SpicyAPI conserva i file generati al massimo per circa 14 giorni (meno, se il tuo account ha un’impostazione più breve), poi li elimina per sempre. Vedi Conservazione e distruzione.
Come leggere l’output
- L’output normale mostra una coppia
name: valueper riga. I valori composti da più parti, comeoutputoretention, vengono stampati come JSON su un’unica riga. --jsonstampa la risposta completa come JSON indentato. Funziona con ogni comando, prima o dopo il nome del comando:spicyapi --json balanceespicyapi balance --jsonsono equivalenti.- I risultati vanno sull’output normale dello schermo; i messaggi vanno sull’output degli errori. I prezzi, la chiave di idempotenza, le righe
Accepted:e gli errori sono messaggi. Quindispicyapi --json tasks get <task-id> > task.jsonsalva intask.jsonsolo il risultato, mentre i messaggi continuano a comparire sullo schermo. - Gli errori hanno la forma
Error: <what went wrong> (request req_…), di solito seguiti da una rigaNext:che dice che cosa fare. Con--json, un errore è un oggetto JSON su una riga conerror,type,status,codeerequestId, senza rigaNext:. Quando non è impostata alcuna chiave,typevaleMissingApiKeyError. Se contatti l’assistenza, riporta il valorereq_…. - Il denaro è un importo in dollari statunitensi scritto come semplice testo senza il simbolo
$, per esempio0.03. - Gli orari sono in UTC. La
Zalla fine di2026-09-17T08:05:00Zsignifica UTC. - Il codice di uscita è
0quando un comando riesce e diverso da0quando fallisce, e gli script possono controllarlo.
Riferimento dei comandi
Ogni comando ha anche un aiuto integrato: aggiungi --help, per esempio spicyapi tasks create --help.
Opzioni globali e variabili d’ambiente
Queste opzioni funzionano con ogni comando.
| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--json | Stampa il risultato completo come JSON | Disattivata | No |
--timeout-ms <milliseconds> | Quanto attendere una singola risposta di SpicyAPI prima di rinunciare, da 1 a 120000 | 30000 (30 secondi) | No |
--max-retries <count> | Quante volte riprovare automaticamente dopo un errore di rete, un 429 o un errore del server, per le richieste che si possono ripetere senza rischi, da 0 a 5 | 2 | No |
--api-base-url <url> | Invia le richieste API a un indirizzo diverso. Normalmente non ti serve mai | https://api.spicyapi.ai/api/v1 | No |
--service-base-url <url> | L’indirizzo controllato da status. Normalmente non ti serve mai | https://api.spicyapi.ai | No |
-V, --version | Stampa la versione della CLI | — | No |
-h, --help | Mostra l’aiuto del comando | — | No |
| Variabile d’ambiente | A che cosa serve |
|---|---|
SPICY_API_KEY | La tua chiave API. Serve a tutti i comandi tranne status, docs search e webhooks verify |
SPICY_WEBHOOK_SECRET | La tua chiave di firma dei webhook, letta da webhooks verify |
SPICY_API_BASE_URL, SPICY_SERVICE_BASE_URL | Equivalenti alle due opzioni di indirizzo qui sopra. Gli indirizzi devono usare https:// |
status
Che cosa fa: verifica se SpicyAPI è in funzione e raggiungibile dal tuo computer.
spicyapi statusNessuna opzione. Non serve la chiave. Gratuito.
Output: una frase. SpicyAPI is reachable — … answered in … ms. significa che è tutto a posto. could not be reached significa che il tuo computer non ha ricevuto risposta: controlla la rete o il proxy. is not healthy o reports it is not ready indicano un problema da parte nostra; gli incidenti in corso sono elencati su status.spicyapi.ai.
Con --json vedi i controlli grezzi. La risposta che conta è operational: true; una voce readiness con stato 404 è normale sull’indirizzo pubblico.
docs search
Che cosa fa: trova la pagina della documentazione su un argomento. Cerca in un piccolo indice incluso nella CLI, quindi funziona senza chiave e senza chiamare SpicyAPI. Ogni risultato rimanda alla pagina su questo sito di documentazione, docs.spicyapi.ai.
spicyapi docs search [words] [--limit <count>]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
words | Le parole da cercare. Omettilo per elencare le pagine | Vuoto | No |
--limit <count> | Numero massimo di risultati, da 1 a 25 | 10 | No |
spicyapi docs search retentionslug: 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/retentionQuando ci sono più risultati, vengono stampati uno dopo l’altro e ciascuno inizia con slug:. Se non trova nulla, lo dice ed esce comunque con codice 0:
No documentation matched "refnd". Try fewer or different words, or run `spicyapi docs search` without words to browse pages.Con --json, quando non trova nulla stampa un elenco vuoto, []. Gratuito.
models list
Che cosa fa: elenca i modelli che il tuo account può chiamare oggi, con i prezzi che paga il tuo account.
spicyapi models list [options]| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--modality <type> | Solo modelli image, video o text. L’opzione accetta anche audio, ma oggi non viene offerto alcun modello audio | Tutti | No |
--task <task> | Solo un tipo di lavoro, come text-to-image, edit, image-to-video, text-to-video o reference-to-video | Tutti | No |
--provider <name> | Solo i modelli di un certo produttore, cioè l’azienda o il laboratorio che ha creato il modello. Deve corrispondere esattamente al valore provider | Tutti | No |
--search <text> | Solo i modelli il cui ID o nome visualizzato contiene questo testo, senza distinguere maiuscole e minuscole | Nessuno | No |
--include-schema | Aggiunge le impostazioni complete di ogni modello (inputSchema). Rende l’output molto più lungo | Disattivata | No |
--include-examples | Aggiunge input di esempio già pronti e già verificati dal server (examples) | Disattivata | No |
spicyapi models list --modality video --task image-to-video --jsonOutput: total e items. Usa --json, perché senza tutte le voci vengono stampate su una sola riga. I campi più utili di ogni voce:
| Campo | Significato |
|---|---|
model | L’ID del modello da usare negli altri comandi |
displayName, provider, modality, tasks | Nome, produttore del modello, tipo di output e tipo di lavoro |
enabled, available | Usa i modelli in cui valgono entrambi true |
pricing | Una voce per ogni livello di prezzo: variant (per esempio una risoluzione), unit, price in USD, più regularPrice e offerLabel quando si applica uno sconto |
taskTimeoutSeconds | Quanto può durare una generazione prima di terminare come expired |
maxOutputDurationSeconds | La durata massima di video consentita da questo modello, quando ne ha una |
Gratuito. La lettura dell’elenco dei modelli conta nel limite di richieste del tuo account, quindi non serve eseguirla prima di ogni generazione.
models get
Che cosa fa: mostra un modello per intero, comprese le impostazioni che accetta.
spicyapi models get <model>| Argomento | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
model | L’ID esatto del modello. Le barre che contiene vanno bene così come sono | — | Sì |
spicyapi models get MODEL_ID_FROM_CATALOG --jsonOutput: gli stessi campi di models list, più inputSchema. In inputSchema leggi required (le impostazioni che devi inviare), properties (ogni impostazione ammessa e il suo tipo), enum (gli unici valori ammessi), minimum e maximum (i limiti numerici) e default (il valore usato quando ometti l’impostazione). Le voci chiamate x-ui sono suggerimenti per costruire moduli; puoi ignorarle. Gratuito.
balance
Che cosa fa: mostra quanto denaro è disponibile sul tuo account.
spicyapi balanceNessuna opzione. Gratuito.
Output: available (quanto puoi spendere adesso), held (l’importo accantonato per le attività ancora in corso) e total, tutti in dollari statunitensi. Può includere anche funding, che suddivide il saldo tra fondi prepagati e bonus promozionali, indicando anche quando scadono i bonus e per quali modelli si possono usare. Non devi controllare il saldo prima di ogni generazione: tasks create lo controlla al posto tuo.
usage
Che cosa fa: mostra quante generazioni ha eseguito la chiave API attuale e quanto sono costate, raggruppate per giorno e per modello.
spicyapi usage [--from <date>] [--to <date>]| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--from <date> | Il primo giorno da includere, come YYYY-MM-DD in UTC | Gli ultimi sette giorni, oggi compreso | No |
--to <date> | Il giorno successivo all’ultimo da includere, come YYYY-MM-DD in UTC. L’intervallo può essere al massimo di 92 giorni | Gli ultimi sette giorni, oggi compreso | No |
spicyapi usage --from 2026-09-01 --to 2026-10-01Questo comando copre tutto settembre: --to è il primo giorno non incluso. Ometti entrambe le opzioni per vedere gli ultimi sette giorni, oggi compreso.
Output: from, to, currency, totalCalls, totalSpend, poi days (per ogni giorno: calls, succeeded, failed, spend) e models (gli stessi numeri per modello). totalSpend conta solo gli addebiti definitivi. days e models descrivono le stesse attività in due modi, quindi non sommarli tra loro. Per l’intero account invece che per una sola chiave, usa la pagina Consumi della console.
Gratuito. È limitato a 30 chiamate al minuto, quindi usalo per controllare i totali, non dentro un ciclo.
tasks quote
Che cosa fa: ti dice esattamente quanto costerebbe una generazione, senza avviarla e senza accantonare alcun importo.
spicyapi tasks quote --model <model> --input-file <path>| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--model <model> | L’ID esatto del modello | — | Sì |
--input-file <path> | Legge l’input da un file JSON. Usa - per leggerlo da ciò che viene passato al comando tramite pipe | — | Questa o --input-json |
--input-json <json> | Passa l’input direttamente come testo JSON. Con --input-file gestire le virgolette è più facile | — | Questa o --input-file |
--callback-url <url> | L’indirizzo di callback che intendi usare, perché fa parte della richiesta di cui si calcola il prezzo | Nessuno | No |
Output: quoteId, model, estimatedCost, maxCharge, currency, quantity (per esempio il numero di secondi addebitati), unit e expiresAt. Un preventivo vale cinque minuti.
Gratuito, senza conferma. Usalo per confrontare modelli o impostazioni. Non è obbligatorio eseguirlo prima di tasks create, che chiede un proprio preventivo.
tasks create
Che cosa fa: avvia la generazione di un’immagine o di un video. Costa denaro. La CLI mostra sempre prima il prezzo e chiede conferma.
spicyapi tasks create --model <model> --input-file <path> [options]| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--model <model> | L’ID esatto del modello | — | Sì |
--input-file <path> | Legge l’input da un file JSON. - lo legge da ciò che viene passato al comando tramite pipe, e in quel caso serve anche --yes | — | Questa o --input-json |
--input-json <json> | Passa l’input direttamente come testo JSON | — | Questa o --input-file |
--wait | Resta in attesa finché l’attività non finisce, poi stampa il risultato | Disattivata: stampa l’ID attività e ritorna | No |
--yes | Salta la domanda di conferma. Usalo solo quando conosci già il prezzo, di solito negli script | Disattivata: chiede | No |
--idempotency-key <key> | Un nome per «questa singola generazione». Se esegui di nuovo il comando con la stessa chiave entro 24 ore, ottieni la stessa attività invece di una nuova. Fino a 128 caratteri | Una nuova chiave casuale a ogni esecuzione | No |
--retention <duration> | Elimina prima del solito i media generati, il payload del risultato, il prompt e l’altro testo dell’input di questa attività: 30m, 1h, 7d o un numero di secondi. Può solo accorciare. 0 li elimina appena l’attività finisce. Le registrazioni di fatturazione vengono sempre conservate | L’impostazione del tuo account | No |
--callback-url <url> | Un indirizzo pubblico che inizia con https:// e che SpicyAPI chiama quando l’attività finisce. Vengono rifiutati il semplice http://, localhost e gli indirizzi di reti private. Serve solo se gestisci un server; vedi Webhook | Nessuno | No |
--poll-interval-ms <milliseconds> | Con --wait: controlla ogni tot millisecondi, da 100 a 60000 | Parte da 2 secondi e rallenta fino a 10 secondi | No |
--wait-timeout-ms <milliseconds> | Con --wait: smette di attendere dopo questo tempo, da 1 a 86400000. L’attività continua a girare | 600000 (10 minuti) | No |
Che cosa succede, nell’ordine:
- La CLI legge il tuo input e controlla che sia un oggetto JSON. Se non hai fornito alcun input, si ferma qui.
- Se nessuno può rispondere a una domanda, per esempio dentro uno script, e non hai passato
--yes, si ferma qui. - Chiede un preventivo e stampa l’addebito stimato, l’addebito massimo, la scadenza del preventivo e la chiave di idempotenza.
- Chiede
Continue? [y/N]. Si prosegue solo conyoyes. La risposta predefinita è no. - Crea l’attività al prezzo del preventivo. L’importo stimato viene accantonato dal tuo saldo, e quell’importo è anche il massimo che l’attività può costare.
- Senza
--wait, stampaidempotencyKey,taskId,state(queued),estimatedCostedeadlineAt, poi ritorna. Con--wait, stampa subitoAccepted: <task-id>e un comando di ripristino, attende, poi stampaidempotencyKey,acceptede l’attività finita intask.
deadlineAt è l’ora limite entro cui l’attività può finire prima di terminare come expired. Non indica quando scadono il link di download o i file.
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitSu macOS e Linux puoi anche passare l’input direttamente nel comando:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-json '{"prompt": "A paper lantern on a rainy street"}'Se l’attesa fallisce, l’attività è ancora in corso
Un’attesa può finire prima del previsto per il limite di tempo, per un problema di rete o per Ctrl + C. L’attività invece prosegue e viene addebitata normalmente. La riga Accepted: stampata all’inizio contiene il suo ID; continua con spicyapi tasks wait <task-id>. Non limitarti a rieseguire lo stesso comando di creazione senza --idempotency-key: così avvii, e paghi, una seconda generazione.
Quando l’attesa fallisce con un errore (e non per Ctrl + C), le ultime righe ripetono tutto ciò che ti serve, così non devi scorrere indietro per ritrovare la riga 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.Se l’errore ha una soluzione nota, come un 429 o un errore del server, segue una riga Next:. Con --json, le stesse informazioni si trovano nell’oggetto di errore come taskId, idempotencyKey e recover.
tasks wait
Che cosa fa: attende un’attività che hai già avviato, finché non finisce.
spicyapi tasks wait <task-id> [options]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
task-id | L’ID attività, per esempio job_01k3m8x9q2z4v7n5p6r8s0t1w3 | — | Sì |
--poll-interval-ms <milliseconds> | Controlla ogni tot millisecondi, da 100 a 60000 | Parte da 2 secondi e rallenta fino a 10 secondi | No |
--wait-timeout-ms <milliseconds> | Smette di attendere dopo questo tempo, da 1 a 86400000 | 600000 (10 minuti) | No |
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000Output: l’attività finita, con gli stessi campi di tasks get, non appena il suo stato è succeeded, failed o expired. Se l’attività è riuscita ma i suoi file vengono ancora copiati, attende ancora un po’.
Se il tempo limite si esaurisce, vedi Error: task … did not reach a terminal state within 600000ms. Non è un fallimento: l’attività è ancora in corso. Attendi di nuovo, se serve con un --wait-timeout-ms più lungo. Interrompere un’attesa non annulla mai un’attività. Gratuito.
tasks get
Che cosa fa: mostra un’attività in questo momento: il suo stato, il costo, i link ai risultati e quando verranno eliminati i suoi contenuti.
spicyapi tasks get <task-id>| Argomento | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
task-id | L’ID attività | — | Sì |
Usa la stessa chiave API che ha creato l’attività: con un’altra chiave ottieni «not found».
Campi dell’output:
| Campo | Significato |
|---|---|
state | queued (in attesa di partire), running, succeeded, failed oppure expired (tempo esaurito). Le attività più vecchie possono mostrare anche canceled |
output.assets | I risultati. Ciascuno ha un url (un link di download valido per circa 20 minuti), expiresAt (quando quel link smette di funzionare), mime (il tipo di file), i dettagli sulle dimensioni e una key. pending: true significa che il file viene ancora copiato, quindi riprova tra qualche secondo. unavailable: true significa che non può essere recuperato |
errorCode, errorMessage | Perché l’attività è fallita. Vedi Errori |
cost, settled | L’addebito in USD. È definitivo quando settled vale true |
input | Le impostazioni che hai inviato. Vengono rimosse quando scade la conservazione del prompt |
createdAt, completedAt, deadlineAt | Quando è stata creata, quando è finita e l’ora limite entro cui poteva finire |
contentState | present (contenuti ancora conservati), expired (rimossi dalle regole di conservazione) oppure purged (li hai eliminati tu) |
retention | outputsExpireAt (quando vengono eliminati i file del risultato), promptsExpireAt (quando viene cancellato il testo del prompt) e source (quale impostazione lo ha deciso) |
sourceTaskId | Presente quando questa attività è un nuovo tentativo di un’altra attività |
L’output normale termina con un riepilogo in linguaggio semplice, come Outputs expire: … o Content: Destroyed — you removed the outputs …. Ogni chiamata restituisce link di download nuovi. Gratuito.
tasks list
Che cosa fa: elenca le attività create con la chiave API attuale, una pagina alla volta.
spicyapi tasks list [options]| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--from <date> | Il primo giorno da includere, YYYY-MM-DD in UTC | Una finestra di sette giorni che termina oggi | No |
--to <date> | Il giorno successivo all’ultimo da includere, YYYY-MM-DD in UTC. L’intervallo può essere al massimo di 92 giorni | Vedi sopra | No |
--state <state> | Solo le attività in un certo stato: queued, running, succeeded, failed, canceled o expired | Tutti | No |
--model <model> | Solo le attività di un ID del modello esatto | Tutti | No |
--limit <count> | Attività per pagina, da 1 a 100 | 20 | No |
--cursor <cursor> | Prosegue dalla pagina precedente, usando il suo valore nextCursor | Prima pagina | No |
spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --state failedOutput: items (ciascuna voce con taskId, model, state, cost, settled, createdAt, deadlineAt e completedAt), hasMore e nextCursor. Se hasMore vale true, esegui di nuovo lo stesso comando con gli stessi --from e --to, aggiungendo --cursor e il valore di nextCursor. L’elenco non contiene link di download; usa tasks get per l’attività che ti interessa. Gratuito.
tasks retry
Che cosa fa: esegue di nuovo un’attività failed o expired, come nuova attività con un nuovo ID. Costa denaro.
spicyapi tasks retry <task-id> [options]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
task-id | L’attività fallita o scaduta da eseguire di nuovo | — | Sì |
--wait | Resta in attesa finché la nuova attività non finisce | Disattivata | No |
--yes | Salta la domanda di conferma | Disattivata: chiede | No |
--idempotency-key <key> | Se esegui di nuovo il nuovo tentativo con la stessa chiave, ottieni la stessa nuova attività invece di un’altra | Una nuova chiave casuale a ogni esecuzione | No |
--poll-interval-ms <milliseconds> | Con --wait: ogni quanto controllare | Parte da 2 secondi e rallenta fino a 10 secondi | No |
--wait-timeout-ms <milliseconds> | Con --wait: smette di attendere dopo questo tempo | 600000 (10 minuti) | No |
Chiede Retry source task … Continue? [y/N]. A differenza di tasks create, non mostra un prezzo prima di chiedere. La nuova attività viene addebitata al prezzo attuale del modello, quindi, se il prezzo conta, controllalo prima con spicyapi models get <model>.
Output: idempotencyKey, il nuovo taskId, sourceTaskId (l’originale), state, estimatedCost (l’importo accantonato) e deadlineAt.
- Si possono ripetere solo le attività
failededexpired, più quellecanceledpiù vecchie. Per un’altra versione di un risultato riuscito, usatasks create. - L’input originale viene riutilizzato senza modifiche, quindi un nuovo tentativo aiuta solo quando il fallimento era temporaneo. Controlla prima
errorCode; vedi Ripetere un’attività fallita ed Errori. - Se l’input puntava a un file caricato che nel frattempo è scaduto, il nuovo tentativo fallisce; carica di nuovo il file e usa
tasks create. - Il nuovo tentativo mantiene l’impostazione di conservazione dell’attività originale.
- Se
tasks createha perso la connessione prima che tu vedessi un ID attività, non si tratta di un’attività fallita. Segui invece i passaggi di ripristino in Riprendere un’attività dopo un’attesa interrotta.
tasks purge
Che cosa fa: elimina per sempre i media generati, il payload del risultato (i dati del risultato archiviati), il prompt e l’altro testo dell’input di un’attività conclusa, subito, invece di aspettare che scadano.
spicyapi tasks purge <task-id> [--yes]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
task-id | Un’attività conclusa: succeeded, failed, expired o canceled | — | Sì |
--yes | Salta la domanda di conferma | Disattivata: chiede | No |
Un’attività ancora queued o running non può essere distrutta. Non può nemmeno essere annullata, perché non esiste alcun comando né alcuna API di annullamento: attendi che finisca con spicyapi tasks wait <task-id>, poi distruggine i contenuti.
Il comando spiega che cosa verrà eliminato e ti chiede conferma, perché l’operazione non si può annullare. Prima scarica tutto ciò che vuoi conservare.
Output: taskId, contentState (purged), purgedAt, contentRemovedBy (user), billingRetained (sempre true) e mediaDeletionPending, seguiti da una riga che indica che cosa è stato distrutto e che i media archiviati vengono rimossi entro circa un minuto. Se contentState è ancora present, questa volta non è stato rimosso nulla; riprova più tardi.
Gratuito, e non è un rimborso: la voce contabile, l’importo addebitato, il modello, lo stato, gli orari e l’ID della richiesta restano registrati. Vedi Conservazione e distruzione.
files upload
Che cosa fa: carica un file dal tuo computer, per esempio l’immagine di partenza per una generazione da immagine a video, e ti restituisce un indirizzo spicy:// da inserire nell’input.
spicyapi files upload <path> [--content-type <type>]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
path | Il file da caricare | — | Sì |
--content-type <type> | Il tipo di file, quando non si deduce dal nome: image/jpeg, image/png, image/webp, image/gif, video/mp4, video/webm, audio/mpeg o audio/wav | Rilevato dall’estensione | No |
Sono supportate le immagini .jpg, .jpeg, .png, .webp e .gif fino a 10 MiB, i video .mp4 e .webm e l’audio .mp3 e .wav fino a 90 MiB e 600 secondi. Un modello può fissare limiti propri più bassi.
spicyapi files upload ./start-frame.jpgfileId: 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: 720Output: copia il valore uri esattamente come viene stampato nell’impostazione del modello dedicata al file, spesso image_url. Si può usare fino a expiresAt, di norma un giorno. Dopo, carica di nuovo il file. Il caricamento è gratuito.
files download-url
Che cosa fa: crea un nuovo link di download per il risultato di un’attività conclusa. Stampa il link, ma non salva il file.
spicyapi files download-url <task-id> [--key <key>]| Argomento o opzione | Che cosa fa | Predefinito | Obbligatorio |
|---|---|---|---|
task-id | Un’attività riuscita | — | Sì |
--key <key> | A quale risultato puntare, quando un’attività ne ha prodotti più di uno. Usa il valore key di output.assets in tasks get | Il primo risultato | No |
Output: key, url ed expiresAt. Il link funziona per circa 20 minuti; aprilo in un browser o scaricalo con curl. Un’attività non ancora riuscita risponde «not found». Se il file viene ancora copiato ricevi un errore di conflitto; aspetta qualche secondo e riprova. Una volta eliminati i file dell’attività, non si può più creare alcun link. Gratuito.
webhooks verify
Che cosa fa: se gestisci un server che riceve le callback di SpicyAPI (vedi --callback-url), verifica che una callback salvata sia autentica e non modificata. Viene eseguito interamente sul tuo computer e non richiede alcuna chiave API.
spicyapi webhooks verify --body-file <path> --timestamp <seconds> --signature <base64> --payload-version <version>| Opzione | Che cosa fa | Predefinito | Obbligatoria |
|---|---|---|---|
--body-file <path> | Un file con il corpo della callback esattamente come è stato ricevuto, byte per byte | — | Sì |
--timestamp <seconds> | Il valore dell’intestazione X-Webhook-Timestamp | — | Sì |
--signature <base64> | Il valore dell’intestazione X-Webhook-Signature | — | Sì |
--payload-version <version> | Il valore dell’intestazione X-Webhook-Payload-Version: 1 o 2 | — | Sì |
--secret-env <name> | Il nome della variabile d’ambiente che contiene la tua chiave di firma dei webhook. La chiave stessa non viene mai digitata sulla riga di comando | SPICY_WEBHOOK_SECRET | No |
--tolerance-seconds <seconds> | Di quanto il timestamp può discostarsi dall’orologio del tuo computer | 300 | No |
Output: in caso di successo, payload (il contenuto della callback), payloadVersion, taskId, deliveryId (versione 2) e timestamp. Se qualcosa non corrisponde, stampa un errore ed esce con un codice diverso da zero. Gratuito.
Al momento della registrazione viene creata automaticamente una chiave di firma, ma il suo valore non viene mai mostrato. Per averne una da copiare, apri Webhook nella console e fai clic su Genera (oppure su Ruota, se una chiave è già configurata). La nuova chiave viene mostrata una sola volta. La rotazione ha effetto immediato, senza periodo di sovrapposizione: la vecchia chiave smette subito di firmare. Vedi Webhook.
Ricette comuni
Generare un’immagine
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 --waitScegli un ID con il primo comando, costruisci input.json a partire dalle impostazioni mostrate dal secondo, poi esegui il terzo e conferma con y. Il percorso guidato in Il tuo primo risultato spiega ogni passaggio.
Trasformare un’immagine in un video
Trova un modello da immagine a video e le sue impostazioni
spicyapi models list --modality video --task image-to-video --json
spicyapi models get MODEL_ID_FROM_CATALOG --jsonIn inputSchema trova l’impostazione per l’immagine di partenza (di solito image_url), quella per la durata (di solito duration_seconds) e tutto ciò che compare in required.
Carica la tua immagine
spicyapi files upload ./start-frame.jpgCopia il valore uri, che inizia con spicy://.
Scrivi l’input
Crea input.json come in Il tuo primo risultato, usando i nomi delle impostazioni del modello e il tuo uri:
{
"prompt": "Slow push-in, rain running down the window",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"duration_seconds": 5
}Controlla il prezzo, poi genera
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 1800000Di solito i video si pagano al secondo, quindi la durata che scegli cambia il prezzo. I video possono richiedere diversi minuti, perciò questo esempio attende fino a 30 minuti invece dei 10 predefiniti. Scarica il file .mp4 dall’url come in Il tuo primo risultato.
L’immagine caricata si può usare per un giorno. Dopo, caricala di nuovo.
Riprendere un’attività dopo un’attesa interrotta
Un’attività continua a girare anche se il terminale si chiude, la rete cade, il computer va in sospensione o l’attesa scade. Come ritrovarla dipende da che cosa hai visto:
-
Hai visto
Accepted: job_…, oppure una rigaRecover:sotto l’errore. Hai l’ID attività. Attendi di nuovo, oppure limitati a consultarla:spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3 -
Hai visto solo la riga
Idempotency-Key:, per esempio perché la connessione è caduta mentre l’attività veniva creata. Esegui di nuovo lo stesso comando, con lo stesso modello e lo stesso input, e aggiungi quella chiave:spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241 --waitLa CLI mostra il prezzo e chiede di nuovo conferma, ma se il primo tentativo era stato accettato, SpicyAPI ti restituisce quella stessa attività invece di avviarne, e addebitarne, una seconda. Funziona per 24 ore con la stessa chiave API. Se il primo tentativo non era mai arrivato, l’attività viene creata adesso, una sola volta.
-
Non hai né l’uno né l’altra. Elenca le tue attività recenti e ritrovala in base all’orario e al modello:
spicyapi --json tasks list --limit 10
Ripetere un’attività fallita
Per prima cosa scopri perché è fallita:
spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Poi leggi errorCode. Le attività fallite o scadute normalmente liberano l’intero importo accantonato. Alcuni rifiuti di contenuto vengono addebitati al preventivo accettato, solo se la pagina del modello indica esplicitamente questa eccezione. Controlla settled e cost per conoscere l’importo finale. tasks retry invia di nuovo lo stesso input, quindi aiuta solo quando la causa era temporanea:
errorCode | Che cosa fare |
|---|---|
rate_limited, upstream_unavailable, timeout, upstream_failed | Aspetta un po’, poi riprova una volta. Se fallisce di nuovo, smetti di riprovare: per timeout, prova con tasks create una durata più breve o una risoluzione più bassa |
generation_failed | Non riprovare. Cambia il prompt o l’immagine, poi usa tasks create: lo stesso input di solito fallisce nello stesso modo |
invalid_asset | Non riprovare, perché il nuovo tentativo riutilizza il vecchio file. Carica di nuovo il file, poi usa tasks create con il nuovo uri |
invalid_request, unsupported_combination | Non riprovare senza modifiche. Cambia le impostazioni, poi usa tasks create |
content_rejected | Non riprovare senza modifiche. Il modello ha rifiutato questa richiesta: cambia il prompt o scegli un altro modello, poi usa tasks create |
L’elenco completo è in Errori.
Quando un nuovo tentativo ha senso, eseguilo. Crea, e addebita, una nuova attività:
spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --waitEsportare i consumi
Salva in un file un mese di consumi della chiave attuale:
spicyapi --json usage --from 2026-09-01 --to 2026-10-01 > usage-2026-09.jsonIl file contiene i totali giornalieri e per modello. Per un elenco attività per attività, salva allo stesso modo spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --limit 100, seguendo nextCursor finché hasMore vale true. I dati dell’intero account e le fatture si trovano nella console.
Eseguire la CLI da uno script
In uno script nessuno può rispondere a Continue? [y/N], quindi i comandi a pagamento si rifiutano di partire se non aggiungi --yes. Quando lo fai:
- chiedi prima un preventivo e controlla il prezzo nello script;
- assegna a ogni generazione una propria
--idempotency-keyfissa, comeposter-2026-09-17-v1, così eseguire lo script due volte non addebita due volte; - aggiungi
--jsone leggistatedal risultato: un comando che esce con codice0non ha necessariamente prodotto un’attività riuscita; - imposta limiti di spesa sulla chiave nella console.
spicyapi --json tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key poster-2026-09-17-v1 --yes --wait > result.jsonCosti, conferme e sicurezza
Quali comandi costano denaro. Solo tasks create e tasks retry. I prezzi sono in dollari statunitensi. Chiedere preventivi, elencare, controllare, caricare, scaricare ed eliminare è gratuito.
Vedere prima il prezzo. tasks quote calcola il prezzo di una richiesta senza avviare nulla. tasks create chiede un proprio preventivo e mostra Estimated charge e maximum charge prima di chiedere conferma. Quando l’attività viene accettata, l’importo stimato viene accantonato (held) ed è anche il massimo che ti può essere addebitato. Quando l’attività riesce paghi ciò che è stato effettivamente prodotto, mai più di quell’importo, e l’eventuale differenza torna sul tuo saldo.
La conferma. Continue? [y/N] significa che la risposta è no, a meno che tu non digiti y. --yes risponde al posto tuo, quindi usalo solo quando conosci il prezzo. Se la CLI gira dove non può fare domande, come in uno script o con un input passato tramite pipe, e manca --yes, si rifiuta di procedere invece di dare per scontato un sì. tasks purge chiede conferma allo stesso modo, perché l’eliminazione non si può annullare. Anche tasks retry chiede conferma, ma senza mostrare prima un prezzo.
La chiave di idempotenza, in parole semplici. È un’etichetta per una generazione, come un numero d’ordine. Ogni tasks create e tasks retry ne stampa una. Se la connessione a internet cade e non sai se la generazione è partita, esegui di nuovo lo stesso comando con --idempotency-key e il valore stampato: riottieni l’attività originale e non paghi due volte. L’etichetta vale per 24 ore con la stessa chiave API. Non riutilizzarla per una generazione diversa: la stessa chiave con un input diverso viene rifiutata.
Nessun annullamento. Una volta accettata, un’attività non può essere annullata. Ctrl + C, la chiusura del terminale o la revoca della chiave fermano soltanto l’attesa; l’attività arriva alla fine e viene addebitata normalmente.
Le attività fallite o scadute normalmente liberano l’intero importo accantonato. Alcuni rifiuti di contenuto vengono addebitati al preventivo accettato, solo se la pagina del modello indica esplicitamente questa eccezione. Controlla settled e cost per conoscere l’importo finale.
Scarica ciò che vuoi conservare. I file dei risultati vengono conservati al massimo per circa 14 giorni, o meno se lo prevedono il tuo account o --retention, poi vengono eliminati per sempre. I link di download durano circa 20 minuti, ma finché il file esiste puoi sempre chiederne uno nuovo. I file caricati si possono usare per un giorno. Il testo dei prompt viene cancellato dopo 30 giorni per impostazione predefinita. Le registrazioni di fatturazione vengono conservate. Vedi Conservazione e distruzione.
Limiti di spesa. Ogni chiave può avere limiti giornalieri, mensili e complessivi, da impostare nella pagina Chiavi API. Le chiavi nuove non hanno alcun limite finché non ne imposti uno. Un’attività che supererebbe un limite viene rifiutata prima di partire.
La tua chiave. La CLI legge la chiave solo da SPICY_API_KEY, non la stampa mai e nei suggerimenti degli errori ne mostra al massimo i primi nove caratteri (sk-spicy-).
Per approfondire: Fatturazione, Idempotenza, Impegno dell’attività e nuovi tentativi.
Risoluzione dei problemi
Cerca il messaggio che vedi. Gli errori di SpicyAPI terminano con (request req_…); se contatti l’assistenza, includi quel valore, ma non inviare mai la tua chiave.
Ogni codice di errore è spiegato in Errori, e i passaggi di ripristino sono in Diagnosi e ripristino.
Codice sorgente
Il pacchetto ha licenza MIT ed è sviluppato in modo aperto su github.com/spicyapi-ai/spicy-cli. È lì che si legge il codice dietro a ogni comando di questa pagina, si segnala un comportamento diverso da quello descritto e si propone una modifica.
Prossimi passi
Catalogo dei modelli e schemi
Come funzionano il catalogo in tempo reale e le impostazioni di ogni modello
Fatturazione
Prezzi, importi accantonati, limiti di spesa e fatture
Conservazione e distruzione
Per quanto tempo vengono conservati file e prompt, e come eliminarli prima
Errori
Tutti i codici di errore e quali conviene riprovare
SDK TypeScript
Fai le stesse cose dal tuo codice JavaScript o TypeScript
SDK Python
Fai le stesse cose dal tuo codice Python
SDK Go
Fai le stesse cose dal tuo codice Go
Server MCP
Lascia che un assistente di programmazione IA esegua questi passaggi, con una conferma prima di spendere
Agent Skill
Insegna a un agente IA il flusso di lavoro sicuro di SpicyAPI
Avvio rapido
Lo stesso flusso usando direttamente l’API HTTP
Agenti e automazione
Quale strumento ufficiale usare, e una procedura operativa di produzione per agenti IA, worker di backend e pipeline di media ripetibili.
Server MCP
Collega Claude, Cursor, VS Code e altri assistenti IA a SpicyAPI, poi sfoglia i modelli, confronta i prezzi, genera media e ritira i risultati chattando, con ogni passaggio a pagamento confermato da te.

