Appearance
POST /apiv2/aml
Digantikan oleh POST /apiv2/screening
POST /apiv2/screening adalah kontrak versi 2: satu bentuk respons untuk setiap penyedia dan setiap status pesanan, angka desimal sebagai string alih-alih angka JSON, pembagian dalam satu skala, dan satu format kesalahan tunggal. Endpoint ini tetap berfungsi dan tidak akan ditarik tanpa pemberitahuan.
Kirimkan alamat untuk penyaringan AML (Anti-Money Laundering). Mengembalikan skor risiko, tingkat risiko, dan analisis paparan terperinci.
Semua stempel waktu dalam respons adalah UTC. Format string tidak berubah — "2026-09-09 23:01:44", tanpa sufiks zona.
URL Endpoint
POST https://netts.io/apiv2/amlHeader Permintaan
| Header | Diperlukan | Deskripsi |
|---|---|---|
| Content-Type | Ya | application/json |
| X-API-KEY | Ya | Kunci API Anda dari dasbor Netts |
Body Permintaan
json
{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait": true
}Parameter
| Parameter | Tipe | Diperlukan | Deskripsi |
|---|---|---|---|
| address | string | Ya | Alamat blockchain yang akan diperiksa (10-100 karakter) |
| network | string | Ya | Pengidentifikasi jaringan blockchain (lihat Jaringan yang Didukung di bawah) |
| provider | string | Tidak | Penyedia AML: elliptic (default) |
| wait | boolean | Tidak | Jika true, tunggu hasil secara sinkron (hingga 15 detik). Jika false atau diabaikan, segera kembalikan status pending dan client_order_id — gunakan untuk memeriksa hasil secara berkala melalui GET /apiv2/aml/{order_id} |
| response_format | string | Tidak | Tingkat detail respons: rate (hanya skor), full (default, data lengkap) |
| report_language | string | Tidak | Bahasa untuk laporan: en (default) |
Penyedia
| Penyedia | Rentang Skor | Deskripsi |
|---|---|---|
elliptic | 0 — 10 | Skor risiko Elliptic. 0 = tidak ada risiko, 10 = risiko maksimum. null = tidak ada pemicu yang terdeteksi |
Contoh Permintaan
cURL (sinkron)
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 (asinkron)
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}")Respons
Berhasil — Menunda (200 OK)
Ketika wait tidak diatur atau pemeriksaan masih diproses:
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"
}Berhasil — Elliptic Selesai (200 OK)
Respons Elliptic lengkap dengan semua struktur data:
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"
}Bidang Respons
| Bidang | Tipe | Deskripsi |
|---|---|---|
| data.client_order_id | string | ID pesanan unik untuk pengecekan status |
| data.status | string | pending, processing, completed, failed, skipped |
| data.risk_score | number | null | Skor risiko. Elliptic: 0-10. null = tidak ada pemicu |
| data.risk_level | string | null | none, low, medium, high atau severe. Elliptic mengembalikan low, medium, high; BitOK menambahkan none dan severe. null ketika penyedia tidak mendeteksi pemicu sama sekali |
| data.is_sanctioned | boolean | true jika paparan terhadap entitas yang dikenai sanksi terdeteksi. Tidak berubah sejak endpoint diluncurkan: ini tidak membedakan alamat yang dikenai sanksi dengan alamat yang sekadar terkait dengan entitas tersebut — lihat data.sanctions untuk itu |
| data.sanctions | object | null | Rincian temuan sanksi: apakah alamat itu sendiri terdaftar, seberapa dekat keterkaitannya, dan seberapa besar. Lihat Sanksi |
| data.result | object | Respons lengkap penyedia (jika response_format=full) |
Sanksi
is_sanctioned adalah nilai boolean tunggal, dan menyatakan true dalam dua situasi yang sangat berbeda: alamat yang diperiksa itu sendiri berada dalam daftar sanksi, atau alamat yang diperiksa pernah menerima sebagian kecil persen melalui dua perantara dari pihak yang terkena sanksi. Flag ini tetap mempertahankan arti aslinya untuk kompatibilitas mundur; data.sanctions membedakan kedua kasus tersebut.
| Bidang | Tipe | Deskripsi |
|---|---|---|
| sanctions.self | boolean | true ketika alamat yang diperiksa itu sendiri merupakan entitas yang dikenai sanksi |
| sanctions.self_entities | array | null | Nama-nama entitas sanksinya sendiri, ketika self bernilai true |
| sanctions.exposure | object | null | Keterkaitan sanksi tunggal terbesar — apa yang ditampilkan dalam ringkasan |
| sanctions.exposure.share | number | Porsi dana yang terlibat, dalam persen (8.03 berarti 8,03%) |
| sanctions.exposure.proximity | string | screened_address, counterparty, indirect atau mixed |
| sanctions.exposure.hops | number | null | Jumlah hop transaksi minimum ke entitas yang dikenai sanksi |
| sanctions.exposure.entity | string | null | Nama entitas yang dikenai sanksi, termasuk daftar dan tanggalnya |
| sanctions.exposure.direction | string | null | source untuk dana masuk, destination untuk dana keluar |
| sanctions.items | array | Setiap kontribusi sanksi, porsi terbesar terlebih dahulu, bidang yang sama dengan exposure ditambah counterparty_share, indirect_share, value_usd, dan trigger |
| sanctions.related | array | null | Khusus BitOK: paparan terhadap bursa di bawah sanksi UE atau Inggris, dipisahkan dari daftar sanksi itu sendiri |
Kedekatan mencerminkan kolom Closest Proximity pada laporan Elliptic:
| Nilai | Arti |
|---|---|
screened_address | Alamat yang diperiksa merupakan pemicu itu sendiri, bukan rekanan |
counterparty | Rekanan langsung dari alamat yang diperiksa |
indirect | Dijangkau melalui perantara — lihat hops |
mixed | Aliran langsung dan tidak langsung ke entitas yang sama |
Sebuah kontribusi dihitung sebagai keterkaitan sanksi hanya jika penyedia menandainya demikian — risk_triggers.is_sanctioned untuk Elliptic, kategori sanctions untuk BitOK. Aturan Elliptic bernama Sanctioned, TF & CSAM juga aktif pada pemicu negara dan kategori, sehingga nama aturan saja bukanlah keputusan sanksi.
Objek result Elliptic
| Bidang | Tipe | Deskripsi |
|---|---|---|
| risk_score | number | Skor risiko presisi (0-10) |
| risk_score_detail | object | Rincian: skor source dan destination |
| contributions | object | Larik source dan destination dari kontributor aliran dana |
| contributions[].entities | array | Entitas yang diketahui terkait dengan kontribusi |
| contributions[].entities[].name | string | Nama entitas (mis. "Binance", "KuCoin") |
| contributions[].entities[].category | string | Tipe entitas (mis. "Exchange", "Payment Services Provider") |
| contributions[].entities[].is_vasp | boolean | null | Apakah entitas tersebut adalah Penyedia Layanan Aset Virtual (VASP) |
| contributions[].contribution_value.usd | number | Total volume USD dari kontribusi |
| contributions[].contribution_percentage | number | Persentase total dana dari entitas ini |
| contributions[].indirect_value.usd | number | Volume USD yang diterima secara tidak langsung (melalui perantara) |
| contributions[].indirect_percentage | number | Persentase dana yang diterima secara tidak langsung |
| contributions[].counterparty_value.usd | number | Volume USD sebagai rekanan langsung |
| contributions[].counterparty_percentage | number | Persentase sebagai rekanan langsung |
| contributions[].min_number_of_hops | number | Hop transaksi minimum dari entitas (0 = langsung) |
| contributions[].is_screened_address | boolean | true jika ini adalah alamat yang diperiksa itu sendiri |
| cluster_entities | array | Entitas yang diketahui terkait langsung dengan kluster alamat |
| cluster_entities[].name | string | Nama entitas |
| cluster_entities[].category | string | Kategori entitas |
| cluster_entities[].is_vasp | boolean | null | Status VASP |
| cluster_entities[].is_after_sanction_date | boolean | true jika aktivitas terjadi setelah entitas dikenai sanksi |
| evaluation_detail | object | Larik source dan destination dari aturan risiko yang terpicu |
| evaluation_detail[].rule_name | string | Nama aturan (mis. "Sanctions", "Illicit Activity", "Obfuscating & Misc.") |
| evaluation_detail[].rule_type | string | Tipe aturan (mis. "exposure") |
| evaluation_detail[].risk_score | number | Kontribusi skor risiko dari aturan ini |
| evaluation_detail[].matched_elements | array | Kategori dan entitas yang memicu aturan |
| evaluation_detail[].matched_elements[].category | string | Kategori risiko (mis. "Sanctioned Entity", "Gambling", "Token Blacklisting") |
| evaluation_detail[].matched_elements[].contributions | array | Entitas dalam kategori yang cocok |
| evaluation_detail[].matched_elements[].contributions[].entity | string | Nama entitas |
| evaluation_detail[].matched_elements[].contributions[].contribution_percentage | number | Persentase paparan |
| evaluation_detail[].matched_elements[].contributions[].min_number_of_hops | number | Hop transaksi |
| evaluation_detail[].matched_elements[].contributions[].is_screened_address | boolean | true ketika alamat yang diperiksa itu sendiri memicu aturan |
| evaluation_detail[].matched_elements[].contributions[].risk_triggers | object | Alasan aturan aktif: is_sanctioned untuk daftar sanksi, country untuk yurisdiksi, category untuk tipe entitas |
| evaluation_detail[].matched_behaviors | array | Pola perilaku yang terdeteksi |
| detected_behaviors | array | Pola perilaku global yang terdeteksi pada alamat |
Tingkat Risiko
Elliptic (skala 0-10):
| Rentang | Tingkat | Deskripsi |
|---|---|---|
| 0 — 3 | low | Risiko minimal. Tidak ada paparan signifikan |
| 3 — 7 | medium | Risiko moderat. Beberapa kategori berisiko terdeteksi |
| 7 — 10 | high | Risiko tinggi. Entitas terkena sanksi, terlarang, atau berisiko tinggi |
| null | - | Tidak ada pemicu risiko yang terdeteksi |
BitOK (skala 0-1): penyedia mengembalikan tingkat itu sendiri — none, low, medium, high, atau severe.
risk_level adalah keputusan tunggal yang digunakan di mana saja: respons API, dasbor, dan laporan PDF semuanya mencetak kata yang sama untuk pemeriksaan yang sama.
Respons Kesalahan
Kesalahan Autentikasi (401)
json
{
"detail": {
"code": -1,
"msg": "API key not provided"
}
}Kesalahan Validasi (400)
json
{
"success": false,
"error": {
"code": 4001,
"msg": "Invalid or missing address"
}
}json
{
"success": false,
"error": {
"code": 4002,
"msg": "Invalid provider. Use: elliptic"
}
}Saldo Tidak Mencukupi (402)
json
{
"success": false,
"error": {
"code": 4020,
"message": "Insufficient balance"
},
"timestamp": "2026-03-10 10:00:00"
}Penyedia Tidak Tersedia (503)
json
{
"success": false,
"error": {
"code": 5030,
"message": "Provider elliptic not available"
},
"timestamp": "2026-03-10 10:00:00"
}Referensi Kode Kesalahan
| Kode | Deskripsi | Status HTTP |
|---|---|---|
-1 | Autentikasi gagal | 401 |
4001 | Alamat tidak valid atau hilang | 400 |
4002 | Penyedia tidak valid | 400 |
4020 | Saldo tidak mencukupi | 402 |
5030 | Penyedia tidak tersedia | 503 |
Batas Laju
Batas laju berikut berlaku untuk semua endpoint AML (per alamat IP):
| Periode | Batas | Deskripsi |
|---|---|---|
| 1 detik | 2 permintaan | Maksimum 2 permintaan per detik |
| 1 menit | 30 permintaan | Maksimum 30 permintaan per menit |
Batas Laju Terlampaui (429)
json
{
"message": "API rate limit exceeded"
}Tembolok Hasil
Jika kombinasi alamat + penyedia yang sama diperiksa dalam 60 detik terakhir, hasil yang tersimpan dalam tembolok akan dikembalikan tanpa biaya.
Jaringan yang Didukung
Parameter network diperlukan. Gunakan ticker dari tabel di bawah.
Elliptic — Penyaringan Menyeluruh (Holistic Screening)
Penyaringan dilakukan untuk alamat tertentu pada jaringan tertentu. Namun, Elliptic melacak semua aset yang terkait dengan alamat tersebut — termasuk token, transfer lintas rantai, dan interaksi dengan entitas yang dikenal di seluruh jaringan lain.
| Jaringan | Ticker | Aset Asli |
|---|---|---|
| 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 |
Penyaringan Aset Tunggal
Jaringan berikut mendukung penyaringan alamat/transaksi individual:
| Jaringan | Ticker | Aset Asli |
|---|---|---|
| Bitcoin Cash | bch | BCH |
| Horizen | zen | ZEN |
| ZCash | zec | ZEC |
Kompatibilitas Penyedia & Jaringan
Saat menggunakan provider: "elliptic" — semua jaringan dari tabel Penyaringan Menyeluruh dan Aset Tunggal tersedia (47 jaringan). Jika jaringan yang tidak didukung diteruskan, API mengembalikan kode kesalahan 4001.
Catatan
- Penetapan Harga: Elliptic — $0,98 per pemeriksaan. Harga ditampilkan dalam TRX pada kurs saat ini
- Batas Waktu Sinkronisasi:
wait: truemenunggu hingga 15 detik. Jika pemeriksaan memakan waktu lebih lama, mengembalikan statuspending - Waktu Pemrosesan: Sebagian besar pemeriksaan selesai dalam beberapa detik. Namun, beberapa permintaan (terutama untuk alamat dengan riwayat transaksi yang rumit) mungkin memerlukan waktu hingga 3 menit untuk diproses. Gunakan mode asinkron (abaikan
waitatau aturwait: false) dan lakukan polling melalui GET /apiv2/aml/{order_id} untuk kasus seperti ini - Alamat Tidak Aktif: Alamat tanpa aktivitas blockchain mengembalikan status
skippedtanpa biaya