GET /apiv2/usdt/{sender}&
Tính toán chi phí chuyển USDT trên TRON (endpoint công khai, không yêu cầu API key).
Trả về phân tích chi tiết về tài khoản người gửi và người nhận, yêu cầu tài nguyên (Energy/Bandwidth) và phương án chi phí được khuyến nghị.
Giới hạn tốc độ thấp — dành cho mục đích sử dụng không thường xuyên / thử nghiệm
Endpoint này được chia sẻ trên toàn cầu và bị giới hạn tốc độ ở mức 1 yêu cầu/giây và 60 yêu cầu/phút. Khi ứng dụng của bạn nằm sau Cloudflare hoặc một reverse proxy khác, giới hạn này có thể được chia sẻ giữa tất cả các client kết nối đến Netts qua cùng một edge, vì vậy bạn có thể gặp lỗi 429 Too Many Requests sớm hơn mức 60 yêu cầu/phút từ một người dùng đơn lẻ.
Đối với bất kỳ nhu cầu nào ngoài các lệnh gọi rời rạc, hãy sử dụng endpoint POST /apiv2/usdt/analyze có xác thực — endpoint này có giới hạn trên mỗi key cao hơn nhiều (50 yêu cầu/giây).
URL của endpoint
GET https://netts.io/apiv2/usdt/{sender}&{receiver}Tham số URL
| Tham số | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| sender | string | Có | Địa chỉ TRON của người gửi |
| receiver | string | Có | Địa chỉ TRON của người nhận |
Các địa chỉ được truyền trong đường dẫn, phân tách bằng dấu và (&). Cả hai phải là địa chỉ TRON base58 hợp lệ (34 ký tự, bắt đầu bằng chữ T, checksum hợp lệ).
Ví dụ yêu cầu
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())Phản hồi
Thành công (200 OK)
Envelope cấp cao nhất:
{
"status": "success",
"data": { /* TransferAnalysis — xem bên dưới */ },
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}data (TransferAnalysis)
| Trường | Loại | Mô tả |
|---|---|---|
sender | AddressInfo | Thông tin tài khoản đầy đủ của người gửi (số dư, staking, ủy quyền, kích hoạt). |
receiver | AddressInfo | Thông tin tài khoản đầy đủ của người nhận. |
requirements | Requirements | Energy / Bandwidth mà giao dịch chuyển tiền cần (gốc + kèm bộ đệm an toàn). |
costs | Costs | Chi tiết chi phí đốt so với thuê và phương thức được khuyến nghị. |
can_transfer | boolean | true nếu giao dịch chuyển tiền có thể thực hiện với tài nguyên/giá hiện tại. |
issues | string[] | Các vấn đề phát hiện trong quá trình phân tích (ví dụ: không đủ Bandwidth). |
recommendations | string[] | Các đề xuất dễ hiểu dành cho client. |
variation_id | string | null | ID kịch bản khớp (ví dụ: "CUSTOM") từ danh mục biến thể nội bộ. |
AddressInfo
Các trường thông thường bạn sẽ sử dụng trong tích hợp: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance. Các trường cấp thấp bổ sung cho mục đích nâng cao: 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
| Trường | Loại | Mô tả |
|---|---|---|
energy_needed | int | Số đơn vị Energy gốc cần thiết cho giao dịch chuyển tiền. |
bandwidth_needed | int | Số đơn vị Bandwidth gốc cần thiết. |
energy_with_buffer | int | Energy được làm tròn lên mức thuê an toàn (ví dụ: 131 000). |
bandwidth_with_buffer | int | Bandwidth có kèm theo một lượng đệm an toàn nhỏ. |
receiver_has_usdt | boolean | Người nhận đã có sẵn USDT hay chưa (ảnh hưởng đến Energy). |
Costs
| Trường | Loại | Mô tả |
|---|---|---|
energy_burn_trx | decimal | Số TRX bị đốt nếu chi trả Energy qua hình thức đốt trực tiếp. |
bandwidth_burn_trx | decimal | Số TRX bị đốt để bù Bandwidth nếu không có sẵn miễn phí. |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx. |
total_burn_sun | int | total_burn_trx được tính theo SUN (10⁻⁶ TRX). |
energy_rental_trx | decimal | Chi phí thuê lượng Energy cần thiết từ Netts trong khoảng thời gian dưới đây. |
energy_rental_sun | int | Tương tự như trên nhưng tính bằng SUN. |
rental_time_period | string | Ví dụ: "1h", "5m", hoặc "not_needed" khi thuê không phải là phương án tối ưu. |
rental_price_per_unit | int | Giá thuê mỗi đơn vị Energy tính bằng SUN cho khoảng thời gian đã chọn. |
savings_trx | decimal | Mức tiết kiệm khi rent so với burn (có thể âm nếu đốt là tối ưu nhất). |
savings_percentage | float | Mức tiết kiệm tương tự tính theo phần trăm. |
recommended_method | string | "burn" hoặc "rent" — tùy chọn rẻ hơn cho yêu cầu hiện tại. |
total_cost_trx | decimal | null | Chi phí thực tế nếu bạn làm theo recommended_method. |
sender_activation_cost | decimal | null | Chi phí phụ nếu tài khoản người gửi cần kích hoạt, nếu không thì null. |
Ví dụ phản hồi thực tế (rút gọn)
{
"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
}Lỗi
| HTTP | Body (ví dụ) | Khi nào |
|---|---|---|
| 400 | {"code": -1, "msg": "Invalid sender address format: Txyz..."} | Địa chỉ không vượt qua bước kiểm tra base58 / độ dài / checksum của TRON. |
| 400 | {"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"} | URL không chứa hai địa chỉ được phân tách bằng &. |
| 400 | {"code": -1, "msg": "Sender and receiver cannot be the same address"} | Địa chỉ người gửi và người nhận trùng nhau. |
| 429 | {"message": "API rate limit exceeded"} | Vượt quá giới hạn tốc độ (xem cảnh báo ở đầu trang này). |
| 500 | {"code": -1, "msg": "Internal server error"} | Lỗi phía máy chủ không mong muốn. |
Header giới hạn tốc độ
Trên mỗi phản hồi (bao gồm cả 429), các header sau sẽ được trả về:
| Header | Ý nghĩa |
|---|---|
X-RateLimit-Limit-Second | Số yêu cầu tối đa được phép mỗi giây (hiện tại là 1). |
X-RateLimit-Remaining-Second | Số yêu cầu bạn vẫn có thể gửi trong giây này. |
X-RateLimit-Limit-Minute | Số yêu cầu tối đa được phép mỗi phút (hiện tại là 60). |
X-RateLimit-Remaining-Minute | Số yêu cầu bạn vẫn có thể gửi trong phút này. |
Retry-After | Khi gặp mã 429 — số giây cần chờ trước khi thử lại. |
Header gỡ lỗi
Mỗi phản hồi cũng mang các mã định danh hữu ích khi tạo phiếu hỗ trợ — vui lòng đính kèm chính xác nguyên văn để chúng tôi có thể tìm thấy yêu cầu trong nhật ký chỉ trong vài giây:
| Header | Ý nghĩa |
|---|---|
X-Request-ID | ID yêu cầu phía ứng dụng (được tạo bởi bộ tính toán). |
X-Process-Time | Thời gian xử lý của ứng dụng tính bằng mili-giây (upstream, không bao gồm Kong). |
X-Kong-Request-Id | ID yêu cầu phía Kong (có trong nhật ký truy cập Kong). |
Thời gian chờ và thử lại phía client
Bộ tính toán thực hiện các truy vấn on-chain trực tiếp tới các node TRON cho mỗi yêu cầu, vì vậy khi hệ thống chịu tải hoặc node upstream phản hồi chậm, một lệnh gọi có thể mất vài giây. Thời gian chờ của client quá ngắn sẽ dẫn đến thất bại ngay cả đối với các phản hồi bình thường.
Cấu hình khuyến nghị:
- Thời gian chờ (Timeout) ≥ 15 giây (30 giây sẽ an toàn hơn). Mức mặc định 10 giây được sử dụng bởi nhiều HTTP client là quá ngắn.
- Khi gặp HTTP 429, hãy tuân thủ header
Retry-After(giây). Thêm một khoảng biến thiên ngẫu nhiên nhỏ (ví dụ: 0–200 ms) trước khi thử lại, sau đó sử dụng thuật toán backoff theo cấp số nhân nếu bạn vẫn bị giới hạn. - Khi gặp HTTP 5xx hoặc lỗi mạng, thử lại tối đa 2–3 lần với thuật toán backoff theo cấp số nhân; không gửi dồn dập các yêu cầu đến endpoint.
- Lưu cache kết quả phía client trong 30–60 giây cho mỗi cặp
(sender, receiver)— giá tài nguyên và trạng thái on-chain cơ bản hiếm khi thay đổi đủ nhanh để cần phải tính toán lại thường xuyên hơn.
Ví dụ phản hồi 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"}Ghi chú
- Truy cập ẩn danh: không cần
X-API-KEY, không cần headerAuthorization, không cần danh sách trắng IP. - Phản hồi luôn được đóng gói trong
{status, data, current_utc_time, processing_time_ms}— các hệ thống tích hợp nên đọc biểu giá từdata.costsvà các yêu cầu từdata.requirements. - Phản hồi được tính toán theo thời gian thực — nó phản ánh giá tài nguyên TRON hiện tại từ Netts và trạng thái on-chain hiện tại của cả hai địa chỉ, vì vậy có thể xuất hiện sai lệch nhỏ giữa các lệnh gọi liên tiếp.
- Nếu ứng dụng của bạn cần gọi bộ tính toán nhiều hơn vài lần mỗi phút (trên mỗi IP / trên mỗi CF-edge), hãy chuyển sang
POST /apiv2/usdt/analyzebằng API key của bạn.