GET /apiv2/usdt/{sender}&
Calcula el coste de transferencia de TRON USDT (endpoint público, no requiere clave API).
Devuelve un análisis detallado de las cuentas del remitente y del destinatario, los requisitos de recursos (energy/bandwidth) y la ruta de coste recomendada.
Límite de tasa bajo — pensado para uso ocasional / pruebas
Este endpoint se comparte a nivel global y tiene un límite de tasa de 1 req/s y 60 req/min. Cuando su aplicación está detrás de Cloudflare u otro proxy inverso, el límite puede compartirse efectivamente entre todos los clientes que acceden a Netts a través del mismo borde, por lo que podría ver 429 Too Many Requests antes de alcanzar las 60 solicitudes/minuto desde un solo usuario.
Para cualquier uso más allá de llamadas esporádicas, utilice el endpoint autenticado POST /apiv2/usdt/analyze — tiene un límite por clave mucho más alto (50 req/s).
URL del endpoint
GET https://netts.io/apiv2/usdt/{sender}&{receiver}Parámetros de URL
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| sender | string | Sí | Dirección TRON del remitente |
| receiver | string | Sí | Dirección TRON del destinatario |
Las direcciones se pasan en la ruta, separadas por un et (&). Ambas deben ser direcciones TRON base58 válidas (34 caracteres, comienzan con T, suma de comprobación válida).
Ejemplos de solicitud
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())Respuesta
Éxito (200 OK)
Envoltorio de nivel superior:
{
"status": "success",
"data": { /* TransferAnalysis — see below */ },
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}data (TransferAnalysis)
| Campo | Tipo | Descripción |
|---|---|---|
sender | AddressInfo | Información completa de la cuenta del remitente (saldo, staking, delegación, activación). |
receiver | AddressInfo | Información completa de la cuenta del destinatario. |
requirements | Requirements | Energy / bandwidth que necesitará la transferencia (bruto + con margen de seguridad). |
costs | Costs | Desglose de costes de quema frente a alquiler y el método recomendado. |
can_transfer | boolean | true si la transferencia se puede ejecutar con los recursos/precios actuales. |
issues | string[] | Problemas detectados durante el análisis (p. ej. bandwidth insuficiente). |
recommendations | string[] | Sugerencias legibles para el cliente. |
variation_id | string | null | ID del escenario coincidente (p. ej. "CUSTOM") del catálogo interno de variaciones. |
AddressInfo
Campos típicos que utilizará en las integraciones: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance. Campos adicionales de bajo nivel para uso avanzado: 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
| Campo | Tipo | Descripción |
|---|---|---|
energy_needed | int | Unidades de energy brutas requeridas para la transferencia. |
bandwidth_needed | int | Unidades de bandwidth brutas requeridas. |
energy_with_buffer | int | Energy redondeada hacia arriba a un nivel de alquiler seguro (p. ej. 131 000). |
bandwidth_with_buffer | int | Bandwidth con un pequeño margen de seguridad. |
receiver_has_usdt | boolean | Si el destinatario ya posee USDT (afecta a energy). |
Costs
| Campo | Tipo | Descripción |
|---|---|---|
energy_burn_trx | decimal | TRX quemados si energy se paga mediante quema directa. |
bandwidth_burn_trx | decimal | TRX quemados para cubrir bandwidth si no está disponible de forma gratuita. |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx. |
total_burn_sun | int | total_burn_trx expresado en SUN (10⁻⁶ TRX). |
energy_rental_trx | decimal | Coste para alquilar la energy requerida de Netts para el período inferior. |
energy_rental_sun | int | Lo mismo que el anterior pero en SUN. |
rental_time_period | string | p. ej. "1h", "5m", o "not_needed" cuando el alquiler no es la mejor opción. |
rental_price_per_unit | int | Precio de alquiler por unidad de energy en SUN para el período elegido. |
savings_trx | decimal | Cuánto más barato es rent frente a burn (puede ser negativo si la quema es mejor). |
savings_percentage | float | Lo mismo como porcentaje. |
recommended_method | string | "burn" o "rent" — la opción más económica para la solicitud actual. |
total_cost_trx | decimal | null | Coste real si sigue recommended_method. |
sender_activation_cost | decimal | null | Coste adicional si la cuenta del remitente necesita activación, si no null. |
Ejemplo de respuesta real (abreviada)
{
"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
}Errores
| HTTP | Cuerpo (ejemplo) | Cuándo |
|---|---|---|
| 400 | {"code": -1, "msg": "Invalid sender address format: Txyz..."} | La dirección no supera la validación de TRON base58 / longitud / suma de comprobación. |
| 400 | {"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"} | La URL no contiene dos direcciones separadas por &. |
| 400 | {"code": -1, "msg": "Sender and receiver cannot be the same address"} | Las direcciones del remitente y del destinatario son idénticas. |
| 429 | {"message": "API rate limit exceeded"} | Límite de tasa excedido (consulte la advertencia en la parte superior de esta página). |
| 500 | {"code": -1, "msg": "Internal server error"} | Fallo inesperado del lado del servidor. |
Encabezados de límite de tasa
En cada respuesta (incluida la 429) se devuelven los siguientes encabezados:
| Encabezado | Significado |
|---|---|
X-RateLimit-Limit-Second | Solicitudes máximas permitidas por segundo (actualmente 1). |
X-RateLimit-Remaining-Second | Cuántas puede enviar todavía este segundo. |
X-RateLimit-Limit-Minute | Solicitudes máximas permitidas por minuto (actualmente 60). |
X-RateLimit-Remaining-Minute | Cuántas puede enviar todavía este minuto. |
Retry-After | En un 429 — segundos a esperar antes de reintentar. |
Encabezados de depuración
Cada respuesta también incluye identificadores útiles a la hora de abrir un ticket de soporte técnico — por favor, inclúyalos literalmente para que podamos encontrar la solicitud en nuestros registros en cuestión de segundos:
| Encabezado | Significado |
|---|---|
X-Request-ID | ID de la solicitud del lado de la aplicación (generado por la calculadora). |
X-Process-Time | Tiempo de procesamiento de la aplicación en milisegundos (upstream, excluyendo Kong). |
X-Kong-Request-Id | ID de la solicitud del lado de Kong (presente en los registros de acceso de Kong). |
Tiempo de espera y reintentos del lado del cliente
La calculadora realiza consultas en cadena en vivo a los nodos de TRON para cada solicitud, por lo que bajo carga o con nodos upstream lentos una sola llamada puede tardar varios segundos. Los tiempos de espera cortos del cliente fallarán incluso en respuestas correctas.
Ajustes recomendados:
- Tiempo de espera ≥ 15 segundos (30 s es más seguro). El valor predeterminado de 10 s utilizado por muchos clientes HTTP es demasiado corto.
- En HTTP 429, respete el encabezado
Retry-After(segundos). Añada una pequeña fluctuación (p. ej. 0–200 ms) antes de reintentar, luego utilice retroceso exponencial si sigue alcanzando el límite. - En HTTP 5xx o errores de red, reintente como máximo 2–3 veces con retroceso exponencial; no sature el endpoint.
- Almacene en caché el resultado del lado del cliente durante 30–60 segundos por par
(sender, receiver)— los precios de los recursos subyacentes y el estado en la cadena rara vez cambian lo suficientemente rápido como para justificar un recálculo más frecuente.
Ejemplo de respuesta 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"}Notas
- Acceso anónimo: sin
X-API-KEY, sin encabezadoAuthorization, sin lista blanca de IP. - La respuesta siempre viene envuelta en
{status, data, current_utc_time, processing_time_ms}— las integraciones deben leer los precios desdedata.costsy los requisitos desdedata.requirements. - La respuesta se calcula en tiempo real — refleja los precios de recursos de TRON actuales de Netts y el estado en cadena actual de ambas direcciones, por lo que cabe esperar pequeñas variaciones entre llamadas consecutivas.
- Si su aplicación necesita llamar a la calculadora más de unas pocas veces por minuto (por IP / por borde de CF), cambie a
POST /apiv2/usdt/analyzecon su clave API.