Skip to content

POST /apiv2/aml

Submit an address for AML (Anti-Money Laundering) screening. Returns risk score, risk level, and detailed exposure analysis.

Endpoint URL

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

Request Headers

HeaderRequiredDescription
Content-TypeYesapplication/json
X-API-KEYYesYour API key from Netts dashboard

Request Body

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

Parameters

ParameterTypeRequiredDescription
addressstringYesBlockchain address to check (10-100 characters)
networkstringYesBlockchain network identifier (see Supported Networks below)
providerstringNoAML provider: elliptic (default) or bitok
waitbooleanNoIf true, wait for result synchronously (up to 15 seconds). If false or omitted, return immediately with pending status and client_order_id — use it to poll result via GET /apiv2/aml/{order_id}
response_formatstringNoResponse detail level: rate (score only), full (default, complete data)
report_languagestringNoLanguage for report: en (default)

Providers

ProviderScore RangeDescription
elliptic0 — 10Elliptic risk score. 0 = no risk, 10 = maximum risk. null = no triggers detected
bitok0 — 1.0BitOK percentage score. 0.0 = 0% risk, 1.0 = 100% risk

Example Requests

cURL (synchronous)

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 (asynchronous)

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": "bitok"
  }'

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}")

Response

Success — Pending (200 OK)

When wait is not set or check is still processing:

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"
}

Success — Elliptic Completed (200 OK)

Full Elliptic response with all data structures:

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": []
        },
        "address_users": [
            {
                "sources": ["api_1h_response"],
                "user_id": 3162
            }
        ]
    },
    "timestamp": "2026-03-10 15:56:28"
}

Success — BitOK Completed (200 OK)

Full BitOK response with all data structures:

json
{
    "success": true,
    "data": {
        "client_order_id": "A4448368195FE7E",
        "status": "completed",
        "address": "T...example...",
        "provider": "bitok",
        "report_language": "en",
        "risk_score": 0.262292,
        "risk_level": "low",
        "is_sanctioned": false,
        "created_at": "2026-03-10 16:44:25",
        "completed_at": "2026-03-10 16:44:26",
        "result": {
            "risk_score": 0.262292,
            "risk_level": "low",
            "entity_name": null,
            "entity_category": null,
            "exposure": [
                { "value_share": 0.711, "entity_category": "exchange" },
                { "value_share": 0.1445, "entity_category": "dust" },
                { "value_share": 0.0845, "entity_category": "unnamed_service" },
                { "value_share": 0.0218, "entity_category": "high_risk_exchange" },
                { "value_share": 0.0113, "entity_category": "gambling" },
                { "value_share": 0.0081, "entity_category": "enforcement_action" },
                { "value_share": 0.0042, "entity_category": "custodial_wallet" },
                { "value_share": 0.0038, "entity_category": "bridge" },
                { "value_share": 0.0031, "entity_category": "other" },
                { "value_share": 0.0023, "entity_category": "dex" },
                { "value_share": 0.0017, "entity_category": "lending" },
                { "value_share": 0.0014, "entity_category": "payment_service_provider" },
                { "value_share": 0.0013, "entity_category": "sanctions" },
                { "value_share": 0.0005, "entity_category": "smart_contract" },
                { "value_share": 0.0003, "entity_category": "stolen_funds" },
                { "value_share": 0.0001, "entity_category": "p2p_exchange" },
                { "value_share": 0.0001, "entity_category": "high_risk_jurisdiction" },
                { "value_share": 0.0001, "entity_category": "terrorist_financing" },
                { "value_share": 0.0, "entity_category": "scam" },
                { "value_share": 0.0, "entity_category": "privacy_protocol" },
                { "value_share": 0.0, "entity_category": "atm" },
                { "value_share": 0.0, "entity_category": "mining_pool" },
                { "value_share": 0.0, "entity_category": "seized_funds" },
                { "value_share": 0.0, "entity_category": "ransomware" },
                { "value_share": 0.0, "entity_category": "token_contract" },
                { "value_share": 0.0, "entity_category": "iaas" },
                { "value_share": 0.0, "entity_category": "fraud_shop" },
                { "value_share": 0.0, "entity_category": "illegal_service" },
                { "value_share": 0.0, "entity_category": "darknet_market" }
            ],
            "risks": [
                {
                    "rule": {
                        "rule_type": "address_exposure",
                        "rule_sub_type": "single_address",
                        "entity_category": "high_risk_exchange",
                        "min_value_share": 0.01,
                        "min_value_in_fiat": null
                    },
                    "proximity": "indirect",
                    "risk_type": "address_exposure",
                    "risk_level": "low",
                    "detected_at": "2026-03-10T17:54:28.387498+03:00",
                    "occurred_at": "2026-03-10T17:53:56.444636+03:00",
                    "value_share": 0.0218,
                    "fiat_currency": "USD",
                    "value_in_fiat": null,
                    "entity_category": "high_risk_exchange"
                },
                {
                    "rule": {
                        "rule_type": "address_exposure",
                        "rule_sub_type": "single_address",
                        "entity_category": "gambling",
                        "min_value_share": 0.01,
                        "min_value_in_fiat": null
                    },
                    "proximity": "indirect",
                    "risk_type": "address_exposure",
                    "risk_level": "low",
                    "detected_at": "2026-03-10T17:54:28.387588+03:00",
                    "occurred_at": "2026-03-10T17:53:56.444636+03:00",
                    "value_share": 0.0113,
                    "fiat_currency": "USD",
                    "value_in_fiat": null,
                    "entity_category": "gambling"
                },
                {
                    "rule": {
                        "rule_type": "address_exposure",
                        "rule_sub_type": "all",
                        "entity_category": "sanctions",
                        "min_value_share": 0.001,
                        "min_value_in_fiat": null
                    },
                    "proximity": "indirect",
                    "risk_type": "address_exposure",
                    "risk_level": "low",
                    "detected_at": "2026-03-10T17:54:28.387630+03:00",
                    "occurred_at": "2026-03-10T17:53:56.444636+03:00",
                    "value_share": 0.0013,
                    "fiat_currency": "USD",
                    "value_in_fiat": null,
                    "entity_category": "sanctions"
                }
            ]
        },
        "address_users": [
            {
                "sources": ["api_1h_response"],
                "user_id": 3162
            }
        ]
    },
    "timestamp": "2026-03-10 15:44:27"
}

