Здесь описано, что приложение UXway читает из вашей подписки и что пользователь может настроить в приложении. Описано только то, что работает для любой панели и любого пользователя.
Главный экранПодключение, подписка и список серверов.Добавление подпискиСсылка, QR-код или буфер обмена.НастройкиПодключение, журналы и автоподключение.Выбор языкаЯзык интерфейса приложения.
iPad
Главный экранПодключение, подписка и список серверов.Добавление подпискиСсылка, QR-код или буфер обмена.НастройкиПодключение, журналы и автоподключение.Выбор языкаЯзык интерфейса приложения.
Для владельцев панелей
Как приложение загружает подписку
Запрос подписки
Пользователь добавляет подписку по URL. Приложение отправляет GET-запрос с таким User-Agent:
Сначала приложение пробует формат JSON. Оно добавляет /json в конец URL и запрашивает его. Если ответ — JSON-конфиг или JSON-массив, приложение берёт его. Иначе запрашивает исходный URL. Приложение не добавляет /json, если в URL есть ? или # или последний сегмент пути уже название формата (json, v2ray-json, xray, v2ray, clash, clash-meta, mihomo, singbox, sing-box).
Несколько подписок
В приложении может быть несколько подписок. Новая подписка добавляется к остальным и сразу становится активной. Если добавить ссылку, которая уже есть в приложении, существующая подписка обновится, копия не появится.
Активна всегда одна подписка: к ней относятся подключение, виджеты, ТВ, geo-файлы, баннер announce, вкладки «Тариф» и «Чат». На главном экране у каждой подписки своя карточка. Пользователь выбирает сервер в любой карточке, и эта подписка становится активной.
Для владельцев панелей
Заголовки подписки
Все заголовки необязательны. Регистр в названиях заголовков не важен.
Поддерживаемые заголовки
Заголовок
Значение
Что делает приложение
Profile-Title
Текст или base64: + текст в Base64
Название подписки. Без заголовка приложение показывает хост из URL.
Израсходованный трафик (upload + download), остаток трафика и дата окончания. total=0 или нет total: тариф показан как безлимитный. Нет expire: подписка показана как бессрочная.
Profile-Update-Interval
Целое число часов
Приложение обновляет подписку при запуске, если этот срок прошёл. По умолчанию 12 часов.
announce
Текст или base64: + текст в Base64
Баннер на главном экране под кнопкой подключения. Для переносов строк и эмодзи используйте base64:.
routing
happ://routing/onadd/<base64 JSON>
Приложение берёт из него только адреса geo-файлов. См. Geo-файлы.
Support-Url
URL
Кнопка поддержки на карточке подписки.
Profile-Web-Page-Url
URL
Пункт «открыть страницу» у подписки. У активной подписки появляется вкладка «Тариф» с данными из заголовков и кнопкой перехода на эту страницу.
Expiry-Banner-Button-Url
URL
Кнопка оплаты на карточке подписки. Видна, только если до окончания меньше 3 дней или подписка истекла. Нужен expire в Subscription-Userinfo.
Значение — профиль маршрутизации Happ: happ://routing/onadd/<base64 JSON>. Префикс happ://routing/add/ тоже работает. Base64 может быть обычным или URL-safe, с выравниванием = или без него.
Приложение читает из JSON два ключа. Регистр ключей не важен.
Приложение скачивает эти файлы и хранит их рядом со своими geo-файлами. Свои файлы оно не заменяет.
У каждой подписки свои geo-файлы. При переключении подписок файлы заново не скачиваются. Файлы удаляются вместе с подпиской.
Файлы применяются к JSON-конфигам (RAW_JSON). Правило geoip:<код> или geosite:<код> берёт ваш файл, если в нём есть этот код.
Остальные поля профиля маршрутизации (правила, DNS и другие) приложение не применяет. Правила маршрутизации передавайте в JSON-конфиге.
Для владельцев панелей
Поддерживаемые конфиги и протоколы
Форматы тела ответа
Формат
Как приложение его определяет
Список ссылок в Base64
Не JSON и нет :// до декодирования. Обычный и URL-safe Base64, переносы строк допустимы.
Список ссылок без кодирования
Одна ссылка на строку.
JSON-конфиг
Тело начинается с {. Полный конфиг xray с outbounds.
JSON-массив
Тело начинается с [. Массив полных конфигов xray или массив outbounds.
В списке ссылок приложение пропускает строку, которую не может прочитать, и оставляет остальные серверы. Повторяющиеся ссылки удаляются. После импорта выбран первый сервер.
Ссылки на серверы
Протокол
Схема
VLESS
vless://
VMess
vmess:// (JSON в Base64, формат v2rayN)
Trojan
trojan://
Shadowsocks
ss:// (SIP002, данные входа открытым текстом или в Base64; старая форма целиком в Base64)
Hysteria2
hysteria2://, hy2://
Текст после # — название сервера.
Параметры ссылки, которые читает приложение (VLESS и Trojan):
Параметр
Значение
type или network
Транспорт (см. ниже)
security
tls, reality, none. По умолчанию у VLESS — none, у Trojan — tls. xtls читается как tls.
Проверка сертификата по имени (verifyPeerCertByName)
pbk, sid, spx
Публичный ключ, short ID и spiderX для REALITY
flow, encryption
Поля пользователя VLESS. encryption по умолчанию none.
path, host
Путь и хост для ws, httpupgrade, xhttp, splithttp, tcp с HTTP-заголовком
mode
Режим xhttp и splithttp (по умолчанию auto); multi для gRPC
serviceName
Имя сервиса gRPC (если нет — берётся path)
authority
authority для gRPC
headerType
Тип заголовка для tcp и kcp
seed
seed для mKCP
Hysteria2 читает sni (по умолчанию адрес сервера), alpn (по умолчанию h3), pcs или pinSHA256, vcn. Параметры obfs у Hysteria2 не читаются. plugin у Shadowsocks не читается.
Транспорты: tcp (также raw), ws, httpupgrade, grpc (также gun), xhttp, splithttp, kcp (также mkcp).
Удалено из ядра. xray-core больше не поддерживает некоторые поля. Весь конфиг на них падает.
Ссылка с транспортом h2, h3, http, http2 или quic пропускается при импорте.
Параметры ссылки allowInsecure и insecure игнорируются. Для самоподписанного сертификата используйте pcs или vcn.
JSON-конфиг не переписывается. JSON-конфиг с этими полями не подключится.
JSON-конфиги (RAW_JSON)
Прокси-outbound — это outbound с тегом proxy или с протоколом vless, vmess, trojan, shadowsocks, hysteria или hysteria2.
Название сервера: remarks конфига, иначе тег outbound (если он не proxy).
В JSON-массиве каждый элемент читается отдельно. Один плохой элемент не убирает остальные.
Если в конфиге есть burstObservatory.pingConfig.destination, приложение меряет пинг по этому URL.
Ваш JSON главнее. Если в конфиге есть routing (правила или балансировщики), приложение не добавляет свою маршрутизацию. Если в конфиге есть dns, приложение не добавляет свой DNS. Исключения:
Пользователь выбрал свой DoH или DoT. Приложение заменяет секцию dns и добавляет правила для DNS. Ваши правила маршрутизации и балансировщики остаются.
Код geoip: или geosite:, которого нет ни в одном geo-файле, удаляется из правил. Без этого xray отклоняет весь конфиг.
Коды, которые есть в ваших geo-файлах (из заголовка routing), указывают на ваши файлы.
Для владельцев панелей
Ссылки и диплинки
Добавление подписки
Пользователь может:
вставить ссылку в окне «Добавить подписку»;
отсканировать QR-код со ссылкой;
открыть диплинк.
Окно принимает URL подписки (https:// или http://) или одну ссылку на сервер из таблицы выше. Ссылка на сервер становится подпиской с одним сервером.
Диплинк
uxway://add/<payload>
<payload> — одно из:
URL подписки в URL-кодировке: uxway://add/https%3A%2F%2Fexample.com%2Fsub%2Fabc
URL подписки без кодирования: uxway://add/https://example.com/sub/abc
URL в Base64 (обычный или URL-safe, = необязательны): uxway://add/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJj
ссылка vless://, vmess://, trojan:// или ss://, открытым текстом или в Base64
Ссылки Hysteria2 в диплинке не работают. Их можно вставить или отсканировать QR-кодом. Текст после # в диплинке игнорируется. Диплинк открывает окно «Добавить подписку» с заполненной ссылкой. Пользователь подтверждает.
Трафик в частные диапазоны идёт напрямую: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16, 100.64.0.0/10, ::1/128, fc00::/7, fe80::/10.
Российские сайты
geoip:ru идёт напрямую. Нужны geo-базы.
По умолчанию оба выключены, весь трафик идёт через VPN. На JSON-конфиг со своей маршрутизацией эти переключатели не действуют.
Приложения (только Android). Выбранные приложения идут мимо VPN, или через VPN идут только выбранные. Это делает система Android, поэтому настройка действует и на JSON-конфиг. Пресет «Российские приложения» одним касанием добавляет установленные банки, госуслуги, маркетплейсы и приложения операторов.
DNS
Вариант
Сервер
Cloudflare (по умолчанию)
1.1.1.1
Google
8.8.8.8
Quad9
9.9.9.9
AdGuard
94.140.14.14
Свой
См. ниже
Свой DNS принимает:
IPv4: 1.1.1.1
DoH: https://<хост>[:порт]/<путь>, например https://dns.google/dns-query. Порт по умолчанию 443. Путь обязателен.
DoT: tls://<хост>[:порт] или dot://<хост>[:порт], например tls://dns.quad9.net. Порт по умолчанию 853. Без пути.
Обычный IP-сервер не действует на JSON-конфиг со своим dns. DoH или DoT действует на любой конфиг.
Дополнительно
Переключатель
По умолчанию
Что делает
Определение протокола
Вкл
Sniffing: приложение берёт домен из трафика, чтобы работали правила по доменам.
IPv6
Выкл
Экспериментально. Предпочитать IPv6.
Для владельцев панелей
Опции и ограничения
Что учитывать при подключении
Несколько подписок, активна одна. Новая добавляется к остальным.
Обновление: при запуске, если прошёл Profile-Update-Interval (по умолчанию 12 часов).
Кнопка оплаты видна только за 3 дня до expire и после него.
total=0: тариф показан как безлимитный, виден только израсходованный трафик.
Geo-файлы подписки: только https://; используются JSON-конфигами.
Не поддерживается: транспорты h2/h3/http/quic, allowInsecure, obfs у Hysteria2, плагины Shadowsocks, ссылки Hysteria2 в диплинке, правила маршрутизации из заголовка routing.
For panel owners
UXway for panel owners
This guide tells you what the UXway app reads from your subscription and what a user can change in the app. It covers only what works for every panel and every user.
Home screenConnection, subscription and server list.Add a subscriptionURL, QR code or clipboard.SettingsConnection, logs and auto-connect.LanguageChoose the app interface language.
iPad
Home screenConnection, subscription and server list.Add a subscriptionURL, QR code or clipboard.SettingsConnection, logs and auto-connect.LanguageChoose the app interface language.
For panel owners
How the app fetches a subscription
Subscription request
The user adds a subscription by URL. The app sends a GET request with this User-Agent:
User-Agent: UXway/<device name>/<app version>
JSON priority
The app tries the JSON format first. It adds /json to the end of the URL and requests it. If that response is a JSON config or a JSON array, the app uses it. Otherwise it requests the original URL. The app does not add /json when the URL has ? or #, or when its last path segment is already a format name (json, v2ray-json, xray, v2ray, clash, clash-meta, mihomo, singbox, sing-box).
Several subscriptions
The app can keep several subscriptions. A new subscription is added next to the others and becomes active. Adding a link that is already in the app refreshes that subscription; no copy appears.
One subscription is active at a time. The connection, widgets, TV, geo files, the announce banner and the Tariff and Chat tabs use it. Home shows a card per subscription. Selecting a server in any card makes that subscription active.
For panel owners
Subscription headers
All headers are optional. Header names are case-insensitive.
Supported headers
Header
Value
What the app does
Profile-Title
Text, or base64: + Base64 text
The subscription name. Without it, the app shows the host of the URL.
Traffic used (upload + download), traffic left, and the expiry date. total=0 or no total: the app shows the plan as unlimited. No expire: the app shows the subscription as never expiring.
Profile-Update-Interval
Whole number of hours
The app refreshes the subscription at start when this time has passed. Default: 12 hours.
announce
Text, or base64: + Base64 text
A banner on the main screen, under the connect button. Use base64: for line breaks and emoji.
routing
happ://routing/onadd/<base64 JSON>
The app reads only the geo file URLs from it. See Geo files.
Support-Url
URL
A support button on the subscription card.
Profile-Web-Page-Url
URL
An "open page" item for the subscription. The active subscription gets the Tariff tab with data from the headers and a button that opens this page.
Expiry-Banner-Button-Url
URL
A pay button on the subscription card. It shows only when the subscription expires in less than 3 days or has expired. It needs expire in Subscription-Userinfo.
The value is a Happ routing profile: happ://routing/onadd/<base64 JSON>. The prefix happ://routing/add/ also works. Base64 can be standard or URL-safe, with or without padding.
The app reads two keys from the JSON. Key case does not matter.
The app downloads these files and keeps them next to its own geo files. It does not replace its own files.
Each subscription keeps its own geo files. Switching subscriptions downloads nothing again. The files are deleted with the subscription.
The files apply to JSON configs (RAW_JSON). A geoip:<code> or geosite:<code> rule uses your file when your file has that code.
The app does not apply the other routing profile fields (rules, DNS, and so on). Put routing rules in a JSON config.
For panel owners
Supported configs and protocols
Response body formats
Format
How the app detects it
Base64 list of links
Not JSON and has no :// before decoding. Standard and URL-safe Base64, line breaks allowed.
Plain list of links
One link per line.
JSON config
The body starts with {. A full xray config with outbounds.
JSON array
The body starts with [. An array of full xray configs, or an array of outbounds.
In a link list, the app skips a line it cannot read and keeps the other servers. Duplicate links are removed. The first server is selected after import.
Share links
Protocol
Scheme
VLESS
vless://
VMess
vmess:// (Base64 JSON, v2rayN format)
Trojan
trojan://
Shadowsocks
ss:// (SIP002, plain or Base64 credentials; legacy full-Base64 form)
Hysteria2
hysteria2://, hy2://
The text after # is the server name.
Link parameters the app reads (VLESS and Trojan):
Parameter
Meaning
type or network
Transport (see below)
security
tls, reality, none. VLESS default: none. Trojan default: tls. xtls is read as tls.
sni, then peer, then host
TLS server name
alpn
Comma-separated list
fp
TLS fingerprint
pcs
Pinned certificate SHA-256 (pinnedPeerCertSha256)
vcn
Verify certificate by name (verifyPeerCertByName)
pbk, sid, spx
REALITY public key, short ID, spiderX
flow, encryption
VLESS user fields. encryption default: none.
path, host
Path and host for ws, httpupgrade, xhttp, splithttp, tcp with HTTP header
mode
xhttp and splithttp mode (default auto); gRPC multi
serviceName
gRPC service name (falls back to path)
authority
gRPC authority
headerType
tcp and kcp header type
seed
mKCP seed
Hysteria2 reads sni (default: server address), alpn (default h3), pcs or pinSHA256, vcn. Hysteria2 obfs parameters are not read. Shadowsocks plugin is not read.
Removed by the core. xray-core no longer supports some fields. The whole config fails on them.
A link with transport h2, h3, http, http2 or quic is skipped at import.
allowInsecure and insecure link parameters are ignored. For a self-signed certificate, use pcs or vcn.
A JSON config is not rewritten. A JSON config with these fields fails to connect.
JSON configs (RAW_JSON)
A proxy outbound has the tag proxy or the protocol vless, vmess, trojan, shadowsocks, hysteria or hysteria2.
Server name: the config's remarks, else the outbound tag (when it is not proxy).
In a JSON array, each element is read alone. One bad element does not drop the others.
If the config has burstObservatory.pingConfig.destination, the app uses that URL to measure ping.
Your JSON wins. When the config has routing (rules or balancers), the app adds no routing of its own. When the config has dns, the app adds no DNS of its own. The exceptions:
The user chose a custom DoH or DoT server. The app replaces the dns section and adds DNS rules. Your routing rules and balancers stay.
A geoip: or geosite: code that no geo file has is removed from the rules. Without this, xray rejects the whole config.
Codes found in your geo files (from the routing header) point to your files.
For panel owners
Links and deeplinks
Add a subscription
The user can:
paste a link in the "Add subscription" sheet;
scan a QR code with the link;
open a deeplink.
The sheet accepts a subscription URL (https:// or http://) or one share link from the table above. A share link becomes a subscription with one server.
Deeplink
uxway://add/<payload>
<payload> is one of these:
a URL-encoded subscription URL: uxway://add/https%3A%2F%2Fexample.com%2Fsub%2Fabc
a plain subscription URL: uxway://add/https://example.com/sub/abc
Base64 of the URL (standard or URL-safe, padding optional): uxway://add/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJj
a vless://, vmess://, trojan:// or ss:// link, plain or in Base64
Hysteria2 links do not work in a deeplink. Paste them or use a QR code. The text after # in the deeplink is ignored. The deeplink opens the "Add subscription" sheet with the link filled in. The user confirms.
Default: both off, all traffic goes through the VPN. These switches do not apply to a JSON config with its own routing.
Apps (Android only). Selected apps bypass the VPN, or only selected apps go through it. Android itself does this, so the setting also applies to a JSON config. The "Russian apps" preset adds installed banks, government services, marketplaces and carrier apps in one tap.
DNS
Choice
Server
Cloudflare (default)
1.1.1.1
Google
8.8.8.8
Quad9
9.9.9.9
AdGuard
94.140.14.14
Custom
See below
Custom DNS accepts:
IPv4: 1.1.1.1
DoH: https://<host>[:port]/<path>, for example https://dns.google/dns-query. Default port 443. The path is required.
DoT: tls://<host>[:port] or dot://<host>[:port], for example tls://dns.quad9.net. Default port 853. No path.
A plain IP server does not apply to a JSON config with its own dns. A DoH or DoT server applies to every config.
Advanced
Switch
Default
What it does
Protocol detection
On
Sniffing: the app reads the domain from traffic so that domain rules work.
IPv6
Off
Experimental. Prefer IPv6.
For panel owners
Options and limits
Before you connect
Several subscriptions, one active. A new one is added next to the others.
Refresh: at app start, when Profile-Update-Interval (default 12 hours) has passed.
The pay button shows only in the last 3 days before expire and after it.
total=0: the plan shows as unlimited, with used traffic only.
Subscription geo files: https:// only; used by JSON configs.
Not supported: transports h2/h3/http/quic, allowInsecure, Hysteria2 obfs, Shadowsocks plugins, Hysteria2 links in deeplinks, routing rules from the routing header.