GET /apiv2/usdt/{sender}&
คำนวณต้นทุนการโอน TRON USDT (endpoint แบบสาธารณะ ไม่ต้องใช้ API key)
ส่งคืนการวิเคราะห์โดยละเอียดของบัญชีผู้ส่งและผู้รับ ความต้องการทรัพยากร (Energy/Bandwidth) และแนวทางต้นทุนที่แนะนำ
ขีดจำกัดอัตราการเรียกใช้ต่ำ — มีไว้สำหรับการใช้งานเป็นครั้งคราว / การทดสอบ
endpoint นี้ถูกแชร์ร่วมกันทั่วโลก และถูกจำกัดอัตราการเรียกใช้ไว้ที่ 1 คำขอ/วินาที และ 60 คำขอ/นาที เมื่อแอปพลิเคชันของคุณอยู่เบื้องหลัง Cloudflare หรือ reverse proxy อื่น ๆ ขีดจำกัดนี้อาจถูกแชร์ร่วมกันระหว่างไคลเอนต์ทั้งหมดที่เข้าถึง Netts ผ่านโหนดเดียวกัน ดังนั้นคุณอาจพบข้อผิดพลาด 429 Too Many Requests เร็วกว่า 60 คำขอ/นาทีจากผู้ใช้รายเดียว
สำหรับการใช้งานที่มากกว่าการเรียกดูเป็นครั้งคราว ให้ใช้ endpoint ที่ต้องยืนยันตัวตน POST /apiv2/usdt/analyze — ซึ่งมีขีดจำกัดต่อ key ที่สูงกว่ามาก (50 คำขอ/วินาที)
URL ของ Endpoint
GET https://netts.io/apiv2/usdt/{sender}&{receiver}พารามิเตอร์ใน URL
| พารามิเตอร์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| sender | string | ใช่ | ที่อยู่ TRON ของผู้ส่ง |
| receiver | string | ใช่ | ที่อยู่ TRON ของผู้รับ |
ที่อยู่จะถูกส่งในพาธ โดยคั่นด้วย เครื่องหมายแอมเพอร์แซนด์ (&) ทั้งสองที่อยู่ต้องเป็นที่อยู่ TRON แบบ base58 ที่ถูกต้อง (ความยาว 34 ตัวอักษร, ขึ้นต้นด้วย T, และมี checksum ที่ถูกต้อง)
ตัวอย่างคำขอ
cURL
curl "https://netts.io/apiv2/usdt/TFLit1TFohBtT2f8UVCLFVPmZxawxqByYe&TTKR9aQdJWTgXLK9cmzaDitT5VXE497thL"Python
import requests
sender = "TFLit1TFohBtT2f8UVCLFVPmZxawxqByYe"
receiver = "TTKR9aQdJWTgXLK9cmzaDitT5VXE497thL"
url = f"https://netts.io/apiv2/usdt/{sender}&{receiver}"
response = requests.get(url, timeout=15)
if response.status_code == 200:
payload = response.json()
data = payload["data"]
print(f"Can transfer: {data['can_transfer']}")
print(f"Energy needed: {data['requirements']['energy_needed']}")
print(f"Bandwidth needed: {data['requirements']['bandwidth_needed']}")
print(f"Total cost (TRX): {data['costs']['total_cost_trx']}")
print(f"Recommended method: {data['costs']['recommended_method']}")
elif response.status_code == 429:
print("Rate-limited — retry after:", response.headers.get("Retry-After"), "s")
else:
print("Error:", response.json())การตอบกลับ
สำเร็จ (200 OK)
โครงสร้างระดับบนสุด:
{
"status": "success",
"data": { /* TransferAnalysis — ดูด้านล่าง */ },
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}data (TransferAnalysis)
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
sender | AddressInfo | ข้อมูลบัญชีฉบับเต็มสำหรับผู้ส่ง (ยอดคงเหลือ, การ stake, การ delegate, การเปิดใช้งาน) |
receiver | AddressInfo | ข้อมูลบัญชีฉบับเต็มสำหรับผู้รับ |
requirements | Requirements | Energy / Bandwidth ที่การโอนจะต้องใช้ (ค่าจริง + บัฟเฟอร์ความปลอดภัย) |
costs | Costs | รายละเอียดเปรียบเทียบต้นทุนระหว่าง Burn กับ Rent และวิธีการที่แนะนำ |
can_transfer | boolean | true หากสามารถทำการโอนได้ด้วยทรัพยากร/ราคาปัจจุบัน |
issues | string[] | ปัญหาที่ตรวจพบระหว่างการวิเคราะห์ (เช่น Bandwidth ไม่เพียงพอ) |
recommendations | string[] | คำแนะนำที่อ่านเข้าใจได้ง่ายสำหรับไคลเอนต์ |
variation_id | string | null | ID ของสถานการณ์ที่ตรงกัน (เช่น "CUSTOM") จากแค็ตตาล็อกรูปแบบภายใน |
AddressInfo
ฟิลด์ทั่วไปที่คุณจะใช้ในการรวมระบบ: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance ฟิลด์ระดับต่ำเพิ่มเติมสำหรับการใช้งานขั้นสูง: trx_balance_sun, energy_total, bandwidth_total, bandwidth_free, bandwidth_staked, energy_used, bandwidth_used, create_time, latest_operation_time, staked_for_energy, staked_for_bandwidth, delegated_for_energy, delegated_for_bandwidth, delegated_out_energy, delegated_out_bandwidth, votes
Requirements
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
energy_needed | int | หน่วย Energy พื้นฐานที่จำเป็นสำหรับการโอน |
bandwidth_needed | int | หน่วย Bandwidth พื้นฐานที่จำเป็น |
energy_with_buffer | int | Energy ที่ปัดเศษขึ้นเป็นระดับการเช่าที่ปลอดภัย (เช่น 131 000) |
bandwidth_with_buffer | int | Bandwidth ที่รวมบัฟเฟอร์ความปลอดภัยเล็กน้อยแล้ว |
receiver_has_usdt | boolean | ผู้รับมี USDT อยู่แล้วหรือไม่ (ส่งผลต่อ Energy) |
Costs
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
energy_burn_trx | decimal | TRX ที่ถูกเผาหากชำระค่า Energy ด้วยการเผาโดยตรง |
bandwidth_burn_trx | decimal | TRX ที่ถูกเผาเพื่อให้ครอบคลุม Bandwidth หากไม่มีเหลือให้ใช้ฟรี |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx |
total_burn_sun | int | total_burn_trx ในหน่วย SUN (10⁻⁶ TRX) |
energy_rental_trx | decimal | ต้นทุนในการเช่า Energy ที่จำเป็นจาก Netts สำหรับช่วงเวลาด้านล่าง |
energy_rental_sun | int | เหมือนกับด้านบนแต่แสดงในหน่วย SUN |
rental_time_period | string | เช่น "1h", "5m" หรือ "not_needed" เมื่อการเช่าไม่ใช่แนวทางที่ดีที่สุด |
rental_price_per_unit | int | ราคาค่าเช่าต่อหน่วย Energy ในหน่วย SUN สำหรับช่วงเวลาที่เลือก |
savings_trx | decimal | ความประหยัดเมื่อเลือก rent เทียบกับ burn (อาจติดลบได้หากการเผาคุ้มค่าที่สุด) |
savings_percentage | float | เหมือนข้างต้นแต่แสดงเป็นเปอร์เซ็นต์ |
recommended_method | string | "burn" หรือ "rent" — ตัวเลือกที่ถูกกว่าสำหรับคำขอปัจจุบัน |
total_cost_trx | decimal | null | ต้นทุนจริงหากคุณทำตาม recommended_method |
sender_activation_cost | decimal | null | ต้นทุนเพิ่มเติมหากบัญชีผู้ส่งจำเป็นต้องเปิดใช้งาน มิฉะนั้นจะเป็น null |
ตัวอย่างการตอบกลับจริง (แบบย่อ)
{
"status": "success",
"data": {
"sender": { "address": "TFLit1...", "is_activated": true, "trx_balance": 191.943, "usdt_balance": 24410.499, "energy_balance": 195297, "bandwidth_balance": 148, "has_usdt": true, "...": "..." },
"receiver": { "address": "TTKR9a...", "is_activated": true, "trx_balance": 18.656, "usdt_balance": 0.0, "energy_balance": 0, "bandwidth_balance": 263, "has_usdt": false, "...": "..." },
"requirements": {
"energy_needed": 130285,
"bandwidth_needed": 345,
"energy_with_buffer": 131000,
"bandwidth_with_buffer": 360,
"receiver_has_usdt": false
},
"costs": {
"energy_burn_trx": 0.0,
"bandwidth_burn_trx": 0.345,
"total_burn_trx": 0.345,
"total_burn_sun": 345000,
"energy_rental_trx": 0.0,
"energy_rental_sun": 0,
"rental_time_period": "not_needed",
"rental_price_per_unit": 0,
"savings_trx": 0.0,
"savings_percentage": 0.0,
"recommended_method": "burn",
"total_cost_trx": 0.345,
"sender_activation_cost": null
},
"can_transfer": true,
"issues": [
"Insufficient bandwidth: have 148, need 345. Network will burn 0.345 TRX for full amount"
],
"recommendations": [
"Insufficient bandwidth: have 148, need 345. Full amount of 0.345 TRX will be burned",
"💰 Total cost: 0.345 TRX (burn for all resources)"
],
"variation_id": "CUSTOM"
},
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}ข้อผิดพลาด
| HTTP | เนื้อหา (ตัวอย่าง) | กรณีที่เกิด |
|---|---|---|
| 400 | {"code": -1, "msg": "Invalid sender address format: Txyz..."} | ที่อยู่ไม่ผ่านการตรวจสอบความถูกต้องของ TRON base58 / ความยาว / checksum |
| 400 | {"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"} | URL ไม่ได้มีสองที่อยู่ที่คั่นด้วย & |
| 400 | {"code": -1, "msg": "Sender and receiver cannot be the same address"} | ที่อยู่ผู้ส่งและผู้รับเป็นที่อยู่เดียวกัน |
| 429 | {"message": "API rate limit exceeded"} | เกินขีดจำกัดอัตราการเรียกใช้ (ดูคำเตือนที่ด้านบนสุดของหน้านี้) |
| 500 | {"code": -1, "msg": "Internal server error"} | ความล้มเหลวที่ไม่คาดคิดจากฝั่งเซิร์ฟเวอร์ |
ส่วนหัวจำกัดอัตราการเรียกใช้
ในการตอบกลับทุกครั้ง (รวมถึง 429) ส่วนหัวต่อไปนี้จะถูกส่งกลับมาด้วย:
| ส่วนหัว | ความหมาย |
|---|---|
X-RateLimit-Limit-Second | จำนวนคำขอสูงสุดที่อนุญาตต่อวินาที (ปัจจุบันคือ 1) |
X-RateLimit-Remaining-Second | จำนวนคำขอที่ยังสามารถส่งได้ในวินาทีนี้ |
X-RateLimit-Limit-Minute | จำนวนคำขอสูงสุดที่อนุญาตต่อนาที (ปัจจุบันคือ 60) |
X-RateLimit-Remaining-Minute | จำนวนคำขอที่ยังสามารถส่งได้ในนาทีนี้ |
Retry-After | เมื่อเกิดข้อผิดพลาด 429 — จำนวนวินาทีที่ต้องรอก่อนลองใหม่อีกครั้ง |
ส่วนหัวสำหรับการดีบัก
ทุกการตอบกลับจะมีตัวระบุที่สะดวกต่อการใช้งานเมื่อต้องการเปิดคำร้องแจ้งปัญหา (support ticket) — โปรดระบุค่าเหล่านี้โดยไม่แก้ไข เพื่อให้เราสามารถค้นหาคำขอดังกล่าวในบันทึกข้อมูล (logs) ของเราได้ภายในไม่กี่วินาที:
| ส่วนหัว | ความหมาย |
|---|---|
X-Request-ID | Request ID ฝั่งแอปพลิเคชัน (สร้างขึ้นโดยโปรแกรมคำนวณ) |
X-Process-Time | เวลาประมวลผลของแอปพลิเคชันในหน่วยมิลลิวินาที (ฝั่งต้นทาง ไม่รวม Kong) |
X-Kong-Request-Id | Request ID ฝั่ง Kong (มีอยู่ในบันทึกการเข้าถึงของ Kong) |
การตั้งค่าไทม์เอาต์และการลองใหม่ฝั่งไคลเอนต์
ตัวคำนวณจะทำการสอบถามข้อมูลสดบนเชนไปยังโหนด TRON สำหรับแต่ละคำขอ ดังนั้นภายใต้สภาวะที่มีภาระงานสูงหรือโหนดต้นทางทำงานช้า การเรียกใช้ครั้งเดียวอาจใช้เวลา หลายวินาที การตั้งค่าไทม์เอาต์ฝั่งไคลเอนต์ที่สั้นเกินไปจะทำให้ล้มเหลว แม้ว่าการตอบกลับจะปกติสมบูรณ์ก็ตาม
การตั้งค่าที่แนะนำ:
- ตั้งเวลา Timeout ≥ 15 วินาที (30 วินาทีจะปลอดภัยยิ่งขึ้น) ค่าเริ่มต้น 10 วินาทีที่ใช้ใน ไคลเอนต์ HTTP หลายตัวนั้นสั้นเกินไป
- เมื่อพบ HTTP 429 ให้ปฏิบัติตามส่วนหัว
Retry-After(วินาที) และเพิ่ม jitter เล็กน้อย (เช่น 0–200 มิลลิวินาที) ก่อนลองใหม่ จากนั้นใช้ exponential backoff หากคุณยังคงชนขีดจำกัด - เมื่อพบ HTTP 5xx หรือข้อผิดพลาดของเครือข่าย ให้ลองใหม่ได้มากที่สุด 2–3 ครั้งด้วย exponential backoff และอย่าส่งคำขอถี่จนเป็นการระดมยิง endpoint
- แคชผลลัพธ์ไว้ที่ฝั่งไคลเอนต์เป็นเวลา 30–60 วินาที สำหรับแต่ละคู่
(sender, receiver)— เนื่องจากราคาของทรัพยากรและสถานะบนเชน แทบจะไม่มีการเปลี่ยนแปลงเร็วพอที่จะต้องคำนวณใหม่ถี่ขนาดนั้น
ตัวอย่างการตอบกลับ 429
HTTP/1.1 429 Too Many Requests
Content-Type: application/json; charset=utf-8
RateLimit-Limit: 1
RateLimit-Remaining: 0
RateLimit-Reset: 1
Retry-After: 1
X-RateLimit-Limit-Second: 1
X-RateLimit-Remaining-Second: 0
X-RateLimit-Limit-Minute: 60
X-RateLimit-Remaining-Minute: 0
{"message":"API rate limit exceeded"}หมายเหตุ
- การเข้าถึงแบบไม่ระบุตัวตน: ไม่ต้องใช้
X-API-KEY, ไม่ต้องมีส่วนหัวAuthorization, ไม่มีการจำกัด IP whitelist - การตอบกลับจะถูกห่อหุ้มใน
{status, data, current_utc_time, processing_time_ms}เสมอ — การรวมระบบควรอ่านราคาจากdata.costsและอ่านความต้องการทรัพยากรจากdata.requirements - การตอบกลับถูกคำนวณแบบเรียลไทม์ — ซึ่งสะท้อนถึงราคาปัจจุบันของทรัพยากร TRON จาก Netts และสถานะบนเชนล่าสุดของทั้งสองที่อยู่ ดังนั้นอาจพบความแตกต่างเล็กน้อยระหว่างการเรียกใช้งานที่ต่อเนื่องกัน
- หากแอปพลิเคชันของคุณจำเป็นต้องเรียกใช้ตัวคำนวณมากกว่าสองสามครั้ง ต่อนาที (ต่อ IP / ต่อ CF edge) ให้เปลี่ยนไปใช้
POST /apiv2/usdt/analyzeพร้อมระบุ API key ของคุณ