Перейти к содержимому

API для разработчиков / Документация

SunLend Energy API

Версия 1 · REST · JSON

Покупка энергии и bandwidth сети TRON с баланса аккаунта: заказы, активация адресов, автоматизации и вебхуки. Примеры на cURL, JavaScript и Python.

Введение

SunLend Energy API — покупка энергии и bandwidth сети TRON с баланса вашего аккаунта. Ресурс делегируется на указанный адрес на 15 минут, 1 час или 1 сутки, оплата списывается с баланса.

  • Формат — JSON в UTF-8, ответы не кэшируются.
  • Деньги везде в sun: 1 TRX = 1 000 000 sun, все суммы — целые числа.
  • Успешный ответ лежит в поле data, ошибка — в поле error.
  • Машиночитаемое описание API — OpenAPI 3.1: по нему клиент генерируется автоматически на любом языке.
Базовый адрес
https://sunlend.io/api/v1/energy
Ответ200
{
  "data": {
    "balanceSun": 25000000,
    "depositAddress": {
      "network": "TRC20",
      "address": "TXyz…"
    }
  }
}

Авторизация

  • Зарегистрируйтесь и пополните баланс в личном кабинете (раздел «Кошелёк»).
  • В кабинете откройте раздел «API» и выпустите ключ. Полный ключ показывается один раз — сохраните его. Действующих ключей может быть до 5.
  • Передавайте ключ в заголовке Authorization: Bearer slk_… в каждом запросе.
Ключ даёт право тратить баланс. Храните его только на сервере — не в браузере и не в мобильном приложении.

Лимит — 60 запросов в минуту на ключ, сверх него — 429 rate_limited.

Уровни доступа вложены друг в друга:

УровеньЧто можно
readбаланс, цены, заказы, правила, вебхуки — только чтение
purchaseплюс покупка (POST /orders) и активация (POST /activations)
fullплюс автоматизации и вебхуки: создание, пауза, удаление

Ключу можно задать дневной лимит трат в TRX (сутки по UTC): покупка сверх лимита получит 403 daily_limit, баланс не тронут. Уровень и лимит меняются в кабинете без перевыпуска ключа.

Запрос с ключом
curl 'https://sunlend.io/api/v1/energy/account' \
  -H "Authorization: Bearer $SUNLEND_KEY"

Цены

Цена энергии плавающая: она меняется в течение суток вместе с ценой поставщика. К каждому заказу энергии любого объёма добавляется фиксированная наценка 0,4 TRX.

Итог заказа энергии: volume × sunPerUnit + feeSun. Bandwidth: volume / 1000 × trxPer1k. Узнать точную цену до покупки — GET /quote; списывается цена на момент заказа.

Перевод USDT TRC-20Нужно энергии
получателю, у которого уже есть USDT~65 000
получателю без USDT~131 000

Энергия, не израсходованная за срок аренды, не возвращается. Энергия не работает на адресах бирж.

Цена 65 000 энергии на час
curl 'https://sunlend.io/api/v1/energy/quote?volume=65000&term=1h' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "resource": "energy",
    "volume": 65000,
    "term": "1h",
    "priceSun": 2090000,
    "sunPerUnit": 26,
    "feeSun": 400000,
    "trxPer1k": null,
    "balanceSun": 25000000
  }
}

Идемпотентность

Передавайте в POST /orders заголовок Idempotency-Key — уникальный id заказа на вашей стороне, например id выплаты. 1–100 символов: латиница, цифры и _ . : -.

Повтор запроса с тем же ключом не создаёт второй заказ и ничего не списывает — возвращается уже созданный заказ (ответ 200 вместо 201). Не дождались ответа из-за обрыва связи — просто повторите тот же запрос.

Ключ привязан к заказу навсегда: повтор вернёт и неудачный заказ (failed). Новую попытку после отказа отправляйте с новым ключом.
Заказ с ключом идемпотентности
curl -X POST 'https://sunlend.io/api/v1/energy/orders' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: payout-000123' \
  -d '{"address":"TXyz…","volume":65000,"term":"1h"}'

Баланс и адрес пополнения

GET/accountДоступ ключа: read

Баланс аккаунта и постоянный адрес пополнения в сети TRON. На адрес принимаются USDT TRC-20 и TRX; USDT пересчитывается в TRX по курсу в момент зачисления.

