For providers
This section is a reference for VPN and proxy providers and for panel developers. It describes everything mins reads from a subscription, exactly as the client implements it. You should not need to read the source to integrate.
mins has no servers and no accounts of its own. Everything the client knows about your service arrives in one HTTP response: the server list in the body and the settings in the response headers and in optional #key: value lines at the top of the body. Most of the keys that Happ and INCY panels send are understood.
Where each thing lives
Section titled “Where each thing lives”| You want to control | Mechanism | Page |
|---|---|---|
| The list of servers | Subscription body: link list, base64, Xray JSON | Subscription format |
| Subscription name, traffic, expiry, announcement, support links, update interval | Response headers (or #key: value lines) |
Response headers |
| How the client behaves for this subscription (ping, sort order, fragmentation, mux, mode, excluded routes) | Response headers; the sensitive ones wait for the user’s approval | Response headers |
| What the client sends to your panel (User-Agent, device identifier) | Request headers | Request headers |
| Name, description, flag, icon and ping of a single server | The mins block in the server’s Xray JSON |
The mins block |
| Server links, one-tap “add subscription” links, Telegram buttons | vless://, hysteria2://, wireguard://, vpn://, mins://add/, https://sr.minsclient.com/ |
Links and deep links |
| Routing rules and DNS for the subscription’s servers | A routing profile in the routing header, in the body or behind a link |
Routing profiles |
Ground rules
Section titled “Ground rules”- The user owns the client. Every value a subscription sets is listed on the subscription screen under Set by subscription, and the user can override each one or return to their own global setting. Providers cannot hide settings or controls.
- Sensitive settings need approval. Anything that changes how the device’s traffic is routed, DNS, startup or local listening ports is held as pending until the user taps Accept. A rejected value is not proposed again until your panel sends a different one. The full list is in Response headers.
- Layers. The effective value of a setting is the built-in default, then the user’s global setting, then the subscription’s value, then the user’s explicit override for that subscription. The last layer that is set wins.
- HTTPS first. Subscription URLs, links inside headers and routing URLs must be HTTPS. Plain HTTP subscription URLs work only after the user confirms.
- Nothing is imported silently. A subscription URL, a deep link, a QR code or pasted text always ends in a preview that the user confirms.
- Text is plain text. Names, announcements and descriptions are shown as plain text with fixed length limits. HTML and Markdown are not rendered.
- Unknown input is ignored, not fatal. An unknown header is skipped silently; a known header with an invalid value, or one mins refuses, is skipped and listed under Not applied with the reason; the rest of the subscription still imports.
What mins does not support
Section titled “What mins does not support”| Not supported | Why |
|---|---|
Hiding or locking client settings (hide-settings, hide-url, hide-check) |
The user owns the client; providers do not hide controls. |
Provider colors and themes (color-profile, banner-bg-color, banner-button-color) |
The application theme belongs to the user. The info card can only be red, blue or green through sub-info-color. |
Hiding the system VPN indicator (hide-vpn-icon) |
The system indicator cannot be hidden. |
sing-box configurations, including custom-tunnel-config, and Clash profiles |
Only Xray configuration imports are supported. A JSON with proxies or route is rejected with “Only Xray configuration imports are supported”. |
| VMess, Trojan, Shadowsocks and other protocols | Supported server protocols are VLESS, Hysteria2, WireGuard and AmneziaWG. Other links stay in the list marked unsupported with the reason “Protocol X is not supported”; a JSON server with another outbound protocol is marked “Unsupported protocols: …”. |
Encrypted Happ and INCY links (happ://crypt..., incy://crypt...) |
Rejected with “Encrypted Happ/INCY links are not supported”. Send ordinary links or a subscription URL. |
| Silent or one-tap import without a preview | Every import ends in a preview that the user confirms. |
| An alternative HWID format, Xray memory-limit controls | Not documented upstream, and not applicable to this engine. |
The complete list of rejected response headers with their reasons is in Response headers.
Minimal compatible response
Section titled “Minimal compatible response”HTTP/1.1 200 OKContent-Type: text/plain; charset=utf-8profile-title: Example VPNprofile-update-interval: 12subscription-userinfo: upload=0; download=1073741824; total=107374182400; expire=1798761600
vless://11111111-1111-4111-8111-111111111111@fi.example.com:443?type=ws&security=tls&sni=fi.example.com&path=%2Fws&host=fi.example.com#FinlandA complete example with every common header is on the Response headers page.