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 --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 — отдельный сокращённый ответ.
Сравните с данными платежа
{
"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 --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\"}"
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);
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
$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
{
"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 --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. Одна логическая операция, один ключ.
Примеры для сервера
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"])
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
{
"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. Не помещайте в них персональные данные.
Проверка по обязательству
Добавьте референс обязательства в обычную проверку транзакции:
{
"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 --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 --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" или арбитр по умолчанию из политики), его вознаграждение в единицах токена и окно после открытия спора:
{
"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, а также ключом покупателя или продавца сделки.
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 и говорит, что означают молчание и спор. Вот его строки для сделки с арбитром, а затем без него:
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} вашим секретом |
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 --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 --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 --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 --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 сохраняйте в своём журнале операций до первой попытки. После перезапуска процесса используйте оба значения повторно.
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.
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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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; прежний ключ возвращает сохранённый ответ по исходной политике.
Справочник ошибок
Формат ответа
{"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 | Истекло время обработки запроса на сервере. |
GET /v1/escrow-deals/{ref}/consent
Получить точный текст, который подписывает каждая сторона, или передать подпись стороны.
| 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 |
Да |
Links
| Поле | Тип / значения | Обязательно |
|---|---|---|
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_statusINSUFFICIENT;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 и не опрашивает провайдеров в реальном времени.
Загрузка…