POST /apiv2/withdraw
ถอน TRX จากยอดคงเหลือใน Netts ของคุณไปยังที่อยู่ TRON คำขอจะส่งคืน หมายเลขคำสั่งซื้อทันที โดยการจ่ายเงิน on-chain จริงจะดำเนินการแบบอะซิงโครนัสโดยระบบเบื้องหลัง (ภายในประมาณ 5 นาที) ติดตามผลลัพธ์ได้โดย การโพลไปยังสถานะ endpoint หรือกำหนดค่า webhook
ℹ️ วิธีการทำงาน การส่งคำขอถอนเงินจะ กันยอดเงินจากยอดคงเหลือของคุณในทันที (ยอดคงเหลือจะถูกหักทันทีที่คำสั่งซื้อได้รับการยอมรับ) จากนั้น backend daemon จะส่ง TRX และทำเครื่องหมายคำสั่งซื้อเป็น
completedหรือfailedจะ ไม่มีผลลัพธ์ on-chain แบบซิงโครนัส ในการตอบกลับเริ่มต้น — คุณจะได้รับการตอบรับสถานะpendingก่อนเสมอก่อนที่คำสั่งซื้อจะได้รับการยอมรับ ระบบจะ ตรวจสอบที่อยู่ปลายทาง หากไม่สามารถถอนเงินไปยังที่อยู่นั้นได้ หรือไม่สามารถตรวจสอบได้ในขณะนั้น คำขอจะถูกปฏิเสธ: จะไม่มีการสร้างคำสั่งซื้อและไม่มีการกันยอดเงินใดๆ จากยอดคงเหลือของคุณ
URL ของ Endpoint
POST https://netts.io/apiv2/withdrawHeaders ของคำขอ
| Header | Required | Description |
|---|---|---|
| Content-Type | ใช่ | application/json |
| X-API-KEY | ใช่ | API key ของคุณจากแดชบอร์ด Netts |
| X-Idempotency-Key | ไม่ | คีย์ที่ฝั่งไคลเอนต์สร้างขึ้นเอง (base64) เพื่อลองส่งใหม่ได้อย่างปลอดภัยโดยไม่เกิดการถอนเงินซ้ำ หากละเว้น เซิร์ฟเวอร์จะสร้างขึ้นมาให้โดยอัตโนมัติ ค่านี้จะ กลายเป็น orderId ของคุณ |
เนื้อหาของคำขอ
{
"amount": 15,
"address": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}พารามิเตอร์
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | number | ใช่ | จำนวนเงิน รวม (gross) ในหน่วย TRX (ขั้นต่ำ 3) ค่าธรรมเนียมจะถูกหักออกจากจำนวนนี้ — ผู้รับจะได้รับ amount − fee (net) |
| address | string | ใช่ | ที่อยู่ TRON ปลายทาง (T…, ความยาว 34 ตัวอักษร, base58) ได้รับการตรวจสอบก่อนที่คำสั่งซื้อจะได้รับการยอมรับ |
| sub_and_robot_out | boolean | ไม่ | โหมดการจ่ายเงินแบบ Robot/sub: คิดค่าธรรมเนียม 2 TRX แทนที่จะเป็น 1 TRX ค่าเริ่มต้นคือ false |
ค่าธรรมเนียม มีการหักค่าธรรมเนียมคงที่จากยอดเงินรวม
amount: ปกติคือ 1 TRX หรือ 2 TRX เมื่อsub_and_robot_out = trueคำสั่งซื้อจะถูกปฏิเสธหากamount − fee ≤ 0
ตัวอย่างคำขอ
ตัวอย่างด้านล่างนี้ยังรวมถึงการ สร้างและส่ง
X-Idempotency-Keyด้วย เพื่อป้องกันไม่ให้การส่งซ้ำโดยไม่ได้ตั้งใจสร้างการถอนเงินรายการที่สอง ดูข้อกำหนดทั้งหมดได้ที่ ความสามารถในการทำงานซ้ำ (Idempotency)
cURL
API_KEY="your_api_key"
ADDR="TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
AMOUNT=15
NONCE=$(( $(date +%s) / 2 )) # stable for retries within a 2s window; or your own order UUID
# X-Idempotency-Key = base64url( HMAC-SHA256( API_KEY, "addr:amount:nonce" ) )
IDEMP=$(printf '%s' "${ADDR}:${AMOUNT}:${NONCE}" \
| openssl dgst -sha256 -hmac "$API_KEY" -binary | basenc --base64url | tr -d '=')
curl -X POST https://netts.io/apiv2/withdraw \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-H "X-Idempotency-Key: $IDEMP" \
-d "{\"amount\": $AMOUNT, \"address\": \"$ADDR\"}"Python
import time, hmac, hashlib, base64, requests
API_KEY = "your_api_key"
url = "https://netts.io/apiv2/withdraw"
payload = {"amount": 15, "address": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
# X-Idempotency-Key = base64url( HMAC-SHA256( API_KEY, "addr:amount:nonce" ) ), padding stripped.
# Generate ONCE per order and resend the same value on every retry.
nonce = str(int(time.time() // 2)) # 2s bucket; or your own order UUID
message = f"{payload['address']}:{payload['amount']}:{nonce}"
idem_key = base64.urlsafe_b64encode(
hmac.new(API_KEY.encode(), message.encode(), hashlib.sha256).digest()
).decode().rstrip("=")
headers = {
"Content-Type": "application/json",
"X-API-KEY": API_KEY,
"X-Idempotency-Key": idem_key,
}
resp = requests.post(url, headers=headers, json=payload)
detail = resp.json().get("detail", {})
if resp.status_code == 202 and detail.get("status") == "pending":
d = detail["data"]
print(f"Order ID: {d['orderId']}") # use it for the status endpoint / webhook
print(f"Net to recipient: {d['net']} TRX (fee {d['fee']})")
else:
print(f"Code {detail.get('code')}: {detail.get('msg', detail)}")การตอบกลับ
ยอมรับแล้ว — การถอนเข้าสู่คิว (202 Accepted)
ยอดเงินถูกกันไว้จากยอดคงเหลือของคุณแล้ว และกำหนดเวลาการจ่ายเงินเรียบร้อยแล้ว โพลไปยังสถานะ endpoint (หรือรอ webhook) จนกระทั่งสถานะเปลี่ยนเป็น completed / failed
{
"detail": {
"code": 10000,
"status": "pending",
"msg": "Withdrawal request accepted, processing within 5 minutes.",
"data": {
"orderId": "EXAMPLEorderId0000000000000000000000000000Aa",
"amount": 15.0,
"fee": 1.0,
"net": 14.0,
"address": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}ฟิลด์การตอบกลับ
| Field | Type | Description |
|---|---|---|
| detail.code | integer | 10000 ยอมรับแล้ว |
| detail.status | string | pending |
| detail.data.orderId | string | หมายเลขคำสั่งซื้อ — สตริงที่ปลอดภัยสำหรับ URL ความยาว 43 ตัวอักษร ใช้สำหรับสถานะ endpoint และใช้ระบุคำสั่งซื้อในเพย์โหลด webhook |
| detail.data.amount | number | ยอดเงินรวมที่ขอถอน (TRX) |
| detail.data.fee | number | ค่าธรรมเนียมที่ถูกหัก (1 หรือ 2 TRX) |
| detail.data.net | number | จำนวนเงินที่ผู้รับจะได้รับ (amount − fee) |
| detail.data.address | string | ที่อยู่ปลายทาง |
Endpoint สถานะ
GET https://netts.io/apiv2/withdraw/status/{orderId}ส่วนหัว: X-API-KEY (คำสั่งซื้อต้องเป็นของผู้ใช้ที่ได้รับการยืนยันตัวตน) orderId เป็นสตริงที่ปลอดภัยสำหรับ URL อยู่แล้ว — ส่งค่านั้น ตามเดิม โดยไม่ต้องทำ URL-encoding
| สถานะคำสั่งซื้อ | HTTP | code | status |
|---|---|---|---|
| สำเร็จแล้ว (ส่ง TRX แล้ว) | 200 | 10000 | completed (พร้อม processed_at) |
| อยู่ในคิว / กำลังส่ง | 200 | 10001 | pending |
| ล้มเหลว | 200 | 5003 | failed (พร้อม error_message) |
| ไม่พบ / ไม่ใช่ของคุณ | 404 | -1 | — |
{
"detail": {
"code": 10000,
"status": "completed",
"data": {
"orderId": "EXAMPLEorderId0000000000000000000000000000Aa",
"amount": 15.0, "fee": 1.0, "net": 14.0,
"address": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"processed_at": "2026-01-01 00:00:00+00:00"
}
}
}บัญชีผู้ใช้ย่อย (Sub-user)
การถอนเงินของผู้ใช้ย่อยทำงานเหมือนกับผู้ใช้ทั่วไปทุกประการ — เพียงแต่ใช้ API key ของผู้ใช้ย่อยเอง ผู้ใช้ย่อยจะเรียกใช้ endpoint POST /apiv2/withdraw เดียวกันนี้ โดยยืนยันตัวตนด้วยคีย์ของตนเอง การถอนเงินจะถูกหักออกจาก ยอดคงเหลือของผู้ใช้ย่อยรายนั้นเอง และส่งไปยัง address ที่ระบุไว้ในคำขอ ขั้นต่ำเดียวกัน ค่าธรรมเนียมเท่ากัน (1 TRX) การตรวจสอบที่อยู่เหมือนกัน ขั้นตอนเหมือนกัน ไม่มี endpoint แยกต่างหากสำหรับผู้ใช้ย่อย — แต่ละบัญชี ไม่ว่าจะเป็นบัญชีหลักหรือบัญชีผู้ใช้ย่อย จะถอนได้เฉพาะยอดคงเหลือของตนเองด้วยคีย์ของตนเองเท่านั้น
Webhooks
แทนที่จะใช้วิธีการโพล คุณสามารถกำหนดค่า webhook เพียงครั้งเดียว และ Netts จะส่งคำขอ POST พร้อมลายเซ็นแจ้งเตือนเมื่อการถอนเงินแต่ละรายการของคุณเข้าสู่สถานะสุดท้าย (completed / failed) ระบบจะจัดเก็บการตั้งค่า webhook แยกตามผู้ใช้ และมีผลกับการถอนเงินของบัญชีนั้นๆ หากไม่ได้กำหนดค่า webhook ไว้ ให้ใช้วิธีโพลไปยังสถานะ endpoint แทน
กำหนดค่า / ดู / ลบ
POST https://netts.io/apiv2/withdraw/webhook # create or update
GET https://netts.io/apiv2/withdraw/webhook # view current config (secret is never returned)
DELETE https://netts.io/apiv2/withdraw/webhook # unsubscribeส่วนหัว: X-API-KEY
// POST body
{
"callback_url": "https://your-server.example/netts/withdraw-hook",
"secret": "your_shared_secret_min_8_chars",
"enabled": true
}| Parameter | Type | Required | Description |
|---|---|---|---|
| callback_url | string | ใช่ | URL แบบ http(s) (≤ 2048 ตัวอักษร) ที่จะรับคำขอ POST |
| secret | string | ใช่ | ข้อมูลลับที่ใช้ร่วมกัน (8…256 ตัวอักษร) ที่ใช้ในการลงนามแต่ละเพย์โหลด |
| enabled | boolean | ไม่ | เปิด/ปิด การส่งข้อมูลโดยไม่ต้องลบการกำหนดค่า ค่าเริ่มต้นคือ true |
คำขอ GET จะส่งคืน { callback_url, enabled, secret_set, updated_at } — ข้อมูลลับ (secret) จะ ไม่มีการ ส่งคืนกลับมาอย่างเด็ดขาด
เพย์โหลดการจัดส่ง
Netts จะส่งคำขอ POST ไปยัง callback_url ของคุณพร้อมส่วนหัว X-Netts-Signature: base64( HMAC-SHA256( secret, raw_body ) ) และ JSON body ดังนี้:
{
"orderId": "EXAMPLEorderId0000000000000000000000000000Aa",
"status": "completed",
"amount": 15.0,
"fee": 1.0,
"net": 14.0,
"address": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"processed_at": "2026-01-01 00:00:00+00:00",
"error_message": null
}statusจะเป็นcompletedหรือfailed(หากเป็นfailedจะมีข้อมูลในerror_message)
การตรวจสอบยืนยันลายเซ็น
ลายเซ็นจะถูกคำนวณจาก canonical JSON ของเนื้อหา: มีการ เรียงลำดับคีย์ และไม่มีช่องว่าง (separators=(",", ":")) ให้คำนวณซ้ำด้วยวิธีเดียวกันแล้วนำมาเปรียบเทียบ
import hmac, hashlib, base64, json
def verify(raw_body: bytes, signature_header: str, secret: str) -> bool:
expected = base64.b64encode(
hmac.new(secret.encode(), raw_body, hashlib.sha256).digest()
).decode()
return hmac.compare_digest(expected, signature_header)
# Flask example: verify against the EXACT bytes received, then parse.
# if verify(request.get_data(), request.headers["X-Netts-Signature"], SECRET): ...ตรวจสอบยืนยันเทียบกับ ไบต์ดิบที่ได้รับ (raw received bytes) เสมอ หากคุณนำ JSON ที่แปลงแล้วมาทำ serialize ใหม่อีกครั้ง โปรดจำลองรูปแบบ canonical ให้ถูกต้อง:
json.dumps(payload, ensure_ascii=False, separators=(",",":"), sort_keys=True)
การรับประกันการจัดส่ง
- ตอบกลับด้วยรหัส HTTP 2xx เพื่อยืนยันการรับ การตอบกลับอื่นๆ (หรือการหมดเวลา) จะถือเป็นความพยายามที่ล้มเหลว
- พยายามส่งสูงสุด 3 ครั้ง ต่อหนึ่งคำสั่งซื้อ ภายในช่วงเวลา 21 นาที นับจากเวลาที่สร้างคำสั่งซื้อ (ระยะเวลาหน่วงก่อนลองส่งใหม่ ≈ 5 นาที) หลังจากนั้นจะยกเลิกการส่ง — ให้เปลี่ยนไปใช้วิธีโพลผ่านสถานะ endpoint แทน
- การส่งข้อมูลจะ ตัดรายการซ้ำ: แต่ละคำสั่งซื้อจะถูกจัดส่งสำเร็จสูงสุดเพียงครั้งเดียวเท่านั้น
- กำหนดให้ตัวประมวลผล (handler) ของคุณทำงานแบบ idempotent โดยอ้างอิงจาก
orderId
การตอบกลับเมื่อเกิดข้อผิดพลาด
ข้อผิดพลาดในการยืนยันตัวตน (401)
{ "detail": { "code": -1, "msg": "Invalid API key or IP not in whitelist" } }ยอดคงเหลือไม่เพียงพอ (403)
{ "detail": { "code": 1004, "status": "failed", "msg": "Insufficient balance: 2.0 < 15 TRX" } }ที่อยู่ไม่สามารถใช้งานได้ (403)
ไม่รับการถอนเงินไปยังที่อยู่ปลายทางนี้ ไม่มีการสร้างคำสั่งซื้อและไม่มีการกันยอดเงิน โปรดใช้ที่อยู่อื่นหรือติดต่อฝ่ายสนับสนุน
{ "detail": { "code": 1006, "status": "failed", "msg": "Withdrawals to this address are not available. Contact support." } }ไม่สามารถตรวจสอบที่อยู่ได้ในขณะนี้ (503)
ไม่สามารถตรวจสอบที่อยู่ปลายทางได้ในขณะนี้ ไม่มีการสร้างคำสั่งซื้อและไม่มีการกันยอดเงิน ลองใหม่อีกครั้งในภายหลัง — สามารถใช้ X-Idempotency-Key เดิมซ้ำได้
{ "detail": { "code": 1009, "status": "failed", "msg": "Address check is temporarily unavailable. No request was created. Retry shortly." } }มีรายการถอนเงินที่รอดำเนินการอยู่แล้ว (409)
คุณสามารถมี รายการถอนเงินที่รอดำเนินการได้ครั้งละหนึ่งรายการเท่านั้น ในยอดคงเหลือของคุณเอง โปรดรอจนกว่ารายการปัจจุบันจะได้รับการประมวลผลเสร็จสิ้น
{ "detail": { "code": 4090, "status": "failed", "msg": "You have a pending withdrawal. Wait until it is processed." } }ข้อผิดพลาดในการตรวจสอบความถูกต้อง (400)
{ "detail": { "code": 5004, "status": "failed", "msg": "Minimum withdrawal is 3 TRX" } }ข้อมูลอ้างอิงรหัสข้อผิดพลาด
| Code | Description | HTTP Status |
|---|---|---|
10000 | ยอมรับแล้ว (การถอนเข้าคิวแล้ว) / สำเร็จแล้ว (สถานะ endpoint) | 202 / 200 |
10001 | รอดำเนินการ — อยู่ในคิวหรือกำลังส่ง (สถานะ endpoint) | 200 |
208 | คำขอซ้ำกับคำขอที่ยอมรับไปแล้ว — ส่งคืนการตอบกลับที่แคชไว้ | 208 |
- | คำขอเดิมกำลังอยู่ระหว่างการประมวลผล (อย่าเพิ่งลองใหม่) | 409 |
4090 | คุณมีรายการถอนเงินที่รอดำเนินการอยู่แล้ว | 409 |
-1 | API key ไม่ถูกต้อง / IP ไม่อยู่ในไวท์ลิสต์ หรือไม่พบคำสั่งซื้อ | 401 / 404 |
1004 | ยอดคงเหลือไม่เพียงพอ | 403 |
1006 | ไม่สามารถถอนเงินไปยังที่อยู่นี้ได้ | 403 |
1009 | ไม่สามารถตรวจสอบที่อยู่ได้ชั่วคราว — ไม่มีการสร้างคำสั่งซื้อ ให้ลองใหม่ในภายหลัง | 503 |
5004 | ข้อผิดพลาดในการตรวจสอบความถูกต้อง (amount < 3, ค่าธรรมเนียม ≥ amount, ที่อยู่ไม่ถูกต้อง, คีย์ idempotency ไม่ถูกต้อง) | 400 |
5003 | การถอนเงินล้มเหลว / บริการไม่พร้อมใช้งาน | 200 (สถานะ) / 503 |
5000 | ข้อผิดพลาดภายในเซิร์ฟเวอร์ | 500 |
ขีดจำกัดอัตราการเรียกใช้
จำกัด ต่อหนึ่ง API key (ส่วนหัว X-API-KEY):
| ช่วงเวลา | ขีดจำกัด |
|---|---|
| 1 วินาที | 5 คำขอ |
| 1 นาที | 150 คำขอ |
เกินขีดจำกัดอัตราคำขอ (429)
{ "message": "API rate limit exceeded" }ความสามารถในการทำงานซ้ำ (Idempotency)
ส่งส่วนหัว X-Idempotency-Key (ไม่บังคับ) เพื่อให้การส่งซ้ำโดยไม่ได้ตั้งใจ ไม่ ทำให้เกิดการถอนเงินซ้ำรอบที่สอง — การตอบกลับเดิมจะถูกส่งคืนพร้อมรหัส HTTP 208 หากคุณไม่ได้ส่งส่วนหัวนี้ เซิร์ฟเวอร์จะสร้างคีย์ขึ้นมาให้โดยอัตโนมัติจากพารามิเตอร์ของคำขอภายในกรอบเวลาสั้นๆ คีย์นี้จะทำหน้าที่เป็น orderId ของคุณด้วย
วิธีสร้างคีย์
คีย์คือ base64url( HMAC-SHA256( secret, message ) ) ที่ตัด padding = ออก — เป็นสตริงที่ปลอดภัยสำหรับ URL ความยาว 43 ตัวอักษร โดยที่:
- secret = API key ของคุณ (
X-API-KEY) - message = ฟิลด์ต่างๆ ที่เชื่อมต่อกันด้วยเครื่องหมาย
:—address:amount:nonce
nonce คือค่าใดๆ ที่ คงที่สำหรับการลองส่งซ้ำของคำสั่งซื้อเชิงตรรกะเดียวกัน แต่แตกต่างกันระหว่างคำสั่งซื้อที่ไม่เกี่ยวข้องกัน — เช่น UUID ที่คุณเก็บไว้สำหรับคำสั่งซื้อนั้น หรือกลุ่มช่วงเวลาแบบหยาบๆ (timestamp bucket) สร้างคีย์เพียงครั้งเดียวต่อหนึ่งคำสั่งซื้อ และส่งค่าเดิมทุกประการในทุกครั้งที่ลองใหม่
import hmac, hashlib, base64, time
def make_idempotency_key(api_key, address, amount, nonce=None):
if nonce is None:
nonce = str(int(time.time() // 2)) # 2-second bucket; or your own order UUID
message = f"{address}:{amount}:{nonce}"
digest = hmac.new(api_key.encode(), message.encode(), hashlib.sha256).digest()
return base64.urlsafe_b64encode(digest).decode().rstrip("=") # 43-char URL-safeการตรวจสอบความถูกต้อง
X-Idempotency-Keyที่ระบุต้องมีความยาว 16–64 ตัวอักษร จากชุดอักขระA–Z a–z 0–9 + / = _ -คีย์ที่มีรูปแบบไม่ถูกต้องหรือยาวเกินไปจะถูกปฏิเสธด้วยรหัส HTTP 400 (code 5004)
| รหัสสถานะ | ความหมาย |
|---|---|
| 202 | ยอมรับแล้ว (คำขอครั้งแรก) |
| 208 | ยอมรับไปแล้ว — ส่งคืนการตอบกลับที่แคชไว้ (ไม่มีการถอนเงินซ้ำรอบสอง) |
| 409 | คำขอเดียวกันกำลังอยู่ระหว่างการประมวลผล — โปรดรอ อย่าเพิ่งลองใหม่ |
การลองใหม่หลังจากเกิดข้อผิดพลาด ระบบจะแคชเฉพาะผลลัพธ์ที่ ยอมรับแล้ว (accepted) เท่านั้น หากความพยายามก่อนหน้า ล้มเหลว (เช่น ยอดคงเหลือไม่พอ, การตรวจสอบไม่ผ่าน) คุณสามารถ ลองใหม่ด้วยคีย์เดิมได้อย่างปลอดภัย — คำขอจะได้รับการพยายามประมวลผลใหม่อีกครั้งแทนที่จะส่งคืนข้อผิดพลาดเดิม ในขณะที่คำขอยังอยู่ระหว่างการดำเนินการ คุณจะได้รับรหัส
409ให้รอและลองใหม่อีกครั้ง
หมายเหตุ
- การจ่ายเงินแบบอะซิงโครนัส การตอบกลับจะเป็นการรับทราบสถานะ
pendingเสมอ โดย daemon เบื้องหลังจะส่ง TRX ซึ่งมักจะอยู่ภายในประมาณ 5 นาที ตรวจสอบผลลัพธ์ได้จากสถานะ endpoint หรือ webhook - ยอดเงินจะถูกกันไว้ทันที เมื่อคำสั่งซื้อได้รับการยอมรับ (ไม่ใช่ตอนที่ส่ง TRX สำเร็จในขั้นตอนสุดท้าย)
- ขั้นต่ำ: 3 TRX ค่าธรรมเนียม: 1 TRX (หรือ 2 TRX เมื่อใช้
sub_and_robot_out) โดยหักออกจากยอดเงินรวมamountผู้รับจะได้รับยอดสุทธิnet = amount − fee - รอดำเนินการได้ครั้งละหนึ่งรายการ ในยอดคงเหลือของคุณเอง (
code 4090) - การตรวจสอบที่อยู่ปลายทาง ทุกคำขอจะได้รับการตรวจสอบก่อนที่คำสั่งซื้อจะได้รับการยอมรับ:
code 1006(HTTP 403) — ไม่สามารถถอนเงินไปยังที่อยู่นี้ได้,code 1009(HTTP 503) — ระบบตรวจสอบไม่พร้อมใช้งานชั่วคราว ให้ลองใหม่ในภายหลัง ทั้งสองกรณีจะไม่มีการสร้างคำสั่งซื้อ - ผู้ใช้ย่อยถอนเงินได้เหมือนกับผู้ใช้ทั่วไปทุกประการ — ใช้ endpoint
POST /apiv2/withdrawเดียวกัน กฎเดียวกัน แต่ยืนยันตัวตน ด้วย API key ของผู้ใช้ย่อยเอง ผู้ใช้ย่อยจะถอน ยอดคงเหลือของตนเอง ไปยังaddressที่ตนระบุไว้ ไม่มี endpoint แยกต่างหากสำหรับผู้ใช้ย่อย - orderId เป็นสตริงที่ปลอดภัยสำหรับ URL ความยาว 43 ตัวอักษร สามารถส่งผ่าน URL ของสถานะได้ตามเดิม (ไม่ต้องแปลงรหัส)
- Webhooks: แยกตามผู้ใช้, มีการลงนามด้วย
X-Netts-Signature, ลองส่งใหม่สูงสุด 3 ครั้งภายในระยะเวลา 21 นาที กำหนดค่าผ่านPOST /apiv2/withdraw/webhook