Ссылки и deep link
mins понимает четыре вида ссылок: ссылки на серверы (по одному серверу), ссылки «добавить подписку», ссылки маршрутизации и https://-ссылки-переходники для мест, где разрешён только HTTPS (кнопки Telegram). Откуда бы ни пришла ссылка, она ничего не меняет молча: приложение всегда показывает предпросмотр и ждёт подтверждения пользователя.
Ссылки на серверы
Заголовок раздела «Ссылки на серверы»| Схема | Протокол | Примечания |
|---|---|---|
vless:// |
VLESS | TLS, REALITY или без шифрования; raw, WebSocket, gRPC, XHTTP, HTTPUpgrade, mKCP. |
hysteria2://, hy2:// |
Hysteria2 | Обфускация Salamander, перескок портов, закрепление сертификата. |
wireguard:// |
WireGuard и AmneziaWG | Параметры AmneziaWG — обычные параметры запроса. |
vpn:// |
AmneziaWG | Контейнер, экспортируемый Amnezia. |
любая другая (vmess://, trojan://, ss://, …) |
не поддерживается | Ссылка остаётся в списке как неподдерживаемый сервер с причиной «Protocol X is not supported». |
Общие правила для всех ссылок на серверы:
- Имя — фрагмент после
#в процентном кодировании. Флаг-эмодзи в начале задаёт страну (см. Блок mins). - Описание передаётся внутри фрагмента:
#Finland?serverDescription=<base64 от текста в UTF-8>. Если в base64 встречаются+,/или=, закодируйте их в процентном виде или используйте URL-safe алфавит. - Учётные данные (часть до
@) должны быть закодированы в процентном виде. Второй@в них — ошибка. - IPv6-адреса пишутся в квадратных скобках. Порты — от 1 до 65535.
- Имена параметров запроса зависят от регистра. Неизвестный параметр игнорируется с предупреждением; повторяющееся или пустое имя параметра — ошибка.
vless://<uuid>@<host>:<port>?<параметры>#<имя>| Параметр | Значение | Примечания |
|---|---|---|
type |
raw (псевдоним tcp), ws, grpc, xhttp, httpupgrade, kcp (псевдоним mkcp) |
По умолчанию raw. http, h2, h3 и quic отклоняются: «Transport removed; use XHTTP». |
security |
none, tls, reality |
По умолчанию none. REALITY не работает с ws, httpupgrade и kcp. |
encryption |
строка | По умолчанию none. Не может быть пустой. |
flow |
строка | Например, xtls-rprx-vision. |
sni |
имя хоста | По умолчанию — хост из ссылки. |
fp |
отпечаток | По умолчанию chrome. Обязателен для REALITY. |
alpn |
список через запятую | Например, h2,http/1.1. |
ech |
строка | Список конфигураций ECH. |
pcs |
строка | Закреплённый SHA-256 сертификата сервера. |
vcn |
строка | Проверять сертификат сервера по этому имени. |
pbk |
строка | Публичный ключ REALITY. Обязателен для REALITY. |
sid |
строка | Short id REALITY. |
pqv |
строка | Ключ проверки ML-DSA-65 для REALITY. |
spx |
строка | Spider X для REALITY. |
path |
строка | ws, httpupgrade, xhttp; по умолчанию /. Для raw с headerType=http — путь запроса. |
host |
строка | ws, httpupgrade, xhttp; для raw с headerType=http — заголовок Host. |
mode |
gRPC: gun (по умолчанию), multi. XHTTP: auto (по умолчанию), packet-up, stream-up, stream-one |
gRPC guna разбирается, но сервер помечается неподдерживаемым («gRPC guna uses a custom codec not supported by Xray; use gun or multi»). |
serviceName, authority |
строка | gRPC. |
extra |
JSON-объект | Дополнительные настройки XHTTP. |
mtu, tti |
целое | mKCP. |
seed |
строка | mKCP. |
headerType |
строка | Тип заголовка mKCP либо http для raw. |
fm |
JSON | Настройки finalmask. |
mux |
JSON | Настройки Mux этого outbound. |
fragment |
length,interval,packets[,maxSplit] |
Фрагментация TLS этого сервера, например 50-100,10-20,tlshello. |
noises |
type,packet,delay[,applyTo], соединённые ; |
Шумовые пакеты этого сервера. |
allowInsecure, insecure |
true, false, 1, 0 |
Отключает проверку сертификата. Передача обоих — ошибка. У сервера появляется предупреждающая метка. |
testpre, testseed |
JSON или строка | Передаются в запись пользователя без изменений. |
node_id, xtls |
любое | Принимаются и игнорируются. |
sni, fp, alpn и path не должны присутствовать с пустым значением.
vless://11111111-1111-4111-8111-111111111111@fi.example.com:443?type=raw&security=reality&sni=www.example.com&fp=chrome&pbk=AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-abcde&sid=6ba85179e30d4fc2&flow=xtls-rprx-vision#Finland%20Realityvless://11111111-1111-4111-8111-111111111111@xh.example.com:443?type=xhttp&security=tls&sni=xh.example.com&host=xh.example.com&path=%2Fx&mode=auto&alpn=h2#XHTTPvless://11111111-1111-4111-8111-111111111111@fi.example.com:443?type=grpc&security=tls&serviceName=svc&mode=multi#gRPCHysteria2
Заголовок раздела «Hysteria2»hysteria2://<auth>@<host>[:<port>]/?<параметры>#<имя>hy2:// — то же самое. Порт по умолчанию — 443. Строка аутентификации может быть пустой.
| Параметр | Значение | Примечания |
|---|---|---|
sni |
имя хоста | Имя сервера TLS. |
pinSHA256 |
строка | Один закреплённый отпечаток сертификата. |
ech |
строка | Список конфигураций ECH. |
insecure, allowInsecure |
true, false, 1, 0 |
Отключает проверку сертификата. Передача обоих — ошибка. |
obfs |
salamander |
Единственная поддерживаемая обфускация; любое другое значение — ошибка. |
obfs-password |
строка | Обязателен вместе с obfs. |
mport |
порты | Диапазон или список для перескока портов, например 20000-30000 или 443,500-600. Обратный диапазон — ошибка. |
mportHopInt |
секунды | Интервал перескока: 30, 30s или диапазон 20-40. Не меньше 5; по умолчанию 30. Используется, когда mport задаёт перескок. |
hysteria2://s3cret@de.example.com:443/?sni=de.example.com&obfs=salamander&obfs-password=pass#Germanyhy2://s3cret@de.example.com:443/?sni=de.example.com&mport=20000-30000&mportHopInt=30#Germany%20hopСсылки со схемой hysteria2+realm отклоняются: «Hysteria realm is not supported».
WireGuard и AmneziaWG
Заголовок раздела «WireGuard и AmneziaWG»wireguard://<закрытый ключ>@<host>:<port>?publickey=<ключ>&address=<cidr>[&...]#<имя>Закодируйте закрытый ключ в процентном виде: в base64 есть +, / и =.
| Параметр | Значение | Примечания |
|---|---|---|
publickey |
ключ в base64 | Обязателен. |
presharedkey |
ключ в base64 | |
address |
CIDR через запятую | Адреса туннеля, например 10.0.0.2/32. |
dns |
IP через запятую | |
mtu |
целое | |
allowedips |
CIDR через запятую | По умолчанию 0.0.0.0/0,::/0. |
keepalive |
целое или диапазон | Persistent keepalive, секунды. |
reserved |
три байта | 1,2,3 или base64. |
jc, jmin, jmax, s1–s4, h1–h4, i1–i5 |
числа, диапазоны (h1..h4), строки (i1..i5) |
Обфускация AmneziaWG. jmin не больше jmax; диапазоны h1–h4 не должны пересекаться. |
headerprotectionkey, contentpaddingaddition, randomtrailers, disablecookies |
Расширения AmneziaWG (randomtrailers, disablecookies — логические). headerprotectionkey требует s1–s4 не меньше 12. |
|
rekeyaftertime, rekeytimeout, rejectaftertime, keepalivetimeout, maxhandshakeattempts, persistentkeepalive |
числа | Таймеры AmneziaWG. |
wireguard://AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE%3D@nl.example.com:51820?publickey=AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI%3D&address=10.0.0.2%2F32&dns=1.1.1.1&mtu=1280&jc=4&jmin=40&jmax=70&s1=15&s2=18#NetherlandsАдрес подписки (а также вставленный текст или файл) может быть и одним файлом WireGuard или AmneziaWG в формате INI. Он должен начинаться с [Interface] (обязателен PrivateKey), за которым идут одна или несколько секций [Peer] (в каждой обязателен Endpoint, всего до 256). Ключи не зависят от регистра; комментарии начинаются с # или ;.
[Interface]PrivateKey = AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=Address = 10.0.0.2/32DNS = 1.1.1.1MTU = 1280Jc = 4Jmin = 40Jmax = 70
[Peer]PublicKey = AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=Endpoint = nl.example.com:51820AllowedIPs = 0.0.0.0/0, ::/0PersistentKeepalive = 25vpn:// (Amnezia)
Заголовок раздела «vpn:// (Amnezia)»vpn://<base64> — ссылка, которую экспортирует клиент Amnezia. mins читает контейнер AmneziaWG внутри (сжатый zlib JSON с 4-байтовым префиксом длины, до 16 МиБ), берёт вложенный last_config, подставляет dns1 и dns2 вместо $PRIMARY_DNS и $SECONDARY_DNS и использует description как имя сервера. Ссылка vpn:// без контейнера AmneziaWG отклоняется.
Ссылка «добавить подписку»
Заголовок раздела «Ссылка «добавить подписку»»Ссылка, которая запускает обычный сценарий «добавить подписку» для адреса. Принимаются три формы:
mins://add/https://sub.example.com/abc?token=1happ://add/https://sub.example.com/abc?token=1incy://add/https://sub.example.com/abc?token=1<url>берётся как написан, если начинается сhttp://илиhttps://. Иначе он один раз декодируется из процентного кодирования, поэтомуmins://add/https%3A%2F%2Fsub.example.com%2Fabcтоже работает.- Операционной системе зарегистрирована только схема
mins://(Android, iOS, macOS, Windows и Linux), поэтому из браузера или другого приложения приложение открывает толькоmins://. Ссылкиhapp://add/иincy://add/принимаются, когда пользователь вставляет их, сканирует как QR-код или открывает из файла. - Ссылка запускает тот же сценарий, что и вставка адреса: нужен HTTPS, обычный HTTP — только после подтверждения пользователем, затем подписка загружается и показывается в предпросмотре вместе с настройками, требующими подтверждения. Пользователь нажимает Подтвердить импорт. Тихого импорта не бывает.
- Для QR-кодов закодируйте ссылку
mins://add/...как текст QR.
Другие адреса mins://: mins://open лишь выводит приложение на передний план (его используют виджеты), а также ссылки маршрутизации ниже.
Ссылки маршрутизации
Заголовок раздела «Ссылки маршрутизации»| Ссылка | Действие |
|---|---|
mins://routing/add/<данные> |
Сохраняет профиль маршрутизации. |
mins://routing/onadd/<данные> |
Сохраняет и делает его активным профилем. |
mins://routing/off |
Выключает активный профиль маршрутизации. |
happ://routing/... и incy://routing/... с add или onadd принимаются так же, как и incy://autorouting/add|onadd/.... Они работают из буфера, QR-кода, вставленного текста, файла, заголовка routing или строки в теле подписки; системе зарегистрирована только схема mins://.
<данные> — одно из:
- base64 от JSON профиля маршрутизации (любой алфавит base64, с выравниванием или без). Как получить:
base64 -w0 profile.json | tr '+/' '-_' | tr -d '='. - адрес
https://в процентном кодировании. Приложение загружает профиль (без перенаправлений; 9 с на соединение, 20 с на получение) и показывает его в предпросмотре. Профили, добавленные по адресу, заново скачиваются при каждом запуске приложения, сохраняя имя. Любая другая схема, включаяhttp://, отклоняется: «Routing profile URL must use HTTPS».
mins://routing/onadd/https%3A%2F%2Fexample.com%2Frouting%2Fru.jsonmins://routing/add/eyJOYW1lIjoiRXhhbXBsZSIsIkdsb2JhbFByb3h5IjpmYWxzZX0mins://routing/offФормат профиля — в разделе Профили маршрутизации.
Кнопки Telegram и другие места только с HTTPS
Заголовок раздела «Кнопки Telegram и другие места только с HTTPS»Встроенные кнопки Telegram принимают только адреса https://, а не произвольные схемы, поэтому кнопка не может вести прямо на mins://add/.... Используйте переходник https://sr.minsclient.com: это статическая страница, которая сразу открывает mins с переданной ей ссылкой.
https://sr.minsclient.com/#add/https://sub.example.com/abcСсылка читается из фрагмента (часть после #). Браузеры никогда не отправляют фрагмент на сервер, поэтому адрес подписки, который обычно содержит токен пользователя, остаётся на устройстве.
| Вход | Значение |
|---|---|
https://sr.minsclient.com/#add/<url> |
Добавить подписку <url>. |
https://sr.minsclient.com/#mins://add/<url> |
То же, со схемой, записанной явно. |
https://sr.minsclient.com/#routing/add/<данные>, #routing/onadd/<данные>, #routing/off (допускается и ведущий mins://) |
Ссылки маршрутизации. |
https://sr.minsclient.com/?url=<ссылка mins в процентном кодировании> |
Запасной вариант для отправителей, которые отбрасывают фрагменты, например ?url=mins%3A%2F%2Fadd%2Fhttps%3A%2F%2Fsub.example.com%2Fabc. |
Принимаются только эти действия, а цель добавления должна быть https://. Всё остальное (другие схемы, javascript:, цели http://, ссылки длиннее 8 КиБ) отклоняется: страница сообщает, что это не ссылка mins, и никуда не переходит.
Что происходит с корректной ссылкой: страница сразу перенаправляет, передавая адрес подписки в процентном кодировании, поэтому символы вроде #, ; и & внутри него не теряются. На Android открывается адрес intent:// для приложения mins, а если mins не установлен, происходит переход на страницу загрузки https://minsclient.com/#download; на остальных системах открывается mins://.... Некоторые браузеры блокируют автоматический переход (встроенный браузер Telegram, iOS), поэтому страница дополнительно показывает крупную кнопку «Открыть в mins» и ссылку на скачивание. Язык страницы — русский или английский по языку браузера; внешние ресурсы не загружаются.
Сообщение Telegram Bot API со встроенной кнопкой (reply_markup):
{ "chat_id": 123456789, "text": "Ваша подписка готова.", "reply_markup": { "inline_keyboard": [ [ { "text": "Добавить в mins", "url": "https://sr.minsclient.com/#add/https://sub.example.com/abc" } ] ] }}Отправьте его на https://api.telegram.org/bot<токен>/sendMessage с Content-Type: application/json.
Что не поддерживается
Заголовок раздела «Что не поддерживается»| Что | Почему |
|---|---|
Зашифрованные ссылки happ://crypt... и incy://crypt... |
Отклоняются: «Encrypted Happ/INCY links are not supported». Отправляйте обычную ссылку или адрес подписки. |
Ссылки на серверы других протоколов (vmess://, trojan://, ss://, tuic://, …) |
Движок их не реализует. Ссылка остаётся неподдерживаемым сервером с причиной «Protocol X is not supported». |
hysteria2+realm:// |
«Hysteria realm is not supported». |
Транспорты VLESS http, h2, h3, quic |
Удалены в Xray; используйте XHTTP. |
| Форматы Clash и sing-box | Поддерживается только импорт конфигураций Xray. |
| Импорт без предпросмотра | Любая ссылка, QR-код и deep link заканчиваются экраном подтверждения. |
Системные ссылки с произвольными схемами, кроме mins:// |
Зарегистрирована только mins://, чтобы не конфликтовать с Happ или INCY, установленными на том же устройстве. |
Ссылки в заголовках подписки
Заголовок раздела «Ссылки в заголовках подписки»Заголовки-ссылки (support-url, announce-url и другие) принимают https://, а шесть из них — ещё и mins://; ссылка mins:// там открывает предпросмотр импорта и никогда не импортирует напрямую. См. Заголовки ответа.