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
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| sender | string | Да | TRON-адрес отправителя |
| receiver | string | Да | TRON-адрес получателя |
Адреса передаются в пути запроса и разделяются амперсандом (&). Оба адреса должны быть корректными TRON-адресами в формате base58 (34 символа, начинаются с T, валидная контрольная сумма).
Примеры запросов
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())Ответ
Успешный ответ (200 OK)
Оболочка верхнего уровня:
{
"status": "success",
"data": { /* TransferAnalysis — см. ниже */ },
"current_utc_time": "2026-04-23 11:54:13",
"processing_time_ms": 19.27
}data (TransferAnalysis)
| Поле | Тип | Описание |
|---|---|---|
sender | AddressInfo | Полная информация об аккаунте отправителя (баланс, стейкинг, делегирование, активация). |
receiver | AddressInfo | Полная информация об аккаунте получателя. |
requirements | Requirements | Energy / Bandwidth, необходимые для перевода (базовые + с запасом безопасности). |
costs | Costs | Детализация затрат при сжигании и аренде, а также рекомендуемый метод. |
can_transfer | boolean | true, если перевод может быть выполнен при текущих ресурсах/ценах. |
issues | string[] | Проблемы, обнаруженные в ходе анализа (например, недостаточно Bandwidth). |
recommendations | string[] | Понятные пользователю рекомендации для клиента. |
variation_id | string | 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_needed | int | Базовое количество единиц Energy, необходимых для перевода. |
bandwidth_needed | int | Базовое количество требуемых единиц Bandwidth. |
energy_with_buffer | int | Energy, округленная до безопасного уровня аренды (например, 131 000). |
bandwidth_with_buffer | int | Bandwidth с небольшим запасом безопасности. |
receiver_has_usdt | boolean | Есть ли уже у получателя USDT (влияет на объем Energy). |
Costs
| Поле | Тип | Описание |
|---|---|---|
energy_burn_trx | decimal | TRX, сжигаемые при прямой оплате Energy путем сжигания. |
bandwidth_burn_trx | decimal | TRX, сжигаемые для покрытия Bandwidth, если он недоступен бесплатно. |
total_burn_trx | decimal | energy_burn_trx + bandwidth_burn_trx. |
total_burn_sun | int | total_burn_trx, выраженный в SUN (10⁻⁶ TRX). |
energy_rental_trx | decimal | Стоимость аренды необходимой Energy в Netts на указанный ниже период. |
energy_rental_sun | int | То же, что и выше, но в SUN. |
rental_time_period | string | Например, "1h", "5m" или "not_needed", если аренда не является лучшим вариантом. |
rental_price_per_unit | int | Стоимость аренды за единицу Energy в SUN для выбранного периода. |
savings_trx | decimal | Насколько дешевле вариант rent по сравнению с burn (может быть отрицательным, если сжигание выгоднее). |
savings_percentage | float | То же самое в процентах. |
recommended_method | string | "burn" или "rent" — более выгодный вариант для текущего запроса. |
total_cost_trx | decimal | null | Фактическая стоимость при использовании recommended_method. |
sender_activation_cost | decimal | null | Дополнительные расходы, если аккаунт отправителя требует активации, иначе null. |
Пример реального ответа (сокращенный)
{
"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/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-ключа.