Ferramenta de linha de comando (CLI)
Use o comando spicyapi para explorar modelos, conferir preços, gerar imagens e vídeos e baixar os resultados pelo terminal, sem escrever código.
O que é a CLI
spicyapi é um pequeno programa que você roda num terminal, a janela em que você digita comandos em vez de clicar em botões. Cada comando faz uma coisa só: listar os modelos que a sua conta pode usar, dizer quanto uma geração vai custar, iniciar a geração de uma imagem ou de um vídeo, esperar que ela termine e entregar um link para baixar o resultado.
Você não escreve código nenhum. Digita um comando, aperta Enter e lê a resposta.
Ela é uma boa escolha quando você quer:
- testar modelos e comparar preços antes que alguém escreva uma integração;
- gerar imagens ou vídeos a partir do seu próprio computador e salvar os arquivos;
- repetir o mesmo tipo de geração sem precisar clicar numa página toda vez;
- conferir as configurações exatas de um modelo antes de construir algo em cima dele.
A CLI cobre geração de imagem e de vídeo. Modelos de texto e de conversa são chamados pelos endpoints compatíveis com chat descritos em Texto e streaming.
Existem outras três ferramentas oficiais. Escolha a CLI se você quer digitar os comandos por conta própria:
| Ferramenta | Escolha quando |
|---|---|
| SDK | Você está escrevendo um programa em JavaScript ou TypeScript que chama a SpicyAPI |
| Servidor MCP | Você quer que um assistente de programação com IA faça esses mesmos passos por você |
| Agent Skill | Você quer ensinar a um agente de IA o jeito seguro de usar a SpicyAPI |
Escrevendo em outra linguagem? Também existem SDKs oficiais para Python, Go, PHP e Java.
Nada nesta página gasta dinheiro por acidente
Só dois comandos podem custar dinheiro: tasks create e tasks retry. Os dois param e perguntam a você antes de qualquer cobrança. Todos os outros são gratuitos e podem ser rodados quantas vezes você quiser.
O que você pode fazer
| Eu quero… | Comando | Custa dinheiro? | Precisa de chave de API? |
|---|---|---|---|
| Conferir se a SpicyAPI está acessível | spicyapi status | Não | Não |
| Pesquisar nesta documentação | spicyapi docs search <words> | Não | Não |
| Ver quais modelos posso usar, e os preços deles | spicyapi models list | Não | Sim |
| Ver quais configurações um modelo aceita | spicyapi models get <model> | Não | Sim |
| Conferir o meu saldo | spicyapi balance | Não | Sim |
| Ver quanto uma chave gastou | spicyapi usage | Não | Sim |
| Saber o preço exato de uma geração sem iniciá-la | spicyapi tasks quote | Não | Sim |
| Iniciar uma geração de imagem ou vídeo | spicyapi tasks create | Sim, depois de perguntar a você | Sim |
| Esperar uma geração terminar | spicyapi tasks wait <task-id> | Não | Sim |
| Ver uma geração e os links do resultado dela | spicyapi tasks get <task-id> | Não | Sim |
| Listar as minhas gerações recentes | spicyapi tasks list | Não | Sim |
| Rodar de novo uma geração que falhou | spicyapi tasks retry <task-id> | Sim, depois de perguntar a você | Sim |
| Apagar de forma permanente os arquivos e o prompt de uma geração | spicyapi tasks purge <task-id> | Não, e nada é reembolsado | Sim |
| Enviar uma imagem, um vídeo ou um áudio para usar como entrada | spicyapi files upload <path> | Não | Sim |
| Obter um novo link de download para um resultado | spicyapi files download-url <task-id> | Não | Sim |
| Conferir se um callback veio mesmo da SpicyAPI | spicyapi webhooks verify | Não | Não, ele usa a sua chave de assinatura de webhook |
Nos comandos acima, uma palavra entre os sinais de menor e maior, como <task-id>, quer dizer "coloque aqui o seu próprio valor", sem os sinais.
Antes de começar
Você precisa de quatro coisas: um terminal, o Node.js, uma chave de API e um jeito de rodar a CLI. Na primeira vez, isso leva uns dez minutos.
Abra um terminal
Um terminal é uma janela de texto para rodar comandos. Tudo nesta página é digitado ou colado ali e executado com Enter.
Aperte Cmd + Espaço, digite Terminal e aperte Enter. Abre uma janela com uma linha que termina em % ou $: é ali que você digita. Cole com Cmd + V.
Instale o Node.js 22.13 ou mais recente
A CLI roda sobre o Node.js, um programa gratuito. Confira se você já o tem:
node -vSe aparecer v22.13.0 ou um número maior, como v22.14.0 ou v24.4.1, está tudo pronto. Se aparecer um número menor, ou uma mensagem como command not found ou is not recognized:
- Acesse nodejs.org, abra a página de download e escolha a versão LTS para o seu sistema.
- Rode o instalador e aceite as opções padrão.
- Feche o terminal e abra um novo, depois rode
node -vde novo.
O Node.js já vem com o npm e o npx, os dois auxiliares usados no último passo.
Crie uma chave de API
A chave de API é o que permite à SpicyAPI saber que a requisição vem da sua conta.
- Crie uma conta em spicyapi.ai/register. As contas podem ser liberadas em lotes; se o cadastro ainda não estiver aberto para você, entre na lista de espera.
- Adicione saldo em Faturamento, no console. As gerações são pagas com o seu saldo, em dólares americanos.
- Abra Chaves de API e clique em Criar chave. Dê a ela um nome que você vá reconhecer depois, como
my laptop. Só o nome é obrigatório. - Copie a chave na hora. Ela começa com
sk-spicy-e aparece uma única vez. Você também pode usar Salvar como arquivo.
Chaves novas não têm limite de gasto a menos que você defina um. Um limite diário evita que um erro ou uma chave vazada gerem uma conta alta, e você pode mudá-lo depois, na mesma página.
Trate a chave como uma senha
Qualquer pessoa que tenha a sua chave pode gastar o seu saldo. Não a envie por chat nem por e-mail, não a mostre em capturas de tela nem em chamados de suporte e nunca a salve numa pasta de projeto que vá para o Git ou para o GitHub. Se ela vazar, revogue-a na página Chaves de API e crie outra.
Guarde a chave em SPICY_API_KEY
A CLI não tem comando de login e nunca recebe a chave como opção de comando. Ela lê uma variável de ambiente chamada SPICY_API_KEY: um valor com nome que o seu terminal entrega aos programas que ele roda.
Só para a janela atual (esquecida quando você fecha a janela):
export SPICY_API_KEY="sk-spicy-paste-your-key-here"De forma permanente: adicione essa mesma linha export ao final do arquivo de inicialização do seu shell, que roda toda vez que você abre um terminal. No macOS, o arquivo é ~/.zshrc; na maioria dos sistemas Linux, é ~/.bashrc.
nano ~/.zshrcCole a linha export no final, aperte Ctrl + O e depois Enter para salvar, e Ctrl + X para sair. No Linux, use nano ~/.bashrc. Abra uma nova janela de terminal para que a mudança valha.
Confira se ela está definida, sem imprimir a chave inteira:
echo "${SPICY_API_KEY:0:9}"Deve aparecer sk-spicy-.
Onde a chave pode e não pode ficar
O arquivo de inicialização do seu shell e as configurações da sua conta do Windows ficam neste computador, o que não é problema para uso pessoal. Nunca coloque a chave num arquivo dentro de um projeto, nunca faça commit dela e nunca a cole num documento compartilhado. Os terminais também guardam os comandos que você digita, então, num computador compartilhado, prefira o arquivo de inicialização ou a janela de configurações do Windows a digitar a chave num comando.
Escolha como rodar a CLI
Há dois jeitos, e os comandos são os mesmos.
O npx baixa a CLI quando é preciso e a executa:
npx @spicyapi/cli statusNa primeira vez, o npm pergunta Need to install the following packages: @spicyapi/cli@… Ok to proceed? (y). Aperte y e Enter.
Com este método, escreva npx @spicyapi/cli onde esta página escreve spicyapi. Por exemplo, spicyapi models list vira npx @spicyapi/cli models list.
Seu primeiro resultado
Este passo a passo gera uma imagem e faz o download dela. Cada passo mostra o comando, mais ou menos o que você vai ver e o que acabou de acontecer. Os seus números, IDs e horários vão ser diferentes.
Troque MODEL_ID_FROM_CATALOG por um ID de modelo real
MODEL_ID_FROM_CATALOG é um marcador, não um modelo. O passo 3 mostra como escolher um ID real no catálogo atual (live catalog): spicyapi models list, a mesma lista de GET /api/v1/models. Cole o seu ID em todos os lugares em que esta página mostra o marcador. Enviar o próprio marcador só devolve um erro de "não encontrado".
Confira a conexão
spicyapi statusSpicyAPI is reachable — api.spicyapi.ai answered in 523 ms.O que aconteceu: a CLI perguntou à SpicyAPI se ela está no ar. Isso não precisa de chave e não custa nada. Se aparecer "could not be reached", confira a sua conexão com a internet ou o seu proxy; veja Solução de problemas.
Confira o seu saldo
spicyapi balanceavailable: 12.34
held: 0.06
total: 12.40O que aconteceu: este é o primeiro comando que usa a sua chave. Os valores estão em dólares americanos. available é o que você pode gastar agora, held é o que está reservado para gerações que ainda estão rodando e total é a soma dos dois. Também pode aparecer uma linha funding, que divide o saldo entre fundos pré-pagos e verbas promocionais.
Se aparecer Error: SPICY_API_KEY is required for authenticated API operations, a chave não está definida nesta janela de terminal. A linha Next: logo abaixo mostra como defini-la; veja também Antes de começar.
Escolha um modelo
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" }
]
}
]
}Este exemplo está resumido: a lista real tem mais modelos e mais campos.
O que aconteceu: a CLI buscou os modelos que a sua conta pode chamar hoje, pelos seus preços. Escolha um que tenha enabled e available iguais a true e copie o valor de model, por exemplo selecionando-o com o mouse. Esse valor é o ID do modelo. Os IDs têm o formato maker/model/task.
priceestá em dólares americanos porunit:per_image,per_second(por segundo de vídeo),per_requestouper_1k_tokens.- Vários itens em
pricingsignificam que o preço depende das suas configurações, como a resolução. - Para achar um modelo pelo nome, acrescente
--searche parte do nome dele.
--json mostra a lista como JSON indentado e fácil de ler. Sem ele, a lista inteira sai espremida numa única linha comprida.
Veja quais configurações esse modelo aceita
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
}
}O que aconteceu: inputSchema é a lista de configurações do modelo, que o restante desta página chama de entrada (input).
requiredlista as configurações que você precisa enviar. Aqui, sóprompt.propertieslista todas as configurações que o modelo aceita, e nada além delas é permitido: basta um nome desconhecido ou digitado errado para a requisição inteira ser recusada.enumlista os únicos valores permitidos para aquela configuração.
Cada modelo tem as suas próprias configurações, então leia sempre as do modelo que você escolheu. Para ver entradas prontas que o servidor já conferiu, rode spicyapi models list --search <name> --include-examples --json e olhe examples.
Escreva a sua entrada num arquivo
Coloque a entrada num arquivo chamado input.json, na pasta em que o seu terminal está. Um arquivo evita problemas com aspas, principalmente no Windows.
Cole as três linhas de uma vez:
cat > input.json <<'EOF'
{"prompt": "A paper lantern glowing on a rainy street at night, cinematic light"}
EOFO que aconteceu: você descreveu o que gerar, usando os nomes de configuração do passo anterior. As aspas precisam ser aspas retas comuns ("), não aspas curvas.
Confira o preço
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:00ZO que aconteceu: a SpicyAPI calculou o preço desta requisição exata. Nada foi iniciado e nada foi cobrado. estimatedCost é quanto se espera que custe, e maxCharge é o máximo que pode custar. Este passo é opcional: o próximo comando busca o preço de novo e o mostra a você antes de gastar qualquer coisa.
Inicie a geração e espere por ela
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitPrimeiro, a CLI mostra o preço e pede a sua confirmação:
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]Digite y e aperte Enter. Qualquer outra resposta cancela, e nada é cobrado. Responda em até cinco minutos, antes que a cotação expire.
Assim que a SpicyAPI aceita o trabalho, a CLI mostra o ID da tarefa:
Accepted: job_01k3m8x9q2z4v7n5p6r8s0t1w3
If waiting is interrupted: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Imagens costumam levar segundos, e vídeos, minutos. Quando termina, o resultado aparece:
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,…}O que aconteceu: depois do seu y, a SpicyAPI aceitou a geração, que a partir daí se chama tarefa, e reservou o valor estimado do seu saldo. Em seguida, a CLI consultou a tarefa a cada poucos segundos até ela terminar. Na última linha, procure "state":"succeeded" e a "url" dentro de output. cost é a cobrança final quando settled é true. Acrescente --json ao comando se preferir o resultado distribuído em várias linhas fáceis de ler.
Fechar a janela não cancela a tarefa
Depois de aceita, uma tarefa sempre roda até o fim e é cobrada normalmente. Apertar Ctrl + C ou fechar o terminal só interrompe a espera. Guarde o ID da tarefa e retome com spicyapi tasks wait <task-id>; veja Retomar uma tarefa depois que a espera foi interrompida.
Baixe o resultado
A url é um link de download direto que funciona por cerca de 20 minutos e não exige chave. Cole-a num navegador e salve o arquivo, ou baixe pelo terminal (mantenha as aspas, porque o link contém caracteres &):
curl -L -o result.png "PASTE_THE_URL_HERE"Use a extensão de arquivo que corresponde ao mime: .png para image/png, .jpg para image/jpeg, .mp4 para video/mp4.
Se o link tiver expirado, peça um novo com spicyapi files download-url <task-id> ou rode spicyapi tasks get <task-id>, que devolve links novos.
O que aconteceu: você copiou o resultado para o seu próprio computador. Faça isso logo: a SpicyAPI guarda os arquivos gerados por no máximo cerca de 14 dias (menos, se a sua conta estiver configurada com um prazo menor) e depois os apaga para sempre. Veja Retenção e destruição.
Como ler a saída
- A saída normal mostra um
name: valuepor linha. Valores com várias partes, comooutputouretention, são impressos como JSON numa única linha. --jsonimprime a resposta completa como JSON indentado. Funciona com todos os comandos, antes ou depois do nome do comando:spicyapi --json balanceespicyapi balance --jsondão no mesmo.- Os resultados vão para a saída normal da tela; as mensagens vão para a saída de erros. Os preços, a chave de idempotência, as linhas
Accepted:e os erros são mensagens. Por isso,spicyapi --json tasks get <task-id> > task.jsonsalva só o resultado emtask.json, enquanto as mensagens continuam aparecendo na tela. - Os erros têm a forma
Error: <what went wrong> (request req_…), normalmente seguidos de uma linhaNext:que diz o que fazer. Com--json, um erro é um objeto JSON de uma linha comerror,type,status,codeerequestId, sem linhaNext:. Quando nenhuma chave está definida,typeéMissingApiKeyError. Informe o valorreq_…se falar com o suporte. - Dinheiro é um valor em dólares americanos escrito como texto simples, sem o sinal
$, como0.03. - Horários estão em UTC. O
Zno final de2026-09-17T08:05:00Zsignifica UTC. - O código de saída é
0quando um comando dá certo e diferente de0quando ele falha, o que os scripts podem conferir.
Referência de comandos
Todo comando também tem ajuda embutida: acrescente --help, por exemplo spicyapi tasks create --help.
Opções globais e variáveis de ambiente
Estas opções funcionam com todos os comandos.
| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--json | Imprime o resultado completo como JSON | Desligada | Não |
--timeout-ms <milliseconds> | Quanto tempo esperar por uma resposta da SpicyAPI antes de desistir, de 1 a 120000 | 30000 (30 segundos) | Não |
--max-retries <count> | Quantas vezes tentar de novo automaticamente depois de um erro de rede, de um 429 ou de um erro do servidor, nas requisições que podem ser repetidas com segurança, de 0 a 5 | 2 | Não |
--api-base-url <url> | Envia as requisições da API para outro endereço. Normalmente você nunca precisa disto | https://api.spicyapi.ai/api/v1 | Não |
--service-base-url <url> | O endereço que o status confere. Normalmente você nunca precisa disto | https://api.spicyapi.ai | Não |
-V, --version | Mostra a versão da CLI | — | Não |
-h, --help | Mostra a ajuda do comando | — | Não |
| Variável de ambiente | Para que serve |
|---|---|
SPICY_API_KEY | A sua chave de API. Necessária para todos os comandos, exceto status, docs search e webhooks verify |
SPICY_WEBHOOK_SECRET | A sua chave de assinatura de webhook, lida por webhooks verify |
SPICY_API_BASE_URL, SPICY_SERVICE_BASE_URL | O mesmo que as duas opções de endereço acima. Os endereços precisam usar https:// |
status
O que faz: confere se a SpicyAPI está no ar e acessível a partir do seu computador.
spicyapi statusSem opções. Não precisa de chave. Gratuito.
Saída: uma frase. SpicyAPI is reachable — … answered in … ms. quer dizer que está tudo certo. could not be reached quer dizer que o seu computador não recebeu resposta: confira a sua rede ou o seu proxy. is not healthy ou reports it is not ready indica um problema do nosso lado; os incidentes em andamento aparecem em status.spicyapi.ai.
Com --json, você vê as verificações brutas. operational: true é a resposta que importa; um item readiness com status 404 é normal no endereço público.
docs search
O que faz: encontra a página da documentação sobre um assunto. Ele pesquisa num pequeno índice embutido na CLI, então funciona sem chave e sem chamar a SpicyAPI. Cada resultado aponta para a página neste site de documentação, docs.spicyapi.ai.
spicyapi docs search [words] [--limit <count>]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
words | As palavras a procurar. Deixe de fora para listar as páginas | Vazio | Não |
--limit <count> | Número máximo de resultados, de 1 a 25 | 10 | Não |
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 há vários resultados, eles são impressos um depois do outro, e cada um começa com slug:. Se nada corresponder, ele avisa e mesmo assim termina com código de saída 0:
No documentation matched "refnd". Try fewer or different words, or run `spicyapi docs search` without words to browse pages.Com --json, quando nada corresponde, aparece uma lista vazia, []. Gratuito.
models list
O que faz: lista os modelos que a sua conta pode chamar hoje, com os preços que a sua conta paga.
spicyapi models list [options]| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--modality <type> | Só modelos image, video ou text. A opção também aceita audio, mas hoje não há nenhum modelo de áudio | Todas | Não |
--task <task> | Só um tipo de trabalho, como text-to-image, edit, image-to-video, text-to-video ou reference-to-video | Todos | Não |
--provider <name> | Só modelos de um fabricante, a empresa ou o laboratório que criou o modelo. Precisa corresponder exatamente ao valor de provider | Todos | Não |
--search <text> | Só modelos cujo ID ou nome de exibição contenha este texto, sem diferenciar maiúsculas de minúsculas | Nenhum | Não |
--include-schema | Acrescenta as configurações completas de cada modelo (inputSchema). Deixa a saída bem maior | Desligada | Não |
--include-examples | Acrescenta entradas de exemplo prontas que o servidor já conferiu (examples) | Desligada | Não |
spicyapi models list --modality video --task image-to-video --jsonSaída: total e items. Use --json, porque sem ele todos os itens saem numa linha só. Os campos mais úteis de cada item:
| Campo | Significado |
|---|---|
model | O ID do modelo para usar nos outros comandos |
displayName, provider, modality, tasks | Nome, fabricante do modelo, tipo de saída e tipo de trabalho |
enabled, available | Use modelos em que os dois sejam true |
pricing | Um item por nível de preço: variant (por exemplo, uma resolução), unit, price em USD, mais regularPrice e offerLabel quando há desconto |
taskTimeoutSeconds | Quanto tempo uma geração pode rodar antes de terminar como expired |
maxOutputDurationSeconds | A duração máxima de vídeo que este modelo permite, quando ele tem uma |
Gratuito. A lista de modelos conta para o limite de requisições da sua conta, então não é preciso rodá-la antes de cada geração.
models get
O que faz: mostra um modelo por completo, incluindo as configurações que ele aceita.
spicyapi models get <model>| Argumento | O que faz | Padrão | Obrigatório |
|---|---|---|---|
model | O ID exato do modelo. As barras dentro dele podem ficar como estão | — | Sim |
spicyapi models get MODEL_ID_FROM_CATALOG --jsonSaída: os mesmos campos de models list, mais inputSchema. Em inputSchema, leia required (as configurações que você precisa enviar), properties (todas as configurações permitidas e o tipo de cada uma), enum (os únicos valores permitidos), minimum e maximum (limites numéricos) e default (usado quando você deixa a configuração de fora). Os itens chamados x-ui são dicas para montar formulários; você pode ignorá-los. Gratuito.
balance
O que faz: mostra quanto dinheiro está disponível na sua conta.
spicyapi balanceSem opções. Gratuito.
Saída: available (o que você pode gastar agora), held (reservado para tarefas que ainda estão rodando) e total, todos em dólares americanos. Também pode incluir funding, que divide o saldo entre fundos pré-pagos e verbas promocionais, inclusive quando as verbas expiram e quais modelos elas pagam. Não é preciso conferir o saldo antes de cada geração: o tasks create confere por você.
usage
O que faz: mostra quantas gerações a chave de API atual rodou e quanto elas custaram, agrupadas por dia e por modelo.
spicyapi usage [--from <date>] [--to <date>]| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--from <date> | O primeiro dia a incluir, no formato YYYY-MM-DD, em UTC | Os últimos sete dias, incluindo hoje | Não |
--to <date> | O dia seguinte ao último dia a incluir, no formato YYYY-MM-DD, em UTC. O intervalo pode ter no máximo 92 dias | Os últimos sete dias, incluindo hoje | Não |
spicyapi usage --from 2026-09-01 --to 2026-10-01Isso cobre setembro inteiro: --to é o primeiro dia que não entra. Deixe as duas opções de fora para ver os últimos sete dias, incluindo hoje.
Saída: from, to, currency, totalCalls, totalSpend, depois days (por dia: calls, succeeded, failed, spend) e models (os mesmos números por modelo). totalSpend só conta cobranças finais. days e models descrevem as mesmas tarefas de dois jeitos, então não some um com o outro. Para a conta inteira, e não só para uma chave, use a página Consumo do console.
Gratuito. Ele tem um limite de 30 chamadas por minuto, então use-o para conferir totais, não dentro de um loop.
tasks quote
O que faz: diz exatamente quanto uma geração custaria, sem iniciá-la e sem reservar dinheiro nenhum.
spicyapi tasks quote --model <model> --input-file <path>| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--model <model> | O ID exato do modelo | — | Sim |
--input-file <path> | Lê a entrada de um arquivo JSON. Use - para ler o que chegar ao comando por pipe | — | Esta ou --input-json |
--input-json <json> | Passa a entrada diretamente como texto JSON. Com --input-file, lidar com as aspas é mais fácil | — | Esta ou --input-file |
--callback-url <url> | O endereço de callback que você pretende usar, já que ele faz parte da requisição cotada | Nenhum | Não |
Saída: quoteId, model, estimatedCost, maxCharge, currency, quantity (por exemplo, o número de segundos cobrados), unit e expiresAt. Uma cotação vale por cinco minutos.
Gratuito e sem confirmação. Use-o para comparar modelos ou configurações. Você não precisa rodá-lo antes do tasks create, que pede a própria cotação.
tasks create
O que faz: inicia uma geração de imagem ou vídeo. Isto custa dinheiro. A CLI sempre mostra o preço e pergunta antes.
spicyapi tasks create --model <model> --input-file <path> [options]| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--model <model> | O ID exato do modelo | — | Sim |
--input-file <path> | Lê a entrada de um arquivo JSON. - lê o que chegar ao comando por pipe, o que também exige --yes | — | Esta ou --input-json |
--input-json <json> | Passa a entrada diretamente como texto JSON | — | Esta ou --input-file |
--wait | Fica esperando até a tarefa terminar e depois mostra o resultado | Desligada: mostra o ID da tarefa e retorna | Não |
--yes | Pula a pergunta de confirmação. Use só quando já souber o preço, normalmente em scripts | Desligada: pergunta | Não |
--idempotency-key <key> | Um nome para "esta geração específica". Rodar o comando de novo com a mesma chave em até 24 horas devolve a mesma tarefa em vez de criar outra. Até 128 caracteres | Uma chave aleatória nova a cada execução | Não |
--retention <duration> | Apaga a mídia gerada, o resultado armazenado, o prompt e os demais textos de entrada desta tarefa antes do prazo normal: 30m, 1h, 7d ou um número de segundos. Só serve para encurtar. 0 apaga tudo assim que a tarefa termina. Os registros de cobrança são sempre mantidos | A configuração da sua conta | Não |
--callback-url <url> | Um endereço público que começa com https:// e que a SpicyAPI chama quando a tarefa termina. http:// simples, localhost e endereços de rede privada são recusados. Só é útil se você tem um servidor; veja Webhooks | Nenhum | Não |
--poll-interval-ms <milliseconds> | Com --wait: confere a cada tantos milissegundos, de 100 a 60000 | Começa em 2 segundos e vai desacelerando até 10 segundos | Não |
--wait-timeout-ms <milliseconds> | Com --wait: para de esperar depois desse tempo, de 1 a 86400000. A tarefa continua rodando | 600000 (10 minutos) | Não |
O que acontece, em ordem:
- A CLI lê a sua entrada e confere se ela é um objeto JSON. Se você não informou nenhuma entrada, ela para aqui.
- Se ninguém puder responder a uma pergunta, por exemplo num script, e você não tiver passado
--yes, ela para aqui. - Ela pede uma cotação e mostra o custo estimado, a cobrança máxima, quando a cotação expira e a chave de idempotência.
- Ela pergunta
Continue? [y/N]. Sóyouyescontinua. A resposta padrão é não. - Ela cria a tarefa pelo preço cotado. O valor estimado é reservado do seu saldo, e esse valor é também o máximo que a tarefa pode custar.
- Sem
--wait, ela mostraidempotencyKey,taskId,state(queued),estimatedCostedeadlineAte retorna. Com--wait, ela mostra na horaAccepted: <task-id>e um comando de recuperação, espera e depois mostraidempotencyKey,acceptede ataskconcluída.
deadlineAt é o horário limite para a tarefa terminar antes de acabar como expired. Não é quando o seu link de download ou os seus arquivos expiram.
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitNo macOS e no Linux, você também pode passar a entrada direto no comando:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-json '{"prompt": "A paper lantern on a rainy street"}'Se a espera falhar, a tarefa continua rodando
Uma espera pode acabar antes da hora por causa do limite de tempo, de um problema de rede ou de um Ctrl + C. A tarefa em si segue em frente e é cobrada normalmente. A linha Accepted: impressa no início traz o ID dela; continue com spicyapi tasks wait <task-id>. Não rode simplesmente o mesmo comando de criação de novo sem --idempotency-key: isso inicia, e cobra, uma segunda geração.
Quando a espera falha com um erro (e não por um Ctrl + C), as últimas linhas repetem tudo o que você precisa, para que você não tenha que rolar a tela de volta até a linha 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 o erro for de um tipo com solução conhecida, como 429 ou um erro do servidor, vem em seguida uma linha Next:. Com --json, as mesmas informações ficam no objeto de erro, como taskId, idempotencyKey e recover.
tasks wait
O que faz: espera uma tarefa que você já iniciou, até ela terminar.
spicyapi tasks wait <task-id> [options]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
task-id | O ID da tarefa, como job_01k3m8x9q2z4v7n5p6r8s0t1w3 | — | Sim |
--poll-interval-ms <milliseconds> | Confere a cada tantos milissegundos, de 100 a 60000 | Começa em 2 segundos e vai desacelerando até 10 segundos | Não |
--wait-timeout-ms <milliseconds> | Para de esperar depois desse tempo, de 1 a 86400000 | 600000 (10 minutos) | Não |
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000Saída: a tarefa concluída, com os mesmos campos de tasks get, assim que o estado dela for succeeded, failed ou expired. Se a tarefa deu certo mas os arquivos ainda estão sendo copiados, ele espera mais um pouco.
Se o limite de tempo acabar, aparece Error: task … did not reach a terminal state within 600000ms. Isso não é uma falha: a tarefa continua rodando. Espere de novo, com um --wait-timeout-ms maior se precisar. Interromper uma espera nunca cancela uma tarefa. Gratuito.
tasks get
O que faz: mostra uma tarefa neste momento: o estado, o custo, os links do resultado e quando o conteúdo dela vai ser apagado.
spicyapi tasks get <task-id>| Argumento | O que faz | Padrão | Obrigatório |
|---|---|---|---|
task-id | O ID da tarefa | — | Sim |
Use a mesma chave de API que criou a tarefa: outra chave recebe "não encontrado".
Campos da saída:
| Campo | Significado |
|---|---|
state | queued (esperando para começar), running, succeeded, failed ou expired (o tempo acabou). Tarefas mais antigas também podem mostrar canceled |
output.assets | Os resultados. Cada um tem uma url (um link de download válido por cerca de 20 minutos), expiresAt (quando esse link para de funcionar), mime (o tipo do arquivo), informações de tamanho e uma key. pending: true quer dizer que o arquivo ainda está sendo copiado, então tente de novo em alguns segundos. unavailable: true quer dizer que ele não pode ser recuperado |
errorCode, errorMessage | Por que a tarefa falhou. Veja Erros |
cost, settled | A cobrança em USD. É definitiva quando settled é true |
input | As configurações que você enviou. Removidas quando acaba o prazo de retenção do seu prompt |
createdAt, completedAt, deadlineAt | Quando foi criada, quando terminou e o horário limite para terminar |
contentState | present (o conteúdo ainda está guardado), expired (removido pelas regras de retenção) ou purged (você apagou) |
retention | outputsExpireAt (quando os arquivos de resultado são apagados), promptsExpireAt (quando o texto do seu prompt é apagado) e source (qual configuração decidiu) |
sourceTaskId | Aparece quando esta tarefa é uma nova tentativa de outra tarefa |
A saída normal termina com um resumo em linguagem simples, como Outputs expire: … ou Content: Destroyed — you removed the outputs …. Cada chamada devolve links de download novos. Gratuito.
tasks list
O que faz: lista as tarefas criadas com a chave de API atual, uma página por vez.
spicyapi tasks list [options]| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--from <date> | O primeiro dia a incluir, YYYY-MM-DD em UTC | Uma janela de sete dias que termina hoje | Não |
--to <date> | O dia seguinte ao último dia a incluir, YYYY-MM-DD em UTC. O intervalo pode ter no máximo 92 dias | Veja acima | Não |
--state <state> | Só tarefas num estado: queued, running, succeeded, failed, canceled ou expired | Todos | Não |
--model <model> | Só tarefas de um ID de modelo exato | Todos | Não |
--limit <count> | Tarefas por página, de 1 a 100 | 20 | Não |
--cursor <cursor> | Continua a partir da página anterior, usando o valor nextCursor dela | Primeira página | Não |
spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --state failedSaída: items (cada um com taskId, model, state, cost, settled, createdAt, deadlineAt e completedAt), hasMore e nextCursor. Se hasMore for true, rode o mesmo comando de novo, com os mesmos --from e --to, acrescentando --cursor com o valor de nextCursor. A lista não traz links de download; use tasks get na tarefa que você quer. Gratuito.
tasks retry
O que faz: roda de novo uma tarefa failed ou expired, como uma tarefa nova, com um ID novo. Isto custa dinheiro.
spicyapi tasks retry <task-id> [options]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
task-id | A tarefa que falhou ou expirou e que vai rodar de novo | — | Sim |
--wait | Fica esperando até a tarefa nova terminar | Desligada | Não |
--yes | Pula a pergunta de confirmação | Desligada: pergunta | Não |
--idempotency-key <key> | Rodar a nova tentativa de novo com a mesma chave devolve a mesma tarefa nova em vez de criar mais uma | Uma chave aleatória nova a cada execução | Não |
--poll-interval-ms <milliseconds> | Com --wait: com que frequência conferir | Começa em 2 segundos e vai desacelerando até 10 segundos | Não |
--wait-timeout-ms <milliseconds> | Com --wait: para de esperar depois desse tempo | 600000 (10 minutos) | Não |
Ele pergunta Retry source task … Continue? [y/N]. Ao contrário do tasks create, ele não mostra o preço antes de perguntar. A tarefa nova é cobrada pelo preço atual do modelo, então, se o preço importa, confira antes com spicyapi models get <model>.
Saída: idempotencyKey, o novo taskId, sourceTaskId (a original), state, estimatedCost (o valor reservado) e deadlineAt.
- Só tarefas
failedeexpiredpodem ser repetidas, além dascanceledmais antigas. Para ter outra versão de um resultado que deu certo, usetasks create. - A entrada original é reaproveitada sem mudança, então uma nova tentativa só ajuda quando a falha foi temporária. Confira antes o
errorCode; veja Repetir uma tarefa que falhou e Erros. - Se a entrada apontava para um arquivo enviado que já expirou, a nova tentativa falha; envie o arquivo de novo e use
tasks create. - A nova tentativa mantém a configuração de retenção da tarefa original.
- Se o
tasks createperdeu a conexão antes de você ver um ID de tarefa, isso não é uma tarefa que falhou. Nesse caso, siga os passos de recuperação de Retomar uma tarefa depois que a espera foi interrompida.
tasks purge
O que faz: apaga de forma permanente a mídia gerada, o resultado armazenado (os dados do resultado que ficam guardados), o prompt e os demais textos de entrada de uma tarefa concluída, na hora, em vez de esperar que eles expirem.
spicyapi tasks purge <task-id> [--yes]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
task-id | Uma tarefa concluída: succeeded, failed, expired ou canceled | — | Sim |
--yes | Pula a pergunta de confirmação | Desligada: pergunta | Não |
Uma tarefa que ainda está queued ou running não pode passar por purge. Ela também não pode ser cancelada — não existe comando nem API de cancelamento —, então espere que ela termine com spicyapi tasks wait <task-id> e depois faça o purge.
Ele explica o que vai ser apagado e pede a sua confirmação, porque isso não pode ser desfeito. Baixe antes tudo o que quiser guardar.
Saída: taskId, contentState (purged), purgedAt, contentRemovedBy (user), billingRetained (sempre true) e mediaDeletionPending, seguidos de uma linha que diz o que foi destruído e avisa que a mídia armazenada é removida em cerca de um minuto. Se contentState ainda for present, nada foi removido desta vez; tente de novo mais tarde.
Gratuito, e não é reembolso: o lançamento no registro de cobrança, o valor cobrado, o modelo, o estado, os horários e o ID da requisição continuam registrados. Veja Retenção e destruição.
files upload
O que faz: envia um arquivo do seu computador, como a imagem inicial de uma geração de imagem para vídeo, e devolve um endereço spicy:// para colocar na sua entrada.
spicyapi files upload <path> [--content-type <type>]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
path | O arquivo a enviar | — | Sim |
--content-type <type> | O tipo do arquivo, quando não dá para descobri-lo pelo nome: image/jpeg, image/png, image/webp, image/gif, video/mp4, video/webm, audio/mpeg ou audio/wav | Detectado pela extensão | Não |
São aceitos imagens .jpg, .jpeg, .png, .webp e .gif de até 10 MiB, vídeos .mp4 e .webm e áudios .mp3 e .wav de até 90 MiB e 600 segundos. Um modelo pode definir limites próprios mais baixos.
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: 720Saída: copie o valor de uri, exatamente como aparece, para a configuração de arquivo do modelo, muitas vezes image_url. Ele pode ser usado até expiresAt, normalmente um dia. Depois disso, envie o arquivo de novo. O upload é gratuito.
files download-url
O que faz: cria um novo link de download para o resultado de uma tarefa concluída. Ele mostra o link; não salva o arquivo.
spicyapi files download-url <task-id> [--key <key>]| Argumento ou opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
task-id | Uma tarefa que deu certo | — | Sim |
--key <key> | Para qual resultado gerar o link, quando a tarefa produziu vários. Use o valor key de output.assets em tasks get | O primeiro resultado | Não |
Saída: key, url e expiresAt. O link funciona por cerca de 20 minutos; abra-o num navegador ou baixe com curl. Uma tarefa que ainda não deu certo responde "não encontrado". Se o arquivo ainda estiver sendo copiado, você recebe um erro de conflito; espere alguns segundos e tente de novo. Depois que os arquivos da tarefa foram apagados, não dá para gerar um link novo. Gratuito.
webhooks verify
O que faz: se você tem um servidor que recebe callbacks da SpicyAPI (veja --callback-url), este comando confere se um callback salvo é autêntico e não foi alterado. Ele roda inteiramente no seu computador e não precisa de chave de API.
spicyapi webhooks verify --body-file <path> --timestamp <seconds> --signature <base64> --payload-version <version>| Opção | O que faz | Padrão | Obrigatório |
|---|---|---|---|
--body-file <path> | Um arquivo com o corpo do callback exatamente como foi recebido, byte a byte | — | Sim |
--timestamp <seconds> | O valor do cabeçalho X-Webhook-Timestamp | — | Sim |
--signature <base64> | O valor do cabeçalho X-Webhook-Signature | — | Sim |
--payload-version <version> | O valor do cabeçalho X-Webhook-Payload-Version: 1 ou 2 | — | Sim |
--secret-env <name> | O nome da variável de ambiente que guarda a sua chave de assinatura de webhook. A chave em si nunca é digitada na linha de comando | SPICY_WEBHOOK_SECRET | Não |
--tolerance-seconds <seconds> | Quanto o horário pode se afastar do relógio do seu computador | 300 | Não |
Saída: em caso de sucesso, payload (o conteúdo do callback), payloadVersion, taskId, deliveryId (versão 2) e timestamp. Se algo não bater, ele mostra um erro e termina com código de saída diferente de zero. Gratuito.
Uma chave de assinatura é criada automaticamente quando você se cadastra, mas o valor dela nunca é mostrado. Para ter uma que você possa copiar, abra Webhooks no console e clique em Gerar (ou em Trocar, se já houver uma configurada). A chave nova aparece uma única vez. A troca vale na hora, sem período de transição: a chave antiga para de assinar imediatamente. Veja Webhooks.
Receitas comuns
Gerar uma imagem
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 --waitEscolha um ID no resultado do primeiro comando, monte o input.json com as configurações mostradas pelo segundo, depois rode o terceiro e confirme com y. O passo a passo em Seu primeiro resultado explica cada etapa.
Transformar uma imagem em vídeo
Encontre um modelo de imagem para vídeo e as configurações dele
spicyapi models list --modality video --task image-to-video --json
spicyapi models get MODEL_ID_FROM_CATALOG --jsonEm inputSchema, encontre a configuração da imagem inicial (normalmente image_url), a da duração (normalmente duration_seconds) e o que estiver em required.
Envie a sua imagem
spicyapi files upload ./start-frame.jpgCopie o valor de uri, que começa com spicy://.
Escreva a entrada
Crie o input.json como em Seu primeiro resultado, usando os nomes de configuração do modelo e o seu próprio uri:
{
"prompt": "Slow push-in, rain running down the window",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"duration_seconds": 5
}Confira o preço e depois gere
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 1800000Vídeos costumam ser cobrados por segundo, então a duração que você escolhe muda o preço. Vídeos podem levar vários minutos, por isso este exemplo espera até 30 minutos em vez dos 10 padrão. Baixe o .mp4 pela url, como em Seu primeiro resultado.
A imagem enviada pode ser usada por um dia. Depois disso, envie-a de novo.
Retomar uma tarefa depois que a espera foi interrompida
Uma tarefa continua rodando mesmo que o terminal feche, a rede caia, o computador entre em repouso ou a espera estoure o tempo. O jeito de voltar a ela depende do que você viu:
-
Você viu
Accepted: job_…, ou uma linhaRecover:abaixo do erro. Você tem o ID da tarefa. Espere de novo, ou só dê uma olhada nela:spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3 -
Você só viu a linha
Idempotency-Key:, por exemplo porque a conexão caiu enquanto a tarefa estava sendo criada. Rode o mesmo comando de novo, com o mesmo modelo e a mesma entrada, e acrescente essa chave:spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241 --waitA CLI mostra o preço e pergunta de novo, mas, se a primeira tentativa tiver sido aceita, a SpicyAPI devolve essa mesma tarefa em vez de iniciar e cobrar uma segunda. Isso funciona por 24 horas com a mesma chave de API. Se a primeira tentativa nunca chegou, a tarefa é criada agora, uma única vez.
-
Você não tem nenhum dos dois. Liste as suas tarefas recentes e encontre a certa pelo horário e pelo modelo:
spicyapi --json tasks list --limit 10
Repetir uma tarefa que falhou
Primeiro, descubra por que ela falhou:
spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Depois leia o errorCode. Tarefas que falham ou expiram normalmente liberam toda a reserva. Algumas recusas de conteúdo são cobradas pelo orçamento aceito, somente quando a página do modelo informa explicitamente essa exceção. Confira settled e cost para saber o valor final. O tasks retry envia a mesma entrada de novo, então só ajuda quando a causa foi temporária:
errorCode | O que fazer |
|---|---|
rate_limited, upstream_unavailable, timeout, upstream_failed | Espere um pouco e tente de novo uma vez. Se falhar de novo, pare de tentar: no caso de timeout, experimente uma duração menor ou uma resolução mais baixa com tasks create |
generation_failed | Não repita. Mude o prompt ou a imagem e use tasks create: a mesma entrada costuma falhar do mesmo jeito |
invalid_asset | Não repita, porque a nova tentativa reaproveita o arquivo antigo. Envie o arquivo de novo e use tasks create com o uri novo |
invalid_request, unsupported_combination | Não repita sem mudar nada. Mude as configurações e use tasks create |
content_rejected | Não repita sem mudar nada. O modelo recusou esta requisição: mude o prompt ou escolha outro modelo e use tasks create |
A lista completa está em Erros.
Quando fizer sentido tentar de novo, rode a nova tentativa. Ela cria, e cobra, uma tarefa nova:
spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --waitExportar o seu consumo
Salve num arquivo um mês de consumo da chave atual:
spicyapi --json usage --from 2026-09-01 --to 2026-10-01 > usage-2026-09.jsonO arquivo traz os totais por dia e por modelo. Para uma lista tarefa por tarefa, salve spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --limit 100 do mesmo jeito, seguindo o nextCursor enquanto hasMore for true. Os números da conta inteira e as faturas ficam no console.
Rodar a CLI a partir de um script
Num script, ninguém pode responder a Continue? [y/N], então os comandos que cobram se recusam a rodar, a não ser que você acrescente --yes. Quando fizer isso:
- peça a cotação antes e confira o preço no script;
- dê a cada geração a sua própria
--idempotency-keyfixa, comoposter-2026-09-17-v1, para que rodar o script duas vezes não cobre duas vezes; - acrescente
--jsone leia ostateno resultado: um comando que termina com código de saída0não produziu necessariamente uma tarefa bem-sucedida; - defina limites de gasto na chave, no console.
spicyapi --json tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key poster-2026-09-17-v1 --yes --wait > result.jsonCustos, confirmação e segurança
Quais comandos custam dinheiro. Só tasks create e tasks retry. Os preços são em dólares americanos. Pedir cotação, listar, conferir, enviar, baixar e apagar são gratuitos.
Ver o preço antes. O tasks quote calcula o preço de uma requisição sem iniciar nada. O tasks create pede a própria cotação e mostra Estimated charge e maximum charge antes de perguntar. Quando a tarefa é aceita, o valor estimado fica reservado (held) e é também o máximo que pode ser cobrado de você. Quando a tarefa dá certo, você paga pelo que foi realmente produzido, nunca acima desse valor, e o que sobrar volta para o seu saldo.
A confirmação. Continue? [y/N] quer dizer que a resposta é não, a menos que você digite y. O --yes responde por você, então use-o só quando já souber o preço. Se a CLI rodar num lugar em que não consegue perguntar, como um script ou com uma entrada recebida por pipe, e não houver --yes, ela se recusa em vez de presumir um sim. O tasks purge pergunta do mesmo jeito, porque apagar não pode ser desfeito. O tasks retry também pergunta, mas não mostra o preço antes.
A chave de idempotência, em palavras simples. É um rótulo para uma geração, como um número de pedido. Todo tasks create e todo tasks retry mostram uma. Se a sua internet cair e você não tiver certeza de que a geração começou, rode o mesmo comando de novo com --idempotency-key e o valor mostrado: você recebe de volta a tarefa original e não é cobrado duas vezes. O rótulo vale por 24 horas com a mesma chave de API. Não o reaproveite para outra geração: a mesma chave com uma entrada diferente é recusada.
Sem cancelamento. Depois de aceita, uma tarefa não pode ser cancelada. Ctrl + C, fechar o terminal ou revogar a chave só interrompe a espera; a tarefa termina e é cobrada normalmente.
Tarefas que falham ou expiram normalmente liberam toda a reserva. Algumas recusas de conteúdo são cobradas pelo orçamento aceito, somente quando a página do modelo informa explicitamente essa exceção. Confira settled e cost para saber o valor final.
Baixe o que quiser guardar. Os arquivos de resultado ficam guardados por no máximo cerca de 14 dias, ou menos, se a sua conta ou o --retention definirem assim, e depois são apagados para sempre. Os links de download duram cerca de 20 minutos, mas você sempre pode pedir um novo enquanto o arquivo existir. Os arquivos enviados podem ser usados por um dia. Por padrão, o texto do prompt é apagado depois de 30 dias. Os registros de cobrança são mantidos. Veja Retenção e destruição.
Limites de gasto. Cada chave pode ter limites diário, mensal e acumulado, definidos na página Chaves de API. Chaves novas não têm limite até que você defina um. Uma tarefa que ultrapassaria um limite é recusada antes de começar.
A sua chave. A CLI só lê a chave de SPICY_API_KEY, nunca a imprime e, nas dicas de erro, mostra no máximo os nove primeiros caracteres dela (sk-spicy-).
Mais detalhes: Cobrança, Idempotência, Execução e novas tentativas.
Solução de problemas
Procure a mensagem que você está vendo. Os erros da SpicyAPI terminam com (request req_…); informe esse valor se falar com o suporte, mas nunca envie a sua chave.
Todos os códigos de erro são explicados em Erros, e os passos de recuperação estão em Solução de problemas e recuperação.
Código-fonte
O pacote tem licença MIT e é desenvolvido abertamente em github.com/spicyapi-ai/spicy-cli. É lá que você lê o código por trás de qualquer comando desta página, relata um comportamento diferente do descrito aqui ou propõe uma mudança.
Próximos passos
Catálogo de modelos e schemas
Como funcionam o catálogo atual e as configurações de cada modelo
Cobrança
Preços, o que fica reservado, limites de gasto e faturas
Retenção e destruição
Por quanto tempo arquivos e prompts ficam guardados e como apagá-los antes
Erros
Todos os códigos de erro e se vale a pena tentar de novo
SDK para TypeScript
Faça as mesmas coisas a partir do seu próprio código JavaScript ou TypeScript
SDK para Python
Faça as mesmas coisas a partir do seu próprio código Python
SDK para Go
Faça as mesmas coisas a partir do seu próprio código Go
Servidor MCP
Deixe um assistente de programação com IA executar estes passos, com confirmação antes de gastar
Agent Skill
Ensine a um agente de IA o fluxo seguro da SpicyAPI
Início rápido
O mesmo fluxo usando diretamente a API HTTP
Agentes e automação
Qual ferramenta oficial usar e um roteiro de produção para agentes de IA, workers de backend e pipelines de mídia repetíveis.
Servidor MCP
Conecte Claude, Cursor, VS Code e outros assistentes de IA à SpicyAPI e depois explore modelos, compare preços, gere mídia e busque resultados conversando, com cada passo pago confirmado por você.

