POST /apiv2/order1h
สร้างคำสั่งเช่า Energy ระยะเวลา 1 ชั่วโมงผ่านผู้ให้บริการ Energy หลายรายพร้อมระบบสลับการทำงานอัตโนมัติเมื่อเกิดข้อผิดพลาด (failover)
URL ของ Endpoint
POST https://netts.io/apiv2/order1hHeaders ของคำขอ
| ส่วนหัว | จำเป็น | คำอธิบาย |
|---|---|---|
| Content-Type | ใช่ | application/json |
| X-API-KEY | ใช่ | API key ของคุณจากแดชบอร์ด Netts |
| X-Real-IP | ใช่ | ที่อยู่ IP จากไวท์ลิสต์ของคุณ |
เนื้อหาของคำขอ
{
"amount": 131000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}พารามิเตอร์
| พารามิเตอร์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| amount | integer | ใช่ | จำนวน Energy ที่ต้องการเช่า (ขั้นต่ำ: 61000, สูงสุด: 3000000) |
| receiveAddress | string | ใช่ | ที่อยู่ TRON ที่จะได้รับ Energy (รูปแบบ TRC-20) |
การเลือกผู้ให้บริการ
API จะเลือกผู้ให้บริการ Energy ที่เหมาะสมที่สุดโดยอัตโนมัติตาม:
- ความคุ้มค่าด้านต้นทุน - ค้นหาราคาที่ต่ำที่สุดที่มีอยู่เสมอ
- ความพร้อมใช้งาน - มั่นใจได้ว่ามี Energy สำรองเพียงพอ
- ความน่าเชื่อถือ - ใช้งานผู้ให้บริการที่มีอัตราความสำเร็จสูง
- ความเร็ว - ให้ความสำคัญกับเวลาในการจัดส่งที่เร็วที่สุดก่อน
ตัวอย่างคำขอ
cURL
curl -X POST https://netts.io/apiv2/order1h \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip" \
-d '{
"amount": 131000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}'Python
import requests
url = "https://netts.io/apiv2/order1h"
headers = {
"Content-Type": "application/json",
"X-API-KEY": "your_api_key",
"X-Real-IP": "your_whitelisted_ip"
}
payload = {
"amount": 131000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
if response.status_code == 200:
detail = data.get('detail', {})
order_data = detail.get('data', {})
print(f"Order ID: {order_data.get('orderId')}")
print(f"Transaction Hash: {order_data.get('hash')}")
print(f"Energy Delivered: {order_data.get('energy')}")
print(f"Cost: {order_data.get('paidTRX')} TRX")
print(f"Delegate Address: {order_data.get('delegateAddress')}")
else:
error_detail = data.get('detail', data)
print(f"Error Code: {error_detail.get('code', 'N/A')}")
print(f"Error Message: {error_detail.get('msg', error_detail)}")การตอบกลับ
การตอบกลับเมื่อสำเร็จ (200 OK)
{
"detail": {
"code": 10000,
"msg": "Successful, 2.23 TRX deducted",
"data": {
"orderId": "1H123456",
"paidTRX": 2.23,
"hash": "a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456",
"delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq",
"energy": 131050
}
}
}ฟิลด์ของการตอบกลับ
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
| detail.code | integer | เป็น 10000 เสมอสำหรับคำสั่งซื้อที่สำเร็จ |
| detail.msg | string | ข้อความแจ้งความสำเร็จพร้อมจำนวนเงินที่หัก |
| detail.data.orderId | string | รหัสคำสั่งซื้อแบบรวมศูนย์ (รูปแบบ: 1H{request_id}) |
| detail.data.paidTRX | number | ค่าใช้จ่ายทั้งหมดเป็น TRX (รวมค่าเปิดใช้งานหากที่อยู่ยังไม่เคยเปิดใช้งาน) |
| detail.data.hash | string | null | แฮชของธุรกรรม ฟิลด์นี้มีอยู่เสมอแต่อาจว่างเปล่า - ผู้ให้บริการบางรายไม่ได้ส่งคืนแฮชในทันที ใช้ /apiv2/order_check หลังจากผ่านไป 1 นาทีเพื่อรับแฮช |
| detail.data.delegateAddress | string | ที่อยู่ Pool ที่ทำการมอบสิทธิ์ (delegate) Energy |
| detail.data.energy | integer | จำนวน Energy + ส่วนสำรอง (โดยทั่วไปคือ +50) |
การตอบกลับเมื่อเกิดข้อผิดพลาด
ข้อผิดพลาดในการตรวจสอบสิทธิ์ (401)
{
"detail": "Invalid API key or IP not in whitelist"
}ยอดคงเหลือไม่เพียงพอ (403)
{
"code": 1004,
"msg": "Insufficient funds. Required: 2.23 TRX, Available: 1.50 TRX"
}บริการไม่พร้อมใช้งาน (503)
{
"code": 5003,
"msg": "Service temporarily unavailable. All energy providers are currently unavailable."
}ข้อผิดพลาดจากผู้ให้บริการ (503)
{
"code": 5001,
"msg": "Energy provider temporarily unavailable"
}{
"code": 5002,
"msg": "Energy provider temporarily unavailable"
}{
"code": 5004,
"msg": "Energy provider requires higher minimum amount"
}ข้อผิดพลาดภายในเซิร์ฟเวอร์ (500)
{
"code": 5000,
"msg": "Internal server error occurred"
}ข้อมูลอ้างอิงรหัสข้อผิดพลาด
| รหัส | คำอธิบาย | สถานะ HTTP |
|---|---|---|
10000 | สำเร็จ | 200 |
10000 | สำเร็จ (การตอบกลับจากแคช) | 208 |
- | คำขอซ้ำกำลังอยู่ระหว่างการประมวลผล | 409 |
1004 | ยอดคงเหลือไม่เพียงพอ | 403 |
5000 | ข้อผิดพลาดภายในเซิร์ฟเวอร์ | 500 |
5001 | ผู้ให้บริการ Energy ไม่พร้อมใช้งาน | 503 |
5002 | ผู้ให้บริการ Energy ไม่พร้อมใช้งาน | 503 |
5003 | บริการ Energy ไม่พร้อมใช้งาน | 503 |
5004 | ไม่ถึงยอดขั้นต่ำของผู้ให้บริการ Energy | 503 |
ข้อจำกัดอัตราการเรียกใช้
ข้อจำกัดอัตราการเรียกใช้ต่อไปนี้ใช้กับ endpoint นี้ (ต่อที่อยู่ IP):
| ช่วงเวลา | ขีดจำกัด | คำอธิบาย |
|---|---|---|
| 1 วินาที | 50 คำขอ | สูงสุด 50 คำขอต่อวินาที |
ส่วนหัวของข้อจำกัดอัตราการเรียกใช้
RateLimit-Limit: 50
RateLimit-Remaining: 49
RateLimit-Reset: 1
X-RateLimit-Limit-Second: 50
X-RateLimit-Remaining-Second: 49เกินข้อจำกัดอัตราการเรียกใช้ (429)
{
"message": "API rate limit exceeded"
}ความไม่เปลี่ยนแปลงของผลลัพธ์ (Idempotency)
API รองรับ idempotency เพื่อป้องกันการประมวลผลคำสั่งซื้อซ้ำซ้อน เมื่อคุณส่งคำขอที่เหมือนกันหลายรายการ ระบบจะทำให้มั่นใจได้ว่าคำสั่งซื้อจะได้รับการประมวลผลเพียงครั้งเดียวเท่านั้น
การทำงานของ Idempotency
ความไม่ซ้ำกันของคำขอจะพิจารณาจากข้อมูลเหล่านี้ร่วมกัน:
- การประทับเวลาของคำขอ (หน้าต่างเวลา 1 วินาที)
- จำนวน Energy
- ที่อยู่ผู้รับ
- API key
แต่ละคำขอจะได้รับหน้าต่างความไม่ซ้ำกันระยะเวลา 1 วินาที เพื่อปกป้องระบบจากการใช้งานในทางที่ผิดและรับประกันการประมวลผลที่ถูกต้อง จึงไม่สามารถส่งคำขอที่มีพารามิเตอร์เหมือนกันได้บ่อยเกินกว่า 1 ครั้งต่อวินาที
พฤติกรรมปัจจุบัน: ระบบจะปกป้องไคลเอนต์จากการลองใหม่ที่ผิดพลาดสำหรับ Energy ที่สั่งซื้อไปแล้วโดยอัตโนมัติ หากคุณส่งคำขอเดิมสองครั้งโดยไม่ได้ตั้งใจ คุณจะไม่ถูกเรียกเก็บเงินซ้ำ
การระบุคีย์ของคุณเอง
คุณสามารถจัดการ idempotency ด้วยตัวคุณเองได้โดยการส่งส่วนหัว X-Idempotency-Key เมื่อมีส่วนหัวนี้ ค่าดังกล่าวเพียงค่าเดียวจะเป็นตัวกำหนดว่าคำขอนั้นเป็นคำขอซ้ำหรือไม่ และจะไม่มีการใช้การรวมข้อมูลอัตโนมัติตามด้านบน เมื่อไม่มีส่วนหัวนี้ จะไม่มีอะไรเปลี่ยนแปลง — เซิร์ฟเวอร์จะสร้างคีย์ให้คุณ
| ส่วนหัว | X-Idempotency-Key |
| รูปแบบ | อักขระเลขฐานสิบหกตัวพิมพ์เล็ก 64 ตัว พอดี — ค่าไดเจสต์ SHA-256 |
| อายุการใช้งาน | 24 ชั่วโมงนับจากคำขอแรกที่มีคีย์ดังกล่าว |
| ขอบเขต | บัญชีของคุณ ค่าเดียวกันที่ส่งโดยบัญชีอื่นจะไม่ส่งคืนผลลัพธ์ของคุณ |
คีย์ในรูปแบบอื่นใด — UUID ที่มีเครื่องหมายขีดกลาง, base64, เลขฐานสิบหกตัวพิมพ์ใหญ่ — จะถูกปฏิเสธด้วยรหัส 400 ก่อนที่จะมีการวางคำสั่งซื้อและก่อนที่จะมีการเรียกเก็บเงินใดๆ:
{
"detail": "Invalid idempotency key format. Must be 64-character hexadecimal string."
}รูปแบบนี้แตกต่างจาก endpoint อื่นๆ
/apiv2/withdraw,/apiv2/bandwidthและ orchestrator ยอมรับคีย์ base64 ความยาว 16–64 อักขระ endpoint นี้ยอมรับเฉพาะค่าไดเจสต์เลขฐานสิบหกความยาว 64 อักขระเท่านั้น ดังนั้นโค้ดสร้างคีย์ที่คัดลอกมาจาก endpoint เหล่านั้นจะส่งคืนค่า 400 ที่นี่
วิธีการสร้างคีย์
สร้างคีย์จาก API key ของคุณ ซึ่งจะทำให้ค่านั้นไม่ซ้ำกันสำหรับบัญชีของคุณ สามารถสร้างซ้ำได้เมื่อลองใหม่ และเป็นไปไม่ได้ที่ผู้อื่นจะได้ค่านั้นมา:
import hashlib
import hmac
def make_idempotency_key(api_key: str, address: str, amount: int, nonce: str) -> str:
message = f"{address}:{amount}:{nonce}"
return hmac.new(api_key.encode(), message.encode(), hashlib.sha256).hexdigest()
nonceเป็นของคำสั่งซื้อ ไม่ใช่ของคำขอ กำหนดค่านี้เพียงครั้งเดียวเมื่อมีการสร้างคำสั่งซื้อในฝั่งของคุณ และส่งค่าเดิมนั้นในทุกครั้งที่ส่งคำสั่งซื้อดังกล่าว — ทั้งความพยายามครั้งแรกและทุกครั้งที่ลองใหม่เหมือนกันหมด การสร้างค่าใหม่ภายในฟังก์ชันการส่ง (str(uuid.uuid4())ในการเรียกแต่ละครั้ง) จะทำให้ทุกความพยายามได้คีย์ที่แตกต่างกัน ดังนั้นการลองใหม่หลังจากหมดเวลาจึงถูกยอมรับเป็นคำสั่งซื้อที่สองและถูกเรียกเก็บเงินอีกครั้ง ตัวเลือกที่ง่ายและถูกต้องที่สุดคือรหัสคำสั่งซื้อที่คุณมีอยู่แล้ว: มันมีอยู่ก่อนความพยายามครั้งแรกและยังคงอยู่แม้กระบวนการทำงานของคุณจะเริ่มต้นใหม่
# ทำครั้งเดียว เมื่อคำสั่งซื้อปรากฏในระบบของคุณ
order = create_order(address="TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE", amount=131000)
# ในความพยายามครั้งแรกและในทุกครั้งที่ลองใหม่ — ข้อมูลนำเข้าสามตัวเดิม คีย์เดิม
key = make_idempotency_key(API_KEY, order.address, order.amount, order.id)
headers = {
"Content-Type": "application/json",
"X-API-KEY": API_KEY,
"X-Idempotency-Key": key,
}คีย์มีอายุ 24 ชั่วโมง หลังจากนั้น nonce เดิมจะว่างอีกครั้งและเริ่มคำสั่งซื้อใหม่ได้
อย่าใช้ค่าที่ผู้อื่นสามารถสร้างขึ้นมาเหมือนกันได้ — เลขศูนย์ 64 ตัว, ค่าไดเจสต์ของคำที่กำหนดตายตัว คีย์ทั้งหมดใช้พื้นที่ร่วมกันในทุกบัญชี การชนกันของคีย์ดังกล่าวจะไม่เปิดเผยคำสั่งซื้อของบัญชีอื่น แต่คำขอของคุณจะถูกปฏิเสธด้วยรหัส 409 จนกว่าคีย์ของพวกเขาจะหมดอายุ ซึ่งไม่ใช่คำตอบที่คุณต้องการในระหว่างที่กำลังพยายามส่งซ้ำ
การวางคำสั่งซื้อที่เหมือนกันสองรายการ
ในบางครั้งคุณอาจต้องการสั่งซื้อแบบเดิมสองครั้งจริงๆ — ปริมาณ Energy เท่าเดิมไปยังที่อยู่เดิม ต่อเนื่องกัน คีย์อัตโนมัติไม่สามารถแยกแยะกรณีนี้ออกจากการลองใหม่ได้: คำขอทั้งสองเหมือนกันทุกไบต์ และสิ่งเดียวที่แยกพวกมันออกจากกันคือเวลาที่พวกมันมาถึง
หากไม่มีคีย์ของคุณเอง ผลลัพธ์จะขึ้นอยู่กับช่วงเวลาห่างระหว่างคำขอ:
| ช่วงเวลาห่างระหว่างคำขอทั้งสอง | สิ่งที่จะเกิดขึ้น |
|---|---|
| ภายในหน้าต่างเวลา 1 วินาทีเดียวกัน | คำขอที่สองจะถือเป็นการส่งซ้ำ คำขอนี้จะไม่ถูกดำเนินการ: คุณจะได้รับรหัส 208 และการตอบกลับของคำสั่งซื้อแรก รวมถึง orderId จะไม่มีการเรียกเก็บเงินสำหรับคำขอนี้ |
| ห่างกันมากกว่าหนึ่งวินาที | คีย์สองคีย์ที่แตกต่างกัน — คำสั่งซื้อทั้งสองจะได้รับการดำเนินการและถูกเรียกเก็บเงินทั้งคู่ |
ดังนั้น หากคุณพึ่งพาคีย์อัตโนมัติ ให้เว้นช่วงเวลามากกว่าหนึ่งวินาทีระหว่างคำสั่งซื้อสองรายการที่เหมือนกัน และตรวจสอบรหัสสถานะ: 208 หมายความว่าคำสั่งซื้อที่คุณเพิ่งส่งไปนั้นไม่ได้รับการดำเนินการ
การหยุดรอเป็นเพียงวิธีแก้ปัญหาชั่วคราว ไม่ใช่การแก้ไขปัญหาที่แท้จริง มันจะแยกทุกคำขอออกจากกัน รวมถึงคำขอที่คุณไม่ได้ตั้งใจจะส่งซ้ำ — การลองใหม่หลังจากหมดเวลา, การคลิกสองครั้ง, ข้อความที่ส่งซ้ำโดยคิวของคุณ สิ่งเหล่านี้ก็มาถึงช้ากว่าหน้าต่างเวลาเช่นกัน จึงถูกดำเนินการเป็นคนละคำสั่งซื้อและถูกเรียกเก็บเงินแยกกัน การหมดเวลาตอบกลับ (timeout) ของ endpoint นี้คือ 10 วินาที ซึ่งอยู่นอกหน้าต่างเวลาไปมากแล้ว: คีย์อัตโนมัติไม่ได้ป้องกันการลองใหม่ที่เกิดขึ้นหลังจากหมดเวลา
คีย์ของคุณเองจะช่วยขจัดความไม่แน่นอนนี้ออกไป เพราะการตัดสินใจจะย้ายไปยังฝั่งเดียวที่รู้คำตอบ:
| สิ่งที่คุณกำลังทำ | สิ่งที่คุณส่ง | ผลลัพธ์ |
|---|---|---|
| คำสั่งซื้อที่สองซึ่งเป็นรายการใหม่จริงๆ | nonce ใหม่ | คีย์ใหม่ — คำสั่งซื้อได้รับการดำเนินการ |
| การลองใหม่ของคำสั่งซื้อที่คุณไม่ทราบผลลัพธ์ | nonce ของความพยายามครั้งแรก | คีย์เดิม — 208, การตอบกลับเดิม, ไม่มีการเรียกเก็บเงินครั้งที่สอง |
แถวที่สองคือเหตุผลที่มีส่วนหัวนี้อยู่ และเป็นจุดที่การนำไปใช้งานมักจะเกิดข้อผิดพลาด: ดูหมายเหตุใต้หัวข้อ วิธีการสร้างคีย์
รหัสสถานะ HTTP สำหรับคำขอที่ซ้ำกัน
| รหัสสถานะ | ชื่อ | คำอธิบาย |
|---|---|---|
| 200 | OK | ประมวลผลคำสั่งซื้อสำเร็จ (คำขอแรก) |
| 208 | Already Reported | ประมวลผลคำสั่งซื้อไปแล้ว กำลังส่งคืนการตอบกลับจากแคช |
| 409 | Conflict | คำขอกำลังอยู่ระหว่างการประมวลผล อย่าเพิ่งลองใหม่ |
คำขอซ้ำ - ประมวลผลไปแล้ว (208)
เมื่อได้รับคำขอซ้ำสำหรับคำสั่งซื้อที่เสร็จสมบูรณ์ไปแล้ว:
{
"detail": {
"code": 10000,
"msg": "Successful, 2.54 TRX deducted",
"data": {
"hash": "9e4c20e21e01e4c39b21b670d1ea1fc1e4b0de94d8fbd4c190d5378ba911dfae",
"energy": 65050,
"orderId": "1H70bcc7962a",
"paidTRX": 2.535,
"delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq"
}
},
"idempotency": {
"status": "completed",
"cached": true,
"original_created_at": "2025-12-03T10:34:49.104896"
}
}เนื้อหาการตอบกลับจะเหมือนกับการตอบกลับเมื่อสำเร็จครั้งแรกทุกประการ โดยมีออบเจกต์ idempotency เพิ่มเติมเพื่อระบุว่านี่คือการตอบกลับจากแคช
คำขอซ้ำ - กำลังอยู่ระหว่างการประมวลผล (409)
เมื่อคำขอซ้ำมาถึงในขณะที่คำขอเดิมยังคงอยู่ระหว่างการประมวลผล:
{
"success": false,
"error": "duplicate_request_processing",
"message": "This request is currently being processed. Please wait and do not retry.",
"idempotency_key": "b9e67b2412d33c92a4f0e1c3d5b7a9f2e4c6d8b0a2f4e6c8d0b2a4f6e8c0d2b4",
"retry_after_seconds": 3
}คำแนะนำ: รอตามเวลา retry_after_seconds ที่ระบุก่อนที่จะตรวจสอบสถานะคำสั่งซื้อ
แนวทางปฏิบัติที่ดีที่สุด
- อย่าส่งคำขอพร้อมกัน (parallel) ด้วยพารามิเตอร์เดียวกัน - ควรรอรับการตอบกลับของแต่ละรายการก่อน
- ใช้
nonceใหม่สำหรับทุกคำสั่งซื้อใหม่ และใช้nonceของความพยายามครั้งแรกสำหรับทุกการลองใหม่ของรายการนั้น - อย่าสร้าง
nonceขึ้นมาใหม่ในจังหวะที่ส่ง — การลองใหม่จะต้องสร้างคีย์เดิมของความพยายามครั้งแรก ไม่ใช่คีย์ใหม่ - จัดการการตอบกลับ 409 ด้วยการรอ ไม่ใช่การลองใหม่ทันที
- ตรวจสอบฟิลด์
idempotency.cachedเพื่อระบุการตอบกลับจากแคช — รหัส208หมายความว่าคำสั่งซื้อที่คุณเพิ่งส่งไปนั้นไม่ได้รับการดำเนินการ
บัญชีแบบชำระเงินทีหลัง (Postpaid)
บัญชีที่ใช้ ระบบเรียกเก็บเงินแบบชำระเงินทีหลัง (postpaid) จะใช้ endpoint, URL, ส่วนหัว และ request body เดียวกันกับบัญชีอื่นๆ ทั้งหมด ความแตกต่างอยู่ที่วิธีการชำระเงินของคำสั่งซื้อ:
- ไม่มีการหักเงินจากยอดฝากของคุณ คำสั่งซื้อที่สำเร็จแต่ละรายการจะถูกเพิ่มไปยังยอดคงค้างของบัญชีคุณในสกุลเงินชำระบัญชีที่ตกลงกันไว้ในสัญญาของคุณ คุณชำระยอดนี้ตามใบแจ้งหนี้ตามข้อตกลงของคุณ
- บัญชีของคุณมีวงเงินสินเชื่อ ตราบใดที่ยอดค้างชำระยังอยู่ภายในวงเงิน คำสั่งซื้อจะได้รับการยอมรับแม้จะมียอดฝากเป็นศูนย์ก็ตาม
- มีการเรียกเก็บเงินเฉพาะบริการที่มีการจัดส่งแล้วเท่านั้น คำสั่งซื้อที่ถูกปฏิเสธหรือไม่ได้รับการดำเนินการจะไม่มีค่าใช้จ่าย
- หากจำเป็นต้องเปิดใช้งานที่อยู่ผู้รับ การเปิดใช้งานจะเป็นส่วนหนึ่งของคำสั่งซื้อเดียวกันและจะถูกเรียกเก็บเงินเป็นรายการแยกต่างหาก
ระบบเรียกเก็บเงินแบบ postpaid จะเปิดใช้งานโดย Netts สำหรับแต่ละบัญชีตามคำขอ การตอบกลับทุกครั้งจะบอกให้คุณทราบว่าคำสั่งซื้อนั้นชำระเงินอย่างไร: paymentMode จะเป็น postpaid หรือ prepaid
ฟิลด์คำขอเพิ่มเติม
| พารามิเตอร์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| test | boolean | ไม่ | true — คำนวณราคาเท่านั้น ไม่มีการสั่งซื้อ จัดส่ง หรือเรียกเก็บเงินใดๆ |
| freezePrice | boolean | ไม่ | true — ล็อกราคาตามสัญญาของคุณเป็นเวลา 60 วินาที ไม่มีการสั่งซื้อหรือเรียกเก็บเงินใดๆ |
| quoteId | string | ไม่ | วางคำสั่งซื้อตามราคาของใบเสนอราคาที่ออกโดย freezePrice |
| priceCurrency | string | ไม่ | TRX (ค่าเริ่มต้น) หรือสกุลเงินตามสัญญาของคุณ เช่นใน settlement.asset สำหรับบัญชี postpaid ยอดเงินในสกุลเงินตามสัญญาของคุณจะรวมอยู่ด้วยเสมอ |
ไม่สามารถใช้ quoteId ร่วมกับ test หรือ freezePrice ได้ ฟิลด์อื่นๆ ใน request body จะถูกปฏิเสธ
การตรวจสอบราคา (test: true)
{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"test": true
}{
"detail": {
"code": 10010,
"msg": "Test calculation",
"data": {
"amount": 65000,
"unitPriceSun": "20",
"discount": null,
"energyTRX": "1.300000",
"activationTRX": "1.100000",
"wouldCostTRX": "2.400000",
"paidTRX": 0,
"paymentMode": "postpaid",
"activationCheck": "inactive",
"alt": {"USDC": {"energy": "0.430541", "activation": "0.364304", "total": "0.794845"}},
"fxAt": "2026-10-19T07:15:18.469870+00:00"
}
}
}| ฟิลด์ | คำอธิบาย |
|---|---|
| unitPriceSun | ราคาต่อหน่วย Energy ในหน่วย SUN รวมถึงส่วนลดส่วนบุคคลของคุณ (หากมี) |
| discount | ส่วนลดส่วนบุคคลของคุณ (type, value) หรือ null |
| energyTRX / activationTRX / wouldCostTRX | ค่า Energy, ค่าเปิดใช้งาน (หากที่อยู่นั้นจำเป็นต้องเปิดใช้งาน) และยอดรวม ในหน่วย TRX |
| activationCheck | inactive — ที่อยู่จะได้รับการเปิดใช้งานและเรียกเก็บเงิน; active — ไม่มีการเปิดใช้งาน; unknown — ไม่สามารถตรวจสอบได้ในขณะนี้ |
alt.<currency> | ยอดเงินเดียวกันในสกุลเงินตามสัญญาของคุณ |
| fxAt | เวลาของอัตราแลกเปลี่ยนที่ใช้สำหรับยอดเงินในสกุลเงินตามสัญญาของคุณ |
การเสนอราคาแบบคงที่ (freezePrice: true)
ใช้ใบเสนอราคาเพื่อล็อกราคาตามสัญญาของคุณก่อนที่คุณจะสั่งซื้อ
- ส่งคำสั่งซื้อพร้อมกับ
"freezePrice": trueการตอบกลับจะมีรหัส10011(Quote issued), มีฟิลด์เดียวกันกับการตรวจสอบราคา พร้อมด้วยquoteIdและexpiresAt - ภายใน 60 วินาที ให้ส่งคำสั่งซื้อพร้อมกับ
"quoteId": "<quoteId>"และamountรวมถึงreceiveAddressเดิม - คำสั่งซื้อจะถูกเรียกเก็บเงินตามราคาที่เสนอ — ราคาตามสัญญาของคุณ ณ เวลาที่เสนอราคา — แม้ว่าราคาจะเปลี่ยนแปลงไปในระหว่างนั้นก็ตาม
ใบเสนอราคาสามารถใช้ได้ ครั้งเดียว และสำหรับผลิตภัณฑ์เดียวกันเท่านั้น: ใบเสนอราคา 1 ชั่วโมงไม่สามารถใช้ชำระคำสั่งซื้อ 5 นาทีได้ ใบเสนอราคาที่หมดอายุหรือถูกใช้ไปแล้วจะถูกปฏิเสธและจะไม่มีการสั่งซื้อเกิดขึ้น
{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"quoteId": "q_4f540f16a2c94b7f8e3d1a6b5c0e9d72"
}คำสั่งซื้อที่สำเร็จ
{
"detail": {
"code": 10000,
"msg": "Successful, 1.30 TRX for energy + 1.10 TRX for address activation, postpaid",
"data": {
"orderId": "1Hf9544a1508",
"paidTRX": 2.4,
"hash": "032bda8fa6911b42c15a6d8d30520dc22bcc4077972a1503b6a3fae491967eb4",
"delegateAddress": "TVnkj2jHKgmea8DVJFo2teD7rRSpH51bne",
"energy": 65000,
"activationHash": "259e1ab276114ae717a6f62d7d25eb1f89a2dccb637cbe41be626df3c2a78519",
"paymentMode": "postpaid",
"energyTRX": "1.300000",
"activationTRX": "1.100000",
"totalTRX": "2.400000"
}
}
}| ฟิลด์ | คำอธิบาย |
|---|---|
| paidTRX | ค่าบริการในหน่วย TRX สำหรับบัญชี postpaid ยอดนี้จะไม่ถูกหักออกจากยอดฝาก |
| paymentMode | postpaid |
| energyTRX / activationTRX / totalTRX | ยอดเงินที่แน่นอน ทศนิยม 6 ตำแหน่ง |
| quoteId, alt | ปรากฏเมื่อมีการวางคำสั่งซื้อด้วยใบเสนอราคา: รหัสใบเสนอราคาและยอดเงินตามที่เสนอ |
| activationFinal | ปรากฏและมีค่าเป็น false เฉพาะเมื่อยอดค่าเปิดใช้งานเป็นยอดเบื้องต้น ยอดเงินสุดท้ายจะปรากฏในใบแจ้งหนี้ของคุณ |
ฟิลด์อื่นๆ ทั้งหมดจะเหมือนกับคำสั่งซื้อแบบ prepaid
ถึงวงเงินสินเชื่อแล้ว (402)
{
"detail": {
"code": 1004,
"msg": "Postpaid credit limit reached.",
"paymentMode": "postpaid",
"reason": "limit_reached"
}
}คำสั่งซื้อจะไม่ได้รับการดำเนินการและไม่มีการเรียกเก็บเงิน คำสั่งซื้อใหม่จะได้รับการยอมรับอีกครั้งเมื่อการชำระเงินของคุณได้รับการบันทึกหรือมีการเพิ่มวงเงินของคุณ
รหัสข้อผิดพลาดของระบบ Postpaid
| รหัส | HTTP | คำอธิบาย |
|---|---|---|
10010 | 200 | ผลการตรวจสอบราคา (test) |
10011 | 200 | ออกใบเสนอราคาแล้ว (freezePrice) |
1004 | 402 | ถึงวงเงินสินเชื่อ postpaid แล้ว |
4100 | 400 | คำขอไม่ถูกต้อง |
4101 | 400 | ไม่รองรับ priceCurrency |
4102 | 400 | มีการใช้ quoteId ร่วมกับ test หรือ freezePrice |
4103 | 409 | ใบเสนอราคาถูกใช้งานไปแล้ว |
4104 | 409 | ใบเสนอราคาหมดอายุแล้ว |
4105 | 409 | คีย์ Idempotency ถูกใช้ไปแล้วสำหรับคำขออื่น |
4106 | 404 | ไม่พบใบเสนอราคา |
4107 | 409 | พารามิเตอร์ของคำสั่งซื้อแตกต่างจากใบเสนอราคา |
4108 | 400 | รูปแบบ quoteId ไม่ถูกต้อง |
4109 | 422 | ไม่พร้อมใช้งานสำหรับบัญชีย่อย |
5032 | 503 | ราคาไม่พร้อมใช้งานชั่วคราว |
5033 | 503 | อัตราแลกเปลี่ยนไม่พร้อมใช้งานชั่วคราว |
5034 | 503 | ระบบเรียกเก็บเงินไม่พร้อมใช้งานชั่วคราว — คำสั่งซื้อไม่ได้รับการยอมรับ |
5036 | 503 | การตรวจสอบสินเชื่อไม่พร้อมใช้งานชั่วคราว — ให้ลองใหม่ภายหลัง |
สำหรับการตอบกลับ 4xx และ 503 ทั้งหมดด้านบน จะไม่มีการสั่งซื้อและไม่มีการเรียกเก็บเงินใดๆ
หมายเหตุ
- Energy จะได้รับการจัดส่งทันทีเมื่อสั่งซื้อสำเร็จ (โดยทั่วไปภายใน 0.5-10 วินาที)
- การหมดเวลาตอบกลับของ API: สูงสุด 10 วินาที โดยทั่วไปจะตอบกลับภายในไม่เกิน 2 วินาที
- การเปิดใช้งานที่อยู่: หากที่อยู่ผู้รับยังไม่เคยเปิดใช้งาน Netts จะทำการเปิดใช้งานให้ในราคาต้นทุน
- ความล่าช้าในการเปิดใช้งาน: สำหรับที่อยู่ที่ยังไม่เคยเปิดใช้งาน การตอบกลับของ API อาจใช้เวลานานถึง 6 วินาทีเนื่องจากกระบวนการเปิดใช้งาน
- คำสั่งซื้อจะได้รับการประมวลผลตลอด 24 ชั่วโมงทุกวัน พร้อมระบบสลับการทำงานอัตโนมัติเมื่อเกิดข้อผิดพลาดของผู้ให้บริการ
- จำนวน Energy ขั้นต่ำ: 61,000 หน่วย
- จำนวน Energy สูงสุด: 3,000,000 หน่วยต่อคำสั่งซื้อ
- ส่วนสำรอง Energy: เพิ่มขึ้น +50 หน่วยโดยอัตโนมัติสำหรับการชดเชยของผู้ให้บริการ (ฟรี)
- แฮชของธุรกรรม: ฟิลด์นี้มีอยู่เสมอแต่อาจว่างเปล่าหากผู้ให้บริการไม่ได้ส่งคืนในทันที หากต้องการดึงแฮช ให้เรียกใช้ /apiv2/order_check หลังจากวางคำสั่งซื้อไปแล้วไม่ต่ำกว่า 1 นาที
- การเลือกผู้ให้บริการ: เป็นไปโดยอัตโนมัติตามต้นทุนและความพร้อมใช้งาน
- รูปแบบรหัสคำสั่งซื้อ:
1H{request_id}สำหรับการติดตามแบบรวมศูนย์ - การกำหนดราคา: มีการเปลี่ยนแปลงตามช่วงเวลาของวันและจำนวน Energy
- ระยะเวลา: คงที่ที่ 1 ชั่วโมง (3600 วินาที)
- ข้อจำกัดอัตราการเรียกใช้: 50 คำขอต่อวินาทีต่อที่อยู่ IP