Skip to content
Translated page. The English version is the source of truth.

POST /apiv2/screening ​

Заказ AML-проверки блокчейн-адреса: единая структура ответа для каждого провайдера и любого состояния заказа, десятичные числа в виде строк и единый формат ошибок.

URL эндпоинта ​

POST https://netts.io/apiv2/screening

Заголовки запроса ​

HeaderRequiredDescription
Content-TypeДаapplication/json
X-API-KEYДаВаш API-ключ из панели управления Netts
X-Idempotency-KeyНетВаш собственный ключ для безопасных повторных запросов. См. Идемпотентность

Тело запроса ​

json
{
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic",
    "wait_for_result": true
}

Параметры ​

ParameterTypeRequiredDescription
addressstringДаПроверяемый адрес, от 10 до 128 символов
networkstringДаТикер сети. Тикеры, поддерживаемые каждым провайдером, возвращаются методом GET /apiv2/screening/providers
providerstringДаelliptic или bitok. Значения по умолчанию нет
wait_for_resultbooleanНетtrue ожидает результат до 15 секунд. По умолчанию false
languagestringНетЯзык отчета. Только en

Неизвестные поля отклоняются. Тело запроса, содержащее поле, отсутствующее в таблице выше, возвращает 400 с кодом 4001.

Поле provider обязательно и не имеет значения по умолчанию. Вы всегда сами выбираете провайдера, которого оплачиваете.

В схеме provider является произвольной строкой, а не перечислением. На сегодняшний день принимаются два значения; добавление третьего провайдера не должно ломать интеграцию тех, кто валидирует ответы по схеме. Актуальный список, поддерживаемые каждым провайдером сети и используемые шкалы оценок возвращаются методом GET /apiv2/screening/providers.

Примеры ​

cURL — ожидание результата ​

bash
curl -X POST https://netts.io/apiv2/screening \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key" \
  -d '{
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic",
    "wait_for_result": true
  }'

cURL — подтверждение приема и опрос статуса ​

bash
curl -X POST https://netts.io/apiv2/screening \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key" \
  -d '{
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "bitok"
  }'

Ответ — 202 Accepted с заголовком Location, указывающим на заказ.

Python ​

python
import requests
from decimal import Decimal

url = "https://netts.io/apiv2/screening"
headers = {
    "Content-Type": "application/json",
    "X-API-KEY": "your_api_key",
}
payload = {
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic",
    "wait_for_result": True,
}

response = requests.post(url, headers=headers, json=payload)

if response.status_code in (200, 202):
    body = response.json()
    print("Order:", body["order"]["client_order_id"])
    print("Status:", body["order"]["status"])
    if body["risk"]["score"] is not None:
        # Parse provider numbers as Decimal, never as float
        print("Score:", Decimal(body["risk"]["score"]), "of", body["risk"]["scale"]["max"])
    print("Level:", body["risk"]["level"], "-", body["risk"]["level_source"])
    print("Charged:", body["billing"]["charged_amount"], body["billing"]["charged_currency"])
else:
    problem = response.json()
    print(problem["code"], problem["title"], "-", problem["detail"])

Коды ответа ​

SituationCodeHeaders
Заказ создан, проверка выполняется в фоне202 AcceptedLocation: /apiv2/screening/{client_order_id}
Результат возвращен в ответе (wait_for_result)200 OK—
Использован результат недавней проверки, списание не производилось200 OK—
У адреса нет активности в блокчейне, списание не производилось200 OK—
Ошибкасм. ОшибкиContent-Type: application/problem+json

Ответы, содержащие результат проверки, отправляются с заголовком Cache-Control: private, no-store.

Ответ ​

