ChainZap
Разделы


EnglishРусскийBahasa Indonesia
Кабинет

Поиск работает в браузере. Выберите результат клавишами ↑ ↓ и откройте его клавишей Enter.

Transaction Decision API

Подключите проверки TRON, Ethereum и TON, учитывайте покрытие и правила повторных запросов.

Проверка транзакции перед зачислением

ChainZap проверяет транзакцию в блокчейне до того, как ваше приложение засчитает платёж полученным. Один ответ объединяет факты о транзакции, сигналы риска и, если вы попросите, сравнение с ожидаемыми получателем, токеном и суммой.

Что можно проверить

Адаптеры TRON, Ethereum mainnet и TON mainnet реализованы. Проверки TRON доступны каждой новой организации сразу. TON работает в режиме предварительного доступа, и его проверки исполненных транзакций сейчас возвращают LIMITED_DATA; проверки Ethereum подключает поддержка по запросу. Войдите с аккаунтом ChainZap в кабинет разработчика, создайте API-ключ и начните с канонического transaction quickstart.

  • POST /v1/transaction/check: канонический подробный ответ контракта 0.3. Сеть обязательна; ожидаемые данные платежа включают verification.
  • POST /v1/check: передайте хеш транзакции. Сеть и ожидаемые данные платежа необязательны. Ответ содержит краткую оценку и полные данные в details.
  • POST /v1/wallet/check: передайте адрес кошелька. Сеть определяется по его формату. Ответ содержит состояние, уровень покрытия и коды причин, а в details факты по каждому модулю; см. проверку кошелька.
  • GET /v1/usage: квота и статистика запросов вашей организации.

Вызывайте API со своего сервера и передавайте API-ключ в заголовке X-API-Key.

Читайте ответ целиком

Успешный HTTP-ответ не означает, что платёж подтверждён или свободен от риска. Для /v1/check читайте state, risk_level и coverage вместе со статусом транзакции, результатами сравнения, временем данных и причинами внутри details. Канонический /v1/transaction/check возвращает эти подробные поля на верхнем уровне ответа. Значение null означает «неизвестно» или «не запрашивалось», в зависимости от поля. Отсутствие данных нельзя считать чистым результатом.

Продолжите с первого запроса, затем изучите полноту данных и идемпотентность.

Отправьте первый запрос

Получите доступ

Войдите с аккаунтом ChainZap в кабинет разработчика. Организация создаётся автоматически, и вы становитесь её владельцем; код приглашения нужен только для входа в существующую организацию. Создайте ключ на странице «API-ключи» и сохраните его в защищённом хранилище сервера. Проверки TRON доступны сразу: sandbox-ключ позволяет тестировать бесплатно, а тариф для рабочих проверок покупается на странице «Тариф и оплата». Коллег можно пригласить на странице «Организация».

Отправьте первый запрос

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

cURL
curl --include --max-time 15 'https://api.chainzap.io/v1/transaction/check' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: cz_live_000000000000.fictional_example_only' \
  -H 'Idempotency-Key: merchant-order-1001-check-1' \
  -H 'X-Request-ID: merchant-order-1001-attempt-1' \
  --data '{"network":"tron","expected_recipient":"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8","expected_token":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t","expected_amount":"1250.000001","tx_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'

Прочитайте X-Request-ID в заголовках ответа и request_id в JSON. Сохраните этот идентификатор для поддержки. Канонический endpoint требует network. Перед обработкой ответа прочитайте оси статусов; POST /v1/check — отдельный сокращённый ответ.

Сравните с данными платежа

JSON
{
  "network": "tron",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "expected_recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "expected_token": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "expected_amount": "1250.000001"
}

Адреса в примере публичные и приведены только для иллюстрации, отправлять на них средства не нужно. Сравнивайте точный контракт токена, а не символ. Читайте все три флага сравнения: они относятся к одному выбранному переводу. См. сравнение платежа.

Обработайте контракт 0.3

Для verification платежа читайте verification_final и integrity_status, затем отдельно оценивайте risk_status и recommended_action. Pending — NOT_EVALUATED, никогда не MATCH. Окончательный MATCH с risk_status: INSUFFICIENT подтверждает сравнение платежа, но требует MANUAL_REVIEW, а не автоматического зачисления или одобрения выплаты. Читайте risk_retryable отдельно от retryable. Эти ветки показаны в примерах ответов.

Автоматическое закрытие выплаты

Без контекста о вашей стороне окончательный MATCH с risk_status: NO_MATERIAL_SIGNAL и без причин для ручной проверки даёт CONFIRM_INTERNAL_STATE: блокчейн и проверка риска в порядке, но ChainZap не видит, тот ли это платёж, который вы должны, и не закрыт ли он уже. Это не отказ: убедитесь по своим записям, что выплата ещё причитается и не отмечена как оплаченная, и закройте её. То же действие без MATCH (ожидаемые поля не переданы) платёж не сравнивало: не закрывайте по нему выплату.

Чтобы получить PROCEED, сообщите ChainZap, за что этот платёж: передайте direction: "OUTGOING", workflow_type: "PAYOUT" и external_reference выплаты вместе с ожидаемыми полями либо сначала запишите обязательство и передайте его external_reference в проверке. Чистое окончательное совпадение с записанным исходящим обязательством — это PROCEED; без external_reference лучший ответ остаётся CONFIRM_INTERNAL_STATE, если только проверка не передаёт customer_context.credit_status: "NOT_CREDITED": этого одного достаточно для PROCEED, если allocation_status не равен UNKNOWN (см. оси статусов). direction и workflow_type принимаются и без реестра обязательств, но сами по себе до PROCEED не доводят; при direction: "OUTGOING" ненайденная выплата дополнительно получает ATTEMPT_MAY_STILL_LAND: не платите повторно. external_reference и остальные поля обязательства требуют реестра обязательств и там, где он выключен, получают ответ 403 ledger_not_enabled.

Если ответ не пришёл

Если соединение оборвалось до получения ответа, повторите запрос с тем же телом и тем же Idempotency-Key. Не создавайте новый ключ, чтобы обойти неизвестный результат. Полученную ошибку повторяйте только при error.retryable=true, учитывайте Retry-After и ограничивайте число попыток. Сохранённая ошибка может вернуться без изменений: retryable не заставляет сервер заново обращаться к источникам.

Готовые алгоритмы с ограниченными повторами есть в примерах Python и TypeScript; остаток квоты можно посмотреть через статистику запросов.

Проверьте и кошелёк

Тем же ключом можно проверить адрес контрагента: POST /v1/wallet/check с телом {"address": "..."} возвращает состояние, покрытие и коды причин в том же формате и списывается, когда получено состояние. См. проверку кошелька.

Один хеш — одна проверка

Для POST /v1/check достаточно tx_hash. API сообщает факты, риски и пробелы в данных; решение о платеже остаётся за вашим приложением. Войдите с аккаунтом ChainZap в кабинет разработчика и создайте серверный ключ на странице «API-ключи».

Первый результат

Задайте на сервере CHAINZAP_API_KEY, TX_HASH и сохранённый идентификатор операции CHECK_ID. Примеры отправляют один запрос только при запуске. Для тестовых данных без вызовов провайдеров используйте sandbox-ключ. Не размещайте ключ в браузере. Для запроса нужно меньше десяти строк прикладного кода; прежде чем читать результат, проверьте HTTP-статус.

cURL
curl --include --max-time 15 https://api.chainzap.io/v1/check \
  -H "X-API-Key: $CHAINZAP_API_KEY" -H "Idempotency-Key: $CHECK_ID" \
  -H 'Content-Type: application/json' --data "{\"tx_hash\":\"$TX_HASH\"}"
Node.js
const response = await fetch("https://api.chainzap.io/v1/check", {
  method: "POST", signal: AbortSignal.timeout(15000),
  headers: {"Content-Type": "application/json", "X-API-Key": process.env.CHAINZAP_API_KEY,
    "Idempotency-Key": process.env.CHECK_ID},
  body: JSON.stringify({tx_hash: process.env.TX_HASH})
});
const result = await response.json();
if (!response.ok) throw new Error(result.error.code);
Python
import os, requests
response = requests.post("https://api.chainzap.io/v1/check", timeout=15,
    headers={"X-API-Key": os.environ["CHAINZAP_API_KEY"],
             "Idempotency-Key": os.environ["CHECK_ID"]},
    json={"tx_hash": os.environ["TX_HASH"]})
result = response.json()
response.raise_for_status()
PHP
<?php
$ch = curl_init('https://api.chainzap.io/v1/check');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15,
  CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-API-Key: '.getenv('CHAINZAP_API_KEY'), 'Idempotency-Key: '.getenv('CHECK_ID')],
  CURLOPT_POSTFIELDS => json_encode(['tx_hash' => getenv('TX_HASH')])]);
$result = json_decode(curl_exec($ch), true);
if (curl_errno($ch) || curl_getinfo($ch, CURLINFO_HTTP_CODE) >= 400) throw new RuntimeException($result['error']['code'] ?? 'transport_error');
curl_close($ch);

Определение сети

Допустимые названия сетей — tron, eth и ton; алиасы отклоняются. Явно указанная сеть ограничивает поиск этой сетью. Форма хеша, префикс 0x, base64 и порядок ответов провайдеров никогда не определяют сеть, в том числе в sandbox.

Без network факты читаются только в поддерживаемых, включённых сетях, разрешённых вашей организации. Область поиска возвращается в details.checked_networks; уникальность внутри неё ничего не говорит о других сетях. AML-проверка не запускается по всем сетям. Все остальные проверенные сети должны достоверно сообщить об отсутствии транзакции. Ошибка провайдера, неполная индексация или тайм-аут не считаются отсутствием. Один найденный результат плюс один неизвестный требуют явной сети.

Автоопределение использует тот же бюджет обращений к источникам, что и явный выбор сети, — и когда в области поиска одна сеть, и когда несколько. Источники всё равно должны подтвердить, что хеш транзакции найден в названной сети. Обращение с ненастроенной ценой учитывается как неизвестная стоимость, а не как нулевая.

NETWORK_AMBIGUOUS означает, что транзакция найдена в нескольких сетях. NETWORK_REQUIRED — что контекста недостаточно для единственного результата: например, одна сеть нашла транзакцию, а другая не смогла ответить, или включённых сетей нет. Если все проверенные сети подтвердили отсутствие транзакции, ответом будет 404 transaction_not_found. Оба ответа используют HTTP 422, state: insufficient_input, network: null, error.retryable: false, error.required_field: network, error.candidates и error.checked_networks. Укажите сеть и используйте новый ключ идемпотентности. Повтор прежнего тела вернёт ту же сохранённую ошибку.

Краткий и подробный ответ

Поле краткого ответа Значение
request_id, network Идентификатор для сопоставления и определённая каноническая сеть.
state clear, review, high_risk, limited_data: результат проверки, а не команда по обработке платежа.
risk_level low, moderate, high, severe, unknown. Санкционное совпадение повышает уровень до severe, поддельный токен — как минимум до high.
coverage complete (полное) или partial (частичное) в пределах задокументированной области.
reason_codes Стабильные строковые коды; допускайте новые неизвестные коды.
details Статус и окончательность транзакции, индекс выбранного перевода, переводы с raw_amount в виде строки, сравнения, подлинность токена, AML и санкции, время данных, ограничения и все причины.

state — это details.overall_state в нижнем регистре. Подробные объекты причин находятся в details.reasons; строки и объекты никогда не смешиваются. Известный высокий риск остаётся виден при частичном покрытии. null в запрошенном сравнении означает, что оно не завершено. Все поля expected_* должны совпасть в одном переводе; несколько полных совпадений — неоднозначность.

Канонический /v1/transaction/check сохраняет состояния в верхнем регистре, coverage: complete или partial и от 2 до 5 объектов причин. /v1/usage и X-API-Key не меняются. /v1/check возвращает HTTP 404 transaction_not_found, если отсутствие в явной сети подтверждено; канонический метод сохраняет HTTP 200 transaction_state: not_found. Незавершённая транзакция даёт HTTP 200 с review или limited_data, но никогда clear, и не списывается. У обоих методов общие лимиты, квота и стоимость. Ключи идемпотентности общие в пределах организации: смена метода или тела запроса даёт конфликт. Сохранённые результаты, включая определённую сеть и ошибки, выданные после принятия проверки, возвращаются без нового обращения к провайдерам; 429 и 5xx никогда не сохраняются. При повторе заново проверяется доступ.

Покрытие Ethereum и TON

Сеть Активы с настроенным соответствием KYT Факты и ограничения
TRON TRX; официальные USDT, USDC, USDD Существующая проверка по двум источникам и правило 19 подтверждений (solidification).
Ethereum mainnet ETH; официальные USDT, USDC, WETH ERC-20 Chain ID 1, receipt, включение в канонический блок, finalized head и сверка двух источников. Головы latest или любого блока до finalized недостаточно. Упорядоченные ERC-20 логи; Approval и ERC-721 не считаются платежами.
TON mainnet TON; официальный USDT jetton Mainnet ID -239, два индексатора, хеш транзакции, account/LT/shard, финальность в masterchain и завершённые связи сообщений. Проверка jetton master/wallet/owner и сырых тел сообщений.

Внутренние переводы ETH требуют трассировки выполнения и не входят в покрытие этой версии. Логи ERC-20 не подтверждают итоговое изменение баланса получателя для токенов с комиссией при переводе или с автоматическим изменением балансов. Выпуск, сжигание и переводы с нулевой суммой требуют внимания (review). Если количество десятичных знаков неизвестно, сумма остаётся null; символ токена никогда не доказывает подлинность. Для других токенов возможны факты перевода при неполном покрытии подлинности/KYT.

TON принимает только хеш транзакции: hex из 64 знаков с необязательным 0x либо канонический base64/base64url из 32 байтов. Хеш сообщения или BOC не подменяется хешем транзакции без предупреждения. Пользовательские адреса проверяются по контрольной сумме. Варианты bounceable и non-bounceable приводятся к одному workchain/account; адреса с признаком тестовой сети отклоняются. expected_token — jetton master, expected_recipient — владелец кошелька. Одного сообщения transfer_notification недостаточно. Возврат сообщения, ошибка вычисления или действия, неполная цепочка сообщений и эмуляция не могут дать clear. Текущие результаты get-методов сверяются со вторым индексатором; изменение исторической идентичности требует дополнительной проверки. Финальность подтверждается данными провайдеров, без локальной проверки подписей валидаторов.

Проверки Ethereum и TON подключает поддержка для конкретной организации после приёмки на реальных источниках. AML-скрининг охватывает те активы, которые AML-источник поддерживает в каждой сети; доступ конкретного аккаунта, фактическую стоимость и покрытие ещё нужно подтвердить на реальных данных. Отсутствующие данные AML или санкций никогда не превращаются в low/clear. См. полноту данных.

Детерминированный пример ответа

Это иллюстративная фикстура, а не наблюдение реальной транзакции. Полный JSON раскрывается ниже.

Показать полный ответ JSON
JSON
{
  "coverage": "complete",
  "details": {
    "aml_risk_level": "low",
    "amount": "1250.000001",
    "amount_match": true,
    "checked_networks": [
      "tron"
    ],
    "confirmations": 27,
    "coverage": "complete",
    "coverage_limitations": {
      "product": [
        "AML_TRANSACTION_LEVEL_ONLY",
        "RISK_STATE_AS_OF_CHECK",
        "SANCTIONS_CONFIGURED_LISTS_ONLY"
      ],
      "runtime": []
    },
    "coverage_status": "OK",
    "decimals": 6,
    "decision_id": "0199a1b2-7c3d-7e4f-8a9b-0c1d2e3f4a5b",
    "direct_sanctions_match": false,
    "direction": "OUTGOING",
    "environment": "live",
    "evidence": {},
    "evidence_items": [
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": "2026-09-03T11:59:00Z",
        "evidence_id": "ev_3b9e1c7a5d2f8e61",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 2,
          "stale": false,
          "stale_after_seconds": null
        },
        "kind": "transaction_facts",
        "observed_at": "2026-09-03T11:59:58Z",
        "source": "chain_explorer",
        "source_reference": "block:60000000",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction"
        },
        "temporal_scope": "TRANSACTION_TIME"
      },
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": "2026-09-03T11:59:00Z",
        "evidence_id": "ev_5f0c3a1d9b2e7f40",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 2,
          "stale": false,
          "stale_after_seconds": null
        },
        "kind": "transaction_facts",
        "observed_at": "2026-09-03T11:59:58Z",
        "source": "chain_node",
        "source_reference": "block:60000000",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction"
        },
        "temporal_scope": "TRANSACTION_TIME"
      },
      {
        "coverage": "checked_freshness_unknown",
        "dependency": "required",
        "disagreement": null,
        "effective_at": null,
        "evidence_id": "ev_8a4d2e6f1c9b3a75",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 0,
          "stale": true,
          "stale_after_seconds": null
        },
        "kind": "aml_risk",
        "observed_at": "2026-09-03T12:00:00Z",
        "source": "aml_provider",
        "source_reference": "transaction_risk_score",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction"
        },
        "temporal_scope": "CHECK_TIME"
      },
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": null,
        "evidence_id": "ev_c27f5b0e9d4a1863",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 0,
          "stale": false,
          "stale_after_seconds": 172800
        },
        "kind": "sanctions_list",
        "observed_at": "2026-09-03T12:00:00Z",
        "source": "ofac",
        "source_reference": "configured_address_index",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction_addresses"
        },
        "temporal_scope": "LIST_PUBLICATION"
      },
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": "2026-08-28T00:00:00Z",
        "evidence_id": "ev_4e18a9d3b6c07f52",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 0,
          "stale": false,
          "stale_after_seconds": 3024000
        },
        "kind": "sanctions_list",
        "observed_at": "2026-09-03T12:00:00Z",
        "source": "eu",
        "source_reference": "configured_address_index",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction_addresses"
        },
        "temporal_scope": "LIST_PUBLICATION"
      },
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": "2026-08-28T00:00:00Z",
        "evidence_id": "ev_91d6f2a8c3e5b047",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 0,
          "stale": false,
          "stale_after_seconds": 3024000
        },
        "kind": "sanctions_list",
        "observed_at": "2026-09-03T12:00:00Z",
        "source": "uk",
        "source_reference": "configured_address_index",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction_addresses"
        },
        "temporal_scope": "LIST_PUBLICATION"
      },
      {
        "coverage": "not_applicable",
        "dependency": "not_applicable",
        "disagreement": null,
        "effective_at": null,
        "evidence_id": "ev_6b03e7c1f5a92d48",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": null,
          "stale": false,
          "stale_after_seconds": null
        },
        "kind": "sanctions_list",
        "observed_at": null,
        "source": "un",
        "source_reference": "configured_address_index",
        "subject": {
          "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "type": "transaction_addresses"
        },
        "temporal_scope": "LIST_PUBLICATION"
      },
      {
        "coverage": "checked",
        "dependency": "required",
        "disagreement": null,
        "effective_at": null,
        "evidence_id": "ev_f0a5c8e2d7b41936",
        "evidence_version": "ev-1",
        "freshness": {
          "age_seconds": 0,
          "stale": false,
          "stale_after_seconds": null
        },
        "kind": "token_authenticity",
        "observed_at": "2026-09-03T12:00:00Z",
        "source": "token_registry",
        "source_reference": "official",
        "subject": {
          "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
          "type": "token"
        },
        "temporal_scope": "CHECK_TIME"
      }
    ],
    "finality_policy": "tron_solidified_19_confirmations",
    "finalized": true,
    "freshness": {
      "checked_at": "2026-09-03T12:00:00Z",
      "max_source_age_seconds": 2,
      "risk_data_at": "2026-09-03T12:00:00Z",
      "token_data_at": "2026-09-03T12:00:00Z",
      "transaction_at": "2026-09-03T11:59:00Z"
    },
    "indirect_sanctions_exposure": false,
    "integrity": {
      "comparisons": {
        "amount": {
          "actual": "1250.000001",
          "delta": "0",
          "delta_raw": "0",
          "expected": "1250.000001",
          "result": "EXACT",
          "tolerance": null
        },
        "network": {
          "actual": "tron",
          "expected": null,
          "result": "NOT_EVALUATED"
        },
        "recipient": {
          "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
          "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
          "result": "MATCH"
        },
        "sender": {
          "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
          "expected": null,
          "result": "NOT_EVALUATED"
        },
        "token": {
          "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
          "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
          "result": "MATCH"
        }
      },
      "relevant_event_count": 1,
      "selected_event_ref": "log:0",
      "status": "MATCH"
    },
    "integrity_status": "MATCH",
    "key_exposure": [],
    "limitations": [],
    "network": "tron",
    "obligation": null,
    "overall_state": "CLEAR",
    "policy_version": "b2b-tx-2026-10.4",
    "reasons": [
      {
        "category": "transaction",
        "code": "TX_FACTS_VERIFIED",
        "severity": "info"
      },
      {
        "category": "transaction",
        "code": "TX_FINALIZED",
        "severity": "info"
      },
      {
        "category": "risk",
        "code": "AML_LOW",
        "severity": "info"
      },
      {
        "category": "sanctions",
        "code": "NO_DIRECT_SANCTIONS_MATCH",
        "severity": "info"
      },
      {
        "category": "token",
        "code": "TOKEN_OFFICIAL",
        "severity": "info"
      }
    ],
    "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
    "recipient_match": true,
    "recommended_action": "CONFIRM_INTERNAL_STATE",
    "request_id": "req-3f34a12f",
    "required_confirmations": 19,
    "result_final": true,
    "retry_after_seconds": null,
    "retryable": false,
    "reuse": {
      "first_seen_at": null,
      "other_obligations": 0,
      "prior_decisions": 0,
      "status": "FIRST_SEEN"
    },
    "risk": {
      "driver": null,
      "driver_evidence_ids": [],
      "status": "NO_MATERIAL_SIGNAL"
    },
    "risk_exposure": false,
    "risk_final": true,
    "risk_retry_after_seconds": null,
    "risk_retryable": false,
    "risk_status": "NO_MATERIAL_SIGNAL",
    "sanctions_hit": false,
    "schema_version": "0.3",
    "selected_transfer_index": 0,
    "sender": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
    "source_coverage": {
      "risk_sources": {
        "aml_provider": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": null,
          "error_code": null,
          "retrieved_at": "2026-09-03T12:00:00Z",
          "scope": "transaction_risk_score",
          "stale_after_seconds": null,
          "status": "checked_freshness_unknown"
        }
      },
      "sanctions_sources": {
        "eu": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": "2026-08-28T00:00:00Z",
          "error_code": null,
          "retrieved_at": "2026-09-01T09:00:00Z",
          "scope": "configured_address_index",
          "stale_after_seconds": 3024000,
          "status": "checked"
        },
        "ofac": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": null,
          "error_code": null,
          "retrieved_at": "2026-09-03T06:00:00Z",
          "scope": "configured_address_index",
          "stale_after_seconds": 172800,
          "status": "checked"
        },
        "uk": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": "2026-08-28T00:00:00Z",
          "error_code": null,
          "retrieved_at": "2026-09-01T09:00:00Z",
          "scope": "configured_address_index",
          "stale_after_seconds": 3024000,
          "status": "checked"
        },
        "un": {
          "checked_at": null,
          "data_updated_at": null,
          "error_code": null,
          "retrieved_at": null,
          "scope": "configured_address_index",
          "stale_after_seconds": null,
          "status": "not_applicable"
        }
      },
      "transaction_sources": {
        "chain_explorer": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": null,
          "error_code": null,
          "retrieved_at": "2026-09-03T11:59:58Z",
          "scope": "transaction_facts",
          "stale_after_seconds": null,
          "status": "checked"
        },
        "chain_node": {
          "checked_at": "2026-09-03T12:00:00Z",
          "data_updated_at": null,
          "error_code": null,
          "retrieved_at": "2026-09-03T11:59:58Z",
          "scope": "transaction_facts",
          "stale_after_seconds": null,
          "status": "checked"
        }
      },
      "universal_clearance": false
    },
    "status_drivers": {
      "action": "CUSTOMER_STATE_UNKNOWN",
      "coverage": null,
      "integrity": null,
      "risk": null,
      "transaction": "TX_FINALIZED"
    },
    "token_authenticity": "official",
    "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "token_match": true,
    "token_symbol": "USDT",
    "trace_complete": null,
    "transaction_category": "trc20_transfer",
    "transaction_state": "confirmed",
    "transaction_status": "CONFIRMED",
    "transaction_type": "TriggerSmartContract",
    "transfers": [
      {
        "amount": "1250.000001",
        "asset_type": "trc20",
        "decimals": 6,
        "event_ref": "log:0",
        "execution_status": "success",
        "index": 0,
        "raw_amount": "1250000001",
        "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "sender": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "token_id": null,
        "token_symbol": "USDT"
      }
    ],
    "transfers_truncated": false,
    "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "verification_final": true,
    "versions": {
      "contract": "0.3",
      "decision": "b2b-tx-2026-10.4",
      "evidence_schema": "ev-1",
      "reason_codes": "rc-1",
      "rules": {
        "allocation": "alloc-v1",
        "billing": "final_answers_only",
        "exposure": "b2b-exp-v2",
        "integrity": "int-v3",
        "reuse": "reuse-v1",
        "sanctions_freshness": "sf-v1"
      }
    },
    "workflow_coverage": "complete",
    "workflow_type": "PAYOUT"
  },
  "network": "tron",
  "reason_codes": [
    "TX_FACTS_VERIFIED",
    "TX_FINALIZED",
    "AML_LOW",
    "NO_DIRECT_SANCTIONS_MATCH",
    "TOKEN_OFFICIAL"
  ],
  "request_id": "req-3f34a12f",
  "risk_level": "low",
  "state": "clear"
}

Доступ и API-ключи

Один аккаунт ChainZap

Нажмите «Войти с аккаунтом ChainZap» и используйте аккаунт из приложения. Переход «Настройки → API для разработчиков → Кабинет» использует действующий вход в том же браузере. Организация, API-ключи и лимит API учитываются отдельно от личных проверок в приложении. Если раньше вы входили в кабинет через Google, прежняя организация сохраняется: связь проверяется по идентификатору Google, а не по совпадению адреса почты.

Для обычного входа код приглашения не нужен. Приглашения служат только для присоединения к существующей организации. Если Telegram открывает отдельный браузер, в котором вы ещё не входили в ChainZap, войдите там один раз с тем же аккаунтом. Чтобы пользоваться Google и Telegram как одним аккаунтом, сначала свяжите их в настройках приложения.

Серверные API-ключи

Передавайте X-API-Key по HTTPS в каждом запросе к рабочему API. Никогда не помещайте ключ в URL, хранилище браузера, аналитику, сообщение в поддержку или систему контроля версий. Ключ даёт доступ к одной организации; выбрать другую организацию в запросе нельзя.

Вход в кабинет разработчика и API-ключи работают независимо друг от друга. Live-ключи начинаются с cz_live_, sandbox-ключи — с cz_test_.

Роли в кабинете:

  • Участники с ролями owner, admin и developer создают, заменяют и отзывают API-ключи.
  • Участники с ролями owner, admin и billing видят историю платежей, покупают планы и пакеты дополнительных проверок и управляют подпиской.
  • Участники с ролью viewer только просматривают статистику и метаданные ключей.

По API-ключу купить ничего нельзя.

Жизненный цикл ключа

Создавайте отдельный ключ с понятным названием для каждой интеграции. Полное значение показывается один раз — при создании или замене; в списке видно только начало ключа. При замене старый ключ отзывается, а новый создаётся в той же операции. Сразу после замены обновите хранилище секретов на сервере. Чтобы плановый переход прошёл без перерыва, сначала создайте отдельный ключ, переведите на него интеграцию и проверьте её, а затем отзовите прежний ключ.

Ошибки доступа

  • 401 invalid_api_key: ключ неверен или отозван.
  • 403 tenant_suspended: доступ организации приостановлен.
  • 403 network_not_enabled: запрошенная сеть не включена для организации.

Сначала исправьте доступ. Повторение того же запроса без изменений не поможет.

POST /v1/transaction/check

Запрос

Строгий JSON-запрос требует network и tx_hash длиной 32 байта. Неизвестные поля отклоняются. Ожидаемые адреса проверяются и нормализуются по правилам выбранной сети. expected_amount — неотрицательная десятичная строка; JSON-числа и экспоненциальная запись отклоняются. Необязательная сеть и краткий ответ доступны в POST /v1/check.

Поле Что передать
network "tron", "eth" или "ton". Обязательно.
tx_hash 64 шестнадцатеричных знака с необязательным 0x. Для TON также допустим канонический base64/base64url, кодирующий 32 байта.
expected_recipient Необязательно: адрес получателя в выбранной сети. Для TON — владелец кошелька.
expected_token Необязательно: контракт токена в выбранной сети. Для TON — jetton master.
expected_amount Необязательно: сумма строкой, например "10.25".

Форматы адресов и правила точного сравнения описаны в разделе сравнения платежа. Размер тела запроса ограничен 4 КиБ; тело большего размера отклоняется с 413 payload_too_large. Организации, работающие по пилотному контракту, должны передавать все три поля expected_*.

Передайте Content-Type: application/json, серверный X-API-Key и Idempotency-Key для логической операции проверки. X-Request-ID связывает запрос с вашим журналом операций. Точный перечень обязательных полей, перечислений и схем ответа есть в справочнике API.

Ответ

Читайте transaction_state отдельно от overall_state. Ответ содержит число подтверждений, нормализованные переводы, выбранный перевод, уровень риска, результат санкционной проверки, подлинность токена, флаги сравнения, покрытие, актуальность данных и от 2 до 5 наиболее важных причин. Суммы переводов и доли риска представлены десятичными строками. Обрабатывайте поля со значением null явно.

transfers_truncated=true означает, что список переводов сокращён. AMBIGUOUS_TRANSFER означает, что вашим условиям соответствуют несколько переводов. Оба случая требуют внимания. Не считайте сокращённый список полным и не объединяйте флаги сравнения разных переводов.

Обработайте контракт 0.3

Для verification платежа читайте verification_final и integrity_status, затем отдельно оценивайте risk_status и recommended_action. Pending — NOT_EVALUATED, никогда не MATCH. Окончательный MATCH с risk_status: INSUFFICIENT подтверждает сравнение платежа, но требует MANUAL_REVIEW, а не автоматического зачисления или одобрения выплаты. Читайте risk_retryable отдельно от retryable. Эти ветки показаны в примерах ответов.

Списание

Окончательный ответ с coverage: complete списывает одну проверку из квоты, в том числе полный результат с высоким риском: транзакция подтверждена по правилам окончательного подтверждения или окончательно завершилась ошибкой. Транзакция, ожидающая подтверждения, ненайденная транзакция и ответ с coverage: partial не списываются. Повтор той же идемпотентной операции никогда не списывает проверку дважды.

expected_token — это адрес контракта, а не тикер; старое имя expected_token_contract также принимается. Передавайте только одно имя. Ответ содержит schema_version: "0.3", policy_version (политика принятия решений, по которой сформирован ответ; храните её вместе с ответом), три отдельных risk/sanctions-флага, workflow_coverage и source_coverage. Перед трактовкой результата прочитайте правила покрытия. Ключи идемпотентности, использованные до контракта 0.2, возвращают 409 idempotency_conflict; после обработки прежнего результата используйте новый ключ.

Проверьте кошелёк до того, как принять его или заплатить ему

POST /v1/wallet/check проверяет один адрес так же, как POST /v1/check проверяет одну транзакцию: тот же ключ, та же квота, те же правила идемпотентности и тот же формат ответа. Вы отправляете адрес, получаете состояние, уровень покрытия и коды причин, а решение, нужна ли контрагенту дополнительная проверка, принимает ваш процесс.

Запрос

Поле Что передавать
address Обязательно. Адрес Ethereum (0x и 40 hex-символов), TRON (T и 33 символа base58) или TON (48 символов в дружественной форме либо workchain:hash).
network Необязательно: "tron", "eth" или "ton". Если поле не передано, сеть определяется по формату адреса. Если передано, оно должно совпадать с форматом; при несовпадении вернётся 422 invalid_tron_address, invalid_eth_address или invalid_ton_address.

