Создание пользователей

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 через партнёрский ключ. Конфиг клиент получает в приложении после логина.