Создание пользователей
POST /accounts — создать клиента и привязать его к себе; чтение списка и карточки.
Клиент, созданный через ваш ключ, привязывается к вам: его платежи попадают в вашу выручку и в расчёт revshare.
Создать
POST /api/v1/reseller/accounts
Authorization: Bearer rsk_<ключ>
Content-Type: application/json
{
"email": "user@example.com",
"external_ref": "tg_123456789",
"language": "ru"
}
email— обязателен, должен быть свободен.password— опционален. Не прислали — сгенерируем и вернём один раз в ответе, чтобы вы передали его пользователю своим каналом. Прислали — минимум 8 символов.external_ref— ваш собственный идентификатор клиента (id в вашем боте, например). Хранится рядом с привязкой и возвращается в списке.language— локаль уведомлений:ru,en,zh,fa. По умолчаниюru.
201 Created
{
"account_id": "9a1e...",
"email": "user@example.com",
"external_ref": "tg_123456789",
"generated_password": "...",
"attributed_at": "2026-08-31T10:00:00Z"
}
409 — email уже зарегистрирован. Такой аккаунт уже существует в системе и через эту ручку к вам не привяжется; напишите нам.
Требуется скоуп accounts:write.
Список
GET /api/v1/reseller/accounts?limit=100
{
"accounts": [
{
"account_id": "9a1e...",
"email": "user@example.com",
"external_ref": "tg_123456789",
"attributed_at": "2026-08-31T10:00:00Z"
}
],
"count": 1
}
Карточка
GET /api/v1/reseller/accounts/<account_id>
{
"account_id": "9a1e...",
"email": "user@example.com",
"external_ref": "tg_123456789",
"attributed_at": "2026-08-31T10:00:00Z",
"email_verified": true,
"status": "active",
"created_at": "2026-08-31T09:59:00Z"
}
Обе ручки требуют accounts:read. Те же данные есть в кабинете, раздел «Клиенты».
Отключить и вернуть
DELETE /api/v1/reseller/accounts/<account_id>
Мягко: аккаунт переходит в suspended, туннельные пользователи выключаются, и живая сессия умирает на ближайшем обновлении токена. Ничего не удаляется — клиент остаётся в вашем списке, история платежей цела.
200 OK
{
"account_id": "9a1e...",
"status": "suspended",
"tunnel_users_affected": 1,
"already_in_state": false
}
Повторный вызов вернёт already_in_state: true и тот же 200 — ретрай после таймаута не нужно обрабатывать отдельно.
Обратно:
POST /api/v1/reseller/accounts/<account_id>/restore
Обе ручки требуют accounts:write. Удалённый по требованию самого пользователя аккаунт не отключается и не восстанавливается — вернётся 409: удаление аккаунта это его право, и оно сильнее.
Выдать подписку
POST /api/v1/reseller/accounts/<account_id>/subscription
Content-Type: application/json
{ "plan_code": "base", "days": 7, "reason": "пробник из бота" }
200 OK
{
"account_id": "9a1e...",
"plan_code": "base",
"status": "active",
"end_at": "2026-09-08T10:00:00Z",
"days_granted": 7,
"budget": {
"per_grant_days_max": 31,
"monthly_days_max": 372,
"monthly_days_used": 7,
"monthly_days_left": 365
}
}
Продление считается от того, что позже: от сегодня или от текущего окончания подписки. Семь дней поверх двадцати оставшихся — это двадцать семь, а не семь: продление никогда не укорачивает живую подписку и никогда не выдаёт дни задним числом истёкшей.
Это не канал продажи. Revshare считается из подтверждённых платежей, и подписка, выданная этой ручкой, не создаёт платежа — значит, и выплаты по ней не будет. Ручка существует для двух вещей: пробник и извинение за простой. Продажа идёт через ваш чекаут.
Бюджет пробников
У выдачи есть два потолка: на одну выдачу и суммарный за календарный месяц. Оба видны в каждом ответе, включая отказ.
400 grant_too_long— запрошено больше, чем разрешено на одну выдачу.409 grant_budget_exhausted— месячный бюджет исчерпан.403 grants_disabled— выдача отключена для вашего аккаунта.
Дефолт — 31 день на выдачу и 372 дня в месяц: дюжина месячных пробников или полсотни недельных. Если вашей воронке этого мало, скажите — поднимем.
Потолок здесь не бюрократия. Аккаунты вы заводите тем же ключом, так что «всем dedicated на год» — это один цикл на вашей стороне, а трафик по нему платим мы.
Чего в API пока нет
Продажи подписки (оплата идёт через ваш чекаут) и выдачи конфига или QR через партнёрский ключ. Конфиг клиент получает в приложении после логина.