Skip to content
This translation is behind the English original, updated 2026-09-15. Read the English version for the current text.

POST /apiv2/screening

Bir blokzincir adresi için AML taraması siparişi verin. Bu, sürüm 2 sözleşmesidir: her sağlayıcı ve siparişin her durumu için tek bir yanıt yapısı, dize olarak ondalık sayılar ve tek bir hata formatı.

Çalışmaya devam eden ve önceden bildirilmeksizin kaldırılmayacak olan POST /apiv2/aml uç noktasının yerini alır.

Uç Nokta URL'si

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

İstek Üstbilgileri

HeaderRequiredDescription
Content-TypeEvetapplication/json
X-API-KEYEvetNetts kontrol panelinizdeki API anahtarınız
X-Idempotency-KeyHayırGüvenli yeniden denemeler için kendi anahtarınız. Bkz. Idempotency

İstek Gövdesi

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

İstek Parametreleri

ParameterTypeRequiredDescription
addressstringEvetTaranacak adres, 10–128 karakter
networkstringEvetAğ kısaltması. Her sağlayıcının kapsadığı kısaltmalar GET /apiv2/screening/providers tarafından listelenir; ağların adlarıyla birlikte tam tablosu buradadır
providerstringEvetelliptic veya bitok. Varsayılan bir değer yoktur
wait_for_resultbooleanHayırtrue sonucu 15 saniyeye kadar bekler. Varsayılan false
languagestringHayırRapor dili. Yalnızca en

Bilinmeyen alanlar reddedilir. Yukarıdaki tabloda yer almayan bir alan içeren bir gövde, 4001 koduyla birlikte 400 döndürür. Sürüm 1'de bilinmeyen alanlar sessizce yok sayılırdı ve yanlış yazılmış bir wait, çağıranın eşzamanlı olarak asla gelmeyecek bir sonucu beklemesi anlamına gelirdi.

provider zorunludur ve varsayılanı yoktur. Sürüm 1'de belirtilmeyen bir sağlayıcı Elliptic anlamına geliyordu, bu nedenle seçim yapmayan bir çağıran, adını hiç belirtmediği bir sağlayıcı için ödeme yapıyordu.

provider, şemada bir numaralandırma değil, serbest biçimli bir dizedir. Bugün iki değer kabul edilmektedir; üçüncü bir sağlayıcı, yanıtları şemaya göre doğrulayan hiç kimse için bozucu bir değişiklik olmamalıdır. Mevcut liste, her sağlayıcının kapsadığı ağlar ve her birinin puanlama yaptığı ölçek GET /apiv2/screening/providers adresinden gelir.

Örnekler

cURL — sonucu bekle

bash
curl -X POST https://netts.io/apiv2/screening \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key" \
  -d '{
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic",
    "wait_for_result": true
  }'

cURL — kabul et ve sorgula

bash
curl -X POST https://netts.io/apiv2/screening \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key" \
  -d '{
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "bitok"
  }'

Yanıt, siparişi işaret eden bir Location başlığı ile birlikte 202 Accepted şeklindedir.

Python

python
import requests
from decimal import Decimal

url = "https://netts.io/apiv2/screening"
headers = {
    "Content-Type": "application/json",
    "X-API-KEY": "your_api_key",
}
payload = {
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic",
    "wait_for_result": True,
}

response = requests.post(url, headers=headers, json=payload)

if response.status_code in (200, 202):
    body = response.json()
    print("Order:", body["order"]["client_order_id"])
    print("Status:", body["order"]["status"])
    if body["risk"]["score"] is not None:
        # Parse provider numbers as Decimal, never as float
        print("Score:", Decimal(body["risk"]["score"]), "of", body["risk"]["scale"]["max"])
    print("Level:", body["risk"]["level"], "-", body["risk"]["level_source"])
    print("Charged:", body["billing"]["charged_amount"], body["billing"]["charged_currency"])
else:
    problem = response.json()
    print(problem["code"], problem["title"], "-", problem["detail"])

Yanıt

DurumKodBaşlıklar
Sipariş oluşturuldu, tarama arka planda çalışıyor202 AcceptedLocation: /apiv2/screening/{client_order_id}
Sonuç yanıtta yer alıyor (wait_for_result)200 OK
Sonuç yakın tarihli bir kontrolden yeniden kullanıldı, ücret alınmadı200 OK
Adreste blokzincir faaliyeti yok, ücret alınmadı200 OK
Hatabkz. ErrorsContent-Type: application/problem+json

