Колбеки
Платформа уведомляет вас о каждом изменении статуса сделки HTTP-запросом на ваш адрес.
Адрес задаётся для каждой сделки отдельно — в поле callback_url при создании Депозиты или Выплаты. Поле необязательное: если его не передать, уведомление по этой сделке не отправляется.
Так можно направлять уведомления по разным сделкам на разные адреса — например, разделять потоки по проектам или окружениям.
События
Колбек уходит на каждый переход сделки в новый статус. Имя события — deal. и новый статус сделки:
| Событие | Когда отправляется |
|---|---|
deal.pending | Сделка ждёт подтверждения оплаты |
deal.unconfirmed | Оплата по сделке не подтверждена |
deal.paid | Сделка оплачена |
deal.canceled | Сделка отменена — вручную или по таймауту |
deal.dispute | По сделке открыт спор |
Отдельно стоит событие, которое приходит не на смену статуса:
| Событие | Когда отправляется |
|---|---|
deal.receipt | К сделке прикрепили квитанцию |
Квитанция
Событие deal.receipt уходит, когда к сделке прикреплён файл квитанции. Статус сделки при этом не меняется, поэтому уведомление о статусе не дублируется.
{
"event": "deal.receipt",
"deal": {
"uuid": "9c1f2b7e-4a3d-4f88-9c21-0e7b5d3a1122",
"status": "paid",
"type": "sell",
"payment_amount": "500.00",
"total_cost": "10.44",
"created": "2026-09-04 18:30:00"
},
"receipt_url": "https://arbitpay.online/files/deals/6038/kucb20fts8.jpg",
"changed_at": "2026-09-04 18:41:07"
}| Поле | Тип | Описание |
|---|---|---|
receipt_url | string | Прямая ссылка на файл квитанции |
changed_at | string | Дата и время прикрепления |
Блок deal тот же, что и у событий статуса, но без previous_status: статус не менялся.
Квитанцию по ссылке лучше сразу сохранить у себя: файл может быть заменён на новую версию. Сама ссылка при этом меняется, и по старой файла уже не будет.
Квитанцию можно и запросить: она приходит в поле deal.receipt_url при получении выплаты. Пока квитанции нет, поля в ответе не будет.
Запрос
| Параметр | Значение |
|---|---|
| Метод | POST |
| Тело | JSON |
| Таймаут | 5 секунд |
| Редиректы | не отслеживаются |
Заголовки
| Заголовок | Описание |
|---|---|
Content-Type | Всегда application/json |
X-Event | Тип события — см. раздел «События» |
X-Signature | Подпись тела запроса — см. Проверка подписи |
Тело
{
"event": "deal.paid",
"deal": {
"uuid": "8f14e45f-cea1-4a2c-9b7a-1d2e3f4a5b6c",
"status": "paid",
"previous_status": "pending",
"type": "buy",
"payment_amount": "1000.30",
"total_cost": "20.79",
"created": "2026-08-10 21:14:00"
},
"changed_at": "2026-08-10 21:47:12",
"paid_at": "2026-08-10 21:47:12"
}| Поле | Тип | Описание |
|---|---|---|
event | string | Тип события — см. раздел «События» |
deal.uuid | string | UUID сделки — по нему сопоставляйте со своей |
deal.status | string | Новый статус сделки |
deal.previous_status | string | Статус до изменения |
deal.type | string | Тип сделки: buy — депозит, sell — выплата |
deal.payment_amount | string | Фактически оплаченная сумма |
deal.total_cost | string | Стоимость сделки в USDT |
deal.created | string | Дата и время создания сделки |
changed_at | string | Дата и время изменения статуса |
paid_at | string | То же время; приходит только в deal.paid — оставлено для совместимости |
Сумма в deal.payment_amount — та, которую реально ждали от плательщика. Она может отличаться от запрошенной при создании сделки, см. Депозиты.
Проверка подписи
X-Signature — это HMAC SHA-256 от сырого тела запроса, посчитанный на вашем api_key — том же, которым вы авторизуетесь в API.
Считайте подпись от тела до его разбора в объект: повторное кодирование JSON изменит строку и подпись не сойдётся.
$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $body, $your_api_key);
// hash_equals защищает от подбора подписи по времени сравнения
if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}
$payload = json_decode($body, true);Запросы с неверной подписью обрабатывать нельзя — адрес колбека может быть известен посторонним, и подпись остаётся единственным доказательством того, что уведомление отправили мы.
Ответ
Отвечайте кодом 2xx — любой другой код, таймаут или сетевая ошибка считаются недоставкой.
Тело ответа не разбирается, его можно оставить пустым.
Повторы
Повторных отправок нет: колбек уходит один раз, в момент смены статуса. Ошибка доставки не влияет на сделку — статус уже записан. Каждая отправка вместе с ответом получателя пишется в лог на стороне платформы, так что недоставленное уведомление можно поднять вручную.
Статус может меняться и обратно — например, из unconfirmed в paid. Ориентируйтесь на порядок событий по changed_at, а не на порядок их прихода: доставка не гарантирует очерёдности.