Три формата невозможно спутать между собой, поэтому проверка кошелька никогда не отвечает NETWORK_REQUIRED или NETWORK_AMBIGUOUS. Строка, не подходящая ни под один формат, даёт 422 invalid_address. Неизвестные поля отклоняются, тело ограничено 4 КиБ. Передавайте Content-Type: application/json, серверный X-API-Key и Idempotency-Key логической операции; X-Request-ID связывает запрос с вашим журналом.

cURL
curl --include --max-time 35 'https://api.chainzap.io/v1/wallet/check' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: cz_live_000000000000.fictional_example_only' \
  -H 'Idempotency-Key: onboarding-4711-wallet-1' \
  -H 'X-Request-ID: onboarding-4711-attempt-1' \
  --data '{"address":"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"}'

Адрес в примере публичный и приведён только для иллюстрации, переводить на него ничего не нужно. В ответе address возвращается в каноническом написании: Ethereum в нижнем регистре, TON в виде workchain:hash, TRON без изменений.

Ответ

Сначала читайте верхний уровень, затем details.

Поле Значение
state clear, review, high_risk или limited_data. Это результат проверки, а не указание платить или отказывать.
coverage complete, если каждый применимый модуль проверен полностью, иначе partial. Состояние clear возвращается только с покрытием complete.
reason_codes Стабильные строки, упорядоченные по серьёзности, не больше десяти. Те же коды в виде объектов с category и severity лежат в details.reasons.
environment live или sandbox.

details объясняет, из чего сложилось состояние:

  • overall_state и data_coverage: состояние в верхнем регистре и слово о покрытии от самого движка, FULL, PARTIAL или INSUFFICIENT.
  • modules: семь строк в фиксированном порядке, sanctions_aml, wallet_behaviour, token_authenticity, contract_controls, address_security, counterparties_services, flows_connections. У каждой есть status (RISK_DETECTED, NO_MATCHES_FOUND, PARTIALLY_CHECKED, INSUFFICIENT_DATA, NOT_SUPPORTED, NOT_CHECKED) и source_coverage (complete, partial, none, not_applicable). Непроверенный модуль так и сообщает об этом и никогда не выглядит чистым.
  • sanctions: direct_match по настроенным индексам OFAC, EU, UK и UN (null, если ни один индекс не проверялся), органы authorities, признак attributed и indirect_exposure от AML-провайдера (null, если он не вызывался).
  • address_security: статус и категория в публичных списках недобросовестных адресов, provider_flagged (отметил ли адрес провайдер безопасности адресов; null, если он не ответил или его права не позволяют ChainZap это показывать) и признак заморозки адреса эмитентом стейблкоина. Собственные метки провайдера никогда не возвращаются; устаревшее поле provider_flags равно ["PROVIDER_SECURITY_FLAG"], когда provider_flagged истинно, и пусто в остальных случаях.
  • behaviour: является ли адрес контрактом, число транзакций и признак ограничения выборки, возраст кошелька, первая и последняя активность, число контрагентов.
  • counterparties и token_authenticity: сколько контрагентов проверено, не подтверждено и помечено; сколько удерживаемых токенов официальные, поддельные, подозрительные или неизвестные.
  • freshness и source_coverage: когда выполнялась проверка, взят ли анализ из кеша анализа (5 минут в Ethereum, 30 минут в TRON и TON; ответ AML-провайдера используется повторно до 24 часов), возраст самого старого источника и по одному наблюдению на каждый источник с тем же словарём статусов, что и у проверки транзакции. Источники названы по роли: ofac, eu_sanctions, uk_sanctions, un_sanctions, denylist, issuer_restrictions, aml_provider, address_security_provider, onchain, chain_explorer, chain_node, graph_risk.
  • limitations: analysis_from_cache, transaction_sample_capped, aml_provider_unavailable, aml_provider_skipped_dominant_local_hit, counterparty_attribution_partial, network_assumed_eth, address_security_provider_withheld, sandbox_partial_fixture.

Все коды причин для кошельков с их значением перечислены в разделе коды причин.

Чем проверка кошелька не является

В ответе нет числового балла, и это сделано намеренно. Число провоцирует порог, а честного порога сразу для трёх сетей с разными источниками не существует. Ответ говорит, что найдено, что проверено и что проверить не удалось. Это не сертификат соответствия, и сервис не знает внутренних правил конкретной биржи или банка. Понимайте clear как «в проверенных источниках ничего критичного», review как «посмотрите внимательнее, прежде чем продолжать», high_risk как «есть критичная находка, которую нужно разобрать», а limited_data как «определить не удалось».

Списание

Проверка кошелька расходует одну проверку из квоты, когда получено состояние: clear, review или high_risk, с полным или частичным покрытием. limited_data бесплатно, как и ошибки, тайм-ауты и повторы по идемпотентности. Это отличается от проверки транзакции, которая списывается только при полном покрытии: проверка кошелька часто даёт уверенный результат, даже если один контрагент из пятидесяти остался неатрибутированным, а платные источники уже ответили. Sandbox-ключи платные проверки не расходуют.

Бюджет времени и повторы

Холодная проверка кошелька опрашивает несколько провайдеров, и серверный бюджет на неё составляет 30 секунд; на клиенте задайте предел ожидания около 35 секунд. Если сервер ответил 504 request_timeout, повторите запрос с тем же телом и тем же Idempotency-Key: анализ на сервере продолжается до конца и попадает в общий кеш, поэтому повтор обычно отвечает сразу и содержит freshness.served_from_analysis_cache: true. Общие правила повторов действуют без изменений.

Идемпотентность между видами проверок

Ключи идемпотентности общие для организации и среды на всех методах проверки. Повторное использование ключа транзакции для тела с кошельком или ключа кошелька для другого адреса даёт 409 idempotency_conflict. Одна логическая операция, один ключ.

Примеры для сервера

Python
import os, requests
response = requests.post("https://api.chainzap.io/v1/wallet/check", timeout=35,
    headers={"X-API-Key": os.environ["CHAINZAP_API_KEY"],
             "Idempotency-Key": os.environ["CHECK_ID"]},
    json={"address": os.environ["WALLET_ADDRESS"]})
result = response.json()
response.raise_for_status()
if result["state"] != "clear":
    print(result["state"], result["reason_codes"])
TypeScript
const response = await fetch("https://api.chainzap.io/v1/wallet/check", {
  method: "POST", signal: AbortSignal.timeout(35000),
  headers: {"Content-Type": "application/json", "X-API-Key": process.env.CHAINZAP_API_KEY!,
    "Idempotency-Key": process.env.CHECK_ID!},
  body: JSON.stringify({address: process.env.WALLET_ADDRESS})
});
const result = await response.json();
if (!response.ok) throw new Error(result.error.code);
if (result.state !== "clear") console.info(result.state, result.reason_codes);

Пример детерминированного ответа

Это иллюстративная фикстура, а не реальное наблюдение. Полный JSON раскрывается ниже.

Показать полный ответ JSON
JSON
{
  "address": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "coverage": "complete",
  "details": {
    "address_security": {
      "denylist_category": null,
      "denylisted": false,
      "issuer_blocked": false,
      "issuer_blocked_symbols": [],
      "provider_flagged": false,
      "provider_flags": []
    },
    "behaviour": {
      "contract_verified": null,
      "counterparties_count": 37,
      "first_activity_at": "2024-09-20T10:15:00Z",
      "is_contract": false,
      "last_activity_at": "2026-09-19T08:02:11Z",
      "transaction_count": 412,
      "transaction_count_limited": false,
      "wallet_age_days": 731
    },
    "counterparties": {
      "flagged": 0,
      "screened": 37,
      "unverified": 0
    },
    "coverage_scope": "supported_deep_sources",
    "data_coverage": "FULL",
    "evidence": {
      "live": true,
      "source": "live"
    },
    "freshness": {
      "analyzed_at": "2026-09-21T08:59:58Z",
      "checked_at": "2026-09-21T09:00:00Z",
      "oldest_source_age_seconds": 2,
      "served_from_analysis_cache": false
    },
    "limitations": [],
    "modules": [
      {
        "key": "sanctions_aml",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "wallet_behaviour",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "token_authenticity",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "contract_controls",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "address_security",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "counterparties_services",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      },
      {
        "key": "flows_connections",
        "source_coverage": "complete",
        "status": "NO_MATCHES_FOUND"
      }
    ],
    "overall_state": "CLEAR",
    "reasons": [
      {
        "category": "sanctions",
        "code": "NO_DIRECT_SANCTIONS_MATCH",
        "severity": "info"
      },
      {
        "category": "risk",
        "code": "AML_LOW",
        "severity": "info"
      },
      {
        "category": "address",
        "code": "NO_ADDRESS_SECURITY_FLAGS",
        "severity": "info"
      },
      {
        "category": "behaviour",
        "code": "NO_BEHAVIOUR_FLAGS",
        "severity": "info"
      }
    ],
    "sanctions": {
      "attributed": false,
      "authorities": [],
      "direct_match": false,
      "exposure_source": "aml_provider",
      "indirect_exposure": false
    },
    "schema_version": "0.1",
    "source_coverage": {
      "ofac": {
        "checked_at": "2026-09-21T09:00:00Z",
        "data_updated_at": "2026-09-20T18:00:00Z",
        "error_code": null,
        "retrieved_at": "2026-09-21T09:00:00Z",
        "scope": "sanctions_aml",
        "stale_after_seconds": 172800,
        "status": "checked"
      }
    },
    "token_authenticity": {
      "fake": 0,
      "official": 3,
      "suspicious": 0,
      "total": 3,
      "unknown": 0
    },
    "universal_clearance": false
  },
  "environment": "live",
  "network": "tron",
  "reason_codes": [
    "NO_DIRECT_SANCTIONS_MATCH",
    "AML_LOW",
    "NO_ADDRESS_SECURITY_FLAGS",
    "NO_BEHAVIOUR_FLAGS"
  ],
  "request_id": "8a7f1c2e9d3b4f5a8c6d7e9f0a1b2c3d",
  "state": "clear"
}

Сравните перевод с данными платежа

Чтобы проверить конкретный платёж, передайте получателя, контракт токена и сумму в полях expected_*. Можно передать все три поля или только нужные сравнения.

Следующие сравнения применяются после окончательного подтверждения в блокчейне. При transaction_status: PENDING integrity и каждое запрошенное сравнение имеют NOT_EVALUATED, а флаги сравнения равны null, даже если наблюдаемый перевод содержит ожидаемые значения. Окончательный MATCH подтверждает данные платежа независимо от KYT; недостаточный риск всё равно требует MANUAL_REVIEW.

Один перевод, три сравнения

Одна транзакция может содержать несколько переводов. ChainZap сначала ищет перевод, который полностью соответствует вашим условиям. Если такого нет, выбирает перевод с наибольшим числом совпадений. При равном результате выбор определяется индексом перевода.

Поля recipient_match, token_match и amount_match относятся именно к этому выбранному переводу. Если полных совпадений несколько, в ответе появляется AMBIGUOUS_TRANSFER. Невыполненный перевод, например перевод в транзакции, завершившейся ошибкой, никогда не считается совпадением: все три его поля равны null, а транзакция с ошибкой, в которой ничего не выполнилось, получает NOT_EVALUATED и никогда не LIMITED_DATA из-за отсутствующих строк переводов.

Контракт 0.3 полностью описывает сравнение в integrity: status (см. оси статусов), selected_event_ref, relevant_event_count (выполненные переводы ожидаемому получателю в ожидаемом токене) и comparisons с expected и actual значениями и result для recipient, sender, token, amount и network. Результат по сумме — EXACT, WITHIN_TOLERANCE, UNDERPAID, OVERPAID, NOT_EVALUATED или INSUFFICIENT со знаковыми delta и delta_raw.

Подходящие переводы Ответ
Один, сумма совпадает MATCH.
Один, сумма отличается MISMATCH с UNDERPAID или OVERPAID.
Несколько, сумма совпадает ровно у одного MATCH и ADDITIONAL_RELEVANT_TRANSFERS: транзакция может платить дважды.
Несколько в одном активе, ни один не совпадает, но вместе они дают сумму MATCH и SPLIT_WITHIN_TX. Движения разных активов никогда не суммируются.
Несколько, подходящих одинаково AMBIGUOUS; ничего не распределяется.
Результат Значение
true Значение совпало с указанным вами.
false Значение удалось проверить, но оно не совпало.
null Сравнение не запрашивалось или для него недостаточно данных.

Как сравниваются значения

Если вы передали ожидаемое значение, но данных о переводе для сравнения нет, соответствующее поле содержит null, покрытие становится частичным (partial), а среди причин появляется EXPECTED_DATA_UNAVAILABLE. Например, без количества десятичных знаков токена нельзя утверждать, что сумма не совпала. Не считайте null подтверждением совпадения.

Адреса проверяются по правилам выбранной сети и приводятся к единому виду:

Сеть Допустимые адреса и сравнение
tron Адрес Base58Check с корректной контрольной суммой. Адреса сравниваются точно.
eth 0x и 40 шестнадцатеричных знаков. Буквы могут быть все строчными или все прописными; смешанный регистр должен соответствовать EIP-55. Перед сравнением адрес приводится к нижнему регистру.
ton Формат workchain:account или пользовательский адрес с корректной контрольной суммой. Допускаются workchain 0 и -1; адреса с признаком тестовой сети отклоняются. Варианты bounceable и non-bounceable приводятся к одному аккаунту.

В TON поле expected_recipient означает владельца кошелька, а expected_token — контракт jetton master, а не отдельный jetton wallet.

Токен сравнивается по точному адресу контракта, а не по названию или символу: одинаковый символ не доказывает, что это один и тот же токен. Сумма передаётся десятичной строкой, например "10.000001". Сервис переводит её в целые минимальные единицы токена по известным decimals и сравнивает точно, без допуска на плавающую точку. Чтобы принять небольшое расхождение, передайте amount_tolerance: абсолютную сумму в единицах токена, симметричную, по умолчанию 0. Расхождение в этих пределах даёт WITHIN_TOLERANCE и добавляет AMOUNT_WITHIN_TOLERANCE; допуск с большим числом знаков после запятой, чем у токена, даёт 422 invalid_amount_tolerance. expected_sender сравнивает адрес отправителя так же, как адрес получателя. Знаки за пределами decimals токена принимаются, если это нули: "10.0000000" равно "10" для токена с 6 decimals. Ненулевой знак за этими пределами даёт 422 invalid_expected_amount.

Пример несовпадения

Вы ожидаете "10.000001", а в выбранном переводе указано "10". Результат: amount_match=false и причина EXPECTED_AMOUNT_MISMATCH.

Для несовпадения получателя используется EXPECTED_RECIPIENT_MISMATCH, для другого контракта токена: EXPECTED_TOKEN_MISMATCH. Совпадение суммы само по себе не подтверждает совпадение получателя и токена. Перед зачислением платежа проверьте все нужные сравнения, статус транзакции и общую оценку.

Пилотный контракт

Организация, работающая по пилотному контракту для дизайн-партнёров, должна передавать все три поля в каждой проверке: проверка без expected_recipient, expected_token или expected_amount отклоняется с 422 expected_fields_required, а expected_token, отличный от официального USDT в TRON, — с 422 token_not_enabled. Отказ происходит до принятия проверки: ничего не списывается и не сохраняется, а sandbox-ключи подчиняются тем же правилам.

Контекст сети

Сравнения работают в обоих методах проверки. Если сеть платежа известна, передайте её явно: тогда API проверит ожидаемые адреса по правилам этой сети и никогда не переключится на другую. Запросы без network описаны в разделе определения сети.

Обязательства, попытки и распределения

Отдельная проверка отвечает на вопрос, платит ли одна транзакция то, что вы ожидаете. Реестр обязательств отвечает на вопрос, было ли оплачено бизнес-обязательство — выплата или причитающийся вам депозит: один раз, полностью, какими транзакциями и не предъявляется ли тот же платёж за что-то другое. Он хранит ваши инструкции, ваши попытки исполнения, платёжные события, проверенные ChainZap, и то, как они распределены, и никогда ничего из этого не переписывает.

Реестр включается на уровне развёртывания сервиса. Пока он выключен, проверка с любым полем реестра и любой метод реестра отвечают 403 ledger_not_enabled.

Модель

Запись Что это
Обязательство Один бизнес-референс (external_reference, уникальный в пределах организации и среды) с workflow_type (PAYOUT, DEPOSIT, INVOICE, REFUND, SETTLEMENT, OTHER) и direction (OUTGOING, INCOMING).
Версия инструкции Что причиталось: сеть, получатель, необязательный отправитель, контракт токена, сумма и amount_tolerance, а также instruction_effective_at и approval_reference. Только добавляется.
Попытка исполнения Одна попытка оплатить обязательство (attempt_reference) с channel, provider_reference, status и необязательными amount и tx_hash. Повтор или смена платёжного провайдера — новая попытка.
Платёжное событие Одно проверенное ончейн-движение средств, которое определяется сетью, транзакцией и event_ref (например, log:3). Одна транзакция может содержать несколько событий.
Распределение Какая часть одного события погашает одно обязательство, с указанием status (MATCHED, CUSTOMER_DECLARED, UNKNOWN, DISPUTED) и source (CHAINZAP_MATCH, CUSTOMER, BATCH; OPERATOR зарезервирован). Отменяется сторнированием, никогда не удаляется.
Решение Ответ ChainZap на одну проверку, сохранённый в том виде, в каком он был дан. См. решения.

external_reference, attempt_reference и approval_reference — до 128 печатных символов ASCII. Не помещайте в них персональные данные.

Проверка по обязательству

Добавьте референс обязательства в обычную проверку транзакции:

JSON
{
  "tx_hash": "…",
  "network": "tron",
  "external_reference": "payout-2026-10-0001",
  "attempt_reference": "attempt-1",
  "direction": "OUTGOING",
  "workflow_type": "PAYOUT",
  "expected_recipient": "T…",
  "expected_token": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "expected_amount": "100.00"
}

Первая проверка нового референса записывает обязательство и его инструкцию (версия 1 или instruction_version, которую вы передали). В последующих проверках можно передавать только референс: транзакция сравнивается с записанной инструкцией. Ответ дополняется блоком obligation (status, expected_amount, allocated_amount, residual_amount, attempts, events, pending_events) и блоком reuse.

Если транзакция совпадает или платит правильному получателю правильный токен, но в другой сумме, её событие распределяется на обязательство. Распределяются только окончательные выполненные события; событие, ожидающее подтверждения, учитывается в pending_events и никогда не закрывает обязательство. Если несколько движений подходят одинаково (integrity_status: AMBIGUOUS), каждое связывается с обязательством как UNKNOWN, и ничего не распределяется, пока вы не укажете, какое из них было оплатой. Проверка без direction берёт записанное направление обязательства, а если его нет — выводит направление из workflow_type (PAYOUT и REFUND — исходящие, DEPOSIT и INVOICE — входящие); платёж, направление которого осталось неизвестным, никогда не получает PROCEED.

status обязательства Значение
OPEN Пока ничего не распределено.
PARTIALLY_ALLOCATED Распределено меньше суммы за вычетом допуска. residual_amount — оставшаяся часть.
ALLOCATED Сумма покрыта в пределах допуска.
OVER_ALLOCATED Распределено больше суммы с учётом допуска. Если к этому привели две или более транзакции, ответ дополняется DUPLICATE_EXECUTION.
CANCELLED Зарезервировано для отменённого обязательства; API пока его не устанавливает.

Инструкции не меняются на месте

Версия инструкции неизменяема. Передача той же версии с другими условиями отклоняется с 409 instruction_conflict; передача других условий без версии — с 409 instruction_version_required. Изменённая инструкция — это новая версия, которая записывается через POST /v1/obligations с большим instruction_version; прежние версии остаются в записях, и в проверке можно указать версию, по которой был совершён платёж. Версия, которую вы никогда не записывали, не восстанавливается: проверка отвечает integrity_status: INSUFFICIENT с INSTRUCTION_UNAVAILABLE. Платёж в блоке раньше instruction_effective_at добавляет INSTRUCTION_NOT_EFFECTIVE.

Записывайте обязательства и попытки заранее

Метод Назначение
POST /v1/obligations Записать обязательство или новую версию его инструкции.
POST /v1/obligations/lookup Обязательство с его инструкциями, попытками, распределениями и решениями. Передайте {"external_reference": "…"} в теле: референс никогда не передаётся в URL, где его записывают журналы прокси.
POST /v1/obligations/attempts Записать попытку или её новый статус (CREATED, SUBMITTED, BROADCAST, TIMEOUT, FAILED, CANCELLED, PROVIDER_CONFIRMED, UNKNOWN). Каждая смена статуса сохраняется в status_history. Тот же attempt_reference с другими channel, provider_reference, amount или транзакцией отклоняется с 409 attempt_conflict, как и проверка, которая указывает его с другим tx_hash: повтор или смена провайдера — это новая попытка.

Попытка — это ещё не исполнение. execution_confirmed становится true, только когда платёжное событие её транзакции распределено на обязательство; попытка с TIMEOUT, за которой последовал успешный повтор, оставляет две попытки и одно исполнение. Если у попыток есть amount, проверка с этим attempt_reference сравнивает транзакцию с суммой попытки, поэтому выплата, разбитая на части, сверяется по частям.

Общие платежи и повторное использование

Один платёж может погашать несколько обязательств, а одно обязательство может быть оплачено несколькими платежами.

  • Несколько обязательств, один платёж. ChainZap никогда не делит платёж сам. Укажите доли через POST /v1/allocations (network, tx_hash, event_ref, allocations: [{external_reference, amount}] и необязательный owner, которым помечается любое прежнее распределение, заменяемое этим указанием). Событие появляется, только когда его с полным покрытием записала проверка, в которой указано обязательство (иначе 404 payment_event_not_found); оно должно быть выполнено и окончательно (409 payment_event_not_settled), быть в токене обязательства (409 allocation_token_mismatch), а доли не могут его превышать (409 allocation_exceeds_event). После этого проверка одной доли сравнивает эту долю, а не весь платёж, с тем, что причитается по обязательству.
  • Одно обязательство, несколько платежей. Каждая проверка под тем же референсом добавляет своё событие; residual_amount уменьшается, пока обязательство не станет ALLOCATED.
  • Сторнирование. POST /v1/allocations/{allocation_id}/reversal с reason (CUSTOMER_CORRECTION, DISPUTED, DUPLICATE_RECORD, OTHER) помечает распределение как сторнированное, а DISPUTED помечает его как DISPUTED. Оно остаётся в записях, и последующая проверка никогда его не восстанавливает; это может сделать только указание долей.

reuse.status сообщает, что реестру уже известно о платёжном событии:

Статус Значение
FIRST_SEEN Об этой транзакции записей нет.
REPEAT_CHECK Она уже проверялась, но ничто не закрепляет её за обязательством. Повторный запрос — это нормально и никогда не является находкой.
SAME_OBLIGATION Она уже сопоставлена с этим обязательством. Повторная проверка не распределяет её дважды.
DECLARED_SHARED Вы указали, что она погашает несколько обязательств, включая это.
OTHER_OBLIGATION Она уже погашает другое обязательство: TX_REUSED_ACROSS_OBLIGATIONS, REVIEW, и на это обязательство ничего не распределяется.

Идемпотентный повтор (тот же Idempotency-Key и то же тело) возвращает сохранённый ответ и повторным использованием не считается.

Входящие платежи

Для депозита передайте direction: "INCOMING" и сообщите ChainZap в customer_context, что ваша система уже сделала с ним: credit_status (NOT_CREDITED, CREDITED, PARTIALLY_CREDITED, UNKNOWN) и allocation_status (NOT_ALLOCATED, PARTIALLY_ALLOCATED, ALLOCATED, UNKNOWN) — насколько ваш учёт его уже применил. ChainZap не видит ваш учёт: без NOT_CREDITED чистый депозит получает CONFIRM_INTERNAL_STATE, как и при распределении UNKNOWN, а платёж, зачисленный или применённый хотя бы частично, даёт REVIEW с ALREADY_CREDITED. К депозитам и выплатам применяются одни и те же правила обязательств, распределений и повторного использования.

Хранение

Исходные референсы, адреса и хеши транзакций хранятся 90 дней, а затем заменяются ключевыми дайджестами; владельцы удаляются. Суммы, токены, статусы и версии сохраняются, поэтому итоги остаются верными. После этого реестр по-прежнему распознаёт повторно использованный платёж и повторный референс по дайджесту, а API возвращает redacted: true там, где исходного значения уже нет. Дайджест суммы и времени блока псевдонимен, а не анонимен.

Пакетная проверка

Пакет проверяет файл платежей из 50–200 строк тем же движком, что и отдельная проверка: каждая строка получает тот же ответ, те же причины и те же последствия в реестре, что получила бы сама по себе. Сначала файл проверяется и оценивается; пока вы не подтвердите запуск, ничего не выполняется и не списывается. Пакеты используют реестр обязательств и, пока он выключен, отвечают 403 batch_not_enabled.

Загрузить, запустить и выгрузить пакет можно в кабинете разработчика на странице «Пакеты» или через API ниже. Оба способа используют один и тот же сервис и одни и те же лимиты.

Файл

CSV в UTF-8 (метка порядка байтов допускается), разделитель — запятая или точка с запятой, первая строка — заголовок. До 200 строк и 256 КиБ. Одна строка — один платёж по одному обязательству.

Колонка Обязательна Значение
external_reference да Обязательство, к которому относится строка.
network да, или как значение по умолчанию tron, eth или ton (также распознаются trx, trc20, ethereum, erc20).
tx_hash нет Транзакция для проверки. Без неё строка только записывает обязательство, и оно появляется среди открытых обязательств.
expected_recipient, expected_token, expected_amount при первом появлении референса Что причитается. expected_token — контракт или символ из реестра, например USDT.
amount_tolerance, expected_sender нет Как в отдельной проверке.
direction, workflow_type нет OUTGOING или INCOMING; PAYOUT, DEPOSIT, INVOICE, REFUND, SETTLEMENT, OTHER.
instruction_version, instruction_effective_at, approval_reference нет Инструкция, по которой оплачена строка.
attempt_reference, attempt_status, channel, provider_reference, attempt_amount нет Попытка исполнения, стоящая за строкой.
allocated_amount нет Ваша доля платежа, который погашает несколько обязательств.

Распространённые названия заголовков распознаются: order_id, payout_id, invoice_id, reference для референса; txid, hash, transaction_hash для хеша; to, recipient, address, wallet для получателя; token, contract, asset, currency для токена; а также amount, tolerance, from, sender, chain, attempt, provider, status. Неизвестные колонки игнорируются и перечисляются в preflight.ignored_columns. Параметры запроса network, direction и workflow_type задают значения по умолчанию для строк, где они пусты. Шаблон можно скачать в кабинете разработчика.

Загрузка и preflight

cURL
curl --max-time 30 'https://api.chainzap.io/v1/batches?network=tron' \
  -H 'X-API-Key: YOUR_SERVER_API_KEY' -H 'Content-Type: text/csv' \
  -H 'Idempotency-Key: payouts-2026-10-05' --data-binary @payouts.csv

201 возвращает пакет в статусе PREFLIGHTED с полями:

  • preflight: rows, checks, obligations_only, invalid и duplicates, а также errors и warnings с подсчётом по кодам. Строка с ошибкой пропускается (SKIPPED_INVALID), а ошибка называет поле, например invalid_tron_address или unknown_token_symbol; точный дубль строки пропускается как дубликат. Если строки задают одному референсу разные условия, первая остаётся в силе, а последующие отклоняются (conflicting_rows_for_obligation). Предупреждения строку не пропускают: tx_shared_across_references (одна транзакция под несколькими референсами без allocated_amount), declared_shared_payment, several_transactions_for_obligation и tx_seen_for_other_obligation, когда реестр уже связывает транзакцию с другим обязательством.
  • estimate: верхняя граница, а не обещание. distinct_transactions, billable_checks_at_most, provider_calls_at_most, provider_usd_at_most (оценка без учёта кеша), quota_available и quota_sufficient.

Файл не в UTF-8, пустой, без заголовка или строк данных либо с некорректной строкой даёт 422 invalid_csv; заголовок без колонки external_reference или с повторяющейся колонкой — 422 invalid_csv_header; больше 200 строк — 413 batch_too_large. Idempotency-Key обозначает один файл: тот же ключ с тем же файлом возвращает тот же пакет, а с другим файлом — 409 idempotency_conflict. Организация выполняет не больше двух пакетов одновременно; запуск третьего даёт 429 batch_limit_reached (загрузка и preflight ничего не стоят и этим ограничением не затрагиваются).

Запуск

POST /v1/batches/{batch_id}/execute с {"confirm": true} ставит пакет в очередь; без confirm ответ — 422 confirmation_required. Если квоты не хватает на каждую уникальную транзакцию, ответ — 409 insufficient_quota; передайте "allow_partial": true, чтобы всё равно начать.

Строки проверяет фоновый обработчик, не быстрее половины лимита частоты вашей организации, поэтому ваш собственный трафик продолжает работать; пакеты всех организаций обрабатываются по очереди, частями. Строки одной транзакции выполняются в порядке файла. Каждая уникальная транзакция списывается один раз на пакет: после того как одна её строка дала платный ответ, последующие строки той же транзакции проверяются по своему обязательству бесплатно (отклонённая строка ничего не списывает, поэтому списывается следующая). Если заканчивается квота или дневной предел проверок без списания, пакет встаёт на паузу (PAUSED с pause_reason quota_exceeded или daily_unbilled_ceiling); запустите его снова, чтобы продолжить.

status пакета Значение
PREFLIGHTED Проверен и оценён, ждёт вашего подтверждения.
QUEUED, RUNNING Выполняется проверка.
PAUSED Остановлен из-за квоты или предела проверок без списания; продолжите через execute.
CANCELLING, CANCELLED Остановлен вами; уже проверенные строки сохраняют свои ответы.
COMPLETED У каждой строки есть ответ или ошибка.
FAILED Организация была приостановлена во время выполнения пакета.
state строки Значение
PENDING, CLAIMED Ожидает или проверяется.
DONE Проверка платежа окончательна (verification_final: true) либо строка только записала обязательство. В оценке риска может остаться временный пробел: такая строка сохраняет risk_retryable: true, обычно при risk_status: INSUFFICIENT, и retry её не перезапускает.
RETRYABLE Проверка платежа ещё не окончательна (транзакция ожидает подтверждения, не найдена, временный пробел ончейн-источников) или проверка завершилась 5xx.
FAILED Проверка отклонена с 4xx; исправьте строку и загрузите её снова.
SKIPPED_INVALID, SKIPPED_DUPLICATE, CANCELLED Не проверялась.

POST /v1/batches/{batch_id}/retry повторно запускает только строки RETRYABLE завершённого или приостановленного пакета, не больше пяти попыток на строку; если таких строк нет — 409 nothing_to_retry. POST /v1/batches/{batch_id}/cancel останавливает пакет.

Строка, у которой пробел только в оценке риска (недоступен KYT), получает DONE, а не RETRYABLE: смотрите её risk_retryable и risk_retry_after_seconds и при необходимости проверьте транзакцию снова с новым Idempotency-Key (см. повторы).

Результаты

  • GET /v1/batches возвращает список ваших последних пакетов; GET /v1/batches/{batch_id} — один пакет с progress и, после выполнения, summary.
  • GET /v1/batches/{batch_id}/rows?after=0&limit=100 постранично возвращает строки с краткими ответами (четыре статуса, recommended_action, результат сравнения суммы и разница, статус повторного использования и обязательства, коды причин, decision_id). Фильтруйте через state= или review=true.
  • GET /v1/batches/{batch_id}/export.csv возвращает каждую строку с её ответом. Ячейки, которые электронная таблица прочитала бы как формулу, начинаются с ', и каждая ячейка заключена в кавычки.

summary считает строки по состоянию и по overall_state, показывает распределение по каждой оси статусов и по recommended_action, число строк с analyst_review_required, ошибки и стоимость: usd_total, usd_per_transaction и usd_per_exception (любой ответ, кроме CLEAR), а также cost_complete. obligations перечисляет открытые обязательства с тем, что распределено и что осталось.

