API для бизнеса

Проверка адресов и транзакций из ваших систем: запросы, ответы, учёт вызовов и коды ошибок.

Доступ

Базовый адрес: https://api.arbiter-pro.ru/api/v1/b2b. Ключ создаётся в личном кабинете в разделе «API-ключи» и передаётся в заголовке X-API-Key. Ключ целиком показывается один раз.

Доступ к API входит в тарифы «Про» (10 000 вызовов в месяц) и «Бизнес» (100 000 вызовов в месяц), подробнее на странице «Тарифы».

Описание в формате OpenAPI 3.0 для генерации клиента и импорта в Postman: openapi.yaml.

Что списывается

ДействиеВызовы APIПроверки
Новая проверка адреса11
Проверка адреса из сохранённого результата (24 часа)10
Проверка транзакции11 за обе стороны; 0, если обе уже проверялись
Получение результата по id10
Запрос с ошибкой10
Остаток лимитов и использование (quota, usage)00

Лимит запросов в минуту задаётся для каждого ключа и показан в кабинете. Там же статистика по ключам и месяцам с выгрузкой в CSV.

Запросы

МетодАдресНазначение
POST/checksПроверить адрес. Поля: address, network (TRC20, ERC20, BSC20)
GET/checks/{id}Получить проверку адреса
POST/tx-checksПроверить транзакцию. Поля: tx_hash, network (необязательно)
GET/tx-checks/{id}Получить проверку транзакции
GET/quotaОстаток проверок, заключений и вызовов API
GET/usage?months=6Использование по ключам и месяцам

Ответ приходит сразу. Пока status равен pending или processing, проверка идёт и оценки нет: повторяйте GET /checks/{id} или GET /tx-checks/{id} раз в несколько секунд. Обычно результат готов за две минуты, максимум за 20. Решение о переводе принимайте только при status = completed или cached. Косая черта в конце адреса не ставится. Успешный ответ приходит в поле data, ошибка в поле error.

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

curl -X POST https://api.arbiter-pro.ru/api/v1/b2b/checks \
  -H "X-API-Key: ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{"address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "network": "TRC20"}' 
{
  "data": {
    "id": "6f0c1d1e-3b0a-4a51-9c35-0d3f6a2f6c11",
    "address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "network": "TRC20",
    "status": "completed",
    "risk_score": 32,
    "risk_level": "medium",
    "categories": [
      {"name": "counterparty_concentration", "weight": 0.4}
    ],
    "exposure": [
      {"category": "exchange", "title": "Биржа", "share": 0.557,
       "direct_share": 0.557, "entities": ["Binance", "Bybit"], "evidence": false}
    ],
    "cached": false,
    "quota_consumed": true,
    "created_at": "2026-10-05T09:14:02Z",
    "completed_at": "2026-10-05T09:14:11Z"
  }
}

risk_score: от 0 до 100; risk_level: low (0-25), medium (26-50), high (51-75), critical (76-100). categories: сигналы риска с весами. exposure: контрагенты с долями в обороте; evidence = true: строка основана на официальном включении в санкционный список.

Проверка транзакции

curl -X POST https://api.arbiter-pro.ru/api/v1/b2b/tx-checks \
  -H "X-API-Key: ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{"tx_hash": "7871f20fb4d49cab07a2de28cbd359212329dc5f384edc5f95d5a7bef93a7447"}' 
{
  "data": {
    "id": "0b6f6a4e-7a57-4f0b-8f0e-3a1c2a9d7e52",
    "tx_hash": "7871f20fb4d49cab07a2de28cbd359212329dc5f384edc5f95d5a7bef93a7447",
    "network": "TRC20",
    "status": "completed",
    "risk_score": 32,
    "risk_level": "medium",
    "from_address": "TQrY8tryqsYVCYS3MFbtffiPp2ccyn4STm",
    "to_address": "TBFR8S4BudY28FJQJHw2uLxVxB2epJCXuW",
    "asset": "USDT",
    "amount": "8015.399555",
    "tx_time": "2026-10-05T12:34:33Z",
    "transfers": [
      {"from": "TQrY8tryqsYVCYS3MFbtffiPp2ccyn4STm",
       "to": "TBFR8S4BudY28FJQJHw2uLxVxB2epJCXuW",
       "asset": "USDT", "token": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
       "amount": "8015.399555"}
    ],
    "from": {"…": "полная проверка адреса отправителя"},
    "to": {"…": "полная проверка адреса получателя"},
    "quota_consumed": true
  }
}

