Skip to content
This translation is behind the English original, updated 2026-09-15. Read the English version for the current text.

GET /apiv2/pricing

Универсальный эндпоинт тарифов, возвращающий цены на все сервисы в одном ответе с динамическими временными периодами.

Цена может измениться в процессе выполнения

Цена, возвращаемая этим эндпоинтом, может измениться во время обработки заказа. Поставщик Energy может отклонить запрос на делегирование, и в этом случае Netts автоматически перенаправит заказ следующему доступному поставщику. Netts стремится не только предлагать наиболее конкурентоспособную цену, но и гарантировать надежное предоставление Energy — поэтому заказ может быть выполнен по цене выше заявленной. Это применимо только к заказам объемом от 300 000 единиц Energy и выше.

Рекомендуется

Это рекомендуемый эндпоинт получения тарифов. Он заменяет устаревший эндпоинт /apiv2/prices, поддержка которого будет прекращена.

URL эндпоинта

GET https://netts.io/apiv2/pricing

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

ЗаголовокОбязательныйОписаниеЗначения
X-API-KEYДаВаш API-ключstring
X-Real-IPДаIP-адрес из белого спискаIP address
X-FormatНетФормат ответа (по умолчанию: полный JSON)now, compact, short, short1h, count

Параметры запроса

ПараметрТипПо умолчаниюОписание
servicesstringallФильтр включаемых сервисов через запятую

Доступные сервисы

СервисОписание
energy_1hЦены на делегирование Energy на 1 час
energy_5mЦены на делегирование Energy на 5 минут
hostТарифы на делегирование Energy в Host Mode
amlЦены на AML-проверку адресов
bandwidthЦены на аренду Bandwidth — opt-in: возвращаются только при явном запросе через ?services=bandwidth (не входят в ответ по умолчанию)

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

cURL — Полный ответ

bash
curl -X GET https://netts.io/apiv2/pricing \
  -H "X-API-KEY: your_api_key" \
  -H "X-Real-IP: your_whitelisted_ip"

cURL — Фильтрация по сервисам

bash
# Только цены energy 1h
curl -X GET "https://netts.io/apiv2/pricing?services=energy_1h" \
  -H "X-API-KEY: your_api_key" \
  -H "X-Real-IP: your_whitelisted_ip"

# Energy 1h + AML
curl -X GET "https://netts.io/apiv2/pricing?services=energy_1h,aml" \
  -H "X-API-KEY: your_api_key" \
  -H "X-Real-IP: your_whitelisted_ip"

# Только тарифы host
curl -X GET "https://netts.io/apiv2/pricing?services=host" \
  -H "X-API-KEY: your_api_key" \
  -H "X-Real-IP: your_whitelisted_ip"

# Цены на аренду Bandwidth (opt-in — необходимо запрашивать явно)
curl -X GET "https://netts.io/apiv2/pricing?services=bandwidth" \
  -H "X-API-KEY: your_api_key" \
  -H "X-Real-IP: your_whitelisted_ip"

Python

python
import requests

url = "https://netts.io/apiv2/pricing"
headers = {
    "X-API-KEY": "your_api_key",
    "X-Real-IP": "your_whitelisted_ip"
}

response = requests.get(url, headers=headers)
data = response.json()

if data.get("success"):
    print(f"API version: {data['version']}")
    print(f"TRX/USD rate: {data['data']['trx_rate_usd']}")

    services = data["data"]["services"]

    for svc_name, svc_data in services.items():
        pricing_type = svc_data.get("pricing_type")
        print(f"\n--- {svc_name} ({pricing_type}) ---")

        if pricing_type == "periodic":
            for period in svc_data["periods"]:
                marker = " <-- current" if period["is_current"] else ""
                print(f"  {period['label']}: {period['price']} {svc_data['unit']}{marker}")

        elif pricing_type == "flat_rates":
            for rate, price in svc_data["rates"].items():
                print(f"  {rate}: {price} {svc_data['unit']}")

        elif pricing_type == "provider_based":
            for name, info in svc_data["providers"].items():
                status = "available" if info["available"] else "unavailable"
                print(f"  {name}: {info['price']} {svc_data['unit']} - {status}")

Python — Фильтрация сервисов

python
params = {"services": "energy_1h,aml"}
response = requests.get(url, headers=headers, params=params)

Структура ответа

Поля верхнего уровня