Bir tarama sonucu taşıyan yanıtlar Cache-Control: private, no-store ile gönderilir.

Yanıt

json
{
  "schema_version": 2,
  "order": {
    "client_order_id": "A90D21F68C9AEA2",
    "status": "completed",
    "api_version": "v2",
    "cache_hit": false,
    "created_at": "2026-09-13T08:14:29.614988Z",
    "started_at": "2026-09-13T08:14:30.288251Z",
    "completed_at": "2026-09-13T08:14:34.993174Z"
  },
  "request": {
    "address": "YOUR_ADDRESS_HERE",
    "network": "trx",
    "provider": "elliptic"
  },
  "billing": {
    "charged": true,
    "price_usdt": "0.98",
    "base_amount": "2.882421",
    "markup_amount": "0",
    "charged_amount": "2.882421",
    "charged_currency": "TRX",
    "exchange_rate": "0.33999200",
    "payment_status": "pending"
  },
  "precheck": {
    "activity_checked": true,
    "activity_status": "active",
    "source": "tron-address-checker"
  },
  "check": {
    "provider": "elliptic",
    "provider_check_id": "b4903a5d-9f22-4075-b51b-beb40b419b97",
    "checked_at": "2026-09-13T08:14:32.144000Z",
    "status": "completed",
    "provider_status": "complete"
  },
  "risk": {
    "score": "0.9634087310611608",
    "scale": { "min": 0, "max": 10 },
    "level": "low",
    "level_source": "computed",
    "provider_level": null,
    "policy": "netts-risk-v1",
    "by_direction": {
      "source": "0.12332156899576921",
      "destination": "0.9634087310611608"
    }
  },
  "sanctions": {
    "self": false,
    "self_entities": null,
    "exposure": {
      "entity": "HTX (formerly Huobi) - Post-Sanctions - UK Sanctions List - 26 May 2026",
      "category": "Exchange",
      "share_fraction": "0.004409451392423414",
      "proximity": "indirect",
      "hops": 3,
      "direction": "source",
      "rule_name": "Sanctioned, TF & CSAM"
    },
    "items": []
  },
  "exposure": [
    {
      "category": "Exchange",
      "share_fraction": "0.1888065152442461",
      "direction": "source",
      "hops": 2,
      "is_screened_address": false,
      "entities": [
        { "name": "Binance", "category": "Exchange", "is_vasp": true,
          "is_primary": true, "is_after_sanction_date": null }
      ]
    }
  ],
  "rules": [
    { "name": "Sanctioned, TF & CSAM", "type": "exposure", "level": null,
      "score": "0.061426483114820525", "share_fraction": null, "category": null,
      "proximity": null, "direction": "source", "detected_at": null }
  ],
  "entities": [
    { "name": "Unknown", "category": "Unknown", "is_vasp": null,
      "is_primary": true, "is_after_sanction_date": false }
  ],
  "primary_entity": {
    "name": "Unknown", "category": "Unknown", "is_vasp": null,
    "is_primary": true, "is_after_sanction_date": false
  },
  "sanctioned_entities": [],
  "wallet": {
    "inflow_usd": "354663.6116669158",
    "outflow_usd": "80248.63081808022"
  },
  "provider_data": { }
}

Alan seti asla değişmez

Yukarıda listelenen her blok, sağlayıcı ne olursa olsun ve siparişin durumu ne olursa olsun her yanıtta mevcuttur. Bir sağlayıcının sağlamadığı değer null olur; içinde hiçbir şey olmayan bir liste null değil, [] olur; henüz verisi olmayan bir blok atlanmak yerine null değerlerle doldurulur. Tek bir ayrıştırıcı, henüz kabul edilmiş bir kontrolü ve tamamlandıktan sonraki aynı kontrolü işler.

Kodunuz için iki sonuç:

  • bilmediğiniz alanları yok sayın. Bu bloklara yeni bir sürüm olmadan yeni alanlar eklenir. Bilinmeyen bir alanı reddetmek bizim değil, sizin hatanızdır;
  • provider_data sözleşmenin bir parçası değildir. Şekli sağlayıcıyı takip eder ve sağlayıcı değiştikçe değişir. Sözleşmenin garanti ettiği her şey yukarıdaki bloklarda yer alır.

order

