44netclientRU

4net · iOS

Remnawave → 4net iOS

A practical reference for subscription response headers: account links, announcements, renewal reminders, appearance and server visibility.

Where to configure the headers

In Remnawave, open Subscription settings → Response headers. Add each header name and value separately. They must be present in the successful HTTP response that delivers the subscription, including its Xray JSON variant if that is served separately. They are response headers, not fields inside a node configuration.

After saving, refresh the subscription in 4net. The examples use fictional addresses: replace them with your own public provider pages. Keep existing headers needed by other clients.

Subscription, account and support

HTTP response headers
profile-title: Example VPN
profile-web-page-url: https://provider.example/account
support-url: https://provider.example/help
profile-update-interval: 6
announce: Service updates are available in your account.
HeaderValue and behavior
profile-titleSubscription name. Plain text or base64: followed by UTF-8 Base64. A name customized by the user is preserved.
subscription-userinfoupload, download and total in bytes; expire as a Unix timestamp in seconds. expire=0 clears the saved expiry. Missing or malformed expiry preserves the previous date.
profile-web-page-urlPrimary Account link. Displayed above provider support.
provider-web-page-urlAccount fallback if profile-web-page-url is absent or invalid. The primary header wins when both are valid.
support-urlProvider support link, independent of the chosen appearance.
announceProvider announcement: plain text or base64: UTF-8, up to 4096 decoded bytes. Supports plain text, Markdown, simple HTML and a banner. Full content opens on tap.
x-4net-announceAnnouncement specifically for 4net. Takes priority over announce. If absent, empty or invalid, announce is used. Both headers share the same format and limits.
profile-update-intervalWhole hours from 1 to 168. Refresh runs in the foreground with VPN disconnected; the user can turn it off. Failed attempts are at least 15 minutes apart.
Example with no expiry date
subscription-userinfo: upload=0; download=0; total=0; expire=0

For an expiring subscription, Remnawave should return the user's actual expire timestamp. Do not paste a fixed date into a shared header. The update interval is not a guaranteed background timer: an active VPN or an app in the background defers automatic refresh.

For Cyrillic or other non-ASCII text, send UTF-8 encoded as base64: followed by Base64. The HTTP response must contain the resulting text value, not an unresolved panel template.

A formatted announcement with a banner

Keep announce for your shared message and use x-4net-announce for richer content in 4net. Add this header in Remnawave; paste the following value into its value field.

x-4net-announce
rwEncodeBase64:<img src="https://cdn.provider.example/banner-v1.jpg" alt="Provider news">
<h2>Welcome to Example VPN</h2>
<p><strong>Stay connected.</strong> Choose a server and tap the power button.</p>
<p><a href="https://provider.example/news">Service news</a></p>

Replace the image and page addresses with your own. Remnawave converts rwEncodeBase64: into the encoded response header. In other subscription servers, use base64: followed by the Base64 encoding of your UTF-8 message. Each decoded announcement can contain up to 4096 bytes.

Use headings, paragraphs, bold and italic text, lists and links. Markdown is also supported. The first suitable image becomes the banner above the message. Account and support buttons use profile-web-page-url and support-url separately.

