Для пользователей из материкового Китая: используйте
https://toapis.cn в качестве эндпоинта (Base URL). Замените https://toapis.com на https://toapis.cn во всех примерах этого документа.generation.completed и generation.failed; тест — endpoint.test. Доставка at-least-once: обрабатывайте повторный event ID идемпотентно.
В настройках Token задайте HTTPS URL, создайте 32-byte secret (показывается один раз), включите Webhook и отправьте тест. Без callback_url используется URL Token. Переопределение может менять только path/query при том же scheme/host/port. Без настройки: 400 webhook_not_configured.
data.error не гарантирует поле reason, доступное в некоторых проверках задач.
task_type: image|video. Result соответствует публичному query API. Channel ID, upstream task ID/keys, credentials и PrivateData не передаются.
Использование, оплата и отличия от запроса задачи
Успешные события изображений и видео могут содержатьdata.usage: оплачиваемые количества, доступные токены модели и счётчики инструментов. Определения совпадают с запросами задач; см. Поля использования задачи. Видеособытия также могут содержать data.generation; метаданные Seedance и поле совместимости описаны в запросе видеозадачи.
data.billing может содержать status, credits, cost_usd. Суммы являются десятичными строками и опускаются при pending; refunded означает подтверждённую нулевую итоговую плату. Неподтверждённый объект опускается, что не означает бесплатное использование. Webhook и запрос задачи используют одинаковые условия подтверждения: если списание подтверждено, в том числе для задач с фиксированной ценой, оплаченных сразу при отправке, оба возвращают settled и фактическую сумму. Если data.usage содержит количества для тарификации, например charge_type, data.billing тоже всегда имеет статус settled.
Значения полей data.billing
Успешные события получают
settled, а refunded - если при расчёте возвращено всё предварительно зарезервированное. Событие о сбое отправляется после завершения возврата и получает refunded. Если сумму подтвердить нельзя, объект data.billing пропускается целиком.
Значения полей data.usage
Поля от
charge_type до input_images - это оплачиваемые количества, они возвращаются только вместе с data.billing.status=settled. Детализация токенов и счётчики инструментов возвращаются независимо, в том виде, как их предоставила вышестоящая модель. Не возвращённые поля пропускаются и не заменяются нулями.
Webhook содержит снимок на момент создания события, а запрос задачи читает последнее подтверждённое состояние. Доставка не ждёт отсутствующих количеств или сумм; правила повторов не меняются. Созданные события не дополняются задним числом, повторы используют исходное тело события.
Структура события и api_version: "v1" не меняются. Webhook использует data.task_id, SUCCESS / FAILURE и строковый прогресс "100%"; запрос задачи - id, статусы в нижнем регистре и целочисленный прогресс. Поля времени совпадают по именам и смыслу с публичным запросом generation.task, все значения в Unix-секундах: data.created_at - время отправки задачи, data.finished_at - время завершения, а успешные события также содержат data.completed_at и data.expires_at (срок действия результата, время завершения плюс 24 часа). Поля без значения опускаются. Прежнее поле data.submitted_at заменено на data.created_at и больше не передаётся. Верхнее поле события created_at означает время создания события, а не время отправки задачи. URL медиа могут отличаться из-за разных политик доступа.
Пример успешного видеособытия Seedance
Примеры показывают поля, а не текущие цены модели или постоянный способ тарификации. Используйте поля и суммы, возвращённые для конкретной задачи. Успешные события Seedance также могут содержатьfallback_url и fallback_last_frame_url в data.result.data[]. Сначала используйте url и last_frame_url, а резервные адреса только при недоступности исходных. Отсутствие резервных полей не означает ошибку задачи. Событие сохраняет URL на момент создания: последующие изменения копий не меняют существующее событие и его повторные отправки. Определения полей и правила использования см. в разделе Статус видеозадачи.
event_id + "." + timestamp + "." + raw_request_body, HMAC-SHA256. Для первой доставки отклоняйте timestamp старше 5 минут. 24 часа после ротации принимайте новую или предыдущую подпись.
Python
Node.js
Go
2xx; 3xx не перенаправляются, 4xx/5xx повторяются, timeout 10 секунд. HTTPS, userinfo, fragment, недопустимый port, SSRF, DNS/IP и DNS rebinding проверяются при каждой доставке. Используйте query API как резерв и быстро сохраняйте временные result URL. Real-avatar, платежи и OAuth callback не меняются. Лимиты.