К содержанию
Arbitpay Docs

Колбеки

Платформа уведомляет вас о каждом изменении статуса сделки HTTP-запросом на ваш адрес.

Адрес задаётся для каждой сделки отдельно — в поле callback_url при создании Депозиты или Выплаты. Поле необязательное: если его не передать, уведомление по этой сделке не отправляется.

Так можно направлять уведомления по разным сделкам на разные адреса — например, разделять потоки по проектам или окружениям.

События

Колбек уходит на каждый переход сделки в новый статус. Имя события — deal. и новый статус сделки:

СобытиеКогда отправляется
deal.pendingСделка ждёт подтверждения оплаты
deal.unconfirmedОплата по сделке не подтверждена
deal.paidСделка оплачена
deal.canceledСделка отменена — вручную или по таймауту
deal.disputeПо сделке открыт спор

Отдельно стоит событие, которое приходит не на смену статуса:

СобытиеКогда отправляется
deal.receiptК сделке прикрепили квитанцию

Уведомления о создании сделки нет: статус created сделка получает при создании через Депозиты или Выплаты.

Обрабатывайте события по полю event, а неизвестные — пропускайте: список событий может пополниться.

Квитанция

Событие deal.receipt уходит, когда к сделке прикреплён файл квитанции. Статус сделки при этом не меняется, поэтому уведомление о статусе не дублируется.

json
{
  "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_urlstringПрямая ссылка на файл квитанции
changed_atstringДата и время прикрепления

Блок deal тот же, что и у событий статуса, но без previous_status: статус не менялся.

Квитанцию по ссылке лучше сразу сохранить у себя: файл может быть заменён на новую версию. Сама ссылка при этом меняется, и по старой файла уже не будет.

Квитанцию можно и запросить: она приходит в поле deal.receipt_url при получении выплаты. Пока квитанции нет, поля в ответе не будет.

Запрос

ПараметрЗначение
МетодPOST
ТелоJSON
Таймаут5 секунд
Редиректыне отслеживаются

Заголовки

ЗаголовокОписание
Content-TypeВсегда application/json
X-EventТип события — см. раздел «События»
X-SignatureПодпись тела запроса — см. Проверка подписи

Тело

json
{
  "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"
}
ПолеТипОписание
eventstringТип события — см. раздел «События»
deal.uuidstringUUID сделки — по нему сопоставляйте со своей
deal.statusstringНовый статус сделки
deal.previous_statusstringСтатус до изменения
deal.typestringТип сделки: buy — депозит, sell — выплата
deal.payment_amountstringФактически оплаченная сумма
deal.total_coststringСтоимость сделки в USDT
deal.createdstringДата и время создания сделки
changed_atstringДата и время изменения статуса
paid_atstringТо же время; приходит только в deal.paid — оставлено для совместимости

Сумма в deal.payment_amount — та, которую реально ждали от плательщика. Она может отличаться от запрошенной при создании сделки, см. Депозиты.

Проверка подписи

X-Signature — это HMAC SHA-256 от сырого тела запроса, посчитанный на вашем api_key — том же, которым вы авторизуетесь в API.

Считайте подпись от тела до его разбора в объект: повторное кодирование JSON изменит строку и подпись не сойдётся.

php
$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, а не на порядок их прихода: доставка не гарантирует очерёдности.

© Arbitpay. Документация REST API.