Markdown
![Provider news](https://cdn.provider.example/banner-v1.jpg)
**Welcome!**
- Choose a server
- Tap Connect
[Help](https://provider.example/help)

Use a public direct HTTPS image URL without redirects or login. PNG, JPEG and static WebP are supported: up to 512 KiB, 4096 pixels per side and 4 megapixels. A 1200×600 JPEG works well. To replace a cached banner immediately, change the filename or add ?v=2. Scripts, styles and embedded pages are not used.

Renewal reminder and information block

HTTP response headers
sub-expire: 1
sub-expire-button-link: https://provider.example/renew
sub-info-text: Service news and account information
sub-info-color: blue
sub-info-button-text: Details
sub-info-button-link: https://provider.example/news
HeaderValue and behavior
sub-expire1 or true enables the reminder. 0, false or no header disables it. A valid subscription expiry is required.
sub-expire-button-linkRenew button URL. Without a valid URL, the expiry text remains but the button is hidden.
sub-info-textInformation text: plain text or base64: UTF-8, up to 200 characters. 0 or no header removes this block after a successful refresh.
sub-info-colorblue, green or red. Unknown values use blue. The color highlights the icon while the text stays readable.
sub-info-button-textButton label, up to 25 characters; plain text or base64: UTF-8.
sub-info-button-linkButton URL. Both valid text and a valid URL are required.

The renewal reminder appears in the final 72 hours and after expiry, using expire from subscription-userinfo. The reminder window is three days. After renewal extends the expiry beyond three days and the subscription refreshes, the ordinary information block returns.

An active renewal reminder replaces only sub-info. The provider announcement, account and support links remain separate and available. These are messages inside the app, not push notifications. A Happ Provider ID is not required for these fields in 4net.

Local expiry notifications

HTTP response headers
notification-subs-expire: 1

Enable notifications with 1 or true and supply the actual expire date through subscription-userinfo. 4net asks the user for iOS notification permission. Reminders are scheduled three days before expiry, one day before and on the expiry date, at 10:00 local time. They are silent, with no app badge. Tapping a reminder opens the subscription.

Set 0 or false, or remove the header, then refresh the subscription to cancel its reminders. Renewal takes effect when the subscription refreshes. This setting controls system notifications independently from sub-expire, which controls the reminder inside the subscription card.

Provider name, logo and colors

Use x-4net-brand-name, x-4net-theme-light, x-4net-theme-dark and x-4net-logo-url for appearance. The name is separate from profile-title. The app's installed icon and App Store identity remain 4net.

iOS also reads aw-icon-light and aw-icon-dark: raw Base64 of the image, without a base64: or data: prefix. Prefer a small transparent PNG, for example 128×128. It arrives with the subscription and needs no separate image download. Include a brand name or palette to enable provider appearance; an icon alone does not select a global brand.

Logo priority: a valid image for the current theme → a valid image for the other theme → the HTTPS logo URL. One branded subscription applies automatically among ordinary subscriptions. With several brands, automatic mode follows the selected server's subscription; an explicit user choice takes precedence.

Palette values, image limits and full branding example →

Show different servers on Wi-Fi and mobile data

In Remnawave, open Hosts → the required host → Remark. Add the marker to the displayed name. For an Xray JSON group with alternatives, use the virtual host or group Remark that becomes the visible row, not an internal outbound tag.

Example host remarks
Netherlands only WiFi
Germany only Mobile
Sweden
  • only WiFi / only Wi-Fi: visible on Wi-Fi, hidden on cellular.
  • only Mobile: visible on cellular, hidden on Wi-Fi. LTE and 5G use the same marker.
  • Markers are case-insensitive. No marker, or both markers in one name, keeps the row visible on both networks.
  • Refresh the subscription once after editing names. Further network changes filter the existing list locally; groups remain one row and saved servers are not deleted.
  • The app defaults to By network type; Show all servers overrides it. A selected, active or pending-switch server remains visible. An unknown or ambiguous network shows all rows.
Disable filtering for this subscription
dont-use-filter: true

true or 1 disables filtering; false, 0 or no header permits normal filtering. A valid HTTP header takes precedence over a standalone dont-use-filter directive in a URI/Base64/YAML subscription body. The body directive can start with #. This exception does not mean other headers work as body directives.

4net routing preset and latency method

HTTP response headers
x-4net-routing: ru-bypass-v1
x-4net-ping: https

x-4net-routing: ru-bypass-v1 — uses the existing native Russia Country Bypass and rules mode before the next connection. Existing rule priorities remain in effect. It is not a complete Xray routing configuration or RoscomVPN DEFAULT.

x-4net-ping: tcp / x-4net-ping: https — chooses the latency method for this subscription. TCP checks the server port; it does not prove that internet access works. HTTPS checks a request through the proxy. For QUIC-only transports such as Hysteria2, use HTTPS.

These two headers are accepted only over HTTPS and only with the listed values. Unknown values are ignored independently. Use provider settings defaults on for each subscription, but the user can disable it. Personal routing and latency settings are preserved; without a supported provider setting, 4net uses the personal setting.

Refreshing a subscription does not reroute an active VPN session. A routing preset is fixed for the next session; headers never start a VPN connection themselves. TCP and HTTPS results are kept separately.

HWID is sent by the client

x-hwid is an outgoing subscription request header, not a response header to add in Remnawave. 4net sends a stored identifier for the provider origin on the first request and each refresh. The client recognizes provider device-limit errors; it does not rotate identifiers to bypass a limit. After reinstalling the app, you may need to remove its previous device entry at the provider.

The response signals x-hwid-active, x-hwid-not-supported, x-hwid-max-devices-reached and x-hwid-limit are handled by the importer. Account, support and renewal links do not automatically receive the subscription HWID.

Compatibility boundaries and refresh behavior

Generic routing, routing-enable, dns-from-json-enable, ping-type, proxy-type and check-url-via-proxy headers are not implemented by this iOS client. Use the exact x-4net-* preferences above. Other unsupported Happ options include fallback-url, hide-settings, premium-url, providerid, subscription-pin and subscriptions-collapse. Keeping them for other clients does not make 4net apply them.

Importing supported Xray JSON endpoints does not mean running Xray-core. Provider DNS, arbitrary routing, full balancing/observatory and Xray Mux are not applied. Native XHTTP XMUX is a separate supported feature.

On a successful refresh, missing appearance, icons, announcements, notices, account links and provider preferences are cleared. User opt-out and auto-update choices remain. A failed refresh preserves existing data. Missing traffic counters retain prior values; a missing or malformed expiry also retains the previous date, while explicit expire=0 clears it.

Account, support and notice URLs accept HTTP or HTTPS with a public hostname and the standard port (80 or 443). Do not include login credentials, fragments or local addresses. They open only after a user tap. A missing or invalid optional field must not be treated as a reason to change a working server configuration.

Apply your changes

  1. Save the headers in the general subscription settings or in the user’s external squad. An external squad overrides matching header names.
  2. Refresh the subscription with the circular arrow on its card. Its message, links and appearance update together.
  3. Open Provider message to read the full announcement and banner. Routing preferences take effect on the next connection.

4net guides for Android and iOS. Updated October 29, 2026.

Need help? →