Отправляйте только USDT TRC-20 и TRX и только в сети TRON. Если процессинг временно недоступен, depositAddress равен null.
Ответы
200

Баланс и адрес

GET /account
curl 'https://sunlend.io/api/v1/energy/account' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "balanceSun": 25000000,
    "depositAddress": {
      "network": "TRC20",
      "address": "TXyz…"
    }
  }
}

Цена заказа

GET/quoteДоступ ключа: read

Цена заказа по текущему прайсу — до покупки. Для энергии priceSun = volume × sunPerUnit + feeSun.

Параметры запроса
resource"energy" | "bandwidth"

По умолчанию energy

volumeintegerобязательный

Объём: энергия от 65 000 до 5 000 000, bandwidth от 1 000 до 300 000

term"15m" | "1h" | "1d"обязательный

Срок аренды

Ответы
200

Цена

422

invalid_volume, invalid_term, invalid_resource

GET /quote
curl 'https://sunlend.io/api/v1/energy/quote?volume=65000&term=1h' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "resource": "energy",
    "volume": 65000,
    "term": "1h",
    "priceSun": 2090000,
    "sunPerUnit": 26,
    "feeSun": 400000,
    "trxPer1k": null,
    "balanceSun": 25000000
  }
}

Купить энергию или bandwidth

POST/ordersДоступ ключа: purchase

Списывает цену с баланса и делегирует ресурс на адрес. Обычно заказ выполняется за секунды и сразу возвращается со статусом filled и txId транзакции в сети TRON.

Дольше суток — через автопродление: POST /automations с kind: "renewal".

Заголовки
Idempotency-Keystring

Рекомендуется. Повтор с тем же ключом вернёт тот же заказ без второго списания — см. Идемпотентность

Тело запроса
addressstringобязательный

Адрес TRON получателя ресурса (T…, 34 символа)

volumeintegerобязательный

Объём: энергия от 65 000 до 5 000 000, bandwidth от 1 000 до 300 000

term"15m" | "1h" | "1d"обязательный

Срок аренды

resource"energy" | "bandwidth"

По умолчанию energy

Ответы
201

Заказ создан

200

Повтор с тем же Idempotency-Key — возвращён существующий заказ

402

insufficient_funds

409

idempotency_conflict

422

Ошибка в полях

502

provider_failed — деньги вернулись на баланс

504

provider_unknown — заказ pending, не создавайте новый

POST /orders
curl -X POST 'https://sunlend.io/api/v1/energy/orders' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: payout-000123' \
  -d '{"address":"TXyz…","volume":65000,"term":"1h"}'
Ответ201
{
  "data": {
    "order": {
      "id": 1042,
      "apiKeyId": 3,
      "resource": "energy",
      "address": "TXyz…",
      "volume": 65000,
      "term": "1h",
      "priceSun": 2090000,
      "status": "filled",
      "txId": "a1b2c3…",
      "createdAt": "2026-10-25T12:00:00.000Z"
    },
    "balanceSun": 22910000
  }
}

Статусы заказа

statusЗначение
filledРесурс делегирован, txId — транзакция в сети TRON
pendingПоставщик не подтвердил заказ вовремя. Заказ проверяется автоматически в течение 30 минут и станет filled или failed с возвратом денег
failedЗаказ не выполнен, деньги вернулись на баланс
Заказ в pending не повторяйте новым заказом. Опрашивайте GET /orders/{id} раз в 30–60 секунд или подпишитесь на вебхуки order.filled и order.failed.

Список заказов

GET/ordersДоступ ключа: read

Заказы аккаунта, новые сверху, с постраничным выводом.

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

От 1 до 100, по умолчанию 20

offsetinteger

Сколько заказов пропустить, по умолчанию 0

Ответы
200

Заказы и пагинация

400

invalid_query

GET /orders
curl 'https://sunlend.io/api/v1/energy/orders?limit=20&offset=0' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": [
    {
      "id": 1042,
      "apiKeyId": 3,
      "resource": "energy",
      "address": "TXyz…",
      "volume": 65000,
      "term": "1h",
      "priceSun": 2090000,
      "status": "filled",
      "txId": "a1b2c3…",
      "createdAt": "2026-10-25T12:00:00.000Z"
    }
  ],
  "pagination": {
    "total": 57,
    "limit": 20,
    "offset": 0
  }
}

Один заказ

