Запрос подписки и HWID
Заголовки запроса
При каждом запросе подписки RVC отправляет заголовки, по которым Remnawave считает устройства. HWID отправляется всегда: без него панель с включённым лимитом устройств не отдаёт подписку.
| Заголовок | Пример | Описание |
|---|---|---|
User-Agent | RVC/1.0.3 | Всегда RVC/<версия>, не меняется. По нему панель выбирает формат ответа |
x-hwid | 0CC407AE-A887-812A-E308-DC1876745368 | Идентификатор устройства |
X-Device-ID | то же значение | Дубль x-hwid для серверов, которые ждут этот заголовок |
x-device-os | Android | |
x-ver-os | 15 | Версия Android |
x-device-model | Google Pixel 7 | Производитель и модель |
x-app-version | 1.0.3 | Версия RVC |
Accept-Language | ru-RU | Язык устройства |
Как считается HWID
SHA-256("rvc_hwid_" + SHA-256(ANDROID_ID|производитель|модель|бренд|устройство|продукт|плата|железо)), оформленный как UUID в верхнем регистре. Он стабилен при переустановке приложения, но различается у разных приложений на одном телефоне — так устроен ANDROID_ID в Android 8+.
HWID и прочие заголовки устройства уходят только на исходный хост подписки: при перенаправлении на другой домен они не передаются. Перенаправление с https на http запрещено.
Если адрес недоступен
RVC пробует адрес из fallback-url. Если подписка не скачалась, а VPN включён, запрос повторяется через туннель. Ответы 404 и 410 означают, что подписка удалена, — тогда запасные пути не используются.
Форматы тела
| Формат | Пример |
|---|---|
| base64 со ссылками (обычный и URL-safe) | dmxlc3M6Ly8... |
| Ссылки открытым текстом, по одной на строку | vless://…, hy2://…, awg://… |
| JSON-массив полных конфигураций Xray (Remnawave XRAY_JSON) | [{"remarks":"🇩🇪 DE","outbounds":[…]}] |
| Одиночная конфигурация Xray | {"inbounds":[…],"outbounds":[…]} |
.conf WireGuard / AmneziaWG целиком | [Interface] + [Peer] (можно в base64) |
| JSON-контейнер AmneziaWG | {"type":"amneziawg","servers":[{"name":"DE","config":"<base64url .conf>"}]} |
В текстовом теле также понимаются:
- метаданные
#ключ: значение(любой заголовок ответа) и форма#providerid ID. Заголовки ответа приоритетнее строк в теле; - строки маршрутизации
rvc://routing/onadd/…,://autorouting/onadd/https://…(см. Профили маршрутизации); - «серверы» с адресом
0.0.0.0или127.0.0.1— так панели передают сообщения («Подписка истекла», «Лимит устройств»). Они не попадают в список серверов и показываются как сообщения подписки.
Схемы ssr://, tuic://, hysteria:// (v1) пропускаются.
Параметры в адресе подписки
После # в адресе можно указать имя и параметры запроса:
https://sub.example.com/abc#Мой VPN
https://203.0.113.10/abc#Мой VPN?resolve-address=203.0.113.10&host=sub.example.comresolve-address— IP-адрес, к которому подключаться вместо резолва домена;host— значение заголовкаHost(фронтинг через CDN).
Автообновление
| Когда | Что обновляется |
|---|---|
| Раз в час в фоне (WorkManager, при наличии сети) | Подписки, у которых истёк интервал: заданный пользователем → profile-update-interval → 12 часов |
| При открытии приложения (включено по умолчанию) | Все подписки, не чаще раза в 5 минут |
| Кнопка «Обновить» или жест «потянуть вниз» | Все подписки сразу |
При ошибке старые серверы сохраняются, а в карточке подписки появляется причина. Фоновая задача заодно обновляет autorouting-профили, проверяет геофайлы, опрашивает push-адреса и напоминает об окончании подписки.