Формат подписки
Подписка — это HTTPS-адрес, который возвращает список серверов в теле и настройки подписки в заголовках ответа. Эта страница описывает передачу и тело. Заголовки — на странице Заголовки ответа.
Загрузка
Заголовок раздела «Загрузка»| Аспект | Поведение |
|---|---|
| Метод | GET. Заголовки запроса перечислены на странице Заголовки запроса. |
| Схема | HTTPS. Адрес http:// загружается только после того, как пользователь подтвердил запрос Незашифрованная подписка для этой подписки; без подтверждения клиент останавливается с ошибкой «HTTPS required; confirm unencrypted HTTP explicitly». |
| Перенаправления | 301, 302, 303, 307 и 308 выполняются не более 5 раз, и каждый переход должен удовлетворять тому же правилу о схеме. Перенаправление без заголовка Location или шестое перенаправление — ошибка. |
| Статус | После перенаправлений любой статус 300 и выше — ошибка («Subscription HTTP 403»). Тело ответа с ошибкой не разбирается. |
| Таймаут | По умолчанию 9 секунд на соединение, на получение и на запрос целиком. Провайдер может задать от 5 до 15 секунд через subscription-request-timeout. |
| Запасной адрес | Если запрос не удался по любой причине (таймаут, статус ошибки, проблема с перенаправлением), клиент один раз повторяет его по fallback-url, сохранённому из прежнего успешного ответа. При первом импорте запасного адреса ещё нет. |
| Размер | Текст ответа ограничен 16 МиБ. Больший ответ отклоняется: «Import exceeds 16 MiB». |
| Кодировка | UTF-8. Метка порядка байтов в начале игнорируется. |
| Content-Type | Не проверяется. |
| Результат | При успехе список серверов подписки заменяется новым. Ответ без серверов — ошибка («Subscription contains no servers; previous servers kept»), старый список остаётся. При любой ошибке старые серверы сохраняются, а сообщение показывается на карточке подписки. |
| Расписание | Автообновление выполняется каждые profile-update-interval часов (6 часов, если провайдер ничего не прислал) и отключается для подписки отдельно. |
Форматы тела
Заголовок раздела «Форматы тела»mins разбирает тело в таком порядке и берёт первый подходящий формат. Строки метаданных в начале читаются сначала и удаляются (см. Строки метаданных).
| № | Тело | Результат |
|---|---|---|
| 1 | Одна строка — ссылка маршрутизации (mins://routing/..., happ://routing/..., incy://routing/..., incy://autorouting/...) |
Профиль маршрутизации, серверов нет |
| 2 | Конфигурация WireGuard или AmneziaWG в формате INI (первая секция — [Interface]) |
Один сервер |
| 3 | JSON, начинающийся с {, [, // или /* |
Конфигурации Xray либо профиль маршрутизации, если у объекта есть Name и нет outbounds |
| 4 | Текст, где хотя бы одна строка содержит :// |
Список ссылок, по одной в строке |
| 5 | Всё остальное | Считается base64; декодированный текст разбирается заново по правилам 1–4 |
Список ссылок
Заголовок раздела «Список ссылок»Одна ссылка в строке. Пустые строки пропускаются. Поддерживаются схемы vless://, hysteria2:// (и hy2://), wireguard:// и vpn://; форматы — на странице Ссылки и deep link.
- Ссылка с любой другой схемой, например
vmess://илиtrojan://, остаётся в списке как неподдерживаемый сервер с причиной «Protocol X is not supported». Остальной список импортируется как обычно. - Некорректная ссылка с поддерживаемой схемой не пропускается: одна неверная ссылка отклоняет всю подписку, а ошибка указывает строку (
text.lines[N]). Проверяйте ссылки до выдачи. Примеры фатальных ошибок: удалённый транспорт (type=h2,http,h3,quic: «Transport removed; use XHTTP»),security=кромеnone,tlsиreality, отсутствиеpublickeyв ссылке WireGuard, зашифрованная ссылкаhapp://crypt...илиincy://crypt.... - Ссылка маршрутизации в отдельной строке добавляет к подписке профиль маршрутизации (см. Профили маршрутизации).
Весь список можно закодировать в base64. Принимаются все четыре алфавита: стандартный и URL-safe, с выравниванием и без. Пробелы и переводы строк внутри base64 игнорируются. Декодированный текст должен быть UTF-8 и разбирается как любое другое тело; текст, который декодируется сам в себя, отклоняется: «Input is not a share link or subscription». Строки метаданных можно оставить вне закодированного текста, выше него.
Xray JSON
Заголовок раздела «Xray JSON»Тело — один JSON-объект или массив объектов. Каждый объект — один сервер. Допустимы комментарии (//, /* */) и завершающие запятые.
- Объект без верхнеуровневого
protocol— полная конфигурация Xray (сoutboundsи, возможно,routing,dnsи т. д.). Она используется как есть; mins меняет только собственные входящие подключения, ссылки на геофайлы и, если в конфигурации нет DNS, добавляет его. Управление трафикомfragmentation-*,noises-*,mux-*иsniffing-enableна неё не действует. - Объект с верхнеуровневым
protocol— отдельный outbound. mins строит остальную конфигурацию вокруг него, поэтому все ключи управления трафиком действуют. - Имя сервера —
remarks(илиremark), его переопределяетmins.name; описание —meta.serverDescription, его переопределяетmins.description. См. Блок mins. - Поддерживаются outbound-протоколы
vless,hysteria(Hysteria2) иwireguard(включая AmneziaWG), а также служебныеfreedom,blackholeиdns. Сервер с другим протоколом попадает в список как неподдерживаемый («Unsupported protocols: trojan»); остальные импортируются. - Объект с ключом
proxiesилиroute(формы sing-box и Clash) отклоняет весь импорт: «Only Xray configuration imports are supported».
[ { "remarks": "Finland 1", "meta": { "serverDescription": "Streaming" }, "mins": { "flag": "fi", "icon": "house" }, "outbounds": [ { "tag": "proxy", "protocol": "vless", "settings": { "vnext": [ { "address": "fi.example.com", "port": 443, "users": [ { "id": "11111111-1111-4111-8111-111111111111", "encryption": "none" } ] } ] }, "streamSettings": { "network": "ws", "security": "tls", "tlsSettings": { "serverName": "fi.example.com" }, "wsSettings": { "path": "/ws" } } }, { "tag": "direct", "protocol": "freedom" } ] }]Строки метаданных
Заголовок раздела «Строки метаданных»Настройки подписки можно передавать в теле строками #ключ: значение вместо заголовков ответа или вместе с ними. Это нужно там, где нельзя задать заголовки.
#profile-title: Example VPN#profile-update-interval: 12#announce: Planned maintenance on Fridayvless://11111111-1111-4111-8111-111111111111@fi.example.com:443?security=tls#Finland| Правило | Подробности |
|---|---|
| Где | Строки в самом начале тела, в любом формате (также выше текста base64 и выше JSON). В списке ссылок строки # между ссылками тоже читаются. |
| Синтаксис | #ключ: значение. Ключ отделяется от значения по первому двоеточию, а если двоеточия нет — по первому пробелу. Пробелы вокруг обрезаются. |
| Ключи | Без учёта регистра, те же имена, что у заголовков ответа. |
| Значения | Те же правила, что у заголовков, включая текст с base64:. Пустое значение игнорируется. |
| Приоритет | Заголовок ответа побеждает строку тела с тем же ключом, включая псевдонимы одной и той же настройки. |
| Неизвестные ключи | Комментарий вида # note: hello читается как ключ note; он игнорируется и попадает в раздел Не применяется. Это безвредно, но лучше так не писать. |
Полный пример
Заголовок раздела «Полный пример»HTTP/1.1 200 OKContent-Type: text/plain; charset=utf-8profile-title: base64:RXhhbXBsZSBWUE4=profile-update-interval: 12subscription-userinfo: upload=1073741824; download=5368709120; total=107374182400; expire=1798761600support-url: https://t.me/example_supportprofile-web-page-url: https://example.comannounce: base64:UGxhbm5lZCBtYWludGVuYW5jZSBvbiBGcmlkYXksIDAyOjAwLTAzOjAwIFVUQw==
#profile-description: Three locations, no logsvless://11111111-1111-4111-8111-111111111111@fi.example.com:443?type=ws&security=tls&sni=fi.example.com&path=%2Fws&host=fi.example.com#%F0%9F%87%AB%F0%9F%87%AE%20Finlandhysteria2://s3cret@de.example.com:443/?sni=de.example.com&obfs=salamander&obfs-password=pass#Germanywireguard://AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE%3D@nl.example.com:51820?publickey=AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI%3D&address=10.0.0.2%2F32&dns=1.1.1.1&mtu=1280#NetherlandsУ первого сервера будет флаг Финляндии: флаг-эмодзи в начале имени задаёт страну и убирается из отображаемого имени.
Чек-лист для разработчиков панелей
Заголовок раздела «Чек-лист для разработчиков панелей»- Отдавайте подписку по HTTPS. Обычный HTTP работает только после явного подтверждения пользователя.
- Возвращайте
200со списком. Не отвечайте403или429с телом: клиент считает это ошибкой и оставляет старые серверы. - Отправляйте каждый заголовок один раз. Повторяющиеся заголовки с одним именем склеиваются через запятую, и большинство значений при этом ломается.
- Укладывайте
profile-titleв 25 символов,announce— в 200: более длинный текст обрезается, а не отклоняется. - Проверяйте каждую ссылку. Одна неверная ссылка отклоняет всю подписку.
- Отправляйте
subscription-userinfoв каждом ответе: из него mins берёт трафик, срок и уведомление об истечении.