GET/orders/{id}Доступ ключа: read

Заказ по ID — так удобно дождаться выполнения заказа в pending.

Параметры пути
idintegerобязательный

ID заказа

Ответы
200

Заказ

404

not_found

GET /orders/{id}
curl 'https://sunlend.io/api/v1/energy/orders/1042' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "id": 1042,
    "apiKeyId": 3,
    "resource": "energy",
    "address": "TXyz…",
    "volume": 65000,
    "term": "1h",
    "priceSun": 2090000,
    "status": "filled",
    "txId": "a1b2c3…",
    "createdAt": "2026-10-25T12:00:00.000Z"
  }
}

Цена активации

GET/activationsДоступ ключа: read

Новый адрес TRON (на который ещё ничего не приходило) нужно активировать, прежде чем делегировать на него ресурс. Метод возвращает цену активации.

Ответы
200

Цена и баланс

GET /activations
curl 'https://sunlend.io/api/v1/energy/activations' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "priceSun": 1500000,
    "balanceSun": 25000000
  }
}

Активировать адрес

POST/activationsДоступ ключа: purchase

Активирует новый адрес и списывает цену активации. Уже активный адрес вернёт 409 already_active — деньги не списываются.

status: done — адрес активирован; pending — ответ задержался, проверка идёт автоматически; failed — не прошла, деньги вернулись.

Тело запроса
addressstringобязательный

Адрес TRON для активации

Ответы
201

Активация оформлена

402

insufficient_funds

409

already_active, already_requested

POST /activations
curl -X POST 'https://sunlend.io/api/v1/energy/activations' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"address":"TNew…"}'
Ответ201
{
  "data": {
    "activation": {
      "id": 7,
      "address": "TNew…",
      "priceSun": 1500000,
      "status": "done",
      "createdAt": "2026-10-25T12:00:00.000Z"
    },
    "balanceSun": 23500000
  }
}

Как работают автоматизации

Правило следит за адресом и само доставляет энергию. Каждая доставка списывается с баланса по текущей цене — один раз на доставку, с той же наценкой на заказ.

kindЧто делает
refillДокупает volume, когда энергии на адресе меньше minimal
renewalПродлевает volume энергии раз в сутки
smartTron Charger: адрес заправлен перед каждым переводом

Когда денег не хватает на следующую доставку, правило ставится на паузу (status: "paused", pauseReason: "system") и само возобновляется после пополнения. Пауза вручную (pauseReason: "user") сама не снимается.

Список правил

GET/automationsДоступ ключа: read

Все правила аккаунта с ценой одной доставки по текущему прайсу (firePriceSun).

Ответы
200

Правила

GET /automations
curl 'https://sunlend.io/api/v1/energy/automations' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": [
    {
      "id": 12,
      "kind": "refill",
      "address": "TXyz…",
      "volume": 65000,
      "minimal": 20000,
      "duration": "1h",
      "status": "active",
      "pauseReason": null,
      "autoResume": true,
      "lastFireAt": null,
      "createdAt": "2026-10-25T12:00:00.000Z",
      "firePriceSun": 2090000
    }
  ]
}

Создать правило

POST/automationsДоступ ключа: full

На балансе должно хватать хотя бы на одну доставку, иначе 402. У адреса может быть одно правило каждого типа.

Тело запроса
kind"refill" | "renewal" | "smart"обязательный

Тип правила

addressstringобязательный

Адрес TRON

volumeinteger

Объём одной доставки, от 65 000 до 5 000 000. Для smart не нужен

minimalinteger

Только refill: порог, от 1 000 и меньше volume

duration"1h" | "1d"

Только refill: срок каждой доставки

autoResumeboolean

Возобновлять после пополнения, по умолчанию true

Ответы
201

Правило создано

402

insufficient_funds

409

already_exists

422

Ошибка в полях

POST /automations
curl -X POST 'https://sunlend.io/api/v1/energy/automations' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"kind":"refill","address":"TXyz…","volume":65000,"minimal":20000,"duration":"1h"}'
Ответ201
{
  "data": {
    "id": 12,
    "kind": "refill",
    "address": "TXyz…",
    "volume": 65000,
    "minimal": 20000,
    "duration": "1h",
    "status": "active",
    "pauseReason": null,
    "autoResume": true,
    "lastFireAt": null,
    "createdAt": "2026-10-25T12:00:00.000Z",
    "firePriceSun": 2090000
  }
}

