Appearance
POST /apiv2/aml
Substituído por POST /apiv2/screening
POST /apiv2/screening é o contrato da versão 2: um único formato de resposta para cada provedor e cada estado do pedido, números decimais como strings em vez de números JSON, participações em uma única escala e um formato de erro unificado. Este endpoint continua funcionando e não será descontinuado sem aviso prévio.
Envie um endereço para triagem de AML (Anti-Money Laundering / Prevenção à Lavagem de Dinheiro). Retorna pontuação de risco, nível de risco e análise detalhada de exposição.
Todos os timestamps na resposta estão em UTC. O formato da string permanece inalterado — "2026-09-09 23:01:44", sem sufixo de fuso horário.
URL do endpoint
POST https://netts.io/apiv2/amlCabeçalhos da requisição
| Header | Obrigatório | Descrição |
|---|---|---|
| Content-Type | Sim | application/json |
| X-API-KEY | Sim | Sua chave de API do painel da Netts |
Corpo da requisição
json
{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": true
}Parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| address | string | Sim | Endereço de blockchain a ser verificado (10-100 caracteres) |
| network | string | Sim | Identificador da rede blockchain (consulte Redes Suportadas abaixo) |
| provider | string | Não | Provedor de AML: elliptic (padrão) |
| wait | boolean | Não | Se true, aguarda o resultado de forma síncrona (até 15 segundos). Se false ou omitido, retorna imediatamente com o status pending e client_order_id — use-o para consultar o resultado via GET /apiv2/aml/{order_id} |
| response_format | string | Não | Nível de detalhe da resposta: rate (apenas pontuação), full (padrão, dados completos) |
| report_language | string | Não | Idioma do relatório: en (padrão) |
Provedores
| Provedor | Faixa de Pontuação | Descrição |
|---|---|---|
elliptic | 0 — 10 | Pontuação de risco da Elliptic. 0 = nenhum risco, 10 = risco máximo. null = nenhum gatilho detectado |
Exemplos de Requisições
cURL (síncrono)
bash
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 (assíncrono)
bash
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
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}")Resposta
Sucesso — Pendente (200 OK)
Quando wait não está definido ou a verificação ainda está em processamento:
json
{
"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"
}Sucesso — Elliptic Concluído (200 OK)
Resposta completa da Elliptic com todas as estruturas de dados:
json
{
"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 da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
| data.client_order_id | string | ID exclusivo do pedido para consulta de status |
| data.status | string | pending, processing, completed, failed, skipped |
| data.risk_score | number | null | Pontuação de risco. Elliptic: 0-10. null = sem gatilhos |
| data.risk_level | string | null | none, low, medium, high ou severe. A Elliptic retorna low, medium, high; a BitOK adiciona none e severe. null quando o provedor não detectou nenhum gatilho |
| data.is_sanctioned | boolean | true se foi detectada exposição a entidades sancionadas. Inalterado desde o lançamento do endpoint: não distingue um endereço sancionado de um endereço apenas vinculado a um — consulte data.sanctions para isso |
| data.sanctions | object | null | Detalhamento do resultado de sanções: se o próprio endereço está listado, quão próximo é o vínculo e sua magnitude. Consulte Sanções |
| data.result | object | Resposta completa do provedor (quando response_format=full) |
Sanções
is_sanctioned é um único booleano e retorna true em duas situações muito distintas: o próprio endereço analisado está em uma lista de sanções, ou o endereço analisado recebeu uma fração de porcentagem por meio de dois intermediários de alguém que está. A flag mantém seu significado original para compatibilidade retroativa; data.sanctions diferencia os dois casos.
| Campo | Tipo | Descrição |
|---|---|---|
| sanctions.self | boolean | true quando o próprio endereço analisado é a entidade sancionada |
| sanctions.self_entities | array | null | Nomes de suas próprias entidades sancionadas, quando self for true |
| sanctions.exposure | object | null | O maior vínculo individual com sanções — o que deve ser exibido em um resumo |
| sanctions.exposure.share | number | Parcela de fundos envolvida, em porcentagem (8.03 significa 8,03%) |
| sanctions.exposure.proximity | string | screened_address, counterparty, indirect ou mixed |
| sanctions.exposure.hops | number | null | Número mínimo de saltos de transação até a entidade sancionada |
| sanctions.exposure.entity | string | null | Nome da entidade sancionada, incluindo a lista e a data |
| sanctions.exposure.direction | string | null | source para fundos recebidos, destination para enviados |
| sanctions.items | array | Cada contribuição de sanções, maior parcela primeiro, mesmos campos de exposure mais counterparty_share, indirect_share, value_usd e trigger |
| sanctions.related | array | null | Apenas BitOK: exposição a exchanges sob sanções da UE ou do Reino Unido, mantida separada da própria lista de sanções |
Proximidade reflete a coluna Closest Proximity de um relatório da Elliptic:
| Valor | Significado |
|---|---|
screened_address | O endereço analisado é o próprio gatilho, não uma contraparte |
counterparty | Contraparte direta do endereço analisado |
indirect | Atingido por meio de intermediários — consulte hops |
mixed | Fluxos diretos e indiretos para a mesma entidade |
Uma contribuição conta como um vínculo de sanções apenas quando o provedor a marca como tal — risk_triggers.is_sanctioned para a Elliptic, a categoria sanctions para a BitOK. A regra da Elliptic denominada Sanctioned, TF & CSAM também é acionada por gatilhos de país e categoria, portanto o nome da regra por si só não constitui um veredito de sanções.
Objeto result da Elliptic
| Campo | Tipo | Descrição |
|---|---|---|
| risk_score | number | Pontuação de risco precisa (0-10) |
| risk_score_detail | object | Detalhamento: pontuações de source e destination |
| contributions | object | Arrays source e destination dos contribuidores do fluxo de fundos |
| contributions[].entities | array | Entidades conhecidas associadas à contribuição |
| contributions[].entities[].name | string | Nome da entidade (ex.: "Binance", "KuCoin") |
| contributions[].entities[].category | string | Tipo de entidade (ex.: "Exchange", "Payment Services Provider") |
| contributions[].entities[].is_vasp | boolean | null | Se a entidade é um Provedor de Serviços de Ativos Virtuais (VASP) |
| contributions[].contribution_value.usd | number | Volume total em USD da contribuição |
| contributions[].contribution_percentage | number | Porcentagem do total de fundos provenientes desta entidade |
| contributions[].indirect_value.usd | number | Volume em USD recebido indiretamente (via intermediários) |
| contributions[].indirect_percentage | number | Porcentagem de fundos recebidos indiretamente |
| contributions[].counterparty_value.usd | number | Volume em USD como contraparte direta |
| contributions[].counterparty_percentage | number | Porcentagem como contraparte direta |
| contributions[].min_number_of_hops | number | Número mínimo de saltos de transação a partir da entidade (0 = direto) |
| contributions[].is_screened_address | boolean | true se este for o próprio endereço analisado |
| cluster_entities | array | Entidades conhecidas diretamente associadas ao cluster de endereços |
| cluster_entities[].name | string | Nome da entidade |
| cluster_entities[].category | string | Categoria da entidade |
| cluster_entities[].is_vasp | boolean | null | Status de VASP |
| cluster_entities[].is_after_sanction_date | boolean | true se a atividade ocorreu após a entidade ser sancionada |
| evaluation_detail | object | Arrays source e destination de regras de risco acionadas |
| evaluation_detail[].rule_name | string | Nome da regra (ex.: "Sanctions", "Illicit Activity", "Obfuscating & Misc.") |
| evaluation_detail[].rule_type | string | Tipo de regra (ex.: "exposure") |
| evaluation_detail[].risk_score | number | Contribuição para a pontuação de risco proveniente desta regra |
| evaluation_detail[].matched_elements | array | Categorias e entidades que acionaram a regra |
| evaluation_detail[].matched_elements[].category | string | Categoria de risco (ex.: "Sanctioned Entity", "Gambling", "Token Blacklisting") |
| evaluation_detail[].matched_elements[].contributions | array | Entidades dentro da categoria correspondente |
| evaluation_detail[].matched_elements[].contributions[].entity | string | Nome da entidade |
| evaluation_detail[].matched_elements[].contributions[].contribution_percentage | number | Porcentagem de exposição |
| evaluation_detail[].matched_elements[].contributions[].min_number_of_hops | number | Saltos de transação |
| evaluation_detail[].matched_elements[].contributions[].is_screened_address | boolean | true quando o próprio endereço analisado acionou a regra |
| evaluation_detail[].matched_elements[].contributions[].risk_triggers | object | Por que a regra foi acionada: is_sanctioned para uma lista de sanções, country para uma jurisdição, category para um tipo de entidade |
| evaluation_detail[].matched_behaviors | array | Padrões comportamentais detectados |
| detected_behaviors | array | Padrões comportamentais globais detectados no endereço |
Níveis de Risco
Elliptic (escala de 0-10):
| Faixa | Nível | Descrição |
|---|---|---|
| 0 — 3 | low | Risco mínimo. Nenhuma exposição significativa |
| 3 — 7 | medium | Risco moderado. Algumas categorias arriscadas detectadas |
| 7 — 10 | high | Risco alto. Entidades sancionadas, ilícitas ou de alto risco |
| null | - | Nenhum gatilho de risco detectado |
BitOK (escala de 0-1): o próprio provedor retorna o nível — none, low, medium, high ou severe.
risk_level é o veredito único utilizado em todos os lugares: a resposta da API, o painel e o relatório em PDF exibem a mesma palavra para a mesma verificação.
Respostas de erro
Erro de Autenticação (401)
json
{
"detail": {
"code": -1,
"msg": "API key not provided"
}
}Erro de Validação (400)
json
{
"success": false,
"error": {
"code": 4001,
"msg": "Invalid or missing address"
}
}json
{
"success": false,
"error": {
"code": 4002,
"msg": "Invalid provider. Use: elliptic"
}
}Saldo Insuficiente (402)
json
{
"success": false,
"error": {
"code": 4020,
"message": "Insufficient balance"
},
"timestamp": "2026-03-10 10:00:00"
}Provedor Indisponível (503)
json
{
"success": false,
"error": {
"code": 5030,
"message": "Provider elliptic not available"
},
"timestamp": "2026-03-10 10:00:00"
}Referência de Códigos de Erro
| Código | Descrição | HTTP Status |
|---|---|---|
-1 | Falha na autenticação | 401 |
4001 | Endereço inválido ou ausente | 400 |
4002 | Provedor inválido | 400 |
4020 | Saldo insuficiente | 402 |
5030 | Provedor indisponível | 503 |
Limites de taxa
Os seguintes limites de taxa se aplicam a todos os endpoints de AML (por endereço IP):
| Período | Limite | Descrição |
|---|---|---|
| 1 segundo | 2 requisições | Máximo de 2 requisições por segundo |
| 1 minuto | 30 requisições | Máximo de 30 requisições por minuto |
Limite de Taxa Excedido (429)
json
{
"message": "API rate limit exceeded"
}Cache de Resultados
Se a mesma combinação de endereço + provedor tiver sido verificada nos últimos 60 segundos, o resultado em cache será retornado sem cobrança.
Redes Suportadas
O parâmetro network é obrigatório. Use o ticker da tabela abaixo.
Elliptic — Triagem Holística
A triagem é realizada para um endereço específico em uma rede específica. No entanto, a Elliptic rastreia todos os ativos associados a esse endereço — incluindo tokens, transferências entre blockchains (cross-chain) e interações com entidades conhecidas em outras redes.
| Rede | Ticker | Ativo Nativo |
|---|---|---|
| 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 |
Triagem de Ativo Único
Estas redes suportam triagem individual de endereço/transação:
| Rede | Ticker | Ativo Nativo |
|---|---|---|
| Bitcoin Cash | bch | BCH |
| Horizen | zen | ZEN |
| ZCash | zec | ZEC |
Compatibilidade de Provedor e Rede
Ao usar provider: "elliptic" — todas as redes das tabelas Holística e de Ativo Único estão disponíveis (47 redes). Se uma rede não suportada for informada, a API retornará o código de erro 4001.
Notas
- Preços: Elliptic — $0.98 por verificação. Preços exibidos em TRX na cotação atual
- Timeout síncrono:
wait: trueaguarda até 15 segundos. Se a verificação demorar mais, retorna o statuspending - Tempo de processamento: A maioria das verificações é concluída em poucos segundos. No entanto, algumas requisições (especialmente para endereços com histórico complexo de transações) podem levar até 3 minutos para serem processadas. Nesses casos, use o modo assíncrono (omita
waitou definawait: false) e faça consultas via GET /apiv2/aml/{order_id} - Endereços inativos: Endereços sem atividade na blockchain retornam o status
skippedsem cobrança