analyst_review_required отмечает строку, которую должен посмотреть человек: рекомендация MANUAL_REVIEW или HOLD_AND_ESCALATE. Строке, ответ по которой ещё не окончательный (RECHECK_LATER), нужен повтор, а не человек.

Sandbox

Sandbox-ключи выполняют пакеты на фикстурах песочницы и расходуют её лимит; тот же файл без изменений выполняется и с боевым ключом. Исходные значения строк хранятся 90 дней, как и в реестре, а затем удаляются; счётчики, статусы и дайджесты остаются.

Юридические документы и объём услуг

Условия для бизнеса, Соглашение о пилоте, Приложение о данных и Privacy доступны по ссылкам portal. В шаблонах до учреждения юридического лица ещё нужно заполнить договорные и коммерческие поля до подписания. Начальный профиль пилота — официальный USDT/TRON.

Отдельного переключателя integrity-only нет: проверка вызывает risk layer и явно показывает недостаточное/деградированное покрытие при отсутствии необходимых risk-данных. Portal показывает краткие строки, review-флаги, известные остатки и CSV; подробные decision evidence и операции reversal/correction доступны через API. Завершённый batch является snapshot на момент решения и не пересчитывается автоматически после последующих исправлений ledger. DONE означает обработано, а не оплачено или подтверждённый клиентом исход.

Эскроу-сделки

Эскроу-сделка держит USDT в сети TRON в отдельном контракте. Деньги двигаются только по действию того, у кого есть на это право: покупатель выплачивает их продавцу, продавец возвращает их, сторона забирает их после срока, который пропустила другая, стороны в споре предлагают одинаковый раздел или спор решает арбитр, названный до внесения средств. Ваша площадка создаёт черновик и показывает сделку; покупатель и продавец подписывают условия и перемещают средства своими кошельками. ChainZap создаёт контракт после обеих подписей и следит за сроками, но не хранит ключи сторон, никогда не бывает арбитром и не может переместить деньги.

Эскроу-сделки работают в закрытом пилоте. Пока ваша организация не подключена, каждый вызов отвечает 403 escrow_not_enabled. Песочница работает в тестовой сети TRON Nile с тестовым токеном без ценности.

Два режима

Спор возможен в любой сделке. Выбирается только одно: может ли его решить ещё и арбитр.

Без арбитра (по умолчанию) С внешним арбитром
Запрос resolver_enabled не передан или false "resolver_enabled": true, resolver_id, resolver_fee, timeline.resolve_period_seconds
Арбитр нет: в контракте нулевой адрес, без вознаграждения и без окна внешний арбитр, которого зарегистрировала ваша площадка; он, его вознаграждение и окно фиксируются в подписанных условиях до оплаты, назначить или заменить его позже нельзя
Спор завершается когда обе стороны предлагают одинаковый раздел так же или решением арбитра в его окно
Нет согласия тупик: средства остаются в контракте, пока стороны не договорятся, покупатель не выплатит или продавец не вернёт деньги так же, после окончания окна арбитра
Вознаграждение арбитра нет выплачивается из эскроу, только если арбитр решит спор

Начинайте без арбитра: этот режим подходит для поставок с объективной проверкой, а завершить спор стороны всегда могут сами.

Что позволяет контракт

  • Каждая сделка — отдельный контракт, который создаёт неизменяемая фабрика: без владельца, обновлений, паузы и административного ключа.
  • Деньги двигаются только по действию самой стороны или по решению арбитра в его окно:
    • покупатель выплачивает (release), а продавец возвращает средства (refund) в любой момент после оплаты до завершения сделки, в том числе во время спора;
    • покупатель забирает средства обратно (claimRefund), если срок поставки прошёл, а поставка не отмечена; продавец забирает оплату (claimRelease), если срок проверки прошёл без приёмки и без спора;
    • в споре сделка завершается, как только предложения сторон совпадут (proposeSettlement), или решением арбитра (resolve).
  • Никакой срок не решает спор, и сам по себе срок ничего не перемещает: он лишь открывает одной из сторон право потребовать деньги.
  • Любой, в том числе ChainZap, может только подтвердить оплату (confirmFunding), закрыть неоплаченную сделку после срока (expire), перевести уже начисленное его постоянному получателю (withdraw) и зачислить покупателю лишние токены (sweepExcess). Всё это работает напрямую в контракте, без ChainZap.
  • Выплаты уходят только покупателю, продавцу, получателю комиссии, зафиксированному в фабрике, и после решения — названному арбитру.

Жизненный цикл

Шаг Кто Результат
Черновик ваша площадка, POST /v1/escrow-deals status: DRAFT, ссылка для участников
Согласие покупатель и продавец, каждый своим кошельком текст, который оба подписывают, фиксирует все условия
Согласование автоматически после обеих подписей AGREED, затем CREATING, пока контракт создаётся
Оплата покупатель: обычный перевод суммы токеном на эскроу; затем кто угодно вызывает confirmFunding state: FUNDED
Поставка продавец: markDelivered с хешем материалов DELIVERED, начинается срок проверки
Приёмка покупатель: release или dispute в срок проверки RELEASED или DISPUTED
Молчание покупатель: claimRefund после срока поставки; продавец: claimRelease после срока проверки REFUNDED или RELEASED
Спор обе стороны: proposeSettlement; арбитр, если он есть: resolve в своё окно RELEASED, REFUNDED или SPLIT

status — состояние черновика вне сети (DRAFT, AGREED, CREATING, ON_CHAIN, CANCELLED, AGREEMENT_EXPIRED, CREATION_BLOCKED); после создания контракта state — его собственное состояние (AWAITING_FUNDS, FUNDED, DELIVERED, DISPUTED, RELEASED, REFUNDED, SPLIT, EXPIRED). Тупик — не состояние контракта: это спор, который уже не может решить ни один арбитр; API сообщает его как settlement.deadlocked. Источник истины — сеть: API сообщает то, что прочитал из подтверждённых (solidified) блоков, и ставит contract.out_of_sync, если не может подтвердить последнее состояние.

Оплата

Оплата — обычный перевод токена сделки на адрес эскроу, без разрешения (allowance) и без transferFrom. Когда на эскроу есть хотя бы сумма сделки, кто угодно может вызвать confirmFunding до срока оплаты; ChainZap делает это, как только увидит баланс. До этого funding показывает, сколько эскроу уже получил (received) и сколько не хватает (remaining), по последнему чтению из сети.

  • Меньше суммы. Сделка остаётся в AWAITING_FUNDS; отправьте недостающее до срока оплаты. confirmFunding не принимает эскроу, на котором меньше суммы.
  • Больше суммы или второй перевод. После оплаты излишек зачисляется покупателю (sweepExcess, событие escrow_deal.excess_credited) и выводится как любая выплата. Он не блокируется в сделке и никогда не уходит ChainZap.
  • Слишком поздно. После срока оплаты сделку можно только закрыть (expire, состояние EXPIRED); всё, что на неё пришло, зачисляется покупателю и выводится.
  • С другого адреса. Учитывается только баланс эскроу, поэтому перевод с любого адреса оплачивает сделку, а возврат и излишек уходят на адрес покупателя из условий, а не отправителю.

Страница сделки отправляет ровно недостающую сумму на эскроу, прочитанный из фабрики, и отказывается от любого другого получателя, токена или суммы.

Сроки и права требования

Состояние Срок Что открывается Кто должен действовать
AWAITING_FUNDS срок оплаты сделка закрывается без средств (EXPIRED) кто угодно; это делает ChainZap
FUNDED срок поставки после оплаты полный возврат покупателю покупатель (claimRefund)
DELIVERED срок проверки после поставки оплата продавцу за вычетом комиссии продавец (claimRelease)
DISPUTED окно арбитра, если он есть ничего: тупик, пока стороны не договорятся стороны

Сроки считаются по времени блоков. Действие принимается только до своего срока, требование — только начиная с него, поэтому они не пересекаются. Требование не срабатывает само: пока сторона его не предъявила, другая сторона ещё может действовать; например, покупатель может выплатить и после срока поставки. timeline.if_nobody_acts в каждом ответе говорит, что открывает текущий срок: at, outcome (EXPIRED, REFUNDED, RELEASED или DEADLOCK) и claim_by (BUYER, SELLER, ANYONE или null, если ничего не открывается).

В боевой среде у покупателя на проверку не меньше 72 часов (иначе 422 inspection_period_below_policy). Молчание покупателя позволяет продавцу забрать оплату, поэтому ChainZap напоминает покупателю в Telegram сразу после поставки, на середине срока проверки, за 12 часов и за 1 час до его конца; продавцу — за 24 и за 2 часа до срока поставки, и каждой стороне — когда у неё открывается право требования.

Спор, предложения и тупик

Покупатель может открыть спор (dispute с хешем материалов) только в срок проверки. С этого момента продавец не может забрать оплату, и никакой срок исход не решает.

  • Предложения. Каждая сторона предлагает buyer_amount — сколько из суммы получает обратно покупатель: 0 отдаёт всё продавцу (за вычетом комиссии), полная сумма возвращает всё покупателю, промежуточное значение — раздел. Любая сторона может изменить своё предложение в любой момент; сделка завершается, как только они совпадут (settlement_reason: MUTUAL_SETTLEMENT, событие escrow_deal.settlement_proposed на каждое предложение). Текущие предложения — в settlement.buyer_proposal и settlement.seller_proposal.
  • Арбитр. В сделке, где он назван, арбитр может вынести решение в течение resolve_period после открытия спора (timeline.resolve_deadline): resolve(buyer_amount, ruling_hash), только по подписанным критериям. Его вознаграждение берётся сверху, а решение — это сумма, которую покупатель получает из остатка (settlement_reason: RESOLVER).
  • Тупик. Без арбитра или после окончания его окна спор без совпавших предложений — тупик (settlement.deadlocked: true). Средства остаются в контракте, пока обе стороны не предложат одинаковый раздел, покупатель не выплатит или продавец не вернёт деньги. Ни срок, ни ChainZap завершить его не могут.

Деньги

Комиссия сервиса — фиксированная сумма, которая определяется при создании черновика (fee_bps от суммы по политике вашего пилота) и берётся только из выплаты продавцу:

  • выплата или требование продавца: продавец получает сумму за вычетом комиссии;
  • раздел: комиссия уменьшается пропорционально части продавца;
  • возврат, требование покупателя или истечение срока оплаты: комиссии нет.

Вознаграждение арбитра фиксируется в условиях и выплачивается, только если арбитр решит спор. Пример: сумма 100, вознаграждение 5, решение «покупателю 40»: покупатель получает 40, арбитр — 5, продавец — 55 за вычетом комиссии сервиса с этих 55. Совпавшие предложения, выплата и возврат арбитру ничего не платят.

balances разделяет начисленное контрактом (accrued), ещё не выведенное (claimable) и уже ушедшее из контракта (withdrawn) — для buyer, seller, fee и resolver. Каждая сторона оплачивает комиссию сети за свои транзакции в TRX; ChainZap оплачивает подтверждение оплаты, закрытие неоплаченных сделок, зачисление излишка и отправку выплат.

Создание черновика

cURL
curl --max-time 15 https://api.chainzap.io/v1/escrow-deals \
  -H 'X-API-Key: YOUR_SERVER_API_KEY' -H 'Content-Type: application/json' \
  -d '{
    "external_reference": "order-2026-10-0042",
    "buyer": "TAHXBmAAswvxo1fx7NzQeJe234766SHwG5",
    "seller": "TTogA7AhPuChVpzUEePBhPyFi8VsStSAmn",
    "amount": "1250.50",
    "category": "DIGITAL_GOODS",
    "title": "Annual licence key",
    "delivery": {
      "criteria": ["The key activates on the vendor site", "The licence covers 12 months"],
      "method": "Key sent through the order chat",
      "evidence_required": ["Screenshot of the activation page"]
    },
    "timeline": {
      "delivery_period_seconds": 259200,
      "inspection_period_seconds": 259200
    }
  }'

Этот черновик — без арбитра. Чтобы назвать арбитра, добавьте "resolver_enabled": true, самого арбитра ("resolver_id" или арбитр по умолчанию из политики), его вознаграждение в единицах токена и окно после открытия спора:

JSON
{
  "resolver_enabled": true,
  "resolver_id": "0192f0c4-6f1e-7a3b-9c2d-4e5f60718293",
  "resolver_fee": "12.50",
  "timeline": {
    "delivery_period_seconds": 259200,
    "inspection_period_seconds": 259200,
    "resolve_period_seconds": 259200
  }
}

Сделка с арбитром без этих настроек отвечает 422 resolver_settings_required; сделка без арбитра с любой из них — 422 resolver_settings_without_resolver. Вознаграждение арбитра не может превышать долю от суммы, которую допускает ваша политика (422 invalid_resolver_fee).

Тот же external_reference с тем же телом возвращает тот же черновик (replayed: true); с другим телом — 409 escrow_reference_conflict. Найти черновик позже можно через POST /v1/escrow-deals/lookup. Критерии поставки — от двух до пяти объективных проверок: спор ведётся только по этим строкам. Категории ограничены цифровыми поставками с объективной проверкой приёмки и включаются политикой пилота.

POST /v1/escrow-deals/{ref}/versions заменяет условия черновика (передайте expected_version); подписи под прежней версией перестают учитываться. POST /v1/escrow-deals/{ref}/cancel закрывает черновик. После подписи обеих сторон ни то ни другое невозможно.

Арбитры

Арбитр необязателен. Сделка, где он есть, называет внешнего арбитра, которого зарегистрировала ваша площадка. Арбитр никогда не ChainZap: его адрес и все ключи его аккаунта TRON не могут быть адресом или ключом ChainZap, а также ключом покупателя или продавца сделки.

shell
curl --max-time 15 https://api.chainzap.io/v1/escrow-deals/resolvers \
  -H 'X-API-Key: YOUR_SERVER_API_KEY' -H 'Content-Type: application/json' \
  -d '{
    "address": "TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC",
    "name": "Example dispute service",
    "affiliation": "INDEPENDENT",
    "rules_version": "dispute-rules/2026-10",
    "rules_sha256": "5f0c…64 hex characters"
  }'

affiliation — PLATFORM (работает от вашей площадки) или INDEPENDENT; стороны видят это и то, что арбитра зарегистрировала ваша площадка. В боевой среде аккаунт читается в сети: он должен подписывать решения одним ключом (SINGLE_KEY) или двумя из трёх ключей, чья active permission может только вызывать контракты (MULTISIG_2_OF_3); всё прочее отклоняется (resolver_scheme_unsupported, resolver_account_not_activated). В песочнице чтение — по возможности; арбитр, который не может подписать, остаётся зарегистрированным, но с eligible: false.

GET /v1/escrow-deals/resolvers показывает ваших арбитров и общих; у каждого — key_scheme, signatures_required, eligible и ineligible_reason. POST …/resolvers/{id}/verify читает аккаунт заново. POST …/resolvers/{id}/disable запрещает новые сделки с ним (сделки, где он уже назван, сохраняют его); …/enable разрешает снова, в боевой среде — после нового чтения. Регистрацию нельзя изменить: данные арбитра входят в условия, которые подписывают обе стороны, поэтому другой арбитр — новая регистрация. Вознаграждение в регистрацию не входит: его задаёт каждая сделка. Не больше 20 активных арбитров на сеть (и 100 регистраций всего); арбитр другой организации отвечает 404 resolver_not_found. То же самое делает вкладка эскроу в кабинете разработчика.

Согласие

Отправьте сторонам ссылку на сделку из links. На странице сделки каждая сторона входит кошельком, указанным в сделке, видит все условия и подписывает один текст в TronLink (signMessageV2). Страница заново вычисляет хеш условий, идентификатор сделки и текст по показанным условиям и не предлагает подпись, если что-то не совпадает. Каждую транзакцию, которую она предлагает дальше, страница сверяет с теми же условиями: адрес эскроу читается из реестра фабрики, перевод уходит только на этот эскроу и только на недостающую сумму, вывод — только на адрес вошедшей стороны.

Чтобы собирать подписи в своём интерфейсе, прочитайте GET /v1/escrow-deals/{ref}/consent: message — точный текст, params — параметры контракта, terms — документ (chainzap.escrow.terms/2), хеш канонического JSON которого равен terms_hash. Передайте подпись через POST /v1/escrow-deals/{ref}/consents (version, role, signature). Сторона, чьим аккаунтом управляют другие ключи (мультиподпись через permissions), подтверждает условия транзакцией (approveTerms в actions).

Обе подписи проверяются дважды: API и фабрикой, которая перед созданием контракта сама формирует тот же текст. Текст называет арбитра или Resolver: none и говорит, что означают молчание и спор. Вот его строки для сделки с арбитром, а затем без него:

text
Resolver: TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC
Resolver fee: 12.500000 USDT, paid from the escrow only if the resolver decides a dispute
Resolver period after dispute: 3d 00h 00m
If delivery is not marked in time: the buyer can claim a refund
If the buyer neither accepts nor disputes during inspection: the seller can claim payment
In a dispute: no automatic outcome; it settles when buyer and seller propose the same split, or by the resolver within its period; otherwise the funds stay locked

Resolver: none
If delivery is not marked in time: the buyer can claim a refund
If the buyer neither accepts nor disputes during inspection: the seller can claim payment
In a dispute: no automatic outcome; it settles when buyer and seller propose the same split; otherwise the funds stay locked

Транзакции сторон

GET /v1/escrow-deals/{ref}/actions?role=BUYER показывает, что эта сторона может подписать сейчас. У каждого действия есть контракт, функция, параметры в кодировке ABI, лимит комиссии и оценка энергии:

Действие Кто Вызов
TRANSFER_FUNDS покупатель transfer(address,uint256) на токене: эскроу и недостающая сумма
CONFIRM_FUNDING кто угодно confirmFunding(), когда на эскроу есть вся сумма
MARK_DELIVERED продавец markDelivered(bytes32) с хешем материалов
RELEASE, REFUND покупатель, продавец release(), refund()
CLAIM_REFUND, CLAIM_RELEASE покупатель, продавец claimRefund() после срока поставки, claimRelease() после срока проверки
DISPUTE покупатель dispute(bytes32) в срок проверки
PROPOSE_SETTLEMENT покупатель, продавец proposeSettlement(uint96); parameters пусты: сумму покупателю, от 0 до суммы сделки, кодируете вы
EXPIRE, SWEEP_EXCESS кто угодно expire() после срока оплаты, sweepExcess(), когда на эскроу больше, чем он должен
WITHDRAW получатель withdraw(address) для начисленной выплаты

Действия, доступные кому угодно, показываются у каждой роли, пока они открыты. Если транзакции собирает ваш интерфейс, сделайте те же проверки до подписи: эскроу — это escrowOf(deal_id) фабрики, указанной в подписанных условиях, а токен — токен этой фабрики. После отправки транзакции сообщите о ней через POST /v1/escrow-deals/{ref}/transactions; она учитывается только после подтверждения сетью, а само сообщение сделку не меняет. Сообщение принимается, только пока у сделки может быть такая транзакция (409 action_not_available), и не больше пяти ожидающих на сторону (429 too_many_pending_transactions); подтверждённая транзакция, которая не является этим вызовом от этой стороны, отбрасывается.

Telegram

links.telegram_invite — ссылка t.me на бота ChainZap для этой сделки; отправьте её сторонам рядом со ссылкой на сделку. Бот не называет деталей сделки: он открывает страницу сделки в браузере, где делаются все подписи и платежи, и статус сделки в Mini App Telegram. Экран статуса показывает только сделки, которые сторона привязала из личного чата после входа кошельком; из Telegram ничего подписать или отправить нельзя. Веб и Telegram показывают одну и ту же сделку с одним id.

Материалы

POST /v1/escrow-deals/{ref}/evidence добавляет текстовую заметку, PUT /v1/escrow-deals/{ref}/evidence/files?purpose=DELIVERY&file_name=log.pdf — файл (PDF, PNG, JPEG, WebP или текст, до 10 МиБ). Ваши материалы помечаются как переданные площадкой: они показывают отправителя, а не факт поставки. У каждого материала сохраняются SHA-256, автор и время; замена — это новый материал. Когда сторона отмечает поставку или открывает спор, хеш её набора материалов записывается в сеть. Содержимое файлов удаляется после срока хранения; хеши остаются.

GET /v1/escrow-deals/{ref}/dispute возвращает критерии, материалы обеих сторон и сроки спора.

События и вебхуки

Каждое изменение становится событием: escrow_deal.created, terms_updated, consent_received, agreed, cancelled, agreement_expired, creation_blocked, contract_created, funded, delivered, disputed, settlement_proposed, settled, excess_credited, payout_withdrawn и evidence_added. Напоминания о сроках уходят сторонам в Telegram, а не на вебхук.

Задайте один адрес на среду через PUT /v1/escrow-deals/webhook ({"url": "https://..."}); ответ один раз показывает секрет подписи. Адрес должен быть HTTPS на порту 443 с публичным IP; перенаправления не выполняются. Каждая доставка — POST с заголовками:

Заголовок Значение
X-ChainZap-Event-Id событие, одинаковое при каждом повторе
X-ChainZap-Delivery-Id серия попыток этой доставки
X-ChainZap-Timestamp Unix-время подписи в секундах
X-ChainZap-Signature v1= и HMAC-SHA256 от {timestamp}.{delivery_id}.{body} вашим секретом
Python
import hashlib, hmac, time

def verify(secret: str, headers: dict, body: bytes) -> bool:
    timestamp = int(headers["X-ChainZap-Timestamp"])
    if abs(time.time() - timestamp) > 300:
        return False
    message = f"{timestamp}.{headers['X-ChainZap-Delivery-Id']}.".encode() + body
    expected = "v1=" + hmac.new(secret.encode(), message, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, headers["X-ChainZap-Signature"])

Ответьте 2xx в течение 10 секунд. Неудачные доставки повторяются с растущими паузами (от 30 секунд до 12 часов, 12 попыток). Доставка — не реже одного раза и не по порядку: удаляйте повторы по X-ChainZap-Event-Id и упорядочивайте по sequence. GET /v1/escrow-deals/events?after=<sequence> — полная лента, чтобы догнать события после простоя; POST /v1/escrow-deals/events/{event_id}/redeliver отправляет событие ещё раз, POST /v1/escrow-deals/webhook/test — подписанный escrow.ping, POST /v1/escrow-deals/webhook/rotate-secret меняет секрет, DELETE /v1/escrow-deals/webhook останавливает доставки.

Что изменилось в протоколе v2

Новые сделки используют вторую версию контракта и условий. Если вы интегрировались с первой версией пилота:

  • Запрос черновика. dispute_enabled заменён на resolver_enabled: спор возможен в любой сделке, необязателен только арбитр. С арбитром передавайте resolver_id, resolver_fee и timeline.resolve_period_seconds. timeline.response_period_seconds и timeout_outcome удалены: окна ответа продавца и исхода спора по сроку больше нет.
  • Ответ со сделкой. Новое: protocol_version, resolver.fee, timeline.resolve_deadline, settlement (предложения и deadlocked, пока идёт спор), funding (пока сделка ждёт оплаты) и resolver в balances.accrued, claimable и withdrawn. timeline.if_nobody_acts теперь {at, outcome, claim_by}. Удалены: dispute_enabled, timeline.response_period_seconds, timeline.seller_response_deadline и timeline.seller_responded. settlement_reason может быть MUTUAL_SETTLEMENT; TIMEOUT_NO_RULING встречается только у архивных сделок.
  • Оплата и сроки. Оплата — прямой перевод и confirmFunding вместо разрешения и fund. После срока поставки или проверки деньги забирает покупатель или продавец; ничего не завершается по таймауту.
  • Действия. Новые: TRANSFER_FUNDS, CONFIRM_FUNDING, CLAIM_REFUND, CLAIM_RELEASE, PROPOSE_SETTLEMENT, EXPIRE и SWEEP_EXCESS. Удалены: APPROVE_TOKEN, FUND, RESPOND, PROCESS_TIMEOUT и CREDIT_EXCESS.
  • События. Новые: escrow_deal.settlement_proposed и escrow_deal.excess_credited. Удалено: escrow_deal.seller_responded.
  • Условия. chainzap.escrow.terms/2 добавляет rules: "chainzap.escrow.rules/2" и resolver.fee и убирает timeout_outcome и timeline.response_period.
  • Ошибки. Новые: resolver_settings_required, resolver_settings_without_resolver, invalid_resolver_fee и invalid_buyer_amount. Удалены: invalid_simple_deal, dispute_settings_required, dispute_settings_without_disputes, disputes_disabled и invalid_timeout_outcome.

Сделки, созданные до второй версии, сохраняют protocol_version: 1. Они в архиве: API и страница сделки показывают их только для чтения по записи ChainZap, и с ними ничего не делается.

Ошибки

Код Когда
403 escrow_not_enabled эскроу-сделки выключены для этой организации или среды
403 participant_not_allowed боевой участник не входит в список пилота
422 participant_screening_failed адрес стороны не прошёл проверку; в боевой среде 503 screening_unavailable, если список недоступен
422 deal_amount_above_pilot_cap, 409 pilot_volume_cap_reached сделка превышает лимиты пилота
422 category_not_enabled, 422 resolver_not_available, 422 resolver_not_verified категория или арбитр недоступны
422 inspection_period_below_policy, 422 resolve_period_below_policy, 422 invalid_period срок короче, чем допускает политика, или вне границ фабрики
422 resolver_settings_required, 422 resolver_settings_without_resolver настройки арбитра не соответствуют resolver_enabled
422 invalid_resolver_fee вознаграждение арбитра больше доли, которую допускает политика, или задано без арбитра
422 resolver_is_chainzap, 422 resolver_is_party, 422 resolver_scheme_unsupported, 422 resolver_account_not_activated арбитра нельзя зарегистрировать или назвать
409 resolver_already_registered, 409 resolver_limit_reached, 404 resolver_not_found регистрация арбитров
422 invalid_consent_signature подпись не соответствует стороне и этим условиям
409 terms_version_conflict, 409 escrow_terms_locked условия изменились или больше не могут меняться
409 agreement_expired время на подпись истекло
409 action_not_available, 429 too_many_pending_transactions такая транзакция сейчас невозможна или слишком много ещё ожидают подтверждения
404 escrow_not_found такой сделки нет в этой организации и среде

Все ошибки в общем формате. Запросы к эскроу ограничены 16 КиБ JSON, файл материалов — 10 МиБ.

Песочница

Sandbox-ключи работают в тестовой сети TRON Nile с тестовым токеном «ChainZap TEST USD (NO VALUE)». Сценарий, страницы и вебхуки такие же, как в боевой среде, а политика песочницы может разрешать более короткий срок проверки, чтобы быстрее пройти сценарий; реальные средства задействовать невозможно. Боевые сделки используют USDT в основной сети TRON только для организаций пилота, со списком допущенных участников и лимитами на сделку и в сумме.

GET /v1/usage

Запрос

cURL
curl --include --max-time 15 'https://api.chainzap.io/v1/usage?days=30' \
  -H 'X-API-Key: cz_live_000000000000.fictional_example_only' \
  -H 'X-Request-ID: merchant-usage-1001'

days — целое число от 1 до 90, по умолчанию 30. Ключ идемпотентности для этого чтения не нужен. Читайте заголовок ответа X-Request-ID. Запрос статистики учитывается в лимите частоты запросов, но не расходует проверки. Повторяйте только ошибки с пометкой retryable и учитывайте Retry-After.

Квота текущего периода

period.start и period.end обозначают границы текущего расчётного периода: оплаченного периода, привязанного к подтверждённой оплате, либо календарного месяца по UTC для организации без оплаченного плана.

Поле Значение
limit Включённые проверки периода.
used Завершённые проверки, которые были списаны.
reserved Ещё выполняющиеся проверки, за которыми закреплён резерв.
remaining max(0, limit - used - reserved).

Резерв освобождается, когда запрос завершается без списания. balances добавляет дополнительные проверки и общий доступный остаток, subscription описывает оплаченный период (status: "legacy" при plan: null означает, что лимиты организации установлены по договорённости, например по пилотному контракту, а не самостоятельно выбранным планом, и действуют именно показанные лимиты); см. планы и оплату. environment равен live или sandbox в зависимости от ключа. Все API-ключи организации и запросы из кабинета разработчика используют одну квоту.

Статистика за выбранное окно

recent считает завершённые логические проверки за скользящее окно в days дней. Повторная выдача сохранённого ответа не создаёт новую запись о проверке. Статистика включает число списанных проверок, ошибок и результатов LIMITED_DATA, среднее время ответа, сети и распределение по общей оценке. Хеши транзакций и данные провайдеров в неё не входят.

Кабинет разработчика дополнительно показывает данные по дням UTC, счётчики за 1/7/30 дней и p50/p95, если за последние 30 дней накопилось не менее 20 завершённых измерений. В число успешных ответов входят и ответы с частичным покрытием: это часть общего числа, а не отдельная прибавка к нему.

График сравнивает завершённые запросы и списанные проверки за 7, 30 или 90 дней. Наведите указатель, коснитесь графика или выберите день ползунком — он также работает со стрелками на клавиатуре. Дни без проверок показаны нулями; первый и последний дни по UTC могут быть неполными. Live и Sandbox отображаются отдельно. Под графиками можно раскрыть таблицу по дням. Полоса лимита показывает включённые проверки текущего расчётного периода; дополнительные пакеты находятся в разделе «Тариф и оплата».

Кабинет разработчика и планы

После входа в кабинет разработчика откройте /dashboard/usage/: здесь находятся счётчики квоты, таблицы по дням, распределение результатов и время ответа. В /dashboard/plan/ показаны текущий план, месячная квота, запросы в минуту и лимит одновременных запросов. Сети, разрешённые планом, показаны отдельно от сетей, включённых для проверок сейчас; включённый флаг не означает проверку работоспособности провайдеров в реальном времени.

На странице «Тестовый запрос» можно выбрать автоматическое определение сети либо явно указать TRON, Ethereum или TON из доступных сетей. Такие проверки используют ту же квоту организации и те же правила идемпотентности, что и серверный API.

Планы и пакеты дополнительных проверок покупаются на странице «Тариф и оплата»; см. планы и оплату. Продление ручное: автоматических списаний, счетов и кошелька API нет. Пользовательские подписки Mini App не дают квоту B2B API. Публичная документация доступна без входа.

Планы, проверки и оплата (бета)

За что списывается

Проверка — это одна проверка транзакции через API. Оплачивается только полная и окончательная проверка: ответ с coverage: complete и состоянием CLEAR, REVIEW или HIGH_RISK по транзакции, которая подтверждена по правилам окончательного подтверждения или окончательно завершилась ошибкой. Рискованный результат — тоже полезный результат, и он списывается. Транзакция, ожидающая подтверждения, ненайденная транзакция, LIMITED_DATA, ошибки передачи, таймауты, ошибки квоты и повторная выдача сохранённого ответа не списываются ни на одном из эндпоинтов; их резерв освобождается. Успешный HTTP-ответ не равен списанной проверке.

Бета-планы (ценовая политика BETA_PRICING_V0)

План даёт организации определённое число включённых проверок на расчётный период.

План В месяц Включённые проверки Дополнительная проверка
Sandbox бесплатно 50 тестовых проверок в месяц (UTC) не продаётся
Starter $99 250 $0,40
Growth $299 1 000 $0,30
Business $999 5 000 $0,20
Scale индивидуально индивидуально индивидуально

Цены указаны в долларах США. GET /v1/catalog публикует их в целых минимальных единицах (центах). Это предварительные условия беты, они могут измениться для будущих расчётных периодов; уже оплаченный заказ или период сохраняет условия, на которых был продан. Лимиты частоты запросов и параллельности предварительные до общего запуска. Scale согласуется индивидуально и онлайн не продаётся.

cURL
curl --max-time 15 https://api.chainzap.io/v1/catalog \
  -H 'X-API-Key: cz_live_000000000000.fictional_example_only'

Расчётные периоды и продление

Оплаченный расчётный период начинается с подтверждения оплаты на сервере и длится один календарный месяц (31 января → 28 или 29 февраля; затем дата возвращается к исходному числу). Продление ручное: автоматических списаний нет. Досрочная оплата планирует следующий период с момента окончания текущего; оплата после перерыва начинает новый период сразу. Другой план применяется со следующего расчётного периода; текущий оплаченный период не обнуляется. Включённые проверки не переносятся.