Одно правило

GET/automations/{id}Доступ ключа: read

Правило по ID.

Параметры пути
idintegerобязательный

ID правила

Ответы
200

Правило

404

not_found

GET /automations/{id}
curl 'https://sunlend.io/api/v1/energy/automations/12' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "id": 12,
    "kind": "refill",
    "address": "TXyz…",
    "volume": 65000,
    "minimal": 20000,
    "duration": "1h",
    "status": "active",
    "pauseReason": null,
    "autoResume": true,
    "lastFireAt": null,
    "createdAt": "2026-10-25T12:00:00.000Z",
    "firePriceSun": 2090000
  }
}

Пауза и возобновление

PATCH/automations/{id}Доступ ключа: full

Поставить правило на паузу, возобновить или изменить autoResume. Для возобновления на балансе должно хватать на одну доставку.

Параметры пути
idintegerобязательный

ID правила

Тело запроса
action"pause" | "resume"

Пауза или возобновление

autoResumeboolean

Возобновлять ли после пополнения

Ответы
200

Правило

402

insufficient_funds при возобновлении

404

not_found

PATCH /automations/{id}
curl -X PATCH 'https://sunlend.io/api/v1/energy/automations/12' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"action":"pause"}'
Ответ200
{
  "data": {
    "id": 12,
    "kind": "refill",
    "address": "TXyz…",
    "volume": 65000,
    "minimal": 20000,
    "duration": "1h",
    "status": "paused",
    "pauseReason": "user",
    "autoResume": true,
    "lastFireAt": null,
    "createdAt": "2026-10-25T12:00:00.000Z",
    "firePriceSun": 2090000
  }
}

Удалить правило

DELETE/automations/{id}Доступ ключа: full

Удаляет правило — энергия на адрес больше не приходит.

Параметры пути
idintegerобязательный

ID правила

Ответы
204

Удалено

404

not_found

DELETE /automations/{id}
curl -X DELETE 'https://sunlend.io/api/v1/energy/automations/12' \
  -H "Authorization: Bearer $SUNLEND_KEY"

События и подпись

Мы отправляем POST с JSON на ваш https-адрес, когда происходит событие:

СобытиеКогда
order.filledЗаказ выполнен
order.failedЗаказ не выполнен, деньги вернулись
deposit.creditedПополнение зачислено
automation.firedПравило доставило энергию
automation.pausedПравило на паузе
automation.resumedПравило возобновлено
activation.doneАдрес активирован
pingТестовое событие — приходит только по запросу POST /webhooks/{id}/ping, подписываться на него не нужно

Заголовки запроса: X-SunLend-Event, X-SunLend-Event-Id, X-SunLend-Timestamp (unix-секунды) и X-SunLend-Signature: sha256=<hex> — HMAC-SHA256 от строки "{timestamp}.{тело}" с секретом вебхука. Проверяйте подпись и отклоняйте запросы старше 5 минут.

Ответ 2xx — доставлено. Иначе повторяем через 1 мин, 5 мин, 30 мин, 2 ч, 6 ч и 24 ч; после 20 проваленных доставок подряд вебхук выключается. Одно событие может прийти дважды — отсекайте дубли по id. До 5 вебхуков на аккаунт.

Проверка подписи
import crypto from 'node:crypto';
import express from 'express';

const app = express();

// Подпись считается от сырого тела — не парсите JSON до проверки
app.post('/sunlend', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-SunLend-Timestamp');
  const sig = (req.get('X-SunLend-Signature') || '').replace('sha256=', '');
  const expected = crypto
    .createHmac('sha256', process.env.SUNLEND_WEBHOOK_SECRET)
    .update(`${ts}.${req.body}`)
    .digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  if (!fresh || sig.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
    return res.sendStatus(400);
  }
  const event = JSON.parse(req.body);
  // Событие может прийти повторно — обрабатывайте event.id один раз
  res.sendStatus(200);
});
Тело события
{
  "id": "evt_…",
  "type": "order.filled",
  "createdAt": "2026-10-25T12:00:00.000Z",
  "data": {
    "orderId": 1042,
    "resource": "energy",
    "address": "TXyz…",
    "volume": 65000,
    "term": "1h",
    "priceSun": 2090000,
    "txId": "a1b2c3…",
    "apiKeyId": 3
  }
}

