база: https://panel.cry4me.best

API для реселлеров

Всё, что доступно в кабинете реселлера, доступно и по API. Ниже — методы создания ключей, сброса привязки и пополнения баланса.

Авторизация

Доступ по токену JWT. Токен живёт 7 дней и выдаётся при входе. К каждому запросу добавляется заголовок Authorization: Bearer <token>.

POST/api/auth/login

Вход требует капчу. Сначала запросите пример, затем отправьте ответ вместе с логином.

GET /api/auth/captcha
→ { "token": "...", "question": "3 + 4" }

POST /api/auth/login
{
  "username": "major",
  "password": "...",
  "captcha_token": "...",
  "captcha_answer": "7"
}

Ответ:

{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "csrf_token": "...",
  "user": {
    "id": 31,
    "username": "major",
    "role": "reseller",
    "balance_rub": 1500,
    "balance_1d": 10,
    "balance_7d": 4,
    "balance_30d": 0
  }
}
CSRF. Любой запрос, меняющий данные (POST, DELETE), должен нести заголовок X-CSRF-Token со значением csrf_token из ответа на вход. Запросы GET его не требуют. Токен действует 24 часа — после этого войдите заново.

Проверить текущий баланс и срок сессии:

GET/api/auth/me

Ошибки

Ошибка всегда приходит с полем error и человекочитаемым текстом.

КодКогда
400Неверные параметры, недостаточно баланса, неподходящий срок ключа
401Токен отсутствует, истёк или отозван после смены пароля
403Нет прав, аккаунт приостановлен, либо неверный X-CSRF-Token
404Ключ или счёт не найден

Создание ключа

POST/api/keys/generateсписывает баланс
ПолеТипОписание
countчислоСколько ключей, от 1 до 500. По умолчанию 1
days обязательночислоСрок. Реселлеру доступны только 1, 7 и 30
max_devicesчислоЛимит устройств. Для реселлера не больше 10
notesстрокаЗаметка к ключу
POST /api/keys/generate
Authorization: Bearer <token>
X-CSRF-Token: <csrf_token>

{ "count": 5, "days": 30, "max_devices": 2, "notes": "оптом" }

Ответ:

{
  "success": true,
  "count": 5,
  "keys": [
    { "id": 8421, "key": "8382506684554362", "days": 30, "max_devices": 2, ... },
    ...
  ]
}
Как списывается. Сначала расходуются готовые ключи нужного срока с вашего баланса. Если их не хватает, недостающие докупаются с рублёвого баланса по текущему тарифу — оптовая цена применяется автоматически, когда count достигает порога опта. Если не хватает и рублей, запрос вернёт 400 и не создаст ничего.
Свой код ключа. Поле custom_key доступно только администратору. Реселлеру запрос с ним вернёт 400. Брендирование ключей вашим ником настраивается администратором и применяется ко всем вашим ключам автоматически.

Список ключей

GET/api/keys

Возвращает только ваши ключи: { "keys": [ ... ] }. Сводка по количеству — GET /api/keys/stats.

Сброс привязки к устройству

POST/api/keys/:id/reset-hwid

:id — числовой id ключа из списка, не сам код ключа.

ПолеТипОписание
hwidстрокаСбросить одно устройство. Если не передавать — сбрасываются все
POST /api/keys/8421/reset-hwid
{ "hwid": "a1b2c3d4e5f6" }

→ { "success": true, "key": { ... } }

Отказы приходят с полем code:

codeHTTPЗначение
RESET_LIMIT_REACHED403Исчерпан лимит сбросов для этого ключа
RESET_DEVICE_NOT_FOUND400Переданный hwid к ключу не привязан

Продление и блокировка

POST/api/keys/:id/extend
POST/api/keys/:id/block
DELETE/api/keys/:id

Действуют только на ваши ключи. Продление списывает баланс по тем же правилам, что и создание.

Тарифы

GET/api/billing/tariffs

Текущие цены, порог опта, курсы валют и список доступных способов оплаты. Запрашивайте перед созданием счёта — администратор может менять цены и отключать способы оплаты.

{
  "tariffs": {
    "1d":  { "title": "...", "retail": 00, "wholesale": 00, "min_wholesale": 10 },
    "7d":  { ... },
    "30d": { ... }
  },
  "usd_rate": 84.36,
  "payment_methods": { "platega": true, "cryptopay": true, "xrocket": true, "stars": true }
}

Пополнение баланса

POST/api/billing/create-invoice
ПолеТипОписание
method обязательнострокаplatega, cryptopay, xrocket или stars
duration_tierстрокаbalance — пополнить рубли. 1d, 7d, 30d — купить готовые ключи
amountчислоСумма в рублях при duration_tier: "balance". От 50 до 500 000
countчислоКоличество ключей, когда duration_tier — срок
POST /api/billing/create-invoice
{ "method": "platega", "duration_tier": "balance", "amount": 3000 }

Ответ:

{
  "success": true,
  "order_id": 1204,
  "count": 1,
  "duration_tier": "balance",
  "price_per_key": 3000,
  "amount": 3000,
  "is_wholesale": false,
  "pay_url": "https://...",
  "method": "platega",
  "tx_id": "..."
}

Отправьте пользователя на pay_url. Баланс пополняется автоматически по уведомлению от платёжной системы.

Проверка оплаты

GET/api/billing/check/:order_id

Опрашивайте не чаще раза в несколько секунд. После зачисления возвращает обновлённые балансы:

{
  "success": true,
  "status": "PAID",
  "credited": true,
  "current_balance_1d": 15,
  "current_balance_7d": 4,
  "current_balance_30d": 0
}

Покупка ключей с рублёвого баланса

POST/api/billing/buy-with-balance

Без платёжной системы — списывает рубли и зачисляет готовые ключи на баланс.

{ "duration_tier": "30d", "count": 10 }

При нехватке рублей вернётся 400 с описанием недостающей суммы.

История пополнений

GET/api/billing/history

Возвращает { "topups": [ ... ] } — только ваши счета.