Webhooks
Уведомления об изменении счетов, пополнений и выводов на ваш HTTPS-адрес в формате плоского JSON (camelCase, schemaVersion: 2).
Настройка
- Откройте настройки проекта.
- Перейдите в раздел «Интеграции».
- Укажите URL для уведомлений и сохраните настройки.
- Система создаст secret для проверки подлинности запросов.
Как это работает
- При значимом изменении счёта, депозита или вывода система сохраняет состояние объекта с новой
revisionи формирует событие. - Atomic Pay отправляет на ваш URL POST-запрос с JSON-телом и подписью в заголовках.
- Ваш сервер проверяет подпись по исходному телу, сохраняет событие и возвращает успешный ответ.
- Если сервер не отвечает или возвращает
5xx,408или429, доставка повторяется. - Дубликаты определяйте по
eventUuid. Для нескольких событий одной сущности обрабатывайте самую новуюrevision.
Типы событий
| type | eventType |
|---|---|
invoice | invoice.created, invoice.updated, invoice.partially_paid, invoice.completed, invoice.overpaid, invoice.expired, invoice.cancelled |
deposit | deposit.detected, deposit.confirmed, deposit.reorged, deposit.failed |
payout | payout.requested, payout.queued, payout.broadcasted, payout.confirmed, payout.failed, payout.cancelled |
Общие поля
| Поле | Описание |
|---|---|
schemaVersion | Версия схемы webhook. |
type | Тип сущности: invoice, deposit или payout. |
eventType | Событие, которое стало причиной отправки. |
eventUuid | Уникальный идентификатор события. Не меняется при повторной доставке. |
revision | Версия состояния сущности. Увеличивается при изменениях. |
uuid | Идентификатор сущности или депозита. |
projectUuid | UUID проекта. |
status | Текущее состояние сущности. |
isFinal | Признак финального состояния. |
occurredAt | Время события, UTC ISO 8601. |
createdAt | Время создания сущности, UTC ISO 8601. |
updatedAt | Время последнего изменения, UTC ISO 8601. |
uuid идентифицирует сущность или депозит, а не само событие. Для идентификации события используйте eventUuid.
merchantAmount и комиссии
В webhook merchantAmount рассчитывается до вычета сетевой комиссии. В HTTP API это поле учитывает окончательные комиссии и до их расчёта может быть null — не сравнивайте значения напрямую.
Пример: deposit.confirmed
- Депозит идентифицируйте по
uuid. Не используйтеtxidкак единственный идентификатор: одна транзакция может содержать несколько депозитов. walletAddressUuid— идентификатор адреса,staticWalletUuid— идентификатор статического кошелька. Не путайте их.
Пример: payout.cancelled
Для payout поле serviceFee в webhook не передаётся.
Доставка
| Ответ вашего сервера | Действие |
|---|---|
2xx | Успешная доставка. |
408, 429, 5xx, ошибки сети, таймаут, DNS | Повторная доставка. |
Остальные, включая 3xx и 409 | Окончательная ошибка, повтора не будет. |
По умолчанию выполняется 10 попыток, после чего событие переходит в состояние dead_letter. Между попытками — экспоненциальная задержка со случайным jitter от 0 до +20%:
Фиксированной задержки между попытками нет. Повторы прекращаются после успешного ответа или после последней попытки.
Обработка на вашей стороне
- Возвращайте
2xxтолько после того, как событие надёжно сохранено. - Повторная доставка того же
eventUuidне должна приводить к повторному зачислению — используйте его для дедупликации. - Порядок доставки не гарантируется: обрабатывайте дубликаты и события, пришедшие не по порядку.
Требования к URL
- Протокол HTTPS.
- Адрес доступен из интернета.
- Не localhost и не приватный IP.
- Без redirect — сервис не выполняет перенаправления.