ПолеТипОписание
successbooleantrue для успешных запросов
versionstringВерсия API (например, "2.1")
timestampstringВремя сервера в формате ISO 8601 UTC
dataobjectПолезная нагрузка ответа

Поля объекта Data

ПолеТипОписание
data.trx_rate_usdnumberТекущий курс обмена TRX/USD
data.units_metaobjectМашиночитаемая информация для конвертации единиц
data.servicesobjectКарта запрошенных сервисов с данными о тарифах

Метаданные единиц (Units Meta)

Позволяет клиентам программно конвертировать значения между единицами:

json
{
    "units_meta": {
        "sun": {"base": "trx", "multiplier": 1000000},
        "trx": {"base": "trx", "multiplier": 1},
        "usdt": {"base": "usdt", "multiplier": 1}
    }
}

Для перевода из SUN в TRX: trx_price = sun_price / units_meta.sun.multiplier

Общие поля сервисов

Каждый сервис содержит следующие поля:

ПолеТипОписание
unitstringЕдиница измерения цены (sun, trx, usdt)
pricing_typestringСпособ парсинга данного сервиса (см. ниже)
descriptionstringЧеловекочитаемое описание
cache_ttlintegerЧастота обновления этих данных (в секундах)

Типы тарификации

Поле pricing_type сообщает клиентам, как парсить каждый сервис:

ТипСтруктураГде используется
periodicМассив periods[] с ценами, привязанными ко времениenergy_1h, energy_5m
flat_ratesОбъект rates{} с именованными ключами тарифовhost
provider_basedОбъект providers{} с данными поставщиковaml
tiered_by_amount_and_periodМассив tiers[] по диапазону объема, каждый с periods[]bandwidth

Сервис: energy_1h / energy_5m

pricing_type: periodic

ПолеТипОписание
current_periodstringИдентификатор (slug) текущего активного периода
periods[]arrayВсе тарифные периоды (динамические, загружаются из БД)
periods[].idstringУникальный идентификатор периода (slug)
periods[].labelstringЧеловекочитаемое название периода
periods[].startstringВремя начала периода (ЧЧ:ММ UTC)
periods[].endstringВремя окончания периода (ЧЧ:ММ UTC)
periods[].is_currentbooleanАктивен ли данный период в текущий момент
periods[].priceintegerЦена за единицу Energy в SUN
periods[].tiersarray|nullТарифные уровни в зависимости от объема (см. Уровни)

Динамические периоды

Количество периодов, их временные диапазоны, метки и цены являются динамическими и управляются на стороне сервера. Не хардкодьте идентификаторы периодов или их количество. Всегда выполняйте итерацию по массиву periods.


Сервис: host

pricing_type: flat_rates

ПолеТипОписание
rates.standard_65knumberСтандартный тариф для 65k Energy (TRX)
rates.standard_131k_initialnumberСтандартный тариф для 131k Energy, начальная активация (TRX)
rates.frequent_65knumberЧастый тариф для 65k Energy (TRX)
rates.frequent_131knumberЧастый тариф для 131k Energy (TRX)

Сервис: aml

pricing_type: provider_based

ПолеТипОписание
providersobjectКарта AML-провайдеров (динамическая, может меняться)
providers[name].pricenumberЦена проверки в USDT
providers[name].price_trxnumberЦена проверки, конвертированная в TRX по текущему курсу
providers[name].availablebooleanЕсть ли у провайдера доступная квота

Динамические провайдеры

AML-провайдеры загружаются из базы данных. Могут появляться новые провайдеры, а существующие могут становиться недоступными. Всегда перебирайте объект providers.


Сервис: bandwidth

pricing_type: tiered_by_amount_and_period

Opt-in и доступ

Цены на Bandwidth возвращаются только при явном запросе через ?services=bandwidth — они не входят в ответ по умолчанию. Сам эндпоинт аренды Bandwidth доступен по запросу; обратитесь в службу поддержки для получения доступа. См. Аренда Bandwidth.

Цена аренды Bandwidth зависит от объема заказа (уровня единиц), периода аренды (например, 5m / 1h), временного окна суток (UTC) и дня недели. Базовые цены указаны в SUN за единицу; сверх базовой стоимости могут применяться фиксированные надбавки (в TRX) — все значения возвращаются в ответе.

Ответ предоставляет как удобное представление (tiers — цены для текущего окна/дня), так и полную сетку (windows + schedule — каждое окно для каждого дня недели).