Response Fields

FieldTypeDescription
data.client_order_idstringUnique order ID for status polling
data.statusstringpending, processing, completed, failed, skipped
data.risk_scorenumber | nullRisk score. Elliptic: 0-10, BitOK: 0-1.0. null = no triggers
data.risk_levelstringlow, medium, or high
data.is_sanctionedbooleantrue if exposure to sanctioned entities detected
data.resultobjectFull provider response (when response_format=full)
data.address_usersarrayKnown users of this address from Netts database

Elliptic result Object

FieldTypeDescription
risk_scorenumberPrecise risk score (0-10)
risk_score_detailobjectBreakdown: source and destination scores
contributionsobjectsource and destination arrays of fund flow contributors
contributions[].entitiesarrayKnown entities associated with the contribution
contributions[].entities[].namestringEntity name (e.g. "Binance", "KuCoin")
contributions[].entities[].categorystringEntity type (e.g. "Exchange", "Payment Services Provider")
contributions[].entities[].is_vaspboolean | nullWhether the entity is a Virtual Asset Service Provider
contributions[].contribution_value.usdnumberTotal USD volume of the contribution
contributions[].contribution_percentagenumberPercentage of total funds from this entity
contributions[].indirect_value.usdnumberUSD volume received indirectly (via intermediaries)
contributions[].indirect_percentagenumberPercentage of funds received indirectly
contributions[].counterparty_value.usdnumberUSD volume as direct counterparty
contributions[].counterparty_percentagenumberPercentage as direct counterparty
contributions[].min_number_of_hopsnumberMinimum transaction hops from the entity (0 = direct)
contributions[].is_screened_addressbooleantrue if this is the screened address itself
cluster_entitiesarrayKnown entities directly associated with the address cluster
cluster_entities[].namestringEntity name
cluster_entities[].categorystringEntity category
cluster_entities[].is_vaspboolean | nullVASP status
cluster_entities[].is_after_sanction_datebooleantrue if activity occurred after entity was sanctioned
evaluation_detailobjectsource and destination arrays of triggered risk rules
evaluation_detail[].rule_namestringRule name (e.g. "Sanctions", "Illicit Activity", "Obfuscating & Misc.")
evaluation_detail[].rule_typestringRule type (e.g. "exposure")
evaluation_detail[].risk_scorenumberRisk score contribution from this rule
evaluation_detail[].matched_elementsarrayCategories and entities that triggered the rule
evaluation_detail[].matched_elements[].categorystringRisk category (e.g. "Sanctioned Entity", "Gambling", "Token Blacklisting")
evaluation_detail[].matched_elements[].contributionsarrayEntities within the matched category
evaluation_detail[].matched_elements[].contributions[].entitystringEntity name
evaluation_detail[].matched_elements[].contributions[].contribution_percentagenumberExposure percentage
evaluation_detail[].matched_elements[].contributions[].min_number_of_hopsnumberTransaction hops
evaluation_detail[].matched_behaviorsarrayDetected behavioral patterns
detected_behaviorsarrayGlobal behavioral patterns detected on the address

