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

GET /apiv2/usdt/{sender}&

Calcular o custo de transferência de USDT na TRON (endpoint público, nenhuma chave de API necessária).

Retorna uma análise detalhada das contas de remetente e destinatário, requisitos de recursos (energy/bandwidth) e a rota de custo recomendada.

Limite de taxa baixo — destinado para uso ocasional / testes

Este endpoint é compartilhado globalmente e limitado a 1 req/seg e 60 req/min. Quando sua aplicação estiver atrás do Cloudflare ou de outro proxy reverso, o limite pode ser efetivamente compartilhado entre todos os clientes que acessam a Netts pela mesma borda (edge), de modo que você pode ver 429 Too Many Requests antes de 60 requisições/minuto de um único usuário.

Para qualquer uso além de chamadas esporádicas, utilize o endpoint autenticado POST /apiv2/usdt/analyze — ele possui um limite por chave muito mais alto (50 req/seg).

URL do endpoint

GET https://netts.io/apiv2/usdt/{sender}&{receiver}

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
senderstringSimEndereço TRON do remetente
receiverstringSimEndereço TRON do destinatário

Os endereços são passados no caminho, separados por um e comercial (&). Ambos devem ser endereços base58 TRON válidos (34 caracteres, começam com T, checksum válido).

Exemplos de requisição

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

Resposta

Sucesso (200 OK)

Envelope de nível superior:

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

data (TransferAnalysis)

CampoTipoDescrição
senderAddressInfoInformações completas da conta do remetente (saldo, staking, delegação, ativação).
receiverAddressInfoInformações completas da conta do destinatário.
requirementsRequirementsEnergy / bandwidth necessárias para a transferência (brutas + com margem de segurança).
costsCostsDetalhamento dos custos de burn vs. aluguel e o método recomendado.
can_transferbooleantrue se a transferência puder ser executada com os recursos/preços atuais.
issuesstring[]Problemas detectados durante a análise (ex.: bandwidth insuficiente).
recommendationsstring[]Sugestões legíveis para o cliente.
variation_idstring | nullID do cenário correspondente (ex.: "CUSTOM") do catálogo interno de variações.
AddressInfo

Campos típicos que você usará nas integrações: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance. Campos adicionais de baixo nível para uso avançado: 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
CampoTipoDescrição
energy_neededintUnidades brutas de energy necessárias para a transferência.
bandwidth_neededintUnidades brutas de bandwidth necessárias.
energy_with_bufferintEnergy arredondada para um nível seguro de aluguel (ex.: 131 000).
bandwidth_with_bufferintBandwidth com uma pequena margem de segurança.
receiver_has_usdtbooleanSe o destinatário já possui USDT (afeta a energy).
Costs
CampoTipoDescrição
energy_burn_trxdecimalTRX queimados se a energy for paga via queima direta.
bandwidth_burn_trxdecimalTRX queimados para cobrir bandwidth se não estiver disponível gratuitamente.
total_burn_trxdecimalenergy_burn_trx + bandwidth_burn_trx.
total_burn_suninttotal_burn_trx expresso em SUN (10⁻⁶ TRX).
energy_rental_trxdecimalCusto para alugar a energy necessária da Netts pelo período abaixo.
energy_rental_sunintO mesmo que acima, mas em SUN.
rental_time_periodstringex.: "1h", "5m", ou "not_needed" quando o aluguel não for a melhor opção.
rental_price_per_unitintPreço de aluguel por unidade de energy em SUN para o período escolhido.
savings_trxdecimalQuanto o rent é mais barato em relação a burn (pode ser negativo se queimar for a melhor opção).
savings_percentagefloatO mesmo em porcentagem.
recommended_methodstring"burn" ou "rent" — a opção mais econômica para a requisição atual.
total_cost_trxdecimal | nullCusto real se você seguir o recommended_method.
sender_activation_costdecimal | nullCusto extra se a conta do remetente precisar de ativação, caso contrário null.

Exemplo de resposta real (abreviado)

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
}

Erros

HTTPCorpo (exemplo)Quando
400{"code": -1, "msg": "Invalid sender address format: Txyz..."}O endereço falha na validação de base58 / comprimento / checksum da TRON.
400{"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"}A URL não contém dois endereços separados por &.
400{"code": -1, "msg": "Sender and receiver cannot be the same address"}Os endereços de remetente e destinatário são idênticos.
429{"message": "API rate limit exceeded"}Limite de taxa excedido (veja o aviso no topo desta página).
500{"code": -1, "msg": "Internal server error"}Falha inesperada no lado do servidor.

Headers de limite de taxa

Em cada resposta (incluindo 429), os seguintes headers são retornados:

HeaderSignificado
X-RateLimit-Limit-SecondMáximo de requisições permitidas por segundo (atualmente 1).
X-RateLimit-Remaining-SecondQuantas você ainda pode enviar neste segundo.
X-RateLimit-Limit-MinuteMáximo de requisições permitidas por minuto (atualmente 60).
X-RateLimit-Remaining-MinuteQuantas você ainda pode enviar neste minuto.
Retry-AfterEm um 429 — segundos para aguardar antes de tentar novamente.

Headers de depuração

Cada resposta também carrega identificadores úteis ao abrir um chamado de suporte — por favor, inclua-os textualmente para que possamos encontrar a requisição em nossos logs em segundos:

HeaderSignificado
X-Request-IDID da requisição do lado da aplicação (gerado pela calculadora).
X-Process-TimeTempo de processamento da aplicação em milissegundos (upstream, excluindo o Kong).
X-Kong-Request-IdID da requisição do lado do Kong (presente nos logs de acesso do Kong).

Timeout e nova tentativa no lado do cliente

A calculadora realiza consultas on-chain em tempo real aos nós da TRON para cada requisição, portanto, sob carga ou com nós upstream lentos, uma única chamada pode levar vários segundos. Timeouts curtos no cliente falharão mesmo em respostas saudáveis.

Configurações recomendadas:

  • Timeout ≥ 15 segundos (30 s é mais seguro). O padrão de 10 s utilizado por muitos clientes HTTP é muito curto.
  • No HTTP 429, respeite o header Retry-After (segundos). Adicione uma pequena variação (jitter, ex.: 0–200 ms) antes de tentar novamente e, em seguida, use backoff exponencial caso continue atingindo o limite.
  • No HTTP 5xx ou erros de rede, tente novamente no máximo 2–3 vezes com backoff exponencial; não sobrecarregue o endpoint.
  • Faça cache do resultado no lado do cliente por 30–60 segundos por par (sender, receiver) — os preços dos recursos subjacentes e o estado on-chain raramente mudam rápido o suficiente para justificar um recálculo mais frequente.

Exemplo de resposta 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"}

Observações

  • Acesso anônimo: sem X-API-KEY, sem header Authorization, sem lista de permissões de IP.
  • A resposta é sempre encapsulada em {status, data, current_utc_time, processing_time_ms} — as integrações devem ler os preços em data.costs e os requisitos em data.requirements.
  • A resposta é calculada em tempo real — ela reflete os preços atuais dos recursos TRON da Netts e o estado on-chain atual de ambos os endereços, portanto, espere pequenas variações entre chamadas consecutivas.
  • Se a sua aplicação precisar chamar a calculadora mais do que algumas vezes por minuto (por IP / por borda da CF), mude para POST /apiv2/usdt/analyze com a sua chave de API.