Адаптивный формат — не зашивайте значения в код

Тарифная сетка полностью основана на данных и может измениться в любой момент: количество временных окон, их метки, время их начала/окончания, набор периодов аренды (новые периоды могут добавляться или удаляться), уровни объема, разбивка по дням недели и сами цены. Клиенты должны итерировать возвращаемые массивы (windows, schedule, tiers, periods) и сопоставлять по значению — никогда не полагайтесь на фиксированное количество, фиксированные метки, фиксированное время или фиксированные идентификаторы периодов. Код, написанный таким образом, продолжит работать при изменении расписания.

ПолеТипОписание
unitstringsun_per_unit
windowstringМетка текущего временного окна суток (UTC)
current_day_of_weekintegerТекущий день недели, ISO 1=Пн … 7=Вс (UTC)
tiers[]arrayУровни объемов для текущего окна/дня (для удобства; та же структура, что и внутри schedule)
windows[]arrayСправочник всех временных окон суток (может расширяться/сокращаться/смещаться)
windows[].labelstringМетка окна
windows[].start / .endstringНачало/конец окна HH:MM UTC (окно может переходить через полночь, т.е. start > end)
schedule[]arrayПолная сетка — по одной записи для каждого (день недели × окно)
schedule[].day_of_weekintegerДень недели по ISO 17
schedule[].windowstringМетка окна (соответствует windows[].label)
schedule[].period_start / .period_endstringHH:MM UTC
schedule[].is_currentbooleantrue для сегмента, активного прямо сейчас
schedule[].tiers[]arrayУровни объемов для этого сегмента
tiers[].amount_minintegerНижняя граница уровня (включительно)
tiers[].amount_maxinteger|nullВерхняя граница уровня (исключительно). null = без ограничений
tiers[].periods[]arrayЦены за период аренды внутри уровня
tiers[].periods[].idstringИдентификатор периода аренды (например, 5m, 1h) — может меняться/дополняться
tiers[].periods[].rental_secondsintegerДлительность периода в секундах
tiers[].periods[].priceintegerЦена за единицу Bandwidth в SUN
surchargesobjectФиксированные доплаты к цене для клиента (TRX) — см. ниже
limitsobjectЛимиты заказа: min_units, max_units

Надбавки

ПолеТипОписание
surcharges.small_order_threshold_unitsintegerК заказам со значением amount ниже этого применяется надбавка за мелкий заказ
surcharges.small_order_surcharge_trxnumberДобавляется (TRX) для мелких заказов делегирования — компенсация за делегирование + отзыв в блокчейне
surcharges.trx_send_surcharge_trxnumberДобавляется (TRX), когда заказ выполняется отправкой TRX — компенсация за перевод TRX

Пример ответа

json
{
    "bandwidth": {
        "unit": "sun_per_unit",
        "pricing_type": "tiered_by_amount_and_period",
        "description": "Bandwidth delegation rental",
        "cache_ttl": 30,

        "window": "<current window label>",
        "current_day_of_week": 7,
        "tiers": [
            {
                "amount_min": 400,
                "amount_max": 1000,
                "periods": [
                    {"id": "5m", "rental_seconds": 300,  "price": "<price_sun>"},
                    {"id": "1h", "rental_seconds": 3600, "price": "<price_sun>"}
                ]
            },
            {"amount_min": 1000, "amount_max": 3000, "periods": ["..."]},
            {"amount_min": 3000, "amount_max": null,  "periods": ["..."]}
        ],

        "windows": [
            {"label": "<window label>", "start": "01:00", "end": "09:00"},
            {"label": "<window label>", "start": "14:00", "end": "00:00"}
        ],
        "schedule": [
            {
                "day_of_week": 1,
                "window": "<window label>",
                "period_start": "01:00",
                "period_end": "09:00",
                "is_current": false,
                "tiers": [
                    {"amount_min": 400, "amount_max": 1000, "periods": [
                        {"id": "5m", "rental_seconds": 300, "price": "<price_sun>"},
                        {"id": "1h", "rental_seconds": 3600, "price": "<price_sun>"}
                    ]}
                ]
            }
        ],

        "surcharges": {
            "small_order_threshold_units": 1000,
            "small_order_surcharge_trx": "<trx>",
            "trx_send_surcharge_trx": "<trx>"
        },
        "limits": {"min_units": 400, "max_units": 5000}
    }
}

