Idempotência Seedance e recuperação de envios
Idempotência Seedance e recuperação de envios — Idempotency-Key, HTTP 409, acceptance_unknown.
Idempotência Seedance e recuperação de envios
Use Idempotency-Key com seedance-2.0, seedance-2.0-fast, seedance-2.0-mini e seedance-2.5. POST /v1/videos, POST /v1/videos/generations e POST /v1/video/generations compartilham as chaves. Imagens, estimativas, remix e outros modelos de vídeo não são cobertos. Sem chave, não há garantia geral de deduplicação.
Escopo e chaves
A chave pertence à conta APIMaster e à operação de vídeo Seedance, não a uma API Key ou modelo individual. Use uma nova chave aleatória de 8–128 caracteres ASCII visíveis por geração. Uma credencial válida da mesma conta pode consultar o recibo. Tokens esgotados podem consultar ou repetir recibos existentes; chaves expiradas, revogadas ou excluídas e contas bloqueadas não. Novas gerações exigem autenticação válida e cota suficiente.
Repetição atômica e conflitos
Um registro atômico é salvo antes do roteamento, cobrança e contato com o fornecedor. Mesma chave e conteúdo retornam HTTP 202, recibo original e ID pré-alocado, sem novo envio ou reserva, inclusive com concorrência e reinícios. Conteúdo diferente retorna HTTP 409 (idempotency_conflict). Ordem dos objetos JSON e espaços são ignorados; ordem de arrays, números, valores omitidos ou padrões explícitos, modelo, notificações e grupo/canal são comparados. multipart compara bytes e ordem dos arquivos, não limites ou nomes. Mantenha corpo e roteamento; JSON e multipart são distintos. Retenção mínima de 30 dias; esta versão não exclui automaticamente nem reutiliza chaves.
Respostas
A primeira requisição mantém a resposta normal. Salve X-Video-Submission-Id, ID de requisição e tarefa. Repetições retornam recibos e podem ter outro formato. O ID pré-alocado não comprova aceitação pelo fornecedor. accepted não significa geração concluída. Consulte a tarefa somente com task_ready=true; caso contrário, contate o suporte sem reenviar.
Estados de envio
pending: registrado no gateway, ainda não enviado. submitting: envio iniciado, resultado pendente. accepted: ID do fornecedor recebido. not_accepted: nenhum envio ao fornecedor; corrija e crie com nova chave. acceptance_unknown: possivelmente aceito, sem confirmação; não gere novamente. Após falha, a consulta classifica registros inacabados depois de 30 minutos: antes do envio not_accepted, depois acceptance_unknown. Não há reenvio automático. São estados de envio, não financeiros; reservas, liquidação e conciliação de reembolsos continuam aplicáveis.
Recuperação
Após timeout ou 5xx consulte a mesma chave, mesmo sem ID. Repetir conteúdo idêntico é seguro, mas não reinicia envios falhos. 404, lista vazia ou ausência de cobranças não comprovam não aceitação: requisição em trânsito, sem chave ou anterior à função. same_key_replay_safe refere-se ao recibo; new_submission_safe=true apenas para not_accepted. Para resultado incerto ou accepted com task_ready=false, envie ao suporte IDs de recibo/requisição, modelo e horário UTC, nunca a API Key. Não há promessa de idempotência no fornecedor oficial. Recibos antigos de retratos mantêm o fluxo e podem usar o esquema anterior.
Exemplos
curl --fail-with-body 'https://apimaster.ai/v1/videos' \
-H "Authorization: Bearer $APIMASTER_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: seedance-order-20261014-001' \
-d '{"model":"seedance-2.0","prompt":"A paper boat on a pond","duration":4,"resolution":"480p","generate_audio":false}'
curl --fail-with-body 'https://apimaster.ai/v1/video-submissions/by-key' \
-H "Authorization: Bearer $APIMASTER_KEY" \
-H 'Idempotency-Key: seedance-order-20261014-001'
{
"code": 200,
"data": {
"submission_id": "HASH",
"task_id": "task_PUBLIC_ID",
"request_id": "ORIGINAL_REQUEST_ID",
"model": "seedance-2.0",
"status": "accepted",
"task_ready": true,
"created_at": 1791936000,
"updated_at": 1791936001,
"next_action": "query_task",
"same_key_replay_safe": true,
"new_submission_safe": false,
"retention": "at_least_30_days_no_automatic_key_reuse"
}
}
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID' \
-H "Authorization: Bearer $APIMASTER_KEY"
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID/billing' \
-H "Authorization: Bearer $APIMASTER_KEY"
