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

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ámetroTipoRequeridoDescripción
senderstringDirección TRON del remitente
receiverstringDirecció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

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

Respuesta

Éxito (200 OK)

Envoltorio de nivel superior:

json
{
    "status": "success",
    "data": { /* TransferAnalysis — see below */ },
    "current_utc_time": "2026-04-23 11:54:13",
    "processing_time_ms": 19.27
}

data (TransferAnalysis)

CampoTipoDescripción
senderAddressInfoInformación completa de la cuenta del remitente (saldo, staking, delegación, activación).
receiverAddressInfoInformación completa de la cuenta del destinatario.
requirementsRequirementsEnergy / bandwidth que necesitará la transferencia (bruto + con margen de seguridad).
costsCostsDesglose de costes de quema frente a alquiler y el método recomendado.
can_transferbooleantrue si la transferencia se puede ejecutar con los recursos/precios actuales.
issuesstring[]Problemas detectados durante el análisis (p. ej. bandwidth insuficiente).
recommendationsstring[]Sugerencias legibles para el cliente.
variation_idstring | nullID 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
CampoTipoDescripción
energy_neededintUnidades de energy brutas requeridas para la transferencia.
bandwidth_neededintUnidades de bandwidth brutas requeridas.
energy_with_bufferintEnergy redondeada hacia arriba a un nivel de alquiler seguro (p. ej. 131 000).
bandwidth_with_bufferintBandwidth con un pequeño margen de seguridad.
receiver_has_usdtbooleanSi el destinatario ya posee USDT (afecta a energy).
Costs
CampoTipoDescripción
energy_burn_trxdecimalTRX quemados si energy se paga mediante quema directa.
bandwidth_burn_trxdecimalTRX quemados para cubrir bandwidth si no está disponible de forma gratuita.
total_burn_trxdecimalenergy_burn_trx + bandwidth_burn_trx.
total_burn_suninttotal_burn_trx expresado en SUN (10⁻⁶ TRX).
energy_rental_trxdecimalCoste para alquilar la energy requerida de Netts para el período inferior.
energy_rental_sunintLo mismo que el anterior pero en SUN.
rental_time_periodstringp. ej. "1h", "5m", o "not_needed" cuando el alquiler no es la mejor opción.
rental_price_per_unitintPrecio de alquiler por unidad de energy en SUN para el período elegido.
savings_trxdecimalCuánto más barato es rent frente a burn (puede ser negativo si la quema es mejor).
savings_percentagefloatLo mismo como porcentaje.
recommended_methodstring"burn" o "rent" — la opción más económica para la solicitud actual.
total_cost_trxdecimal | nullCoste real si sigue recommended_method.
sender_activation_costdecimal | nullCoste adicional si la cuenta del remitente necesita activación, si no null.

Ejemplo de respuesta real (abreviada)

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
}

Errores

HTTPCuerpo (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:

EncabezadoSignificado
X-RateLimit-Limit-SecondSolicitudes máximas permitidas por segundo (actualmente 1).
X-RateLimit-Remaining-SecondCuántas puede enviar todavía este segundo.
X-RateLimit-Limit-MinuteSolicitudes máximas permitidas por minuto (actualmente 60).
X-RateLimit-Remaining-MinuteCuántas puede enviar todavía este minuto.
Retry-AfterEn 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:

EncabezadoSignificado
X-Request-IDID de la solicitud del lado de la aplicación (generado por la calculadora).
X-Process-TimeTiempo de procesamiento de la aplicación en milisegundos (upstream, excluyendo Kong).
X-Kong-Request-IdID 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
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 encabezado Authorization, 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 desde data.costs y los requisitos desde data.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/analyze con su clave API.