Herramienta de línea de comandos (CLI)
Usa el comando spicyapi para explorar modelos, consultar precios, generar imágenes y videos y descargar los resultados desde una terminal, sin escribir código.
Qué es la CLI
spicyapi es un pequeño programa que se ejecuta en una terminal, la ventana en la que escribes comandos en lugar de hacer clic en botones. Cada comando hace una sola cosa: listar los modelos que puede usar tu cuenta, decirte cuánto costará una generación, iniciar una generación de imagen o de video, esperar a que termine y darte un enlace para descargar el resultado.
No escribes ni una línea de código. Escribes un comando, pulsas Enter y lees la respuesta.
Te viene bien si quieres:
- probar modelos y comparar precios antes de que nadie escriba una integración;
- generar imágenes o videos desde tu propio equipo y guardar los archivos;
- repetir el mismo tipo de generación sin tener que pasar cada vez por una página;
- revisar los ajustes exactos de un modelo antes de construir algo sobre él.
La CLI se ocupa de la generación de imágenes y videos. Los modelos de texto y de chat se llaman a través de los endpoints compatibles con chat que se describen en Texto y streaming.
Hay otras tres herramientas oficiales. Elige la CLI si quieres escribir los comandos tú mismo:
| Herramienta | Elígela cuando |
|---|---|
| SDK | Estás escribiendo un programa en JavaScript o TypeScript que llama a SpicyAPI |
| Servidor MCP | Quieres que un asistente de programación con IA haga estos mismos pasos por ti |
| Agent Skill | Quieres enseñar a un agente de IA la forma segura de usar SpicyAPI |
¿Escribes en otro lenguaje? También hay SDK oficiales para Python, Go, PHP y Java.
Nada de esta página gasta dinero por accidente
Solo dos comandos pueden costar dinero: tasks create y tasks retry. Los dos se detienen y te preguntan antes de cobrar nada. Todos los demás son gratuitos y puedes ejecutarlos tantas veces como quieras.
Qué puedes hacer
| Quiero… | Comando | ¿Cuesta dinero? | ¿Necesita clave de API? |
|---|---|---|---|
| Comprobar que SpicyAPI responde | spicyapi status | No | No |
| Buscar en esta documentación | spicyapi docs search <words> | No | No |
| Ver qué modelos puedo usar y sus precios | spicyapi models list | No | Sí |
| Ver qué ajustes acepta un modelo | spicyapi models get <model> | No | Sí |
| Consultar mi saldo | spicyapi balance | No | Sí |
| Ver cuánto ha gastado una clave | spicyapi usage | No | Sí |
| Saber el precio exacto de una generación sin iniciarla | spicyapi tasks quote | No | Sí |
| Iniciar una generación de imagen o de video | spicyapi tasks create | Sí, después de preguntarte | Sí |
| Esperar a que termine una generación | spicyapi tasks wait <task-id> | No | Sí |
| Ver una generación y los enlaces a su resultado | spicyapi tasks get <task-id> | No | Sí |
| Listar mis generaciones recientes | spicyapi tasks list | No | Sí |
| Volver a ejecutar una generación que falló | spicyapi tasks retry <task-id> | Sí, después de preguntarte | Sí |
| Borrar para siempre los archivos y el prompt de una generación | spicyapi tasks purge <task-id> | No, y no se reembolsa nada | Sí |
| Subir una imagen, un video o un audio para usarlo como entrada | spicyapi files upload <path> | No | Sí |
| Obtener un enlace de descarga nuevo para un resultado | spicyapi files download-url <task-id> | No | Sí |
| Comprobar que un callback viene de verdad de SpicyAPI | spicyapi webhooks verify | No | No, usa tu clave de firma de webhooks |
En los comandos de arriba, una palabra entre ángulos como <task-id> significa «pon aquí tu propio valor», sin los ángulos.
Antes de empezar
Necesitas cuatro cosas: una terminal, Node.js, una clave de API y una forma de ejecutar la CLI. La primera vez lleva unos diez minutos.
Abre una terminal
Una terminal es una ventana de texto para ejecutar comandos. Todo lo que aparece en esta página se escribe o se pega ahí y se ejecuta con Enter.
Pulsa Cmd + Espacio, escribe Terminal y pulsa Enter. Se abre una ventana con una línea que termina en % o $: ahí es donde se escribe. Para pegar, usa Cmd + V.
Instala Node.js 22.13 o posterior
La CLI funciona sobre Node.js, un programa gratuito. Comprueba si ya lo tienes:
node -vSi muestra v22.13.0 o un número mayor, como v22.14.0 o v24.4.1, ya está todo listo. Si muestra un número menor, o dice command not found o is not recognized:
- Entra en nodejs.org, abre la página de descargas y elige la versión LTS para tu sistema.
- Ejecuta el instalador y acepta las opciones predeterminadas.
- Cierra la terminal y abre una nueva, y vuelve a ejecutar
node -v.
Node.js incluye npm y npx, las dos utilidades que se usan en el último paso.
Crea una clave de API
La clave de API es lo que le permite a SpicyAPI saber que la solicitud viene de tu cuenta.
- Crea una cuenta en spicyapi.ai/register. Las cuentas pueden abrirse por tandas; si el registro todavía no está abierto para ti, apúntate a la lista de espera.
- Añade saldo en Facturación, en la consola. Las generaciones se pagan con tu saldo, en dólares estadounidenses.
- Abre Claves de API y haz clic en Crear clave. Ponle un nombre que vayas a reconocer más adelante, como
my laptop. Solo el nombre es obligatorio. - Copia la clave en ese mismo momento. Empieza por
sk-spicy-y solo se muestra una vez. También puedes usar Guardar como archivo.
Las claves nuevas no tienen límite de gasto a menos que fijes uno. Un límite diario evita que un error o una clave filtrada generen una factura grande, y puedes cambiarlo más adelante en la misma página.
Trata la clave como una contraseña
Cualquiera que tenga tu clave puede gastar tu saldo. No la envíes por chat ni por correo, no la muestres en una captura de pantalla ni en una solicitud de soporte, y no la guardes nunca en una carpeta de proyecto que vaya a Git o a GitHub. Si se filtra, revócala en la página Claves de API y crea una nueva.
Guarda la clave en SPICY_API_KEY
La CLI no tiene comando de inicio de sesión y nunca recibe la clave como opción de un comando. Lee una variable de entorno llamada SPICY_API_KEY: un valor con nombre que tu terminal entrega a los programas que ejecuta.
Solo para la ventana actual (se pierde al cerrar la ventana):
export SPICY_API_KEY="sk-spicy-paste-your-key-here"De forma permanente, añade esa misma línea export al final del archivo de arranque de tu shell, que se ejecuta cada vez que abres una terminal. En macOS el archivo es ~/.zshrc; en la mayoría de los sistemas Linux es ~/.bashrc.
nano ~/.zshrcPega la línea export al final, pulsa Ctrl + O y luego Enter para guardar, y Ctrl + X para salir. En Linux, usa nano ~/.bashrc en su lugar. Abre una ventana de terminal nueva para que el cambio surta efecto.
Comprueba que está configurada, sin mostrar la clave entera:
echo "${SPICY_API_KEY:0:9}"Debería mostrar sk-spicy-.
Dónde puede estar la clave y dónde no
El archivo de arranque de tu shell y la configuración de tu cuenta de Windows se quedan en este equipo, y eso está bien para un uso personal. No pongas nunca la clave en un archivo dentro de un proyecto, no la subas nunca al repositorio y no la pegues nunca en un documento compartido. Las terminales también recuerdan los comandos que escribes, así que en un equipo compartido es mejor usar el archivo de arranque o el cuadro de configuración de Windows que escribir la clave dentro de un comando.
Elige cómo ejecutar la CLI
Hay dos formas, y los comandos son los mismos.
npx descarga la CLI cuando hace falta y la ejecuta:
npx @spicyapi/cli statusLa primera vez, npm pregunta Need to install the following packages: @spicyapi/cli@… Ok to proceed? (y). Pulsa y y luego Enter.
Con este método, escribe npx @spicyapi/cli donde esta página dice spicyapi. Por ejemplo, spicyapi models list pasa a ser npx @spicyapi/cli models list.
Tu primer resultado
Este recorrido genera una imagen y la descarga. Cada paso muestra el comando, más o menos lo que vas a ver y lo que acaba de pasar. Tus números, IDs y horas serán distintos.
Sustituye MODEL_ID_FROM_CATALOG por un ID de modelo real
MODEL_ID_FROM_CATALOG es un marcador, no un modelo. El paso 3 explica cómo elegir un ID real del catálogo en vivo (live catalog): spicyapi models list, la misma lista que GET /api/v1/models. Pega tu ID en todos los sitios de esta página donde aparece el marcador. Si envías el propio marcador, solo recibirás un error de «not found».
Comprueba la conexión
spicyapi statusSpicyAPI is reachable — api.spicyapi.ai answered in 523 ms.Qué ha pasado: la CLI le preguntó a SpicyAPI si está en marcha. No necesita clave y no cuesta nada. Si ves «could not be reached», revisa tu conexión a internet o tu proxy; consulta Solución de problemas.
Consulta tu saldo
spicyapi balanceavailable: 12.34
held: 0.06
total: 12.40Qué ha pasado: este es el primer comando que usa tu clave. Los importes están en dólares estadounidenses. available es lo que puedes gastar ahora, held es lo que está retenido para generaciones que todavía están en marcha, y total es la suma de los dos. También puede aparecer una línea funding que desglosa el saldo en fondos prepagados y bonos promocionales.
Si ves Error: SPICY_API_KEY is required for authenticated API operations, la clave no está configurada en esta ventana de terminal. La línea Next: que aparece debajo explica cómo configurarla; consulta también Antes de empezar.
Elige un 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 ejemplo está recortado: la lista real tiene más modelos y más campos.
Qué ha pasado: la CLI obtuvo los modelos que tu cuenta puede llamar hoy, con tus precios. Elige uno que tenga enabled y available en true, y copia su valor model, por ejemplo seleccionándolo con el ratón. Ese valor es el ID de modelo. Los IDs tienen la forma maker/model/task.
priceestá en dólares estadounidenses porunit:per_image(por imagen),per_second(por segundo de video),per_request(por solicitud) oper_1k_tokens(por cada mil tokens).- Si hay varias entradas en
pricing, el precio depende de tus ajustes, por ejemplo de la resolución. - Para encontrar un modelo por su nombre, añade
--searchy una parte del nombre.
--json muestra la lista como JSON legible y sangrado. Sin esa opción, la lista entera sale apretada en una sola línea muy larga.
Mira qué ajustes acepta ese modelo
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
}
}Qué ha pasado: inputSchema es la lista de ajustes del modelo, lo que en el resto de esta página llamamos la entrada.
requiredenumera los ajustes que tienes que enviar. Aquí, soloprompt.propertiesenumera todos los ajustes que acepta el modelo, y no se admite nada más: con un solo nombre desconocido o mal escrito se rechaza la solicitud entera.enumenumera los únicos valores permitidos para ese ajuste.
Cada modelo tiene sus propios ajustes, así que léelos siempre para el modelo que hayas elegido. Si quieres entradas ya hechas que el servidor ha comprobado, ejecuta spicyapi models list --search <name> --include-examples --json y mira examples.
Escribe tu entrada en un archivo
Pon la entrada en un archivo llamado input.json, en la carpeta en la que está tu terminal. Con un archivo te ahorras problemas de comillas, sobre todo en Windows.
Pega las tres líneas de una vez:
cat > input.json <<'EOF'
{"prompt": "A paper lantern glowing on a rainy street at night, cinematic light"}
EOFQué ha pasado: has descrito lo que quieres generar, usando los nombres de ajustes del paso anterior. Las comillas tienen que ser comillas rectas normales ("), no tipográficas.
Consulta el precio
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:00ZQué ha pasado: SpicyAPI calculó el precio de esta solicitud exacta. No se inició nada ni se cobró nada. estimatedCost es lo que se espera que cueste y maxCharge es lo máximo que puede costar. Este paso es opcional: el siguiente comando vuelve a obtener el precio y te lo muestra antes de gastar nada.
Inicia la generación y espera a que termine
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitPrimero, la CLI muestra el precio y te pide que confirmes:
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]Escribe y y pulsa Enter. Cualquier otra respuesta cancela, y no se cobra nada. Responde en menos de cinco minutos, antes de que caduque la cotización.
En cuanto SpicyAPI acepta el trabajo, la CLI muestra su ID de tarea:
Accepted: job_01k3m8x9q2z4v7n5p6r8s0t1w3
If waiting is interrupted: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Las imágenes suelen tardar segundos y los videos, minutos. Cuando termina, aparece el resultado:
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,…}Qué ha pasado: después de tu y, SpicyAPI aceptó la generación, que a partir de ese momento se llama tarea, y retuvo de tu saldo el importe estimado. Después, la CLI consultó la tarea cada pocos segundos hasta que terminó. En la última línea, busca "state":"succeeded" y la "url" dentro de output. cost es el cargo definitivo cuando settled vale true. Si prefieres ver el resultado repartido en varias líneas legibles, añade --json al comando.
Cerrar la ventana no cancela la tarea
Una vez aceptada, una tarea siempre se ejecuta hasta el final y se cobra con normalidad. Pulsar Ctrl + C o cerrar la terminal solo detiene la espera. Guarda el ID de tarea y retómala con spicyapi tasks wait <task-id>; consulta Retomar una tarea después de que se interrumpiera la espera.
Descarga el resultado
La url es un enlace de descarga directa que funciona durante unos 20 minutos y no necesita clave. Pégala en un navegador y guarda el archivo, o descárgalo desde la terminal (deja las comillas, porque el enlace contiene caracteres &):
curl -L -o result.png "PASTE_THE_URL_HERE"Usa la extensión de archivo que corresponda a mime: .png para image/png, .jpg para image/jpeg, .mp4 para video/mp4.
Si el enlace ha caducado, pide uno nuevo con spicyapi files download-url <task-id>, o ejecuta spicyapi tasks get <task-id>, que devuelve enlaces nuevos.
Qué ha pasado: has copiado el resultado en tu propio equipo. Hazlo pronto: SpicyAPI guarda los archivos generados como máximo unos 14 días (menos si tu cuenta tiene un plazo más corto) y después los borra para siempre. Consulta Conservación y destrucción.
Cómo leer la salida
- La salida normal muestra un
name: valuepor línea. Los valores que tienen varias partes, comooutputoretention, se muestran como JSON en una sola línea. --jsonmuestra la respuesta completa como JSON sangrado. Funciona con todos los comandos, antes o después del nombre del comando:spicyapi --json balanceyspicyapi balance --jsonson lo mismo.- Los resultados van a la salida normal de la pantalla y los mensajes, a la salida de errores. Los precios, la clave de idempotencia, las líneas
Accepted:y los errores son mensajes. Por esospicyapi --json tasks get <task-id> > task.jsonguarda entask.jsonsolo el resultado, mientras que los mensajes siguen apareciendo en pantalla. - Los errores tienen la forma
Error: <what went wrong> (request req_…), normalmente seguida de una líneaNext:que dice qué hacer. Con--json, un error es un objeto JSON de una sola línea conerror,type,status,codeyrequestId, sin líneaNext:. Cuando no hay clave configurada,typeesMissingApiKeyError. Si contactas con soporte, indica el valorreq_…. - El dinero es un importe en dólares estadounidenses escrito como texto normal, sin el signo
$, por ejemplo0.03. - Las horas están en UTC. La
Zdel final de2026-09-17T08:05:00Zsignifica UTC. - El código de salida es
0cuando un comando sale bien y distinto de0cuando falla, algo que los scripts pueden comprobar.
Referencia de comandos
Todos los comandos traen su propia ayuda: añade --help, por ejemplo spicyapi tasks create --help.
Opciones globales y variables de entorno
Estas opciones funcionan con todos los comandos.
| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--json | Muestra el resultado completo como JSON | Desactivada | No |
--timeout-ms <milliseconds> | Cuánto tiempo esperar una respuesta de SpicyAPI antes de rendirse, de 1 a 120000 | 30000 (30 segundos) | No |
--max-retries <count> | Cuántas veces reintentar automáticamente tras un error de red, un 429 o un error del servidor, en las solicitudes que se pueden repetir sin riesgo, de 0 a 5 | 2 | No |
--api-base-url <url> | Envía las solicitudes de la API a otra dirección. Normalmente no te hará falta nunca | https://api.spicyapi.ai/api/v1 | No |
--service-base-url <url> | La dirección que comprueba status. Normalmente no te hará falta nunca | https://api.spicyapi.ai | No |
-V, --version | Muestra la versión de la CLI | — | No |
-h, --help | Muestra la ayuda del comando | — | No |
| Variable de entorno | Para qué sirve |
|---|---|
SPICY_API_KEY | Tu clave de API. La necesitan todos los comandos salvo status, docs search y webhooks verify |
SPICY_WEBHOOK_SECRET | Tu clave de firma de webhooks, que lee webhooks verify |
SPICY_API_BASE_URL, SPICY_SERVICE_BASE_URL | Lo mismo que las dos opciones de dirección de arriba. Las direcciones tienen que usar https:// |
status
Qué hace: comprueba si SpicyAPI está en marcha y si se puede llegar a él desde tu equipo.
spicyapi statusSin opciones. No necesita clave. Gratuito.
Salida: una frase. SpicyAPI is reachable — … answered in … ms. significa que todo va bien. could not be reached significa que tu equipo no recibió respuesta: revisa tu red o tu proxy. is not healthy o reports it is not ready indican un problema por nuestra parte; las incidencias en curso aparecen en status.spicyapi.ai.
Con --json ves las comprobaciones en bruto. La respuesta que importa es operational: true; una entrada readiness con estado 404 es normal en la dirección pública.
docs search
Qué hace: encuentra la página de documentación sobre un tema. Busca en un pequeño índice incluido en la CLI, así que funciona sin clave y sin llamar a SpicyAPI. Cada resultado enlaza a la página de este sitio de documentación, docs.spicyapi.ai.
spicyapi docs search [words] [--limit <count>]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
words | Las palabras que buscar. Si lo omites, lista páginas | Vacío | No |
--limit <count> | Número máximo de resultados, de 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/retentionCuando hay varios resultados, se muestran uno detrás de otro y cada uno empieza por slug:. Si no hay coincidencias, lo indica y aun así termina con código de salida 0:
No documentation matched "refnd". Try fewer or different words, or run `spicyapi docs search` without words to browse pages.Con --json, cuando no hay coincidencias se muestra una lista vacía, []. Gratuito.
models list
Qué hace: lista los modelos que tu cuenta puede llamar hoy, con los precios que paga tu cuenta.
spicyapi models list [options]| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--modality <type> | Solo modelos de image, video o text. La opción también acepta audio, pero hoy no se ofrece ningún modelo de audio | Todos | No |
--task <task> | Solo un tipo de trabajo, como text-to-image, edit, image-to-video, text-to-video o reference-to-video | Todos | No |
--provider <name> | Solo modelos de un creador de modelos, la empresa o el laboratorio que creó el modelo. Tiene que coincidir exactamente con el valor de provider | Todos | No |
--search <text> | Solo modelos cuyo ID o nombre visible contiene este texto, sin distinguir mayúsculas y minúsculas | Ninguno | No |
--include-schema | Añade los ajustes completos de cada modelo (inputSchema). La salida es mucho más grande | Desactivada | No |
--include-examples | Añade entradas de ejemplo ya hechas que el servidor ha comprobado (examples) | Desactivada | No |
spicyapi models list --modality video --task image-to-video --jsonSalida: total e items. Usa --json, porque sin esa opción todos los elementos se muestran en una sola línea. Los campos más útiles de cada elemento:
| Campo | Significado |
|---|---|
model | El ID de modelo que se usa en los demás comandos |
displayName, provider, modality, tasks | Nombre, creador del modelo, tipo de resultado y tipo de trabajo |
enabled, available | Usa modelos que tengan los dos en true |
pricing | Una entrada por nivel de precio: variant (por ejemplo, una resolución), unit, price en USD, y además regularPrice y offerLabel cuando hay un descuento |
taskTimeoutSeconds | Cuánto tiempo puede durar una generación antes de terminar como expired |
maxOutputDurationSeconds | La duración máxima de video que admite este modelo, cuando tiene una |
Gratuito. La lista de modelos cuenta para el límite de solicitudes de tu cuenta, así que no hace falta ejecutarla antes de cada generación.
models get
Qué hace: muestra un modelo completo, incluidos los ajustes que acepta.
spicyapi models get <model>| Argumento | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
model | El ID de modelo exacto. Las barras que contiene pueden quedarse tal cual | — | Sí |
spicyapi models get MODEL_ID_FROM_CATALOG --jsonSalida: los mismos campos que models list, más inputSchema. En inputSchema, lee required (los ajustes que tienes que enviar), properties (todos los ajustes permitidos y su tipo), enum (los únicos valores permitidos), minimum y maximum (límites numéricos) y default (el valor que se usa si omites el ajuste). Las entradas llamadas x-ui son pistas para construir formularios; puedes ignorarlas. Gratuito.
balance
Qué hace: muestra cuánto dinero hay disponible en tu cuenta.
spicyapi balanceSin opciones. Gratuito.
Salida: available (lo que puedes gastar ahora), held (lo retenido para tareas que todavía están en marcha) y total, todo en dólares estadounidenses. También puede incluir funding, que divide el saldo en fondos prepagados y bonos promocionales, con la fecha en que caducan los bonos y los modelos que pagan. No hace falta consultar el saldo antes de cada generación: tasks create lo comprueba por ti.
usage
Qué hace: muestra cuántas generaciones ejecutó la clave de API actual y cuánto costaron, agrupadas por día y por modelo.
spicyapi usage [--from <date>] [--to <date>]| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--from <date> | Primer día que se incluye, como YYYY-MM-DD en UTC | Los últimos siete días, hoy incluido | No |
--to <date> | El día siguiente al último día que se incluye, como YYYY-MM-DD en UTC. El intervalo puede ser de 92 días como máximo | Los últimos siete días, hoy incluido | No |
spicyapi usage --from 2026-09-01 --to 2026-10-01Esto abarca todo septiembre: --to es el primer día que no se incluye. Omite las dos opciones para ver los últimos siete días, hoy incluido.
Salida: from, to, currency, totalCalls, totalSpend, y después days (por día: calls, succeeded, failed, spend) y models (las mismas cifras por modelo). totalSpend solo cuenta los cargos definitivos. days y models describen las mismas tareas de dos maneras, así que no los sumes. Para ver toda tu cuenta y no solo una clave, usa la página Consumo de la consola.
Gratuito. Está limitado a 30 llamadas por minuto, así que úsalo para consultar totales, no dentro de un bucle.
tasks quote
Qué hace: te dice exactamente cuánto costaría una generación, sin iniciarla y sin retener dinero.
spicyapi tasks quote --model <model> --input-file <path>| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--model <model> | El ID de modelo exacto | — | Sí |
--input-file <path> | Lee la entrada de un archivo JSON. Usa - para leerla de lo que se le pasa al comando por una tubería | — | Usa esta o --input-json |
--input-json <json> | Da la entrada directamente como texto JSON. Las comillas son más fáciles con --input-file | — | Usa esta o --input-file |
--callback-url <url> | La dirección de callback que piensas usar, porque forma parte de la solicitud cotizada | Ninguna | No |
Salida: quoteId, model, estimatedCost, maxCharge, currency, quantity (por ejemplo, el número de segundos que se cobran), unit y expiresAt. Una cotización es válida durante cinco minutos.
Gratuito y sin confirmación. Úsalo para comparar modelos o ajustes. No tienes por qué ejecutarlo antes de tasks create, que obtiene su propia cotización.
tasks create
Qué hace: inicia una generación de imagen o de video. Esto cuesta dinero. La CLI siempre muestra el precio y pregunta antes.
spicyapi tasks create --model <model> --input-file <path> [options]| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--model <model> | El ID de modelo exacto | — | Sí |
--input-file <path> | Lee la entrada de un archivo JSON. - la lee de lo que se le pasa al comando por una tubería, y en ese caso también hace falta --yes | — | Usa esta o --input-json |
--input-json <json> | Da la entrada directamente como texto JSON | — | Usa esta o --input-file |
--wait | Se queda esperando hasta que la tarea termina y después muestra el resultado | Desactivada: muestra el ID de tarea y vuelve | No |
--yes | Se salta la pregunta de confirmación. Úsala solo cuando ya conozcas el precio, normalmente en scripts | Desactivada: pregunta | No |
--idempotency-key <key> | Un nombre para «esta generación concreta». Si vuelves a ejecutar el comando con la misma clave en menos de 24 horas, recibes la misma tarea en lugar de una nueva. Hasta 128 caracteres | Una clave aleatoria nueva en cada ejecución | No |
--retention <duration> | Borra antes de lo habitual los medios generados, el resultado, el prompt y el resto del texto de entrada de esta tarea: 30m, 1h, 7d o un número de segundos. Solo puede acortar el plazo. 0 los borra en cuanto termina la tarea. Los registros de facturación se conservan siempre | El ajuste de tu cuenta | No |
--callback-url <url> | Una dirección pública que empiece por https:// a la que SpicyAPI llama cuando la tarea termina. Se rechazan las direcciones http:// sin cifrar, localhost y las de redes privadas. Solo tiene sentido si tienes un servidor; consulta Webhooks | Ninguna | No |
--poll-interval-ms <milliseconds> | Con --wait: consulta cada tantos milisegundos, de 100 a 60000 | Empieza en 2 segundos y se va espaciando hasta 10 segundos | No |
--wait-timeout-ms <milliseconds> | Con --wait: deja de esperar pasado este tiempo, de 1 a 86400000. La tarea sigue en marcha | 600000 (10 minutos) | No |
Qué pasa, por orden:
- La CLI lee tu entrada y comprueba que es un objeto JSON. Si no has dado ninguna entrada, se detiene aquí.
- Si nadie puede responder a una pregunta, por ejemplo en un script, y no has pasado
--yes, se detiene aquí. - Obtiene una cotización y muestra el cargo estimado, el cargo máximo, cuándo caduca la cotización y la clave de idempotencia.
- Pregunta
Continue? [y/N]. Soloyoyescontinúan. La respuesta predeterminada es no. - Crea la tarea al precio cotizado. El importe estimado se retiene de tu saldo, y ese importe es también lo máximo que puede costar la tarea.
- Sin
--wait, muestraidempotencyKey,taskId,state(queued),estimatedCostydeadlineAt, y vuelve. Con--wait, muestra enseguidaAccepted: <task-id>y un comando de recuperación, espera y después muestraidempotencyKey,acceptedy lataskterminada.
deadlineAt es la hora límite en la que la tarea puede terminar antes de acabar como expired. No es la hora a la que caducan tu enlace de descarga o tus archivos.
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitEn macOS y Linux también puedes dar la entrada en la misma línea:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-json '{"prompt": "A paper lantern on a rainy street"}'Si la espera falla, la tarea sigue en marcha
Una espera puede terminar antes de tiempo por el límite de tiempo, por un problema de red o por Ctrl + C. La tarea en sí sigue adelante y se cobra con normalidad. La línea Accepted: que se mostró al principio tiene su ID; continúa con spicyapi tasks wait <task-id>. No te limites a ejecutar otra vez el mismo comando de creación sin --idempotency-key: eso inicia, y cobra, una segunda generación.
Cuando la espera falla con un error (y no por Ctrl + C), las últimas líneas repiten todo lo que necesitas, para que no tengas que volver atrás a buscar la línea Accepted::
Error: task job_01k3m8x9q2z4v7n5p6r8s0t1w3 did not reach a terminal state within 600000ms
Task job_01k3m8x9q2z4v7n5p6r8s0t1w3 was accepted and may still be running; only the wait stopped.
Recover: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3
To replay the same request without creating a second task, reuse --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241.Si el error tenía una solución conocida, como un 429 o un error del servidor, a continuación aparece una línea Next:. Con --json, los mismos datos están en el objeto de error como taskId, idempotencyKey y recover.
tasks wait
Qué hace: espera a que termine una tarea que ya iniciaste.
spicyapi tasks wait <task-id> [options]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
task-id | El ID de tarea, como job_01k3m8x9q2z4v7n5p6r8s0t1w3 | — | Sí |
--poll-interval-ms <milliseconds> | Consulta cada tantos milisegundos, de 100 a 60000 | Empieza en 2 segundos y se va espaciando hasta 10 segundos | No |
--wait-timeout-ms <milliseconds> | Deja de esperar pasado este tiempo, de 1 a 86400000 | 600000 (10 minutos) | No |
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000Salida: la tarea terminada, con los mismos campos que tasks get, en cuanto su estado es succeeded, failed o expired. Si la tarea salió bien pero sus archivos todavía se están copiando, sigue esperando un poco más.
Si se agota el límite de tiempo, ves Error: task … did not reach a terminal state within 600000ms. Eso no es un fallo: la tarea sigue en marcha. Vuelve a esperar, con un --wait-timeout-ms más largo si hace falta. Dejar de esperar nunca cancela una tarea. Gratuito.
tasks get
Qué hace: muestra una tarea tal como está ahora: su estado, su costo, los enlaces al resultado y cuándo se borrará su contenido.
spicyapi tasks get <task-id>| Argumento | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
task-id | El ID de tarea | — | Sí |
Usa la misma clave de API con la que se creó la tarea: con otra clave recibirás «not found».
Campos de la salida:
| Campo | Significado |
|---|---|
state | queued (esperando a empezar), running (en marcha), succeeded (salió bien), failed (falló) o expired (se quedó sin tiempo). Las tareas antiguas también pueden mostrar canceled |
output.assets | Los resultados. Cada uno tiene una url (un enlace de descarga válido durante unos 20 minutos), expiresAt (cuándo deja de funcionar ese enlace), mime (tipo de archivo), datos de tamaño y una key. pending: true significa que el archivo todavía se está copiando, así que vuelve a intentarlo en unos segundos. unavailable: true significa que no se puede recuperar |
errorCode, errorMessage | Por qué falló la tarea. Consulta Errores |
cost, settled | El cargo en USD. Es definitivo cuando settled vale true |
input | Los ajustes que enviaste. Se eliminan cuando termina el plazo de conservación de tu prompt |
createdAt, completedAt, deadlineAt | Cuándo se creó, cuándo terminó y la hora límite en la que podía terminar |
contentState | present (el contenido sigue guardado), expired (eliminado por las reglas de conservación) o purged (lo borraste tú) |
retention | outputsExpireAt (cuándo se borran los archivos del resultado), promptsExpireAt (cuándo se borra el texto de tu prompt) y source (qué ajuste lo decidió) |
sourceTaskId | Aparece cuando esta tarea es un reintento de otra |
La salida normal termina con un resumen en lenguaje llano, como Outputs expire: … o Content: Destroyed — you removed the outputs …. Cada llamada devuelve enlaces de descarga nuevos. Gratuito.
tasks list
Qué hace: lista las tareas creadas con la clave de API actual, página a página.
spicyapi tasks list [options]| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--from <date> | Primer día que se incluye, YYYY-MM-DD en UTC | Un periodo de siete días que termina hoy | No |
--to <date> | El día siguiente al último día que se incluye, YYYY-MM-DD en UTC. El intervalo puede ser de 92 días como máximo | Igual que arriba | No |
--state <state> | Solo tareas en un estado: queued, running, succeeded, failed, canceled o expired | Todos | No |
--model <model> | Solo tareas de un ID de modelo exacto | Todos | No |
--limit <count> | Tareas por página, de 1 a 100 | 20 | No |
--cursor <cursor> | Continúa desde la página anterior, usando su valor nextCursor | Primera página | No |
spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --state failedSalida: items (cada uno con taskId, model, state, cost, settled, createdAt, deadlineAt y completedAt), hasMore y nextCursor. Si hasMore vale true, vuelve a ejecutar el mismo comando con los mismos --from y --to, añadiendo --cursor con el valor de nextCursor. La lista no incluye enlaces de descarga; usa tasks get con la tarea que te interese. Gratuito.
tasks retry
Qué hace: vuelve a ejecutar una tarea failed o expired como una tarea nueva, con un ID nuevo. Esto cuesta dinero.
spicyapi tasks retry <task-id> [options]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
task-id | La tarea fallida o caducada que quieres volver a ejecutar | — | Sí |
--wait | Se queda esperando hasta que termina la tarea nueva | Desactivada | No |
--yes | Se salta la pregunta de confirmación | Desactivada: pregunta | No |
--idempotency-key <key> | Si vuelves a ejecutar el reintento con la misma clave, recibes la misma tarea nueva en lugar de otra más | Una clave aleatoria nueva en cada ejecución | No |
--poll-interval-ms <milliseconds> | Con --wait: cada cuánto consultar | Empieza en 2 segundos y se va espaciando hasta 10 segundos | No |
--wait-timeout-ms <milliseconds> | Con --wait: deja de esperar pasado este tiempo | 600000 (10 minutos) | No |
Pregunta Retry source task … Continue? [y/N]. A diferencia de tasks create, no muestra ningún precio antes de preguntar. La tarea nueva se cobra al precio actual del modelo, así que, si el precio te importa, consúltalo antes con spicyapi models get <model>.
Salida: idempotencyKey, el nuevo taskId, sourceTaskId (la original), state, estimatedCost (el importe retenido) y deadlineAt.
- Solo se pueden reintentar las tareas
failedyexpired, además de las antiguascanceled. Si quieres otra versión de un resultado que salió bien, usatasks create. - La entrada original se reutiliza sin cambios, así que un reintento solo sirve cuando el fallo fue pasajero. Mira primero
errorCode; consulta Reintentar una tarea que falló y Errores. - Si la entrada apuntaba a un archivo subido que ya ha caducado, el reintento falla; vuelve a subir el archivo y usa
tasks create. - El reintento mantiene el ajuste de conservación de la tarea original.
- Si
tasks createperdió la conexión antes de que vieras un ID de tarea, eso no es una tarea fallida. Sigue los pasos de Retomar una tarea después de que se interrumpiera la espera.
tasks purge
Qué hace: borra para siempre, en el acto y sin esperar a que caduquen, los medios generados, el resultado (los datos guardados del resultado), el prompt y el resto del texto de entrada de una tarea terminada.
spicyapi tasks purge <task-id> [--yes]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
task-id | Una tarea terminada: succeeded, failed, expired o canceled | — | Sí |
--yes | Se salta la pregunta de confirmación | Desactivada: pregunta | No |
Una tarea que sigue en queued o running no se puede purgar. Tampoco se puede cancelar —no existe ningún comando ni ninguna API de cancelación—, así que espera a que termine con spicyapi tasks wait <task-id> y después púrgala.
Explica qué se va a borrar y te pide que confirmes, porque no se puede deshacer. Descarga antes lo que quieras conservar.
Salida: taskId, contentState (purged), purgedAt, contentRemovedBy (user), billingRetained (siempre true) y mediaDeletionPending, seguidos de una línea que indica qué se destruyó y que los medios guardados se eliminan en aproximadamente un minuto. Si contentState sigue siendo present, esta vez no se eliminó nada; vuelve a intentarlo más tarde.
Gratuito, y no es un reembolso: el movimiento contable, el importe cobrado, el modelo, el estado, las marcas de tiempo y el ID de solicitud se quedan registrados. Consulta Conservación y destrucción.
files upload
Qué hace: sube un archivo de tu equipo, como la imagen inicial de una generación de imagen a video, y te da una dirección spicy:// para ponerla en tu entrada.
spicyapi files upload <path> [--content-type <type>]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
path | El archivo que quieres subir | — | Sí |
--content-type <type> | El tipo de archivo, cuando no se puede deducir del nombre: image/jpeg, image/png, image/webp, image/gif, video/mp4, video/webm, audio/mpeg o audio/wav | Se detecta por la extensión | No |
Se admiten imágenes .jpg, .jpeg, .png, .webp y .gif de hasta 10 MiB, videos .mp4 y .webm y audios .mp3 y .wav de hasta 90 MiB y 600 segundos. Cada modelo puede fijar sus propios límites, más bajos.
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: 720Salida: copia el valor de uri, exactamente como aparece, en el ajuste de archivo del modelo, que a menudo es image_url. Se puede usar hasta expiresAt, normalmente un día. Pasado ese plazo, vuelve a subir el archivo. Subir archivos es gratuito.
files download-url
Qué hace: crea un enlace de descarga nuevo para el resultado de una tarea terminada. Muestra el enlace; no guarda el archivo.
spicyapi files download-url <task-id> [--key <key>]| Argumento u opción | Qué hace | Valor predeterminado | Obligatorio |
|---|---|---|---|
task-id | Una tarea que salió bien | — | Sí |
--key <key> | A qué resultado enlazar, cuando una tarea produjo varios. Usa el valor key de output.assets en tasks get | El primer resultado | No |
Salida: key, url y expiresAt. El enlace funciona durante unos 20 minutos; ábrelo en un navegador o descárgalo con curl. Una tarea que todavía no ha salido bien responde «not found». Si el archivo todavía se está copiando, recibes un error de conflicto; espera unos segundos y vuelve a intentarlo. Cuando los archivos de la tarea ya se han borrado, no se puede crear ningún enlace nuevo. Gratuito.
webhooks verify
Qué hace: si tienes un servidor que recibe callbacks de SpicyAPI (consulta --callback-url), comprueba que un callback que guardaste es auténtico y no se ha modificado. Se ejecuta por completo en tu equipo y no necesita clave de API.
spicyapi webhooks verify --body-file <path> --timestamp <seconds> --signature <base64> --payload-version <version>| Opción | Qué hace | Valor predeterminado | Obligatoria |
|---|---|---|---|
--body-file <path> | Un archivo con el cuerpo del callback exactamente como llegó, byte a byte | — | Sí |
--timestamp <seconds> | El valor de la cabecera X-Webhook-Timestamp | — | Sí |
--signature <base64> | El valor de la cabecera X-Webhook-Signature | — | Sí |
--payload-version <version> | El valor de la cabecera X-Webhook-Payload-Version: 1 o 2 | — | Sí |
--secret-env <name> | El nombre de la variable de entorno que contiene tu clave de firma de webhooks. La clave en sí nunca se escribe en la línea de comandos | SPICY_WEBHOOK_SECRET | No |
--tolerance-seconds <seconds> | Cuánto puede alejarse la marca de tiempo del reloj de tu equipo | 300 | No |
Salida: si todo cuadra, payload (el contenido del callback), payloadVersion, taskId, deliveryId (versión 2) y timestamp. Si algo no coincide, muestra un error y termina con un código de salida distinto de cero. Gratuito.
Al registrarte se crea automáticamente una clave de firma, pero su valor no se muestra nunca. Para obtener una que puedas copiar, abre Webhooks en la consola y haz clic en Generar (o en Rotar si ya hay una configurada). La clave nueva se muestra una sola vez. La rotación surte efecto al instante, sin periodo de transición: la clave antigua deja de firmar en ese mismo momento. Consulta Webhooks.
Recetas habituales
Generar una imagen
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 --waitElige un ID con el primer comando, prepara input.json con los ajustes que muestra el segundo y ejecuta el tercero, confirmando con y. El recorrido de Tu primer resultado explica cada paso.
Convertir una imagen en un video
Busca un modelo de imagen a video y sus ajustes
spicyapi models list --modality video --task image-to-video --json
spicyapi models get MODEL_ID_FROM_CATALOG --jsonEn inputSchema, localiza el ajuste de la imagen inicial (normalmente image_url), el de la duración (normalmente duration_seconds) y todo lo que aparezca en required.
Sube tu imagen
spicyapi files upload ./start-frame.jpgCopia el valor de uri, que empieza por spicy://.
Escribe la entrada
Crea input.json como en Tu primer resultado, con los nombres de ajustes del modelo y tu propia uri:
{
"prompt": "Slow push-in, rain running down the window",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"duration_seconds": 5
}Consulta el precio y 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 1800000Los videos suelen cobrarse por segundo, así que la duración que elijas cambia el precio. Un video puede tardar varios minutos, por eso este ejemplo espera hasta 30 minutos en lugar de los 10 predeterminados. Descarga el .mp4 desde la url como en Tu primer resultado.
La imagen subida se puede usar durante un día. Pasado ese plazo, vuelve a subirla.
Retomar una tarea después de que se interrumpiera la espera
Una tarea sigue en marcha aunque se cierre la terminal, se corte la red, tu equipo entre en reposo o se agote la espera. Cómo recuperarla depende de lo que llegaste a ver:
-
Viste
Accepted: job_…, o una líneaRecover:debajo del error. Tienes el ID de tarea. Vuelve a esperar, o simplemente consúltala:spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3 -
Solo viste la línea
Idempotency-Key:, por ejemplo porque la conexión se cortó mientras se creaba la tarea. Ejecuta otra vez el mismo comando, con el mismo modelo y la misma entrada, y añade esa clave:spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241 --waitLa CLI vuelve a mostrar el precio y a preguntar, pero, si el primer intento se aceptó, SpicyAPI te devuelve esa misma tarea en lugar de iniciar y cobrar una segunda. Funciona durante 24 horas con la misma clave de API. Si el primer intento nunca llegó, la tarea se crea ahora, una sola vez.
-
No tienes ninguna de las dos cosas. Lista tus tareas recientes y búscala por hora y por modelo:
spicyapi --json tasks list --limit 10
Reintentar una tarea que falló
Primero averigua por qué falló:
spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Después lee errorCode. Las tareas fallidas o vencidas normalmente liberan toda la retención. Algunos rechazos de contenido se cobran al precio aceptado, solo si la página del modelo indica expresamente esta excepción. Consulta settled y cost para conocer el importe final. tasks retry vuelve a enviar la misma entrada, así que solo sirve cuando la causa fue pasajera:
errorCode | Qué hacer |
|---|---|
rate_limited, upstream_unavailable, timeout, upstream_failed | Espera un poco y reintenta una vez. Si vuelve a fallar, deja de reintentar: con timeout, prueba con tasks create una duración más corta o una resolución más baja |
generation_failed | No reintentes. Cambia el prompt o la imagen y usa tasks create: la misma entrada suele fallar de la misma manera |
invalid_asset | No reintentes, porque un reintento reutiliza el archivo antiguo. Vuelve a subir el archivo y usa tasks create con la uri nueva |
invalid_request, unsupported_combination | No reintentes sin cambios. Cambia los ajustes y usa tasks create |
content_rejected | No reintentes sin cambios. El modelo rechazó esta solicitud: cambia el prompt o elige otro modelo, y usa tasks create |
La lista completa está en Errores.
Cuando un reintento tenga sentido, ejecútalo. Crea, y cobra, una tarea nueva:
spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --waitExportar tu consumo
Guarda en un archivo un mes de consumo de la clave actual:
spicyapi --json usage --from 2026-09-01 --to 2026-10-01 > usage-2026-09.jsonEl archivo contiene los totales por día y por modelo. Para una lista tarea por tarea, guarda del mismo modo spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --limit 100, siguiendo nextCursor mientras hasMore valga true. Las cifras de toda la cuenta y las facturas están en la consola.
Ejecutar la CLI desde un script
En un script nadie puede responder a Continue? [y/N], así que los comandos de pago se niegan a ejecutarse salvo que añadas --yes. Cuando lo hagas:
- cotiza primero y comprueba el precio dentro del script;
- da a cada generación su propia
--idempotency-keyfija, comoposter-2026-09-17-v1, para que ejecutar el script dos veces no cobre dos veces; - añade
--jsony leestateen el resultado: que un comando termine con código de salida0no significa necesariamente que haya producido una tarea que salió bien; - fija límites de gasto para la clave en la consola.
spicyapi --json tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key poster-2026-09-17-v1 --yes --wait > result.jsonCostos, confirmación y seguridad
Qué comandos cuestan dinero. Solo tasks create y tasks retry. Los precios están en dólares estadounidenses. Cotizar, listar, consultar, subir, descargar y borrar es gratuito.
Ver el precio primero. tasks quote calcula el precio de una solicitud sin iniciar nada. tasks create obtiene su propia cotización y muestra Estimated charge y maximum charge antes de preguntar. Cuando se acepta la tarea, el importe estimado queda retenido (held) y es también lo máximo que se te puede cobrar. Cuando la tarea sale bien, pagas por lo que realmente se produjo, nunca más de ese importe, y lo que sobre vuelve a tu saldo.
La confirmación. Continue? [y/N] significa que la respuesta es no salvo que escribas y. --yes responde por ti, así que úsalo solo cuando ya conozcas el precio. Si la CLI se ejecuta en un sitio donde no puede preguntar, como un script o con una entrada pasada por una tubería, y no hay --yes, se niega en lugar de dar por hecho que sí. tasks purge pregunta de la misma manera, porque un borrado no se puede deshacer. tasks retry también pregunta, pero sin mostrar antes un precio.
La clave de idempotencia, en pocas palabras. Es una etiqueta para una generación, como un número de pedido. Cada tasks create y cada tasks retry muestra una. Si se te corta internet y no sabes si la generación llegó a empezar, ejecuta otra vez el mismo comando con --idempotency-key y el valor que se mostró: recuperas la tarea original y no se te cobra dos veces. La etiqueta funciona durante 24 horas con la misma clave de API. No la reutilices para otra generación: la misma clave con una entrada distinta se rechaza.
No se puede cancelar. Una vez aceptada, una tarea no se puede cancelar. Ctrl + C, cerrar la terminal o revocar la clave solo detiene la espera; la tarea termina y se cobra con normalidad.
Las tareas fallidas o vencidas normalmente liberan toda la retención. Algunos rechazos de contenido se cobran al precio aceptado, solo si la página del modelo indica expresamente esta excepción. Consulta settled y cost para conocer el importe final.
Descarga lo que quieras conservar. Los archivos de resultado se guardan como máximo unos 14 días, o menos si así lo indican tu cuenta o --retention, y después se borran para siempre. Los enlaces de descarga duran unos 20 minutos, pero mientras el archivo exista siempre puedes pedir uno nuevo. Los archivos subidos se pueden usar durante un día. El texto del prompt se borra a los 30 días de forma predeterminada. Los registros de facturación se conservan. Consulta Conservación y destrucción.
Límites de gasto. Cada clave puede tener un límite diario, uno mensual y uno acumulado, que se fijan en la página Claves de API. Las claves nuevas no tienen límite hasta que fijas uno. Una tarea que superaría un límite se rechaza antes de empezar.
Tu clave. La CLI solo lee la clave de SPICY_API_KEY, nunca la muestra y, en las pistas de los errores, enseña como mucho sus nueve primeros caracteres (sk-spicy-).
Más detalles: Facturación, Idempotencia, Ejecución y reintentos.
Solución de problemas
Busca el mensaje que ves. Los errores de SpicyAPI terminan en (request req_…); incluye ese valor si contactas con soporte, pero no envíes nunca tu clave.
Todos los códigos de error se explican en Errores, y los pasos de recuperación están en Diagnóstico y recuperación.
Código fuente
El paquete tiene licencia MIT y se desarrolla en abierto en github.com/spicyapi-ai/spicy-cli. Ahí puedes leer el código detrás de cualquier comando de esta página, avisar de un comportamiento que no coincida con lo descrito o proponer un cambio.
Siguientes pasos
Catálogo de modelos y esquemas
Cómo funcionan el catálogo en vivo y los ajustes de cada modelo
Facturación
Precios, qué se retiene, límites de gasto y facturas
Conservación y destrucción
Cuánto tiempo se guardan los archivos y los prompts, y cómo borrarlos antes
Errores
Todos los códigos de error y si merece la pena reintentar
SDK de TypeScript
Haz lo mismo desde tu propio código JavaScript o TypeScript
SDK de Python
Haz lo mismo desde tu propio código Python
SDK de Go
Haz lo mismo desde tu propio código Go
Servidor MCP
Deja que un asistente de programación con IA ejecute estos pasos, con confirmación antes de gastar
Agent Skill
Enseña a un agente de IA el flujo de trabajo seguro de SpicyAPI
Inicio rápido
El mismo flujo usando directamente la API HTTP
Agentes y automatización
Qué herramienta oficial usar y una guía operativa de producción para agentes de IA, procesos de backend y flujos de medios repetibles.
Servidor MCP
Conecta Claude, Cursor, VS Code y otros asistentes de IA a SpicyAPI para explorar modelos, comparar precios, generar medios y recoger los resultados conversando, con cada paso de pago confirmado por ti.

