Appearance
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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| sender | string | Sim | Endereço TRON do remetente |
| receiver | string | Sim | Endereç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)
| Campo | Tipo | Descrição |
|---|---|---|
sender | AddressInfo | Informações completas da conta do remetente (saldo, staking, delegação, ativação). |
receiver | AddressInfo | Informações completas da conta do destinatário. |
requirements | Requirements | Energy / bandwidth necessárias para a transferência (brutas + com margem de segurança). |
costs | Costs | Detalhamento dos custos de burn vs. aluguel e o método recomendado. |
can_transfer | boolean | true se a transferência puder ser executada com os recursos/preços atuais. |
issues | string[] | Problemas detectados durante a análise (ex.: bandwidth insuficiente). |
recommendations | string[] | Sugestões legíveis para o cliente. |
variation_id | string | null | ID 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
| Campo | Tipo | Descrição |
|---|---|---|
energy_needed | int | Unidades brutas de energy necessárias para a transferência. |
bandwidth_needed | int | Unidades brutas de bandwidth necessárias. |
energy_with_buffer | int | Energy arredondada para um nível seguro de aluguel (ex.: 131 000). |
bandwidth_with_buffer | int | Bandwidth com uma pequena margem de segurança. |
receiver_has_usdt | boolean | Se o destinatário já possui USDT (afeta a energy). |
Costs
| Campo | Tipo | Descrição |
|---|---|---|
energy_burn_trx | decimal | TRX queimados se a energy for paga via queima direta. |
bandwidth_burn_trx | decimal | TRX queimados para cobrir bandwidth se não estiver disponível gratuitamente. |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx. |
total_burn_sun | int | total_burn_trx expresso em SUN (10⁻⁶ TRX). |
energy_rental_trx | decimal | Custo para alugar a energy necessária da Netts pelo período abaixo. |
energy_rental_sun | int | O mesmo que acima, mas em SUN. |
rental_time_period | string | ex.: "1h", "5m", ou "not_needed" quando o aluguel não for a melhor opção. |
rental_price_per_unit | int | Preço de aluguel por unidade de energy em SUN para o período escolhido. |
savings_trx | decimal | Quanto o rent é mais barato em relação a burn (pode ser negativo se queimar for a melhor opção). |
savings_percentage | float | O mesmo em porcentagem. |
recommended_method | string | "burn" ou "rent" — a opção mais econômica para a requisição atual. |
total_cost_trx | decimal | null | Custo real se você seguir o recommended_method. |
sender_activation_cost | decimal | null | Custo 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
| HTTP | Corpo (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:
| Header | Significado |
|---|---|
X-RateLimit-Limit-Second | Máximo de requisições permitidas por segundo (atualmente 1). |
X-RateLimit-Remaining-Second | Quantas você ainda pode enviar neste segundo. |
X-RateLimit-Limit-Minute | Máximo de requisições permitidas por minuto (atualmente 60). |
X-RateLimit-Remaining-Minute | Quantas você ainda pode enviar neste minuto. |
Retry-After | Em 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:
| Header | Significado |
|---|---|
X-Request-ID | ID da requisição do lado da aplicação (gerado pela calculadora). |
X-Process-Time | Tempo de processamento da aplicação em milissegundos (upstream, excluindo o Kong). |
X-Kong-Request-Id | ID 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 headerAuthorization, 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 emdata.costse os requisitos emdata.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/analyzecom a sua chave de API.