json
{
  "schema_version": 2,
  "order": {
    "client_order_id": "A90D21F68C9AEA2",
    "status": "completed",
    "api_version": "v2",
    "cache_hit": false,
    "created_at": "2026-09-13T08:14:29.614988Z",
    "started_at": "2026-09-13T08:14:30.288251Z",
    "completed_at": "2026-09-13T08:14:34.993174Z"
  },
  "request": {
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic"
  },
  "billing": {
    "charged": true,
    "price_usdt": "0.98",
    "base_amount": "2.882421",
    "markup_amount": "0",
    "charged_amount": "2.882421",
    "charged_currency": "TRX",
    "exchange_rate": "0.33999200",
    "payment_status": "pending"
  },
  "precheck": {
    "activity_checked": true,
    "activity_status": "active",
    "source": "tron-address-checker"
  },
  "check": {
    "provider": "elliptic",
    "provider_check_id": "b4903a5d-9f22-4075-b51b-beb40b419b97",
    "checked_at": "2026-09-13T08:14:32.144000Z",
    "status": "completed",
    "provider_status": "complete"
  },
  "risk": {
    "score": "0.9634087310611608",
    "scale": { "min": 0, "max": 10 },
    "level": "low",
    "level_source": "computed",
    "provider_level": null,
    "policy": "netts-risk-v1",
    "by_direction": {
      "source": "0.12332156899576921",
      "destination": "0.9634087310611608"
    }
  },
  "sanctions": {
    "self": false,
    "self_entities": null,
    "exposure": {
      "entity": "HTX (formerly Huobi) - Post-Sanctions - UK Sanctions List - 26 May 2026",
      "category": "Exchange",
      "share_fraction": "0.004409451392423414",
      "proximity": "indirect",
      "hops": 3,
      "direction": "source",
      "rule_name": "Sanctioned, TF & CSAM"
    },
    "items": []
  },
  "exposure": [
    {
      "category": "Exchange",
      "share_fraction": "0.1888065152442461",
      "direction": "source",
      "hops": 2,
      "is_screened_address": false,
      "entities": [
        { "name": "Binance", "category": "Exchange", "is_vasp": true,
          "is_primary": true, "is_after_sanction_date": null }
      ]
    }
  ],
  "rules": [
    { "name": "Sanctioned, TF & CSAM", "type": "exposure", "level": null,
      "score": "0.061426483114820525", "share_fraction": null, "category": null,
      "proximity": null, "direction": "source", "detected_at": null }
  ],
  "entities": [
    { "name": "Unknown", "category": "Unknown", "is_vasp": null,
      "is_primary": true, "is_after_sanction_date": false }
  ],
  "primary_entity": {
    "name": "Unknown", "category": "Unknown", "is_vasp": null,
    "is_primary": true, "is_after_sanction_date": false
  },
  "sanctioned_entities": [],
  "wallet": {
    "inflow_usd": "354663.6116669158",
    "outflow_usd": "80248.63081808022"
  },
  "provider_data": { }
}

Набор полей никогда не меняется ​

Каждый перечисленный выше блок присутствует в каждом ответе, независимо от провайдера и состояния заказа. То, что провайдер не предоставляет, возвращается как null; пустой список передается как [], а не null; блок, в котором пока нет данных, заполняется значениями null, а не опускается. Единый парсер способен обработать как только что принятую проверку, так и ту же проверку после ее завершения.

Два правила для вашего кода:

  • игнорируйте неизвестные вам поля. Новые поля добавляются в эти блоки без выпуска новой версии. Отклонение неизвестного поля является ошибкой на вашей стороне;
  • provider_data не является частью контракта. Структура этого объекта зависит от провайдера и меняется вместе с ним. Все гарантии контракта распространяются исключительно на вышеперечисленные блоки.

order ​

FieldTypeDescription
client_order_idstringИдентификатор заказа, используемый для последующего получения результата
statusstringpending, processing, completed, skipped, failed
api_versionstringВерсия контракта, создавшего заказ
cache_hitbooleantrue, если был повторно использован недавний результат и списание не производилось
created_atstringRFC 3339, UTC, микросекунды
started_atstring | nullВремя запуска запроса к провайдеру. null для skipped
completed_atstring | nullВремя получения результата
errorstringТолько для failed: причина ошибки
reasonstringТолько для skipped: address_inactive

Все временные метки указаны в UTC по стандарту RFC 3339 с суффиксом Z и точностью до микросекунд.

