Retenção e destruição
Limites de retenção, prazos que você pode reduzir, efeitos sobre conteúdo existente, destruição de conteúdo de tarefas e limites dessas garantias.
A retenção tem duas camadas. O limite da plataforma é um compromisso público, não um ajuste interno. Dentro dele, você pode definir prazos próprios mais curtos e destruir o conteúdo de uma tarefa quando quiser.
A relação entre as camadas cabe em uma frase: você só pode reduzir o prazo; nenhuma configuração sua aumenta o limite.
Por quanto tempo guardamos os dados: limites da plataforma
| Dados | Limite da plataforma | Ao expirar |
|---|---|---|
| Arquivos gerados (imagem / vídeo / áudio) | Cerca de 14 dias | Excluídos do armazenamento de objetos |
| Mídia de curtas (imagens de cenas, vídeos e vozes criados em um projeto de curta do Spicy Studio e filmes exportados desse projeto) | Cerca de 60 dias | Excluída do armazenamento de objetos |
| Imagens de referência enviadas por você | 1 dia | O URI spicy:// expira em expiresAt da resposta de confirmação; o objeto é excluído depois |
Conteúdo da tarefa (prompts e parâmetros em input, referências de arquivos gerados em output) | 30 dias | Os dois campos são limpos; o registro da tarefa é mantido |
| Biblioteca de ativos (arquivos que você salva de propósito) | Até você excluir | Excluídos quando você exclui o ativo ou o proprietário encerra a conta; uma biblioteca de equipe é excluída junto com a equipe. Veja Mídia |
| Registros de tarefas (ID, modelo, estado, valor e horários, sem conteúdo de qualquer tipo) | Mantidos por prazo indeterminado | Não são excluídos. São a evidência em uma disputa de faturamento |
| Logs e eventos de tarefas (mudanças de estado, registros de entrega de webhooks) | Pelo menos 60 dias, com partições mensais, na prática de 2 a 3 meses | Excluídos |
| Registros de saldo e histórico financeiro | 10 anos | Mantidos para histórico da conta, conciliação e disputas; veja abaixo |
| Registros de auditoria | 2 anos | Removidos conforme a política após verificação de integridade |
| IP / UA em texto puro nos registros de segurança | 90 dias | Substituídos por pseudônimos HMAC versionados; isso não é anonimização |
| Backups do banco de dados | 35 dias | Substituídos em ciclos; a exclusão no aplicativo não apaga backups imediatamente |
Você pode reduzir os prazos das primeiras quatro linhas com os quatro controles abaixo: resultados gerados, incluindo mídia e dados de resultado, mídia de curtas, texto do prompt e arquivos enviados.
A mídia de curtas tem prazo maior porque um filme no Spicy Studio é construído ao longo de dias ou semanas, e uma cena criada na primeira semana ainda precisa existir quando o filme inteiro for exportado. Isso só vale para tarefas iniciadas em um projeto de curta no Studio; o mesmo modelo chamado pela API, por um SDK ou pelo Playground mantém o limite de 14 dias, e o texto do prompt mantém o limite de 30 dias em ambos os casos. Os demais prazos são obrigações da plataforma ou legais e não mudam com suas configurações.
Esses números são configurações do servidor, não constantes fixas no código
A tabela apresenta os limites atualmente vigentes, que também são os valores padrão: sem configurar nada, o comportamento permanece como antes. A operação pode alterá-los, pois as exigências de cada jurisdição mudam, mas qualquer alteração é tratada como mudança de conformidade: esta página e o comportamento real de exclusão precisam permanecer alinhados.
Se você precisa de outro prazo de retenção em contrato, trate disso antes de assinar, em vez de presumir com base nesta página.
A validade do URI de upload não é o prazo de conclusão da exclusão do objeto
O URI spicy:// retornado pela confirmação do upload só pode ser usado até o expiresAt da resposta, cujo padrão é 1 dia após a confirmação bem-sucedida. Nesse momento, o URI se torna imediatamente inválido para novas tarefas. O objeto correspondente é removido na limpeza, e a proteção final de exclusão pode levar até mais 24 horas; esse atraso não estende a validade do URI.
Por que “cerca de 14 dias”, e não “exatamente 14 dias”
A última camada de expiração é uma regra de ciclo de vida do armazenamento de objetos, cujo comportamento oficial é remover os objetos em até 24 horas após a expiração. Prometer um número inteiro e, na prática, excluir após 14 dias mais até um dia adicional seria falso; por isso, usamos “cerca de”.
O mesmo vale para os prazos curtos definidos por você. Configure uma hora, e a limpeza normalmente termina em minutos; ainda assim, usamos “cerca de uma hora” ou “no máximo”, nunca um prazo exato.
Baixe tudo que precisa guardar. Depois do prazo, nenhum link de download pode ser emitido, embora o registro da tarefa continue consultável e as movimentações permaneçam visíveis no histórico financeiro.
Quatro prazos, configurados separadamente
Eles respondem a quatro perguntas diferentes, não à mesma pergunta com quatro ajustes. Os nomes abaixo são os exibidos no console:
| Controle | Abrangência | Padrão, igual ao limite da plataforma | Opções |
|---|---|---|---|
| Resultados gerados | Imagens / vídeo / áudio gerados e dados do resultado | Cerca de 14 dias | 1 hora / 6 horas / 24 horas / 7 dias / 14 dias |
| Mídia de curtas | Mídia criada em um projeto de curta do Spicy Studio e filmes exportados dele | Cerca de 60 dias | 1 hora / 24 horas / 7 dias / 14 dias / 30 dias / 60 dias |
| Texto do prompt | Texto da solicitação: prompt e campos de texto de input | 30 dias | Igual aos resultados / 1 hora / 24 horas / 7 dias / 30 dias |
| Arquivos enviados | Arquivos enviados por você como referências | 1 dia | Excluir ao concluir a tarefa / 1 hora / 24 horas |
Configure-os em Retenção, na página Proteção de dados do console. Quando uma tarefa é aceita, recebe prazos próprios de expiração de resultado e prompt conforme essas configurações e o cabeçalho abaixo; você pode consultá-los em retention de recordInfo.
“Excluir ao concluir a tarefa” significa que um arquivo enviado é excluído quando todas as tarefas que o usam chegam a um estado final (succeeded / failed / canceled / expired), normalmente em até um minuto; não na criação da tarefa, pois uma nova tentativa precisa dele. Entenda a consequência antes: executar novamente a mesma imagem exige outro upload, e uma nova tentativa falhará.
Efeito de uma alteração sobre conteúdo existente
Alterar um prazo não é simplesmente mudar o comportamento “daqui em diante”. Algumas mudanças afetam tarefas que você já executou; outras não. Hoje funciona assim:
| Alteração | Efeito sobre tarefas e arquivos existentes |
|---|---|
| Texto do prompt para 1 hora ou 24 horas | Na próxima limpeza, geralmente em minutos, todas as tarefas concluídas há mais de um dia perdem o texto do prompt e seus resultados e arquivos gerados, mesmo que Resultados gerados ainda esteja em 14 dias. Depois, o mesmo ocorre com cada tarefa ao completar um dia desde a conclusão, salvo remoção anterior por outro motivo. |
| Texto do prompt para 7 dias | O mesmo, com 7 dias em vez de um. |
| Resultados gerados para um prazo menor, com Texto do prompt em Igual aos resultados | O mesmo que definir Texto do prompt nesse prazo: 7 dias alcança tarefas de 7 dias atrás; 1 hora, 6 horas ou 24 horas alcança tarefas de um dia atrás. |
| Resultados gerados para um prazo menor, com Texto do prompt em um valor próprio | Nada muda nas tarefas já executadas: cada uma mantém a expiração do resultado recebida na aceitação. Novas tarefas usam o prazo menor. |
| Arquivos enviados para Excluir ao concluir a tarefa | Aplica-se aos arquivos existentes quando você salva. Arquivos usados apenas por tarefas já encerradas são excluídos em cerca de um minuto; os demais, quando as tarefas que os usam terminarem. Arquivos enviados depois de salvar atualmente mantêm a expiração padrão indicada na resposta de confirmação. |
| Arquivos enviados para 1 hora ou 24 horas | Atualmente não altera nada: cada arquivo enviado permanece utilizável até o expiresAt da sua resposta de confirmação. |
| Qualquer prazo para um valor maior | Nada já excluído é recuperado, e tarefas existentes mantêm a expiração recebida. |
Algumas mudanças alcançam o passado porque, embora os prazos de cada tarefa sejam fixados na aceitação, uma segunda limpeza trabalha com dias inteiros. Ela usa a configuração de Texto do prompt, arredonda para cima para 1, 7 ou 30 dias e a aplica a todas as tarefas encerradas da conta. Ao limpar uma tarefa, limpa o texto do prompt e os resultados juntos.
A mesma página tem um segundo cartão, Retenção de conteúdo de tarefas, que controla diretamente essa limpeza por dias:
- Escolher 1 dia ou 7 dias limpa texto do prompt, resultados e arquivos gerados de todas as tarefas concluídas há mais tempo que o escolhido, e continua fazendo isso à medida que cada tarefa atinge essa idade.
- Ativar Limpar conteúdo logo após a conclusão limpa esses dados de todas as tarefas encerradas, incluindo as executadas antes da ativação, cerca de uma hora após a conclusão de cada uma.
- Os dois cartões compartilham configurações: salvar em um altera o valor exibido no outro.
Baixe o que quer guardar antes de reduzir qualquer prazo
Uma configuração menor pode excluir resultados e prompts de tarefas que você já executou, e conteúdo excluído não pode ser restaurado. Antes de salvar, o console mostra quantos itens espera afetar; trate o número como aviso, não como lista exata do que será removido.
Baixe primeiro todos os resultados que quiser guardar e só depois reduza o prazo. Aumentá-lo não exige esse cuidado: afeta apenas o futuro, e nada já excluído volta.
Ajuste por solicitação: X-Spicy-Retention
Quando você não quer alterar a configuração da conta, mas deseja que apenas esta geração seja removida mais cedo, envie o cabeçalho na criação da tarefa. O valor é um inteiro em segundos e se aplica aos arquivos e ao prompt desta tarefa:
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"- Só pode reduzir. O valor efetivo é
min(header, account setting, platform cap). Depois que um administrador define a conta em uma hora, uma solicitação não pode recuperar 14 dias; caso contrário, a configuração seria apenas uma sugestão. 0é válido e significa “excluir os arquivos assim que a tarefa atingir um estado final”.- Um valor inválido não faz a solicitação falhar. Um número negativo é ajustado para
0; um valor acima do limite é reduzido ao limite; um valor que não seja um inteiro decimal é ignorado, aplicando-se a configuração da conta. O valor efetivamente aplicado sempre é informado emretentionderecordInfo. Um cabeçalho que só pede mais cautela nunca deve impedir uma geração. - Endpoints que o leem.
jobs/createTaskejobs/streamo leem.jobs/retryherda o valor efetivo da tarefa original e ignora o cabeçalho: uma nova tentativa repete o mesmo trabalho, e escolher outro prazo daria duas expirações a uma mesma família de tarefas.jobs/quotenão o lê porque não cria tarefa.
recordInfo retorna retention para cada tarefa; a própria resposta de createTask não o inclui, portanto consulte depois que a tarefa existir:
{
"retention": {
"outputsExpireAt": "2026-09-13T12:00:00Z",
"promptsExpireAt": "2026-09-13T12:00:00Z",
"source": "header"
}
}source indica a camada determinante: header, esta solicitação; account, a configuração da conta; ou platform, o limite. Enviar o cabeçalho e ainda receber account significa que a configuração da conta já era menor que o prazo pedido.
Antes do término, outputsExpireAt é medido a partir da aceitação; quando a tarefa chega a um estado final, a referência passa para a conclusão, usando o mesmo intervalo. Portanto, o horário só se move para mais tarde, nunca para antes. Confie nos horários da resposta, em vez de recalculá-los: o resultado dos três limites nem sempre é o esperado. Além da destruição solicitada por você, só uma configuração da conta que alcance tarefas anteriores pode remover conteúdo antes desses horários, conforme explicado acima.
Destruir conteúdo sob demanda: POST /jobs/purge
Quando você não quer esperar a expiração:
- No console, abra a tarefa em Logs e escolha Destruir saídas, a mesma ação do endpoint abaixo.
- Remover do histórico, na mesma tarefa, também limpa prompt e resultado, agenda a exclusão da mídia e, além disso, oculta a tarefa dos seus logs. A ação fica disponível depois do encerramento da tarefa e da liquidação do faturamento.
Nenhuma das ações muda a cobrança nem cancela uma tarefa. Por 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..."}'| Removido | Mantido |
|---|---|
| Os próprios objetos dos arquivos gerados | Lançamentos financeiros e valores |
Dados do resultado (output) | Estado da tarefa e horários |
Prompt e texto de input | Identificador do modelo e request_id |
A resposta:
{
"taskId": "job_01k...",
"contentState": "purged",
"purgedAt": "2026-09-13T12:00:00Z",
"contentRemovedBy": "user",
"billingRetained": true,
"mediaDeletionPending": true
}Algumas regras:
- Somente tarefas em estado final (
succeeded/failed/canceled/expired). Espere a tarefa em execução terminar: os arquivos ainda não chegaram, e uma exclusão pela metade é pior que não excluir. Uma tarefa de geração não pode ser cancelada após a aceitação; não existe um caminho de “cancelar primeiro, destruir depois”. - Idempotente e sem necessidade de
Idempotency-Key. O endpoint é idempotente portaskId: chamá-lo de novo para uma tarefa já destruída ainda retorna 200, epurgedAté o horário da primeira destruição, não desta chamada. Repetir após um tempo limite é seguro. - A resposta significa “agendado”, não “já excluído”. Enquanto
mediaDeletionPendingfor verdadeiro,contentStatejá épurged, mas a limpeza em segundo plano ainda não terminou de remover os objetos; normalmente termina em até um minuto. Excluir de forma síncrona permitiria que um único objeto problemático bloqueasse toda a solicitação, justamente quando você precisa de uma resposta clara. - Uma resposta ainda em
presentsignifica que esta chamada não removeu nada, por exemplo porque a tarefa está sob obrigação de preservação. Você pode tentar depois; o motivo específico não é divulgado intencionalmente. billingRetainedsempre étrue. Parece redundante, mas está ali porque é a informação que o usuário mais provavelmente interpretaria de forma errada nesse endpoint; veja abaixo.
Destruir não é cancelar nem receber reembolso
purge afeta somente conteúdo. Não muda nada no faturamento:
- Uma cobrança liquidada continua liquidada. Destruir os arquivos não devolve o dinheiro.
- Uma reserva já liberada por falha ou expiração continua liberada; destruir não a libera novamente.
- A cobrança permanece na página de faturamento com valor, horário e modelo.
Isso é intencional. Registros financeiros são a evidência da transação para as duas partes e seguem uma política de retenção de 10 anos; o conteúdo é seu e pode ser removido a pedido. São duas categorias de dados, não duas faces da mesma coisa.
Em uma frase: destruir remove o conteúdo, não o registro dos seus gastos.
contentState: existência do conteúdo e responsável pela remoção
Os detalhes da tarefa têm um contentState com três valores:
| Valor | Significado | Quando aparece |
|---|---|---|
present | O conteúdo ainda existe | Estado normal e forma de interpretar tarefas antigas, anteriores ao campo |
expired | Removido automaticamente na expiração | O prazo efetivo de retenção passou e a limpeza foi executada |
purged | Você o destruiu | Você chamou jobs/purge ou escolheu Destruir saídas |
Os dois últimos incluem purgedAt, quando o conteúdo foi removido, e contentRemovedBy, com system para a limpeza e user para você.
A palavra `expired` aparece em dois lugares com significados diferentes
- Estado da tarefa
expired: a geração excedeu o tempo limite e não produziu nada. contentStateexpired: ela produziu algo, mas o conteúdo foi removido depois pelas configurações de retenção.
Os dois usam a mesma palavra em inglês. Um único rótulo “Expirado” na sua interface mistura duas situações sem relação: a primeira pede nova tentativa; a segunda não recupera aquele resultado, por mais que você tente novamente.
Exibir purged como “expirado” erra pelo mesmo motivo, no sentido inverso: um caso decorre de um botão pressionado pelo usuário; o outro, da execução programada da nossa política. Inverter a explicação faz as pessoas concluírem que a plataforma perdeu seus arquivos.
A expiração limpa campos, não registros
As duas partes desta frase importam; a primeira isolada é enganosa
O conteúdo é apagado ao fim do prazo de retenção; o registro de faturamento e status, que não contém conteúdo, é mantido por prazo indeterminado.
Dizer apenas a primeira parte é literalmente verdadeiro, mas ainda cria uma impressão errada: o que desaparece é o conteúdo de input e output, não o registro da tarefa.
A limpeza abrange input, output, URLs de callback e o conteúdo relacionado de eventos e callbacks. O próprio registro da tarefa é mantido por prazo indeterminado: é a única evidência em uma disputa de faturamento, e apagá-lo quebraria a contabilidade. Depois, cada registro contém algumas centenas de bytes de metadados: ID da tarefa, modelo, estado, valor, horários e chave de origem. A destruição sob demanda segue a mesma regra; só o momento é escolhido por você.
Depois que o conteúdo é removido:
- Você ainda pode responder “quanto fui cobrado neste mês, quais tarefas falharam e qual chave as enviou”.
- Você não pode responder “qual prompt enviei e qual chave de objeto guardava o arquivo”:
recordInfodeixa de retornarinputeoutputa partir daí.
Se precisar de prompts por mais tempo, mantenha uma cópia própria. Uma obrigação ativa de preservação suspende a exclusão correspondente e também bloqueia a destruição sob demanda; nenhuma das duas pode restaurar uma saída já excluída fisicamente.
Histórico de saldo é separado do conteúdo das tarefas
Limpar input e output de uma tarefa, por expiração ou por destruição solicitada, não altera recargas, reservas, liquidações, reservas devolvidas nem ajustes manuais. Você ainda pode conciliar essas movimentações na página de faturamento do console. Registros do histórico financeiro seguem uma retenção de dez anos e não são removidos quando o conteúdo de uma tarefa expira ou é destruído.
Se uma solicitação de acesso ou exclusão abranger dados que precisam ser mantidos por disputa, investigação de segurança ou legislação aplicável, nossa resposta explicará o escopo e o motivo.
Duas coisas que não podemos fazer
1. O modelo que executa sua solicitação necessariamente vê o prompt em texto puro
A geração é feita pelo modelo que você seleciona, e o prompt precisa chegar a ele em texto puro. É um limite de arquitetura, não uma configuração; reduzir seu prazo para uma hora não muda isso. Portanto, nossos prazos de retenção só podem garantir por quanto tempo a própria SpicyAPI guarda algo.
O que acontece com um prompt depois de chegar ao modelo está fora do controle das nossas configurações de retenção. Se isso importa para seu caso de uso, entre em contato antes de enviar material sensível.
2. Não existe “exclusão imediata”
A regra final de ciclo de vida pode levar até 24 horas para executar, e backups do banco de dados são substituídos em ciclos de 35 dias. Qualquer afirmação de que dados desaparecem instantaneamente de todos os lugares é falsa. Podemos nos comprometer com o prazo de conclusão, não com uma remoção instantânea; por isso, o endpoint de destruição responde “agendado”, não “excluído”.
A exceção: obrigações legais de preservação
Tarefas envolvidas em disputas, solicitações periciais ou obrigações legais de denúncia são colocadas sob preservação e param de contar o prazo até sua liberação. A destruição sob demanda não ocorre enquanto a preservação estiver em vigor.
Isso prevalece sobre todos os números e configurações acima. Não é uma exceção reservada em silêncio: sem um mecanismo de preservação, a primeira notificação legal obrigaria a descumprir uma promessa de retenção, e você teria de explicar por que a documentação dizia 14 dias. Essa informação está aqui porque faz parte do assunto.
O que está nas suas mãos
- Defina cada prazo conforme sua necessidade real. São separados: não altere uploads para “Excluir ao concluir a tarefa” como consequência indireta de querer prompts por menos tempo.
- Baixe antes de reduzir. Um prazo menor pode alcançar tarefas já executadas; veja efeitos de uma alteração.
- Use
X-Spicy-Retentionem solicitações sensíveis pontuais. Não é necessário reconfigurar a conta inteira para uma geração. - Não envie o que não precisa enviar. Imagens de referência e prompts são os dois itens mais sensíveis e os únicos cujo conteúdo você escolhe.
- Arquive seus próprios arquivos gerados. Eles duram no máximo cerca de 14 dias, ou 60 dias para mídia de curtas, e menos se você reduzir o prazo.
- Guarde uma cópia dos dados da conta. Baixar seus dados, na página Proteção de dados, fornece um JSON com perfil, papéis em equipes, detalhes de chaves de API, nunca os segredos, dados de tarefas ainda retidos e registros financeiros. Não inclui arquivos de mídia; baixe separadamente os resultados necessários.
- Não armazene URLs de download no banco de dados. Elas expiram em 20 minutos e não podem ser revogadas após a emissão. Assine uma quando precisar; veja Mídia.
- Use HTTPS nas URLs de callback. O conteúdo inclui estado da tarefa e referências de arquivos; HTTP simples os expõe a qualquer pessoa no caminho.
Não treinamos com seu conteúdo
Seus prompts, imagens de referência e arquivos gerados não entram em nenhum conjunto de treinamento.
O limite dessa frase importa: ela se refere a nós. Não somos nós que definimos as políticas de cada modelo; veja o primeiro ponto acima.
Console e equipes
O que cada página do console da SpicyAPI faz e quando usá-la, e como as equipes compartilham chaves de API e limites de gasto enquanto o proprietário da equipe paga.
OpenAPI e índice de endpoints
Contrato OpenAPI 3.1 para download, todos os endpoints públicos com seus guias, cabeçalhos compartilhados e endereço de produção.

