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

GET /apiv2/usdt/{sender}&

Расчет стоимости перевода TRON USDT (публичный эндпоинт, API-ключ не требуется).

Возвращает подробный анализ аккаунтов отправителя и получателя, требования к ресурсам (Energy/Bandwidth) и рекомендуемый способ оптимизации расходов.

Низкий лимит запросов — предназначен для редкого использования и тестирования

Этот эндпоинт является общим для всех клиентов и ограничен лимитами 1 зап/сек и 60 зап/мин. Если ваше приложение находится за Cloudflare или другим обратным прокси, лимит может фактически делиться между всеми клиентами, обращающимися к Netts через одну и ту же граничную ноду (edge), поэтому вы можете получить ошибку 429 Too Many Requests раньше, чем один пользователь выполнит 60 запросов в минуту.

Для любых задач, кроме единичных вызовов, используйте эндпоинт с аутентификацией POST /apiv2/usdt/analyze — для него действует значительно более высокий лимит на каждый ключ (50 зап/сек).

URL эндпоинта

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

Параметры URL

ПараметрТипОбязательныйОписание
senderstringДаTRON-адрес отправителя
receiverstringДаTRON-адрес получателя

Адреса передаются в пути запроса и разделяются амперсандом (&). Оба адреса должны быть корректными TRON-адресами в формате base58 (34 символа, начинаются с T, валидная контрольная сумма).

Примеры запросов

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

Ответ

Успешный ответ (200 OK)

Оболочка верхнего уровня:

json
{
    "status": "success",
    "data": { /* TransferAnalysis — см. ниже */ },
    "current_utc_time": "2026-04-23 11:54:13",
    "processing_time_ms": 19.27
}

data (TransferAnalysis)

ПолеТипОписание
senderAddressInfoПолная информация об аккаунте отправителя (баланс, стейкинг, делегирование, активация).
receiverAddressInfoПолная информация об аккаунте получателя.
requirementsRequirementsEnergy / Bandwidth, необходимые для перевода (базовые + с запасом безопасности).
costsCostsДетализация затрат при сжигании и аренде, а также рекомендуемый метод.
can_transferbooleantrue, если перевод может быть выполнен при текущих ресурсах/ценах.
issuesstring[]Проблемы, обнаруженные в ходе анализа (например, недостаточно Bandwidth).
recommendationsstring[]Понятные пользователю рекомендации для клиента.
variation_idstring | nullИдентификатор сопоставленного сценария (например, "CUSTOM") из внутреннего каталога вариаций.
AddressInfo

Типичные поля для интеграций: address, is_activated, trx_balance, usdt_balance, has_usdt, energy_balance, bandwidth_balance. Дополнительные низкоуровневые поля для расширенного использования: 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
ПолеТипОписание
energy_neededintБазовое количество единиц Energy, необходимых для перевода.
bandwidth_neededintБазовое количество требуемых единиц Bandwidth.
energy_with_bufferintEnergy, округленная до безопасного уровня аренды (например, 131 000).
bandwidth_with_bufferintBandwidth с небольшим запасом безопасности.
receiver_has_usdtbooleanЕсть ли уже у получателя USDT (влияет на объем Energy).
Costs
ПолеТипОписание
energy_burn_trxdecimalTRX, сжигаемые при прямой оплате Energy путем сжигания.
bandwidth_burn_trxdecimalTRX, сжигаемые для покрытия Bandwidth, если он недоступен бесплатно.
total_burn_trxdecimalenergy_burn_trx + bandwidth_burn_trx.
total_burn_suninttotal_burn_trx, выраженный в SUN (10⁻⁶ TRX).
energy_rental_trxdecimalСтоимость аренды необходимой Energy в Netts на указанный ниже период.
energy_rental_sunintТо же, что и выше, но в SUN.
rental_time_periodstringНапример, "1h", "5m" или "not_needed", если аренда не является лучшим вариантом.
rental_price_per_unitintСтоимость аренды за единицу Energy в SUN для выбранного периода.
savings_trxdecimalНасколько дешевле вариант rent по сравнению с burn (может быть отрицательным, если сжигание выгоднее).
savings_percentagefloatТо же самое в процентах.
recommended_methodstring"burn" или "rent" — более выгодный вариант для текущего запроса.
total_cost_trxdecimal | nullФактическая стоимость при использовании recommended_method.
sender_activation_costdecimal | nullДополнительные расходы, если аккаунт отправителя требует активации, иначе null.