FieldTypeDescription
client_order_idstringSipariş tanımlayıcısı, sonucu daha sonra okumak için kullanılır
statusstringpending, processing, completed, skipped, failed
api_versionstringSiparişi oluşturan sözleşme
cache_hitbooleanYakın tarihli bir sonuç yeniden kullanıldığında ve ücret alınmadığında true
created_atstringRFC 3339, UTC, mikrosaniye
started_atstring | nullSağlayıcı çağrısının başladığı zaman. skipped için null
completed_atstring | nullSonucun ulaştığı zaman
errorstringYalnızca failed için: neden başarısız olduğu
reasonstringYalnızca skipped için: address_inactive

Tüm zaman damgaları UTC, RFC 3339 formatında, Z sonekine ve mikrosaniye hassasiyetine sahiptir.

billing

FieldTypeDescription
chargedbooleanPara tahsil edilip edilmediği
price_usdtstringSağlayıcının USDT cinsinden liste fiyatı
base_amountstringAlt kullanıcı kâr marjı olmadan, tahsil edilen para biriminde sipariş fiyatı
markup_amountstringAlt kullanıcı kâr marjı. Doğrudan bir hesap için "0"
charged_amountstringBakiyeden fiilen tahsil edilen tutar
charged_currencystringTRX
exchange_ratestring | nullDönüşüm için kullanılan kur
payment_statusstringpaid, pending, failed, not_charged

payment_status, başarılı bir kontrolden sonra kısa bir süre için pending durumundadır: ücret önce bloke edilir ve bir saat içinde kesinleşir. failed, paranın iade edildiği anlamına gelir. not_charged, hiçbir ücret oluşturulmadığı anlamına gelir — yeniden kullanılan bir sonuç veya atlanan bir adres.

precheck

Ücretli bir taramadan önce adres, blokzincir faaliyeti açısından kontrol edilir. Hiçbir faaliyeti olmayan bir adres sağlayıcıya gönderilmez ve ücretlendirilmez.

FieldTypeDescription
activity_checkedbooleanKontrolün çalışıp çalışmadığı. Mevcut olmadığı ağlarda false
activity_statusstringactive, inactive, unknown
sourcestring | nullMekanizmanın adı

unknown, ücretli taramayı durdurmaz: faaliyet servisi kullanılamıyorsa adres aktif olarak değerlendirilir.

check

FieldTypeDescription
providerstringKontrolü gerçekleştiren sağlayıcı
provider_check_idstring | nullSağlayıcının kendi tanımlayıcısı — onlarla bir sonucu tartışırken bunu belirtin
checked_atstring | nullSağlayıcının sonucu ürettiği zaman
statusstringAşağıdaki tabloya bakın
provider_statusstring | nullSağlayıcının değiştirilmemiş kendi ifadesi
order.statuscheck.statusAnlamı
pendingpendingSipariş kabul edildi, henüz başlatılmadı
processingrunningSağlayıcı üzerinde çalışıyor
completedcompletedSonuç alındı
failedfailedSağlayıcı çağrısından önce veya çağrı sırasında reddedildi
skippednot_performedAdreste hiçbir faaliyet yok; sağlayıcı hiçbir zaman çağrılmadı ve hiçbir ücret tahsil edilmedi

risk

FieldTypeDescription
scorestring | nullOndalık dize olarak sağlayıcının kendi puanı
scaleobjectBu sağlayıcının ölçeğinin min ve max değerleri
levelstringnone, low, medium, high, severe
level_sourcestringcomputed — seviyeyi puandan türettik; provider — sağlayıcı belirtti
provider_levelstring | nullSağlayıcının döndürdüğü durumlarda kendi ifadesi
policystringEşik politikasının adı, netts-risk-v1
by_directionobjectSağlayıcının ayırdığı durumlarda source ve destination olarak ayrılmış puan

Puan asla yeniden ölçeklendirilmez. Elliptic 0–10 ve BitOK 0–1 aralığında çalışır ve bir ölçekteki 7, diğerindeki 0.7 ile anlamlı hiçbir şekilde denk değildir. Tek bir sağlayıcıya göre yazılmış bir entegrasyonun tek bir yapılandırma değişikliğinden sonra bir başkasını yanlış yorumlamaması için ölçek yanıtta iletilir.

Seviye, tüm API genelinde tek bir sözlüktür. Sağlayıcının kendi seviyesini belirttiği durumlarda bunu doğrudan iletir ve level_source içinde bunu belirtiriz; belirtmediği durumlarda ise seviyeyi netts-risk-v1 eşikleriyle puandan türetir ve bunun yerine bunu ifade ederiz. Aynı kontrol için API yanıtında, kontrol panelinde ve PDF raporunda aynı sözcük görünür.

exposure[], rules[], entities[]

