POST /apiv2/aml
Заменен на POST /apiv2/screening
POST /apiv2/screening — это контракт версии 2: единая структура ответа для каждого провайдера и любого состояния заказа, десятичные числа в виде строк вместо чисел JSON, доли в единой шкале и единый формат ошибок. Этот эндпоинт продолжает работать и не будет отключен без предупреждения.
Отправить адрес на AML-проверку (Anti-Money Laundering). Возвращает оценку риска, уровень риска и детальный анализ связей.
Все временные метки в ответе указаны в UTC. Формат строки остался прежним — "2026-09-09 23:01:44", без суффикса часового пояса.
URL эндпоинта
POST https://netts.io/apiv2/amlЗаголовки запроса
| Заголовок | Обязательный | Описание |
|---|---|---|
| Content-Type | Да | application/json |
| X-API-KEY | Да | Ваш API-ключ из панели управления Netts |
Тело запроса
{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": true
}Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| address | string | Да | Блокчейн-адрес для проверки (10-100 символов) |
| network | string | Да | Идентификатор блокчейн-сети (см. Поддерживаемые сети ниже) |
| provider | string | Нет | AML-провайдер: elliptic (по умолчанию) |
| wait | boolean | Нет | Если true, ожидать результат синхронно (до 15 секунд). Если false или не указан, сразу возвращает статус pending и client_order_id — используйте его для периодического запроса результата через GET /apiv2/aml/{order_id} |
| response_format | string | Нет | Уровень детализации ответа: rate (только оценка), full (по умолчанию, полные данные) |
| report_language | string | Нет | Язык отчета: en (по умолчанию) |
Провайдеры
| Провайдер | Диапазон оценок | Описание |
|---|---|---|
elliptic | 0 — 10 | Оценка риска Elliptic. 0 = нет риска, 10 = максимальный риск. null = триггеры не обнаружены |
Примеры запросов
cURL (синхронный)
curl -X POST https://netts.io/apiv2/aml \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key" \
-d '{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": true
}'cURL (асинхронный)
curl -X POST https://netts.io/apiv2/aml \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key" \
-d '{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic"
}'Python
import requests
url = "https://netts.io/apiv2/aml"
headers = {
"Content-Type": "application/json",
"X-API-KEY": "your_api_key",
}
payload = {
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": True
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
if response.status_code == 200:
result = data.get("data", {})
print(f"Order ID: {result.get('client_order_id')}")
print(f"Status: {result.get('status')}")
print(f"Risk Score: {result.get('risk_score')}")
print(f"Risk Level: {result.get('risk_level')}")
print(f"Sanctioned: {result.get('is_sanctioned')}")
else:
print(f"Error: {data}")Ответ
Успешно — В обработке (200 OK)
Когда параметр wait не задан или проверка еще выполняется:
{
"success": true,
"data": {
"client_order_id": "A4C666ABE24BD4A",
"status": "pending",
"address": "T...example...",
"provider": "elliptic",
"price_usdt": 0.98,
"price_trx": 4.136286,
"currency": "TRX",
"message": "AML check order accepted. Use GET /apiv2/aml/A4C666ABE24BD4A to check status."
},
"timestamp": "2026-03-10 09:56:31"
}Успешно — Elliptic завершено (200 OK)
Полный ответ Elliptic со всеми структурами данных:
{
"success": true,
"data": {
"client_order_id": "A019540900E55CA",
"status": "completed",
"address": "T...example...",
"provider": "elliptic",
"report_language": "en",
"risk_score": 0.802904,
"risk_level": "low",
"is_sanctioned": true,
"created_at": "2026-03-10 15:56:28",
"completed_at": "2026-03-10 15:56:28",
"result": {
"risk_score": 0.802904473154148,
"risk_score_detail": {
"source": 0.233206,
"destination": 0.802904
},
"contributions": {
"source": [
{
"entities": [
{
"name": "Capitalist",
"is_vasp": true,
"actor_id": 53979,
"category": "Payment Services Provider",
"entity_id": "b73a9c87-...",
"category_id": "54f55bfe-...",
"is_primary_entity": true
}
],
"indirect_value": { "usd": 40194.03 },
"contribution_value": { "usd": 40194.03 },
"counterparty_value": { "usd": 0 },
"min_number_of_hops": 2,
"indirect_percentage": 31.57,
"is_screened_address": false,
"contribution_percentage": 31.57,
"counterparty_percentage": 0
},
{
"entities": [
{
"name": "KuCoin",
"is_vasp": true,
"actor_id": 11620,
"category": "Exchange",
"entity_id": "e54292da-...",
"category_id": "0a52f7a2-...",
"is_primary_entity": true
}
],
"indirect_value": { "usd": 28436.45 },
"contribution_value": { "usd": 29434.17 },
"counterparty_value": { "usd": 997.72 },
"min_number_of_hops": 1,
"indirect_percentage": 22.34,
"is_screened_address": false,
"contribution_percentage": 23.12,
"counterparty_percentage": 0.78
}
],
"destination": [
{
"entities": [
{
"name": "Bybit",
"is_vasp": true,
"actor_id": 23354,
"category": "Exchange",
"entity_id": "bddde8b7-...",
"category_id": "0a52f7a2-...",
"is_primary_entity": true
}
],
"indirect_value": { "usd": 26333.43 },
"contribution_value": { "usd": 27458.30 },
"counterparty_value": { "usd": 1124.86 },
"min_number_of_hops": 1,
"indirect_percentage": 20.69,
"is_screened_address": false,
"contribution_percentage": 21.57,
"counterparty_percentage": 0.88
}
]
},
"cluster_entities": [
{
"name": "Unknown",
"is_vasp": null,
"actor_id": -4,
"category": "Unknown",
"entity_id": "00000000-...",
"category_id": "00000000-...",
"is_primary_entity": true,
"is_after_sanction_date": false
}
],
"evaluation_detail": {
"source": [
{
"rule_id": "6c2dcb03-...",
"rule_name": "Obfuscating & Misc.",
"rule_type": "exposure",
"risk_score": 0.2332,
"matched_elements": [
{
"category": "Coin Swap Service",
"category_id": "ff85b715-...",
"contributions": [
{
"entity": "FixedFloat",
"risk_triggers": {
"category": "Coin Swap Service",
"category_id": "ff85b715-..."
},
"indirect_value": { "usd": 2891.09, "native": 0, "native_major": 0 },
"contribution_value": { "usd": 2968.66, "native": 0, "native_major": 0 },
"counterparty_value": { "usd": 77.58, "native": 0, "native_major": 0 },
"min_number_of_hops": 1,
"indirect_percentage": 2.27,
"is_screened_address": false,
"contribution_percentage": 2.33,
"counterparty_percentage": 0.06
}
],
"indirect_value": { "usd": 2891.09, "native": 0, "native_major": 0 },
"contribution_value": { "usd": 2968.66, "native": 0, "native_major": 0 },
"counterparty_value": { "usd": 0, "native": 0, "native_major": 0 },
"indirect_percentage": 100,
"contribution_percentage": 2.33,
"counterparty_percentage": 0
}
],
"matched_behaviors": []
},
{
"rule_id": "0a2b68fd-...",
"rule_name": "Illicit Activity",
"rule_type": "exposure",
"risk_score": 0.0026,
"matched_elements": [
{
"category": "Token Blacklisting",
"category_id": "94b50de8-...",
"contributions": [
{
"entity": "Tether USD",
"risk_triggers": {
"category": "Token Blacklisting",
"category_id": "94b50de8-..."
},
"contribution_value": { "usd": 1022.45, "native": 0, "native_major": 0 },
"min_number_of_hops": 3,
"contribution_percentage": 0.08
}
]
}
],
"matched_behaviors": []
},
{
"rule_id": "df59fab5-...",
"rule_name": "Sanctions",
"rule_type": "exposure",
"risk_score": 0.0024,
"matched_elements": [
{
"category": "Sanctioned Entity",
"category_id": "c1648b7a-...",
"contributions": [
{
"entity": "Garantex",
"risk_triggers": {
"category": "Sanctioned Entity",
"category_id": "c1648b7a-..."
},
"contribution_value": { "usd": 863.21, "native": 0, "native_major": 0 },
"min_number_of_hops": 3,
"contribution_percentage": 0.07
}
]
}
],
"matched_behaviors": []
}
],
"destination": []
},
"detected_behaviors": []
},
"sanctions": {
"self": false,
"self_entities": null,
"exposure": {
"share": 8.029045,
"proximity": "mixed",
"hops": 1,
"entity": "Garantex Europe OU - OFAC SDN - 5 Apr 2022",
"category": "OFAC Sanctioned Entity",
"direction": "destination",
"rule_name": "Sanctioned, TF & CSAM"
},
"items": [
{
"entity": "Garantex Europe OU - OFAC SDN - 5 Apr 2022",
"category": "OFAC Sanctioned Entity",
"share": 8.02904473154148,
"counterparty_share": 2.472410320321629,
"indirect_share": 5.556634411219852,
"hops": 1,
"proximity": "mixed",
"is_sanctioned": true,
"trigger": "sanctions_list",
"value_usd": 7494.407584232807,
"direction": "destination",
"rule_name": "Sanctioned, TF & CSAM"
}
]
}
},
"timestamp": "2026-03-10 15:56:28"
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
| data.client_order_id | string | Уникальный ID заказа для опроса статуса |
| data.status | string | pending, processing, completed, failed, skipped |
| data.risk_score | number | null | Оценка риска. Elliptic: 0-10. null = нет триггеров |
| data.risk_level | string | null | none, low, medium, high или severe. Elliptic возвращает low, medium, high; BitOK добавляет none и severe. null, если провайдер не обнаружил никаких триггеров |
| data.is_sanctioned | boolean | true, если обнаружена связь с подсанкционными субъектами. Не менялось с момента запуска эндпоинта: не разделяет подсанкционный адрес и адрес, просто связанный с таковым — подробнее см. в data.sanctions |
| data.sanctions | object | null | Детализация информации о санкциях: находится ли сам адрес в списках, насколько близка связь и каков ее объем. См. Санкции |
| data.result | object | Полный ответ провайдера (при response_format=full) |
Санкции
is_sanctioned — это единичный булев флаг, и он возвращает true в двух принципиально разных ситуациях: проверяемый адрес сам находится в санкционном списке, либо проверяемый адрес однажды получил долю процента через двух посредников от лица, находящегося под санкциями. Флаг сохраняет исходное значение для обратной совместимости; data.sanctions позволяет различить эти два случая.
| Поле | Тип | Описание |
|---|---|---|
| sanctions.self | boolean | true, когда проверяемый адрес сам является подсанкционным субъектом |
| sanctions.self_entities | array | null | Названия собственных подсанкционных субъектов, когда self равен true |
| sanctions.exposure | object | null | Крупнейшая единичная связь с санкциями — подходит для отображения в сводке |
| sanctions.exposure.share | number | Доля задействованных средств в процентах (8.03 означает 8.03%) |
| sanctions.exposure.proximity | string | screened_address, counterparty, indirect или mixed |
| sanctions.exposure.hops | number | null | Минимальное количество транзакционных шагов (hops) до подсанкционного субъекта |
| sanctions.exposure.entity | string | null | Название подсанкционного субъекта, включая список и дату |
| sanctions.exposure.direction | string | null | source для входящих средств, destination для исходящих |
| sanctions.items | array | Каждая санкционная связь, начиная с наибольшей доли, те же поля, что и в exposure, плюс counterparty_share, indirect_share, value_usd и trigger |
| sanctions.related | array | null | Только для BitOK: связь с биржами под санкциями ЕС или Великобритании, учитывается отдельно от самого санкционного списка |
Proximity соответствует столбцу Closest Proximity в отчетах Elliptic:
| Значение | Значение |
|---|---|
screened_address | Проверяемый адрес сам по себе является триггером, а не контрагентом |
counterparty | Прямой контрагент проверяемого адреса |
indirect | Связь через посредников — см. hops |
mixed | Как прямые, так и косвенные потоки к одному и тому же субъекту |
Связь учитывается как санкционная только в том случае, если провайдер пометил ее таковой — risk_triggers.is_sanctioned для Elliptic, категория sanctions для BitOK. Правило Elliptic под названием Sanctioned, TF & CSAM также срабатывает на триггеры по странам и категориям, поэтому само по себе название правила не является санкционным вердиктом.
Объект result от Elliptic
| Поле | Тип | Описание |
|---|---|---|
| risk_score | number | Точная оценка риска (0-10) |
| risk_score_detail | object | Детализация: оценки source и destination |
| contributions | object | Массивы source и destination участников движения средств |
| contributions[].entities | array | Известные субъекты, связанные с транзакцией |
| contributions[].entities[].name | string | Название субъекта (например, "Binance", "KuCoin") |
| contributions[].entities[].category | string | Тип субъекта (например, "Exchange", "Payment Services Provider") |
| contributions[].entities[].is_vasp | boolean | null | Является ли субъект поставщиком услуг виртуальных активов (VASP) |
| contributions[].contribution_value.usd | number | Общий объем связи в USD |
| contributions[].contribution_percentage | number | Процент от общего объема средств от данного субъекта |
| contributions[].indirect_value.usd | number | Объем в USD, полученный косвенно (через посредников) |
| contributions[].indirect_percentage | number | Процент средств, полученных косвенно |
| contributions[].counterparty_value.usd | number | Объем в USD в качестве прямого контрагента |
| contributions[].counterparty_percentage | number | Процент в качестве прямого контрагента |
| contributions[].min_number_of_hops | number | Минимальное количество транзакционных шагов от субъекта (0 = напрямую) |
| contributions[].is_screened_address | boolean | true, если это сам проверяемый адрес |
| cluster_entities | array | Известные субъекты, напрямую связанные с кластером адреса |
| cluster_entities[].name | string | Название субъекта |
| cluster_entities[].category | string | Категория субъекта |
| cluster_entities[].is_vasp | boolean | null | Статус VASP |
| cluster_entities[].is_after_sanction_date | boolean | true, если активность произошла после того, как субъект попал под санкции |
| evaluation_detail | object | Массивы source и destination сработавших правил риска |
| evaluation_detail[].rule_name | string | Название правила (например, "Sanctions", "Illicit Activity", "Obfuscating & Misc.") |
| evaluation_detail[].rule_type | string | Тип правила (например, "exposure") |
| evaluation_detail[].risk_score | number | Вклад данного правила в оценку риска |
| evaluation_detail[].matched_elements | array | Категории и субъекты, вызвавшие срабатывание правила |
| evaluation_detail[].matched_elements[].category | string | Категория риска (например, "Sanctioned Entity", "Gambling", "Token Blacklisting") |
| evaluation_detail[].matched_elements[].contributions | array | Субъекты в рамках совпавшей категории |
| evaluation_detail[].matched_elements[].contributions[].entity | string | Название субъекта |
| evaluation_detail[].matched_elements[].contributions[].contribution_percentage | number | Процент связи |
| evaluation_detail[].matched_elements[].contributions[].min_number_of_hops | number | Транзакционные шаги |
| evaluation_detail[].matched_elements[].contributions[].is_screened_address | boolean | true, если правило сработало на сам проверяемый адрес |
| evaluation_detail[].matched_elements[].contributions[].risk_triggers | object | Причина срабатывания правила: is_sanctioned для санкционного списка, country для юрисдикции, category для типа субъекта |
| evaluation_detail[].matched_behaviors | array | Выявленные паттерны поведения |
| detected_behaviors | array | Глобальные паттерны поведения, выявленные для адреса |
Уровни риска
Elliptic (шкала 0-10):
| Диапазон | Уровень | Описание |
|---|---|---|
| 0 — 3 | low | Минимальный риск. Нет существенных связей |
| 3 — 7 | medium | Умеренный риск. Обнаружены некоторые рискованные категории |
| 7 — 10 | high | Высокий риск. Подсанкционные, незаконные или высокорисковые субъекты |
| null | - | Триггеры риска не обнаружены |
BitOK (шкала 0-1): провайдер сам возвращает уровень — none, low, medium, high или severe.
risk_level — единый вердикт, используемый везде: в ответе API, в панели управления и в PDF-отчете для одной и той же проверки выводится одно и то же слово.
Ответы с ошибками
Ошибка аутентификации (401)
{
"detail": {
"code": -1,
"msg": "API key not provided"
}
}Ошибка валидации (400)
{
"success": false,
"error": {
"code": 4001,
"msg": "Invalid or missing address"
}
}{
"success": false,
"error": {
"code": 4002,
"msg": "Invalid provider. Use: elliptic"
}
}Недостаточный баланс (402)
{
"success": false,
"error": {
"code": 4020,
"message": "Insufficient balance"
},
"timestamp": "2026-03-10 10:00:00"
}Провайдер недоступен (503)
{
"success": false,
"error": {
"code": 5030,
"message": "Provider elliptic not available"
},
"timestamp": "2026-03-10 10:00:00"
}Справочник кодов ошибок
| Код | Описание | HTTP-статус |
|---|---|---|
-1 | Ошибка аутентификации | 401 |
4001 | Некорректный или отсутствующий адрес | 400 |
4002 | Недопустимый провайдер | 400 |
4020 | Недостаточный баланс | 402 |
5030 | Провайдер недоступен | 503 |
Ограничения частоты запросов
Следующие ограничения частоты запросов действуют для всех эндпоинтов AML (на IP-адрес):
| Период | Лимит | Описание |
|---|---|---|
| 1 секунда | 2 запроса | Максимум 2 запроса в секунду |
| 1 минута | 30 запросов | Максимум 30 запросов в минуту |
Превышен лимит запросов (429)
{
"message": "API rate limit exceeded"
}Кэширование результатов
Если та же комбинация адреса и провайдера уже проверялась за последние 60 секунд, возвращается кэшированный результат бесплатно.
Поддерживаемые сети
Параметр network является обязательным. Используйте тикер из таблицы ниже.
Elliptic — Комплексная проверка (Holistic)
Проверка выполняется для определенного адреса в определенной сети. Однако Elliptic отслеживает все активы, связанные с этим адресом, включая токены, кроссчейн-переводы и взаимодействия с известными субъектами в других сетях.
| Сеть | Тикер | Нативный актив |
|---|---|---|
| Algorand | algo | ALGO |
| Aptos | apt | APT |
| Arbitrum | arb | ETH |
| Avalanche (C-Chain) | avax | AVAX |
| Base | base | ETH |
| Binance Chain | bnb | BNB |
| Binance Smart Chain | bsc | BNB |
| Bitcoin | btc | BTC |
| Bittensor | tao | TAO |
| Cardano | ada | ADA |
| Celo | celo | CELO |
| Cosmos | atom | ATOM |
| Crypto.com | cro | CRO |
| Dogecoin | doge | DOGE |
| dYdX | dydx | DYDX |
| Ethereum | eth | ETH |
| Ethereum Classic | etc | ETC |
| Fantom | ftm | FTM |
| Filecoin | fil | FIL |
| Flare | flr | FLR |
| Gnosis | gnosis | xDai |
| Hedera | hbar | HBAR |
| HyperEVM | hype | HYPE |
| Injective | inj | INJ |
| Internet Computer | icp | ICP |
| Linea | linea | LINEA |
| Litecoin | ltc | LTC |
| MobileCoin | mob | MOB |
| Near | near | NEAR |
| Optimism | op | ETH |
| Polkadot | dot | DOT |
| Polygon | matic | MATIC |
| Ripple | xrp | XRP |
| Sei | sei | SEI |
| Solana | sol | SOL |
| Starknet | strk | STRK |
| Stellar | xlm | XLM |
| Sui | sui | SUI |
| Tezos | xtz | XTZ |
| TON | ton | TON |
| Tron | trx | TRX |
| XDC | xdc | XDC |
| XLayer | okb | OKB |
| Zilliqa | zil | ZIL |
| zkSync | zksync | ETH |
Проверка отдельных активов
Эти сети поддерживают проверку отдельных адресов/транзакций:
| Сеть | Тикер | Нативный актив |
|---|---|---|
| Bitcoin Cash | bch | BCH |
| Horizen | zen | ZEN |
| ZCash | zec | ZEC |
Совместимость провайдеров и сетей
При использовании provider: "elliptic" доступны все сети из таблиц комплексной проверки и проверки отдельных активов (47 сетей). Если передана неподдерживаемая сеть, API возвращает код ошибки 4001.
Примечания
- Ценообразование: Elliptic — $0.98 за проверку. Цены отображаются в TRX по текущему курсу
- Таймаут синхронного запроса:
wait: trueожидает до 15 секунд. Если проверка длится дольше, возвращается статусpending - Время обработки: Большинство проверок завершаются за несколько секунд. Однако обработка некоторых запросов (особенно для адресов со сложной историей транзакций) может занимать до 3 минут. В таких случаях используйте асинхронный режим (опустите
waitили установитеwait: false) и запрашивайте результат через GET /apiv2/aml/{order_id} - Неактивные адреса: Для адресов без активности в блокчейне возвращается статус
skippedбез списания средств