Skip to content
Translated page. The English version is the source of truth.

POST /apiv2/order1h ​

สร้างคำสั่งเช่า Energy ระยะเวลา 1 ชั่วโมงผ่านผู้ให้บริการ Energy หลายรายพร้อมระบบสลับการทำงานอัตโนมัติเมื่อเกิดข้อผิดพลาด (failover)

URL ของ Endpoint ​

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

Headers ของคำขอ ​

ส่วนหัวจำเป็นคำอธิบาย
Content-Typeใช่application/json
X-API-KEYใช่API key ของคุณจากแดชบอร์ด Netts
X-Real-IPใช่ที่อยู่ IP จากไวท์ลิสต์ของคุณ

เนื้อหาของคำขอ ​

json
{
    "amount": 131000,
    "receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}

พารามิเตอร์ ​

พารามิเตอร์ชนิดจำเป็นคำอธิบาย
amountintegerใช่จำนวน Energy ที่ต้องการเช่า (ขั้นต่ำ: 61000, สูงสุด: 3000000)
receiveAddressstringใช่ที่อยู่ TRON ที่จะได้รับ Energy (รูปแบบ TRC-20)

การเลือกผู้ให้บริการ ​

API จะเลือกผู้ให้บริการ Energy ที่เหมาะสมที่สุดโดยอัตโนมัติตาม:

  • ความคุ้มค่าด้านต้นทุน - ค้นหาราคาที่ต่ำที่สุดที่มีอยู่เสมอ
  • ความพร้อมใช้งาน - มั่นใจได้ว่ามี Energy สำรองเพียงพอ
  • ความน่าเชื่อถือ - ใช้งานผู้ให้บริการที่มีอัตราความสำเร็จสูง
  • ความเร็ว - ให้ความสำคัญกับเวลาในการจัดส่งที่เร็วที่สุดก่อน

ตัวอย่างคำขอ ​

cURL ​

bash
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 ​

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) ​

json
{
    "detail": {
        "code": 10000,
        "msg": "Successful, 2.23 TRX deducted",
        "data": {
            "orderId": "1H123456",
            "paidTRX": 2.23,
            "hash": "a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456",
            "delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq",
            "energy": 131050
        }
    }
}

ฟิลด์ของการตอบกลับ ​

ฟิลด์ชนิดคำอธิบาย
detail.codeintegerเป็น 10000 เสมอสำหรับคำสั่งซื้อที่สำเร็จ
detail.msgstringข้อความแจ้งความสำเร็จพร้อมจำนวนเงินที่หัก
detail.data.orderIdstringรหัสคำสั่งซื้อแบบรวมศูนย์ (รูปแบบ: 1H{request_id})
detail.data.paidTRXnumberค่าใช้จ่ายทั้งหมดเป็น TRX (รวมค่าเปิดใช้งานหากที่อยู่ยังไม่เคยเปิดใช้งาน)
detail.data.hashstring | nullแฮชของธุรกรรม ฟิลด์นี้มีอยู่เสมอแต่อาจว่างเปล่า - ผู้ให้บริการบางรายไม่ได้ส่งคืนแฮชในทันที ใช้ /apiv2/order_check หลังจากผ่านไป 1 นาทีเพื่อรับแฮช
detail.data.delegateAddressstringที่อยู่ Pool ที่ทำการมอบสิทธิ์ (delegate) Energy
detail.data.energyintegerจำนวน Energy + ส่วนสำรอง (โดยทั่วไปคือ +50)

การตอบกลับเมื่อเกิดข้อผิดพลาด ​

ข้อผิดพลาดในการตรวจสอบสิทธิ์ (401) ​

json
{
    "detail": "Invalid API key or IP not in whitelist"
}

ยอดคงเหลือไม่เพียงพอ (403) ​

json
{
    "code": 1004,
    "msg": "Insufficient funds. Required: 2.23 TRX, Available: 1.50 TRX"
}

บริการไม่พร้อมใช้งาน (503) ​

json
{
    "code": 5003,
    "msg": "Service temporarily unavailable. All energy providers are currently unavailable."
}

ข้อผิดพลาดจากผู้ให้บริการ (503) ​

json
{
    "code": 5001,
    "msg": "Energy provider temporarily unavailable"
}
json
{
    "code": 5002,
    "msg": "Energy provider temporarily unavailable"
}
json
{
    "code": 5004,
    "msg": "Energy provider requires higher minimum amount"
}

ข้อผิดพลาดภายในเซิร์ฟเวอร์ (500) ​