exposure[], fonları karşı taraf kategorisine göre ayrıştırır. rules[], sağlayıcının tetiklenen kurallarını listeler. entities[], adresin kendisinin ait olduğu varlıkları listeler; primary_entity, sabit bir kuralla bunlardan birini seçer — sağlayıcının birincil olarak işaretlediği varlık, aksi halde ilki, aksi halde null. sanctioned_entities[], entities[] içinden bir yaptırım tarihinden sonra aktif olarak işaretlenenleri barındırır.

Paylar orandır, asla yüzde değildir

Yanıttaki her pay, "0" ile "1" arasında bir ondalık dize olan tek bir alandır: share_fraction.

text
Elliptic reports 31.574732212596924 %  ->  "share_fraction": "0.31574732212596924"
BitOK reports    0.8488                ->  "share_fraction": "0.8488"

Sağlayıcılar birimler konusunda farklılık gösterir: aynı üçte birlik risk maruziyeti birinden 31.57, diğerinden 0.3157 olarak gelir. Her ikisini birden taşıyan tek bir alanı sağlayıcıyı bilmeden okumak imkansız olurdu. Sağlayıcının kendi birimlerindeki kendi sayısı provider_data içinde kalır.

Sayılar dizedir

Bir sağlayıcıdan gelen her sayı — puanlar, paylar, USD hacimleri ve billing içindeki her tutar — bir ondalık dizedir.

json
"score": "0.9634087310611608"

Bunu JavaScript, Go veya ikili kayan noktalı sayı kullanan başka bir dilde JSON sayısı olarak ayrıştırmak yaklaşık bir değer verir ve yazdırdığınız değer sağlayıcının verdiği değerle eşleşmemeye başlar. Bu alanları ondalık bir türle ayrıştırın: Python'da Decimal, Java'da BigDecimal, JavaScript'te decimal.Decimal veya bir dize.

Sağlayıcıya değil bize ait olan alanlar — scale.min, scale.max, hops — düz JSON sayılarıdır.

Yakın tarihli bir sonucun yeniden kullanılması

Aynı adresi, ağı ve sağlayıcıyı 60 saniye içinde tekrar taradığınızda, önceki sonuç döndürülür ve hiçbir ücret alınmaz.

Her istek yine de kendi client_order_id değeriyle kendi siparişini oluşturur; yeniden kullanılan sipariş "cache_hit": true olarak işaretlenir ve billing bloğu "payment_status": "not_charged" ile "charged": false bildirir. Sonucun geldiği siparişin tanımlayıcısı açıklanmaz — başka bir hesaba ait olabilir.

Yeniden kullanım yalnızca tek bir hesap içinde gerçekleşir. Başkası tarafından taranan bir sonuç asla size döndürülmez.

Idempotency

Yeniden denemeyi güvenli hale getirmek için kendi belirleyeceğiniz bir değerle X-Idempotency-Key gönderin: aynı gövdeye sahip aynı anahtar, ikinci bir kontrol siparişi vermek yerine saklanan yanıtı döndürür.

DurumKodYanıt
Bu anahtara sahip ilk istek hala çalışıyor4094090
Aynı anahtar, farklı bir istek gövdesi4094093
Aynı anahtar, aynı gövde, zaten tamamlanmışsaklanan kodsaklanan yanıt

Başlığı göndermezseniz, API anahtarından, adresten, sağlayıcıdan ve IP adresinizden iki saniyelik bir pencerede sizin için bir anahtar oluşturulur. Bu, çift tıklamaya ve ağ geçidi yeniden denemesine karşı koruma sağlar; bir dakika sonraki tekrara karşı sağlamaz: o gerçek bir yeni sipariştir ve ücretlendirilir.

Anahtarların kapsamı uç nokta başınadır. POST /apiv2/aml ve bu uç noktaya gönderilen aynı değer, iki farklı istek hakkında iki bağımsız taahhüttür — gövdeler farklıdır ve yanıtlar da öyledir. Bir entegrasyonu sürüm 1'den sürüm 2'ye taşırken anahtarınızı yeniden kullanmak güvenlidir: bu ne size bir sürüm 1 yanıtı döndürür ne de farklı bir gövdeyle kullanılan aynı anahtar sayılır.

Hata Yanıtları

Uygulama tarafından üretilen her hata Content-Type: application/problem+json ile RFC 9457 standardını kullanır:

json
{
  "type": "https://doc.netts.io/api/v2/errors/insufficient-funds",
  "title": "Insufficient funds",
  "status": 403,
  "detail": "Insufficient funds. Required: 2.888742 TRX, Available: 1.203000 TRX",
  "instance": "/apiv2/screening",
  "code": 1004,
  "required_trx": "2.888742",
  "available_trx": "1.203000"
}

