POST /apiv2/screening
สั่งการตรวจสอบ AML สำหรับที่อยู่บล็อกเชน นี่คือสัญญาเวอร์ชัน 2: รูปแบบการตอบกลับรูปแบบเดียวสำหรับทุกผู้ให้บริการและทุกสถานะของคำสั่งซื้อ, ตัวเลขทศนิยมในรูปแบบสตริง, และรูปแบบข้อผิดพลาดรูปแบบเดียว
ส่วนนี้มาแทนที่ POST /apiv2/aml ซึ่งยังคงใช้งานได้ต่อไปและจะไม่มีการยกเลิกโดยไม่แจ้งให้ทราบล่วงหน้า
URL ของ Endpoint
POST https://netts.io/apiv2/screeningHeaders ของคำขอ
| ส่วนหัว | จำเป็น | คำอธิบาย |
|---|---|---|
| Content-Type | ใช่ | application/json |
| X-API-KEY | ใช่ | คีย์ API ของคุณจากแดชบอร์ด Netts |
| X-Idempotency-Key | ไม่ | คีย์ของคุณเองสำหรับการลองใหม่ได้อย่างปลอดภัย ดูที่ การทำงานแบบ Idempotency |
เนื้อหาของคำขอ
{
"address": "YOUR_ADDRESS_HERE",
"network": "trx",
"provider": "elliptic",
"wait_for_result": true
}พารามิเตอร์
| พารามิเตอร์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| address | string | ใช่ | ที่อยู่ที่ต้องการตรวจสอบ, ความยาว 10–128 ตัวอักษร |
| network | string | ใช่ | ทิกเกอร์เครือข่าย โดยทิกเกอร์ที่ผู้ให้บริการแต่ละรายครอบคลุมจะแสดงไว้ที่ GET /apiv2/screening/providers; ตารางเครือข่ายแบบเต็มพร้อมชื่อสามารถดูได้ที่ ที่นี่ |
| provider | string | ใช่ | elliptic หรือ bitok ไม่มีค่าเริ่มต้น |
| wait_for_result | boolean | ไม่ | true จะรอผลลัพธ์นานสูงสุด 15 วินาที ค่าเริ่มต้นคือ false |
| language | string | ไม่ | ภาษาของรายงาน รองรับเฉพาะ en |
ฟิลด์ที่ไม่รู้จักจะถูกปฏิเสธ Body ที่มีฟิลด์ที่ไม่ได้อยู่ในตารางข้างต้นจะส่งคืนรหัส 400 พร้อมโค้ด 4001 ในเวอร์ชัน 1 ฟิลด์ที่ไม่รู้จักจะถูกละเว้นไปโดยไม่มีการแจ้งเตือน และการสะกดคำว่า wait ผิดหมายความว่าผู้เรียกจะรอผลลัพธ์ที่ไม่มีวันส่งมาแบบ synchronous
provider เป็นฟิลด์ที่จำเป็นและไม่มีค่าเริ่มต้น ในเวอร์ชัน 1 การเว้นว่าง provider ไว้จะหมายถึง Elliptic ทำให้ผู้เรียกที่ไม่ได้เลือกต้องจ่ายเงินสำหรับผู้ให้บริการที่ตนไม่ได้ระบุชื่อไว้
provider เป็นสตริงรูปแบบอิสระใน schema ไม่ใช่แบบ enumeration ในปัจจุบันรองรับอยู่สองค่า การเพิ่มผู้ให้บริการรายที่สามจะต้องไม่เป็นการเปลี่ยนแปลงที่ทำให้ระบบเดิมพัง (breaking change) สำหรับผู้ที่ตรวจสอบความถูกต้องของการตอบกลับเทียบกับ schema รายการปัจจุบัน, เครือข่ายที่ผู้ให้บริการแต่ละรายครอบคลุม และสเกลการให้คะแนนของแต่ละรายสามารถเรียกดูได้จาก GET /apiv2/screening/providers
ตัวอย่าง Request
cURL — รอผลลัพธ์
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 — ยอมรับและรอตรวจสอบสถานะ (poll)
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"
}'การตอบกลับจะเป็น 202 Accepted พร้อมส่วนหัว Location ที่ชี้ไปยังคำสั่งซื้อ
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:
# แปลงตัวเลขของผู้ให้บริการเป็น Decimal ห้ามแปลงเป็น 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"])รหัสการตอบกลับ
| สถานการณ์ | รหัส | ส่วนหัว |
|---|---|---|
| สร้างคำสั่งซื้อแล้ว การตรวจสอบกำลังดำเนินการในเบื้องหลัง | 202 Accepted | Location: /apiv2/screening/{client_order_id} |
มีผลลัพธ์รวมอยู่ในการตอบกลับ (wait_for_result) | 200 OK | — |
| นำผลลัพธ์จากการตรวจสอบล่าสุดมาใช้ซ้ำ ไม่มีการเรียกเก็บเงิน | 200 OK | — |
| ที่อยู่ไม่มีกิจกรรมบนบล็อกเชน ไม่มีการเรียกเก็บเงิน | 200 OK | — |
| ข้อผิดพลาด | ดูที่ ข้อผิดพลาด | Content-Type: application/problem+json |
การตอบกลับที่มีผลการตรวจสอบจะถูกส่งไปพร้อมกับ Cache-Control: private, no-store
การตอบกลับ
{
"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": { }
}ชุดฟิลด์จะไม่มีการเปลี่ยนแปลง
ทุกบล็อกที่ระบุไว้ข้างต้นจะมีอยู่ในการตอบกลับทุกครั้ง ไม่ว่าจะเป็นผู้ให้บริการรายใดและไม่ว่าคำสั่งซื้อจะอยู่ในสถานะใดก็ตาม ข้อมูลที่ผู้ให้บริการไม่ได้ส่งมาจะระบุเป็น null; รายการที่ไม่มีข้อมูลอยู่จะระบุเป็น [] ไม่ใช่ null; บล็อกที่ยังไม่มีข้อมูลจะถูกเติมด้วยค่าว่าง (null) แทนที่จะถูกตัดออก ตัวแจงส่วน (parser) เพียงตัวเดียวสามารถจัดการการตรวจสอบที่เพิ่งได้รับการยอมรับและการตรวจสอบเดียวกันนั้นเมื่อดำเนินการเสร็จสิ้นแล้วได้
ข้อควรระวังสองประการสำหรับโค้ดของคุณ:
- ละเว้นฟิลด์ที่คุณไม่รู้จัก ฟิลด์ใหม่อาจถูกเพิ่มลงในบล็อกเหล่านี้ได้โดยไม่มีการอัปเดตเวอร์ชันใหม่ การที่ระบบของคุณปฏิเสธฟิลด์ที่ไม่รู้จักถือเป็นข้อผิดพลาดของฝั่งคุณ ไม่ใช่ของเรา
provider_dataไม่ได้เป็นส่วนหนึ่งของสัญญา รูปแบบของฟิลด์นี้จะเป็นไปตามผู้ให้บริการ และจะเปลี่ยนไปเมื่อผู้ให้บริการเปลี่ยนไป ข้อมูลทั้งหมดที่สัญญาให้การรับประกันจะอยู่ในบล็อกต่างๆ ด้านบน
order
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| client_order_id | string | ตัวระบุคำสั่งซื้อ ใช้สำหรับอ่านผลลัพธ์ในภายหลัง |
| status | string | pending, processing, completed, skipped, failed |
| api_version | string | สัญญาที่สร้างคำสั่งซื้อ |
| cache_hit | boolean | true เมื่อมีการนำผลลัพธ์ล่าสุดมาใช้ซ้ำและไม่มีการเรียกเก็บเงิน |
| created_at | string | RFC 3339, UTC, ความละเอียดระดับไมโครวินาที |
| started_at | string | null | เวลาที่เริ่มเรียกใช้งานผู้ให้บริการ จะเป็น null สำหรับ skipped |
| completed_at | string | null | เวลาที่ได้รับผลลัพธ์ |
| error | string | สำหรับ failed เท่านั้น: สาเหตุที่ล้มเหลว |
| reason | string | สำหรับ skipped เท่านั้น: address_inactive |
การประทับเวลาทั้งหมดเป็นรูปแบบ UTC, RFC 3339 พร้อมต่อท้ายด้วย Z และมีความละเอียดระดับไมโครวินาที
billing
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| charged | boolean | มีการหักเงินหรือไม่ |
| price_usdt | string | ราคาตามรายการของผู้ให้บริการในสกุลเงิน USDT |
| base_amount | string | ราคาคำสั่งซื้อในสกุลเงินที่เรียกเก็บเงิน โดยไม่รวมมาร์กอัปของบัญชีย่อย |
| markup_amount | string | มาร์กอัปของบัญชีย่อย จะเป็น "0" สำหรับบัญชีโดยตรง |
| charged_amount | string | จำนวนเงินที่ถูกหักออกจากยอดคงเหลือจริง |
| charged_currency | string | TRX |
| exchange_rate | string | null | อัตราแลกเปลี่ยนที่ใช้สำหรับการแปลงสกุลเงิน |
| payment_status | string | paid, pending, failed, not_charged |
payment_status จะเป็น pending ในช่วงเวลาสั้นๆ หลังจากการตรวจสอบสำเร็จ: ค่าบริการจะถูกระงับไว้ก่อนและจะตัดบัญชีภายในหนึ่งชั่วโมง failed หมายถึงมีการคืนเงินแล้ว not_charged หมายถึงไม่เคยมีการสร้างรายการเรียกเก็บเงินขึ้นเลย — เช่น ผลลัพธ์ที่นำมาใช้ซ้ำหรือที่อยู่ที่ถูกข้ามไป
precheck
ก่อนการตรวจสอบแบบมีค่าบริการ ที่อยู่ดังกล่าวจะถูกตรวจสอบกิจกรรมบนบล็อกเชนก่อน ที่อยู่ที่ไม่มีกิจกรรมจะไม่ถูกส่งไปยังผู้ให้บริการและจะไม่มีการเรียกเก็บเงิน
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| activity_checked | boolean | ดำเนินการตรวจสอบแล้วหรือไม่ จะเป็น false บนเครือข่ายที่ไม่มีฟังก์ชันนี้ |
| activity_status | string | active, inactive, unknown |
| source | string | null | ชื่อของกลไกที่ใช้ตรวจสอบ |
unknown จะไม่หยุดการตรวจสอบแบบมีค่าบริการ: หากบริการตรวจสอบกิจกรรมไม่สามารถใช้งานได้ ระบบจะถือว่าที่อยู่นั้นเป็น active
check
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| provider | string | ผู้ให้บริการที่ทำการตรวจสอบ |
| provider_check_id | string | null | ตัวระบุเฉพาะของผู้ให้บริการเอง — ให้อ้างอิงรหัสนี้เมื่อต้องการโต้แย้งผลการตรวจสอบกับผู้ให้บริการ |
| checked_at | string | null | เวลาที่ผู้ให้บริการแสดงผลลัพธ์ออกมา |
| status | string | ดูตารางด้านล่าง |
| provider_status | string | null | ข้อความสถานะดั้งเดิมของผู้ให้บริการโดยไม่มีการแก้ไข |
order.status | check.status | ความหมาย |
|---|---|---|
pending | pending | ได้รับคำสั่งซื้อแล้ว ยังไม่ได้เริ่มดำเนินการ |
processing | running | ผู้ให้บริการกำลังดำเนินการ |
completed | completed | ได้รับผลลัพธ์แล้ว |
failed | failed | ถูกปฏิเสธก่อนหรือระหว่างการเรียกใช้งานผู้ให้บริการ |
skipped | not_performed | ที่อยู่ดังกล่าวไม่มีกิจกรรม ผู้ให้บริการจะไม่ถูกเรียกใช้งานและไม่มีการเรียกเก็บเงินใดๆ |
risk
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| score | string | null | คะแนนของผู้ให้บริการเอง ในรูปแบบสตริงทศนิยม |
| scale | object | ค่า min และ max ของสเกลผู้ให้บริการรายนั้น |
| level | string | none, low, medium, high, severe |
| level_source | string | computed — เราคำนวณระดับความเสี่ยงจากคะแนน; provider — ผู้ให้บริการเป็นผู้ระบุระดับมาโดยตรง |
| provider_level | string | null | คำระบุระดับของผู้ให้บริการเอง ในกรณีที่มีการส่งกลับมา |
| policy | string | ชื่อของนโยบายเกณฑ์คะแนน netts-risk-v1 |
| by_direction | object | คะแนนที่แยกตาม source และ destination ในกรณีที่ผู้ให้บริการมีการแยกให้ |
คะแนนจะไม่ถูกปรับสเกลใหม่โดยเด็ดขาด Elliptic ใช้สเกล 0–10 และ BitOK ใช้สเกล 0–1 ซึ่งคะแนน 7 ในสเกลหนึ่งไม่ได้เท่ากับ 0.7 ในอีกสเกลหนึ่งในทางความหมายแต่อย่างใด สเกลจะถูกส่งมาในการตอบกลับเพื่อให้การเชื่อมต่อระบบที่เขียนขึ้นสำหรับผู้ให้บริการรายหนึ่งไม่อ่านค่าผิดพลาดเมื่อเปลี่ยนไปใช้อีกรายหลังจากการเปลี่ยนการตั้งค่าเพียงครั้งเดียว
ระดับความเสี่ยงใช้คำศัพท์ชุดเดียวกันทั่วทั้ง API ในกรณีที่ผู้ให้บริการระบุระดับความเสี่ยงมาเอง เราจะส่งต่อค่านั้นและระบุไว้ใน level_source ส่วนในกรณีที่ไม่ได้ระบุมา เราจะคำนวณระดับจากคะแนนโดยใช้เกณฑ์ของ netts-risk-v1 และระบุเช่นนั้นแทน คำศัพท์ชุดเดียวกันจะปรากฏทั้งในการตอบกลับของ API, แดชบอร์ด และรายงาน PDF สำหรับการตรวจสอบรายการเดียวกัน
exposure[], rules[], entities[]
exposure[] จำแนกเงินตามหมวดหมู่ของคู่สัญญา rules[] แสดงรายการกฎของผู้ให้บริการที่มีการทริกเกอร์ entities[] แสดงรายการเอนทิตีที่ที่อยู่นั้นสังกัดอยู่ โดย primary_entity จะเลือกหนึ่งในนั้นตามกฎตายตัว — ได้แก่ เอนทิตีที่ผู้ให้บริการระบุว่าเป็นเอนทิตีหลัก หากไม่มีจะเลือกเอนทิตีแรก หากไม่มีเลยจะเป็น null ส่วน sanctioned_entities[] จะเก็บเอนทิตีใน entities[] ที่ถูกตั้งค่าสถานะว่ายังมีความเคลื่อนไหวหลังวันที่เริ่มมีมาตรการคว่ำบาตร
ส่วนแบ่งเป็นสัดส่วน ไม่ใช่เปอร์เซ็นต์
ทุกสัดส่วนในการตอบกลับจะอยู่ในฟิลด์เดียว คือ share_fraction ซึ่งเป็นสตริงทศนิยมระหว่าง "0" ถึง "1"
Elliptic รายงาน 31.574732212596924 % -> "share_fraction": "0.31574732212596924"
BitOK รายงาน 0.8488 -> "share_fraction": "0.8488"ผู้ให้บริการแต่ละรายใช้หน่วยไม่ตรงกัน: สัดส่วนหนึ่งในสามของการสัมผัสความเสี่ยง (exposure) จะส่งมาเป็น 31.57 จากรายหนึ่ง และ 0.3157 จากอีกรายหนึ่ง การใช้ฟิลด์เดียวเพื่อรองรับทั้งสองแบบจะทำให้อ่านค่าไม่ได้หากไม่ทราบว่ามาจากผู้ให้บริการรายใด ตัวเลขดั้งเดิมของผู้ให้บริการในหน่วยของผู้ให้บริการเองจะยังคงอยู่ใน provider_data
ตัวเลขอยู่ในรูปแบบสตริง
ตัวเลขทุกตัวที่มาจากผู้ให้บริการ — คะแนน, สัดส่วน, ปริมาณเงิน USD และทุกจำนวนเงินใน billing — จะเป็นสตริงทศนิยม
"score": "0.9634087310611608"การแปลงค่าดังกล่าวเป็นตัวเลข JSON ใน JavaScript, Go หรือภาษาอื่นๆ ที่ใช้ floating point แบบเลขฐานสอง จะทำให้ได้ค่าประมาณ และค่าที่คุณพิมพ์ออกมาจะไม่ตรงกับค่าที่ผู้ให้บริการออกให้อีกต่อไป ให้แปลงฟิลด์เหล่านี้ด้วยประเภทข้อมูลแบบทศนิยม: Decimal ใน Python, BigDecimal ใน Java, decimal.Decimal หรือสตริงใน JavaScript
ฟิลด์ที่เป็นของเราเองไม่ใช่ของผู้ให้บริการ — เช่น scale.min, scale.max, hops — จะเป็นตัวเลข JSON ปกติ
การใช้ผลลัพธ์ล่าสุดซ้ำ
เมื่อคุณตรวจสอบที่อยู่ เครือข่าย และผู้ให้บริการเดิมซ้ำอีกครั้งภายใน 60 วินาที ระบบจะส่งคืนผลลัพธ์ก่อนหน้าและไม่มีการเรียกเก็บเงิน
แต่ละ request จะยังคงสร้างคำสั่งซื้อของตัวเองพร้อม client_order_id เฉพาะตัว โดยรายการที่นำผลลัพธ์มาใช้ซ้ำจะถูกทำเครื่องหมายว่า "cache_hit": true และบล็อก billing จะรายงาน "charged": false พร้อมทั้ง "payment_status": "not_charged" ทั้งนี้จะไม่มีการเปิดเผยตัวระบุคำสั่งซื้อที่เป็นต้นทางของผลลัพธ์ — เนื่องจากอาจเป็นของบัญชีอื่น
การใช้ผลลัพธ์ซ้ำจะเกิดขึ้นภายในบัญชีเดียวกันเท่านั้น ผลการตรวจสอบที่ดำเนินการโดยบุคคลอื่นจะไม่มีทางถูกส่งคืนให้กับคุณ
การทำงานแบบ Idempotency
ส่ง X-Idempotency-Key พร้อมค่าของคุณเองเพื่อให้การส่งซ้ำมีความปลอดภัย: การใช้คีย์เดิมกับ body เดียวกันจะส่งคืนการตอบกลับที่ถูกบันทึกไว้แทนที่จะเป็นการสั่งตรวจสอบเป็นครั้งที่สอง
| สถานการณ์ | รหัส | การตอบกลับ |
|---|---|---|
| Request แรกที่ใช้คีย์นี้ยังคงทำงานอยู่ | 409 | 4090 |
| คีย์เดิม แต่ Request Body แตกต่างกัน | 409 | 4093 |
| คีย์เดิม Body เดิม และดำเนินการเสร็จสิ้นแล้ว | รหัสที่ถูกบันทึกไว้ | การตอบกลับที่ถูกบันทึกไว้ |
หากคุณไม่ได้ส่งส่วนหัวนี้ ระบบจะสร้างคีย์ให้คุณโดยอัตโนมัติจากคีย์ API, ที่อยู่, ผู้ให้บริการ และที่อยู่ IP ของคุณ ภายในกรอบเวลาสองวินาที ซึ่งจะช่วยป้องกันการคลิกซ้ำสองครั้งและการลองใหม่ของเกตเวย์ แต่จะไม่ครอบคลุมการทำซ้ำในอีกหนึ่งนาทีต่อมา: กรณีดังกล่าวจะถือเป็นคำสั่งซื้อใหม่จริงๆ และจะมีการเรียกเก็บเงิน
ขอบเขตของคีย์จะแยกตาม endpoint ค่าเดียวกันที่ส่งไปยัง POST /apiv2/aml และส่งมายัง endpoint นี้จะถือเป็นข้อตกลงอิสระสองรายการสำหรับสองคำขอที่แตกต่างกัน — เนื่องจากโครงสร้าง body แตกต่างกัน และการตอบกลับก็แตกต่างกันด้วย การใช้คีย์เดิมซ้ำระหว่างการย้ายระบบเชื่อมต่อจากเวอร์ชัน 1 ไปยังเวอร์ชัน 2 จึงปลอดภัย: จะไม่มีการส่งผลการตอบกลับของเวอร์ชัน 1 คืนให้คุณ และไม่นับว่าเป็นการใช้คีย์เดิมกับ body ที่แตกต่างกัน
ข้อผิดพลาด
ทุกข้อผิดพลาดที่เกิดขึ้นจากแอปพลิเคชันจะใช้มาตรฐาน RFC 9457 ร่วมกับ Content-Type: application/problem+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 และ instance เป็นฟิลด์มาตรฐาน ส่วน code ที่เป็นตัวเลขจะยังคงเก็บไว้เป็นส่วนขยายเพื่อให้ระบบเชื่อมต่อที่เขียนขึ้นสำหรับเวอร์ชัน 1 ยังคงสามารถจับคู่ค่านี้ได้ สำหรับฟิลด์เพิ่มเติมจะขึ้นอยู่กับข้อผิดพลาดนั้นๆ และต้องละเว้นฟิลด์ดังกล่าวเมื่อคุณไม่รู้จัก
| รหัส | HTTP | ความหมาย |
|---|---|---|
4000 | 400 | Body ไม่ใช่ JSON ที่ถูกต้อง |
4001 | 400 | มีฟิลด์ที่ไม่ผ่านการตรวจสอบความถูกต้อง หรือมีการส่งฟิลด์ที่ไม่รู้จักมา |
4002 | 403 | ผู้ให้บริการไม่พร้อมใช้งานสำหรับบัญชีของคุณ |
4003 | 400 | รูปแบบตัวระบุคำสั่งซื้อไม่ถูกต้อง |
4004 | 400 | ผู้ให้บริการไม่รองรับเครือข่ายที่ร้องขอ |
4010 | 401 | ไม่มีคีย์ API |
4011 | 401 | คีย์ API หรือที่อยู่ IP ไม่ได้รับการยอมรับ |
4040 | 404 | ไม่พบคำสั่งซื้อ |
4041 | 404 | ไม่พบบัญชี |
4090 | 409 | Request ที่ใช้คีย์ idempotency นี้ยังคงทำงานอยู่ |
4091 | 409 | Request ซ้ำซ้อน |
4093 | 409 | คีย์ idempotency นี้ถูกนำไปใช้กับ body อื่นแล้ว |
1004 | 403 | ยอดคงเหลือไม่เพียงพอ |
5000 | 500 | ข้อผิดพลาดภายในระบบ |
5001 | 500 | การเรียกเก็บเงินไม่สำเร็จ |
5002 | 500 | ไม่ได้สร้างคำสั่งซื้อ |
5030 | 503 | ผู้ให้บริการไม่พร้อมใช้งาน |
ข้อผิดพลาดที่ไม่ได้ใช้รูปแบบนี้
ข้อผิดพลาดบางอย่างเกิดขึ้นที่เกตเวย์ก่อนที่จะถึงตัวแอปพลิเคชัน และข้อผิดพลาดเหล่านั้นจะยังคงรูปแบบเดิมของเกตเวย์ไว้ ให้ปฏิบัติต่อการตอบกลับใดๆ ที่ Content-Type ไม่ใช่ application/problem+json เสมือนเป็นกรณีใดกรณีหนึ่งดังต่อไปนี้:
| สถานการณ์ | HTTP | Body |
|---|---|---|
| ไม่มีคีย์ API หรือคีย์ไม่ได้รับการยอมรับ | 401 | {"detail":{"code":-1,"msg":"Invalid or missing API key"}} |
| อัตราการเรียกใช้งานเกินกำหนด (Rate limit exceeded) | 429 | {"message":"API rate limit exceeded"} |
| ไม่พบพาธ หรือใช้เมธอดที่เส้นทางดังกล่าวไม่รองรับ | 404 / 405 | {"detail":"Method Not Allowed"} |
ขีดจำกัดอัตราการเรียกใช้ (Rate Limits)
ขีดจำกัดนี้จะแชร์ร่วมกับ POST /apiv2/aml และเส้นทาง AML อื่นๆ: 5 คำขอต่อวินาที และ 150 คำขอต่อนาที การเปลี่ยนมาใช้ endpoint นี้ไม่ได้ให้โควตาเพิ่มเติมแก่คุณ
หมายเหตุ
- ราคา: Elliptic $0.98, BitOK $0.50 ต่อการตรวจสอบหนึ่งครั้ง หักจากยอดคงเหลือ TRX ตามอัตราแลกเปลี่ยน ณ ขณะที่ทำการเรียกเก็บเงิน
- ระยะเวลาประมวลผล: การตรวจสอบส่วนใหญ่จะเสร็จสิ้นภายในไม่กี่วินาที ที่อยู่ที่มีประวัติยาวนานอาจใช้เวลานานสูงสุดถึงสามนาที แนะนำให้ใช้โหมด asynchronous และอ่านผลลัพธ์ด้วย GET /apiv2/screening/{client_order_id}
- ที่อยู่ที่ไม่มีกิจกรรม จะส่งคืนสถานะ
skippedและไม่มีการเรียกเก็บเงิน - ไม่มีการส่งคืนข้อมูลดิบที่ตอบกลับมาจากผู้ให้บริการโดยเด็ดขาด
provider_dataเป็นข้อมูลที่ผ่านการตรวจสอบและคัดกรองแล้ว ฟิลด์ที่เป็นของบัญชีเราที่เปิดไว้กับผู้ให้บริการ ซึ่งไม่ได้เป็นข้อมูลของที่อยู่ที่ถูกตรวจสอบ จะไม่ถูกเผยแพร่ให้แก่ผู้ใด
รายงาน
Endpoint นี้จะส่งคืนข้อมูลเป็น JSON เท่านั้น ไม่มีรูปแบบ PDF หรือ Markdown
ทุกองค์ประกอบที่ประกอบขึ้นเป็นรายงานมีอยู่ในการตอบกลับแล้ว: ทั้งบล็อกแบบรวมศูนย์และ provider_data การนำข้อมูลไปเรนเดอร์ในฝั่งของคุณเองจะช่วยให้คุณได้เอกสารในแบบที่คุณต้องการอย่างแท้จริง — ทั้งแบรนด์ของคุณ, ภาษาของคุณ, รูปแบบเลย์เอาต์ของคุณ — ซึ่งเป็นสิ่งสำคัญอย่างยิ่งหากคุณนำบริการตรวจสอบไปขายต่อ เพราะรายงานที่มีชื่อของเราย่อมเป็นเอกสารที่ไม่เหมาะสมในการส่งมอบให้กับลูกค้าของคุณเอง
หากคุณต้องการรายงานเพื่อใช้เป็นหลักฐานสำหรับบุคคลที่สาม — เช่น ธนาคาร, หน่วยงานกำกับดูแล, หรือคู่สัญญา — โปรดทราบว่า PDF ที่ไม่มีการลงนามดิจิทัลจะไม่ถือเป็นหลักฐานไม่ว่าใครจะเป็นผู้สร้างขึ้นก็ตาม: เนื่องจากสามารถแก้ไขได้ด้วยโปรแกรมแก้ไขข้อความภายในเวลาไม่กี่นาที เอกสารที่สามารถยืนยันความถูกต้องได้จำเป็นต้องมีลายเซ็นดิจิทัลหรือหน้ายืนยันความถูกต้องแบบสาธารณะ ซึ่งนั่นเป็นฟีเจอร์คนละส่วนกัน หากกรณีของคุณเป็นเช่นนั้น โปรดแจ้งให้เราทราบถึงสิ่งที่คู่สัญญาของคุณต้องการ
อย่างไรก็ตาม มีรายงาน PDF ที่มนุษย์สามารถอ่านได้สำหรับการตรวจสอบเหล่านี้จัดเตรียมไว้ให้ในแดชบอร์ด Netts ซึ่งรองรับถึง 17 ภาษา
ดูเพิ่มเติม
- GET /apiv2/screening/{client_order_id} — อ่านผลการตรวจสอบ
- GET /apiv2/screening/history — ประวัติการตรวจสอบของคุณ แบ่งหน้าแบบ cursor
- GET /apiv2/screening/providers — ผู้ให้บริการ, ราคา, เครือข่าย, สเกลคะแนน
- GET /apiv2/screening/price — ราคาของผู้ให้บริการรายเดียว
- Sanctions in an AML result — ความหมายของ
sanctionsและความหมายของแฟล็กจากผู้ให้บริการ