APIMaster.ai

Idempotencia de Seedance y recuperación de envíos

Idempotencia de Seedance y recuperación de envíos — Idempotency-Key, HTTP 409, acceptance_unknown.

Idempotencia de Seedance y recuperación de envíos

Use Idempotency-Key con seedance-2.0, seedance-2.0-fast, seedance-2.0-mini y seedance-2.5. POST /v1/videos, POST /v1/videos/generations y POST /v1/video/generations comparten las claves. No cubre imágenes, presupuestos, remix ni otros modelos de vídeo. Sin clave no hay garantía general de deduplicación.

Ámbito y claves

La clave se limita a la cuenta APIMaster y a la operación de generación de vídeo Seedance, no a una API Key o modelo individual. Use una nueva clave aleatoria de 8–128 caracteres ASCII visibles por generación. Una credencial válida de la misma cuenta puede consultar el recibo. Los tokens agotados pueden consultar o repetir recibos existentes; las claves caducadas, revocadas o eliminadas y cuentas bloqueadas no. Las nuevas generaciones requieren credenciales válidas y cuota suficiente.

Repetición atómica y conflictos

Se guarda un registro atómico antes del enrutamiento, cobro y contacto con el proveedor. La misma clave y contenido devuelve HTTP 202, el recibo original y el ID preasignado, sin otro envío ni reserva, incluso con reintentos concurrentes o reinicios. Un cambio devuelve HTTP 409 (idempotency_conflict). Se ignoran orden de objetos JSON y espacios, pero se comparan orden de arrays, números, valores omitidos o predeterminados explícitos, modelo, notificaciones y grupo/canal. En multipart se comparan bytes y orden de archivos, no límites ni nombres. Mantenga cuerpo y ruta; JSON y multipart son distintos. Se conservan al menos 30 días; esta versión no elimina registros automáticamente ni reutiliza claves.

Respuestas

La primera petición conserva la respuesta habitual. Guarde X-Video-Submission-Id, ID de petición y tarea. Las repeticiones devuelven un recibo con formato posiblemente distinto. El ID preasignado no demuestra aceptación del proveedor. accepted no significa generación completada. Consulte la tarea solo con task_ready=true; de lo contrario contacte con soporte sin reenviar.

Estados de envío

pending: registrado en la pasarela, aún sin enviar. submitting: envío iniciado, resultado pendiente. accepted: ID del proveedor recibido. not_accepted: no se envió al proveedor; corrija y cree con nueva clave. acceptance_unknown: posiblemente aceptado, sin confirmación; no genere otra vez. Tras una caída, la consulta clasifica registros sin terminar después de 30 minutos: antes del envío not_accepted, después acceptance_unknown. No hay reenvío automático. Son estados de envío, no de facturación; siguen aplicándose reservas, liquidación y conciliación de devoluciones.

Recuperación

Tras timeout o 5xx consulte la misma clave, aunque no tenga ID. Repetir idénticamente es seguro pero no reinicia envíos fallidos. Un 404, lista vacía o ausencia de cargos no demuestra falta de aceptación: puede haber una petición en tránsito, sin clave o anterior a esta función. same_key_replay_safe permite recuperar el recibo; new_submission_safe=true solo aparece para not_accepted. En resultado desconocido o accepted con task_ready=false, dé a soporte los ID de recibo/petición, modelo y hora UTC, nunca la API Key. No se garantiza idempotencia del proveedor oficial. Los recibos antiguos de retratos mantienen su proceso y pueden devolver el esquema anterior.

Ejemplos

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"