BitOK result Object

FieldTypeDescription
risk_scorenumberRisk score as decimal (0.0 - 1.0, where 1.0 = 100% risk)
risk_levelstringlow, medium, or high
entity_namestring | nullKnown entity name associated with the address
entity_categorystring | nullCategory of the known entity
exposurearrayFull breakdown of fund sources by category
exposure[].value_sharenumberFraction of total funds (0.0 - 1.0). Multiply by 100 for percentage
exposure[].entity_categorystringCategory name (see BitOK Categories)
risksarrayTriggered risk rules
risks[].entity_categorystringCategory that triggered the rule
risks[].risk_levelstringlow, medium, high, or severe
risks[].proximitystringdirect or indirect — whether exposure is from direct interaction or through intermediaries
risks[].value_sharenumberFraction of total funds for this risk
risks[].risk_typestringType of risk check (e.g. "address_exposure")
risks[].ruleobjectRule definition that was triggered
risks[].rule.rule_typestringRule type (e.g. "address_exposure")
risks[].rule.rule_sub_typestringsingle_address or all
risks[].rule.min_value_sharenumberMinimum threshold that triggered the rule
risks[].detected_atstringISO 8601 timestamp when the risk was detected
risks[].occurred_atstringISO 8601 timestamp of the underlying transaction

BitOK Exposure Categories

CategoryDescription
exchangeCentralized exchanges (Binance, Coinbase, etc.)
high_risk_exchangeExchanges with weak KYC/AML policies
dexDecentralized exchanges
p2p_exchangePeer-to-peer trading platforms
gamblingGambling and betting services
sanctionsOFAC/EU sanctioned entities
stolen_fundsKnown stolen cryptocurrency
ransomwareRansomware-related addresses
darknet_marketDarknet marketplace activity
terrorist_financingTerrorist financing related
scamKnown scam addresses
fraud_shopFraud-related services
illegal_serviceOther illegal services
enforcement_actionLaw enforcement related
seized_fundsFunds seized by authorities
high_risk_jurisdictionHigh-risk geographic jurisdictions
privacy_protocolMixers, tumblers, privacy coins
bridgeCross-chain bridge protocols
lendingDeFi lending protocols
smart_contractSmart contract interactions
token_contractToken contract activity
payment_service_providerPayment processors
custodial_walletCustodial wallet services
mining_poolMining pool payouts
atmCrypto ATM transactions
iaasInfrastructure-as-a-Service
dustDust transactions (very small amounts)
unnamed_serviceUnidentified services
otherUncategorized activity

Key Differences: Elliptic vs BitOK

AspectEllipticBitOK
Score range0 — 10 (float)0 — 1.0 (fraction, multiply by 100 for %)
Flow directionSeparate source (incoming) and destination (outgoing) analysisSingle combined exposure view
Entity detailNamed entities with actor IDs, UUIDs, VASP statusCategory-level aggregation only
Hop tracingmin_number_of_hops per entity (0 = direct)proximity: direct or indirect
Risk rulesevaluation_detail with named rules: "Sanctions", "Illicit Activity", "Obfuscating & Misc."risks array with triggered rule objects and thresholds
Cluster infocluster_entities — entities directly associated with the addressNot available
USD volumescontribution_value.usd, indirect_value.usd, counterparty_value.usd per entityNot available (percentages only)

Risk Levels

Elliptic (0-10 scale):

RangeLevelDescription
0 — 3lowMinimal risk. No significant exposure
3 — 7mediumModerate risk. Some risky categories detected
7 — 10highHigh risk. Sanctioned, illicit, or high-risk entities
null-No risk triggers detected

BitOK (0-1.0 scale):