billing ​

FieldTypeDescription
chargedbooleanБыли ли списаны средства
price_usdtstringБазовая цена провайдера в USDT
base_amountstringСтоимость заказа в валюте списания без наценки субаккаунта
markup_amountstringНаценка субаккаунта. "0" для прямого аккаунта
charged_amountstringСумма, фактически списанная с баланса
charged_currencystringTRX
exchange_ratestring | nullКурс, использованный для конвертации
payment_statusstringpaid, pending, failed, not_charged, postpaid

payment_status имеет значение pending в течение короткого времени после успешной проверки: списание сначала холдируется и подтверждается в течение часа. failed означает, что средства были возвращены. not_charged означает, что списание не создавалось (повторно использованный результат или неактивный адрес). postpaid — см. Постоплатные аккаунты.

precheck ​

Перед платной проверкой адрес проверяется на наличие активности в блокчейне. Адрес без активности не отправляется провайдеру и не тарифицируется.

FieldTypeDescription
activity_checkedbooleanВыполнялась ли предварительная проверка. false в сетях, где она не поддерживается
activity_statusstringactive, inactive, unknown
sourcestring | nullНазвание сервиса или механизма проверки

Значение unknown не отменяет платную проверку: если сервис проверки активности недоступен, адрес считается активным.

check ​

FieldTypeDescription
providerstringПровайдер, выполнивший проверку
provider_check_idstring | nullСобственный идентификатор проверки провайдера — укажите его при оспаривании результата с ним
checked_atstring | nullВремя формирования результата провайдером
statusstringСм. таблицу ниже
provider_statusstring | nullИсходный статус провайдера без изменений
order.statuscheck.statusMeaning
pendingpendingЗаказ принят, еще не запущен
processingrunningПровайдер обрабатывает запрос
completedcompletedРезультат получен
failedfailedОшибка до вызова или во время вызова провайдера
skippednot_performedУ адреса нет активности; провайдер не вызывался, средства не списывались

risk ​

FieldTypeDescription
scorestring | nullСобственная оценка провайдера в виде десятичной строки
scaleobjectmin и max шкалы данного провайдера
levelstringnone, low, medium, high, severe
level_sourcestringcomputed — уровень рассчитан нами по оценке; provider — передан провайдером напрямую
provider_levelstring | nullИсходное обозначение уровня от провайдера, если оно возвращается
policystringНазвание политики пороговых значений, netts-risk-v1
by_directionobjectОценка с разделением на source и destination, если поддерживается провайдером

Оценка риска никогда не пересчитывается в другую шкалу. Elliptic использует диапазон 0–10, а BitOK — 0–1, и 7 баллов по одной шкале ни в каком смысле не эквивалентны 0.7 по другой. Шкала передается в ответе, чтобы интеграция, разработанная для одного провайдера, не интерпретировала некорректно данные другого после изменения конфигурации.

Уровень риска приведен к единой терминологии во всем API. Если провайдер возвращает собственный уровень, мы передаем его без изменений и указываем это в level_source; если нет — мы рассчитываем уровень на основе оценки по порогам netts-risk-v1 и указываем соответствующий источник. Одно и то же обозначение используется в ответе API, панели управления и PDF-отчете для одной и той же проверки.

exposure[], rules[], entities[] ​

exposure[] содержит детализацию средств по категориям контрагентов. rules[] перечисляет сработавшие правила провайдера. entities[] указывает сущности, к которым принадлежит сам адрес; primary_entity выбирает одну из них по фиксированному правилу — сущность, которую провайдер отметил как основную, в противном случае первую из них, иначе null. sanctioned_entities[] содержит те сущности из entities[], которые помечены как активные после даты введения санкций.

Доли выражаются дробями, а не процентами ​

Каждая доля в ответе представлена единым полем share_fraction — десятичной строкой в диапазоне от "0" до "1".

text
Elliptic reports 31.574732212596924 %  ->  "share_fraction": "0.31574732212596924"
BitOK reports    0.8488                ->  "share_fraction": "0.8488"