Список вебхуков

GET/webhooksДоступ ключа: read

Вебхуки аккаунта со статистикой доставок.

Ответы
200

Вебхуки

GET /webhooks
curl 'https://sunlend.io/api/v1/energy/webhooks' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": [
    {
      "id": 3,
      "url": "https://example.com/sunlend",
      "events": [
        "order.filled",
        "order.failed"
      ],
      "isActive": true,
      "failures": 0,
      "lastSuccessAt": null,
      "lastFailureAt": null,
      "createdAt": "2026-10-25T12:00:00.000Z"
    }
  ]
}

Создать вебхук

POST/webhooksДоступ ключа: full

В ответе — secret для проверки подписи. Он показывается один раз; новый можно выпустить через rotate.

Тело запроса
urlstringобязательный

https-адрес, не во внутренней сети

eventsstring[]обязательный

События из списка выше, кроме ping

Ответы
201

Вебхук и секрет

409

webhook_limit

422

invalid_url, invalid_events

POST /webhooks
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/sunlend","events":["order.filled","order.failed"]}'
Ответ201
{
  "data": {
    "webhook": {
      "id": 3,
      "url": "https://example.com/sunlend",
      "events": [
        "order.filled",
        "order.failed"
      ],
      "isActive": true,
      "failures": 0,
      "lastSuccessAt": null,
      "lastFailureAt": null,
      "createdAt": "2026-10-25T12:00:00.000Z"
    },
    "secret": "whsec_…"
  }
}

Изменить вебхук

PATCH/webhooks/{id}Доступ ключа: full

Меняет адрес, набор событий или включает выключенный вебхук (isActive: true).

Параметры пути
idintegerобязательный

ID вебхука

Тело запроса
urlstring

Новый адрес

eventsstring[]

Новый набор событий

isActiveboolean

Включить или выключить

Ответы
200

Вебхук

404

not_found

422

invalid_url, invalid_events

PATCH /webhooks/{id}
curl -X PATCH 'https://sunlend.io/api/v1/energy/webhooks/3' \
  -H "Authorization: Bearer $SUNLEND_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"isActive":true}'
Ответ200
{
  "data": {
    "id": 3,
    "url": "https://example.com/sunlend",
    "events": [
      "order.filled",
      "order.failed"
    ],
    "isActive": true,
    "failures": 0,
    "lastSuccessAt": null,
    "lastFailureAt": null,
    "createdAt": "2026-10-25T12:00:00.000Z"
  }
}

Удалить вебхук

DELETE/webhooks/{id}Доступ ключа: full

Удаляет вебхук, события на адрес больше не отправляются.

Параметры пути
idintegerобязательный

ID вебхука

Ответы
204

Удалено

404

not_found

DELETE /webhooks/{id}
curl -X DELETE 'https://sunlend.io/api/v1/energy/webhooks/3' \
  -H "Authorization: Bearer $SUNLEND_KEY"

Новый секрет

POST/webhooks/{id}/rotateДоступ ключа: full

Выпускает новый секрет подписи. Старый перестаёт действовать сразу.

Параметры пути
idintegerобязательный

ID вебхука

Ответы
200

Новый секрет

404

not_found

POST /webhooks/{id}/rotate
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/rotate' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": {
    "secret": "whsec_…"
  }
}

Тестовое событие

POST/webhooks/{id}/pingДоступ ключа: full

Ставит в очередь событие ping — удобно проверить приём и подпись.

Параметры пути
idintegerобязательный

ID вебхука

Ответы
202

Поставлено в очередь

404

not_found

POST /webhooks/{id}/ping
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/ping' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ202
{
  "data": {
    "queued": true
  }
}

Журнал доставок

GET/webhooks/{id}/deliveriesДоступ ключа: read

Последние доставки вебхука, новые сверху: статус, число попыток, код ответа вашего сервера и ошибка.

Параметры пути
idintegerобязательный

ID вебхука

Ответы
200

Доставки

404

not_found

GET /webhooks/{id}/deliveries
curl 'https://sunlend.io/api/v1/energy/webhooks/3/deliveries' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ200
{
  "data": [
    {
      "id": 88,
      "eventId": "evt_…",
      "event": "order.filled",
      "status": "ok",
      "attempts": 1,
      "lastStatus": 200,
      "lastError": null,
      "createdAt": "2026-10-25T12:00:00.000Z",
      "deliveredAt": "2026-10-25T12:00:01.000Z"
    }
  ]
}