RangeLevelDescription
0 — 0.3lowLow risk. Mostly clean exposure
0.3 — 0.7mediumMedium risk. Notable high-risk exposure
0.7 — 1.0highHigh risk. Illicit, sanctioned, or darknet entities

Error Responses

Authentication Error (401)

json
{
    "detail": {
        "code": -1,
        "msg": "API key not provided"
    }
}

Validation Error (400)

json
{
    "success": false,
    "error": {
        "code": 4001,
        "msg": "Invalid or missing address"
    }
}
json
{
    "success": false,
    "error": {
        "code": 4002,
        "msg": "Invalid provider. Use: elliptic, bitok"
    }
}

Insufficient Balance (402)

json
{
    "success": false,
    "error": {
        "code": 4020,
        "message": "Insufficient balance"
    },
    "timestamp": "2026-03-10 10:00:00"
}

Provider Unavailable (503)

json
{
    "success": false,
    "error": {
        "code": 5030,
        "message": "Provider elliptic not available"
    },
    "timestamp": "2026-03-10 10:00:00"
}

Error Code Reference

CodeDescriptionHTTP Status
-1Authentication failed401
4001Invalid or missing address400
4002Invalid provider400
4020Insufficient balance402
5030Provider unavailable503

Rate Limits

The following rate limits apply to all AML endpoints (per IP address):

PeriodLimitDescription
1 second2 requestsMaximum 2 requests per second
1 minute30 requestsMaximum 30 requests per minute

Rate Limit Exceeded (429)

json
{
    "message": "API rate limit exceeded"
}

Result Caching

If the same address + provider combination was checked within the last 60 seconds, the cached result is returned at no charge.

Supported Networks

The network parameter is required. Use the ticker from the table below.

Elliptic — Holistic Screening

Screening is performed for a specific address on a specific network. However, Elliptic traces all assets associated with that address — including tokens, cross-chain transfers, and interactions with known entities across other networks.

NetworkTickerNative Asset
AlgorandalgoALGO
AptosaptAPT
ArbitrumarbETH
Avalanche (C-Chain)avaxAVAX
BasebaseETH
Binance ChainbnbBNB
Binance Smart ChainbscBNB
BitcoinbtcBTC
BittensortaoTAO
CardanoadaADA
CeloceloCELO
CosmosatomATOM
Crypto.comcroCRO
DogecoindogeDOGE
dYdXdydxDYDX
EthereumethETH
Ethereum ClassicetcETC
FantomftmFTM
FilecoinfilFIL
FlareflrFLR
GnosisgnosisxDai
HederahbarHBAR
HyperEVMhypeHYPE
InjectiveinjINJ
Internet ComputericpICP
LinealineaLINEA
LitecoinltcLTC
MobileCoinmobMOB
NearnearNEAR
OptimismopETH
PolkadotdotDOT
PolygonmaticMATIC
RipplexrpXRP
SeiseiSEI
SolanasolSOL
StarknetstrkSTRK
StellarxlmXLM
SuisuiSUI
TezosxtzXTZ
TONtonTON
TrontrxTRX
XDCxdcXDC
XLayerokbOKB
ZilliqazilZIL
zkSynczksyncETH

Single Asset Screening

These networks support individual address/transaction screening:

NetworkTickerNative Asset
Bitcoin CashbchBCH
HorizenzenZEN
ZCashzecZEC

BitOK

BitOK supports 5 networks:

NetworkTickerNative Asset
TrontrxTRX
EthereumethETH
BitcoinbtcBTC
Binance Smart ChainbscBNB
LitecoinltcLTC

Provider & Network Compatibility

When using provider: "elliptic" — all networks from Holistic and Single Asset tables are available (47 networks). When using provider: "bitok" — only TRX, ETH, BTC, BSC, LTC are supported. If an unsupported network is passed, the API returns error code 4001.

Notes

  • Pricing: Elliptic — $0.98 per check, BitOK — $0.50 per check. Prices shown in TRX at current rate
  • Sync timeout: wait: true waits up to 15 seconds. If check takes longer, returns pending status
  • Processing time: Most checks complete within a few seconds. However, some requests (especially for addresses with complex transaction history) may take up to 3 minutes to process. Use asynchronous mode (omit wait or set wait: false) and poll via GET /apiv2/aml/{order_id} for such cases
  • Inactive addresses: Addresses with no blockchain activity return skipped status at no charge