Retención y eliminación
Conoce los plazos máximos de retención, cómo acortarlos, su efecto sobre el contenido existente y cómo eliminar el contenido de una tarea.
La retención tiene dos capas. El plazo máximo de la plataforma es un compromiso público, no un ajuste interno. Dentro de ese máximo, puedes establecer periodos más cortos y eliminar el contenido de una tarea cuando quieras.
La relación entre ambas capas es sencilla: solo puedes acortar los plazos; ningún ajuste tuyo amplía el máximo.
Cuánto tiempo conservamos los datos
| Datos | Máximo de la plataforma | Al vencer |
|---|---|---|
| Archivos generados: imagen, video o audio | Unos 14 días | Se eliminan del almacenamiento de objetos |
| Medios de cortometrajes: imágenes de escenas, videos y voces creados en un proyecto de cortometraje de Spicy Studio, y películas exportadas desde él | Unos 60 días | Se eliminan del almacenamiento de objetos |
| Imágenes de referencia que subes | 1 día | La URI spicy:// vence en el expiresAt de la respuesta de confirmación; después se elimina el objeto |
Contenido de las tareas: prompts y parámetros en input, referencias de archivos en output | 30 días | Se vacían ambos campos; se conserva el registro de la tarea |
| Biblioteca de recursos (archivos que guardas a propósito) | Hasta que los elimines | Se eliminan cuando eliminas el recurso o el propietario cierra la cuenta; una biblioteca de equipo se elimina junto con su equipo. Consulta Medios |
| Registros de tareas: ID, modelo, estado, importe y fechas, sin contenido de ningún tipo | Por tiempo indefinido | No se eliminan. Son la evidencia para una disputa de facturación |
| Logs y eventos de tareas: transiciones de estado y registros de entrega de webhooks | Al menos 60 días; las particiones mensuales hacen que sean 2–3 meses en la práctica | Se eliminan |
| Registros de saldo y movimientos | 10 años | Se conservan para el historial de cuenta, conciliaciones y disputas; véase más abajo |
| Registros de auditoría | 2 años | Se eliminan según la política tras verificar su integridad |
| IP y UA en texto claro en registros de seguridad | 90 días | Se sustituyen por seudónimos HMAC con versión; no es anonimización |
| Copias de seguridad de la base de datos | 35 días | Se renuevan; borrar en la aplicación no borra las copias de seguridad de inmediato |
Puedes acortar las primeras cuatro filas con los cuatro plazos siguientes: resultados generados, incluidos los medios y el contenido del resultado; medios de cortometrajes; texto del prompt; y archivos subidos.
Los medios de cortometrajes tienen un periodo más largo porque una película de Spicy Studio se construye durante días o semanas, y una escena de la primera semana debe seguir disponible al exportar la película completa. Solo se aplica a tareas iniciadas dentro de un proyecto de cortometraje en Studio; llamar al mismo modelo desde la API, un SDK o el Playground mantiene el máximo de 14 días. El texto del prompt conserva el máximo de 30 días en ambos casos. Los demás plazos son obligaciones de la plataforma o periodos legales y no cambian con tus ajustes.
Estos valores son configuración del servidor, no constantes fijadas en el código
La tabla muestra los máximos vigentes, que también son los valores predeterminados: si no configuras nada, el comportamiento es exactamente el de antes. Operaciones puede modificarlos porque los requisitos de cada jurisdicción cambian, pero cualquier modificación se gestiona como un cambio de cumplimiento: esta página y la eliminación real deben mantenerse alineadas.
Si necesitas un periodo diferente en un contrato, plantéalo antes de firmar en lugar de deducirlo de esta página.
La vigencia de una URI de subida no indica que el objeto ya se haya eliminado
La URI spicy:// devuelta al confirmar una subida solo puede utilizarse hasta el expiresAt de la respuesta, que de forma predeterminada es 1 día después de una confirmación correcta. En ese momento deja de ser válida inmediatamente para nuevas tareas. El objeto subyacente se elimina en el proceso de limpieza, y el mecanismo final de respaldo puede demorarse hasta 24 horas; esa demora no amplía la vigencia utilizable de la URI.
Por qué decimos «unos 14 días» y no «exactamente 14 días»
La última capa de vencimiento es una regla de ciclo de vida del almacenamiento de objetos. Su comportamiento oficial elimina los objetos dentro de las 24 horas posteriores al vencimiento. Prometer un número exacto y eliminar realmente a los 14 días más hasta otro día sería una afirmación falsa; por eso decimos «unos».
Lo mismo se aplica a los periodos cortos que configures. Si eliges una hora, la limpieza normalmente se completa en minutos, pero seguimos diciendo «aproximadamente una hora» o «como máximo», nunca una cifra exacta.
Descarga lo que quieras conservar. Cuando termina el periodo, ya no se puede emitir un enlace de descarga, aunque el registro de la tarea sigue consultable y los movimientos del saldo siguen en el historial de facturación.
Cuatro plazos independientes
Responden a cuatro preguntas distintas, no a una pregunta con cuatro ajustes. Los nombres siguientes son los que aparecen en la consola:
| Plazo | Qué cubre | Valor predeterminado, igual al máximo | Opciones |
|---|---|---|---|
| Resultados generados | Imágenes, video y audio generados, y el contenido del resultado | Unos 14 días | 1 hora / 6 horas / 24 horas / 7 días / 14 días |
| Medios de cortometrajes | Medios creados en un proyecto de cortometraje de Spicy Studio y películas exportadas desde él | Unos 60 días | 1 hora / 24 horas / 7 días / 14 días / 30 días / 60 días |
| Texto del prompt | Texto de la solicitud: prompt y campos de texto dentro de input | 30 días | Igual que los resultados / 1 hora / 24 horas / 7 días / 30 días |
| Archivos subidos | Archivos que subes como referencias | 1 día | Eliminar al terminar el trabajo / 1 hora / 24 horas |
Configúralos en Retención, en la página Protección de datos de la consola. Al aceptar una tarea, se establecen sus propios vencimientos de resultados y prompts a partir de estos ajustes y del encabezado siguiente; puedes consultarlos como retention en recordInfo.
«Eliminar al terminar el trabajo» elimina un archivo subido una vez que todas las tareas que lo usan alcanzan un estado final (succeeded / failed / canceled / expired), normalmente en un minuto. No se elimina al crear la tarea, porque un reintento lo necesita. Ten en cuenta la consecuencia: volver a ejecutar la misma imagen exige subirla de nuevo, y un reintento fallará.
Cómo afectan los cambios al contenido existente
Cambiar un plazo no es un simple ajuste «de ahora en adelante». Algunos cambios afectan a tareas que ya ejecutaste y otros no. Así funciona actualmente:
| Qué cambias | Efecto sobre tus tareas y archivos existentes |
|---|---|
| Texto del prompt a 1 hora o 24 horas | En la siguiente limpieza, normalmente en minutos, todas las tareas que terminaron hace más de un día pierden el texto del prompt y sus resultados y archivos generados, aunque Resultados generados siga en 14 días. Desde entonces sucede lo mismo con cada tarea al cumplir un día desde su finalización, salvo que algo la elimine antes. |
| Texto del prompt a 7 días | Lo mismo, con 7 días en lugar de uno. |
| Resultados generados a un plazo más corto, con Texto del prompt en Igual que los resultados | Lo mismo que configurar Texto del prompt con ese periodo: 7 días afecta a tareas de hace más de 7 días; 1 hora, 6 horas o 24 horas afecta a tareas de hace más de un día. |
| Resultados generados a un plazo más corto, con Texto del prompt en su propio valor | Las tareas existentes no cambian: cada una conserva el vencimiento de resultados asignado al aceptarla. Las nuevas usan el plazo más corto. |
| Archivos subidos a Eliminar al terminar el trabajo | Se aplica a los archivos que tienes al guardar. Los que solo usaron tareas ya terminadas se eliminan en aproximadamente un minuto; los demás, al terminar las tareas que los usan. Los archivos subidos después de guardar mantienen actualmente el vencimiento estándar de su respuesta de confirmación. |
| Archivos subidos a 1 hora o 24 horas | Actualmente no cambia nada: cada archivo sigue utilizable hasta el expiresAt de su respuesta de confirmación. |
| Cualquier plazo a un periodo más largo | Nada ya eliminado vuelve, y las tareas existentes conservan el vencimiento que recibieron. |
Algunos cambios afectan al pasado porque los vencimientos propios de una tarea se fijan al aceptarla, pero otro proceso de limpieza trabaja en días completos. Toma tu ajuste Texto del prompt, lo redondea hacia arriba a 1, 7 o 30 días y lo aplica a todas las tareas terminadas de la cuenta. Al limpiar una tarea, elimina juntos el texto del prompt y los resultados.
La misma página incluye otra tarjeta, Retención del contenido de trabajos, que controla directamente ese proceso por días:
- Elegir 1 día o 7 días elimina el texto del prompt, los resultados y los archivos generados de todas las tareas que terminaron hace más de ese periodo; sigue haciéndolo con cada tarea al alcanzar esa antigüedad.
- Activar Borrar contenido poco después de finalizar los elimina de todas las tareas terminadas, incluidas las ejecutadas antes de activarlo, aproximadamente una hora después de terminar cada una.
- Las dos tarjetas comparten ajustes: guardar una cambia lo que muestra la otra.
Descarga lo que quieras conservar antes de acortar un plazo
Un ajuste más corto puede eliminar resultados y prompts de tareas que ya ejecutaste, y el contenido eliminado no se puede recuperar. Antes de guardar, la consola muestra cuántos elementos prevé afectar; toma ese número como una advertencia, no como una lista exacta de lo que se eliminará.
Primero descarga todos los resultados que quieras conservar y después acorta el plazo. Ampliarlo no exige esa precaución: solo afecta al futuro y nada ya eliminado vuelve.
Ajuste por solicitud: X-Spicy-Retention
Si no quieres cambiar los ajustes de la cuenta y solo deseas que esta generación desaparezca antes, envía el encabezado al crear la tarea. Su valor es un número entero de segundos y se aplica a los archivos y el prompt de esta tarea:
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-H "X-Spicy-Retention: 3600" \
--data "$TASK_PAYLOAD"- Solo para acortar. El valor efectivo es
min(header, account setting, platform cap). Si un administrador establece una hora para la cuenta, una solicitud individual no puede recuperar 14 días; de lo contrario, el ajuste de cuenta sería una sugerencia. 0es válido y significa «eliminar los archivos en cuanto la tarea alcance un estado final».- Un valor no válido no hace fallar la solicitud. Un número negativo se limita a
0; un valor superior al máximo se limita al máximo; un valor que no sea un entero decimal se ignora y se aplica el ajuste de cuenta. El valor efectivo siempre se informa comoretentionenrecordInfo. Un encabezado que solo pide ser más conservador no debería romper una generación. - Qué endpoints lo leen. Lo leen
jobs/createTaskyjobs/stream.jobs/retryhereda el valor efectivo de la tarea de origen e ignora el encabezado: un reintento es otro intento de lo mismo, y permitirle otro periodo daría dos vencimientos a una misma familia de tareas.jobs/quoteno lo lee porque no crea una tarea.
recordInfo devuelve retention para cada tarea; la respuesta de createTask no lo incluye, así que consúltalo cuando la tarea exista:
{
"retention": {
"outputsExpireAt": "2026-09-13T12:00:00Z",
"promptsExpireAt": "2026-09-13T12:00:00Z",
"source": "header"
}
}source indica qué capa decidió: header, esta solicitud; account, el ajuste de cuenta; o platform, el máximo. Enviar el encabezado y recibir igualmente account significa que el ajuste de cuenta ya era más corto que lo solicitado.
Antes de terminar la tarea, outputsExpireAt se calcula desde la aceptación; cuando alcanza un estado final, se recalcula desde la finalización con el mismo periodo. Por eso solo puede desplazarse hacia más tarde, nunca hacia antes. Confía en las fechas de la respuesta en lugar de recalcularlas: el resultado de combinar los tres límites no siempre es el esperado. Además de eliminar tú el contenido, solo un ajuste de cuenta con efecto retroactivo puede borrarlo antes de esas fechas, como se explica arriba.
Eliminar contenido cuando quieras: POST /jobs/purge
Si no quieres esperar al vencimiento:
- En la consola, abre la tarea en Logs y elige Destruir resultados: es la misma acción que el endpoint siguiente.
- Eliminar del historial, en la misma tarea, también borra el prompt y el resultado, programa sus medios para eliminación y además oculta la tarea en tus logs. Está disponible cuando la tarea termina y se liquida la facturación.
Ninguna acción cambia lo que se cobró ni cancela la tarea. Desde el código:
curl -X POST https://api.spicyapi.ai/api/v1/jobs/purge \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
--data '{"taskId": "job_01k..."}'| Qué se elimina | Qué se conserva |
|---|---|
| Los propios objetos de los archivos generados | Movimientos e importes de facturación |
El contenido del resultado (output) | Estado y fechas de la tarea |
El prompt y el texto dentro de input | Identificador del modelo y request_id |
La respuesta:
{
"taskId": "job_01k...",
"contentState": "purged",
"purgedAt": "2026-09-13T12:00:00Z",
"contentRemovedBy": "user",
"billingRetained": true,
"mediaDeletionPending": true
}Algunas reglas:
- Solo tareas en estado final (
succeeded/failed/canceled/expired). Espera a que termine una tarea en ejecución: sus archivos todavía no han llegado, y una eliminación parcial es peor que no eliminar. Una tarea de generación no se puede cancelar una vez aceptada, así que no hay una ruta de «cancelar primero y eliminar después». - Es idempotente y no necesita
Idempotency-Key. La idempotencia se basa entaskId: volver a llamar sobre una tarea ya eliminada devuelve igualmente 200, ypurgedAtcorresponde a la primera eliminación, no a esta llamada. Es seguro reintentar después de un tiempo de espera agotado. - La respuesta significa «programado», no «ya eliminado». Mientras
mediaDeletionPendingsea true,contentStateya espurged, pero el proceso en segundo plano no ha terminado de eliminar los objetos; normalmente lo hace en un minuto. Una eliminación síncrona permitiría que un objeto resistente bloqueara toda la solicitud justo cuando necesitas una respuesta clara. - Una respuesta que siga en
presentsignifica que esta llamada no eliminó nada; por ejemplo, porque la tarea está sujeta a una medida de conservación. Puedes reintentar más tarde; deliberadamente no se revela el motivo concreto. billingRetainedsiempre estrue. Parece redundante, pero existe porque es el punto que un cliente probablemente interpretaría mal de este endpoint; véase más abajo.
Eliminar no cancela una tarea ni devuelve el pago
purge solo afecta al contenido. No cambia la facturación:
- Un cargo liquidado sigue liquidado. Eliminar los archivos no devuelve el dinero.
- Una retención ya liberada, por tarea fallida o vencida, sigue liberada; eliminar no la libera por segunda vez.
- El cargo sigue en tu página de facturación con su importe, fecha y modelo.
Es deliberado. Los movimientos son la evidencia de la transacción para ambas partes y se conservan durante 10 años; el contenido es tuyo y se puede eliminar cuando lo pidas. Son dos categorías de datos, no dos caras de lo mismo.
En una frase: eliminar borra el contenido, no el registro de lo que gastaste.
contentState: si existe el contenido y quién lo eliminó
Los detalles de una tarea incluyen un contentState con tres valores:
| Valor | Significado | Cuándo aparece |
|---|---|---|
present | El contenido sigue disponible | Es el estado normal y la interpretación de tareas antiguas anteriores a este campo |
expired | Eliminado automáticamente al vencer | Terminó el periodo efectivo de retención y se ejecutó la limpieza |
purged | Tú lo eliminaste | Llamaste a jobs/purge o elegiste Destruir resultados |
Los dos últimos incluyen purgedAt, cuándo desapareció el contenido, y contentRemovedBy: system para el proceso de limpieza y user para ti.
`expired` aparece en dos lugares con significados diferentes
- Estado de la tarea
expired: la generación agotó el tiempo y no produjo nada. contentStateexpired: sí produjo algo, pero se eliminó después según tus ajustes de retención.
Comparten una palabra en inglés. Usar una sola etiqueta «Vencido» en tu interfaz confunde dos situaciones distintas: la primera requiere reintentar; la segunda no puede devolver ese resultado, por muchos reintentos que hagas.
Mostrar purged como «vencido» también es incorrecto: uno corresponde a un botón que pulsó el usuario y el otro a nuestra política ejecutada en su momento. Confundirlos lleva a pensar que la plataforma perdió los archivos.
Al vencer se vacían campos, no registros
Las dos partes de esta frase importan; la primera sola induce a error
El contenido se borra al terminar el periodo de retención; el registro de facturación y estado, que no contiene contenido, se conserva indefinidamente.
Decir solo la primera parte es literalmente cierto, pero deja una impresión incorrecta: desaparece lo que hay en input y output, no el registro de la tarea.
La limpieza cubre input, output, las URL de callback y el contenido relacionado de eventos y callbacks. El registro de la tarea se conserva indefinidamente: es la única evidencia para una disputa de facturación, y eliminarlo rompería la contabilidad. Después, cada registro contiene unos cientos de bytes de metadatos: ID de tarea, modelo, estado, importe, fechas y clave de origen. La eliminación a petición sigue exactamente la misma regla; solo decides el momento.
Una vez eliminado el contenido:
- Todavía puedes responder «cuánto me cobraron este mes, qué tareas fallaron y qué clave las envió».
- No puedes responder «qué prompt envié o qué clave de objeto contenía el archivo»:
recordInfodeja de devolverinputyoutputdesde entonces.
Si necesitas los prompts durante más tiempo, guarda tu propia copia. Una medida de conservación activa suspende la eliminación correspondiente y también bloquea la eliminación a petición; ninguna puede recuperar una salida ya borrada físicamente.
El historial de saldo es independiente del contenido
Vaciar input y output de una tarea, al vencer o porque la elimines tú, no modifica recargas, retenciones, liquidaciones, devoluciones de retenciones ni ajustes manuales. Puedes seguir conciliando esos movimientos en la página de facturación de la consola. Los registros de movimientos siguen una política de diez años y no desaparecen al vencer o eliminarse el contenido de una tarea.
Si una solicitud de acceso o eliminación afecta a datos que deben conservarse por una disputa, investigación de seguridad o ley aplicable, nuestra respuesta explicará su alcance y motivo.
Dos cosas que no podemos hacer
1. El modelo que ejecuta tu solicitud necesariamente ve el prompt en texto claro
La generación la realiza el modelo que seleccionas y el prompt tiene que llegar a él como texto claro. Es un límite de la arquitectura, no un ajuste; acortar el plazo a una hora no lo cambia. Por eso nuestros periodos de retención solo pueden prometer cuánto tiempo conserva algo la propia SpicyAPI.
Lo que ocurre con un prompt después de llegar al modelo queda fuera del control de nuestros ajustes de retención. Si eso importa para tu caso, contacta con nosotros antes de enviar material sensible.
2. «Eliminado inmediatamente» no existe
La regla final de ciclo de vida tiene una ventana de ejecución de hasta 24 horas y las copias de seguridad de la base de datos se renuevan cada 35 días. Afirmar que los datos desaparecen del mundo al instante es falso. Podemos comprometernos con cuánto tarda en completarse la eliminación, no con que sea instantánea; por eso el endpoint responde «programado» en vez de «eliminado».
La excepción: medidas legales de conservación
Las tareas afectadas por una disputa, una solicitud forense o una obligación legal de notificación se ponen bajo conservación y su cuenta regresiva se detiene hasta levantar la medida. La eliminación a petición no se ejecuta mientras esté activa.
Esto prevalece sobre todas las cifras y ajustes anteriores. No es una excepción oculta: sin un mecanismo de conservación, la primera notificación legal obligaría a incumplir una promesa de retención y después habría que explicar por qué la documentación decía 14 días. Se indica aquí porque corresponde hacerlo.
Qué puedes controlar
- Configura cada plazo según lo que realmente necesites. Son independientes: no cambies las subidas a «Eliminar al terminar el trabajo» solo porque quieras conservar menos tiempo los prompts.
- Descarga antes de acortar. Un ajuste más corto puede afectar a tareas que ya ejecutaste; consulta el efecto de cambiar un ajuste.
- Usa
X-Spicy-Retentionpara solicitudes sensibles puntuales. No hace falta reconfigurar toda la cuenta para una sola generación. - No envíes lo que no necesites. Las imágenes de referencia y los prompts son los dos elementos más sensibles y los únicos cuyo contenido eliges tú.
- Archiva tus propios resultados. Duran como máximo unos 14 días, o unos 60 días para medios de cortometrajes, y menos si acortas el plazo.
- Guarda una copia de los datos de tu cuenta. Descargar tus datos, en Protección de datos, te entrega un JSON con tu perfil, roles de equipo, detalles de claves de API, nunca los secretos, datos de tareas conservados y registros de facturación. No incluye archivos multimedia: descarga por separado los resultados que necesites.
- No guardes URL de descarga en tu base de datos. Vencen en 20 minutos y no se pueden revocar una vez emitidas. Genera una firmada cuando la necesites; consulta Medios.
- Usa HTTPS para las URL de callback. El contenido enviado incluye estados de tareas y referencias de archivos; HTTP sin cifrar los expone a cualquiera en el trayecto.
No entrenamos con tu contenido
Tus prompts, imágenes de referencia y archivos generados no entran en ningún conjunto de entrenamiento.
El alcance de esa frase importa: se refiere a nosotros. No definimos las políticas de cada modelo; consulta el primer punto anterior.
Consola y espacios de trabajo
Qué hace cada página de la consola de SpicyAPI y cuándo usarla, y cómo los equipos comparten claves de API y límites de gasto mientras paga el propietario del equipo.
OpenAPI e índice de endpoints
Contrato OpenAPI 3.1 descargable, todos los endpoints públicos y sus guías, encabezados de solicitud compartidos y origen de producción.