Повторить доставку

POST/webhooks/{id}/deliveries/{deliveryId}Доступ ключа: full

Повторно отправляет проваленную доставку.

Параметры пути
idintegerобязательный

ID вебхука

deliveryIdintegerобязательный

ID доставки

Ответы
202

Поставлено в очередь

404

not_found

POST /webhooks/{id}/deliveries/{deliveryId}
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/deliveries/88' \
  -H "Authorization: Bearer $SUNLEND_KEY"
Ответ202
{
  "data": {
    "queued": true
  }
}

Ошибки

Ошибка всегда приходит в одном формате. Опирайтесь на code — message написан для человека и может меняться.

HTTPcodeКогда
400invalid_jsonТело не разбирается как JSON или это не объект
400invalid_queryНедопустимые limit / offset
400invalid_idempotency_keyIdempotency-Key не подходит по формату
401unauthorizedНет ключа, ключ неверен или отозван, аккаунт заблокирован
402insufficient_fundsНа балансе не хватает средств
403insufficient_scopeУровень доступа ключа ниже нужного
403daily_limitПокупка превысит дневной лимит ключа
404not_foundОбъект не найден или принадлежит другому аккаунту
409idempotency_conflictIdempotency-Key уже использован для заказа с другими параметрами
409already_existsУ адреса уже есть правило этого типа
409already_activeАдрес уже активирован — деньги не списаны
409already_requestedАктивация этого адреса уже оформлена
409webhook_limitДостигнут лимит вебхуков (5)
409inactiveВебхук выключен — включите его (isActive: true), чтобы отправить тестовое событие
415unsupported_media_typeНет заголовка Content-Type: application/json
422validation_failedНеизвестные поля в теле (перечислены в details)
422invalid_addressАдрес TRON должен начинаться с T и содержать 34 символа
422invalid_volumeОбъём вне диапазона или не целое число
422invalid_resourceresource не energy и не bandwidth
422invalid_kindkind не refill, renewal или smart
422invalid_termСрок не 15m, 1h или 1d
422invalid_minimalПорог автопополнения вне допустимого
422invalid_urlАдрес вебхука не https или ведёт во внутреннюю сеть
422invalid_eventsНеизвестное событие вебхука
429rate_limitedПревышен лимит запросов на ключ
502provider_failedПоставщик отклонил заказ, деньги уже вернулись на баланс. Повторяйте с новым Idempotency-Key
503provider_offПокупка временно недоступна
503provider_unavailableПоставщик временно недоступен (автоматизации), повторите через минуту
503price_unavailableЦена временно недоступна
503check_failedНе удалось проверить адрес в сети, повторите позже
504provider_unknownПоставщик не ответил вовремя: заказ создан в статусе pending. Не создавайте новый — проверяйте этот
Ответ402
{
  "error": {
    "code": "insufficient_funds",
    "message": "Не хватает средств на балансе. Пополните баланс."
  }
}

MCP для ИИ-агентов

Тот же API доступен как MCP-сервер https://sunlend.io/api/mcp (Streamable HTTP) — ИИ-агенты (Claude, Cursor и другие) покупают энергию сами по вашему ключу.

Инструменты: get_balance, get_price, buy_energy, list_orders, get_order, activate_address, list_automations, create_automation, pause_automation, resume_automation, delete_automation. Каждый требует свой уровень доступа ключа.

Дайте агенту ключ уровня purchase с дневным лимитом — он не потратит больше лимита и не сможет создавать правила и вебхуки.
Подключение
npx mcp-remote https://sunlend.io/api/mcp \
  --header "Authorization: Bearer $SUNLEND_KEY"

Типовые сценарии

Энергия перед каждым переводом. Перед отправкой USDT купите 65 000 энергии (у получателя есть USDT) или 131 000 (у получателя нет USDT) на 15 минут, дождитесь filled и отправляйте. Если переводы идут постоянно, проще и дешевле правило Tron Charger.

Обрыв связи. Отправляйте каждый заказ с Idempotency-Key. Не дождались ответа — повторите тот же запрос с тем же ключом: второго списания не будет.

Контроль расходов. Выпустите для сервера выплат отдельный ключ уровня purchase с дневным лимитом: даже утёкший ключ не потратит больше лимита.