API для реселлеров
Всё, что доступно в кабинете реселлера, доступно и по API: создание ключей, сброс привязки, продление и пополнение баланса.
Авторизация
Два способа на выбор. Для своих ботов и магазинов используйте ключ API — он не истекает по сессии и не требует пароля. Вход по логину нужен только самой панели.
Ключ API рекомендуется
Создаётся в кабинете, в разделе «Ключи API». Передаётся одним из двух заголовков — они равнозначны:
X-API-Key: cry_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # либо Authorization: Bearer cry_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-CSRF-Token для них не требуется — в отличие от входа по логину.
Вход по логину
Требует капчу. Сначала запросите пример, затем отправьте ответ вместе с логином.
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 часа.
Текущий баланс и срок сессии:
Управление ключами API
Список ваших ключей. Само значение ключа не возвращается — только начало, по которому его можно узнать.
{
"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": "Просмотр ключей" } ]
}
| Поле | Тип | Описание |
|---|---|---|
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, завести нельзя.
Отзывает ключ. Действует сразу и необратимо.
Разрешения
Ключ может только то, что ему разрешили. Выдавайте минимум: боту, который лишь создаёт ключи, не нужно право на удаление.
| Разрешение | Что открывает |
|---|---|
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 | Ключ или счёт не найден |
Создание ключа
| Поле | Тип | Описание |
|---|---|---|
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 доступно только администратору. Брендирование ключей вашим ником настраивается администратором и применяется ко всем вашим ключам автоматически.
Список ключей
Возвращает только ваши ключи: { "keys": [ ... ] }. Сводка по количеству — GET /api/keys/stats, то же разрешение.
Состояния ключа: unused — не активирован, active — работает, frozen — заморожен на время техработ, expired — срок вышел, blocked — заблокирован.
Сброс привязки к устройству
:id — числовой id ключа из списка, не сам код ключа.
| Поле | Тип | Описание |
|---|---|---|
hwid | строка | Сбросить одно устройство. Если не передавать — сбрасываются все |
POST /api/keys/8421/reset-hwid
{ "hwid": "a1b2c3d4e5f6" }
→ { "success": true, "key": { ... } }
Отказы приходят с полем code:
| code | HTTP | Значение |
|---|---|---|
RESET_LIMIT_REACHED | 403 | Исчерпан лимит сбросов для этого ключа |
RESET_DEVICE_NOT_FOUND | 400 | Переданный hwid к ключу не привязан |
Продление и блокировка
Действуют только на ваши ключи. Продление списывает баланс по тем же правилам, что и создание, и принимает те же сроки, включая 9999.
Тарифы
Текущие цены, порог опта, курсы валют и доступные способы оплаты. Запрашивайте перед созданием счёта — цены и способы оплаты может менять администратор, а для вашего аккаунта могут действовать индивидуальные условия.
{
"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 означает, что оптовой цены у тарифа нет: стоимость одна при любом количестве.
Пополнение баланса
| Поле | Тип | Описание |
|---|---|---|
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. Баланс пополняется автоматически по уведомлению от платёжной системы.
Проверка оплаты
Опрашивайте не чаще раза в несколько секунд. После зачисления возвращает обновлённые балансы:
{
"success": true,
"status": "PAID",
"credited": true,
"current_balance_1d": 15,
"current_balance_7d": 4,
"current_balance_30d": 0,
"current_balance_lifetime": 2
}
Покупка ключей с рублёвого баланса
Без платёжной системы — списывает рубли и зачисляет готовые ключи на баланс.
{ "duration_tier": "lifetime", "count": 1 }
При нехватке рублей вернётся 400 с описанием недостающей суммы.
История пополнений
Возвращает { "topups": [ ... ] } — только ваши счета.