Skip to content

Заголовки подписки ​

Что keqdroid отправляет панели, когда загружает подписку, и что читает из её ответа.

Вот что из ответа видно на карточке подписки:

Карточка подписки в приложенииКарточка подписки в приложении
  1. profile-titleимя подписки, если вы не задали своё
  2. announceобъявление провайдера
  3. subscription-userinfoизрасходовано и сколько всего: upload + download из total
  4. subscription-userinfoсколько осталось до конца: expire
  5. profile-update-intervalкак часто обновлять подписку
  6. profile-web-page-urlкнопка «Страница подписки»
  7. support-urlкнопка «Поддержка»

Остальное на карточке не отображается: адрес для переезда, запасной адрес, профиль маршрутизации и сами серверы.

Адрес подписки ​

Подписка загружается только по https, потому что в ней лежат ключи серверов, а по http их может прочитать любой посредник. Адреса домашней сети и localhost не принимаются.

Когда VPN включён, подписка загружается через сервер, а не мимо него.

Что приложение отправляет ​

User-Agent ​

keqdroid/<версия>, всегда с текущей версией приложения.

Если вместо подписки панель вернула HTML-страницу или ошибку, приложение повторяет запрос с User-Agent других клиентов: Happ, INCY, v2RayTun, v2rayNG, Streisand, Shadowrocket, FlClashX, Clash Meta for Android, Clash Verge, sing-box и в последнюю очередь браузера. User-Agent, с которым подписка загрузилась, запоминается, и в следующий раз приложение пробует его первым.

Данные устройства ​

ЗаголовокЗначение
x-hwidидентификатор устройства
x-device-osAndroid, Windows или Linux
x-ver-osверсия ОС
x-device-modelмодель телефона или имя компьютера

На Android идентификатор – это Android ID, а на компьютере приложение создаёт его один раз и хранит. Значения отправляются только латиницей.

Пользователь может выключить эти заголовки («Отдавать HWID устройства» в дополнительных настройках) или задать для подписки свои значения и свой User-Agent («Идентичность устройства» в настройках подписки).

Что приложение читает ​

Трафик и срок ​

subscription-userinfo: upload=1073741824; download=5368709120; total=107374182400; expire=1798675200

Израсходованный трафик – это upload+download, лимит – total в байтах (0 – без лимита), expire – дата окончания в секундах Unix. Также принимаются x-subscription-userinfo, userinfo и x-userinfo.

Если заголовка нет, приложение ищет трафик и дату в именах серверов, например 12.5 GB / 100 GB и 31.12.2026.

Карточка подписки ​

ЗаголовокЧто делает
profile-titleимя подписки
announceобъявление на карточке
support-urlкнопка «Поддержка»
profile-web-page-urlкнопка «Страница подписки»
profile-update-intervalкак часто обновлять подписку, в часах
  • Имя из profile-title ставится, только если пользователь сам не задал подписке имя.
  • profile-title и announce можно передавать в base64, с префиксом base64: или без него.
  • Интервал обновления берётся только при первой загрузке, дальше его меняет только пользователь. Без этого заголовка подписка обновляется раз в 12 часов.
  • В кнопках принимаются только ссылки http и https.

Переезд и запасной адрес ​

ЗаголовокЧто делает
new-urlподписка переезжает на новый адрес
new-domainто же, но меняется только домен
fallback-urlзапасной адрес, если основной не ответил
notification-subs-expire: 1напоминание об окончании подписки (Android)

При переезде у подписки меняется только адрес: имя, картинка, серверы и профиль маршрутизации остаются прежними. Новый адрес сначала проверяется, и подписка переезжает, только если по нему действительно отдаётся подписка. Переехать с https на http нельзя.

С fallback-url подписка загружается с запасного адреса, когда основной не отвечает, но сам адрес подписки не меняется: вдруг основной вернётся.

С notification-subs-expire: 1 в последние три дня перед expire раз в день приходит уведомление, пока панель присылает этот флаг.

Маршрутизация ​

ЗаголовокЧто делает
routingпрофиль маршрутизации для этой подписки
routing-enable: 0убрать профиль провайдера

В routing принимается ссылка в формате Happ (happ://routing/add/…, а также incy:// и keqdroid://), JSON профиля Happ или правила Xray – как есть или в base64. Формат описан на странице Ссылки.

Из правил Xray берутся только правила по доменам и адресам с целью direct, proxy или block. Правило с портом, протоколом или процессом пропускается целиком, потому что без этих условий оно срабатывало бы шире, чем задумано.

Профиль провайдера пользователь может посмотреть, но не изменить. Если пользователь включил «Правила» в «Не учитывать от провайдера», профиль не принимается.

Лимит устройств Remnawave ​

Если панель ответила x-hwid-active: true вместе с x-hwid-max-devices-reached: true или x-hwid-not-supported: true, пользователь видит понятную ошибку: лимит устройств исчерпан или клиент не поддерживается.

Строки в теле подписки ​

#new-url https://new.example.com/sub/abc
#new-domain new.example.com
#fallback-url https://backup.example.com/sub/abc
#notification-subs-expire 1

Эти строки и ссылка happ://routing/... работают и в теле подписки, в том числе внутри base64, и имеют приоритет над заголовками. Строки #profile-title, #announce и остальные из раздела «Карточка подписки» в теле не читаются, их нужно передавать заголовками.

Что может быть в теле ​

  • список ссылок, обычным текстом или в base64;
  • конфиг Clash или mihomo;
  • конфиг sing-box;
  • конфиг Xray, один или списком.