Пакеты дополнительных проверок

Пакет дополнительных проверок добавляет проверки сверх включённых. Пакет содержит от 100 до 10 000 проверок с шагом 50 и стоит по цене дополнительной проверки вашего текущего плана. Дополнительные проверки действуют 12 месяцев с покупки, расходуются только после включённых и доступны только при активном оплаченном плане. При неактивном плане они заморожены, а не сгорают. Цена фиксируется при покупке и не пересчитывается при изменении каталога.

Оплата

Покупки оформляются в кабинете разработчика участниками с ролями owner, admin и billing, но никогда по API-ключу. Оплата — в криптовалюте. Проверьте итоговую сумму и нажмите «Оплатить криптовалютой»: откроется страница оплаты, где нужно оплатить точную сумму в USDT или другой предложенной там монете. Сумма зафиксирована в долларах США, а страница принимает оплату в течение срока действия заказа, не меньше 15 минут. Если вы ушли со страницы, заказ на странице «Тариф и оплата» вернёт к оплате или позволит его отменить. Проверки начисляются только после того, как сервер сам подтвердит оплату у платёжного провайдера: ответ кошелька, скриншот или возврат на страницу кабинета ничего не начисляют. Страницу оплаты нельзя отозвать, поэтому деньги, отправленные после отмены или истечения заказа, всё равно зачисляются, если их можно применить, а иначе разбираются поддержкой. Повторный или неполный платёж фиксируется и разбирается поддержкой; дважды он не начисляется.

Остаток в API

cURL
curl --max-time 15 'https://api.chainzap.io/v1/usage?days=7' \
  -H 'X-API-Key: cz_live_000000000000.fictional_example_only' | jq '.balances, .subscription'

period.remaining сохраняет смысл: это оставшиеся включённые проверки текущего расчётного периода. balances.extra показывает дополнительные проверки, balances.total_available — всё, что доступно новой проверке, balances.included.reserved — ещё выполняющиеся проверки. subscription сообщает расчётный период, план и ручное продление. Заголовок X-Quota-Available передаёт общий остаток в ответах проверки. Остаток не отменяет приостановку организации, невключённую сеть или неактивный план: когда доступных проверок нет, возвращается 429 quota_exceeded.

Возвраты и споры

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

Sandbox

Sandbox-ключи начинаются с cz_test_. Они создаются в кабинете разработчика или оператором вашей организации. Такие ключи обращаются к тем же методам с теми же схемами запроса и ответа, но никогда не вызывают провайдеров данных, ничего не стоят и не затрагивают платные проверки. Каждый успешный ответ sandbox содержит environment: "sandbox", как и каждая ошибка, которую возвращает сама проверка (например provider_unavailable, network_not_enabled, квота и лимиты частоты): ориентируйтесь на это поле. У отказа до начала проверки (401, 403 tenant_suspended, 503 api_disabled, лимит 429 по IP, действующий до чтения ключа, 413, 415, ошибка валидации запроса 422, invalid_idempotency_key) поля environment нет, а у неожиданных 500 и 504 его может не быть; там среду определяет ключ, который вы отправили. POST /v1/check и проверка кошелька дополнительно содержат details.evidence.source: "sandbox"; у POST /v1/transaction/check блока details нет, а его элементы доказательств называют те же роли источников, что и боевой ответ, поэтому ориентируйтесь на environment. Считайте такой результат фикстурой, а не наблюдением. Каждая фикстура объясняет себя теми же reason_codes, что и боевой движок, поэтому ветки, написанные под sandbox, — это те же ветки, что сработают в продакшене.

Детерминированные исходы

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

Первый hex-символ Результат
0–3, c, f CLEAR, полное покрытие
4–5 REVIEW, полное покрытие
6 HIGH_RISK из-за повышенного уровня AML, полное покрытие
7 HIGH_RISK из-за санкционного совпадения (sanctions_hit: true), полное покрытие
8–9 LIMITED_DATA, частичное покрытие, не списывается
a транзакция не найдена, как в боевой среде: transaction_status: NOT_FOUND, можно повторить, не списывается; /v1/check отвечает 404 transaction_not_found
b сбой провайдера (503 provider_unavailable), не списывается
d транзакция, завершившаяся ошибкой (revert): transaction_status: FAILED, recommended_action: NOT_EXECUTED, поля *_match равны null; результат окончательный и списывается, как боевая неуспешная транзакция
e транзакция, ожидающая подтверждения: REVIEW с TX_PENDING_CONFIRMATIONS, полное покрытие, не списывается

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

cURL
curl --max-time 15 https://api.chainzap.io/v1/check \
  -H 'X-API-Key: cz_test_000000000000.fictional_example_only' \
  -H 'Idempotency-Key: sandbox-demo-1' -H 'Content-Type: application/json' \
  --data '{"tx_hash":"8111111111111111111111111111111111111111111111111111111111111111"}'

Без network песочница отвечает для TRON, если TRON включён для вашей организации, а иначе — для первой доступной вам сети. Как и при боевом определении сети, форма хеша (0x, base64) никогда не выбирает сеть. Чтобы узнать, включена ли сеть, укажите network явно: песочница ответит 403 network_not_enabled так же, как боевая среда. Для base64-хешей TON используются старшие четыре бита первого байта.

Лимит и изоляция

Песочница расходует лимит ровно на то, за что списывается боевая проверка, — на полный окончательный результат. Результат по транзакции, ожидающей подтверждения, частичный результат, ненайденная транзакция и фикстура сбоя не стоят ничего, как и в продакшене; фикстура неуспешной транзакции (d) окончательна и списывается, как и боевая неуспешная транзакция. Если ваша организация работает по пилотному контракту, sandbox-ключи получают те же отказы, что и боевые (expected_fields_required, token_not_enabled, check_kind_not_enabled). Поля expected_recipient, expected_token и expected_amount сравниваются с фикстурой, и несовпадение никогда не даёт CLEAR, поэтому ветка, которую вы протестировали, — это ветка, которая сработает в бою; ненулевой знак за пределами decimals токена даёт 422 invalid_expected_amount, как и в боевой среде. Проверки sandbox расходуют отдельный лимит в 50 тестовых проверок за календарный месяц UTC; GET /v1/usage с sandbox-ключом показывает этот лимит с environment: "sandbox". Ключи идемпотентности, квота и статистика раздельны по средам: один и тот же Idempotency-Key в sandbox и в среде live — две разные операции. Sandbox-ключ не может ничего купить и не подтверждает, что live-сеть включена для вашей организации.

Фикстуры для кошельков

Для POST /v1/wallet/check песочница выбирает исход по хешу нормализованного адреса, поэтому первым символом им управлять нельзя. Используйте один из закреплённых адресов ниже; каждая строка стабильна между выпусками и проверяется тестами.

Исход Результат
clear CLEAR, полное покрытие, списывается
review REVIEW из-за поведения, полное покрытие, списывается
high_risk_denylist HIGH_RISK из-за совпадения со списком недобросовестных адресов, полное покрытие, списывается
high_risk_sanctions HIGH_RISK из-за санкционного совпадения, полное покрытие, списывается
limited_data LIMITED_DATA, частичное покрытие, не списывается
review_partial REVIEW с косвенной связью и частичной проверкой контрагентов, списывается
provider_unavailable 503 provider_unavailable, не списывается
Исход Ethereum TRON TON
clear 0xc933ee607c865f6fbc6222330dc9166e1cc6d64f TPkD2p19tKyRxAyRFyFdAc5vdPifpmtUfc 0:ad4ab97d14757696f1af317e613adc31b296e683ad1795880c8c906de6daf327
review 0x0aa8246d9ace486edb4cb7600ac6d40c3c8f884b TBBBSYtDqb7szRTcJ9YW4AdrEFTz7a9pvi 0:fa057a9368fb5432944e6c874d1f92e8a1cd893f88e6f18a868c08a3bf7dc885
high_risk_denylist 0x1e799ef4c436f1e576f1cf40fb3655ca7e87cd4a TZBCVU6RLDLhvJoJUPksGjGMdFh7LngTXy 0:0ab976607b5b1f1b384b6fe79521bfc2d11a868b2b2ed38e118cc5f1e3e63990
high_risk_sanctions 0x88c967e52185aef0263776a7efa1521c66a88547 TEs2fpP1TLoCwjAwxmwZz7sZVdwrWrKdRQ 0:bf24aaea2aa3bdd5d48c68ba1cbb7869a50fa2b39b7ed6e2c3c9aec437330461
limited_data 0x9c689365b5e78b2bab2d1b0f4e0734540fb719f1 TFFXvwH4owR9bDNg3g3MG8K1a9mX8PurXm 0:b5c1220a9967b961b34ff54e836ef02f0942c2b5597c559129b3e5fcfc83dfaa
review_partial 0x5629d9db95999852cb0c0b4e9afd057800800cfb TB7fLLjaJqubgudHK5d7mQ754sAds3qsB7 0:ecf8f65ba4afdd1da26b0774b59b688907accdaf5e2ae4ef47ad4a3014fc2c2b
provider_unavailable 0xf60ca8315084bc9b55a2f4026d8856f1170ef8db TAy5XDN27LLL2eoBbQcota2a3YD9iHc3MT 0:a765cd5463fe92dbf3e928978ec5c8e04003ae8589d5116fa5a17c1a0507b259

Каждая фикстура кошелька содержит environment: "sandbox" и details.evidence.source: "sandbox", объясняет себя теми же кодами причин, что и боевой движок, и расходует лимит песочницы ровно так же, как боевая проверка кошелька расходует квоту: когда получено состояние.

Примеры интеграции

Примеры повторов и ответов ниже относятся к каноническому методу контракта 0.3 POST /v1/transaction/check с явно указанной сетью. Короткий запрос /v1/check и его краткий ответ описаны в разделе проверки по одному хешу. Правила повторов и квоты общие для обоих методов.

Успешный HTTP-ответ требует отдельных проверок: verification_final с integrity_status — для сравнения платежа; risk_status, risk_final и recommended_action — для риска и действия. Pending никогда не означает MATCH; окончательный MATCH с недостаточным KYT требует MANUAL_REVIEW. Повтор риска использует risk_retryable и risk_retry_after_seconds, а не verification retryable. См. оси статусов.

Python: идемпотентный повтор

Этот серверный пример использует httpx. Ключ вымышленный. В рабочей интеграции загружайте API-ключ из хранилища секретов сервера, а operation_key и body сохраняйте в своём журнале операций до первой попытки. После перезапуска процесса используйте оба значения повторно.

Python
import random
import time
import httpx

api_key = "cz_live_000000000000.fictional_example_only"
operation_key = "merchant-order-1001-check-1"
body = {
    "network": "tron", "tx_hash": "a" * 64,
    "expected_recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
    "expected_token": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "expected_amount": "1250.000001",
}


def check():
    with httpx.Client(timeout=15, follow_redirects=False) as client:
        for attempt in range(4):
            try:
                response = client.post(
                    "https://api.chainzap.io/v1/transaction/check",
                    headers={
                        "X-API-Key": api_key,
                        "Idempotency-Key": operation_key,
                        "X-Request-ID": f"order-1001-attempt-{attempt + 1}",
                    },
                    json=body,
                )
            except httpx.TransportError:
                if attempt == 3:
                    raise RuntimeError("unresolved_transport_outcome") from None
                time.sleep(2 ** attempt + random.uniform(0, 1))
                continue
            print("X-Request-ID:", response.headers.get("X-Request-ID"))
            try:
                result = response.json()
            except ValueError:
                raise RuntimeError("unresolved_gateway_response") from None
            if response.is_success:
                return result
            error = result.get("error", {})
            if error.get("retryable") is not True:
                raise RuntimeError(error.get("code", "unresolved_response"))
            if response.headers.get("Idempotent-Replayed") == "true":
                raise RuntimeError("stored_error_requires_reconciliation")
            try:
                instructed = int(response.headers.get("Retry-After", "0"))
            except ValueError:
                raise RuntimeError("invalid_retry_after") from None
            delay = max(instructed, 2 ** attempt) + random.uniform(0, 1)
            if attempt == 3 or delay > 30:
                raise RuntimeError("schedule_retry_with_same_operation_key")
            time.sleep(delay)

Цикл обрабатывает ответы 409/429/503/504 с разрешённым повтором и неизвестный исход сетевой ошибки, не создавая новую логическую операцию. Обрабатывайте возвращённые бизнес-состояния по правилам своего платёжного процесса. Не записывайте в лог body или полный ответ.

JavaScript / TypeScript: запрос с сервера

Используйте этот код на сервере и никогда — в браузере с live-ключом. Сохраните ключ операции и тело до вызова функции, как в примере Python.

TypeScript
type PublicResult = {
  request_id?: string;
  error?: { code: string; message: string; retryable: boolean };
  [field: string]: unknown;
};

const apiKey = "cz_live_000000000000.fictional_example_only";
const operationKey = "merchant-order-1001-check-1";
const body = {
  network: "tron", tx_hash: "a".repeat(64),
  expected_recipient: "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  expected_token: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  expected_amount: "1250.000001",
};
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));

async function check(): Promise<PublicResult> {
  for (let attempt = 0; attempt < 4; attempt++) {
    let response: Response;
    try {
      response = await fetch("https://api.chainzap.io/v1/transaction/check", {
        method: "POST", redirect: "error", signal: AbortSignal.timeout(15000),
        headers: {
          "Content-Type": "application/json", "X-API-Key": apiKey,
          "Idempotency-Key": operationKey,
          "X-Request-ID": `order-1001-attempt-${attempt + 1}`,
        },
        body: JSON.stringify(body),
      });
    } catch {
      if (attempt === 3) throw new Error("unresolved_transport_outcome");
      await wait((2 ** attempt + Math.random()) * 1000);
      continue;
    }
    console.info("X-Request-ID:", response.headers.get("X-Request-ID"));
    const result = await response.json() as PublicResult;
    if (response.ok) return result;
    if (result.error?.retryable !== true) {
      throw new Error(result.error?.code ?? "unresolved_response");
    }
    if (response.headers.get("Idempotent-Replayed") === "true") {
      throw new Error("stored_error_requires_reconciliation");
    }
    const instructed = Number(response.headers.get("Retry-After") ?? "0");
    if (!Number.isFinite(instructed) || instructed < 0) {
      throw new Error("invalid_retry_after");
    }
    const delay = Math.max(instructed, 2 ** attempt) + Math.random();
    if (attempt === 3 || delay > 30) {
      throw new Error("schedule_retry_with_same_operation_key");
    }
    await wait(delay * 1000);
  }
  throw new Error("retry_budget_exhausted");
}

Сценарии ответов

Ниже приведены синтетические фикстуры, которые показывают допустимую структуру ответа, а не реальные проверки. У каждого примера заголовок X-Request-ID равен полю request_id. Проверяйте не только общую оценку, но и значения null и покрытие.

Транзакция подтверждена