Пример реального ответа (сокращенный)

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
}

Ошибки

HTTPТело ответа (пример)Когда возникает
400{"code": -1, "msg": "Invalid sender address format: Txyz..."}Адрес не прошел проверку TRON base58 / длины / контрольной суммы.
400{"code": -1, "msg": "Expected at least 2 parameters: sender&receiver"}URL не содержит двух адресов, разделенных символом &.
400{"code": -1, "msg": "Sender and receiver cannot be the same address"}Адреса отправителя и получателя совпадают.
429{"message": "API rate limit exceeded"}Превышен лимит запросов (см. предупреждение в начале страницы).
500{"code": -1, "msg": "Internal server error"}Непредвиденная ошибка на стороне сервера.

Заголовки лимита запросов

В каждом ответе (включая 429) возвращаются следующие заголовки:

ЗаголовокЗначение
X-RateLimit-Limit-SecondМаксимально допустимое количество запросов в секунду (сейчас 1).
X-RateLimit-Remaining-SecondСколько запросов еще можно отправить в текущую секунду.
X-RateLimit-Limit-MinuteМаксимально допустимое количество запросов в минуту (сейчас 60).
X-RateLimit-Remaining-MinuteСколько запросов еще можно отправить в текущую минуту.
Retry-AfterПри ошибке 429 — количество секунд ожидания перед повторным запросом.

Заголовки для отладки

Каждый ответ также содержит идентификаторы, полезные при обращении в службу поддержки — пожалуйста, указывайте их без изменений, чтобы мы могли найти запрос в наших логах за считанные секунды:

ЗаголовокЗначение
X-Request-IDИдентификатор запроса на стороне приложения (сгенерирован калькулятором).
X-Process-TimeВремя обработки на стороне приложения в миллисекундах (вышестоящий сервис, без учета Kong).
X-Kong-Request-IdИдентификатор запроса на стороне Kong (присутствует в логах доступа Kong).

Таймауты и повторные попытки на стороне клиента

Калькулятор выполняет прямые ончейн-запросы к нодам TRON для каждого вызова, поэтому при высокой нагрузке или медленном ответе вышестоящих нод один запрос может занять несколько секунд. При слишком коротких таймаутах на стороне клиента будут возникать сбои даже при корректных ответах сервиса.

Рекомендуемые настройки:

  • Таймаут ≥ 15 секунд (надежнее 30 с). Стандартное значение 10 с, используемое во многих HTTP-клиентах, является слишком коротким.
  • При ошибке HTTP 429 ориентируйтесь на заголовок Retry-After (в секундах). Добавьте небольшой джиттер (например, 0–200 мс) перед повтором запроса, затем используйте экспоненциальную задержку, если лимит продолжает превышаться.
  • При ошибках HTTP 5xx или сбоях сети повторяйте запрос не более 2–3 раз с экспоненциальной задержкой; не создавайте избыточную нагрузку на эндпоинт.
  • Кэшируйте результат на стороне клиента на 30–60 секунд для каждой пары (sender, receiver) — базовые цены на ресурсы и состояние сети ончейн редко меняются настолько быстро, чтобы требовался более частый перерасчет.

Пример ответа 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"}

Примечания

  • Анонимный доступ: без заголовков X-API-KEY и Authorization, без белых списков IP.
  • Ответ всегда обернут в структуру {status, data, current_utc_time, processing_time_ms} — при интеграции цены следует считывать из data.costs, а требования к ресурсам — из data.requirements.
  • Ответ рассчитывается в реальном времени — он отражает актуальные цены на ресурсы TRON от Netts и текущее ончейн-состояние обоих адресов, поэтому возможны небольшие различия между последовательными вызовами.
  • Если вашему приложению необходимо обращаться к калькулятору чаще, чем несколько раз в минуту (на один IP / одну ноду Cloudflare edge), перейдите на эндпоинт POST /apiv2/usdt/analyze с использованием вашего API-ключа.