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

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

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

Авторизация

Два способа на выбор. Для своих ботов и магазинов используйте ключ API — он не истекает по сессии и не требует пароля. Вход по логину нужен только самой панели.

Ключ API рекомендуется

Создаётся в кабинете, в разделе «Ключи API». Передаётся одним из двух заголовков — они равнозначны:

X-API-Key: cry_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# либо
Authorization: Bearer cry_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CSRF не нужен. Запросы с ключом API приходят не из браузера, поэтому заголовок X-CSRF-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,
    "balance_lifetime": 2
  }
}

Токен живёт 7 дней и передаётся как Authorization: Bearer <token>. Любой изменяющий запрос при этом способе должен нести заголовок X-CSRF-Token со значением csrf_token; он действует 24 часа.

Текущий баланс и срок сессии:

GET/api/auth/me

Управление ключами API

Эти методы работают только при входе по логину. Ключом API нельзя выпустить ещё один ключ или отозвать существующий — иначе утёкший ключ позволил бы выпустить себе новые с более широкими правами.
GET/api/apikeys

Список ваших ключей. Само значение ключа не возвращается — только начало, по которому его можно узнать.

{
  "keys": [
    {
      "id": "03604aa7-...",
      "name": "Бот в телеграме",
      "prefix": "cry_39d5e8e5",
      "scopes": ["keys:read", "keys:create"],
      "created_at": "2026-10-14T08:00:00.000Z",
      "expires_at": null,
      "last_used_at": "2026-10-14T09:12:44.000Z",
      "revoked": false
    }
  ],
  "scopes": [ { "id": "keys:read", "title": "Просмотр ключей" } ]
}
POST/api/apikeys
ПолеТипОписание
nameстрокаНазвание для себя, до 64 символов
scopes обязательномассивРазрешения, минимум одно. Список — ниже
expires_daysчислоСрок в днях, от 1 до 3650. null — без срока
POST /api/apikeys
{ "name": "Бот в телеграме", "scopes": ["keys:create", "keys:read"], "expires_days": 90 }

→ {
  "success": true,
  "secret": "cry_39d5e8e5d23845a1f4dcb416e7b328cbb5935a7241ed51a0",
  "key": { "id": "...", "prefix": "cry_39d5e8e5", "scopes": [...], "expires_at": "..." }
}

Поле secret приходит только в этом ответе. Больше одновременно активных ключей, чем 20, завести нельзя.

DELETE/api/apikeys/:id

Отзывает ключ. Действует сразу и необратимо.

Разрешения

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

РазрешениеЧто открывает
keys:readСписок ключей и сводка по количеству
keys:createСоздание ключей (списывает баланс)
keys:extendПродление ключей (списывает баланс)
keys:resetСброс привязки к устройству
keys:blockБлокировка и разблокировка
keys:deleteУдаление ключей
billing:readТарифы и история пополнений

Если разрешения не хватает, запрос вернёт 403 и прямо назовёт недостающее:

{ "error": "Forbidden: API key lacks required permission", "required": ["keys:create"] }

При входе по логину разрешения не действуют — из панели доступно всё.

Ошибки

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

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

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

POST/api/keys/generatekeys:create
ПолеТипОписание
countчислоСколько ключей, от 1 до 500. По умолчанию 1
days обязательночислоСрок: 1, 7, 30 или 9999 — бессрочный
max_devicesчислоЛимит устройств. Для реселлера не больше 10
notesстрокаЗаметка к ключу
POST /api/keys/generate
X-API-Key: cry_...

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

Ответ:

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

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

GET/api/keyskeys:read

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

Состояния ключа: unused — не активирован, active — работает, frozen — заморожен на время техработ, expired — срок вышел, blocked — заблокирован.

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

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

: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/extendkeys:extend
POST/api/keys/:id/blockkeys:block
DELETE/api/keys/:idkeys:delete

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

Тарифы

GET/api/billing/tariffsbilling:read

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

{
  "tariffs": {
    "1d":       { "title": "1 День (24ч)", "retail": 80, "wholesale": 50, "min_wholesale": 10 },
    "7d":       { ... },
    "30d":      { ... },
    "lifetime": { "title": "Навсегда", "retail": 3000, "wholesale": 3000, "no_wholesale": true, "days": 9999 }
  },
  "usd_rate": 84.36,
  "payment_methods": { "platega": true, "cryptopay": true, "xrocket": true, "stars": true }
}

Флаг no_wholesale означает, что оптовой цены у тарифа нет: стоимость одна при любом количестве.

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

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

Ответ:

{
  "success": true,
  "order_id": 1204,
  "count": 2,
  "duration_tier": "lifetime",
  "price_per_key": 3000,
  "amount": 6000,
  "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,
  "current_balance_lifetime": 2
}

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

POST/api/billing/buy-with-balance

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

{ "duration_tier": "lifetime", "count": 1 }

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

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

GET/api/billing/historybilling:read

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