schedule содержит по одной записи для каждой комбинации (день недели × окно) — обходите его в цикле для построения полного календаря тарифов. Ровно одна запись имеет is_current: true.

Клиентская логика (расчет цены заказа)

Используйте tiers для «цены в текущий момент». Чтобы узнать цену для другого времени, выберите подходящую запись schedule по дню недели + окну, чей интервал [period_start, period_end) содержит нужное время (учитывайте, что окно может переходить через полночь, когда start > end), затем используйте его tiers.

# цена на текущий момент:
for tier in bandwidth.tiers:
    if tier.amount_min <= amount < (tier.amount_max or infinity):
        for p in tier.periods:
            if p.id == requested_period:        # сопоставлять по значению, а не по индексу
                base_trx = (p.price / units_meta.sun.multiplier) * amount
if amount < surcharges.small_order_threshold_units:
    base_trx += surcharges.small_order_surcharge_trx      # заказы на делегирование
# ветка выполнения через отправку TRX:
#   trx_branch_trx = base_trx_for_smallest_tier_shortest_period + surcharges.trx_send_surcharge_trx

# цена для произвольного дня недели/времени: та же логика, но сначала выберите запись schedule[],
# где day_of_week совпадает и время попадает в диапазон [period_start, period_end).

Централизованно и динамично

Цены Bandwidth, окна, распределение по дням недели и надбавки управляются на стороне сервера (БД) и могут изменяться. Всегда перебирайте в цикле windows, schedule, tiers и periods из ответа и сопоставляйте по значению — не хардкодьте количества, метки, время или идентификаторы периодов. Наценки SUB-пользователей не применяются к Bandwidth.


Уровни

В настоящее время tiers имеет значение null для всех периодов. Когда тарификация по объемам будет включена, поле будет содержать массив объектов уровней:

json
{
    "tiers": [
        {
            "min_energy": 0,
            "max_energy": 64999,
            "price": "<price_sun>",
            "label": "standard"
        },
        {
            "min_energy": 65000,
            "max_energy": 130999,
            "price": "<price_sun>",
            "label": "65k"
        },
        {
            "min_energy": 131000,
            "max_energy": 131000,
            "price": "<price_sun>",
            "label": "131k"
        },
        {
            "min_energy": 131001,
            "max_energy": null,
            "price": "<price_sun>",
            "label": "bulk"
        }
    ]
}

Схема уровней

ПолеТипОписание
min_energyintegerМинимальное количество Energy для этого уровня (включительно)
max_energyinteger|nullМаксимальное количество Energy для этого уровня (включительно). null = без ограничений
priceintegerЦена за единицу Energy в SUN для этого уровня
labelstringИдентификатор уровня

Клиентская логика

if tiers != null:
    найти уровень, где min_energy <= order_amount <= max_energy
    использовать цену этого уровня
else:
    использовать фиксированное поле price для любых объемов заказа

Компактные форматы ответа

Используйте заголовок X-Format, чтобы получать компактные текстовые ответы. Они возвращают цену из energy_1h для текущего активного периода.

X-Format: now / compact / short

bash
curl -H "X-API-KEY: your_key" -H "X-Format: now" https://netts.io/apiv2/pricing
text
<Period>: price=<N> sun, 65k=<X.XXX> TRX (<X.XX>$), 131k=<X.XXX> TRX (<X.XX>$), 1m=<X.XXX> TRX (<X.XX>$)

X-Format: short1h

То же самое, но без названия периода и цены за единицу.

bash
curl -H "X-API-KEY: your_key" -H "X-Format: short1h" https://netts.io/apiv2/pricing
text
65k=<X.XXX> TRX (<X.XX>$), 131k=<X.XXX> TRX (<X.XX>$), 1m=<X.XXX> TRX (<X.XX>$)

X-Format: count

Цены для оптовых заказов на 1, 2, 3, 5, 10, 20 заказов.

bash
curl -H "X-API-KEY: your_key" -H "X-Format: count" https://netts.io/apiv2/pricing
text
1-<X.XXX> TRX (<X.XX>$), 2-<X.XXX> TRX (<X.XX>$), ...

Формула расчета

TRX cost = (price_sun / units_meta.sun.multiplier) x energy_amount
USD cost = TRX_cost x trx_rate_usd

Наценка SUB-пользователей

SUB-пользователи автоматически получают цены с учетом наценки их родительского аккаунта. API всегда возвращает окончательную цену для аутентифицированного пользователя — расчет на стороне клиента не требуется.

