Appearance
GET /apiv2/usdt/{sender}&
Hitung biaya transfer TRON USDT (endpoint publik, tidak memerlukan kunci API).
Mengembalikan analisis mendalam tentang akun pengirim dan penerima, kebutuhan sumber daya (energy/bandwidth), dan jalur biaya yang direkomendasikan.
Batas rasio rendah — ditujukan untuk penggunaan sesekali / pengujian
Endpoint ini dibagikan secara global dan dibatasi pada 1 req/detik dan 60 req/menit. Ketika aplikasi Anda berada di balik Cloudflare atau reverse proxy lainnya, batas tersebut mungkin secara efektif dibagikan di antara semua klien yang mengakses Netts melalui edge yang sama, sehingga Anda mungkin melihat 429 Too Many Requests lebih cepat daripada 60 permintaan/menit dari satu pengguna.
Untuk kebutuhan apa pun di luar panggilan sporadis, gunakan endpoint terautentikasi POST /apiv2/usdt/analyze — endpoint ini memiliki batas per-kunci yang jauh lebih tinggi (50 req/detik).
URL Endpoint
GET https://netts.io/apiv2/usdt/{sender}&{receiver}Parameter URL
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| sender | string | Ya | Alamat TRON pengirim |
| receiver | string | Ya | Alamat TRON penerima |
Alamat diteruskan di dalam path, dipisahkan oleh tanda ampersand (&). Keduanya harus berupa alamat base58 TRON yang valid (34 karakter, dimulai dengan T, checksum valid).
Contoh permintaan
cURL
bash
curl "https://netts.io/apiv2/usdt/TFLit1TFohBtT2f8UVCLFVPmZxawxqByYe&TTKR9aQdJWTgXLK9cmzaDitT5VXE497thL"Python
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())Respons
Berhasil (200 OK)
Amplop tingkat atas:
json
{
"status": "success",
"data": { /* TransferAnalysis — lihat di bawah */ },
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}data (TransferAnalysis)
| Bidang | Tipe | Deskripsi |
|---|---|---|
sender | AddressInfo | Info akun lengkap untuk pengirim (saldo, staking, delegasi, aktivasi). |
receiver | AddressInfo | Info akun lengkap untuk penerima. |
requirements | Requirements | Energy / bandwidth yang dibutuhkan transfer (mentah + dengan buffer keamanan). |
costs | Costs | Rincian biaya pembakaran vs. sewa dan metode yang direkomendasikan. |
can_transfer | boolean | true jika transfer dapat dieksekusi dengan sumber daya/harga saat ini. |
issues | string[] | Masalah yang terdeteksi selama analisis (misalnya bandwidth tidak mencukupi). |
recommendations | string[] | Saran yang dapat dibaca manusia untuk klien. |
variation_id | string | null | ID skenario yang cocok (misalnya "CUSTOM") dari katalog variasi internal. |
AddressInfo
Bidang umum yang akan Anda gunakan dalam integrasi: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance. Bidang tingkat rendah tambahan untuk penggunaan lanjutan: 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
| Bidang | Tipe | Deskripsi |
|---|---|---|
energy_needed | int | Unit energy mentah yang diperlukan untuk transfer. |
bandwidth_needed | int | Unit bandwidth mentah yang diperlukan. |
energy_with_buffer | int | Energy dibulatkan ke atas ke tingkat sewa yang aman (mis. 131 000). |
bandwidth_with_buffer | int | Bandwidth dengan buffer keamanan kecil. |
receiver_has_usdt | boolean | Apakah penerima sudah memiliki USDT (memengaruhi energy). |
Costs
| Bidang | Tipe | Deskripsi |
|---|---|---|
energy_burn_trx | decimal | TRX yang dibakar jika energy dibayar melalui pembakaran langsung. |
bandwidth_burn_trx | decimal | TRX yang dibakar untuk menutupi bandwidth jika tidak tersedia secara gratis. |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx. |
total_burn_sun | int | total_burn_trx dinyatakan dalam SUN (10⁻⁶ TRX). |
energy_rental_trx | decimal | Biaya untuk menyewa energy yang diperlukan dari Netts untuk periode di bawah. |
energy_rental_sun | int | Sama seperti di atas tetapi dalam SUN. |
rental_time_period | string | mis. "1h", "5m", atau "not_needed" saat sewa bukan jalur terbaik. |
rental_price_per_unit | int | Harga sewa per unit energy dalam SUN untuk periode yang dipilih. |
savings_trx | decimal | Berapa banyak lebih murahnya rent vs. burn (bisa negatif jika pembakaran adalah yang terbaik). |
savings_percentage | float | Sama seperti di atas dalam persentase. |
recommended_method | string | "burn" atau "rent" — opsi yang lebih murah untuk permintaan saat ini. |
total_cost_trx | decimal | null | Biaya sebenarnya jika Anda mengikuti recommended_method. |
sender_activation_cost | decimal | null | Biaya tambahan jika akun pengirim memerlukan aktivasi, jika tidak null. |
Contoh respons nyata (disingkat)
json
{
"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
}Kesalahan
| HTTP | Isi (contoh) | Kapan |
|---|---|---|
| 400 | {"code": -1, "msg": "Invalid sender address format: Txyz..."} | Alamat gagal dalam validasi TRON base58 / panjang / checksum. |
| 400 | {"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"} | URL tidak berisi dua alamat yang dipisahkan oleh &. |
| 400 | {"code": -1, "msg": "Sender and receiver cannot be the same address"} | Alamat pengirim dan penerima identik. |
| 429 | {"message": "API rate limit exceeded"} | Batas rasio terlampaui (lihat peringatan di bagian atas halaman ini). |
| 500 | {"code": -1, "msg": "Internal server error"} | Kegagalan sisi server yang tidak terduga. |
Header batas rasio
Pada setiap respons (termasuk 429) header berikut dikembalikan:
| Header | Arti |
|---|---|
X-RateLimit-Limit-Second | Permintaan maksimum yang diizinkan per detik (saat ini 1). |
X-RateLimit-Remaining-Second | Berapa banyak yang masih boleh Anda kirim detik ini. |
X-RateLimit-Limit-Minute | Permintaan maksimum yang diizinkan per menit (saat ini 60). |
X-RateLimit-Remaining-Minute | Berapa banyak yang masih boleh Anda kirim menit ini. |
Retry-After | Pada 429 — detik untuk menunggu sebelum mencoba kembali. |
Header debug
Setiap respons juga membawa pengidentifikasi yang berguna saat membuka tiket dukungan — harap sertakan secara persis agar kami dapat menemukan permintaan tersebut di log kami dalam hitungan detik:
| Header | Arti |
|---|---|
X-Request-ID | ID permintaan sisi aplikasi (dihasilkan oleh kalkulator). |
X-Process-Time | Waktu pemrosesan aplikasi dalam milidetik (upstream, tidak termasuk Kong). |
X-Kong-Request-Id | ID permintaan sisi Kong (ada di log akses Kong). |
Batas waktu sisi klien dan percobaan ulang
Kalkulator melakukan kueri langsung on-chain ke node TRON untuk setiap permintaan, sehingga di bawah beban berat atau node upstream yang lambat, satu panggilan dapat memakan waktu beberapa detik. Batas waktu klien yang pendek akan gagal bahkan pada respons yang sehat.
Pengaturan yang direkomendasikan:
- Batas waktu ≥ 15 detik (30 d lebih aman). Nilai default 10 d yang digunakan oleh banyak klien HTTP terlalu pendek.
- Pada HTTP 429, patuhi header
Retry-After(detik). Tambahkan sedikit variasi/jitter (mis. 0–200 md) sebelum mencoba kembali, lalu gunakan backoff eksponensial jika Anda masih mencapai batas. - Pada HTTP 5xx atau kesalahan jaringan, coba lagi paling banyak 2–3 kali dengan backoff eksponensial; jangan membombardir endpoint.
- Simpan hasil dalam cache sisi klien selama 30–60 detik per pasangan
(sender, receiver)— harga sumber daya yang mendasari dan kondisi on-chain jarang berubah cukup cepat untuk membenarkan perhitungan ulang yang lebih sering.
Contoh respons 429
http
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"}Catatan
- Akses anonim: tanpa
X-API-KEY, tanpa headerAuthorization, tanpa daftar putih IP. - Respons selalu dibungkus dalam
{status, data, current_utc_time, processing_time_ms}— integrasi harus membaca penetapan harga daridata.costsdan kebutuhan daridata.requirements. - Respons dihitung secara real-time — ini mencerminkan harga sumber daya TRON saat ini dari Netts dan status on-chain saat ini dari kedua alamat, jadi perkirakan sedikit variasi antara panggilan berturut-turut.
- Jika aplikasi Anda perlu memanggil kalkulator lebih dari beberapa kali per menit (per-IP / per-CF-edge), beralihlah ke
POST /apiv2/usdt/analyzedengan kunci API Anda.