API для реселлеров
Всё, что доступно в кабинете реселлера, доступно и по API. Ниже — методы создания ключей, сброса привязки и пополнения баланса.
Авторизация
Доступ по токену JWT. Токен живёт 7 дней и выдаётся при входе. К каждому запросу добавляется заголовок Authorization: Bearer <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
}
}
POST, DELETE), должен нести заголовок X-CSRF-Token со значением csrf_token из ответа на вход. Запросы GET его не требуют. Токен действует 24 часа — после этого войдите заново.
Проверить текущий баланс и срок сессии:
Ошибки
Ошибка всегда приходит с полем error и человекочитаемым текстом.
| Код | Когда |
|---|---|
400 | Неверные параметры, недостаточно баланса, неподходящий срок ключа |
401 | Токен отсутствует, истёк или отозван после смены пароля |
403 | Нет прав, аккаунт приостановлен, либо неверный X-CSRF-Token |
404 | Ключ или счёт не найден |
Создание ключа
| Поле | Тип | Описание |
|---|---|---|
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. Брендирование ключей вашим ником настраивается администратором и применяется ко всем вашим ключам автоматически.
Список ключей
Возвращает только ваши ключи: { "keys": [ ... ] }. Сводка по количеству — GET /api/keys/stats.
Сброс привязки к устройству
: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 к ключу не привязан |
Продление и блокировка
Действуют только на ваши ключи. Продление списывает баланс по тем же правилам, что и создание.
Тарифы
Текущие цены, порог опта, курсы валют и список доступных способов оплаты. Запрашивайте перед созданием счёта — администратор может менять цены и отключать способы оплаты.
{
"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 }
}
Пополнение баланса
| Поле | Тип | Описание |
|---|---|---|
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. Баланс пополняется автоматически по уведомлению от платёжной системы.
Проверка оплаты
Опрашивайте не чаще раза в несколько секунд. После зачисления возвращает обновлённые балансы:
{
"success": true,
"status": "PAID",
"credited": true,
"current_balance_1d": 15,
"current_balance_7d": 4,
"current_balance_30d": 0
}
Покупка ключей с рублёвого баланса
Без платёжной системы — списывает рубли и зачисляет готовые ключи на баланс.
{ "duration_tier": "30d", "count": 10 }
При нехватке рублей вернётся 400 с описанием недостающей суммы.
История пополнений
Возвращает { "topups": [ ... ] } — только ваши счета.