For Providers
Branding and metadata for your subscription. Last updated: 15 August 2026.
Hammer Proxy reads everything from the response your subscription already returns — HTTP headers or lines in the body. There is nothing to register, no partner program, no API key. Add the fields below and your brand shows up in the app on the next refresh.
Three ways to send it
Pick whichever your panel supports. They can be mixed — and if the same field arrives twice, the HTTP header wins over the body.
1. HTTP response headers — recommended
Header names are case-insensitive. If your panel can't set arbitrary headers, profile-logo also has the alias x-logo-url, and profile-background has x-background-url. An alias is only used when the canonical header is absent.
2. Lines in the subscription body
When the subscription is a static file and headers aren't an option, put the fields in the body itself, one per line, in the form #key: value. This works inside a base64-encoded body too — Hammer decodes the body first, then looks for these lines.
Short names are accepted as well: #logo:, #background:, #provider:.
3. Import deep link
Branding travels with the link, so it is applied the moment the user taps it — before the first fetch. Useful for a "Add to Hammer" button on your site. All values must be percent-encoded.
Supported fields
Every field below is optional and independent. This list is exactly what the current app acts on — nothing here is aspirational.
Branding
| Field | What it does in the app |
|---|---|
profile-logox-logo-url | Your logo, as a round avatar next to the subscription name — in the server list and on the connect screen. |
profile-backgroundx-background-url | A full-screen backdrop behind the connect screen, rendered at 18% opacity over the map. |
profile-title | The subscription name shown everywhere in the app. This is the field to set — not provider-name. A name the user typed themselves always wins. |
provider-name | Fallback name, used only when there is no title at all. Supports a base64: prefix. |
Traffic, expiry, updates
| Field | What it does in the app |
|---|---|
subscription-userinfo | Usage bar and expiry date. Format: upload=N; download=N; total=N; expire=<unix>, bytes and a Unix timestamp. |
x-days-left | Days remaining, when you'd rather send a plain count than a date. |
profile-update-interval | How often the app re-fetches the subscription, in hours. |
change-user-agent | Tells the app which User-Agent to use for later fetches of this subscription. Remembered across refreshes. |
Messages to your users
| Field | What it does in the app |
|---|---|
announce | A dismissible banner above the server list. Supports a base64: prefix. |
sub-info-textsub-info-color | An info block on the subscription card, with an accent colour of your choice. |
sub-info-button-textsub-info-button-link | A button under that block — for a top-up or dashboard link. |
sub-expiresub-expire-button-link | Set sub-expire: true to show a renew button when the subscription runs out. |
support-url | A support link on the subscription card. |
Image requirements
| Logo | Background | |
|---|---|---|
| Shape | Square | Portrait (phone screen) |
| Recommended | 256×256 | 1170×2532 |
| Minimum | 128×128 | 750×1624 |
- PNG or JPEG only. SVG is not decoded — it will simply show nothing.
http://orhttps://only, and no larger than 6 MB.- The logo is cropped to a circle and fills the frame, so keep anything meaningful away from the corners.
- The background sits under the app's own interface at low opacity — pick something contrasty and free of fine detail or text.
Version your image filenames. Images are cached on the device permanently, keyed by URL, with no revalidation against your server. Replace the file at the same address and existing users keep seeing the old one. Go from logo-v1.png to logo-v2.png instead.
Checking it works
Confirm the headers actually reach the client:
If you're sending the fields in the body instead, check that each line starts with # and has a colon after the key. Then add the subscription in the app and pull the server list down to refresh — the logo appears next to the name.
Accepted but not shown yet. The app also parses brand-color, profile-web-page-url, new-url, new-domain, routing-*, fragment-*, subscription-autoconnect and ping-type, but does not act on them in the current release. Sending them is harmless and they will start working without any change on your side.
Questions
Something not behaving as described, or a field you'd like Hammer to support? Write to t.me/hammerclient.