Провайдеры используют разные единицы измерения: одна и та же треть объема связей возвращается как 31.57 у одного и 0.3157 у другого. Единое поле, содержащее оба варианта, было бы невозможно разобрать без знания провайдера. Исходное число провайдера в его оригинальных единицах сохраняется в provider_data.

Числа передаются в виде строк ​

Каждое число, поступающее от провайдера (оценки, доли, объемы в USD), а также каждая сумма в блоке billing, передаются в виде десятичной строки.

json
"score": "0.9634087310611608"

Парсинг этого значения как числа JSON в JavaScript, Go или любом другом языке с двоичной плавающей точкой приводит к неточностям, и отображаемое значение перестает совпадать с данными провайдера. Обрабатывайте эти поля с помощью десятичных типов: Decimal в Python, BigDecimal в Java, decimal.Decimal или обычная строка в JavaScript.

Собственные поля системы (scale.min, scale.max, hops) передаются как обычные числа JSON.

Повторное использование недавнего результата ​

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

Каждый запрос по-прежнему создает отдельный заказ со своим client_order_id; в повторно использованном ответе выставляется "cache_hit": true, а в блоке billing возвращается "charged": false со статусом "payment_status": "not_charged". Идентификатор исходного заказа, из которого был взят результат, не раскрывается — он может принадлежать другому аккаунту.

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

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

Передавайте заголовок X-Idempotency-Key с собственным значением для обеспечения безопасности повторных запросов: одинаковый ключ с тем же телом запроса вернет сохраненный ответ вместо заказа повторной проверки.

SituationCodeResponse
Первый запрос с этим ключом еще выполняется4094090
Тот же ключ, но другое тело запроса4094093
Тот же ключ и то же тело запроса, выполнение завершеносохраненный кодсохраненный ответ

Если вы не передаете заголовок, ключ генерируется автоматически на основе API-ключа, адреса, провайдера и вашего IP-адреса с окном в две секунды. Это защищает от случайного двойного клика и повтора на уровне шлюза, но не от повторного запроса через минуту: такой запрос будет считаться новым заказом и будет тарифицирован.

Error Responses ​

Каждая ошибка приложения возвращается по стандарту RFC 9457 с заголовком Content-Type: application/problem+json:

json
{
  "type": "https://doc.netts.io/api/v2/errors/insufficient-funds",
  "title": "Insufficient funds",
  "status": 403,
  "detail": "Insufficient funds. Required: 2.888742 TRX, Available: 1.203000 TRX",
  "instance": "/apiv2/screening",
  "code": 1004,
  "required_trx": "2.888742",
  "available_trx": "1.203000"
}

Поля type, title, status, detail и instance являются стандартными. Числовой code — расширение: опирайтесь на него при обработке ошибок. Дополнительные поля зависят от типа ошибки и должны игнорироваться, если они вам неизвестны.

CodeHTTPMeaning
4000400Некорректный JSON в теле запроса
4001400Поле не прошло валидацию или передано неизвестное поле
4002403Провайдер недоступен для вашего аккаунта
4003400Некорректный формат идентификатора заказа
4004400Провайдер не поддерживает указанную сеть
4010401API-ключ не передан
4011401API-ключ или IP-адрес отклонен
4040404Заказ не найден
4041404Аккаунт не найден
4090409Запрос с данным ключом идемпотентности еще выполняется
4091409Дублирующийся запрос
4093409Данный ключ идемпотентности был использован с другим телом запроса
1004403Недостаточно средств на балансе
5000500Внутренняя ошибка
5001500Списание средств не удалось
5002500Заказ не был создан
5030503Провайдер временно недоступен

Ошибки другого формата ​

Некоторые сбои происходят на уровне шлюза до того, как запрос достигает приложения, и они возвращаются в формате шлюза. Любой ответ, у которого Content-Type отличается от application/problem+json, следует классифицировать следующим образом:

SituationHTTPBody
API-ключ отсутствует или не принят401{"detail":{"code":-1,"msg":"Invalid or missing API key"}}
Превышен лимит запросов429{"message":"API rate limit exceeded"}
Неизвестный путь или метод не поддерживается маршрутом404 / 405{"detail":"Method Not Allowed"}

Ограничения частоты запросов ​

5 запросов в секунду и 150 в минуту, суммарно для всех эндпоинтов проверок.

Постоплатные аккаунты ​

Аккаунты с постоплатной системой расчетов используют тот же эндпоинт, URL, заголовки и тело запроса, что и остальные. Отличие заключается в механизме оплаты проверки:

  • Средства с депозита не списываются. Стоимость каждой выполненной проверки в долларах США (например, $0.98 для Elliptic) начисляется к задолженности аккаунта в валюте расчетов, зафиксированной в вашем договоре. Оплата производится по счетам в соответствии с условиями договора.
  • Для аккаунта устанавливается кредитный лимит. Пока задолженность находится в пределах лимита, проверки принимаются даже при нулевом депозите.
  • Оплачиваются только успешно завершенные проверки. Проверка с ошибкой, адрес без активности (skipped) и повторно использованный недавний результат бесплатны.

Постоплатная система расчетов подключается командой Netts для аккаунта по запросу.

billing постоплатной проверки ​

json
"billing": {
    "charged": false,
    "price_usdt": "0.98",
    "base_amount": "2.960725",
    "markup_amount": "0",
    "charged_amount": "2.960725",
    "charged_currency": "TRX",
    "exchange_rate": "0.33100000",
    "payment_status": "postpaid"
}
FieldDescription
chargedfalse: с депозита ничего не списывается
price_usdtСтоимость проверки в долларах США. Эта сумма добавляется к задолженности аккаунта
charged_amountТа же стоимость в TRX, для справки
payment_statuspostpaid. Для завершившейся ошибкой или пропущенной проверки — not_charged

Достигнут кредитный лимит (402) ​

json
{
  "type": "https://doc.netts.io/api/v2/errors/credit-limit-reached",
  "title": "Postpaid credit limit reached",
  "status": 402,
  "detail": "Postpaid credit limit reached.",
  "instance": "/apiv2/screening",
  "code": 1004,
  "payment_mode": "postpaid",
  "reason": "limit_reached"
}

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

Коды ошибок постоплаты ​

CodeHTTPDescription
1004402Достигнут кредитный лимит постоплаты
5032503Цена временно недоступна
5034503Биллинг временно недоступен — проверка не принята
5036503Проверка кредитного лимита временно недоступна — повторите попытку позже

При всех указанных выше ответах заказ не создается и списание не начисляется.

Примечания ​

  • Тарификация: фиксированная цена за проверку у каждого провайдера, см. GET /apiv2/screening/providers; списывается с TRX-баланса по курсу на момент списания.
  • Время обработки: большинство проверок завершаются за несколько секунд; проверка адреса с большой историей транзакций может занять до трех минут. Используйте асинхронный режим и запрашивайте результат методом GET /apiv2/screening/{client_order_id}.
  • Неактивные адреса возвращают статус skipped и не тарифицируются.
  • Необработанный ответ провайдера никогда не возвращается. Поле provider_data представляет собой отфильтрованную проекцию; данные, относящиеся к нашему аккаунту у провайдера, а не к проверяемому адресу, никому не раскрываются.

Отчеты ​

Эндпоинт возвращает исключительно JSON. Форматы PDF и Markdown не поддерживаются.

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

Если вам требуется отчет в качестве официального подтверждения для третьей стороны (банка, регулятора, контрагента), учитывайте, что неподписанный PDF-файл не имеет юридической силы независимо от того, кто его создал: его можно отредактировать в текстовом редакторе за минуту. Для верифицируемого документа требуется цифровая подпись или публичная страница проверки подлинности, что представляет собой отдельную функциональность. Если перед вами стоит такая задача, сообщите требования вашего контрагента.

Для тех же самых проверок в панели управления Netts доступны визуальные отчеты в формате PDF на семнадцати языках.

См. также ​