Tareas aceptadas y reintentos
Por qué una tarea de generación aceptada no puede cancelarse y cómo reintentar de forma segura las tareas fallidas o vencidas.
Una vez aceptada por createTask, la tarea de generación queda comprometida y no puede cancelarse. Esta regla se aplica tanto en estado queued como en estado running: no es posible detener de forma fiable una generación una vez iniciada, por lo que SpicyAPI no ofrece una acción local que pudiera indicar una cancelación mientras el trabajo —y su costo— continúan.
Las tareas aceptadas son irreversibles
Revisa el modelo, las entradas y el cargo estimado antes de enviar la solicitud. Cerrar el navegador, salir de la página o eliminar una clave de API no detiene una tarea aceptada.
Reintentar una tarea finalizada
Un reintento vuelve a ejecutar una tarea que terminó sin éxito: crea una tarea nueva con el mismo modelo, input y URL de callback, de modo que no necesitas volver a enviar el cuerpo original de la solicitud. La nueva tarea se factura como cualquier otra: su cargo estimado se retiene cuando se acepta y solo se cobra si termina correctamente.
POST /api/v1/jobs/retrycurl -X POST https://api.spicyapi.ai/api/v1/jobs/retry \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: retry-order-8814-1" \
-d '{"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3"}'Sustituye el taskId del ejemplo por el ID de tu tarea fallida. Envía siempre un Idempotency-Key con retry (por ejemplo, retry-<sourceTaskId>-1): sin esa clave, un doble clic o un reintento de red crea dos tareas facturables.
Solo deben reintentarse las tareas failed y expired. Los registros históricos canceled siguen siendo legibles y también pueden reintentarse por compatibilidad, pero las tareas nuevas no pueden pasar a ese estado mediante una acción del usuario. Una solicitud correcta crea una tarea nueva en cola y devuelve HTTP 200 (no 202, como hace createTask), con code: 200:
{
"code": 200,
"msg": "success",
"data": {
"taskId": "job_01k3mnewtask",
"sourceTaskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"state": "queued",
"estimatedCost": "0.08",
"deadlineAt": "2026-08-28T10:12:04Z"
},
"request_id": "req_01k3mretry"
}Consulta el nuevo taskId o espera su resultado, no el de la tarea de origen; consulta Tareas asíncronas.
- La tarea de origen conserva su estado final y no cambia.
- El
sourceTaskIdde la nueva tarea apunta a la original, conservando la relación entre los reintentos. - Se vuelven a comprobar el esquema actual, el precio, los permisos y el saldo. Un reintento es una tarea nueva: vuelve a entrar en cola y se procesa de forma independiente de la original.
- La nueva tarea envía su callback al mismo
callBackUrlque la original y mantiene su período de conservación; un encabezadoX-Spicy-Retentionenviado aretryse ignora. - Un reintento reutiliza exactamente el
inputde la tarea original. Los archivos de referencia subidos a SpicyAPI —incluidas las imágenes Base64 pequeñas, que se almacenan como archivos subidos— duran un día. Después, el reintento devuelve400: vuelve a subir el archivo y crea una tarea nueva concreateTask. - El alcance de
Idempotency-Keyse limita a la tarea de origen y a la acción de reintento. Repetir la misma clave para la misma tarea original devuelve la misma tarea nueva en lugar de crear otra.
Cuándo se rechaza el reintento
Si retry devuelve un error, no se retienen fondos ni se realiza ningún cargo.
| Respuesta | Motivo | Qué hacer |
|---|---|---|
404 | La tarea original no existe o se creó con otra clave de API | Reintenta con la clave que la creó |
409 | La tarea original está en estado succeeded (otra generación requiere createTask), sigue queued o running, o su facturación aún no es definitiva | Espera a que esté failed o expired con settled: true; para otra generación, usa createTask |
409 | Las entradas de la tarea original ya no se almacenan: terminó el período de conservación del prompt o destruiste su contenido | Vuelve a enviar la solicitud original con createTask |
400 | Un archivo de referencia subido venció o la URL de callback guardada en la tarea original ya no pasa la validación | Vuelve a subir el archivo o utiliza un callBackUrl válido y envía la solicitud con createTask |
402 | No hay saldo suficiente o se alcanzó un límite de gasto | Consulta Facturación |
Un error de red no significa que la tarea haya fallado
Si la conexión de createTask se interrumpe antes de recibir la respuesta, vuelve a enviar createTask con su Idempotency-Key original. Utiliza retry únicamente cuando hayas confirmado que una tarea existente llegó a un estado final.
Matriz de estados y reintentos
| Estado actual | Qué puedes hacer |
|---|---|
queued / running | Esperar el resultado final; la tarea no puede cancelarse |
succeeded | Leer o descargar el resultado; crear una tarea nueva para otra generación |
failed / expired | Reintentar para crear una tarea que se factura por separado |
canceled histórico | Leer el registro o reintentarlo; las tareas nuevas no ofrecen cancelación por parte del usuario |
Antes de reintentar, consulta errorCode. Puede ser útil reintentar rate_limited, upstream_unavailable y upstream_failed; timeout y generation_failed podrían volver a fallar de la misma manera. Con invalid_request, unsupported_combination y content_rejected, la misma entrada volverá a fallar; con invalid_asset, debes subir de nuevo el archivo de referencia. En esos casos, modifica la entrada y utiliza createTask. Consulta Códigos de fallo de tareas.
Contrato de Spicy Schema
Formato compartido de solicitudes, campos canónicos, esquemas de formularios, ciclo asíncrono, errores, almacenamiento y compatibilidad.
Diagnóstico y recuperación
Busca el síntoma que ves, entiende por qué ocurre y qué hacer, desde pagos, 401 y 403, saldo y límites o modelos no disponibles hasta tareas fallidas o atascadas, subidas, callbacks y streams.