Показать полный ответ JSON
JSON
{
  "request_id": "example-confirmed",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "confirmed",
  "confirmations": 27,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "decimals": 6,
  "amount": "1250.000001",
  "transfers": [
    {
      "index": 0,
      "asset_type": "trc20",
      "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
      "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "token_id": null,
      "token_symbol": "USDT",
      "decimals": 6,
      "amount": "1250.000001",
      "event_ref": "log:0",
      "execution_status": "success"
    }
  ],
  "transfers_truncated": false,
  "aml_risk_level": "low",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": false,
  "direct_sanctions_match": false,
  "indirect_sanctions_exposure": false,
  "risk_exposure": false,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": true,
  "token_match": true,
  "amount_match": true,
  "coverage": "complete",
  "workflow_coverage": "complete",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "checked_freshness_unknown",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": "2026-10-10T09:00:00Z",
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "CLEAR",
  "environment": "live",
  "reasons": [
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "TX_FINALIZED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "AML_LOW",
      "category": "risk",
      "severity": "info"
    },
    {
      "code": "NO_DIRECT_SANCTIONS_MATCH",
      "category": "sanctions",
      "severity": "info"
    },
    {
      "code": "TOKEN_OFFICIAL",
      "category": "token",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "CONFIRMED",
  "integrity_status": "MATCH",
  "risk_status": "NO_MATERIAL_SIGNAL",
  "coverage_status": "OK",
  "status_drivers": {
    "transaction": "TX_FINALIZED",
    "integrity": null,
    "risk": null,
    "coverage": null,
    "action": "CUSTOMER_STATE_UNKNOWN"
  },
  "result_final": true,
  "verification_final": true,
  "risk_final": true,
  "risk_retryable": false,
  "risk_retry_after_seconds": null,
  "retryable": false,
  "retry_after_seconds": null,
  "recommended_action": "CONFIRM_INTERNAL_STATE",
  "integrity": {
    "status": "MATCH",
    "selected_event_ref": "log:0",
    "relevant_event_count": 1,
    "comparisons": {
      "recipient": {
        "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "result": "MATCH"
      },
      "sender": {
        "expected": null,
        "actual": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
        "result": "NOT_EVALUATED"
      },
      "token": {
        "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "result": "MATCH"
      },
      "amount": {
        "expected": "1250.000001",
        "actual": "1250.000001",
        "result": "EXACT",
        "tolerance": null,
        "delta": "0",
        "delta_raw": "0"
      },
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "NO_MATERIAL_SIGNAL",
    "driver": null,
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_896f4ce46de5246c",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked_freshness_unknown",
      "freshness": {
        "age_seconds": 0,
        "stale": true,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_7d0537ae6c2054d5",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_2be872923c0687c9",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_df2204c780968cb5",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_81b44db3a9445d39",
      "kind": "token_authenticity",
      "source": "token_registry",
      "subject": {
        "type": "token",
        "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
      },
      "source_reference": "official",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Ожидание подтверждения

Показать полный ответ JSON
JSON
{
  "request_id": "example-pending",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "pending",
  "confirmations": 3,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "decimals": 6,
  "amount": "1250.000001",
  "transfers": [
    {
      "index": 0,
      "asset_type": "trc20",
      "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
      "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "token_id": null,
      "token_symbol": "USDT",
      "decimals": 6,
      "amount": "1250.000001",
      "event_ref": "log:0",
      "execution_status": "success"
    }
  ],
  "transfers_truncated": false,
  "aml_risk_level": "low",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": false,
  "direct_sanctions_match": false,
  "indirect_sanctions_exposure": false,
  "risk_exposure": false,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": null,
  "token_match": null,
  "amount_match": null,
  "coverage": "complete",
  "workflow_coverage": "complete",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "checked_freshness_unknown",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": "2026-10-10T09:00:00Z",
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "REVIEW",
  "environment": "live",
  "reasons": [
    {
      "code": "TX_PENDING_CONFIRMATIONS",
      "category": "transaction",
      "severity": "warning"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "AML_LOW",
      "category": "risk",
      "severity": "info"
    },
    {
      "code": "NO_DIRECT_SANCTIONS_MATCH",
      "category": "sanctions",
      "severity": "info"
    },
    {
      "code": "TOKEN_OFFICIAL",
      "category": "token",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "PENDING",
  "integrity_status": "NOT_EVALUATED",
  "risk_status": "NO_MATERIAL_SIGNAL",
  "coverage_status": "OK",
  "status_drivers": {
    "transaction": "TX_PENDING_CONFIRMATIONS",
    "integrity": "TX_PENDING_CONFIRMATIONS",
    "risk": null,
    "coverage": null,
    "action": "TX_PENDING_CONFIRMATIONS"
  },
  "result_final": false,
  "verification_final": false,
  "risk_final": false,
  "risk_retryable": true,
  "risk_retry_after_seconds": 48,
  "retryable": true,
  "retry_after_seconds": 48,
  "recommended_action": "RECHECK_LATER",
  "integrity": {
    "status": "NOT_EVALUATED",
    "selected_event_ref": "log:0",
    "relevant_event_count": 1,
    "comparisons": {
      "recipient": {
        "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "result": "NOT_EVALUATED"
      },
      "sender": {
        "expected": null,
        "actual": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
        "result": "NOT_EVALUATED"
      },
      "token": {
        "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "result": "NOT_EVALUATED"
      },
      "amount": {
        "expected": "1250.000001",
        "actual": "1250.000001",
        "result": "NOT_EVALUATED",
        "tolerance": null,
        "delta": null,
        "delta_raw": null
      },
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "NO_MATERIAL_SIGNAL",
    "driver": null,
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_896f4ce46de5246c",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked_freshness_unknown",
      "freshness": {
        "age_seconds": 0,
        "stale": true,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_7d0537ae6c2054d5",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_2be872923c0687c9",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_df2204c780968cb5",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_81b44db3a9445d39",
      "kind": "token_authenticity",
      "source": "token_registry",
      "subject": {
        "type": "token",
        "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
      },
      "source_reference": "official",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Транзакция завершилась ошибкой

Показать полный ответ JSON
JSON
{
  "request_id": "example-failed",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "failed",
  "confirmations": 27,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": null,
  "token_symbol": null,
  "decimals": null,
  "amount": null,
  "transfers": [],
  "transfers_truncated": false,
  "aml_risk_level": "unknown",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": null,
  "direct_sanctions_match": null,
  "indirect_sanctions_exposure": null,
  "risk_exposure": null,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": null,
  "token_match": null,
  "amount_match": null,
  "coverage": "complete",
  "workflow_coverage": "complete",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": null,
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "REVIEW",
  "environment": "live",
  "reasons": [
    {
      "code": "TX_REVERTED",
      "category": "transaction",
      "severity": "warning"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "FAILED",
  "integrity_status": "NOT_EVALUATED",
  "risk_status": "NOT_EVALUATED",
  "coverage_status": "SKIPPED",
  "status_drivers": {
    "transaction": "TX_REVERTED",
    "integrity": "TX_REVERTED",
    "risk": "TX_REVERTED",
    "coverage": null,
    "action": "TX_REVERTED"
  },
  "result_final": true,
  "verification_final": true,
  "risk_final": true,
  "risk_retryable": false,
  "risk_retry_after_seconds": null,
  "retryable": false,
  "retry_after_seconds": null,
  "recommended_action": "NOT_EXECUTED",
  "integrity": {
    "status": "NOT_EVALUATED",
    "selected_event_ref": null,
    "relevant_event_count": 0,
    "comparisons": {
      "recipient": null,
      "sender": null,
      "token": null,
      "amount": null,
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "NOT_EVALUATED",
    "driver": "TX_REVERTED",
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_73e84774c4ced93d",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_6b44582b97147dc6",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_06483bdcf9ba67c5",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_9ea21340c566a061",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Транзакция не найдена

Показать полный ответ JSON
JSON
{
  "request_id": "example-not-found",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "not_found",
  "confirmations": null,
  "required_confirmations": 19,
  "sender": null,
  "recipient": null,
  "token_contract": null,
  "token_symbol": null,
  "decimals": null,
  "amount": null,
  "transfers": [],
  "transfers_truncated": false,
  "aml_risk_level": "unknown",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": null,
  "direct_sanctions_match": null,
  "indirect_sanctions_exposure": null,
  "risk_exposure": null,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": null,
  "token_match": null,
  "amount_match": null,
  "coverage": "partial",
  "workflow_coverage": "partial",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "not_checked",
        "checked_at": null,
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": null,
    "risk_data_at": null,
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "LIMITED_DATA",
  "environment": "live",
  "reasons": [
    {
      "code": "TX_NOT_FOUND",
      "category": "transaction",
      "severity": "warning"
    },
    {
      "code": "EXPECTED_DATA_UNAVAILABLE",
      "category": "expected",
      "severity": "warning"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "NOT_FOUND",
  "integrity_status": "NOT_EVALUATED",
  "risk_status": "NOT_EVALUATED",
  "coverage_status": "SKIPPED",
  "status_drivers": {
    "transaction": "TX_NOT_FOUND",
    "integrity": "TX_NOT_FOUND",
    "risk": "TX_NOT_FOUND",
    "coverage": null,
    "action": "TX_NOT_FOUND"
  },
  "result_final": false,
  "verification_final": false,
  "risk_final": false,
  "risk_retryable": true,
  "risk_retry_after_seconds": 15,
  "retryable": true,
  "retry_after_seconds": 15,
  "recommended_action": "RECHECK_LATER",
  "integrity": {
    "status": "NOT_EVALUATED",
    "selected_event_ref": null,
    "relevant_event_count": 0,
    "comparisons": {
      "recipient": null,
      "sender": null,
      "token": null,
      "amount": null,
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "NOT_EVALUATED",
    "driver": "TX_NOT_FOUND",
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": null,
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": null,
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_73e84774c4ced93d",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_6b44582b97147dc6",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_06483bdcf9ba67c5",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_9ea21340c566a061",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_checked",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Неполные данные

Показать полный ответ JSON
JSON
{
  "request_id": "example-limited-data",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "confirmed",
  "confirmations": 27,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "decimals": 6,
  "amount": "1250.000001",
  "transfers": [
    {
      "index": 0,
      "asset_type": "trc20",
      "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
      "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "token_id": null,
      "token_symbol": "USDT",
      "decimals": 6,
      "amount": "1250.000001",
      "event_ref": "log:0",
      "execution_status": "success"
    }
  ],
  "transfers_truncated": false,
  "aml_risk_level": "unknown",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": false,
  "direct_sanctions_match": false,
  "indirect_sanctions_exposure": false,
  "risk_exposure": false,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": true,
  "token_match": true,
  "amount_match": true,
  "coverage": "partial",
  "workflow_coverage": "partial",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "unavailable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": "timeout"
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": null,
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "LIMITED_DATA",
  "environment": "live",
  "reasons": [
    {
      "code": "AML_UNAVAILABLE",
      "category": "risk",
      "severity": "warning"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "TX_FINALIZED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "NO_DIRECT_SANCTIONS_MATCH",
      "category": "sanctions",
      "severity": "info"
    },
    {
      "code": "TOKEN_OFFICIAL",
      "category": "token",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "CONFIRMED",
  "integrity_status": "MATCH",
  "risk_status": "INSUFFICIENT",
  "coverage_status": "UNAVAILABLE",
  "status_drivers": {
    "transaction": "TX_FINALIZED",
    "integrity": null,
    "risk": "AML_UNAVAILABLE",
    "coverage": "AML_UNAVAILABLE",
    "action": "AML_UNAVAILABLE"
  },
  "result_final": true,
  "verification_final": true,
  "risk_final": false,
  "risk_retryable": true,
  "risk_retry_after_seconds": 30,
  "retryable": false,
  "retry_after_seconds": null,
  "recommended_action": "MANUAL_REVIEW",
  "integrity": {
    "status": "MATCH",
    "selected_event_ref": "log:0",
    "relevant_event_count": 1,
    "comparisons": {
      "recipient": {
        "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "result": "MATCH"
      },
      "sender": {
        "expected": null,
        "actual": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
        "result": "NOT_EVALUATED"
      },
      "token": {
        "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "result": "MATCH"
      },
      "amount": {
        "expected": "1250.000001",
        "actual": "1250.000001",
        "result": "EXACT",
        "tolerance": null,
        "delta": "0",
        "delta_raw": "0"
      },
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "INSUFFICIENT",
    "driver": "AML_UNAVAILABLE",
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_73e84774c4ced93d",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "unavailable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_7d0537ae6c2054d5",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_2be872923c0687c9",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_df2204c780968cb5",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_81b44db3a9445d39",
      "kind": "token_authenticity",
      "source": "token_registry",
      "subject": {
        "type": "token",
        "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
      },
      "source_reference": "official",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [
      "AML_UNAVAILABLE"
    ],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Совпадение с санкционным списком

Показать полный ответ JSON
JSON
{
  "request_id": "example-sanctions-hit",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "confirmed",
  "confirmations": 27,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "decimals": 6,
  "amount": "1250.000001",
  "transfers": [
    {
      "index": 0,
      "asset_type": "trc20",
      "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
      "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "token_id": null,
      "token_symbol": "USDT",
      "decimals": 6,
      "amount": "1250.000001",
      "event_ref": "log:0",
      "execution_status": "success"
    }
  ],
  "transfers_truncated": false,
  "aml_risk_level": "low",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": true,
  "direct_sanctions_match": true,
  "indirect_sanctions_exposure": false,
  "risk_exposure": false,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": true,
  "token_match": true,
  "amount_match": true,
  "coverage": "complete",
  "workflow_coverage": "complete",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "checked_freshness_unknown",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": "2026-10-10T09:00:00Z",
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "HIGH_RISK",
  "environment": "live",
  "reasons": [
    {
      "code": "DIRECT_SANCTIONS_MATCH",
      "category": "sanctions",
      "severity": "critical"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "TX_FINALIZED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "AML_LOW",
      "category": "risk",
      "severity": "info"
    },
    {
      "code": "TOKEN_OFFICIAL",
      "category": "token",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "CONFIRMED",
  "integrity_status": "MATCH",
  "risk_status": "HIGH_RISK",
  "coverage_status": "OK",
  "status_drivers": {
    "transaction": "TX_FINALIZED",
    "integrity": null,
    "risk": "DIRECT_SANCTIONS_MATCH",
    "coverage": null,
    "action": "DIRECT_SANCTIONS_MATCH"
  },
  "result_final": true,
  "verification_final": true,
  "risk_final": true,
  "risk_retryable": false,
  "risk_retry_after_seconds": null,
  "retryable": false,
  "retry_after_seconds": null,
  "recommended_action": "HOLD_AND_ESCALATE",
  "integrity": {
    "status": "MATCH",
    "selected_event_ref": "log:0",
    "relevant_event_count": 1,
    "comparisons": {
      "recipient": {
        "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "result": "MATCH"
      },
      "sender": {
        "expected": null,
        "actual": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
        "result": "NOT_EVALUATED"
      },
      "token": {
        "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "result": "MATCH"
      },
      "amount": {
        "expected": "1250.000001",
        "actual": "1250.000001",
        "result": "EXACT",
        "tolerance": null,
        "delta": "0",
        "delta_raw": "0"
      },
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "HIGH_RISK",
    "driver": "DIRECT_SANCTIONS_MATCH",
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_896f4ce46de5246c",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked_freshness_unknown",
      "freshness": {
        "age_seconds": 0,
        "stale": true,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_7d0537ae6c2054d5",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_2be872923c0687c9",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_df2204c780968cb5",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_81b44db3a9445d39",
      "kind": "token_authenticity",
      "source": "token_registry",
      "subject": {
        "type": "token",
        "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
      },
      "source_reference": "official",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Данные платежа не совпали

Показать полный ответ JSON
JSON
{
  "request_id": "example-expected-mismatch",
  "tx_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "network": "tron",
  "transaction_type": "TriggerSmartContract",
  "transaction_category": "trc20_transfer",
  "transaction_state": "confirmed",
  "confirmations": 27,
  "required_confirmations": 19,
  "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
  "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "decimals": 6,
  "amount": "1250.000001",
  "transfers": [
    {
      "index": 0,
      "asset_type": "trc20",
      "sender": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
      "recipient": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
      "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "token_id": null,
      "token_symbol": "USDT",
      "decimals": 6,
      "amount": "1250.000001",
      "event_ref": "log:0",
      "execution_status": "success"
    }
  ],
  "transfers_truncated": false,
  "aml_risk_level": "low",
  "schema_version": "0.3",
  "policy_version": "b2b-tx-2026-10.4",
  "sanctions_hit": false,
  "direct_sanctions_match": false,
  "indirect_sanctions_exposure": false,
  "risk_exposure": false,
  "key_exposure": [],
  "token_authenticity": "official",
  "recipient_match": true,
  "token_match": true,
  "amount_match": false,
  "coverage": "complete",
  "workflow_coverage": "complete",
  "source_coverage": {
    "sanctions_sources": {
      "ofac": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": 172800,
        "scope": "configured_address_index",
        "error_code": null
      },
      "eu": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:49:24Z",
        "data_updated_at": "2026-09-22T18:01:34Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "uk": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-02T23:47:32Z",
        "data_updated_at": "2026-10-02T00:00:00Z",
        "stale_after_seconds": 3024000,
        "scope": "configured_address_index",
        "error_code": null
      },
      "un": {
        "status": "not_applicable",
        "checked_at": null,
        "retrieved_at": null,
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "configured_address_index",
        "error_code": null
      }
    },
    "transaction_sources": {
      "chain_explorer": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      },
      "chain_node": {
        "status": "checked",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_facts",
        "error_code": null
      }
    },
    "risk_sources": {
      "aml_provider": {
        "status": "checked_freshness_unknown",
        "checked_at": "2026-10-10T09:00:00Z",
        "retrieved_at": "2026-10-10T09:00:00Z",
        "data_updated_at": null,
        "stale_after_seconds": null,
        "scope": "transaction_risk_score",
        "error_code": null
      }
    },
    "universal_clearance": false
  },
  "freshness": {
    "checked_at": "2026-10-10T09:00:00Z",
    "transaction_at": "2026-10-10T09:00:00Z",
    "risk_data_at": "2026-10-10T09:00:00Z",
    "token_data_at": "2026-10-10T09:00:00Z",
    "max_source_age_seconds": 0
  },
  "overall_state": "REVIEW",
  "environment": "live",
  "reasons": [
    {
      "code": "EXPECTED_AMOUNT_MISMATCH",
      "category": "expected",
      "severity": "warning"
    },
    {
      "code": "TX_FACTS_VERIFIED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "TX_FINALIZED",
      "category": "transaction",
      "severity": "info"
    },
    {
      "code": "AML_LOW",
      "category": "risk",
      "severity": "info"
    },
    {
      "code": "NO_DIRECT_SANCTIONS_MATCH",
      "category": "sanctions",
      "severity": "info"
    }
  ],
  "decision_id": null,
  "direction": null,
  "workflow_type": null,
  "versions": {
    "decision": "b2b-tx-2026-10.4",
    "rules": {
      "exposure": "b2b-exp-v2",
      "sanctions_freshness": "sf-v1",
      "billing": "final_answers_only",
      "integrity": "int-v3",
      "reuse": "reuse-v1",
      "allocation": "alloc-v1"
    },
    "reason_codes": "rc-1",
    "evidence_schema": "ev-1",
    "contract": "0.3"
  },
  "transaction_status": "CONFIRMED",
  "integrity_status": "MISMATCH",
  "risk_status": "NO_MATERIAL_SIGNAL",
  "coverage_status": "OK",
  "status_drivers": {
    "transaction": "TX_FINALIZED",
    "integrity": "EXPECTED_AMOUNT_MISMATCH",
    "risk": null,
    "coverage": null,
    "action": "EXPECTED_AMOUNT_MISMATCH"
  },
  "result_final": true,
  "verification_final": true,
  "risk_final": true,
  "risk_retryable": false,
  "risk_retry_after_seconds": null,
  "retryable": false,
  "retry_after_seconds": null,
  "recommended_action": "MANUAL_REVIEW",
  "integrity": {
    "status": "MISMATCH",
    "selected_event_ref": "log:0",
    "relevant_event_count": 1,
    "comparisons": {
      "recipient": {
        "expected": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "actual": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
        "result": "MATCH"
      },
      "sender": {
        "expected": null,
        "actual": "TF17BgPaZYbz8oxbjhriubPDsA7ArKoLX3",
        "result": "NOT_EVALUATED"
      },
      "token": {
        "expected": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "actual": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
        "result": "MATCH"
      },
      "amount": {
        "expected": "1251.000001",
        "actual": "1250.000001",
        "result": "UNDERPAID",
        "tolerance": null,
        "delta": "-1",
        "delta_raw": "-1000000"
      },
      "network": {
        "expected": null,
        "actual": "tron",
        "result": "NOT_EVALUATED"
      }
    }
  },
  "risk": {
    "status": "NO_MATERIAL_SIGNAL",
    "driver": null,
    "driver_evidence_ids": []
  },
  "evidence_items": [
    {
      "evidence_id": "ev_431b2fd74ad43ef5",
      "kind": "transaction_facts",
      "source": "chain_explorer",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_63c8c4e421f6ff66",
      "kind": "transaction_facts",
      "source": "chain_node",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "block:80000000",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-10T09:00:00Z",
      "temporal_scope": "TRANSACTION_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_896f4ce46de5246c",
      "kind": "aml_risk",
      "source": "aml_provider",
      "subject": {
        "type": "transaction",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "transaction_risk_score",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked_freshness_unknown",
      "freshness": {
        "age_seconds": 0,
        "stale": true,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_7d0537ae6c2054d5",
      "kind": "sanctions_list",
      "source": "ofac",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 172800
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_2be872923c0687c9",
      "kind": "sanctions_list",
      "source": "eu",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-09-22T18:01:34Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_df2204c780968cb5",
      "kind": "sanctions_list",
      "source": "uk",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": "2026-10-02T00:00:00Z",
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": 3024000
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_76c33d7fb3a48fb7",
      "kind": "sanctions_list",
      "source": "un",
      "subject": {
        "type": "transaction_addresses",
        "ref": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      "source_reference": "configured_address_index",
      "observed_at": null,
      "effective_at": null,
      "temporal_scope": "LIST_PUBLICATION",
      "coverage": "not_applicable",
      "freshness": {
        "age_seconds": null,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "not_applicable",
      "disagreement": null,
      "evidence_version": "ev-1"
    },
    {
      "evidence_id": "ev_81b44db3a9445d39",
      "kind": "token_authenticity",
      "source": "token_registry",
      "subject": {
        "type": "token",
        "ref": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
      },
      "source_reference": "official",
      "observed_at": "2026-10-10T09:00:00Z",
      "effective_at": null,
      "temporal_scope": "CHECK_TIME",
      "coverage": "checked",
      "freshness": {
        "age_seconds": 0,
        "stale": false,
        "stale_after_seconds": null
      },
      "dependency": "required",
      "disagreement": null,
      "evidence_version": "ev-1"
    }
  ],
  "coverage_limitations": {
    "runtime": [],
    "product": [
      "AML_TRANSACTION_LEVEL_ONLY",
      "RISK_STATE_AS_OF_CHECK",
      "SANCTIONS_CONFIGURED_LISTS_ONLY"
    ]
  },
  "obligation": null,
  "reuse": null
}

Zero-Friction v0.1

POST /v1/check добавляет необязательный контекст сети и краткий ответ. Запрос с явной сетью никогда не переключается на другую. NETWORK_REQUIRED и NETWORK_AMBIGUOUS требуют исправленного тела и нового ключа идемпотентности; повтор сохраняет исходную сеть и результат. Короткие примеры cURL, Node.js, Python и PHP, нормализация адресов и матрица активов приведены в указанном разделе.

Проверка кошелька

POST /v1/wallet/check использует тот же цикл повторов с пределом ожидания 35 секунд на клиенте и телом с адресом кошелька; примеры cURL, Python и TypeScript приведены в этом разделе.

Статус транзакции

transaction_state описывает, что о транзакции сообщает блокчейн. Он не заменяет оценку риска и проверку покрытия.

transaction_state — поле контракта 0.2 в нижнем регистре; значение unknown в нём означает, что по фактам состояние установить нельзя. Контракт 0.3 отвечает на тот же вопрос в transaction_status (CONFIRMED, PENDING, FAILED, NOT_FOUND, INSUFFICIENT; INSUFFICIENT включает unknown, расхождение источников в самой транзакции (в возвращённом хеше, в том, существует ли она, в её блоке, статусе исполнения или окончательности) и отсутствие, подтверждённое не всеми источниками; расхождение только в её содержании (переводах, отправителе, получателе или типе транзакции) не меняет transaction_status и видно как coverage_status: DISAGREEMENT при verification_final: false) и учитывает порог окончательности: транзакция confirmed, ещё не достигшая порога окончательности, — это PENDING. Используйте transaction_status; см. оси статусов.

Значение Что означает Как обработать
confirmed Источники подтверждают транзакцию. Проверьте также число подтверждений, общую оценку и покрытие.
pending Транзакция видна, но окончательное подтверждение ещё не получено. Не считайте расчёт завершённым. Ответ не списывается. Запланируйте отдельное более позднее наблюдение с новым ключом идемпотентности, увеличивая паузу между попытками: в TRON окончательное подтверждение наступает примерно через минуту после отправки транзакции в сеть. Бесплатные ответы учитываются в суточном пределе несписываемых проверок (см. лимиты).
failed Выполнение завершилось ошибкой или было отменено. Не считайте ожидаемый перевод полученным.
not_found Транзакция не найдена в доступных данных. Проверьте сеть и хеш. Отсутствие записи не доказывает платёж.
unknown По имеющимся данным статус установить не удалось. Обработайте как неполные данные.

Подтверждения TRON

В TRON v1 требуется 19 подтверждений вместе с данными об окончательном подтверждении сети. Сравнивайте confirmations с required_confirmations. Один только статус транзакции не подтверждает покрытие риска. Разные ситуации показаны в примерах ответов.

Окончательное подтверждение Ethereum и TON

В Ethereum транзакция должна входить в канонический блок не выше finalized-головы по данным настроенных источников; головы latest или любого блока до finalized недостаточно. Для TON провайдеры должны подтвердить окончательное включение каждой транзакции в masterchain, а отдельно проверяется полнота цепочки сообщений. Значение 1 в required_confirmations у этих адаптеров не заменяет ни одно из этих правил. См. детали сетей.

Общая оценка

overall_state объединяет факты о транзакции, проверки риска, санкций и токена и сравнение с данными платежа в одно состояние.

Значение Как понимать
CLEAR Обязательные проверки завершены без выявленных проблем, требования к окончательному подтверждению выполнены. Это не гарантия отсутствия будущего риска.
REVIEW Результат требует внимания: например, подтверждений пока мало, транзакция не выполнена, риск повышен или данные платежа не совпали.
HIGH_RISK Найден высокий или критический риск: например, совпадение с санкционным списком, высокий AML-риск или поддельный токен.
LIMITED_DATA Данные неполные, не поддерживаются или противоречат друг другу. Нельзя обрабатывать как CLEAR.

Контракт 0.3 также отвечает на четыре лежащих в основе вопроса по отдельности, сообщает, окончателен ли ответ, и рекомендует действие: см. оси статусов и рекомендуемое действие. overall_state сохраняет правила ниже; находки реестра и клиентского контекста (эта транзакция уже оплатила другое обязательство, повторное исполнение, уже зачисленный депозит) могут повысить его только до REVIEW.

В контракте 0.3 решайте по осям, а не по этому состоянию. overall_state — сводка одним словом, сохранённая для интеграций 0.2, и нехватка данных в ней важнее несовпадения: платёж, который окончательно не совпал (verification_final: true, integrity_status: MISMATCH), всё равно читается как LIMITED_DATA, если проверку риска выполнить не удалось. Для платежа смотрите verification_final и integrity_status, а для действия — risk_status и recommended_action.

Как действовать по состоянию

Состояние — это результат проверки, а не платёжное указание: решение принимает ваша политика. В пилоте с дизайн-партнёрами согласовано такое соответствие:

Ответ Рекомендуемое действие
CLEAR, coverage: complete, каждое запрошенное *_match равно true Платёж можно зачислить по вашей собственной политике.
REVIEW Ручная проверка. TX_PENDING_CONFIRMATIONS: подождите и проверьте снова с новым ключом. EXPECTED_*_MISMATCH: это не тот платёж, который вы ожидали; эти коды никогда не появляются, пока transaction_status равен PENDING.
HIGH_RISK Удержите средства и передайте случай в комплаенс.
LIMITED_DATA Без автоматического зачисления. При verification_final: true и integrity_status: MISMATCH платёж окончательно не совпал: проверьте его вручную, повтор этого не изменит. В остальных случаях повторите позже с новым ключом; после ограниченного числа попыток проверьте вручную. Пока источники расходятся в самой транзакции, ответ не окончателен и всё же может содержать EXPECTED_*_MISMATCH (см. оси статусов).
429, 5xx, 409 idempotency_in_progress Повторите с тем же ключом идемпотентности после Retry-After.
404 transaction_not_found (/v1/check) Проверьте хеш; позже проверьте снова с новым ключом.
422 NETWORK_REQUIRED, 422 NETWORK_AMBIGUOUS Отправьте запрос заново с network и новым ключом.
Прочие 4xx Ошибка интеграции: исправьте запрос, не повторяйте.

Читайте оценку вместе с покрытием

Покрытие и оценка независимы. Известное санкционное совпадение, поддельный токен или высокий AML-риск дают HIGH_RISK, даже если факты неполны или противоречивы. Без такого вывода недостаток обязательных данных даёт LIMITED_DATA. В /v1/check те же состояния записаны в нижнем регистре в поле state, а все объекты причин находятся в details.reasons.

Оси статусов и рекомендуемое действие

Контракт 0.3 отвечает на четыре отдельных вопроса о транзакции, а не сводит их в одно состояние. У каждого ответа свой статус и код причины, который его определил. overall_state по-прежнему возвращается и вычисляется по правилам 0.2, поэтому интеграция, построенная на нём, продолжает работать.

Четыре оси

Поле Значения Вопрос
transaction_status CONFIRMED, PENDING, FAILED, NOT_FOUND, INSUFFICIENT Выполнена ли транзакция и окончательно ли это?
integrity_status MATCH, MISMATCH, AMBIGUOUS, NOT_EVALUATED, INSUFFICIENT Платит ли она то, что вы ожидали?
risk_status NO_MATERIAL_SIGNAL, REVIEW, HIGH_RISK, INSUFFICIENT, NOT_EVALUATED Есть ли у неё существенный сигнал риска или санкций?
coverage_status OK, DEGRADED, SKIPPED, UNAVAILABLE, DISAGREEMENT Ответили ли источники, нужные для этого ответа, и согласны ли они между собой?

status_drivers называет код причины, стоящий за каждой осью и за recommended_action (transaction, integrity, risk, coverage, action); null означает, что объяснять было нечего. Когда recommended_action равен MANUAL_REVIEW, status_drivers.action называет одну находку: TX_REVERTED у транзакции FAILED, в остальных случаях — самую серьёзную. При равной серьёзности сначала идёт то, что цепочка показывает о самой транзакции, затем проверки риска (AML, санкции, токен), затем сравнение платежа и остальные находки. Поэтому если окончательное расхождение платежа проверено, пока AML-источник был недоступен, в status_drivers.action обычно стоит AML_UNAVAILABLE, а не расхождение: сравнение платежа смотрите в status_drivers.integrity и reasons, а причину по каждой оси — в её собственном поле status_drivers.

Транзакция

  • CONFIRMED: транзакция выполнена и прошла порог окончательного подтверждения сети.
  • PENDING: транзакция в мемпуле или в блоке, но порог окончательного подтверждения ещё не пройден. Такой ответ никогда не окончательный.
  • FAILED: транзакция выполнена и завершилась ошибкой (revert). Если ни один перевод в ней не выполнен, ничего не оплачено; в TON trace с ошибкой всё же может содержать выполненную ветку, поэтому смотрите integrity_status и recommended_action.
  • NOT_FOUND: все источники подтверждают, что транзакции нет. Она ещё может появиться.
  • INSUFFICIENT: источникам не удалось установить факты, или они расходятся в том, существует ли транзакция, каков её статус или достигнуто ли окончательное подтверждение.

Соответствие платежа

  • MATCH: после окончательного подтверждения в блокчейне ровно один выполненный перевод платит ожидаемому получателю ожидаемый токен и сумму — в пределах amount_tolerance, если вы его передали. Части перевода внутри одной транзакции, которые в сумме дают нужную сумму, тоже считаются совпадением (SPLIT_WITHIN_TX).
  • MISMATCH: ни один выполненный перевод не подходит. integrity.comparisons показывает, какое поле отличается, а для суммы — UNDERPAID или OVERPAID с delta.
  • AMBIGUOUS: несколько выполненных переводов подходят одинаково хорошо; ничего не распределяется.
  • NOT_EVALUATED: транзакция pending, вы не передали ничего для сравнения, или транзакция завершилась ошибкой и ничего в ней не выполнено (откатившийся вызов токена обычно вообще не оставляет строк переводов).
  • INSUFFICIENT: вы передали ожидаемые значения, но данных о переводе для сравнения не хватает, источники расходятся в данных о переводах, для указанного обязательства нет записанной инструкции (INSTRUCTION_UNAVAILABLE), или транзакция завершилась ошибкой, хотя перевод в ней выполнился (трейс в TON), и одних данных блокчейна недостаточно, чтобы сказать, состоялась ли оплата.

Невыполненное движение средств никогда не даёт совпадения: перевод на правильный адрес в транзакции с revert получает NOT_EVALUATED, а его recipient_match, token_match и amount_match равны null.

Риск

HIGH_RISK важнее REVIEW, а REVIEW важнее INSUFFICIENT. NO_MATERIAL_SIGNAL означает, что применимые проверки выполнены и ничего существенного не нашли; это не допуск (clearance). NOT_EVALUATED означает, что оценка риска неприменима (транзакция завершилась ошибкой или отсутствует). Блок risk повторяет статус вместе с driver и driver_evidence_ids — элементами доказательств, на которых основан driver. Каждая строка exposure от провайдера в key_exposure содержит grade, присвоенный политикой exposure.

Покрытие

DISAGREEMENT важнее UNAVAILABLE (обязательная группа источников не ответила), UNAVAILABLE важнее DEGRADED (только один ончейн-источник, устаревший список, актив без поддержки AML), затем идут SKIPPED (источники риска не вызывались, потому что транзакция завершилась ошибкой или отсутствует) и OK.

Окончательность verification и риска

verification_final описывает окончательность фактов платежа и сравнения. result_final — его алиас; retryable — противоположное значение, а retry_after_seconds — рекомендуемая пауза перед новой проверкой verification. Окончательно подтверждённая транзакция с точным совпадением ожидаемых данных возвращает verification_final: true и integrity_status: MATCH, даже если KYT недоступен и risk_status: INSUFFICIENT.

risk_final равен true, когда от новой проверки уже не ждут, что она заполнит пробел в оценке риска: транзакция окончательна, источники согласны и ни у одной проверки AML, санкций или токена не было временного пробела (сбоя или устаревшего списка). Пока транзакция ожидает подтверждений или не найдена, risk_final равен false при любом risk_status, а risk_retry_after_seconds равен retry_after_seconds: риск оценивается заново, когда транзакция станет окончательной. risk_retryable — противоположное значение; risk_retry_after_seconds подсказывает паузу перед новой проверкой риска. Постоянное ограничение покрытия может быть окончательным при статусе INSUFFICIENT: окончательность не означает разрешение. KYT описывает риск на момент проверки; позднее он может измениться и после окончательной оценки.

Pending возвращает integrity_status: NOT_EVALUATED, verification_final: false, флаги сравнения null, NOT_EVALUATED для каждого запрошенного сравнения и ни одной причины EXPECTED_*_MISMATCH: отличающиеся условия сообщаются только после того, как транзакция стала окончательной. Когда источники расходятся в самой транзакции (transaction_status: INSUFFICIENT, coverage_status: DISAGREEMENT), ответ тоже не окончателен, но переводы, которые сообщают источники, в нём всё же сравниваются, и в нём может быть EXPECTED_*_MISMATCH: ориентируйтесь на verification_final: false и проверьте снова. Наблюдаемые переводы остаются доказательствами, а не окончательным совпадением платежа. Для новой verification рекомендуются 5–120 секунд при ожидании окончательного подтверждения, 15 секунд для отсутствующей транзакции и 30 секунд при временном пробеле ончейн-источников. Временный пробел KYT отдельно рекомендует повтор риска через 30 секунд. Если AML-источник сообщает error_code spend_cap (достигнут суточный предел расходов вашей организации на платные источники или расход сейчас нельзя учесть) или daily_cap (достигнут общий суточный потолок AML-источника), достигнутый предел обнуляется в 00:00 UTC, и новая проверка до этого времени обычно даёт тот же пробел; см. лимиты. У ненайденной транзакции risk_retryable равен true, хотя risk_status — NOT_EVALUATED: риск оценивается, когда транзакция появится.

Недоступный KYT не отменяет окончательную verification и никогда не разрешает PROCEED: MATCH с risk_status: INSUFFICIENT рекомендует MANUAL_REVIEW. Списываются только окончательные ответы с полным покрытием; окончательная verification с частичным покрытием KYT остаётся бесплатной. Для нового наблюдения используйте новый Idempotency-Key; прежний ключ возвращает сохранённый ответ по исходной политике.

Рекомендуемое действие

recommended_action — это то, что подтверждает ответ, а не указание. Решение принимает ваша политика, а то, что вы сделали, вы записываете в решение.

Значение Когда
HOLD_AND_ESCALATE risk_status: HIGH_RISK.
RECHECK_LATER Verification не окончательна: pending, отсутствующая транзакция, временный пробел ончейн-источников или их расхождение. Если проверка отправлена с direction: "OUTGOING" и транзакция не найдена, добавляется ATTEMPT_MAY_STILL_LAND.
NOT_EXECUTED Транзакция завершилась ошибкой, и ни один перевод в ней не выполнен. Транзакция с ошибкой, в которой какая-то ветка выполнилась, получает MANUAL_REVIEW и никогда не даёт разрешения действовать.
MANUAL_REVIEW Находка, требующая проверки: risk_status: INSUFFICIENT, риск REVIEW, MISMATCH, AMBIGUOUS, соответствие INSUFFICIENT, повторное использование другим обязательством, повторное исполнение или уже зачисленный депозит.
CONFIRM_INTERNAL_STATE В блокчейне всё в порядке, но ChainZap не видит вашу сторону: обязательство не указано, не известно, что платёж исходящий, сравнивать было нечего, или в customer_context не указано NOT_CREDITED. Прежде чем действовать, сверьтесь со своими записями.
PROCEED Чистое совпадение с записанным исходящим обязательством при чистом реестре или платёж, который вы объявили как NOT_CREDITED.

Входящий платёж никогда не получает PROCEED, если вы не передали customer_context.credit_status: "NOT_CREDITED"; CREDITED повышает ответ до REVIEW с ALREADY_CREDITED, а allocation_status: UNKNOWN оставляет его на CONFIRM_INTERNAL_STATE. Если в проверке нет direction, оно берётся из записанного направления обязательства, а затем из workflow_type: PAYOUT и REFUND — исходящие, DEPOSIT и INVOICE — входящие. Без customer_context.credit_status: "NOT_CREDITED" платёж, направление которого так и осталось неизвестным, никогда не получает PROCEED.

Доказательства и ограничения

evidence_items перечисляет, на чём основан ответ: ончейн-источники, AML-провайдер, каждый санкционный список и проверка токена. У каждого элемента есть evidence_id, kind, нейтральный source, subject, source_reference (например, блок), observed_at (когда ChainZap его прочитал), effective_at (время, к которому относится факт, например время блока или дата списка), coverage, freshness, dependency (required или not_applicable, если источник к этой транзакции неприменим), evidence_version и, если источники расходятся, disagreement.fields. AML-элементы содержат temporal_scope: "CHECK_TIME": провайдер сообщает состояние риска на момент проверки, а не на момент платежа.

coverage_limitations разделяет то, что ограничило этот ответ (runtime), и то, что продукт никогда не покрывает для этой сети или актива (product, например AML_TRANSACTION_LEVEL_ONLY или SANCTIONS_CONFIGURED_LISTS_ONLY). Ограничение продукта не делает ответ повторяемым.

Версии

versions называет всё, что сформировало ответ: decision (равно policy_version), rules (правила exposure, актуальности санкционных списков, списания, соответствия, повторного использования и распределения), reason_codes, evidence_schema и contract. Сохраняйте его вместе с решением, если позже понадобится объяснить ответ.

Полнота данных

Полное и частичное покрытие

coverage: complete означает, что обязательные проверки для этого ответа получили нужные данные. Это не означает, что транзакция свободна от риска: полная проверка может вернуть HIGH_RISK. coverage: partial означает, что один или несколько обязательных источников, соответствий активов, проверок токена или фактов о транзакции отсутствуют, не поддерживаются или противоречат друг другу.

workflow_coverage показывает завершённость этой проверки; coverage — совместимый алиас. complete никогда не означает универсальное compliance clearance. source_coverage.sanctions_sources отдельно показывает OFAC/EU/UK/UN: checked, checked_stale, checked_freshness_unknown, not_checked, not_applicable или unavailable. В source_coverage.risk_sources статус checked_freshness_unknown — обычный для выполненной AML-проверки: AML-источник не датирует свои данные, поэтому и её элемент доказательств показывает freshness.stale: true. Неполной проверку это не делает.

Актуальность санкционных списков

Каждый санкционный список оценивается по собственному окну актуальности (политика sf-v1, часть policy_version). Это внутренние правила, а не гарантии провайдера:

Список Актуален в течение Основание
OFAC 48 часов Последняя успешная синхронизация с зеркалом списка SDN. Её время передаётся в retrieved_at; дата публикации SDN недоступна, поэтому data_updated_at равно null.
EU, UK 35 дней Последняя пересборка из официальной публикации, выполняется ежемесячно. data_updated_at — дата публикации, retrieved_at — время пересборки.
UN not_applicable Список Совета Безопасности ООН не публикует криптоадреса.

Список, который устарел, актуальность которого невозможно установить или который недоступен, не может подтвердить чистый результат: проверка возвращает SANCTIONS_DATA_STALE или SANCTIONS_UNAVAILABLE, coverage: partial и LIMITED_DATA и не списывается. Известная находка с высоким риском по-прежнему имеет приоритет. stale_after_seconds у каждого источника указывает его окно.

direct_sanctions_match означает точное совпадение адреса с настроенными индексами. false означает отсутствие совпадения именно в этих индексах с учётом их охвата и актуальности. indirect_sanctions_exposure означает, что провайдер риска транзакции сообщил о sanctions exposure любого размера, включая контакт с контрагентом, который провайдер называет «direct»; это не доказывает включение участника транзакции в список. risk_exposure показывает другие категории exposure любого размера или hacking event. Устаревший sanctions_hit — алиас только direct_sanctions_match. При недоступности AML-источника exposure-флаги равны null; выполненное локальное сравнение при этом может вернуть false.

Как exposure влияет на состояние

Два exposure-флага говорят о том, что провайдер что-то сообщил; изменит ли это состояние, зависит от того, насколько близок и велик exposure (политика b2b-exp-v2). Сообщённые строки остаются в key_exposure (до 50, после совпадения с локальным списком, если оно есть), начиная с самой значимой, с числом шагов, долей и grade, который политика присвоила каждой из них (high, review, minor). percent равен null, если доля неизвестна или её источник не разрешает её показывать.

Строка провайдера Шаги и доля Влияние
Санкционный субъект не дальше 1 шага и не меньше 5% HIGH_RISK, INDIRECT_SANCTIONS_EXPOSURE
Санкционный субъект не дальше 1 шага и меньше 5%; либо не меньше 1% на любом расстоянии; либо доля неизвестна REVIEW, SANCTIONS_EXPOSURE_REVIEW
Санкционный субъект 2 шага и дальше и меньше 1% без изменений, SANCTIONS_EXPOSURE_MINOR
Другая категория до 2 шагов при доле не меньше 1% или неизвестной доле; любой hacking event REVIEW, RISK_EXPOSURE
Другая категория дальше или меньше без изменений, RISK_EXPOSURE_MINOR
Нераспознанная или пустая категория как для других категорий REVIEW, UNRECOGNIZED_PROVIDER_LABEL; либо без изменений, UNRECOGNIZED_PROVIDER_LABEL_MINOR

Категория, которую ChainZap не распознаёт, никогда не игнорируется: она оценивается как любая другая категория риска и называется в ответе, поэтому близкая или крупная незнакомая находка ведёт к проверке, а далёкая и небольшая всё равно указывается в ответе (UNRECOGNIZED_PROVIDER_LABEL_MINOR). Распознаваемые категории: sanctioned_entity, illicit_activity, mixer, risk_exchange, gambling и bridge.

Пороги откалиброваны на выборке обычных переводов USDT в TRON: по прежнему правилу, которое повышало любой косвенный санкционный след, большинство из них получали HIGH_RISK; по текущему risk_status: HIGH_RISK основывается на точном совпадении со списком, существенной доле на расстоянии одного шага или высоком уровне AML-риска, а risk.driver называет, на чём именно. Точное локальное совпадение участника транзакции с санкционным списком всегда даёт HIGH_RISK. Если этого требует ваша compliance-политика, применяйте к key_exposure собственное, более строгое правило.

Каждый источник содержит checked_at (текущая проверка), retrieved_at (получение ответа или удалённого индекса) и data_updated_at (известная дата исходного списка). Свежая загрузка не доказывает свежесть публикации. AML-источник не сообщает дату исходных данных; она остаётся null. Старое поле freshness.max_source_age_seconds отражает возраст полученных ответов, а не санкционных списков. source_coverage.universal_clearance всегда равно false.

  • Риск неизвестен: aml_risk_level="unknown".
  • Токен не проверен: token_authenticity="unknown"; символ токена не доказывает его подлинность.

LIMITED_DATA — обычный бизнес-ответ с HTTP 200, а не обязательно ошибка соединения.

Актуальность

Читайте freshness.checked_at, время данных отдельных источников и max_source_age_seconds. Если время источника равно null, оно неизвестно. Повторная выдача по тому же ключу идемпотентности возвращает исходный результат и исходный идентификатор запроса; это не новое наблюдение. Новое наблюдение — это новая логическая операция, которую вы создаёте после обработки предыдущего ответа.

Списание

Списываются только полные и окончательные проверки: CLEAR, REVIEW и HIGH_RISK с coverage: complete по транзакции, подтверждённой по правилам окончательного подтверждения или окончательно завершившейся ошибкой, расходуют по одной проверке. Ответы о транзакции, ожидающей подтверждения или не найденной, частичное покрытие (LIMITED_DATA), ошибки передачи, таймауты и повторная выдача сохранённого ответа проверку не расходуют; их резерв освобождается. Для страницы «Тестовый запрос» действуют то же правило и та же квота организации. Sandbox-ключи никогда не расходуют платные проверки. Подробности — в разделе планы и оплата.

Границы сетей и активов

См. матрицу активов Ethereum/TON и правила окончательного подтверждения. Полное покрытие ограничено поддерживаемым типом перевода и выбранным активом; оно не включает внутренние ETH-переводы без трассировки и итоговое изменение баланса токена. Неизвестные decimals никогда не подменяются значением по умолчанию.

Если назначение перевода стоимости в контракте TON установить не удалось, ответ содержит TON_CONTRACT_VALUE_NOT_CLASSIFIED и частичное покрытие, даже когда другой перевод в той же цепочке сообщений распознан. Такой результат не может быть CLEAR; известный высокий риск по-прежнему имеет приоритет как HIGH_RISK. В кратком ответе проверяйте details.limitations, details.finalized и details.trace_complete.

Зачисление jetton в TON может быть подтверждено, даже если кошельку получателя не хватило газа для обработки уведомления. Это отдельно отмечается кодом TON_NOTIFICATION_NOT_EXECUTED: сам перевод токена и владелец кошелька по-прежнему проверяются по двум источникам. Ошибка или возврат самого перевода этим исключением не покрываются.

source_coverage.transaction_sources отдельно показывает каждый настроенный ончейн-источник фактов под стабильным нейтральным именем: chain_explorer и chain_node для TRON и TON, chain_node и chain_node_secondary для Ethereum. source_coverage.risk_sources.aml_provider — это AML-оценка. Cache сохраняет исходное время получения этих данных. Успешный ответ с неизвестным AML risk level означает partial для aml_provider (risk_level_unknown). Отсутствие локального sanctions coverage не превращает успешную AML-оценку в AML_UNAVAILABLE: workflow остаётся частичным с SANCTIONS_UNAVAILABLE. Доступность сети зависит от конфигурации deployment и доступа организации.

Проверки кошельков

Проверка кошелька сообщает собственное слово о покрытии в details.data_coverage: FULL, когда каждый применимый модуль проверен полностью, PARTIAL, когда хотя бы один проверен частично, INSUFFICIENT, когда модуль-ворота (sanctions_aml или address_security) не проверялся вовсе или движок не смог сделать вывод. Верхнеуровневое coverage равно complete только при FULL. У каждой строки модуля есть собственное source_coverage, а details.source_coverage перечисляет все источники с тем же словарём статусов, что и выше. В отличие от проверки транзакции, проверка кошелька списывается всякий раз, когда получено состояние, в том числе при частичном покрытии; бесплатно только limited_data. См. проверку кошелька.

Статус покрытия и элементы доказательств

Контракт 0.3 добавляет coverage_status (OK, DEGRADED, SKIPPED, UNAVAILABLE, DISAGREEMENT), причину, стоящую за ним, в status_drivers.coverage, по одному элементу evidence_items на каждый источник, на котором основан ответ, и coverage_limitations, разделённые на то, что ограничило эту проверку, и то, что продукт никогда не покрывает. См. оси статусов. coverage и workflow_coverage сохраняют свой смысл.

Коды причин

Каждая причина содержит code, category и severity (info, warning, high, critical). /v1/transaction/check возвращает от 2 до 5 наиболее важных причин; краткий список всегда сохраняет причину, которая определила состояние, каждую причину EXPECTED_*, каждую причину сравнения платежа и клиентского контекста и каждую причину реестра обязательств выше уровня info, а остальные места заполняет по серьёзности. Полный каталог версионируется (versions.reason_codes); status_drivers называет причину, стоящую за каждой осью статусов. /v1/check возвращает полный список в details.reasons, а соответствующие строки — в reason_codes. Допускайте появление новых кодов. Никогда не считайте неизвестный код чистым результатом и не делайте вывод из отсутствия причины, что соответствующая проверка выполнялась.

Код Значение
TX_FACTS_VERIFIED Источники данных о транзакции ответили и согласны между собой, в том числе когда они согласны, что транзакции нет. Код описывает факты, а не найденный или совпавший платёж.
TX_FACTS_PARTIAL Часть необходимых данных транзакции отсутствует.
TX_FACTS_DISAGREE Источники противоречат друг другу.
TX_FINALIZED Требования к окончательному подтверждению выполнены.
TX_PENDING_CONFIRMATIONS Подтверждений пока недостаточно.
TX_REVERTED Транзакция завершилась ошибкой.
TX_NOT_FOUND Транзакция не найдена.
TRANSFERS_TRUNCATED Список переводов сокращён.
AMBIGUOUS_TRANSFER Указанному получателю и токену соответствуют несколько переводов, и ни один из них, либо больше одного, нельзя выбрать как оплату.
AML_UNSUPPORTED_ASSET Для актива не поддерживается нужная AML-проверка.
AML_UNAVAILABLE Нужные данные для оценки AML-риска недоступны.
AML_LOW По доступной оценке AML-риск низкий.
AML_ELEVATED По доступной оценке AML-риск повышен.
AML_HIGH По доступной оценке AML-риск высокий или критический.
DIRECT_SANCTIONS_MATCH Точное совпадение адреса с настроенными санкционными индексами.
NO_DIRECT_SANCTIONS_MATCH В проверенных индексах нет точного совпадения; учитывайте охват и актуальность источников.
INDIRECT_SANCTIONS_EXPOSURE Существенный sanctions exposure по данным провайдера (не дальше 1 шага, доля не меньше 5%); не прямое совпадение со списком. Даёт HIGH_RISK.
SANCTIONS_EXPOSURE_REVIEW Sanctions exposure по данным провайдера, требующий проверки (не дальше 1 шага и меньше 5%; либо не меньше 1% на любом расстоянии; либо доля неизвестна). Даёт REVIEW.
SANCTIONS_EXPOSURE_MINOR Далёкий и небольшой sanctions exposure по данным провайдера; указывается в ответе, но не меняет состояние.
RISK_EXPOSURE Значимый прочий risk exposure по данным провайдера (до 2 шагов и не меньше 1% либо доля неизвестна) или hacking event. Даёт REVIEW.
RISK_EXPOSURE_MINOR Далёкий или небольшой прочий risk exposure; указывается в ответе, но не меняет состояние.
SANCTIONS_UNAVAILABLE Санкционная проверка недоступна. Это не отсутствие совпадений.
SANCTIONS_DATA_STALE Санкционный список вышел за своё окно актуальности, или его актуальность невозможно установить; покрытие частичное.
TOKEN_AUTH_UNAVAILABLE Данные для проверки подлинности токена недоступны.
TOKEN_OFFICIAL Контракт распознан как официальный.
TOKEN_FAKE Токен определён как поддельный.
TOKEN_UNKNOWN Подлинность токена не установлена.
EXPECTED_RECIPIENT_MISMATCH Получатель выбранного перевода не совпал с указанным.
EXPECTED_TOKEN_MISMATCH Контракт выбранного токена не совпал с указанным.
EXPECTED_AMOUNT_MISMATCH Сумма выбранного перевода не совпала с указанной.
EXPECTED_DATA_UNAVAILABLE Для запрошенного сравнения не хватает данных о переводе. Соответствующее поле сравнения содержит null.
EXPECTED_SENDER_MISMATCH Выбранный перевод отправлен не с expected_sender.
EXPECTED_NETWORK_MISMATCH Записанная инструкция указывает другую сеть, чем проверенная.
AMOUNT_WITHIN_TOLERANCE Сумма отличается от ожидаемой не больше чем на amount_tolerance; это совпадение.
ADDITIONAL_RELEVANT_TRANSFERS Помимо совпавшего перевода транзакция ещё раз платит ожидаемому получателю ожидаемый токен; возможна двойная оплата. Даёт REVIEW.
SPLIT_WITHIN_TX Несколько переводов в транзакции ожидаемому получателю в сумме дают ожидаемую сумму. Даёт REVIEW.
ATTEMPT_MAY_STILL_LAND Проверка с direction: "OUTGOING" пока не нашла транзакцию; стоящая за ним попытка ещё может попасть в блокчейн. Не оплачивайте его повторно, пока результат не станет окончательным.
UNRECOGNIZED_PROVIDER_LABEL AML-провайдер сообщил о категории, которую ChainZap не распознаёт, достаточно близкой и крупной, чтобы её проверить. Даёт REVIEW.
UNRECOGNIZED_PROVIDER_LABEL_MINOR Нераспознанная категория провайдера, далёкая или небольшая; указывается в ответе, но не меняет состояние.

Реестр обязательств и клиентский контекст

Эти причины появляются, когда проверка указывает обязательство или содержит customer_context. Они никогда не меняют coverage и то, что списывается.

Код Значение
INSTRUCTION_UNAVAILABLE Для указанного обязательства нет записанной инструкции запрошенной версии; ничего не сравнивалось. integrity_status: INSUFFICIENT, даёт REVIEW.
INSTRUCTION_HISTORY_INCOMPLETE Первая записанная для обязательства инструкция не имеет версии 1; более ранние версии неизвестны.
INSTRUCTION_NOT_EFFECTIVE Платёж находится в блоке раньше instruction_effective_at инструкции. Даёт REVIEW.
INSTRUCTION_CONFLICT Другой запрос изменил инструкцию обязательства, пока проверялся этот. Даёт REVIEW.
TX_REUSED_ACROSS_OBLIGATIONS Платёжное событие уже погашает другое обязательство. Даёт REVIEW; ничего не распределяется.
DUPLICATE_EXECUTION Две или более транзакции вместе заплатили по обязательству больше, чем причиталось. Даёт REVIEW.
EVENT_CONTENT_CHANGED Ранее записанное платёжное событие теперь приходит с другим содержимым; запись не перезаписывается. Даёт REVIEW.
ALREADY_CREDITED Вы указали, что платёж уже зачислен или применён в вашем учёте, хотя бы частично (customer_context). Даёт REVIEW.
CUSTOMER_STATE_UNKNOWN Указывается в status_drivers.action, когда ChainZap не может определить, безопасно ли для вашего учёта действовать по чистому ответу: CONFIRM_INTERNAL_STATE.

Ограничения продукта

Перечисляются в coverage_limitations.product, никогда в reasons: что продукт не покрывает для этой сети или актива, независимо от проверки. Они не делают ответ повторяемым.

Код Значение
AML_TRANSACTION_LEVEL_ONLY AML-проверка охватывает адреса транзакции так, как их видит провайдер, а не полную историю каждого контрагента.
RISK_STATE_AS_OF_CHECK Данные о риске отражают состояние у провайдера на момент проверки, а не на момент платежа.
SANCTIONS_CONFIGURED_LISTS_ONLY Санкционное сравнение охватывает только настроенные списки (OFAC, EU, UK).
MEMO_NOT_EVALUATED Memo или комментарий к переводу, например комментарий в TON, не сравнивается.

Ethereum / TON / Zero-Friction

/v1/check возвращает все объекты причин в details.reasons, а строковые коды — в reason_codes. Канонический /v1/transaction/check сохраняет ограниченный список.

Код Значение
ETH_REORG_DETECTED Канонический блок Ethereum не совпадает с включением транзакции.
ETH_NATIVE_INTERNAL_TRANSFERS_UNAVAILABLE Внутренние нативные ETH-переводы не покрываются receipt-логами.
TOKEN_MINT_OR_BURN Mint или burn не является обычным депозитом.
TOKEN_BALANCE_EFFECT_NOT_VERIFIED Логи не доказывают итоговое изменение баланса токена.
ZERO_VALUE_TRANSFER Сумма перевода равна нулю.
TON_BOUNCED Сообщение вернулось с bounce.
TON_TRACE_INCOMPLETE Не хватает потомков сообщений или доказательств полного trace.
TON_EXECUTION_FAILED Транзакция в цепочке перевода завершилась ошибкой.
TON_FINALITY_UNVERIFIED Финальность в masterchain не подтверждена.
TON_CONTRACT_VALUE_NOT_CLASSIFIED TON в сообщении контракта не удалось распознать как обычный перевод. Покрытие остаётся неполным, даже если другой перевод подтверждён.
JETTON_IDENTITY_UNVERIFIED Связь jetton wallet/master/owner не подтверждена.
JETTON_WALLET_MISMATCH Jetton wallet, master или owner противоречит сообщению перевода.
NO_SUPPORTED_TRANSFER Поддерживаемый завершённый перевод не установлен.
MULTI_ASSET_AML_PARTIAL Есть несколько активов; AML проверен по одному активу.
TON_TRACE_LIMIT_EXCEEDED Превышен предел размера или глубины trace; данные переводов неполны.
TON_NOTIFICATION_NOT_EXECUTED Уведомление о переводе jetton дошло до получателя, который его не выполнил; сам перевод завершён.

Коды причин для кошельков

POST /v1/wallet/check возвращает до десяти причин в details.reasons, упорядоченных по серьёзности, и их коды в reason_codes. Находка указывается только тогда, когда правило значимости самого движка признаёт её значимой, поэтому каждая причина здесь соответствует тому, что показал бы отчёт. Серьёзность в таблице указана по умолчанию; подтверждённый критичный флаг провайдера или красная метка обозревателя её повышают.

Код Категория / серьёзность Значение
DIRECT_SANCTIONS_MATCH sanctions / critical Точное совпадение адреса в настроенных санкционных индексах либо прямое включение в список по данным AML-провайдера.
INDIRECT_SANCTIONS_EXPOSURE sanctions / high Связь с санкционными средствами по данным AML-провайдера; не прямое включение в список.
SANCTIONS_EXPOSURE_MINOR sanctions / warning Небольшая доля связи с санкционными средствами по данным AML-провайдера. Проверка транзакции выдаёт тот же код с уровнем info.
SANCTIONS_UNAVAILABLE sanctions / warning Ни один санкционный индекс не проверялся; это не чистый результат.
NO_DIRECT_SANCTIONS_MATCH sanctions / info Точных совпадений в проверенных индексах нет; смотрите покрытие источников и актуальность.
AML_HIGH risk / high AML-провайдер сообщает о высоком или очень высоком риске.
AML_ELEVATED risk / warning AML-провайдер сообщает об умеренном риске.
AML_LOW risk / info AML-провайдер сообщает о низком риске.
AML_EXPOSURE_UNAVAILABLE risk / warning AML-провайдер вызывался, но не ответил; связь с рисковыми средствами неизвестна.
AML_EXPOSURE_SKIPPED risk / info AML-провайдер не вызывался: результат уже определяет локальное совпадение с санкционным списком или списком недобросовестных адресов.
HACKING_EVENT_LINK risk / high AML-провайдер связывает адрес с известным инцидентом взлома.
DENYLIST_MATCH address / critical Адрес есть в публичном списке мошеннических, фишинговых или дрейнер-адресов.
ISSUER_BLOCKED address / critical Эмитент стейблкоина заморозил адрес.
PROVIDER_SECURITY_FLAG address / high Провайдер безопасности пометил адрес; серьёзность зависит от подтверждённых флагов.
EXPLORER_RISK_TAG address / high Обозреватель блоков или метка аккаунта помечает адрес как рискованный.
SCAM_EVENT_ACTIVITY address / high Наблюдались переводы с адресами, помеченными за мошенническую активность.
ADDRESS_SECURITY_UNAVAILABLE address / warning Источники безопасности адреса проверены не полностью.
NO_ADDRESS_SECURITY_FLAGS address / info Проверенные источники безопасности адреса ничего не сообщают.
TOKEN_IMPERSONATION token / high Удерживаемый или созданный токен имитирует официальный актив.
TOKEN_HOLDINGS_UNVERIFIED token / warning Не все удерживаемые токены удалось проверить на подлинность.
TOKEN_HOLDINGS_VERIFIED token / info Удерживаемые токены проверены, имитаций официальных активов нет.
RISKY_COUNTERPARTY_DIRECT counterparties / high Прямой контрагент известен как рискованный сервис или адрес.
RISKY_COUNTERPARTY_INDIRECT counterparties / warning Рискованный сервис или адрес находится на один шаг дальше.
COUNTERPARTY_SCREENING_PARTIAL counterparties / warning Не всех контрагентов удалось атрибутировать; покрытие частичное.
NO_COUNTERPARTY_FLAGS counterparties / info Проверенные контрагенты не вызвали замечаний.
NEW_WALLET behaviour / warning Кошелёк совсем новый.
BEHAVIOUR_PATTERN_FLAGGED behaviour / warning Наблюдалась схема транзакций, на которую стоит обратить внимание: например, всплески, быстрый оборот или поведение ретранслятора.
LOW_ACTIVITY behaviour / info Очень мало транзакций; поведенческие сигналы малозначимы.
CONTRACT_ADDRESS behaviour / info Адрес является контрактом, а не кошельком.
NO_BEHAVIOUR_FLAGS behaviour / info Заметных поведенческих схем не обнаружено.
WALLET_DATA_LIMITED coverage / warning Данных недостаточно для вывода; состояние limited_data.
SOURCE_UNAVAILABLE coverage / warning Необходимый источник не ответил.
NETWORK_ASSUMED_ETH coverage / warning Адрес 0x проверен только в Ethereum; он может существовать и в других EVM-сетях.

Решения, действия и исходы

Каждая проверка транзакции — это решение со своим decision_id. Что рекомендовал ChainZap, что сделали вы, как вы закрыли случай и чем он закончился — отдельные записи: рекомендация не является действием, а удержанный платёж не является предотвращённым убытком, пока вы не подтвердите, что это так.

Прочитать решение

GET /v1/decisions/{decision_id} возвращает решение в том виде, в каком оно было принято: четыре оси статусов, overall_state, recommended_action, reuse_status, выбранное платёжное событие, reason_codes, versions и evidence_items, на которых оно основано, а также каждое событие, записанное по нему с тех пор. Повторная проверка той же транзакции — это новое решение; она никогда не переписывает предыдущее, поэтому ответ, по которому вы действовали, всегда можно объяснить доказательствами, которые были у него на тот момент. Элементы доказательств хранятся столько, сколько позволяют условия провайдеров, и не дольше срока хранения исходных значений.

Идемпотентный повтор исходного запроса тоже возвращает исходный ответ, байт в байт.

Записать, что было дальше

Метод Тело Значение
POST /v1/decisions/{decision_id}/actions action, необязательно action_at Что вы сделали: CREDITED, PAID, HELD, REJECTED, REFUNDED, ESCALATED, RETRIED, NO_ACTION, OTHER.
POST /v1/decisions/{decision_id}/resolution resolution, необязательно resolved_at Как случай был закрыт: ACCEPTED, ACCEPTED_AFTER_REVIEW, REJECTED, REFUNDED, CORRECTED, WRITTEN_OFF, OTHER.
POST /v1/decisions/{decision_id}/outcome outcome_status, loss_prevented, необязательно outcome_at Чем всё закончилось: CONFIRMED, DISPUTED, UNRESOLVED или UNKNOWN, и был ли предотвращён убыток: CONFIRMED, NOT_CONFIRMED или UNKNOWN (по умолчанию).

Каждый вызов добавляет событие (повторная отправка того же самого события игнорируется); ничего не перезаписывается, и несколько действий по одному решению — это нормально (HELD, затем ESCALATED, затем REFUNDED). Любое событие может содержать owner — непрозрачный идентификатор человека или системы, совершивших действие: до 64 символов из A-Z a-z 0-9 . _ : -. Никогда не передавайте имя или адрес электронной почты; всё остальное отклоняется с 422 invalid_owner.

Exposure — это не предотвращённый убыток

Ответ HIGH_RISK означает, что был существенный сигнал риска. Он не означает, что убытка удалось избежать, и ChainZap никогда не считает его таковым. Предотвращённый убыток — только исход, который вы записали с loss_prevented: "CONFIRMED". Стройте отчётность на исходах, а не на рекомендациях.

verification_final и risk_final сохраняют отдельные оси окончательности на момент решения. У исторических решений до политики b2b-tx-2026-10.3 они равны null; читайте такие решения по исходной политике versions.decision.

Идемпотентность

Idempotency-Key связывает каждую попытку отправки запроса с одной логической проверкой. Это ключ операции, а не API-ключ.

Сохраняйте ключ для каждой логической операции

Idempotency-Key принимает от 1 до 128 печатных ASCII-символов. Ключ действует в пределах вашей организации и нормализованного тела запроса. Сохраните ключ и тело до первой попытки и передавайте оба при каждом повторе, в том числе с другого сервера или после замены API-ключа. Никогда не включайте в ключ секреты или персональные данные.

Ситуация Ответ API
Операция завершена Исходный ответ байт в байт с Idempotent-Replayed: true и прежним X-Request-ID.
Операция ещё выполняется 409 idempotency_in_progress с Retry-After; повтор разрешён.
Ключ тот же, тело другое 409 idempotency_conflict; повтор не разрешён. Исправьте связь ключа с операцией.

Срок хранения и ошибки

По умолчанию результат хранится 24 часа; изменение срока по договору подтверждайте с поддержкой. После окончания срока тот же ключ может запустить новую списываемую проверку. Ограничивайте автоматические повторы сроком хранения и ведите собственный журнал платёжных операций.

Что сохраняется и выдаётся повторно: каждый ответ 200, в том числе по транзакции, ожидающей подтверждения, или с LIMITED_DATA, а также ответы 404 и 422, полученные после того, как проверка была принята, например transaction_not_found, invalid_expected_amount, NETWORK_REQUIRED, NETWORK_AMBIGUOUS и ошибка адреса, который не прошёл проверку для сети, найденной при определении сети. retryable=true описывает ошибку, но не удаляет сохранённый ответ, поэтому 404 transaction_not_found по тому же ключу выдаётся повторно весь срок хранения.

Что никогда не сохраняется: 429 и любой 5xx. Повтор с тем же ключом запускает проверку заново — именно этого и требуют такие ошибки. Отказы до принятия проверки тоже не сохраняются: ошибки аутентификации, 403, 413, 422 из-за схемы запроса и 422 по контракту, например expected_fields_required.

Прекратите автоматические повторы, когда вместе с сохранённым ответом пришёл Idempotent-Replayed: true. Получив и обработав его, создайте новую логическую проверку с новым ключом, если вашему процессу нужно более позднее наблюдение, например транзакции, ожидающей подтверждения или ещё не проиндексированной, после Retry-After. Никогда не берите новый ключ только потому, что исход первоначального запроса неизвестен.

Метод и сеть — часть операции

Оба метода проверки используют общее пространство ключей вашей организации. Если с тем же ключом вызвать другой метод или изменить тело запроса, API вернёт 409 idempotency_conflict, даже если хеш остался прежним. При повторе сохраняются определённая сеть и исходный результат; доступ к этой сети проверяется заново.

Получив NETWORK_REQUIRED или NETWORK_AMBIGUOUS, сначала обработайте ошибку, затем укажите network в новой операции с новым ключом. Повтор не запускает определение сети заново.

Лимиты частоты, квота и параллельность

Лимиты организации

Лимиты определяются текущей версией плана или индивидуальными условиями организации. Смотрите /v1/usage и страницу «План и оплата» в кабинете разработчика. Опубликованные бета-цены и включённые проверки — в разделе планы и оплата; лимиты частоты и параллельности предварительные до общего запуска.

Заголовки ответа Что показывают
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset Допустимую частоту запросов организации, её остаток и время обновления.
X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset Включённые проверки текущего расчётного периода, их остаток и окончание периода. X-Quota-Available добавляет дополнительные проверки.

Время обновления передаётся в секундах Unix. Оплаченный расчётный период привязан к подтверждённой оплате; организация без оплаченного плана живёт по календарному месяцу UTC. Периоды считаются по UTC независимо от часового пояса браузера. Все API-ключи и запросы из кабинета разработчика используют одну квоту. Когда проверка расходует включённые проверки, X-Quota-Remaining уже учитывает её: её квота резервируется на время выполнения и возвращается, если ответ не списывается, поэтому у бесплатного ответа остаток на единицу меньше, чем потом покажет /v1/usage. Идемпотентный повтор квоту не трогает и заголовков X-Quota-* не содержит.

Если лимит достигнут

Слишком частые запросы дают 429 rate_limit_exceeded. Слишком много одновременно выполняющихся проверок — 429 concurrency_limit_exceeded. Исчерпанная квота — 429 quota_exceeded. Учитывайте Retry-After: для месячной квоты ожидание может быть долгим. Повторная выдача сохранённого результата по-прежнему проходит проверку доступа, частоты и параллельности, но не списывает проверку ещё раз.

Проверки, которые дошли до источников данных и не дали полного окончательного результата (транзакция ожидает подтверждения, не найдена, покрытие частичное), не списываются, а их число за сутки ограничено для каждой организации (по умолчанию 500). Опрашивайте транзакцию, ожидающую подтверждения, с увеличивающейся паузой, а не в плотном цикле. За этим пределом API отвечает 429 rate_limit_exceeded, пока предел не обнулится в конце суток UTC; Retry-After в каждом таком ответе не больше часа. В штатной работе этот предел не достигается.

Используйте очередь ограниченного размера и ограничивайте число одновременных запросов на своей стороне. Смена плана меняет будущие условия и не переписывает историю использования.

Пакеты

Файл пакета содержит до 200 строк и до 256 КиБ; организация выполняет не больше двух пакетов одновременно (это проверяется при запуске пакета). Выполняемый пакет использует не больше половины лимита частоты запросов вашей организации, поэтому ваши собственные проверки сохраняют свою долю, а при исчерпании квоты или дневного предела проверок без списания пакет встаёт на паузу, а не завершается ошибкой. Каждая уникальная транзакция в пакете списывается один раз.

Защита от перерасхода

У каждой организации есть предел суммы, которую ChainZap тратит на платные источники данных для её проверок за сутки UTC; поддержка может его поднять или снизить. После этого предела проверка по-прежнему отвечает, используя кешированные данные, где они есть. Проверка риска, которой понадобился бы новый платный вызов, пропускается: в проверке транзакции AML-источник в source_coverage.risk_sources сообщает error_code: "spend_cap" ("daily_cap", если вместо этого достигнут общий суточный потолок AML-источника), risk_status равен INSUFFICIENT, и ответ не списывается; проверка кошелька показывает aml_provider_unavailable. Предел обнуляется в 00:00 UTC; новая проверка до этого времени обычно даёт тот же пробел, что бы ни предлагал risk_retry_after_seconds. spend_cap сообщается и тогда, когда расход нельзя учесть (тариф неизвестен или счётчик недоступен); такой пробел исчезает, когда учёт восстановится, а не в 00:00 UTC. Проверку платежа это не затрагивает: окончательное совпадение остаётся окончательным.

Перед каждой платной попыткой без ответа из cache ChainZap атомарно резервирует её полную настроенную стоимость, включая выполняющиеся запросы. Вызов, превышающий остаток лимита, пропускается. При заданном лимите неизвестный тариф или недоступный учёт запрещают новые платные вызовы. Гарантированно неотправленный запрос возвращает резерв; потерянный ответ сохраняет его. Данные из cache остаются доступны. Лимит влияет на покрытие риска, а не на окончательность verification платежа.

Чтение реестра

Чтение обязательств, решений и пакетов (поиск, опрос статуса, страница строк, экспорт) не расходует лимит частоты ваших проверок: у чтения своя квота на организацию — вчетверо больше вашего лимита в минуту и не меньше 120 запросов в минуту, — поэтому отслеживание пакета никогда не отнимает ресурс у проверок. Сверх неё чтение отвечает 429 rate_limit_exceeded с Retry-After; у запросов на чтение заголовки X-RateLimit-* описывают именно эту квоту.

Автоматическое определение сети

POST /v1/check и POST /v1/transaction/check используют общие лимиты организации. Запрос без network резервирует квоту до поиска фактов о транзакции в доступных сетях. Поиск ограничен и не запускает оценку риска для каждой сети. Списывается только завершённая проверка с полным покрытием; ошибка определения сети освобождает резерв.

Повторы и время ожидания

Предел ожидания на клиенте

Установите на клиенте предел ожидания больше жёсткого серверного предела в 12 секунд, например 15 секунд на попытку. У проверки кошелька серверный бюджет 30 секунд; для неё задайте около 35 секунд. Целевое значение p95 — не более 5 секунд; это критерий выпуска, а не безусловная гарантия. Время передачи по сети в серверный бюджет не входит.

Ограниченные повторы

Полученную ошибку повторяйте только при error.retryable=true. Учитывайте Retry-After, увеличивайте паузу экспоненциально с небольшим случайным разбросом, ограничивайте число попыток и общую продолжительность операции. Если сервер просит ждать дольше, чем допускает интерактивный сценарий, запланируйте повтор позже, а не сокращайте паузу.

Обрыв соединения

При сетевой ошибке повторите то же сохранённое тело с тем же Idempotency-Key. Оба значения должны переживать перезапуск. Если вернулась сохранённая ошибка с Idempotent-Replayed: true, остановитесь и обработайте результат. 409 idempotency_conflict требует исправления интеграции; 409 idempotency_in_progress, 429, 503 и 504 можно повторять по правилам выше.

В обычных логах сохраняйте только идентификатор запроса и публичный код ошибки. Не записывайте тела запросов, API-ключи, суммы кошельков и ответы провайдеров. Примеры кода следуют этим правилам.

Когда нужна новая проверка

Ожидающая подтверждения транзакция может завершиться позже, но повтор сохранённого ответа не запрашивает новое состояние. Получив и обработав текущий результат, при необходимости запланируйте новую логическую проверку с новым ключом. При нерешённой ошибке сети следуйте правилам определения сети: NETWORK_REQUIRED и NETWORK_AMBIGUOUS требуют явно указать сеть, а не повторять запрос автоматически.

Окончательность verification и риска

verification_final описывает окончательность фактов платежа и сравнения. result_final — его алиас; retryable — противоположное значение, а retry_after_seconds — рекомендуемая пауза перед новой проверкой verification. Окончательно подтверждённая транзакция с точным совпадением ожидаемых данных возвращает verification_final: true и integrity_status: MATCH, даже если KYT недоступен и risk_status: INSUFFICIENT.

risk_final равен true, когда от новой проверки уже не ждут, что она заполнит пробел в оценке риска: транзакция окончательна, источники согласны и ни у одной проверки AML, санкций или токена не было временного пробела (сбоя или устаревшего списка). Пока транзакция ожидает подтверждений или не найдена, risk_final равен false при любом risk_status, а risk_retry_after_seconds равен retry_after_seconds: риск оценивается заново, когда транзакция станет окончательной. risk_retryable — противоположное значение; risk_retry_after_seconds подсказывает паузу перед новой проверкой риска. Постоянное ограничение покрытия может быть окончательным при статусе INSUFFICIENT: окончательность не означает разрешение. KYT описывает риск на момент проверки; позднее он может измениться и после окончательной оценки.

Pending возвращает integrity_status: NOT_EVALUATED, verification_final: false, флаги сравнения null, NOT_EVALUATED для каждого запрошенного сравнения и ни одной причины EXPECTED_*_MISMATCH: отличающиеся условия сообщаются только после того, как транзакция стала окончательной. Когда источники расходятся в самой транзакции (transaction_status: INSUFFICIENT, coverage_status: DISAGREEMENT), ответ тоже не окончателен, но переводы, которые сообщают источники, в нём всё же сравниваются, и в нём может быть EXPECTED_*_MISMATCH: ориентируйтесь на verification_final: false и проверьте снова. Наблюдаемые переводы остаются доказательствами, а не окончательным совпадением платежа. Для новой verification рекомендуются 5–120 секунд при ожидании окончательного подтверждения, 15 секунд для отсутствующей транзакции и 30 секунд при временном пробеле ончейн-источников. Временный пробел KYT отдельно рекомендует повтор риска через 30 секунд. Если AML-источник сообщает error_code spend_cap (достигнут суточный предел расходов вашей организации на платные источники или расход сейчас нельзя учесть) или daily_cap (достигнут общий суточный потолок AML-источника), достигнутый предел обнуляется в 00:00 UTC, и новая проверка до этого времени обычно даёт тот же пробел; см. лимиты. У ненайденной транзакции risk_retryable равен true, хотя risk_status — NOT_EVALUATED: риск оценивается, когда транзакция появится.

Недоступный KYT не отменяет окончательную verification и никогда не разрешает PROCEED: MATCH с risk_status: INSUFFICIENT рекомендует MANUAL_REVIEW. Списываются только окончательные ответы с полным покрытием; окончательная verification с частичным покрытием KYT остаётся бесплатной. Для нового наблюдения используйте новый Idempotency-Key; прежний ключ возвращает сохранённый ответ по исходной политике.

Справочник ошибок

Формат ответа

JSON
{"request_id":"merchant-order-1001-attempt-1","error":{"code":"provider_unavailable","message":"Transaction data is temporarily unavailable","retryable":true}}

Заголовок ответа X-Request-ID соответствует request_id в JSON. Для обработки используйте стабильные code и retryable, а не текст message. При ошибке шлюза этого формата может не быть: считайте отсутствующий или неверный JSON неизвестным исходом запроса и сохраните исходный ключ идемпотентности.

HTTP Коды Что делать
401 invalid_api_key Исправить ключ на сервере; не повторять вслепую.
403 tenant_suspended, network_not_enabled, check_kind_not_enabled Уточнить доступ у администратора организации; пилотный контракт охватывает только проверки транзакций TRON.
403 forbidden Запрос пришёл не через Cloudflare: его отправили напрямую на адрес сервера. Обращайтесь к https://api.chainzap.io. В этом ответе пограничного узла request_id есть только в теле. Если сам api.chainzap.io привязан к адресу сервера, сервер отклоняет запрос простой страницей 403 без JSON.
403 network_disabled Адаптер ещё не включён; обратитесь в поддержку.
403 ledger_not_enabled, batch_not_enabled Реестр обязательств или пакетная проверка не включены; отправьте проверку без полей реестра.
404 obligation_not_found, decision_not_found, payment_event_not_found, allocation_not_found, batch_not_found Записи нет в этой среде. Платёжное событие появляется только после того, как его с полным покрытием записала проверка, в которой указано обязательство.
404 transaction_not_found Только /v1/check. Все проверенные сети подтвердили, что транзакции нет. Проверьте хеш и время индексации; ограничьте повторы.
409 idempotency_conflict Исправить связь ключа с телом запроса (или, при загрузке пакета, с файлом); повтор не разрешён.
409 idempotency_in_progress Дождаться Retry-After и повторить ту же операцию.
409 instruction_conflict, instruction_version_required Инструкция обязательства записана с другими условиями. Для изменённых условий передайте новую instruction_version; записанные версии никогда не меняются.
409 allocation_exceeds_event, payment_event_not_settled, allocation_token_mismatch Доли превышают платёжное событие, событие не выполнено или не окончательно либо оно в другом токене, чем обязательство.
409 attempt_conflict Попытка записана с другим каналом, референсом провайдера, суммой или транзакцией — через POST /v1/obligations/attempts или проверкой, которая указывает её attempt_reference с другим tx_hash; записывайте повтор или смену провайдера как новую attempt_reference.
409 batch_not_executable, insufficient_quota, nothing_to_retry Пакет не в том статусе, чтобы выполнить это действие, квоты на него не хватает (передайте allow_partial) или повторять нечего.
413 payload_too_large Тело запроса больше 4 КиБ (256 КиБ для загрузки пакета); передавайте только задокументированные поля.
413 batch_too_large В файле пакета больше 200 строк; разделите его.
415 unsupported_media_type Отправьте тело с заголовком Content-Type: application/json или text/csv для загрузки пакета.
422 malformed_tx_hash, invalid_address, invalid_network, invalid_tron_address, invalid_eth_address, invalid_ton_address, invalid_expected_amount, invalid_idempotency_key, invalid_query_parameter, validation_error Исправить неверный запрос.
422 invalid_amount_tolerance, invalid_reference, invalid_owner, instruction_terms_required Исправить запрос: допуск точнее decimals токена, референс вне диапазона от 1 до 128 печатных символов ASCII, owner, не являющийся непрозрачным идентификатором, или обязательство без условий платежа.
422 invalid_csv, invalid_csv_header, confirmation_required Исправить файл пакета или подтвердить оценку через confirm: true.
422 expected_fields_required, token_not_enabled Контракт вашей организации требует все три поля expected_* и токен, который он охватывает. Исправьте запрос; повтор не разрешён.
422 NETWORK_REQUIRED, NETWORK_AMBIGUOUS Недостаточно входных данных, это не успех: проверенные сети не дали однозначного ответа. Укажите сеть и используйте новый ключ. См. определение сети.
429 rate_limit_exceeded, quota_exceeded, concurrency_limit_exceeded Учесть Retry-After; снизить параллельность или дождаться обновления квоты.
429 batch_limit_reached У вашей организации уже выполняются два пакета; дождитесь завершения одного из них.
503 provider_unavailable, rate_limiter_unavailable, api_disabled, api_not_configured Повторять только при retryable=true и в пределах бюджета повторов; сохранить тот же ключ.
504 request_timeout Повторить тот же ключ и тело после указанной паузы. Этот ответ приходит и тогда, когда в тот момент тот же платёж или обязательство в реестре удерживал другой запрос: ничего не сохранено и не списано.
500 internal_error Применить ограниченные повторы; передать поддержке X-Request-ID.

Проверяйте Idempotent-Replayed: сохранённая ошибка не обновляется при повторе. См. идемпотентность. Никогда не считайте, что HTTP-ошибка означает, будто запрос не был принят.

Рекомендации по защите интеграции

Защитите ключи

Обращайтесь к API с бэкенда. Храните API-ключи в менеджере секретов, разрешайте доступ к ним только сервису интеграции и заменяйте ключ при подозрении на утечку. Никогда не вставляйте ключ в обращение в поддержку, URL, задачу в трекере, событие аналитики, консоль браузера или клиентский код.

Используйте доступные в вашем провайдере идентификации строгие политики аутентификации. Принимайте приглашения только от доверенного администратора организации. Выходите из кабинета на общих устройствах; в настройках организации в кабинете разработчика можно завершить все сеансы.

Обращайтесь с данными осознанно

Проверяйте входящие платёжные запросы на своём сервере. Связывайте проверки с собственными идентификаторами платёжных операций и отдельно разбирайте неоднозначные исходы. Используйте точные контракты токенов и десятичные строки; явно обрабатывайте null и неизвестные состояния. Экранируйте названия организаций, названия ключей и значения из ответа перед выводом в своём интерфейсе.

Храните только те данные, которые нужны вашему процессу. Ограничивайте доступ к деталям ответов. В поддержку отправляйте X-Request-ID и публичный код ошибки; ключи, балансы и полные ответы не отправляйте.

Справочник API

Скачать OpenAPI. Названия полей и допустимые типы взяты из контракта API. Обязательное поле может содержать null, если это разрешено его типом. Значение полей объясняется в разделах выше.

POST /v1/transaction/check

Проверка одной транзакции. Передайте X-API-Key и сохранённый Idempotency-Key. Обязательность network зависит от endpoint.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/check

Проверка одной транзакции. Передайте X-API-Key и сохранённый Idempotency-Key. Обязательность network зависит от endpoint.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/usage

Лимиты и статистика вашей организации. Необязательный параметр days задаёт период от 1 до 90 дней. По умолчанию: 30.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
422 Исправьте поля запроса.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/catalog

Опубликованный каталог бета-цен: тарифы, включённые проверки и условия дополнительных проверок.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.

POST /v1/wallet/check

Проверка одного адреса кошелька. Передайте X-API-Key и сохранённый Idempotency-Key. Сеть необязательна и определяется по формату адреса.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/obligations

Запись обязательства и его инструкции. Изменение получателя, суммы, токена или сети — новая instruction_version.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/obligations/lookup

Чтение обязательства с историей инструкций, попыток, распределений и решений. Референс передаётся в теле запроса, а не в URL.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/obligations/attempts

Запись одной попытки исполнения обязательства или её нового статуса. Повтор или смена провайдера — новый attempt_reference.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/allocations

Указать, как одно платёжное событие закрывает одно или несколько обязательств, например при агрегированной выплате.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/allocations/{allocation_id}/reversal

Отменить распределение. Оно остаётся в истории с временем и причиной.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

GET /v1/decisions/{decision_id}

Решение ChainZap в момент принятия, с доказательствами и тем, что вы записали после.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/decisions/{decision_id}/actions

Записать действие по решению, способ разрешения или итог. Записывается рядом с решением, не меняя его.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/decisions/{decision_id}/resolution

Записать действие по решению, способ разрешения или итог. Записывается рядом с решением, не меняя его.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/decisions/{decision_id}/outcome

Записать действие по решению, способ разрешения или итог. Записывается рядом с решением, не меняя его.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
504 Истекло время обработки запроса на сервере.

POST /v1/batches

Загрузка CSV до 200 платежей. Каждая строка проверяется, сравнивается с остальными и с прошлыми проверками, стоимость оценивается до запуска.

HTTP Ответ
201 Создано: пакет принят и предварительно проверен; запустите его через execute.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

GET /v1/batches

Загрузка CSV до 200 платежей. Каждая строка проверяется, сравнивается с остальными и с прошлыми проверками, стоимость оценивается до запуска.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

GET /v1/batches/{batch_id}

Статус пакета, прогресс, preflight, оценка и сводка, либо строки с результатами.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

GET /v1/batches/{batch_id}/rows

Статус пакета, прогресс, preflight, оценка и сводка, либо строки с результатами.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

GET /v1/batches/{batch_id}/export.csv

Экспорт пакета в CSV для таблиц

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/batches/{batch_id}/execute

Запустить пакет после подтверждения оценки, повторить только строки, ответ по которым ещё может измениться, или отменить.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/batches/{batch_id}/retry

Запустить пакет после подтверждения оценки, повторить только строки, ответ по которым ещё может измениться, или отменить.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/batches/{batch_id}/cancel

Запустить пакет после подтверждения оценки, повторить только строки, ответ по которым ещё может измениться, или отменить.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.

POST /v1/escrow-deals

Создать черновик эскроу-сделки, получить список сделок организации или найти сделку по вашему идентификатору.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals

Создать черновик эскроу-сделки, получить список сделок организации или найти сделку по вашему идентификатору.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/lookup

Создать черновик эскроу-сделки, получить список сделок организации или найти сделку по вашему идентификатору.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/events

Прочитать ленту событий после номера, или отправить событие на вебхук ещё раз.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/events/{event_id}/redeliver

Прочитать ленту событий после номера, или отправить событие на вебхук ещё раз.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/webhook

Задать, прочитать или отключить подписанный вебхук, сменить его секрет или отправить тестовое событие.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

PUT /v1/escrow-deals/webhook

Задать, прочитать или отключить подписанный вебхук, сменить его секрет или отправить тестовое событие.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

DELETE /v1/escrow-deals/webhook

Задать, прочитать или отключить подписанный вебхук, сменить его секрет или отправить тестовое событие.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/webhook/rotate-secret

Задать, прочитать или отключить подписанный вебхук, сменить его секрет или отправить тестовое событие.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/webhook/test

Задать, прочитать или отключить подписанный вебхук, сменить его секрет или отправить тестовое событие.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/resolvers

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/resolvers

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/resolvers/{resolver_id}

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/resolvers/{resolver_id}/verify

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/resolvers/{resolver_id}/disable

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/resolvers/{resolver_id}/enable

Зарегистрировать внешних арбитров, посмотреть их, перечитать их аккаунты в сети или отключить. Арбитр необязателен, и ChainZap им никогда не бывает.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/{ref}

Получить эскроу-сделку, заменить условия черновика или отменить черновик.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/{ref}/versions

Получить эскроу-сделку, заменить условия черновика или отменить черновик.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/{ref}/cancel

Получить эскроу-сделку, заменить условия черновика или отменить черновик.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

Получить точный текст, который подписывает каждая сторона, или передать подпись стороны.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/{ref}/consents

Получить точный текст, который подписывает каждая сторона, или передать подпись стороны.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/{ref}/actions

Получить вызовы контракта, которые сторона может подписать сейчас, или сообщить о переданной транзакции.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/{ref}/transactions

Получить вызовы контракта, которые сторона может подписать сейчас, или сообщить о переданной транзакции.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/{ref}/evidence

Добавить или прочитать материалы либо получить спор с материалами обеих сторон и сроками.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

POST /v1/escrow-deals/{ref}/evidence

Добавить или прочитать материалы либо получить спор с материалами обеих сторон и сроками.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

PUT /v1/escrow-deals/{ref}/evidence/files

Добавить или прочитать материалы либо получить спор с материалами обеих сторон и сроками.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/{ref}/evidence/{evidence_id}/content

Добавить или прочитать материалы либо получить спор с материалами обеих сторон и сроками.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

GET /v1/escrow-deals/{ref}/dispute

Добавить или прочитать материалы либо получить спор с материалами обеих сторон и сроками.

HTTP Ответ
200 Успешно: тело ответа соответствует схеме этого метода. У ответа проверки смотрите оси статусов и покрытие.
401 API-ключ недействителен или отозван.
403 У организации нет доступа к API или выбранной сети.
404 Не найдено в вашей организации и окружении. В /v1/check: транзакция не найдена в выбранной сети или, если сеть не указана, ни в одной из проверенных сетей.
409 Конфликт: запрос ещё выполняется, ключ идемпотентности повторно использован с другим телом или запрос противоречит записанному состоянию. Смотрите error.code.
413 Тело запроса больше, чем принимает этот метод.
415 Этот тип содержимого здесь не принимается: JSON, а для загрузки пакета — CSV.
422 Исправьте поля запроса.
429 Достигнут лимит частоты, одновременных запросов, проверок за месяц, проверок без списания за сутки или активных пакетов. Смотрите error.code и Retry-After.
500 Внутренняя ошибка. Сохраните X-Request-ID для поддержки.
503 Доступ к API закрыт или нужный сервис недоступен.
504 Истекло время обработки запроса на сервере.

ActionRequest

Поле Тип / значения Обязательно
owner string / null Нет
action "CREDITED", "PAID", "HELD", "REJECTED", "REFUNDED", "ESCALATED", "RETRIED", "NO_ACTION", "OTHER" Да
action_at string / null Нет

ActionView

Поле Тип / значения Обязательно
action string Да
contract string Да
function string Да
parameters string Да
data string Да
fee_limit_sun integer Да
call_value integer Нет
estimated_energy integer / null Да
estimated_trx string / null Да
note string / null Нет

ActionsResponse

Поле Тип / значения Обязательно
role "BUYER", "SELLER" Да
address string Да
state string / null Да
status string Да
actions ActionView[] Да

AllocationRequest

Поле Тип / значения Обязательно
network "tron", "eth", "ton" Да
tx_hash string Да
event_ref string Да
allocations AllocationShare[] Да
owner string / null Нет

AllocationResponse

Поле Тип / значения Обязательно
allocation_id string Да
external_reference string / null Да
event EventResponse Да
allocated_amount string Да
status string Да
source string Да
instruction_version integer / null Да
decision_id string / null Да
created_at string Да
reversed_at string / null Да
reversal_reason string / null Да

AllocationResultResponse

Поле Тип / значения Обязательно
allocations AllocationResponse[] Да
obligations ObligationResponse[] Да

AllocationShare

Поле Тип / значения Обязательно
external_reference string Да
amount string Да

AmountComparisonResponse

Поле Тип / значения Обязательно
expected string / null Да
actual string / null Да
result "EXACT", "WITHIN_TOLERANCE", "UNDERPAID", "OVERPAID", "NOT_EVALUATED", "INSUFFICIENT" Да
tolerance string / null Да
delta string / null Да
delta_raw string / null Да

AmountView

Поле Тип / значения Обязательно
value string Да
minor string Да
token string Да
symbol string Нет
decimals integer Да

AttemptRequest

Поле Тип / значения Обязательно
external_reference string Да
attempt_reference string Да
status "CREATED", "SUBMITTED", "BROADCAST", "TIMEOUT", "FAILED", "CANCELLED", "PROVIDER_CONFIRMED", "UNKNOWN" Нет
channel string / null Нет
provider_reference string / null Нет
amount string / null Нет
network "tron", "eth", "ton" / null Нет
tx_hash string / null Нет
instruction_version integer / null Нет
attempt_created_at string / null Нет

AttemptResponse

Поле Тип / значения Обязательно
attempt_reference string / null Да
status "CREATED", "SUBMITTED", "BROADCAST", "TIMEOUT", "FAILED", "CANCELLED", "PROVIDER_CONFIRMED", "UNKNOWN" Да
channel string / null Да
provider_reference string / null Да
amount string / null Да
network string / null Да
tx_hash string / null Да
instruction_version integer / null Да
attempt_created_at string Да
updated_at string Да
status_history object[] Да
execution_confirmed boolean Да
redacted boolean Да

BalancesView

Поле Тип / значения Обязательно
accrued PartyMoney Да
claimable PartyMoney Да
withdrawn PartyMoney Да
held_by_contract Money Да

BatchListResponse

Поле Тип / значения Обязательно
batches BatchResponse[] Да

BatchResponse

Поле Тип / значения Обязательно
batch_id string Да
environment "live", "sandbox" Да
status "PREFLIGHTED", "QUEUED", "RUNNING", "PAUSED", "CANCELLING", "COMPLETED", "CANCELLED", "FAILED" Да
pause_reason string / null Да
row_count integer Да
progress object Да
defaults object Да
preflight object Да
estimate object Да
summary object / null Да
created_at string Да
started_at string / null Да
completed_at string / null Да

BatchRowResponse

Поле Тип / значения Обязательно
row_no integer Да
kind "check", "obligation" Да
state "PENDING", "CLAIMED", "DONE", "FAILED", "RETRYABLE", "SKIPPED_DUPLICATE", "SKIPPED_INVALID", "CANCELLED" Да
attempt integer Да
external_reference string / null Да
network string / null Да
tx_hash string / null Да
errors string[] Да
warnings string[] Да
duplicate_of integer / null Да
error_code string / null Да
result object / null Да
redacted boolean Да

BatchRowsResponse

Поле Тип / значения Обязательно
batch_id string Да
rows BatchRowResponse[] Да
next_after integer / null Да

CatalogItemResponse

Поле Тип / значения Обязательно
plan_code string Да
plan_version integer Да
name string Да
environment "live", "sandbox" Да
commercial_status "published", "custom" Да
currency string Да
monthly_price_minor integer / null Да
included_checks integer / null Да
overage_unit_price_minor integer / null Да
package CatalogPackageTerms / null Да

CatalogPackageTerms

Поле Тип / значения Обязательно
min_quantity integer Да
max_quantity integer Да
step integer Да
expires_days integer / null Да

CatalogResponse

Поле Тип / значения Обязательно
pricing_policy string Да
revision integer Да
currency string Да
consumption_unit "transaction_check" Нет
renewal "manual" Нет
items CatalogItemResponse[] Да
computed_at string Да

Category

Поле Тип / значения Обязательно

CheckDetails

Поле Тип / значения Обязательно
request_id string Да
tx_hash string Да
network "tron", "eth", "ton" Да
transaction_type string Да
transaction_category "eth_transfer", "erc20_transfer", "ton_transfer", "jetton_transfer", "trx_transfer", "trc10_transfer", "trc20_transfer", "smart_contract_call", "smart_contract_deploy", "staking", "voting", "governance", "resource_operation", "account_operation", "exchange", "market", "permission_update", "other", "unknown" Да
transaction_state "confirmed", "pending", "failed", "not_found", "unknown" Да
confirmations integer / null Да
required_confirmations integer Да
sender string / null Да
recipient string / null Да
token_contract string / null Да
token_symbol string / null Да
decimals integer / null Да
amount string / null Да
transfers DetailedTransferResponse[] Да
transfers_truncated boolean Да
aml_risk_level "low", "moderate", "high", "severe", "unknown" Да
schema_version "0.3" Да
policy_version string Да
sanctions_hit boolean / null Да
direct_sanctions_match boolean / null Да
indirect_sanctions_exposure boolean / null Да
risk_exposure boolean / null Да
key_exposure ExposureResponse[] Да
token_authenticity "official", "fake", "unknown" Да
recipient_match boolean / null Да
token_match boolean / null Да
amount_match boolean / null Да
coverage "complete", "partial" Да
workflow_coverage "complete", "partial" Да
source_coverage SourceCoverageResponse Да
freshness FreshnessResponse Да
overall_state "CLEAR", "REVIEW", "HIGH_RISK", "LIMITED_DATA" Да
environment "live", "sandbox" Нет
reasons ReasonResponse[] Да
decision_id string / null Да
direction "INCOMING", "OUTGOING" / null Да
workflow_type "PAYOUT", "DEPOSIT", "INVOICE", "REFUND", "SETTLEMENT", "OTHER" / null Да
versions VersionsResponse Да
transaction_status "CONFIRMED", "PENDING", "FAILED", "NOT_FOUND", "INSUFFICIENT" Да
integrity_status "MATCH", "MISMATCH", "AMBIGUOUS", "NOT_EVALUATED", "INSUFFICIENT" Да
risk_status "HIGH_RISK", "REVIEW", "NO_MATERIAL_SIGNAL", "NOT_EVALUATED", "INSUFFICIENT" Да
coverage_status "OK", "DEGRADED", "UNAVAILABLE", "DISAGREEMENT", "SKIPPED" Да
status_drivers StatusDriversResponse Да
result_final boolean Да
verification_final boolean Да
risk_final boolean Да
risk_retryable boolean Да
risk_retry_after_seconds integer / null Да
retryable boolean Да
retry_after_seconds integer / null Да
recommended_action "PROCEED", "CONFIRM_INTERNAL_STATE", "MANUAL_REVIEW", "RECHECK_LATER", "NOT_EXECUTED", "HOLD_AND_ESCALATE" Да
integrity IntegrityResponse Да
risk RiskSummaryResponse Да
evidence_items EvidenceItemResponse[] Да
coverage_limitations CoverageLimitationsResponse Да
obligation ObligationSummaryResponse / null Нет
reuse ReuseResponse / null Нет
selected_transfer_index integer / null Да
finalized boolean Да
finality_policy string Да
trace_complete boolean / null Да
evidence object Да
limitations string[] Да
checked_networks "tron", "eth", "ton"[] Да

ConsentPackage

Поле Тип / значения Обязательно
version integer Да
deal_id string Да
message string Да
params object Да
terms object Да
terms_canonical string Да
terms_hash string Да
agreement_expires_at string Да
factory string Да

ConsentRequest

Поле Тип / значения Обязательно
version integer Да
role "BUYER", "SELLER" Да
signature string Да

ConsentStatus

Поле Тип / значения Обязательно
signed boolean Да
method "SIGNATURE", "ONCHAIN_APPROVAL" / null Да
at string / null Да

ConsentsView

Поле Тип / значения Обязательно
buyer ConsentStatus Да
seller ConsentStatus Да

ContractView

Поле Тип / значения Обязательно
factory string Да
escrow string / null Да
deal_id string / null Да
ruling_hash string / null Да
observed_at string / null Да
out_of_sync boolean Да

CoverageLimitationsResponse

Поле Тип / значения Обязательно
runtime ReasonCode[] Да
product ReasonCode[] Да

CreateDealRequest

Поле Тип / значения Обязательно
buyer string Да
seller string Да
amount string Да
category Category Да
title string Да
description string Нет
delivery DeliveryInput Да
timeline TimelineInput Да
resolver_enabled boolean Нет
resolver_id string / null Нет
resolver_fee string / null Нет
external_reference string Да
obligation_reference string / null Нет

CustomerContext

Поле Тип / значения Обязательно
credit_status "NOT_CREDITED", "CREDITED", "PARTIALLY_CREDITED", "UNKNOWN" / null Нет
allocation_status "NOT_ALLOCATED", "PARTIALLY_ALLOCATED", "ALLOCATED", "UNKNOWN" / null Нет

DealListResponse

Поле Тип / значения Обязательно
deals DealResponse[] Да
next_before string / null Да

DealResponse

Поле Тип / значения Обязательно
id string Да
external_reference string Да
obligation_reference string / null Да
environment "live", "sandbox" Да
network string Да
status string Да
protocol_version 1, 2 Да
state string / null Да
settlement_reason string / null Да
category string Да
title string / null Да
pricing_class string Да
parties Parties Да
resolver_enabled boolean Да
resolver ResolverView / null Да
amount AmountView Да
fee FeeView Да
terms TermsView Да
timeline TimelineView Да
settlement SettlementView / null Да
funding FundingView / null Да
contract ContractView Да
balances BalancesView Да
links Links Да
created_at string / null Да
updated_at string / null Да
transactions TransactionView[] Нет
replayed boolean Нет

DecisionEventResponse

Поле Тип / значения Обязательно
kind "ACTION", "RESOLUTION", "OUTCOME" Да
action string / null Да
resolution string / null Да
outcome_status string / null Да
loss_prevented string / null Да
owner string / null Да
occurred_at string Да
recorded_at string Да

DecisionResponse

Поле Тип / значения Обязательно
decision_id string Да
decided_at string Да
channel string Да
transaction_status string Да
integrity_status string Да
risk_status string Да
coverage_status string Да
overall_state string Да
recommended_action string Да
reuse_status string / null Да
environment "live", "sandbox" Да
network string Да
external_reference string / null Да
instruction_version integer / null Да
selected_event_ref string / null Да
result_final boolean Да
verification_final boolean / null Да
risk_final boolean / null Да
retryable boolean Да
status_drivers object Да
reason_codes string[] Да
versions object Да
evidence_items object[] / null Да
events DecisionEventResponse[] Да

DecisionSummaryResponse

Поле Тип / значения Обязательно
decision_id string Да
decided_at string Да
channel string Да
transaction_status string Да
integrity_status string Да
risk_status string Да
coverage_status string Да
overall_state string Да
recommended_action string Да
reuse_status string / null Да

DeliveryInput

Поле Тип / значения Обязательно
criteria string[] Да
method string Да
evidence_required string[] Нет

DetailedTransferResponse

Поле Тип / значения Обязательно
index integer Да
asset_type string Да
sender string / null Да
recipient string / null Да
token_contract string / null Да
token_id string / null Да
token_symbol string / null Да
decimals integer / null Да
amount string / null Да
event_ref string / null Нет
execution_status "success", "failed", "unknown" Нет
raw_amount string / null Да

DisputeResponse

Поле Тип / значения Обязательно
state string / null Да
disputed_at string / null Да
resolve_deadline string / null Да
resolver_enabled boolean Да
deadlocked boolean Да
buyer_proposal Money / null Да
seller_proposal Money / null Да
criteria string[] Да
evidence EvidenceView[] Да
ruling RulingView / null Да

ErrorDetail

Поле Тип / значения Обязательно
code string Да
message string Да
retryable boolean Да

ErrorResponse

Поле Тип / значения Обязательно
request_id string Да
error ErrorDetail Да

EventFeedResponse

Поле Тип / значения Обязательно
events EventView[] Да
next_after integer Да

EventResponse

Поле Тип / значения Обязательно
network string Да
tx_hash string / null Да
event_ref string Да
asset_type string Да
token_contract string / null Да
sender string / null Да
recipient string / null Да
amount string / null Да
execution_status string Да
finalized boolean Да
block_number integer / null Да
block_time string / null Да

EventView

Поле Тип / значения Обязательно
seq integer Да
event_id string Да
type string Да
occurred_at string Да
deal object Да
data object Да

EvidenceDisagreementResponse

Поле Тип / значения Обязательно
fields string[] Да

EvidenceFreshnessResponse

Поле Тип / значения Обязательно
age_seconds integer / null Да
stale boolean Да
stale_after_seconds integer / null Да

EvidenceItemResponse

Поле Тип / значения Обязательно
evidence_id string Да
kind "transaction_facts", "aml_risk", "sanctions_list", "token_authenticity" Да
source string Да
subject EvidenceSubjectResponse Да
source_reference string / null Да
observed_at string / null Да
effective_at string / null Да
temporal_scope "TRANSACTION_TIME", "CHECK_TIME", "LIST_PUBLICATION" Да
coverage "checked", "checked_stale", "checked_freshness_unknown", "not_checked", "not_applicable", "unavailable", "partial", "disagreement" Да
freshness EvidenceFreshnessResponse Да
dependency "required", "optional", "not_applicable" Да
disagreement EvidenceDisagreementResponse / null Да
evidence_version string Да

EvidenceListResponse

Поле Тип / значения Обязательно
evidence EvidenceView[] Да

EvidenceSubjectResponse

Поле Тип / значения Обязательно
type "transaction", "transaction_addresses", "token" Да
ref string / null Да

EvidenceView

Поле Тип / значения Обязательно
id string Да
author_role string Да
purpose string Да
kind string Да
terms_version integer Да
file_name string / null Да
media_type string / null Да
size_bytes integer / null Да
sha256 string / null Да
note string / null Да
supersedes string / null Да
uploaded boolean Да
content_deleted boolean Да
created_at string Да

ExecuteRequest

Поле Тип / значения Обязательно
confirm boolean Да
allow_partial boolean Нет

ExposureResponse

Поле Тип / значения Обязательно
category string Да
exposure_type string Да
hops integer Да
percent string / null Да
source string / null Нет
grade "high", "review", "minor", "none" / null Нет

FeeView

Поле Тип / значения Обязательно
value string Да
minor string Да
rule "seller-share-v1" Да

FieldComparisonResponse

Поле Тип / значения Обязательно
expected string / null Да
actual string / null Да
result "MATCH", "MISMATCH", "NOT_EVALUATED", "INSUFFICIENT" Да

FreshnessResponse

Поле Тип / значения Обязательно
checked_at string Да
transaction_at string / null Да
risk_data_at string / null Да
token_data_at string / null Да
max_source_age_seconds integer Да

FundingView

Поле Тип / значения Обязательно
received Money Да
remaining Money Да

InstructionResponse

Поле Тип / значения Обязательно
version integer Да
network string Да
recipient string / null Да
sender string / null Да
token_contract string / null Да
amount string / null Да
amount_tolerance string / null Да
effective_at string / null Да
approval_reference string / null Да
source string Да
history_complete boolean Да
created_at string Да
redacted boolean Да

IntegrityComparisonsResponse

Поле Тип / значения Обязательно
recipient FieldComparisonResponse / null Да
sender FieldComparisonResponse / null Да
token FieldComparisonResponse / null Да
amount AmountComparisonResponse / null Да
network FieldComparisonResponse Да

IntegrityResponse

Поле Тип / значения Обязательно
status "MATCH", "MISMATCH", "AMBIGUOUS", "NOT_EVALUATED", "INSUFFICIENT" Да
selected_event_ref string / null Да
relevant_event_count integer Да
comparisons IntegrityComparisonsResponse Да
Поле Тип / значения Обязательно
buyer string Да
seller string Да
telegram_invite string / null Да

LookupRequest

Поле Тип / значения Обязательно
external_reference string Да

ModuleStatusResponse

Поле Тип / значения Обязательно
key "sanctions_aml", "wallet_behaviour", "token_authenticity", "contract_controls", "address_security", "counterparties_services", "flows_connections" Да
status "RISK_DETECTED", "NO_MATCHES_FOUND", "PARTIALLY_CHECKED", "INSUFFICIENT_DATA", "NOT_SUPPORTED", "NOT_CHECKED" Да
source_coverage "complete", "partial", "none", "not_applicable" Да

Money

Поле Тип / значения Обязательно
value string Да
minor string Да

NetworkErrorDetail

Поле Тип / значения Обязательно
code string Да
message string Да
retryable boolean Да
required_field "network" Да
candidates "tron", "eth", "ton"[] Да
checked_networks "tron", "eth", "ton"[] Да

NetworkInputErrorResponse

Поле Тип / значения Обязательно
request_id string Да
network null Нет
state "insufficient_input" Нет
error NetworkErrorDetail Да

NewVersionRequest

Поле Тип / значения Обязательно
buyer string Да
seller string Да
amount string Да
category Category Да
title string Да
description string Нет
delivery DeliveryInput Да
timeline TimelineInput Да
resolver_enabled boolean Нет
resolver_id string / null Нет
resolver_fee string / null Нет
expected_version integer Да

NobodyActs

Поле Тип / значения Обязательно
at string / null Да
outcome "EXPIRED", "REFUNDED", "RELEASED", "DEADLOCK", "AGREEMENT_EXPIRED" Да
claim_by "BUYER", "SELLER", "ANYONE" / null Да

NoteRequest

Поле Тип / значения Обязательно
purpose "DELIVERY", "DISPUTE", "RESPONSE", "OTHER" Да
note string Да
supersedes string / null Нет

ObligationLookupRequest

Поле Тип / значения Обязательно
external_reference string Да

ObligationRequest

Поле Тип / значения Обязательно
network "tron", "eth", "ton" Да
expected_recipient string / null Нет
expected_token string / null Нет
expected_amount string / null Нет
expected_sender string / null Нет
amount_tolerance string / null Нет
external_reference string Да
direction "INCOMING", "OUTGOING" / null Нет
workflow_type "PAYOUT", "DEPOSIT", "INVOICE", "REFUND", "SETTLEMENT", "OTHER" / null Нет
instruction_version integer / null Нет
instruction_effective_at string / null Нет
approval_reference string / null Нет

ObligationResponse

Поле Тип / значения Обязательно
external_reference string / null Да
environment "live", "sandbox" Да
workflow_type string / null Да
direction string / null Да
status string Да
current_instruction_version integer / null Да
expected_amount string / null Да
allocated_amount string Да
residual_amount string / null Да
pending_events integer Да
instructions InstructionResponse[] Да
attempts AttemptResponse[] Да
allocations AllocationResponse[] Да
decisions DecisionSummaryResponse[] Да
created_at string Да
redacted boolean Да

ObligationSummaryResponse

Поле Тип / значения Обязательно
external_reference string / null Да
workflow_type string / null Да
direction string / null Да
instruction_version integer / null Да
status "OPEN", "PARTIALLY_ALLOCATED", "ALLOCATED", "OVER_ALLOCATED", "CANCELLED" Да
expected_amount string / null Да
allocated_amount string Да
residual_amount string / null Да
attempts integer Да
events integer Да
pending_events integer Да
redacted boolean Нет

OutcomeRequest

Поле Тип / значения Обязательно
owner string / null Нет
outcome_status "CONFIRMED", "DISPUTED", "UNRESOLVED", "UNKNOWN" Да
loss_prevented "CONFIRMED", "NOT_CONFIRMED", "UNKNOWN" Нет
outcome_at string / null Нет

Parties

Поле Тип / значения Обязательно
buyer string Да
seller string Да

PartyMoney

Поле Тип / значения Обязательно
buyer Money Да
seller Money Да
fee Money Да
resolver Money Да

ReasonCode

Поле Тип / значения Обязательно

ReasonResponse

Поле Тип / значения Обязательно
code ReasonCode Да
category "transaction", "risk", "sanctions", "token", "expected", "integrity", "ledger", "context" Да
severity "info", "warning", "high", "critical" Да

RedeliveryResponse

Поле Тип / значения Обязательно
delivery_id string Да
status string Да

ResolutionRequest

Поле Тип / значения Обязательно
owner string / null Нет
resolution "ACCEPTED", "ACCEPTED_AFTER_REVIEW", "REJECTED", "REFUNDED", "CORRECTED", "WRITTEN_OFF", "OTHER" Да
resolved_at string / null Нет

ResolverListResponse

Поле Тип / значения Обязательно
resolvers ResolverResponse[] Да

ResolverRegistration

Поле Тип / значения Обязательно
address string Да
name string Да
affiliation "PLATFORM", "INDEPENDENT" Да
rules_version string Да
rules_sha256 string Да

ResolverResponse

Поле Тип / значения Обязательно
id string Да
network string Да
address string Да
name string Да
affiliation "PLATFORM", "INDEPENDENT" Да
rules_version string Да
rules_sha256 string Да
status "ACTIVE", "DISABLED" Да
owned boolean Да
key_scheme "SINGLE_KEY", "MULTISIG_2_OF_3", "UNSUPPORTED" / null Да
signatures_required integer / null Да
checked_at string / null Да
eligible boolean Да
ineligible_reason string / null Да

ResolverView

Поле Тип / значения Обязательно
id string Да
name string Да
address string Да
affiliation "PLATFORM", "INDEPENDENT" Да
rules_version string Да
rules_sha256 string Да
fee Money Да
key_scheme "SINGLE_KEY", "MULTISIG_2_OF_3", "UNSUPPORTED" / null Да
signatures_required integer / null Да
verified boolean Да
registered_by "PLATFORM", "OPERATOR" Да

ReuseResponse

Поле Тип / значения Обязательно
status "FIRST_SEEN", "REPEAT_CHECK", "SAME_OBLIGATION", "DECLARED_SHARED", "OTHER_OBLIGATION" Да
other_obligations integer Да
prior_decisions integer Да
first_seen_at string / null Да

ReversalRequest

Поле Тип / значения Обязательно
reason "CUSTOMER_CORRECTION", "DISPUTED", "DUPLICATE_RECORD", "OTHER" Да
owner string / null Нет

RiskSummaryResponse

Поле Тип / значения Обязательно
status "HIGH_RISK", "REVIEW", "NO_MATERIAL_SIGNAL", "NOT_EVALUATED", "INSUFFICIENT" Да
driver ReasonCode / null Да
driver_evidence_ids string[] Да

RulingView

Поле Тип / значения Обязательно
buyer_amount Money / null Да
rationale string Да
ruling_hash string Да
status string Да
txid string / null Да

SettlementView

Поле Тип / значения Обязательно
buyer_proposal Money / null Да
seller_proposal Money / null Да
deadlocked boolean Да

SimpleCheckRequest

Поле Тип / значения Обязательно
network "tron", "eth", "ton" / null Нет
expected_recipient string / null Нет
expected_token string / null Нет
expected_amount string / null Нет
expected_sender string / null Нет
amount_tolerance string / null Нет
tx_hash string Да

SimpleCheckResponse

Поле Тип / значения Обязательно
request_id string Да
network "tron", "eth", "ton" Да
state "clear", "review", "high_risk", "limited_data" Да
risk_level "low", "moderate", "high", "severe", "unknown" Да
coverage "complete", "partial" Да
reason_codes string[] Да
environment "live", "sandbox" Нет
details CheckDetails Да

SourceCoverageResponse

Поле Тип / значения Обязательно
sanctions_sources object Да
transaction_sources object Да
risk_sources object Да
universal_clearance false Нет

SourceObservationResponse

Поле Тип / значения Обязательно
status "checked", "checked_stale", "checked_freshness_unknown", "not_checked", "not_applicable", "unavailable", "partial", "disagreement" Да
checked_at string / null Да
retrieved_at string / null Да
data_updated_at string / null Да
stale_after_seconds integer / null Да
scope string Да
error_code string / null Да

StatusDriversResponse

Поле Тип / значения Обязательно
transaction ReasonCode / null Да
integrity ReasonCode / null Да
risk ReasonCode / null Да
coverage ReasonCode / null Да
action ReasonCode / null Да

TermsView

Поле Тип / значения Обязательно
version integer Да
agreed_version integer / null Да
terms_hash string / null Да
deal_id string / null Да
agreement_expires_at string / null Да
consents ConsentsView Да

TimelineInput

Поле Тип / значения Обязательно
agreement_window_seconds integer / null Нет
funding_window_seconds integer / null Нет
delivery_period_seconds integer Да
inspection_period_seconds integer Да
resolve_period_seconds integer / null Нет

TimelineView

Поле Тип / значения Обязательно
funding_deadline string / null Да
delivery_period_seconds integer / null Да
inspection_period_seconds integer / null Да
resolve_period_seconds integer / null Да
funded_at string / null Да
delivered_at string / null Да
disputed_at string / null Да
settled_at string / null Да
current_deadline string / null Да
resolve_deadline string / null Да
if_nobody_acts NobodyActs / null Да

TransactionAccepted

Поле Тип / значения Обязательно
txid string Да
status string Да

TransactionCheckRequest

Поле Тип / значения Обязательно
network "tron", "eth", "ton" Да
expected_recipient string / null Нет
expected_token string / null Нет
expected_amount string / null Нет
expected_sender string / null Нет
amount_tolerance string / null Нет
tx_hash string Да
direction "INCOMING", "OUTGOING" / null Нет
workflow_type "PAYOUT", "DEPOSIT", "INVOICE", "REFUND", "SETTLEMENT", "OTHER" / null Нет
external_reference string / null Нет
instruction_version integer / null Нет
instruction_effective_at string / null Нет
approval_reference string / null Нет
attempt_reference string / null Нет
customer_context CustomerContext / null Нет

TransactionCheckResponse

Поле Тип / значения Обязательно
request_id string Да
tx_hash string Да
network "tron", "eth", "ton" Да
transaction_type string Да
transaction_category "eth_transfer", "erc20_transfer", "ton_transfer", "jetton_transfer", "trx_transfer", "trc10_transfer", "trc20_transfer", "smart_contract_call", "smart_contract_deploy", "staking", "voting", "governance", "resource_operation", "account_operation", "exchange", "market", "permission_update", "other", "unknown" Да
transaction_state "confirmed", "pending", "failed", "not_found", "unknown" Да
confirmations integer / null Да
required_confirmations integer Да
sender string / null Да
recipient string / null Да
token_contract string / null Да
token_symbol string / null Да
decimals integer / null Да
amount string / null Да
transfers TransferResponse[] Да
transfers_truncated boolean Да
aml_risk_level "low", "moderate", "high", "severe", "unknown" Да
schema_version "0.3" Да
policy_version string Да
sanctions_hit boolean / null Да
direct_sanctions_match boolean / null Да
indirect_sanctions_exposure boolean / null Да
risk_exposure boolean / null Да
key_exposure ExposureResponse[] Да
token_authenticity "official", "fake", "unknown" Да
recipient_match boolean / null Да
token_match boolean / null Да
amount_match boolean / null Да
coverage "complete", "partial" Да
workflow_coverage "complete", "partial" Да
source_coverage SourceCoverageResponse Да
freshness FreshnessResponse Да
overall_state "CLEAR", "REVIEW", "HIGH_RISK", "LIMITED_DATA" Да
environment "live", "sandbox" Нет
reasons ReasonResponse[] Да
decision_id string / null Да
direction "INCOMING", "OUTGOING" / null Да
workflow_type "PAYOUT", "DEPOSIT", "INVOICE", "REFUND", "SETTLEMENT", "OTHER" / null Да
versions VersionsResponse Да
transaction_status "CONFIRMED", "PENDING", "FAILED", "NOT_FOUND", "INSUFFICIENT" Да
integrity_status "MATCH", "MISMATCH", "AMBIGUOUS", "NOT_EVALUATED", "INSUFFICIENT" Да
risk_status "HIGH_RISK", "REVIEW", "NO_MATERIAL_SIGNAL", "NOT_EVALUATED", "INSUFFICIENT" Да
coverage_status "OK", "DEGRADED", "UNAVAILABLE", "DISAGREEMENT", "SKIPPED" Да
status_drivers StatusDriversResponse Да
result_final boolean Да
verification_final boolean Да
risk_final boolean Да
risk_retryable boolean Да
risk_retry_after_seconds integer / null Да
retryable boolean Да
retry_after_seconds integer / null Да
recommended_action "PROCEED", "CONFIRM_INTERNAL_STATE", "MANUAL_REVIEW", "RECHECK_LATER", "NOT_EXECUTED", "HOLD_AND_ESCALATE" Да
integrity IntegrityResponse Да
risk RiskSummaryResponse Да
evidence_items EvidenceItemResponse[] Да
coverage_limitations CoverageLimitationsResponse Да
obligation ObligationSummaryResponse / null Нет
reuse ReuseResponse / null Нет

TransactionReport

Поле Тип / значения Обязательно
role "BUYER", "SELLER" Да
action "APPROVE_TERMS", "TRANSFER_FUNDS", "CONFIRM_FUNDING", "MARK_DELIVERED", "RELEASE", "REFUND", "CLAIM_REFUND", "CLAIM_RELEASE", "DISPUTE", "PROPOSE_SETTLEMENT", "WITHDRAW", "EXPIRE", "SWEEP_EXCESS" Да
txid string Да

TransactionView

Поле Тип / значения Обязательно
purpose string Да
txid string Да
status string Да
signer_role string Да
block_number integer / null Да
confirmed_at string / null Да

TransferResponse

Поле Тип / значения Обязательно
index integer Да
asset_type string Да
sender string / null Да
recipient string / null Да
token_contract string / null Да
token_id string / null Да
token_symbol string / null Да
decimals integer / null Да
amount string / null Да
event_ref string / null Нет
execution_status "success", "failed", "unknown" Нет

UsageBalanceResponse

Поле Тип / значения Обязательно
granted integer Да
used integer Да
reserved integer Да
available integer Да

UsageBalancesResponse

Поле Тип / значения Обязательно
included UsageBalanceResponse Да
extra UsageExtraBalanceResponse Да
total_available integer Да
computed_at string Да

UsageExtraBalanceResponse

Поле Тип / значения Обязательно
granted integer Да
used integer Да
reserved integer Да
available integer Да
expires_at string / null Да

UsageLimitsResponse

Поле Тип / значения Обязательно
rate_limit_per_minute integer Да
max_concurrent_requests integer Да
enabled_networks string[] Да

UsagePeriodResponse

Поле Тип / значения Обязательно
start string Да
end string Да
used integer Да
reserved integer Да
limit integer Да
remaining integer Да

UsagePlanResponse

Поле Тип / значения Обязательно
code string Да
version integer Да
name string Да

UsageRecentResponse

Поле Тип / значения Обязательно
days integer Да
requests integer Да
billable integer Да
limited_data integer Да
errors integer Да
average_latency_ms integer / null Да
by_network object Да
by_overall_state object Да
by_kind object Нет

UsageResponse

Поле Тип / значения Обязательно
tenant_id string Да
environment "live", "sandbox" Нет
plan UsagePlanResponse / null Да
limits UsageLimitsResponse Да
period UsagePeriodResponse Да
balances UsageBalancesResponse Да
subscription UsageSubscriptionResponse Да
recent UsageRecentResponse Да

UsageSubscriptionResponse

Поле Тип / значения Обязательно
status "legacy", "active", "scheduled", "lapsed", "none" Да
plan_code string / null Да
plan_version integer / null Да
period_start string / null Да
period_end string / null Да
next_period_start string / null Нет
renewal "manual" Нет
cancel_at_period_end boolean Нет

VersionsResponse

Поле Тип / значения Обязательно
decision string Да
rules object Да
reason_codes string Да
evidence_schema string Да
contract string Да

WalletAddressSecurityResponse

Поле Тип / значения Обязательно
denylisted boolean / null Да
denylist_category string / null Да
provider_flagged boolean / null Да
provider_flags string[] Да
issuer_blocked boolean / null Да
issuer_blocked_symbols string[] Да

WalletBehaviourResponse

Поле Тип / значения Обязательно
is_contract boolean / null Да
contract_verified boolean / null Да
transaction_count integer / null Да
transaction_count_limited boolean Да
wallet_age_days integer / null Да
first_activity_at string / null Да
last_activity_at string / null Да
counterparties_count integer / null Да

WalletCheckDetails

Поле Тип / значения Обязательно
schema_version "0.1" Нет
overall_state "CLEAR", "REVIEW", "HIGH_RISK", "LIMITED_DATA" Да
data_coverage "FULL", "PARTIAL", "INSUFFICIENT" Да
coverage_scope "supported_deep_sources" Нет
modules ModuleStatusResponse[] Да
sanctions WalletSanctionsResponse Да
address_security WalletAddressSecurityResponse Да
behaviour WalletBehaviourResponse Да
counterparties WalletCounterpartiesResponse Да
token_authenticity WalletTokenAuthenticityResponse Да
freshness WalletFreshnessResponse Да
source_coverage object Да
universal_clearance false Нет
reasons WalletReasonResponse[] Да
limitations string[] Да
evidence WalletEvidenceResponse Да

WalletCheckRequest

Поле Тип / значения Обязательно
address string Да
network "tron", "eth", "ton" / null Нет

WalletCheckResponse

Поле Тип / значения Обязательно
request_id string Да
address string Да
network "tron", "eth", "ton" Да
state "clear", "review", "high_risk", "limited_data" Да
coverage "complete", "partial" Да
reason_codes string[] Да
environment "live", "sandbox" Нет
details WalletCheckDetails Да

WalletCounterpartiesResponse

Поле Тип / значения Обязательно
screened integer Да
unverified integer Да
flagged integer Да

WalletEvidenceResponse

Поле Тип / значения Обязательно
live boolean Да
source "live", "sandbox" Да

WalletFreshnessResponse

Поле Тип / значения Обязательно
checked_at string Да
analyzed_at string / null Да
served_from_analysis_cache boolean Да
oldest_source_age_seconds integer / null Да

WalletReasonResponse

Поле Тип / значения Обязательно
code string Да
category "sanctions", "risk", "address", "token", "counterparties", "behaviour", "coverage" Да
severity "info", "warning", "high", "critical" Да

WalletSanctionsResponse

Поле Тип / значения Обязательно
direct_match boolean / null Да
authorities string[] Да
attributed boolean Да
indirect_exposure boolean / null Да
exposure_source "aml_provider" / null Да

WalletTokenAuthenticityResponse

Поле Тип / значения Обязательно
total integer Да
official integer Да
fake integer Да
suspicious integer Да
unknown integer Да

WebhookRequest

Поле Тип / значения Обязательно
url string Да

WebhookResponse

Поле Тип / значения Обязательно
url string / null Да
status string / null Да
secret string / null Нет
consecutive_failures integer Нет

Изменения и версии

2026-10-15: исправления, политика та же

Контракт остаётся 0.3, политика — b2b-tx-2026-10.4. Сохранённые ответы воспроизводятся без изменений.

  • Обрезанные списки переводов TRON. Если у обоих источников переводов больше, чем читает ChainZap (100), списки больше не сравниваются построчно: у каждого источника свои первые строки. Список, обрезанный только у одного источника, по-прежнему считается расхождением. Пробел остаётся TRANSFERS_TRUNCATED, поэтому такая проверка может стать окончательной как LIMITED_DATA, а не просить повтора бесконечно.
  • Права провайдеров. Источник без записи о правах или с правами только для внутреннего использования не показывает ни собственную ссылку в доказательствах, ни собственные поля экспозиции. Ни один текущий ответ не меняется.
  • Примеры. Источники списков в примерах выглядят как в живом ответе, включая un и свежесть проверенного списка; пример в справочнике содержит объект reuse, как у записанной проверки.
  • Документация. Какие ошибки sandbox содержат environment; какие расхождения дают transaction_status INSUFFICIENT; CONFIRM_INTERNAL_STATE закрывает выплату только при MATCH, а выплата получает PROCEED, только если в проверке есть external_reference обязательства (или customer_context.credit_status: "NOT_CREDITED"); ATTEMPT_MAY_STILL_LAND требует direction: "OUTGOING" в запросе; spend_cap сообщается и тогда, когда расход нельзя учесть; коды сравнения не выдаются, пока transaction_status равен PENDING, а проверка, в которой источники расходятся в самой транзакции, не окончательна, но может их содержать.

2026-10-14: уточнения справочника, политика та же

Контракт остаётся 0.3, политика — b2b-tx-2026-10.4; правила решения не менялись.

  • Коды ошибок. Описание POST /v1/transaction/check в OpenAPI теперь перечисляет все коды ошибок, которые может вернуть проверка: ledger_not_enabled (403), instruction_conflict, instruction_version_required и attempt_conflict (409), invalid_amount_tolerance и invalid_reference (422). Сами коды и их значение не изменились; см. ошибки.
  • Примеры. Пример ответа в справочнике показывает оба источника цепочки и AML-источник с теми статусами, которые сообщает живой ответ, по одному элементу доказательств на источник и те причины, которые даёт живой ответ. Время во всех примерах записано так же, как его возвращает API (…Z).
  • Документация. risk_final равен false, пока транзакция ожидает подтверждений или не найдена, при любом risk_status. При MANUAL_REVIEW поле status_drivers.action называет одну находку: TX_REVERTED у неуспешной транзакции, иначе самую серьёзную, причём при равной серьёзности пробел в данных о риске или сигнал риска идёт раньше сравнения платежа. Сравнение платежа смотрите в status_drivers.integrity. У AML-источника checked_freshness_unknown — обычный статус выполненной проверки.

2026-10-14: политика b2b-tx-2026-10.4

Правило integrity int-v3. Контракт остаётся 0.3; сохранённые ответы воспроизводятся без изменений по той политике, с которой были даны.

  • Pending не сравнивается. Пока транзакция ожидает подтверждения (transaction_status: PENDING), причины EXPECTED_*_MISMATCH не сообщаются — integrity уже NOT_EVALUATED, флаги сравнения null. Отличающиеся условия сообщаются, когда транзакция становится окончательной.
  • Не платите повторно. ATTEMPT_MAY_STILL_LAND (проверка с direction: "OUTGOING", транзакция которой не найдена) всегда остаётся в коротком списке reasons, что бы ещё ни было найдено.
  • Документация. У каждой организации есть суточный предел расходов на платные источники, а spend_cap / daily_cap обнуляются в 00:00 UTC; суточный предел проверок без списания по умолчанию 500; заголовки квоты учитывают текущую проверку, а повторы их не содержат; признак sandbox у /v1/transaction/check — environment; фикстура неуспешной транзакции списывается; в 0.3 решайте по осям, а не по overall_state; как выплате получить PROCEED; везде expected_token; описания HTTP-статусов в справочнике не привязаны к методу и включают 413 и 415.

2026-10-14: исправления без смены контракта

Контракт остаётся 0.3, политика b2b-tx-2026-10.3; ни одно правило решения не изменилось. Сохранённые ответы воспроизводятся без изменений.

  • Проверка кошелька. address_security.provider_flagged сообщает, отметил ли адрес провайдер безопасности адресов (null, если он не ответил). Собственные метки провайдера больше не возвращаются: устаревшее provider_flags равно ["PROVIDER_SECURITY_FLAG"] или пусто. Если права провайдера не позволяют ChainZap показывать отметку, она равна null с ограничением address_security_provider_withheld. Состояние и причины не меняются.
  • Время в TRON. transaction_at, effective_at в evidence и, для платежей, которые ledger записывает с этого момента, время платежа — это время блока, а не метка времени, которую отправитель записал в транзакцию. Уже записанные платежи сохраняют первоначальное время. У транзакции, ещё не попавшей в блок, transaction_at: null.
  • Источники TRON. Два источника, перечисляющие одни и те же переводы в разном порядке, больше не считаются расхождением.
  • Ledger. Reversal дожидается проверки того же платежа и никогда ею не отменяется; при конкуренции он отвечает 504 request_timeout с Retry-After, ничего не сохраняя. Операции ledger теперь перечисляют этот 504.
  • Контракт. /v1/openapi.json теперь совпадает с опубликованным контрактом, а GET /v1/batches/{batch_id}/export.csv описан только как CSV.
  • Пакеты. Руководство теперь говорит, что строка с пробелом только в оценке риска получает DONE с risk_retryable: true.
  • Права провайдеров. Строка экспозиции из источника без записи о правах не показывает ни одного собственного поля этого источника.

2026-10-10: исправление окончательности в контракте 0.3

Политика b2b-tx-2026-10.3 разделяет verification платежа и risk/KYT. verification_final и его алиас result_final описывают verification; risk_final, risk_retryable и risk_retry_after_seconds описывают оценку риска. Окончательное совпадение остаётся MATCH при недоступном KYT с risk_status: INSUFFICIENT и MANUAL_REVIEW. Pending теперь возвращает NOT_EVALUATED для integrity и каждого запрошенного сравнения, флаги сравнения — null. retryable относится только к новой verification. Обновите клиентов, использовавших его как общий флаг verification/KYT.

Версия контракта остаётся 0.3. Сохранённые ответы и решения сохраняют исходную политику и смысл; новое наблюдение с новым ключом использует исправленную политику. У исторических решений отдельные поля окончательности равны null. Quickstart использует канонический endpoint; примеры ответов формирует тот же движок, что и рабочие проверки.

5 октября 2026: контракт 0.3

Ответы POST /v1/transaction/check содержат schema_version: "0.3" и формируются по политике b2b-tx-2026-10.2. Каждое поле 0.2 сохраняет свой смысл; всё перечисленное ниже добавлено.

  • Оси статусов. transaction_status, integrity_status, risk_status и coverage_status вместе с status_drivers, result_final, retryable, retry_after_seconds и recommended_action. См. оси статусов.
  • Структурированное сравнение. integrity со сравнениями по каждому полю в comparisons, выбранным event_ref и числом подходящих переводов; transfers[].event_ref и execution_status; expected_sender и amount_tolerance в запросе. Несколько переводов получателю добавляют ADDITIONAL_RELEVANT_TRANSFERS или SPLIT_WITHIN_TX. См. сравнение платежа.
  • Доказательства и версии. evidence_items, coverage_limitations (runtime, product), risk с его driver и доказательствами, grade в каждой строке key_exposure и versions.
  • Реестр обязательств. external_reference, instruction_version, instruction_effective_at, approval_reference, attempt_reference, direction, workflow_type и customer_context (credit_status, allocation_status) в запросе, obligation и reuse в ответе, а также методы /v1/obligations (с POST /v1/obligations/lookup, чтобы ни один URL не содержал референс), /v1/allocations и /v1/decisions. См. обязательства и решения.
  • Пакеты. /v1/batches проверяет CSV-файл до 200 платежей с бесплатным preflight и оценкой стоимости, а в кабинете разработчика появилась страница «Пакеты». См. пакетную проверку.
  • Политика exposure b2b-exp-v2. Категория провайдера, которую ChainZap не распознаёт, оценивается как другие категории риска и называется в ответе (UNRECOGNIZED_PROVIDER_LABEL), а не игнорируется.
  • Идентификатор решения. decision_id идентифицирует ответ; request_id остаётся вашим.
  • Исправления. Перевод в транзакции, завершившейся ошибкой, больше не считается совпадением: его поля *_match равны null, а транзакция с ошибкой, в которой ничего не выполнилось, получает NOT_EVALUATED с NOT_EXECUTED. Краткий список причин сохраняет причины сравнения и клиентского контекста и никогда не превышает пяти. Если источники Ethereum расходятся в том, существует ли транзакция и каков её статус, она остаётся INSUFFICIENT.
  • Sandbox. Первый символ d теперь означает транзакцию, завершившуюся ошибкой; c и f по-прежнему дают CLEAR.
  • Уточнения того же дня. Транзакция, завершившаяся ошибкой, в которой перевод всё же выполнился, получает integrity_status: INSUFFICIENT, а не MATCH. Проверка без direction берёт его из обязательства или из workflow_type, а платёж с неизвестным направлением никогда не получает PROCEED. Несколько неразличимых переводов получателю всегда называют AMBIGUOUS_TRANSFER. Проверка, указывающая attempt_reference, записанный с другой транзакцией, отклоняется с 409 attempt_conflict. У чтения реестра своя квота частоты. Строка exposure, долю которой её источник не разрешает показывать, содержит percent: null.

POST /v1/check возвращает ту же оценку в details. Ключи идемпотентности, использованные до этого изменения, продолжают возвращать сохранённые ответы 0.2.

3 октября 2026: контракт 0.2

Ответы POST /v1/transaction/check содержат schema_version: "0.2" и policy_version — политику принятия решений, по которой сформирован ответ. Что изменилось в этой политике:

  • Exposure по данным провайдера влияет на состояние в зависимости от числа шагов и доли, а не от самого факта наличия: sanctions exposure даёт HIGH_RISK только на расстоянии не дальше 1 шага и при доле не меньше 5%, REVIEW — когда нужна проверка, а в остальных случаях SANCTIONS_EXPOSURE_MINOR; прочие категории дают REVIEW только на расстоянии до 2 шагов при доле не меньше 1% или неизвестной доле, а также при hacking event (иначе RISK_EXPOSURE_MINOR). Каждая строка остаётся в key_exposure. См. полноту данных.
  • Санкционный список, вышедший за своё окно актуальности, даёт SANCTIONS_DATA_STALE и LIMITED_DATA; список UN имеет статус not_applicable.
  • Списываются только окончательные ответы: транзакция, ожидающая подтверждения, бесплатна.
  • Краткий список причин всегда сохраняет причину, которая определила состояние, и каждую причину EXPECTED_*.
  • expected_amount с нулями за пределами decimals токена принимается.
  • Слишком большое тело запроса получает ответ 413 payload_too_large вместо 422.
  • Организации пилота должны передавать все три поля expected_* (422 expected_fields_required) для официального USDT в TRON (422 token_not_enabled); проверки кошельков в пилот не входят (403 check_kind_not_enabled).
  • Первый hex-символ e в sandbox теперь означает транзакцию, ожидающую подтверждения, а sandbox больше не утверждает, что выбирает сеть по форме хеша.

Ключи идемпотентности, использованные до этого изменения, возвращают 409 idempotency_conflict.

2 октября 2026: оплата через OxaPay

Тарифы и дополнительные проверки оплачиваются криптовалютой через OxaPay: заказ ведёт на страницу оплаты OxaPay на точную сумму в долларах США. Crypto Pay и прямые переводы в TON больше не предлагаются; история заказов, оформленных с ними, сохраняется. Окно оформления больше не спрашивает актив. См. планы и оплату.

23 сентября 2026: нейтральные имена источников

Каждый источник данных в ответе проверки теперь называется по своей роли, а не по имени поставщика. В source_coverage.risk_sources лежит aml_provider; ключи transaction_sources — chain_explorer, chain_node и chain_node_secondary; в source_coverage проверки кошелька используются aml_provider и address_security_provider, sanctions.exposure_source равно aml_provider, а AML-ограничения называются aml_provider_unavailable и aml_provider_skipped_dominant_local_hit. Словари статусов, состояния и коды причин не изменились. Интеграции, которые опирались на прежние имена источников с названием поставщика, должны читать источники по роли: те имена больше не возвращаются.

21 сентября 2026: проверки кошельков

POST /v1/wallet/check проверяет один адрес кошелька с теми же ключом, квотой и правилами идемпотентности, что и проверка транзакции. Сеть определяется по формату адреса. Ответ содержит состояние, уровень покрытия и коды причин с фактами по каждому модулю; числовой балл не публикуется. Проверка кошелька списывается, когда получено состояние; limited_data бесплатно. GET /v1/usage добавляет recent.by_kind. В песочнице появились закреплённые фикстуры кошельков, а в консоли API режим кошелька. См. проверку кошелька.

10 сентября 2026: самостоятельный вход

Войти в кабинет разработчика можно через аккаунт Google: организация создаётся автоматически, а первый участник становится её владельцем. Код приглашения необязателен и нужен только для входа в существующую организацию. Проверки TRON и TON mainnet доступны новым организациям сразу; проверки Ethereum подключает поддержка. Тарифы и дополнительные проверки покупаются на странице «Тариф и оплата».

8 сентября 2026: бета-цены, покупки и sandbox

GET /v1/catalog публикует планы BETA_PRICING_V0. В GET /v1/usage добавлены balances, subscription и environment; смысл period.remaining не изменился. В ответах проверки появились environment и заголовок X-Quota-Available. Планы и пакеты дополнительных проверок покупаются в кабинете разработчика через Crypto Pay или прямой перевод в сети TON, продление ручное; см. планы и оплату. Sandbox-ключи (cz_test_) возвращают детерминированные тестовые результаты без вызовов провайдеров; см. sandbox. Покупать могут владелец, администраторы и участники с ролью billing.

7 сентября 2026: три сети и более простая проверка

POST /v1/check принимает хеш транзакции; сеть можно указать дополнительно. Метод осторожно определяет сеть, возвращает краткую оценку и полные данные в details. Для TRON, Ethereum mainnet и TON mainnet действуют отдельные правила получения фактов и окончательного подтверждения. Исходный метод проверки и метод статистики сохраняют общие лимиты организации и правила идемпотентности.

Перевод стоимости в контракте TON, назначение которого не удалось установить, теперь даёт частичное покрытие, в том числе когда другие переводы распознаны или факты взяты из кеша. Известные высокие риски остаются в ответе.

Проверки Ethereum подключает поддержка для конкретной организации после приёмки на реальных источниках; текущее состояние адаптеров показывает состояние сервиса.

Версия 1.0.0

Проверка транзакций TRON и статистика организации. Кабинет разработчика даёт управление API-ключами, сведения о плане и страницу «Тестовый запрос» для запросов от имени организации.

Ethereum и TON принимаются схемой; их адаптеры требуют отдельного включения и приёмки на реальных источниках. В эту версию не входят API проверки кошельков, вебхуки, мониторинг и выполнение платежей.

Развитие контракта

Публичные методы начинаются с /v1, документация находится в /docs/v1/. Скачиваемый OpenAPI генерируется из тех же моделей запросов и ответов, что использует API, и сверяется со снимком в репозитории при сборке.

Допускайте появление дополнительных полей ответа, но проверяйте те поля, которые использует ваша интеграция. Неизвестный код причины не означает чистый результат. Несовместимые изменения потребуют версионированной инструкции перехода; ссылки на документацию текущей основной версии сохраняются.

Состояние сервиса и поддержка

Статус доступа

Публичный индикатор сообщает, включён ли доступ к рабочему API. Он не выполняет проверку провайдеров в реальном времени и не гарантирует бесперебойную работу. Доступная сеть описывает поддерживаемую функциональность; у отдельной организации доступ может быть у́же.

Ответ 503 api_disabled означает, что проверки ещё не включены или намеренно приостановлены. Ответ 503 provider_unavailable означает, что для этого запроса не удалось получить необходимые данные транзакции. Сохраните идентификатор запроса и следуйте правилам повторов.

Как связаться

Напишите команде ChainZap, чтобы подключить Ethereum, обсудить условия тарифа Scale, разобрать инцидент или получить помощь. Укажите X-Request-ID, публичный код ошибки и время по UTC. Никогда не отправляйте API-ключи, токены входа или полные данные транзакций и провайдеров.

Сети: TRON mainnet доступен всем организациям и составляет область пилота с дизайн-партнёрами (USDT TRC-20). TON mainnet работает в режиме предварительного доступа: он отвечает, но проверка TON по исполненной транзакции сейчас возвращает LIMITED_DATA (не списывается), потому что ни в одном настроенном санкционном списке нет адресов TON, и в пилот он не входит. Ethereum реализован и подключается для организации поддержкой. /status.json показывает включение адаптеров отдельно от общего доступа к API и не опрашивает провайдеров в реальном времени.

Доступ к API

Загрузка…

Обзор