POST /apiv2/aml
Reemplazado por POST /apiv2/screening
POST /apiv2/screening es el contrato de la versión 2: una única estructura de respuesta para cada proveedor y cada estado de la orden, números decimales como cadenas en lugar de números JSON, participaciones en una sola escala y un único formato de error. Este endpoint sigue funcionando y no se retirará sin previo aviso.
Envía una dirección para verificación AML (Anti-Lavado de Dinero). Devuelve la puntuación de riesgo, el nivel de riesgo y un análisis detallado de exposición.
Todas las marcas de tiempo en la respuesta están en UTC. El formato de cadena no cambia — "2026-09-09 23:01:44", sin sufijo de zona horaria.
URL del endpoint
POST https://netts.io/apiv2/amlEncabezados de solicitud
| Header | Required | Description |
|---|---|---|
| Content-Type | Sí | application/json |
| X-API-KEY | Sí | Tu clave de API del panel de Netts |
Cuerpo de la solicitud
{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": true
}Parámetros
| Parameter | Type | Required | Description |
|---|---|---|---|
| address | string | Sí | Dirección de blockchain a verificar (10-100 caracteres) |
| network | string | Sí | Identificador de la red blockchain (consulta Redes compatibles a continuación) |
| provider | string | No | Proveedor de AML: elliptic (predeterminado) |
| wait | boolean | No | Si es true, espera el resultado de forma sincrónica (hasta 15 segundos). Si es false o se omite, responde inmediatamente con estado pending y un client_order_id — úsalo para consultar el resultado mediante sondeo a través de GET /apiv2/aml/{order_id} |
| response_format | string | No | Nivel de detalle de la respuesta: rate (solo puntuación), full (predeterminado, datos completos) |
| report_language | string | No | Idioma del reporte: en (predeterminado) |
Proveedores
| Provider | Score Range | Description |
|---|---|---|
elliptic | 0 — 10 | Puntuación de riesgo de Elliptic. 0 = sin riesgo, 10 = riesgo máximo. null = no se detectaron detonantes |
Ejemplos
cURL (sincrónico)
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 (asincrónico)
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}")Respuesta
Éxito — Pendiente (200 OK)
Cuando no se define wait o la verificación aún se está procesando:
{
"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"
}Éxito — Elliptic completado (200 OK)
Respuesta completa de Elliptic con todas las estructuras de datos:
{
"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"
}Campos de la respuesta
| Field | Type | Description |
|---|---|---|
| data.client_order_id | string | ID de orden único para consultar el estado mediante sondeo |
| data.status | string | pending, processing, completed, failed, skipped |
| data.risk_score | number | null | Puntuación de riesgo. Elliptic: 0-10. null = sin detonantes |
| data.risk_level | string | null | none, low, medium, high o severe. Elliptic devuelve low, medium, high; BitOK añade none y severe. null cuando el proveedor no detectó ningún detonante |
| data.is_sanctioned | boolean | true si se detecta exposición a entidades sancionadas. Sin cambios desde el lanzamiento del endpoint: no distingue entre una dirección sancionada y una dirección simplemente vinculada a una — consulta data.sanctions para eso |
| data.sanctions | object | null | Desglose del hallazgo de sanciones: si la dirección misma está listada, qué tan cercano es el vínculo y de qué tamaño. Consulta Sanciones |
| data.result | object | Respuesta completa del proveedor (cuando response_format=full) |
Sanciones
is_sanctioned es un único valor booleano y dice true en dos situaciones muy diferentes: la dirección verificada está en sí misma en una lista de sanciones, o la dirección verificada alguna vez recibió una fracción de un porcentaje a través de dos intermediarios de alguien que lo está. La bandera mantiene su significado original por compatibilidad hacia atrás; data.sanctions diferencia ambos casos.
| Field | Type | Description |
|---|---|---|
| sanctions.self | boolean | true cuando la propia dirección analizada es la entidad sancionada |
| sanctions.self_entities | array | null | Nombres de sus propias entidades sancionadas, cuando self es true |
| sanctions.exposure | object | null | El vínculo de sanciones individual más grande — qué mostrar en un resumen |
| sanctions.exposure.share | number | Proporción de fondos involucrados, en porcentaje (8.03 significa 8.03%) |
| sanctions.exposure.proximity | string | screened_address, counterparty, indirect o mixed |
| sanctions.exposure.hops | number | null | Número mínimo de saltos de transacción hasta la entidad sancionada |
| sanctions.exposure.entity | string | null | Nombre de la entidad sancionada, incluyendo la lista y la fecha |
| sanctions.exposure.direction | string | null | source para fondos entrantes, destination para salientes |
| sanctions.items | array | Cada contribución de sanciones, la mayor proporción primero, los mismos campos que exposure más counterparty_share, indirect_share, value_usd y trigger |
| sanctions.related | array | null | Solo BitOK: exposición a exchanges bajo sanciones de la UE o el Reino Unido, mantenidos al margen de la lista de sanciones en sí |
Proximidad refleja la columna Closest Proximity de un informe de Elliptic:
| Value | Meaning |
|---|---|
screened_address | La dirección analizada es el detonante en sí, no una contraparte |
counterparty | Contraparte directa de la dirección analizada |
indirect | Alcanzada a través de intermediarios — consulta hops |
mixed | Flujos tanto directos como indirectos hacia la misma entidad |
Una contribución cuenta como un vínculo de sanciones solo cuando el proveedor la marca como tal — risk_triggers.is_sanctioned para Elliptic, la categoría sanctions para BitOK. La regla de Elliptic llamada Sanctioned, TF & CSAM también se activa con detonantes de país y categoría, por lo que el nombre de la regla por sí solo no es un veredicto de sanciones.
Objeto result de Elliptic
| Field | Type | Description |
|---|---|---|
| risk_score | number | Puntuación de riesgo precisa (0-10) |
| risk_score_detail | object | Desglose: puntuaciones de source y destination |
| contributions | object | Arreglos source y destination de los contribuyentes al flujo de fondos |
| contributions[].entities | array | Entidades conocidas asociadas con la contribución |
| contributions[].entities[].name | string | Nombre de la entidad (ej. "Binance", "KuCoin") |
| contributions[].entities[].category | string | Tipo de entidad (ej. "Exchange", "Payment Services Provider") |
| contributions[].entities[].is_vasp | boolean | null | Si la entidad es un Proveedor de Servicios de Activos Virtuales |
| contributions[].contribution_value.usd | number | Volumen total en USD de la contribución |
| contributions[].contribution_percentage | number | Porcentaje del total de fondos provenientes de esta entidad |
| contributions[].indirect_value.usd | number | Volumen en USD recibido indirectamente (a través de intermediarios) |
| contributions[].indirect_percentage | number | Porcentaje de fondos recibidos indirectamente |
| contributions[].counterparty_value.usd | number | Volumen en USD como contraparte directa |
| contributions[].counterparty_percentage | number | Porcentaje como contraparte directa |
| contributions[].min_number_of_hops | number | Saltos mínimos de transacción desde la entidad (0 = directo) |
| contributions[].is_screened_address | boolean | true si se trata de la propia dirección verificada |
| cluster_entities | array | Entidades conocidas directamente asociadas con el clúster de la dirección |
| cluster_entities[].name | string | Nombre de la entidad |
| cluster_entities[].category | string | Categoría de la entidad |
| cluster_entities[].is_vasp | boolean | null | Estado de VASP |
| cluster_entities[].is_after_sanction_date | boolean | true si la actividad ocurrió después de que la entidad fuera sancionada |
| evaluation_detail | object | Arreglos source y destination de reglas de riesgo activadas |
| evaluation_detail[].rule_name | string | Nombre de la regla (ej. "Sanctions", "Illicit Activity", "Obfuscating & Misc.") |
| evaluation_detail[].rule_type | string | Tipo de regla (ej. "exposure") |
| evaluation_detail[].risk_score | number | Contribución a la puntuación de riesgo proveniente de esta regla |
| evaluation_detail[].matched_elements | array | Categorías y entidades que activaron la regla |
| evaluation_detail[].matched_elements[].category | string | Categoría de riesgo (ej. "Sanctioned Entity", "Gambling", "Token Blacklisting") |
| evaluation_detail[].matched_elements[].contributions | array | Entidades dentro de la categoría coincidente |
| evaluation_detail[].matched_elements[].contributions[].entity | string | Nombre de la entidad |
| evaluation_detail[].matched_elements[].contributions[].contribution_percentage | number | Porcentaje de exposición |
| evaluation_detail[].matched_elements[].contributions[].min_number_of_hops | number | Saltos de transacción |
| evaluation_detail[].matched_elements[].contributions[].is_screened_address | boolean | true cuando la propia dirección verificada activó la regla |
| evaluation_detail[].matched_elements[].contributions[].risk_triggers | object | Razón por la que se activó la regla: is_sanctioned para una lista de sanciones, country para una jurisdicción, category para un tipo de entidad |
| evaluation_detail[].matched_behaviors | array | Patrones de comportamiento detectados |
| detected_behaviors | array | Patrones de comportamiento globales detectados en la dirección |
Niveles de riesgo
Elliptic (escala 0-10):
| Range | Level | Description |
|---|---|---|
| 0 — 3 | low | Riesgo mínimo. Sin exposición significativa |
| 3 — 7 | medium | Riesgo moderado. Se detectaron algunas categorías riesgosas |
| 7 — 10 | high | Riesgo alto. Entidades sancionadas, ilícitas o de alto riesgo |
| null | - | No se detectaron detonantes de riesgo |
BitOK (escala 0-1): el proveedor devuelve el nivel en sí — none, low, medium, high o severe.
risk_level es el veredicto único utilizado en todas partes: la respuesta de la API, el panel de control y el informe en PDF muestran la misma palabra para la misma comprobación.
Respuestas de error
Error de autenticación (401)
{
"detail": {
"code": -1,
"msg": "API key not provided"
}
}Error de validación (400)
{
"success": false,
"error": {
"code": 4001,
"msg": "Invalid or missing address"
}
}{
"success": false,
"error": {
"code": 4002,
"msg": "Invalid provider. Use: elliptic"
}
}Saldo insuficiente (402)
{
"success": false,
"error": {
"code": 4020,
"message": "Insufficient balance"
},
"timestamp": "2026-03-10 10:00:00"
}Proveedor no disponible (503)
{
"success": false,
"error": {
"code": 5030,
"message": "Provider elliptic not available"
},
"timestamp": "2026-03-10 10:00:00"
}Referencia de códigos de error
| Code | Description | HTTP Status |
|---|---|---|
-1 | La autenticación falló | 401 |
4001 | Dirección inválida o ausente | 400 |
4002 | Proveedor inválido | 400 |
4020 | Saldo insuficiente | 402 |
5030 | Proveedor no disponible | 503 |
Límites de tasa
Los siguientes límites de tasa se aplican a todos los endpoints de AML (por dirección IP):
| Period | Limit | Description |
|---|---|---|
| 1 segundo | 2 solicitudes | Máximo 2 solicitudes por segundo |
| 1 minuto | 30 solicitudes | Máximo 30 solicitudes por minuto |
Límite de tasa excedido (429)
{
"message": "API rate limit exceeded"
}Almacenamiento en caché de resultados
Si se verificó la misma combinación de dirección + proveedor en los últimos 60 segundos, el resultado almacenado en caché se devuelve sin costo.
Redes compatibles
El parámetro network es obligatorio. Usa el ticker de la tabla a continuación.
Elliptic — Verificación integral (Holistic)
La verificación se realiza para una dirección específica en una red específica. Sin embargo, Elliptic rastrea todos los activos asociados con esa dirección — incluidos tokens, transferencias cross-chain e interacciones con entidades conocidas a través de otras redes.
| Network | Ticker | Native Asset |
|---|---|---|
| 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 |
Verificación de un solo activo (Single Asset)
Estas redes admiten la verificación individual de direcciones/transacciones:
| Network | Ticker | Native Asset |
|---|---|---|
| Bitcoin Cash | bch | BCH |
| Horizen | zen | ZEN |
| ZCash | zec | ZEC |
Compatibilidad de proveedores y redes
Al usar provider: "elliptic" — todas las redes de las tablas Holistic y Single Asset están disponibles (47 redes). Si se pasa una red no compatible, la API devuelve el código de error 4001.
Notas
- Precios: Elliptic — $0.98 por comprobación. Precios mostrados en TRX a la tasa actual
- Tiempo de espera sincrónico:
wait: trueespera hasta 15 segundos. Si la verificación toma más tiempo, devuelve el estadopending - Tiempo de procesamiento: La mayoría de las verificaciones se completan en pocos segundos. Sin embargo, algunas solicitudes (especialmente para direcciones con un historial de transacciones complejo) pueden tardar hasta 3 minutos en procesarse. Usa el modo asincrónico (omite
waito establecewait: false) y realiza sondeos mediante GET /apiv2/aml/{order_id} para tales casos - Direcciones inactivas: Las direcciones sin actividad en la blockchain devuelven el estado
skippedsin costo