APIMaster.ai

Идемпотентность Seedance и восстановление отправок

Идемпотентность Seedance и восстановление отправок — Idempotency-Key, HTTP 409, acceptance_unknown.

Идемпотентность Seedance и восстановление отправок

Добавляйте Idempotency-Key для seedance-2.0, seedance-2.0-fast, seedance-2.0-mini, seedance-2.5. POST /v1/videos, POST /v1/videos/generations, POST /v1/video/generations используют общее пространство ключей. Изображения, оценка стоимости, remix и другие видеомодели не охвачены. Без ключа общей гарантии дедупликации нет.

Область действия и ключи

Ключ относится к аккаунту APIMaster и операции генерации видео Seedance, а не к отдельному API Key или модели. Для каждой новой генерации используйте новый случайный ключ из 8–128 видимых ASCII-символов. Действующий ключ того же аккаунта позволяет найти квитанцию. Токены с исчерпанной квотой могут читать или повторно получать существующие квитанции; истёкшие, отозванные, удалённые ключи и заблокированные аккаунты — нет. Новая генерация требует действующих полномочий и достаточной квоты.

Атомарные повторы и конфликты

До маршрутизации, списания и обращения к поставщику атомарно сохраняется запись в БД. Тот же ключ и содержимое возвращают HTTP 202, исходную квитанцию и заранее выделенный ID задачи без новой отправки или резервирования, включая конкурентные повторы и перезапуски. Изменение даёт HTTP 409 (idempotency_conflict). Порядок полей объектов JSON и пробелы игнорируются; порядок массивов, числа, пропущенные и явно заданные значения по умолчанию, модель, уведомления и группа/канал учитываются. multipart сравнивает байты и порядок файлов, не границы или имена. Сохраняйте тело и маршрутизацию; JSON и multipart различаются. Записи хранятся минимум 30 дней; автоматического удаления и повторного использования ключей в этой версии нет.

Ответы

Первый запрос сохраняет обычный ответ создания. Запишите X-Video-Submission-Id, ID запроса и задачи. Повтор возвращает квитанцию, формат может отличаться. Предварительный ID не доказывает принятие поставщиком. accepted не означает завершение генерации. Опрашивайте задачу только при task_ready=true; иначе обратитесь в поддержку без повторной отправки.

Состояния отправки

pending: записано шлюзом, отправка не начата. submitting: отправка начата, результат ожидается. accepted: получен ID поставщика. not_accepted: поставщику не отправлялось; исправьте ошибку и создайте с новым ключом. acceptance_unknown: возможно принято, подтверждения нет; новая генерация запрещена. После сбоя незавершённые записи классифицируются при чтении через 30 минут: до отправки not_accepted, после acceptance_unknown. Автоматических повторных отправок нет. Это состояния отправки, а не расчётов; резервирование, расчёт и сверка возвратов продолжают действовать.

Восстановление

После таймаута или 5xx ищите по тому же ключу даже без ID задачи. Идентичный повтор безопасен, но не перезапускает неудачную отправку. 404, пустой список и отсутствие списаний не доказывают непринятие: исходный запрос ещё в пути, без ключа или до появления функции. same_key_replay_safe означает повторное получение квитанции; new_submission_safe=true только для not_accepted. При неизвестном результате либо accepted с task_ready=false передайте поддержке ID квитанции/запроса, модель и время UTC, но не API Key. Идемпотентность официального поставщика не гарантируется. Старые квитанции портретов сохраняют прежний путь повторов и могут иметь старую схему.

Примеры

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"