type, title, status, detail ve instance standart alanlardır. Sayısal code, sürüm 1'e göre yazılmış entegrasyonların bununla eşleşmeye devam edebilmesi için bir uzantı olarak tutulmuştur. Ek alanlar hataya bağlıdır ve bilmediğiniz durumlarda yok sayılmalıdır.

KodHTTPAnlamı
4000400Gövde geçerli bir JSON değil
4001400Bir alan doğrulamadan geçemedi veya bilinmeyen bir alan gönderildi
4002403Sağlayıcı hesabınız için kullanılamıyor
4003400Hatalı biçimlendirilmiş sipariş tanımlayıcısı
4004400Sağlayıcı istenen ağı desteklemiyor
4010401API anahtarı yok
4011401API anahtarı veya IP adresi kabul edilmedi
4040404Sipariş bulunamadı
4041404Hesap bulunamadı
4090409Bu idempotency anahtarına sahip bir istek hala çalışıyor
4091409Yinelenen istek
4093409Bu idempotency anahtarı farklı bir gövdeyle kullanıldı
1004403Yetersiz bakiye
5000500Dahili hata
5001500Tahsilat gerçekleşmedi
5002500Sipariş oluşturulmadı
5030503Sağlayıcı kullanılamıyor

Bu formatı kullanmayan hatalar

Bazı arızalar uygulamaya ulaşılmadan önce ağ geçidinde meydana gelir ve ağ geçidinin kendi biçimini korur. Content-Type değeri application/problem+json olmayan herhangi bir yanıtı bunlardan biri olarak ele alın:

DurumHTTPGövde
API anahtarı yok veya kabul edilmeyen bir anahtar401{"detail":{"code":-1,"msg":"Invalid or missing API key"}}
İstek limiti aşıldı429{"message":"API rate limit exceeded"}
Bilinmeyen yol veya rotanın hizmet vermediği bir yöntem404 / 405{"detail":"Method Not Allowed"}

İstek Hızı Sınırları

Limit, POST /apiv2/aml ve diğer AML yolları ile paylaşılır: saniyede 5 istek ve dakikada 150 istek. Bu uç noktaya geçmek size ikinci bir kota hakkı vermez.

Notlar

  • Fiyatlandırma: Kontrol başına Elliptic $0.98, BitOK $0.50 olup, tahsilat anındaki kur üzerinden TRX bakiyesinden tahsil edilir.
  • İşlem süresi: çoğu kontrol birkaç saniyede tamamlanır; uzun bir geçmişe sahip bir adres üç dakikaya kadar sürebilir. Asenkron modu kullanın ve sonucu GET /apiv2/screening/{client_order_id} ile okuyun.
  • Etkin olmayan adresler skipped döndürür ve ücretlendirilmez.
  • Sağlayıcının ham yanıtı asla döndürülmez. provider_data gözden geçirilmiş bir izdüşümdür; taranan adresten ziyade sağlayıcı nezdindeki hesabımıza ait olan alanlar hiç kimseye yayınlanmaz.

Raporlar

Uç nokta JSON döndürür ve başka hiçbir şey döndürmez. PDF ve Markdown yoktur.

Bir raporu oluşturan her şey yanıtta zaten mevcuttur: birleştirilmiş blok ve provider_data. Bunu kendi tarafınızda oluşturmak size gerçekten istediğiniz belgeyi sunar — kendi markanız, kendi diliniz, kendi düzeniniz — bu da kontrolleri yeniden satıyorsanız özellikle önemlidir, çünkü bizim adımızı taşıyan bir rapor kendi müşterinize teslim edilecek yanlış belgedir.

Bir rapora üçüncü bir taraf için kanıt olarak ihtiyacınız varsa — bir banka, bir düzenleyici kurum, bir karşı taraf — imzasız bir PDF'in, kim oluşturursa oluştursun bir kanıt olmadığını unutmayın: bir metin düzenleyicide bir dakika içinde düzenlenebilir. Doğrulanabilir bir yapıt için bir imza veya genel bir doğrulama sayfası gerekir ve bu farklı bir özelliktir. Durumunuz buysa, karşı tarafınızın ne talep ettiğini bize bildirin.

Aynı kontroller için insan tarafından okunabilir PDF raporları, Netts kontrol panelinde on yedi dilde mevcuttur.

Ayrıca Bakınız