Оцениваются отправитель и получатель основного перевода, risk_score транзакции равен худшей из двух оценок. Сеть можно не указывать: хеш ищется в TRON, Ethereum и BNB Smart Chain.

Уведомления на ваш сервер

Чтобы не опрашивать GET, укажите адрес своего сервера в кабинете: раздел «API-ключи», блок «Уведомления на ваш сервер». Когда проверка готова, на этот адрес приходит POST с результатом.

СобытиеКогда
check.completedПроверка адреса готова (status = completed или cached)
check.failedПроверка адреса не удалась, лимит не списан
tx_check.completedПроверка транзакции готова
tx_check.failedПроверка транзакции не удалась, лимит не списан
watch.risk_raisedУровень риска кошелька из раздела «Наблюдение» вырос
pingПроверочное событие из кабинета
POST https://example.ru/aml/webhook
Content-Type: application/json
X-Webhook-Event: check.completed
X-Webhook-Id: 3d5e1c2a-8f0b-4c7e-9a61-2b4f0e7d9c13
X-Webhook-Signature: t=1792400000,v1=5f0c…e81a

{
  "id": "3d5e1c2a-8f0b-4c7e-9a61-2b4f0e7d9c13",
  "event": "check.completed",
  "created_at": "2026-10-19T12:01:00Z",
  "data": {
    "check_id": "6f0c1d1e-3b0a-4a51-9c35-0d3f6a2f6c11",
    "address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "network": "TRC20",
    "status": "completed",
    "risk_score": 32,
    "risk_level": "medium",
    "completed_at": "2026-10-19T12:01:00Z"
  }
}

Заголовок X-Webhook-Signature имеет вид t=время,v1=подпись. Подпись считается как HMAC-SHA256 от строки «время.тело запроса» на секрете из кабинета, в hex. Проверяйте её по сырому телу запроса до разбора JSON, запросы старше пяти минут отклоняйте.

Ответ 2xx означает, что событие доставлено, иначе повтор через 1, 5 и 30 минут, 2, 6, 12 и 24 часа, всего 8 попыток. X-Webhook-Id одинаков во всех попытках одного события, по нему отбрасывайте дубли. Редиректы не выполняются, адрес должен быть https и не во внутренней сети.

Стороны проверенной транзакции проверяются как обычные адреса, по ним тоже приходит check.completed.

import hmac, hashlib, time

def verify(secret: str, header: str, body: bytes) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    if abs(time.time() - int(parts["t"])) > 300:
        return False
    signed = parts["t"].encode() + b"." + body
    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

Ошибки

{
  "error": {
    "code": "QUOTA_EXHAUSTED",
    "message": "API call allowance exhausted or not included in the plan",
    "request_id": "c2a1…"
  }
}
HTTPКодПричина
400INVALID_INPUTНеверные данные, либо транзакция не подтверждена, не исполнена сетью или не переводит средств. Проверка не списывается.
401UNAUTHORIZEDКлюч не передан, неверен или отозван.
402QUOTA_EXHAUSTEDИсчерпаны проверки или вызовы API, либо тариф не включает API.
403FORBIDDENПроверка принадлежит другой учётной записи.
404NOT_FOUNDПроверка или транзакция не найдена.
422HTTP_ERRORНе заполнено обязательное поле или неверный формат значения.
429RATE_LIMITEDПревышен лимит запросов ключа в минуту.
502AML_PROVIDER_ERRORИсточник данных блокчейна недоступен. Повторите запрос, проверка не списывается.

Вопросы по подключению: info@arbiter-pro.ru. В обращении укажите request_id из ответа.