Перейти к содержимому

Формат подписки

Подписка — это 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». Строки метаданных можно оставить вне закодированного текста, выше него.

Тело — один 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 Friday
vless://11111111-1111-4111-8111-111111111111@fi.example.com:443?security=tls#Finland
Правило Подробности
Где Строки в самом начале тела, в любом формате (также выше текста base64 и выше JSON). В списке ссылок строки # между ссылками тоже читаются.
Синтаксис #ключ: значение. Ключ отделяется от значения по первому двоеточию, а если двоеточия нет — по первому пробелу. Пробелы вокруг обрезаются.
Ключи Без учёта регистра, те же имена, что у заголовков ответа.
Значения Те же правила, что у заголовков, включая текст с base64:. Пустое значение игнорируется.
Приоритет Заголовок ответа побеждает строку тела с тем же ключом, включая псевдонимы одной и той же настройки.
Неизвестные ключи Комментарий вида # note: hello читается как ключ note; он игнорируется и попадает в раздел Не применяется. Это безвредно, но лучше так не писать.
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
profile-title: base64:RXhhbXBsZSBWUE4=
profile-update-interval: 12
subscription-userinfo: upload=1073741824; download=5368709120; total=107374182400; expire=1798761600
support-url: https://t.me/example_support
profile-web-page-url: https://example.com
announce: base64:UGxhbm5lZCBtYWludGVuYW5jZSBvbiBGcmlkYXksIDAyOjAwLTAzOjAwIFVUQw==
#profile-description: Three locations, no logs
vless://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%20Finland
hysteria2://s3cret@de.example.com:443/?sni=de.example.com&obfs=salamander&obfs-password=pass#Germany
wireguard://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 берёт трафик, срок и уведомление об истечении.