Формат подписки¶
Описание форматов подписок, поддерживаемых протоколов и HTTP-заголовков.
Поддерживаемые протоколы¶
| Протокол | Схема | Описание |
|---|---|---|
| VLESS | vless:// |
Основной протокол |
| VMess | vmess:// |
JSON-based конфигурация в base64 |
| Trojan | trojan:// |
Парольная аутентификация |
| Shadowsocks | ss:// |
SIP002 и современный формат |
| Hysteria2 | hysteria2://, hy2:// |
Мульти-портовая поддержка |
| SOCKS5 | socks://, socks5:// |
Проксирование через SOCKS5 |
| HTTP-proxy | http://user:pass@host:port |
HTTP-прокси (со @ — иначе строка считается ссылкой на подписку) |
| WireGuard | wireguard://, wg:// |
Туннелирование WireGuard |
| AmneziaWG | amneziawg://, awg://, .conf в теле |
Обфусцированный WireGuard. Одиночный .conf или несколько серверов в одной подписке — см. раздел «AmneziaWG / WireGuard .conf в теле» ниже |
Схемы
ssr://,tuic://,hysteria://распознаются приложением, но не парсятся — серверы с этими схемами будут пропущены.
Форматы тела подписки¶
1. Base64-закодированные ссылки¶
Наиболее распространённый формат. Тело ответа — base64, при декодировании содержит ссылки по одной на строку:
base64(
vless://uuid@server1:443?security=tls#Server1
vless://uuid@server2:443?security=tls#Server2
)
Поддерживается URL-safe Base64 (- → +, _ → /).
2. Открытые ссылки (plain text)¶
Ссылки в открытом виде, по одной на строку:
vless://uuid@server1:443?security=tls#Server1
vmess://eyJhZGQiOiJzZXJ2ZXIyIn0=
trojan://password@server3:443#Server3
socks://user:pass@server4:1080#Server4
wireguard://secretKey@server5:51820?publickey=KEY&address=10.0.0.2#Server5
amneziawg://<base64url-conf>#Server6
3. JSON-форматы¶
Массив полных xray-конфигов:
Полный xray-конфиг (одиночный объект с inbounds и outbounds):
Подробнее: full-xray-config.md.
4. Смешанный формат¶
Ссылки серверов + строки маршрутизации + метаданные в одном теле:
vless://uuid@server1:443?security=tls#Server1
vless://uuid@server2:443?security=tls#Server2
://autorouting/onadd/https://example.com/routing.json
#announce: Плановое обслуживание завтра
Поддерживаемые специальные строки в теле:
| Паттерн | Описание |
|---|---|
://autorouting/onadd/{url} |
Автообновляемый профиль маршрутизации (URL, с sourceURL) |
://autorouting/onadd/{base64} |
Профиль маршрутизации inline (base64) |
://autorouting/add/{url} |
Автообновляемый профиль маршрутизации (URL, с sourceURL) |
://routing/onadd/{url} |
Одноразовый импорт профиля по URL (без автообновления) |
://routing/onadd/{base64} |
Статический профиль маршрутизации |
://routing/add/{base64} |
Статический профиль маршрутизации |
://onadd/{url или base64} |
Сокращённая форма (без автообновления) |
://routing/{base64} |
Сокращённая форма |
#announce: текст |
Объявление (поддерживает base64:...) |
#profile-title: текст |
Имя подписки (поддерживает base64:...) |
#support-url: URL |
Ссылка на поддержку |
#profile-web-page-url: URL |
Ссылка на сайт провайдера |
#announce-url: URL |
Ссылка на объявление |
#profile-update-interval: число |
Интервал обновления (часы) |
Специальные строки извлекаются из тела и не попадают в список серверов.
Приоритет: значения из HTTP-заголовков имеют приоритет над значениями из тела. Inline-метаданные в теле используются как fallback, если соответствующий заголовок отсутствует.
5. AmneziaWG / WireGuard .conf в теле¶
Тело подписки может быть сырым .conf-файлом WireGuard или AmneziaWG (многострочный INI с секциями [Interface] и [Peer]). Приложение распознаёт его по наличию [Interface] + PrivateKey и роутит в тот же парсер, что файл/«Вставить». AmneziaWG определяется по наличию обфускационных параметров (Jc, Jmin, Jmax, S1–S4, H1–H4, I1–I5).
Поддерживаются также новые параметры AmneziaWG 3.0 (движок обновлён до amneziawg-go v3). Все они опциональны и прокидываются в движок как есть:
Ключ .conf |
Описание |
|---|---|
HeaderProtectionKey |
Ключ защиты заголовков пакетов (задаётся сервером; для работы S1–S4 должны быть ≥ 8) |
ContentPaddingAddition |
Диапазон случайного паддинга контента (uint32 или диапазон min-max) |
RekeyAfterTime |
Время (сек), после которого клиент инициирует пересогласование |
RekeyTimeout |
Таймаут (сек) повтора рукопожатия |
RejectAfterTime |
Время (сек), после которого клиент принудительно пересогласовывается и отклоняет входящие данные |
KeepaliveTimeout |
Время (сек) от последней отправки данных до отправки keepalive |
MaxHandshakeAttempts |
Максимальное число повторов рукопожатия |
[Interface]
PrivateKey = <base64>
Address = 10.8.0.2/32
DNS = 1.1.1.1
Jc = 4
Jmin = 40
Jmax = 70
S1 = 86
S2 = 574
H1 = 1234567890
[Peer]
PublicKey = <base64>
PresharedKey = <base64>
AllowedIPs = 0.0.0.0/0
Endpoint = server.example.com:51820
Тело может быть как plain-text, так и base64-обёрнутым. То же самое можно доставить через deep-link incy://import/{base64-conf} — см. deep-links.md.
Сырой
.confв теле парсится как одна серверная запись; обфускация AmneziaWG применяется движком на этапе подключения (клиент хранит.confдословно).
Несколько AmneziaWG-серверов в одной подписке¶
Только iOS и Android. Desktop-клиент AmneziaWG не поддерживает —
.confв теле там парсится как обычный WireGuard, а схемыamneziawg:///awg://и JSON-контейнер игнорируются.
Одиночный .conf = один сервер. Чтобы отдать несколько AmneziaWG-локаций одной подпиской, используйте один из двух форматов. В обоих каждый .conf кодируется в url-safe base64 (-→+, _→/, паддинг необязателен), а имя сервера берётся из #-фрагмента или поля name.
Формат 1 — построчный (amneziawg:// / awg://). По одной ссылке на строку, можно мешать с vless:// и другими протоколами в том же теле:
amneziawg:// — канонический, awg:// — короткий алиас (эквивалентны). Всё после # — отображаемое имя.
Формат 2 — JSON-контейнер. Тело — JSON-объект с type: "amneziawg":
{
"type": "amneziawg",
"version": 1,
"servers": [
{ "name": "Германия", "config": "<base64url-conf>" },
{ "name": "Нидерланды", "config": "<base64url-conf>" }
]
}
Каждый элемент servers[] → отдельный сервер. name необязателен (при отсутствии имя берётся из # Name= внутри .conf или из хоста Endpoint). Поле version зарезервировано и сейчас не проверяется.
Поведение в обоих форматах: битая base64-запись пропускается — остальные серверы всё равно загружаются (одна плохая локация не ломает всю подписку). Дубликаты по одинаковому
.confсхлопываются в один сервер. При обновлении подписки серверы добавляются/обновляются/удаляются без задвоения. HTTP-заголовки остаются на уровне подписки (общие для всех серверов).
HTTP-заголовки¶
Заголовки подписки¶
| Заголовок | Тип | Описание |
|---|---|---|
profile-title |
string | Имя подписки (до 25 символов). Поддерживает base64 |
subscription-name |
string | Альтернатива profile-title (fallback) |
profile-description |
string | Описание подписки. Поддерживает base64 |
profile-update-interval |
int | Интервал обновления в часах |
subscription-userinfo |
string | Статистика трафика и срок действия |
support-url |
URL | Ссылка на поддержку |
support-email |
Email поддержки — показывает кнопку «Email» в карточке подписки. Без заголовка кнопка не показывается | |
profile-web-page-url |
URL | Ссылка на сайт провайдера. Альтернатива: homepage |
homepage |
URL | Fallback для profile-web-page-url |
announce-url |
URL | Ссылка на объявление |
announce |
string | Текст объявления (до 200 символов). Поддерживает base64 |
autorouting |
URL | URL-источник профиля маршрутизации с автообновлением |
routing |
string | Профиль маршрутизации (base64 или полная ссылка) |
sort-order |
string | Порядок сортировки серверов: ping, name, none |
content-disposition |
string | Fallback для имени подписки (расширения .txt, .yaml удаляются) |
premium-url |
URL | Ссылка кнопки «Премиум» в карточке подписки |
hide-url |
1/0/true/false |
Скрыть URL подписки от Share/Copy/QR/backup |
banner-text |
string | Текст баннера (base64). Перебивает панель |
banner-button-text |
string | Текст кнопки баннера |
banner-button-url |
URL | Ссылка кнопки баннера |
banner-bg-color |
hex | Цвет фона баннера (#RRGGBB) |
banner-button-color |
hex | Цвет кнопки баннера (#RRGGBB) |
fragmentation-enable |
1/0 |
TCP-фрагментация |
fragmentation-length |
min-max |
Диапазон длины фрагмента |
fragmentation-interval |
min-max |
Диапазон задержки между фрагментами |
fragmentation-packets |
tlshello / 1-3 / all |
На какие пакеты применять |
noises-enable |
1/0 |
Отправка шумовых пакетов до handshake |
noises-type |
rand / str / hex |
Тип шумового контента |
noises-packet |
string | Payload шума (формат зависит от type) |
noises-delay |
min-max мс |
Диапазон задержки между шумами |
server-address-resolve-enable |
1/0 |
Предварительный DNS-резолв адреса сервера через DoH |
server-address-resolve-dns-domain |
URL | URL DoH-сервера |
server-address-resolve-dns-ip |
IP | IP DoH-сервера (bootstrap) |
no-limit-enabled |
1/0 |
(iOS) Память-экономный режим Network Extension (держит фоновый процесс под лимитом iOS 50 МБ). Только включает |
per-app-proxy-enable |
1/0 |
(только Android) Включить per-app режим |
per-app-proxy-mode |
bypass / proxy |
(только Android) Режим per-app |
per-app-proxy-list |
CSV / URL | (только Android) Список package names |
Это справочник заголовков подписки. Полное описание каждого (форматы значений, условия показа, приоритет «заголовок → панель», поддержка
#-фрагмента в теле) — в Управление приложением, где сводная таблица является авторитетным источником.
Profile Title¶
Поддерживает два формата:
Открытый текст:
Base64 с описанием:
При base64-декодировании: первая строка — имя, остальные — описание.
Subscription User Info¶
| Поле | Тип | Описание |
|---|---|---|
upload |
int | Исходящий трафик (байт) |
download |
int | Входящий трафик (байт) |
total |
int | Лимит трафика (байт) |
expire |
int | Дата истечения (Unix timestamp, секунды) |
Если
expire> 32000000000 — значение интерпретируется как миллисекунды и конвертируется в секунды.
Скрытие блока трафика:
Если сервер возвращает subscription-userinfo: 0, блок трафика на главном экране полностью скрывается. Используйте это, когда статистика трафика не предоставляется.
Announce¶
Текст объявления отображается на главном экране в виде баннера. Поддерживается до 5 строк текста, после чего текст обрезается с многоточием.
Sort Order¶
Задаёт порядок сортировки серверов. На iOS и Android значение применяется к этой подписке (у каждой подписки свои настройки пинга/сортировки/стиля, как и профиль маршрутизации); пользователь может переопределить его в настройках подписки. На Desktop применяется к глобальной настройке сортировки.
| Значение | Описание |
|---|---|
none |
Порядок по умолчанию (как в подписке) |
ping |
По пингу (самые быстрые первыми) |
name |
По алфавиту |
Заголовки запроса (клиент → сервер)¶
При обновлении подписки приложение отправляет:
| Заголовок | Описание |
|---|---|
User-Agent |
INCY/<version>/<platform> |
Accept |
*/* |
Accept-Language |
Language-tag устройства (напр. ru-RU) |
Accept-Encoding |
Только iOS: gzip, deflate, br |
x-app-version |
Версия приложения |
x-device-locale |
Язык устройства |
x-client |
INCY |
При включённой отправке HWID дополнительно:
| Заголовок | Описание |
|---|---|
x-hwid |
Аппаратный идентификатор (подробнее) |
X-Device-ID |
Alias для x-hwid на Android (некоторые сервер-стеки ожидают именно этот заголовок) |
x-device-os |
Платформа (iOS, Android, Linux, Windows) |
x-ver-os |
Версия ОС |
x-device-model |
Модель устройства |
Все заголовки HTTP регистронезависимы. Сервер может смотреть на
x-hwidлибоX-HWID— придут одни и те же байты.
Резервные хосты (fallback)¶
Если основной хост подписки недоступен (сеть/таймаут/5xx/429), клиент перебирает резервные хосты — тот же путь и токен, меняется только хост. На 404/410 (подписка удалена провайдером) перебор не выполняется. Список резервных хостов приходит не через заголовок, а в теле premium-конфига (settings.fallbackHosts) — см. premium-api.md.