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
{
"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 |
Энергия, не израсходованная за срок аренды, не возвращается. Энергия не работает на адресах бирж.
curl 'https://sunlend.io/api/v1/energy/quote?volume=65000&term=1h' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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"}'
Баланс и адрес пополнения
Баланс аккаунта и постоянный адрес пополнения в сети TRON. На адрес принимаются USDT TRC-20 и TRX; USDT пересчитывается в TRX по курсу в момент зачисления.
depositAddress равен null.Ответы
Баланс и адрес
curl 'https://sunlend.io/api/v1/energy/account' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"balanceSun": 25000000,
"depositAddress": {
"network": "TRC20",
"address": "TXyz…"
}
}
}Цена заказа
Цена заказа по текущему прайсу — до покупки. Для энергии priceSun = volume × sunPerUnit + feeSun.
Параметры запроса
resource"energy" | "bandwidth"По умолчанию energy
volumeintegerобязательныйОбъём: энергия от 65 000 до 5 000 000, bandwidth от 1 000 до 300 000
term"15m" | "1h" | "1d"обязательныйСрок аренды
Ответы
Цена
invalid_volume, invalid_term, invalid_resource
curl 'https://sunlend.io/api/v1/energy/quote?volume=65000&term=1h' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"resource": "energy",
"volume": 65000,
"term": "1h",
"priceSun": 2090000,
"sunPerUnit": 26,
"feeSun": 400000,
"trxPer1k": null,
"balanceSun": 25000000
}
}Купить энергию или bandwidth
Списывает цену с баланса и делегирует ресурс на адрес. Обычно заказ выполняется за секунды и сразу возвращается со статусом 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
Ответы
Заказ создан
Повтор с тем же Idempotency-Key — возвращён существующий заказ
insufficient_funds
idempotency_conflict
Ошибка в полях
provider_failed — деньги вернулись на баланс
provider_unknown — заказ pending, не создавайте новый
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"}'
{
"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.Список заказов
Заказы аккаунта, новые сверху, с постраничным выводом.
Параметры запроса
limitintegerОт 1 до 100, по умолчанию 20
offsetintegerСколько заказов пропустить, по умолчанию 0
Ответы
Заказы и пагинация
invalid_query
curl 'https://sunlend.io/api/v1/energy/orders?limit=20&offset=0' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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
}
}Один заказ
Заказ по ID — так удобно дождаться выполнения заказа в pending.
Параметры пути
idintegerобязательныйID заказа
Ответы
Заказ
not_found
curl 'https://sunlend.io/api/v1/energy/orders/1042' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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"
}
}Цена активации
Новый адрес TRON (на который ещё ничего не приходило) нужно активировать, прежде чем делегировать на него ресурс. Метод возвращает цену активации.
Ответы
Цена и баланс
curl 'https://sunlend.io/api/v1/energy/activations' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"priceSun": 1500000,
"balanceSun": 25000000
}
}Активировать адрес
Активирует новый адрес и списывает цену активации. Уже активный адрес вернёт 409 already_active — деньги не списываются.
status: done — адрес активирован; pending — ответ задержался, проверка идёт автоматически; failed — не прошла, деньги вернулись.
Тело запроса
addressstringобязательныйАдрес TRON для активации
Ответы
Активация оформлена
insufficient_funds
already_active, already_requested
curl -X POST 'https://sunlend.io/api/v1/energy/activations' \ -H "Authorization: Bearer $SUNLEND_KEY" \ -H 'Content-Type: application/json' \ -d '{"address":"TNew…"}'
{
"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 энергии раз в сутки |
smart | Tron Charger: адрес заправлен перед каждым переводом |
Когда денег не хватает на следующую доставку, правило ставится на паузу (status: "paused", pauseReason: "system") и само возобновляется после пополнения. Пауза вручную (pauseReason: "user") сама не снимается.
Список правил
Все правила аккаунта с ценой одной доставки по текущему прайсу (firePriceSun).
Ответы
Правила
curl 'https://sunlend.io/api/v1/energy/automations' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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
}
]
}Создать правило
На балансе должно хватать хотя бы на одну доставку, иначе 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
Ответы
Правило создано
insufficient_funds
already_exists
Ошибка в полях
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"}'
{
"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
}
}Одно правило
Правило по ID.
Параметры пути
idintegerобязательныйID правила
Ответы
Правило
not_found
curl 'https://sunlend.io/api/v1/energy/automations/12' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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
}
}Пауза и возобновление
Поставить правило на паузу, возобновить или изменить autoResume. Для возобновления на балансе должно хватать на одну доставку.
Параметры пути
idintegerобязательныйID правила
Тело запроса
action"pause" | "resume"Пауза или возобновление
autoResumebooleanВозобновлять ли после пополнения
Ответы
Правило
insufficient_funds при возобновлении
not_found
curl -X PATCH 'https://sunlend.io/api/v1/energy/automations/12' \ -H "Authorization: Bearer $SUNLEND_KEY" \ -H 'Content-Type: application/json' \ -d '{"action":"pause"}'
{
"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
}
}Удалить правило
Удаляет правило — энергия на адрес больше не приходит.
Параметры пути
idintegerобязательныйID правила
Ответы
Удалено
not_found
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
}
}Список вебхуков
Вебхуки аккаунта со статистикой доставок.
Ответы
Вебхуки
curl 'https://sunlend.io/api/v1/energy/webhooks' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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"
}
]
}Создать вебхук
В ответе — secret для проверки подписи. Он показывается один раз; новый можно выпустить через rotate.
Тело запроса
urlstringобязательныйhttps-адрес, не во внутренней сети
eventsstring[]обязательныйСобытия из списка выше, кроме ping
Ответы
Вебхук и секрет
webhook_limit
invalid_url, invalid_events
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"]}'
{
"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_…"
}
}Изменить вебхук
Меняет адрес, набор событий или включает выключенный вебхук (isActive: true).
Параметры пути
idintegerобязательныйID вебхука
Тело запроса
urlstringНовый адрес
eventsstring[]Новый набор событий
isActivebooleanВключить или выключить
Ответы
Вебхук
not_found
invalid_url, invalid_events
curl -X PATCH 'https://sunlend.io/api/v1/energy/webhooks/3' \ -H "Authorization: Bearer $SUNLEND_KEY" \ -H 'Content-Type: application/json' \ -d '{"isActive":true}'
{
"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"
}
}Удалить вебхук
Удаляет вебхук, события на адрес больше не отправляются.
Параметры пути
idintegerобязательныйID вебхука
Ответы
Удалено
not_found
curl -X DELETE 'https://sunlend.io/api/v1/energy/webhooks/3' \ -H "Authorization: Bearer $SUNLEND_KEY"
Новый секрет
Выпускает новый секрет подписи. Старый перестаёт действовать сразу.
Параметры пути
idintegerобязательныйID вебхука
Ответы
Новый секрет
not_found
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/rotate' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"secret": "whsec_…"
}
}Тестовое событие
Ставит в очередь событие ping — удобно проверить приём и подпись.
Параметры пути
idintegerобязательныйID вебхука
Ответы
Поставлено в очередь
not_found
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/ping' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"queued": true
}
}Журнал доставок
Последние доставки вебхука, новые сверху: статус, число попыток, код ответа вашего сервера и ошибка.
Параметры пути
idintegerобязательныйID вебхука
Ответы
Доставки
not_found
curl 'https://sunlend.io/api/v1/energy/webhooks/3/deliveries' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"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"
}
]
}Повторить доставку
Повторно отправляет проваленную доставку.
Параметры пути
idintegerобязательныйID вебхука
deliveryIdintegerобязательныйID доставки
Ответы
Поставлено в очередь
not_found
curl -X POST 'https://sunlend.io/api/v1/energy/webhooks/3/deliveries/88' \ -H "Authorization: Bearer $SUNLEND_KEY"
{
"data": {
"queued": true
}
}Ошибки
Ошибка всегда приходит в одном формате. Опирайтесь на code — message написан для человека и может меняться.
| HTTP | code | Когда |
|---|---|---|
| 400 | invalid_json | Тело не разбирается как JSON или это не объект |
| 400 | invalid_query | Недопустимые limit / offset |
| 400 | invalid_idempotency_key | Idempotency-Key не подходит по формату |
| 401 | unauthorized | Нет ключа, ключ неверен или отозван, аккаунт заблокирован |
| 402 | insufficient_funds | На балансе не хватает средств |
| 403 | insufficient_scope | Уровень доступа ключа ниже нужного |
| 403 | daily_limit | Покупка превысит дневной лимит ключа |
| 404 | not_found | Объект не найден или принадлежит другому аккаунту |
| 409 | idempotency_conflict | Idempotency-Key уже использован для заказа с другими параметрами |
| 409 | already_exists | У адреса уже есть правило этого типа |
| 409 | already_active | Адрес уже активирован — деньги не списаны |
| 409 | already_requested | Активация этого адреса уже оформлена |
| 409 | webhook_limit | Достигнут лимит вебхуков (5) |
| 409 | inactive | Вебхук выключен — включите его (isActive: true), чтобы отправить тестовое событие |
| 415 | unsupported_media_type | Нет заголовка Content-Type: application/json |
| 422 | validation_failed | Неизвестные поля в теле (перечислены в details) |
| 422 | invalid_address | Адрес TRON должен начинаться с T и содержать 34 символа |
| 422 | invalid_volume | Объём вне диапазона или не целое число |
| 422 | invalid_resource | resource не energy и не bandwidth |
| 422 | invalid_kind | kind не refill, renewal или smart |
| 422 | invalid_term | Срок не 15m, 1h или 1d |
| 422 | invalid_minimal | Порог автопополнения вне допустимого |
| 422 | invalid_url | Адрес вебхука не https или ведёт во внутреннюю сеть |
| 422 | invalid_events | Неизвестное событие вебхука |
| 429 | rate_limited | Превышен лимит запросов на ключ |
| 502 | provider_failed | Поставщик отклонил заказ, деньги уже вернулись на баланс. Повторяйте с новым Idempotency-Key |
| 503 | provider_off | Покупка временно недоступна |
| 503 | provider_unavailable | Поставщик временно недоступен (автоматизации), повторите через минуту |
| 503 | price_unavailable | Цена временно недоступна |
| 503 | check_failed | Не удалось проверить адрес в сети, повторите позже |
| 504 | provider_unknown | Поставщик не ответил вовремя: заказ создан в статусе pending. Не создавайте новый — проверяйте этот |
{
"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 с дневным лимитом: даже утёкший ключ не потратит больше лимита.