Ответы с ошибками

Ошибки могут возникать на двух уровнях с различными форматами. Ваш клиент должен обрабатывать оба варианта.

Ошибки приложения (от API)

Ошибки на уровне приложения используют стандартный формат success/error:

Некорректный сервис (400)

json
{
    "success": false,
    "error": {
        "code": 4002,
        "message": "Unknown services: invalid_service"
    }
}

Ошибка аутентификации (401)

Возвращается приложением, если API-ключ отсутствует или IP не внесен в белый список:

json
{
    "detail": {
        "code": -1,
        "msg": "Invalid API key or IP not in whitelist"
    }
}

Другой формат

Ошибки аутентификации используют нативный формат FastAPI detail, а не структуру success/error. Это связано с тем, что ошибка возникает до того, как запрос достигает логики приложения.

Пользователь не найден (404)

json
{
    "detail": {
        "code": -1,
        "msg": "User not found"
    }
}

Внутренняя ошибка сервера (500)

json
{
    "success": false,
    "error": {
        "code": 5001,
        "message": "Failed to retrieve pricing data"
    }
}

Ошибки шлюза (от Kong)

Эти ошибки возвращаются API-шлюзом до того, как запрос достигнет приложения. Они используют собственный формат Kong:

Превышен лимит запросов (429)

json
{
    "message": "API rate limit exceeded"
}

Таймаут шлюза (504)

json
{
    "message": "An invalid response was received from the upstream server"
}

Справочник кодов ошибок

КодОписаниеHTTP-статусИсточник
-1API-ключ не предоставлен401App
-1Недействительный API-ключ или IP не в белом списке401App
-1Пользователь не найден404App
4002Неизвестный сервис в параметре ?services=400App
5000Внутренняя ошибка сервера500App
5001Не удалось получить данные о тарифах500App
5002Данные о ценах недоступны для компактного формата500App
-Превышен лимит запросов API429Kong

Рекомендуемая обработка ошибок на клиенте

python
response = requests.get(url, headers=headers)
data = response.json()

if response.status_code == 200 and data.get("success"):
    # Успех — обрабатываем данные
    services = data["data"]["services"]
elif response.status_code == 429:
    # Ограничение частоты запросов Kong — пауза и повтор
    retry_after = response.headers.get("Retry-After", "60")
    time.sleep(int(retry_after))
elif "detail" in data:
    # Ошибка аутентификации/валидации FastAPI
    detail = data["detail"]
    if isinstance(detail, dict):
        print(f"Error {detail.get('code')}: {detail.get('msg')}")
    else:
        print(f"Error: {detail}")
elif "error" in data:
    # Ошибка приложения
    err = data["error"]
    print(f"Error {err.get('code')}: {err.get('message')}")
else:
    print(f"Unexpected response: {response.status_code}")

Миграция с /apiv2/prices

Аспект/apiv2/prices (старый)/apiv2/pricing (новый)
Периоды5 фиксированныхДинамические из БД
Тарифные уровни3 захардкоженныхЕдиная цена + будущие tiers
Варианты длительностиНедоступныenergy_5m
Цены AMLОтдельный эндпоинтВключены через ?services=aml
Цены HostСмешаны в общем ответеОтдельный сервис host
Фильтрация сервисовНедоступнаПараметр ?services=
Конвертация единицНе документированаunits_meta в ответе
Информация о кешеНе документированаcache_ttl для каждого сервиса
Формат ответа{"status": "success", ...}{"success": true, "version": "2.1", "data": {...}}

Ограничения частоты запросов

Применяются те же лимиты частоты запросов, что и для /apiv2/prices (настроены в шлюзе Kong).

Примечания

  • Все цены на Energy указаны в SUN — используйте units_meta для конвертации
  • Цены на Host указаны в TRX
  • Цены на AML указаны в USDT с включенной конвертацией в TRX
  • Все значения времени указаны в UTC
  • Используйте cache_ttl для каждого сервиса, чтобы знать частоту обновления данных
  • Используйте pricing_type, чтобы определить, как парсить каждый сервис
  • Периоды, провайдеры, ставки и все значения динамические — не хардкодьте их
  • Тарифы на Bandwidth являются opt-in (?services=bandwidth), используют тип tiered_by_amount_and_period с surcharges, и к ним не применяется наценка SUB-пользователей