json
{
    "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ไม่ถึงยอดขั้นต่ำของผู้ให้บริการ Energy503

ข้อจำกัดอัตราการเรียกใช้ ​

ข้อจำกัดอัตราการเรียกใช้ต่อไปนี้ใช้กับ endpoint นี้ (ต่อที่อยู่ IP):

ช่วงเวลาขีดจำกัดคำอธิบาย
1 วินาที50 คำขอสูงสุด 50 คำขอต่อวินาที

ส่วนหัวของข้อจำกัดอัตราการเรียกใช้ ​

http
RateLimit-Limit: 50
RateLimit-Remaining: 49
RateLimit-Reset: 1
X-RateLimit-Limit-Second: 50
X-RateLimit-Remaining-Second: 49

เกินข้อจำกัดอัตราการเรียกใช้ (429) ​

json
{
    "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 ก่อนที่จะมีการวางคำสั่งซื้อและก่อนที่จะมีการเรียกเก็บเงินใดๆ:

json
{
    "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 ของคุณ ซึ่งจะทำให้ค่านั้นไม่ซ้ำกันสำหรับบัญชีของคุณ สามารถสร้างซ้ำได้เมื่อลองใหม่ และเป็นไปไม่ได้ที่ผู้อื่นจะได้ค่านั้นมา:

python
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()) ในการเรียกแต่ละครั้ง) จะทำให้ทุกความพยายามได้คีย์ที่แตกต่างกัน ดังนั้นการลองใหม่หลังจากหมดเวลาจึงถูกยอมรับเป็นคำสั่งซื้อที่สองและถูกเรียกเก็บเงินอีกครั้ง ตัวเลือกที่ง่ายและถูกต้องที่สุดคือรหัสคำสั่งซื้อที่คุณมีอยู่แล้ว: มันมีอยู่ก่อนความพยายามครั้งแรกและยังคงอยู่แม้กระบวนการทำงานของคุณจะเริ่มต้นใหม่

python
# ทำครั้งเดียว เมื่อคำสั่งซื้อปรากฏในระบบของคุณ
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 สำหรับคำขอที่ซ้ำกัน ​

รหัสสถานะชื่อคำอธิบาย
200OKประมวลผลคำสั่งซื้อสำเร็จ (คำขอแรก)
208Already Reportedประมวลผลคำสั่งซื้อไปแล้ว กำลังส่งคืนการตอบกลับจากแคช
409Conflictคำขอกำลังอยู่ระหว่างการประมวลผล อย่าเพิ่งลองใหม่

คำขอซ้ำ - ประมวลผลไปแล้ว (208) ​

เมื่อได้รับคำขอซ้ำสำหรับคำสั่งซื้อที่เสร็จสมบูรณ์ไปแล้ว:

json
{
    "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) ​

เมื่อคำขอซ้ำมาถึงในขณะที่คำขอเดิมยังคงอยู่ระหว่างการประมวลผล:

json
{
    "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

ฟิลด์คำขอเพิ่มเติม ​

พารามิเตอร์ชนิดจำเป็นคำอธิบาย
testbooleanไม่true — คำนวณราคาเท่านั้น ไม่มีการสั่งซื้อ จัดส่ง หรือเรียกเก็บเงินใดๆ
freezePricebooleanไม่true — ล็อกราคาตามสัญญาของคุณเป็นเวลา 60 วินาที ไม่มีการสั่งซื้อหรือเรียกเก็บเงินใดๆ
quoteIdstringไม่วางคำสั่งซื้อตามราคาของใบเสนอราคาที่ออกโดย freezePrice
priceCurrencystringไม่TRX (ค่าเริ่มต้น) หรือสกุลเงินตามสัญญาของคุณ เช่นใน settlement.asset สำหรับบัญชี postpaid ยอดเงินในสกุลเงินตามสัญญาของคุณจะรวมอยู่ด้วยเสมอ

ไม่สามารถใช้ quoteId ร่วมกับ test หรือ freezePrice ได้ ฟิลด์อื่นๆ ใน request body จะถูกปฏิเสธ

การตรวจสอบราคา (test: true) ​

json
{
    "amount": 65000,
    "receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
    "test": true
}
json
{
    "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
activationCheckinactive — ที่อยู่จะได้รับการเปิดใช้งานและเรียกเก็บเงิน; active — ไม่มีการเปิดใช้งาน; unknown — ไม่สามารถตรวจสอบได้ในขณะนี้
alt.<currency>ยอดเงินเดียวกันในสกุลเงินตามสัญญาของคุณ
fxAtเวลาของอัตราแลกเปลี่ยนที่ใช้สำหรับยอดเงินในสกุลเงินตามสัญญาของคุณ

การเสนอราคาแบบคงที่ (freezePrice: true) ​

ใช้ใบเสนอราคาเพื่อล็อกราคาตามสัญญาของคุณก่อนที่คุณจะสั่งซื้อ

  1. ส่งคำสั่งซื้อพร้อมกับ "freezePrice": true การตอบกลับจะมีรหัส 10011 (Quote issued), มีฟิลด์เดียวกันกับการตรวจสอบราคา พร้อมด้วย quoteId และ expiresAt
  2. ภายใน 60 วินาที ให้ส่งคำสั่งซื้อพร้อมกับ "quoteId": "<quoteId>" และ amount รวมถึง receiveAddress เดิม
  3. คำสั่งซื้อจะถูกเรียกเก็บเงินตามราคาที่เสนอ — ราคาตามสัญญาของคุณ ณ เวลาที่เสนอราคา — แม้ว่าราคาจะเปลี่ยนแปลงไปในระหว่างนั้นก็ตาม

ใบเสนอราคาสามารถใช้ได้ ครั้งเดียว และสำหรับผลิตภัณฑ์เดียวกันเท่านั้น: ใบเสนอราคา 1 ชั่วโมงไม่สามารถใช้ชำระคำสั่งซื้อ 5 นาทีได้ ใบเสนอราคาที่หมดอายุหรือถูกใช้ไปแล้วจะถูกปฏิเสธและจะไม่มีการสั่งซื้อเกิดขึ้น

json
{
    "amount": 65000,
    "receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
    "quoteId": "q_4f540f16a2c94b7f8e3d1a6b5c0e9d72"
}

คำสั่งซื้อที่สำเร็จ ​

json
{
    "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 ยอดนี้จะไม่ถูกหักออกจากยอดฝาก
paymentModepostpaid
energyTRX / activationTRX / totalTRXยอดเงินที่แน่นอน ทศนิยม 6 ตำแหน่ง
quoteId, altปรากฏเมื่อมีการวางคำสั่งซื้อด้วยใบเสนอราคา: รหัสใบเสนอราคาและยอดเงินตามที่เสนอ
activationFinalปรากฏและมีค่าเป็น false เฉพาะเมื่อยอดค่าเปิดใช้งานเป็นยอดเบื้องต้น ยอดเงินสุดท้ายจะปรากฏในใบแจ้งหนี้ของคุณ

ฟิลด์อื่นๆ ทั้งหมดจะเหมือนกับคำสั่งซื้อแบบ prepaid

ถึงวงเงินสินเชื่อแล้ว (402) ​

json
{
    "detail": {
        "code": 1004,
        "msg": "Postpaid credit limit reached.",
        "paymentMode": "postpaid",
        "reason": "limit_reached"
    }
}

คำสั่งซื้อจะไม่ได้รับการดำเนินการและไม่มีการเรียกเก็บเงิน คำสั่งซื้อใหม่จะได้รับการยอมรับอีกครั้งเมื่อการชำระเงินของคุณได้รับการบันทึกหรือมีการเพิ่มวงเงินของคุณ

รหัสข้อผิดพลาดของระบบ Postpaid ​

รหัสHTTPคำอธิบาย
10010200ผลการตรวจสอบราคา (test)
10011200ออกใบเสนอราคาแล้ว (freezePrice)
1004402ถึงวงเงินสินเชื่อ postpaid แล้ว
4100400คำขอไม่ถูกต้อง
4101400ไม่รองรับ priceCurrency
4102400มีการใช้ quoteId ร่วมกับ test หรือ freezePrice
4103409ใบเสนอราคาถูกใช้งานไปแล้ว
4104409ใบเสนอราคาหมดอายุแล้ว
4105409คีย์ Idempotency ถูกใช้ไปแล้วสำหรับคำขออื่น
4106404ไม่พบใบเสนอราคา
4107409พารามิเตอร์ของคำสั่งซื้อแตกต่างจากใบเสนอราคา
4108400รูปแบบ quoteId ไม่ถูกต้อง
4109422ไม่พร้อมใช้งานสำหรับบัญชีย่อย
5032503ราคาไม่พร้อมใช้งานชั่วคราว
5033503อัตราแลกเปลี่ยนไม่พร้อมใช้งานชั่วคราว
5034503ระบบเรียกเก็บเงินไม่พร้อมใช้งานชั่วคราว — คำสั่งซื้อไม่ได้รับการยอมรับ
5036503การตรวจสอบสินเชื่อไม่พร้อมใช้งานชั่วคราว — ให้ลองใหม่ภายหลัง

สำหรับการตอบกลับ 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