ADRUSH VPN Partner API
HTTP API для управления VPN-подписками партнёрских проектов. Создавайте пользователей в Remnawave, получайте персональные ссылки подписки для Happ и используйте собственный домен страницы подписки с брендингом.
Base URL:
https://sub.adrushvpn.online/api/v1
Все запросы — JSON over HTTPS. Ответы — JSON с полем ok: true при
успехе. Ошибки возвращают HTTP 4xx/5xx и объект {"detail": "…"}.
provision обращается к панели Remnawave
и может выполняться 10–90 секунд. Установите HTTP-таймаут клиента ≥ 90 с и не вызывайте
provision параллельно для одного telegram_id.
Быстрый старт
Минимальная интеграция: после оплаты в вашем боте вызовите provision и отдайте пользователю
subscription_url.
curl -sS -X POST "https://sub.adrushvpn.online/api/v1/tenant/users/provision" \
-H "X-Tenant-Api-Key: YOUR_TENANT_KEY" \
-H "Content-Type: application/json" \
-d '{
"telegram_id": 123456789,
"expire_at": "2026-12-31T23:59:59Z",
"max_devices": 4
}'
{
"ok": true,
"tenant_slug": "vpnshop",
"telegram_id": 123456789,
"username": "vpnshop_tg_123456789",
"remnawave_user_uuid": "3a009f58-c9ac-4fb2-b2f0-7f9618c12f4c",
"short_uuid": "meCnSTL7Z14je4kb",
"subscription_url": "https://sub.uppartner.online/meCnSTL7Z14je4kb",
"expire_at": "2026-12-31T23:59:59.000Z",
"max_devices": 4,
"active": true
}
Authentication
API Key: X-Tenant-Api-Key
Секретный ключ вашего tenant. Передаётся в каждом запросе в заголовке
X-Tenant-Api-Key. Ключ выдаётся один раз при подключении; повторно
посмотреть его нельзя — только ротация через администратора ADRUSH VPN.
| Security scheme | apiKey (header) |
|---|---|
| Header name | X-Tenant-Api-Key |
| Content-Type | application/json — для POST/PATCH с телом |
| Формат дат | ISO 8601 UTC, напр. 2026-12-31T23:59:59Z |
Информация о вашем tenant: slug, squad Remnawave, домен публичной страницы подписки, лимит активных пользователей и текущее их число.
Заголовки
| Параметр | Описание |
|---|---|
X-Tenant-Api-Key | Обязательно |
curl -sS "https://sub.adrushvpn.online/api/v1/tenant/me" \ -H "X-Tenant-Api-Key: YOUR_TENANT_KEY"
Ответ 200
| Поле | Тип | Описание |
|---|---|---|
slug | string | Идентификатор tenant, напр. vpnshop |
name | string | Отображаемое имя партнёра |
subscription_public_url | string | Базовый URL страницы подписки, напр. https://sub.uppartner.online |
squad_uuid | string | Internal Squad Remnawave (серверы VPN) |
external_squad_uuid | string|null | External Squad — брендинг subpage |
max_active_users | int|null | Лимит активных пользователей (null = без лимита) |
active_users | int | Текущее число пользователей с неистёкшим сроком |
is_enabled | bool | Tenant активен |
Создать или обновить VPN-пользователя в Remnawave. Идемпотентно по паре
tenant + telegram_id. Если пользователь уже существует — обновляет срок,
лимит устройств и squads.
Тело запроса (JSON)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
telegram_id | integer | да | ID пользователя в Telegram (≥ 1). Уникален в рамках tenant |
expire_at | string | да | Дата окончания подписки, ISO 8601 UTC |
max_devices | integer | нет | Лимит HWID-устройств, 1–50, по умолчанию 4 |
Ответ 200
Объект пользователя + subscription_url =
{subscription_public_url}/{short_uuid}.
| Поле | Описание |
|---|---|
username | Логин в панели: {slug}_tg_{telegram_id} |
short_uuid | Короткий UUID для URL подписки |
subscription_url | Готовая ссылка для пользователя (Happ) |
active | true, если expire_at в будущем |
Статус пользователя и ссылка подписки (из учёта tenant).
Path-параметры
telegram_id | integer — Telegram ID пользователя |
|---|
curl -sS "https://sub.adrushvpn.online/api/v1/tenant/users/123456789" \ -H "X-Tenant-Api-Key: YOUR_TENANT_KEY"
Частичное обновление: новый срок, лимит устройств или отключение.
Тело запроса (JSON)
| Поле | Тип | Описание |
|---|---|---|
expire_at | string | Новая дата окончания (ISO 8601) |
max_devices | integer | Новый лимит устройств (1–50) |
active | boolean | false — отключить VPN (disable в панели) |
curl -sS -X PATCH "https://sub.adrushvpn.online/api/v1/tenant/users/123456789" \
-H "X-Tenant-Api-Key: YOUR_TENANT_KEY" \
-H "Content-Type: application/json" \
-d '{"expire_at": "2027-06-01T23:59:59Z", "max_devices": 4}'
Продлить подписку на N календарных дней от текущего срока (или от «сейчас», если уже истекла).
Тело запроса
days | integer 1–3650 — число дней продления |
|---|
curl -sS -X POST "https://sub.adrushvpn.online/api/v1/tenant/users/123456789/extend" \
-H "X-Tenant-Api-Key: YOUR_TENANT_KEY" \
-H "Content-Type: application/json" \
-d '{"days": 30}'
Отключить доступ пользователя в Remnawave (блокировка VPN).
curl -sS -X POST "https://sub.adrushvpn.online/api/v1/tenant/users/123456789/disable" \ -H "X-Tenant-Api-Key: YOUR_TENANT_KEY"
Страница подписки
После provision пользователь открывает
subscription_url — это Remnawave Subscription Page на домене партнёра
(например https://sub.uppartner.online/{shortUuid}).
- Страница отдаёт конфигурацию VLESS Reality для импорта в Happ.
- Брендинг (логотип, цвета) задаётся через
external_squad_uuidв настройках tenant. - Не используйте домен
sub.adrushvpn.onlineв пользовательских ссылках — только вашsubscription_public_url.
telegram_id
из Telegram Bot API (message.from_user.id). Один Telegram ID = один VPN-аккаунт в tenant.
Сценарий интеграции в боте
- Пользователь оплачивает тариф в вашем Telegram-боте.
- Вызываете
POST /tenant/users/provisionсtelegram_idиexpire_at. - Из ответа берёте
subscription_urlи отправляете кнопкой «Подключить VPN». - Пользователь импортирует подписку в Happ.
- При продлении —
extendили повторныйprovision. - При блокировке / chargeback —
disable.
Готовый пример бота: репозиторий ADRUSH VPN, каталог
partner-bot-example/.
Пример Python (httpx)
import httpx
from datetime import datetime, timedelta, timezone
BASE = "https://sub.adrushvpn.online/api/v1"
KEY = "YOUR_TENANT_KEY"
async def provision_user(telegram_id: int, days: int = 30) -> dict:
expire = datetime.now(timezone.utc) + timedelta(days=days)
body = {
"telegram_id": telegram_id,
"expire_at": expire.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
"max_devices": 4,
}
async with httpx.AsyncClient(timeout=90.0) as client:
r = await client.post(
f"{BASE}/tenant/users/provision",
headers={"X-Tenant-Api-Key": KEY},
json=body,
)
r.raise_for_status()
return r.json()
Коды ошибок
| HTTP | detail | Описание |
|---|---|---|
| 401 | invalid_tenant_api_key | Неверный или отозванный ключ |
| 403 | tenant_disabled | Tenant отключён администратором |
| 404 | user_not_found | Пользователь не найден (сначала provision) |
| 429 | tenant_quota_exceeded | Достигнут max_active_users |
| 400 | текст | Невалидные параметры, ошибка Remnawave, inactive и др. |
| 504 | status_lookup_timeout | Таймаут GET user — повторите запрос |
Contact
Подключение нового партнёра, ротация API-ключа, настройка домена и брендинга:
| Поддержка ADRUSH VPN | https://t.me/AdRushVpn |
|---|---|
| Telegram-бот сервиса | https://t.me/adrushvpnBot |
| Health check API | GET https://sub.adrushvpn.online/health |