Для владельцев панелей
UXway для владельцев панелей
Здесь описано, что приложение UXway читает из вашей подписки и что пользователь может настроить в приложении. Описано только то, что работает для любой панели и любого пользователя.
Для владельцев панелей
Здесь описано, что приложение UXway читает из вашей подписки и что пользователь может настроить в приложении. Описано только то, что работает для любой панели и любого пользователя.
Для владельцев панелей
Пользователь добавляет подписку по URL. Приложение отправляет GET-запрос с таким User-Agent:
User-Agent: UXway/<имя устройства>/<версия приложения>
Сначала приложение пробует формат JSON. Оно добавляет /json в конец URL и запрашивает его. Если ответ — JSON-конфиг или JSON-массив, приложение берёт его. Иначе запрашивает исходный URL. Приложение не добавляет /json, если в URL есть ? или # или последний сегмент пути уже название формата (json, v2ray-json, xray, v2ray, clash, clash-meta, mihomo, singbox, sing-box).
В приложении одна подписка. Новая подписка заменяет старую. Если в новой подписке нет ни одного сервера, старая остаётся.
Для владельцев панелей
Все заголовки необязательны. Регистр в названиях заголовков не важен.
| Заголовок | Значение | Что делает приложение |
|---|---|---|
Profile-Title | Текст или base64: + текст в Base64 | Название подписки. Без заголовка приложение показывает хост из URL. |
Subscription-Userinfo | upload=<байты>; download=<байты>; total=<байты>; expire=<unix-секунды> | Израсходованный трафик (upload + download), остаток трафика и дата окончания. total=0 или нет total: тариф показан как безлимитный. |
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. |
Profile-Title: base64:TXkgVlBO
Subscription-Userinfo: upload=1073741824; download=5368709120; total=107374182400; expire=1798761600
Profile-Update-Interval: 6
announce: base64:8J+OgSBOZXcgc2VydmVycyBpbiBGaW5sYW5k
Support-Url: https://t.me/your_support
Profile-Web-Page-Url: https://example.com/account
Expiry-Banner-Button-Url: https://example.com/pay
routing: happ://routing/onadd/eyJHZW9pcHVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZ2VvaXAuZGF0IiwiR2Vvc2l0ZXVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZ2Vvc2l0ZS5kYXQifQ
routing)Значение — профиль маршрутизации Happ: happ://routing/onadd/<base64 JSON>. Префикс happ://routing/add/ тоже работает. Base64 может быть обычным или URL-safe, с выравниванием = или без него.
Приложение читает из JSON два ключа. Регистр ключей не важен.
{
"Geoipurl": "https://example.com/geoip.dat",
"Geositeurl": "https://example.com/geosite.dat"
}
https://.geoip:<код> или geosite:<код> берёт ваш файл, если в нём есть этот код.Для владельцев панелей
| Формат | Как приложение его определяет |
|---|---|
| Список ссылок в 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. |
sni, затем peer, затем host | Имя сервера для TLS |
alpn | Список через запятую |
fp | Отпечаток TLS |
pcs | SHA-256 закреплённого сертификата (pinnedPeerCertSha256) |
vcn | Проверка сертификата по имени (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.proxy или с протоколом vless, vmess, trojan, shadowsocks, hysteria или hysteria2.remarks конфига, иначе тег outbound (если он не proxy).burstObservatory.pingConfig.destination, приложение меряет пинг по этому URL.Ваш JSON главнее. Если в конфиге есть routing (правила или балансировщики), приложение не добавляет свою маршрутизацию. Если в конфиге есть dns, приложение не добавляет свой DNS. Исключения:
dns и добавляет правила для DNS. Ваши правила маршрутизации и балансировщики остаются.geoip: или geosite:, которого нет ни в одном geo-файле, удаляется из правил. Без этого xray отклоняет весь конфиг.routing), указывают на ваши файлы.Для владельцев панелей
Пользователь может:
Окно принимает URL подписки (https:// или http://) или одну ссылку на сервер из таблицы выше. Ссылка на сервер становится подпиской с одним сервером.
uxway://add/<payload>
<payload> — одно из:
uxway://add/https%3A%2F%2Fexample.com%2Fsub%2Fabcuxway://add/https://example.com/sub/abc= необязательны): uxway://add/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJjvless://, vmess://, trojan:// или ss://, открытым текстом или в Base64Ссылки Hysteria2 в диплинке не работают. Их можно вставить или отсканировать QR-кодом. Текст после # в диплинке игнорируется. Диплинк открывает окно «Добавить подписку» с заполненной ссылкой. Пользователь подтверждает.
Если приложение не установлено, отправьте пользователя на https://get.uxway.app.
Для владельцев панелей
Настройки → Подключение.
| Переключатель | Что делает |
|---|---|
| Локальная сеть | Трафик в частные диапазоны идёт напрямую: 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-конфиг со своей маршрутизацией эти переключатели не действуют.
| Вариант | Сервер |
|---|---|
| Cloudflare (по умолчанию) | 1.1.1.1 |
8.8.8.8 | |
| Quad9 | 9.9.9.9 |
| AdGuard | 94.140.14.14 |
| Свой | См. ниже |
Свой DNS принимает:
1.1.1.1https://<хост>[:порт]/<путь>, например https://dns.google/dns-query. Порт по умолчанию 443. Путь обязателен.tls://<хост>[:порт] или dot://<хост>[:порт], например tls://dns.quad9.net. Порт по умолчанию 853. Без пути.Обычный IP-сервер не действует на JSON-конфиг со своим dns. DoH или DoT действует на любой конфиг.
| Переключатель | По умолчанию | Что делает |
|---|---|---|
| Определение протокола | Вкл | Sniffing: приложение берёт домен из трафика, чтобы работали правила по доменам. |
| IPv6 | Выкл | Экспериментально. Предпочитать IPv6. |
Для владельцев панелей
Profile-Update-Interval (по умолчанию 12 часов).expire и после него.total=0: тариф показан как безлимитный, виден только израсходованный трафик.https://; используются JSON-конфигами.h2/h3/http/quic, allowInsecure, obfs у Hysteria2, плагины Shadowsocks, ссылки Hysteria2 в диплинке, правила маршрутизации из заголовка routing.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.
For panel owners
The user adds a subscription by URL. The app sends a GET request with this User-Agent:
User-Agent: UXway/<device name>/<app version>
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).
The app keeps one subscription. A new subscription replaces the old one. If the new subscription gives no servers, the old one stays.
For panel owners
All headers are optional. Header names are case-insensitive.
| 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. |
Subscription-Userinfo | upload=<bytes>; download=<bytes>; total=<bytes>; expire=<unix seconds> | Traffic used (upload + download), traffic left, and the expiry date. total=0 or no total: the app shows the plan as unlimited. |
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. |
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. |
Profile-Title: base64:TXkgVlBO
Subscription-Userinfo: upload=1073741824; download=5368709120; total=107374182400; expire=1798761600
Profile-Update-Interval: 6
announce: base64:8J+OgSBOZXcgc2VydmVycyBpbiBGaW5sYW5k
Support-Url: https://t.me/your_support
Profile-Web-Page-Url: https://example.com/account
Expiry-Banner-Button-Url: https://example.com/pay
routing: happ://routing/onadd/eyJHZW9pcHVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZ2VvaXAuZGF0IiwiR2Vvc2l0ZXVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZ2Vvc2l0ZS5kYXQifQ
routing header)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.
{
"Geoipurl": "https://example.com/geoip.dat",
"Geositeurl": "https://example.com/geosite.dat"
}
https:// URLs are accepted.geoip:<code> or geosite:<code> rule uses your file when your file has that code.For panel owners
| 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.
| 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.
Transports: tcp (also raw), ws, httpupgrade, grpc (also gun), xhttp, splithttp, kcp (also mkcp).
Removed by the core. xray-core no longer supports some fields. The whole config fails on them.
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.proxy or the protocol vless, vmess, trojan, shadowsocks, hysteria or hysteria2.remarks, else the outbound tag (when it is not proxy).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:
dns section and adds DNS rules. Your routing rules and balancers stay.geoip: or geosite: code that no geo file has is removed from the rules. Without this, xray rejects the whole config.routing header) point to your files.For panel owners
The user can:
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.
uxway://add/<payload>
<payload> is one of these:
uxway://add/https%3A%2F%2Fexample.com%2Fsub%2Fabcuxway://add/https://example.com/sub/abcuxway://add/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJjvless://, vmess://, trojan:// or ss:// link, plain or in Base64Hysteria2 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.
If the app is not installed, send the user to https://get.uxway.app.
For panel owners
Settings → Connection.
| Switch | What it does |
|---|---|
| Local network | Traffic to private ranges goes direct: 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. |
| Russian websites | geoip:ru goes direct. It needs the geo databases. |
Default: both off, all traffic goes through the VPN. These switches do not apply to a JSON config with its own routing.
| Choice | Server |
|---|---|
| Cloudflare (default) | 1.1.1.1 |
8.8.8.8 | |
| Quad9 | 9.9.9.9 |
| AdGuard | 94.140.14.14 |
| Custom | See below |
Custom DNS accepts:
1.1.1.1https://<host>[:port]/<path>, for example https://dns.google/dns-query. Default port 443. The path is required.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.
| 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
Profile-Update-Interval (default 12 hours) has passed.expire and after it.total=0: the plan shows as unlimited, with used traffic only.https:// only; used by JSON configs.h2/h3/http/quic, allowInsecure, Hysteria2 obfs, Shadowsocks plugins, Hysteria2 links in deeplinks, routing rules from the routing header.