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

profile-title: Example VPN profile-logo: https://cdn.example.org/brand/logo-v1.png profile-background: https://cdn.example.org/brand/bg-v1.jpg subscription-userinfo: upload=0; download=32212254720; total=161061273600; expire=1793491200 profile-update-interval: 12

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.

#profile-title: Example VPN #profile-logo: https://cdn.example.org/brand/logo-v1.png #profile-background: https://cdn.example.org/brand/bg-v1.jpg #announce: Maintenance on Sunday 02:00 UTC

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.

hammer://sub?url=<subscription-url>&logo=<url>&bg=<url>&name=<provider>

Supported fields

Every field below is optional and independent. This list is exactly what the current app acts on — nothing here is aspirational.

Branding

FieldWhat it does in the app
profile-logo
x-logo-url
Your logo, as a round avatar next to the subscription name — in the server list and on the connect screen.
profile-background
x-background-url
A full-screen backdrop behind the connect screen, rendered at 18% opacity over the map.
profile-titleThe 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-nameFallback name, used only when there is no title at all. Supports a base64: prefix.

Traffic, expiry, updates

FieldWhat it does in the app
subscription-userinfoUsage bar and expiry date. Format: upload=N; download=N; total=N; expire=<unix>, bytes and a Unix timestamp.
x-days-leftDays remaining, when you'd rather send a plain count than a date.
profile-update-intervalHow often the app re-fetches the subscription, in hours.
change-user-agentTells the app which User-Agent to use for later fetches of this subscription. Remembered across refreshes.

Messages to your users

FieldWhat it does in the app
announceA dismissible banner above the server list. Supports a base64: prefix.
sub-info-text
sub-info-color
An info block on the subscription card, with an accent colour of your choice.
sub-info-button-text
sub-info-button-link
A button under that block — for a top-up or dashboard link.
sub-expire
sub-expire-button-link
Set sub-expire: true to show a renew button when the subscription runs out.
support-urlA support link on the subscription card.

Image requirements

LogoBackground
ShapeSquarePortrait (phone screen)
Recommended256×2561170×2532
Minimum128×128750×1624

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:

curl -sI 'https://your-panel.example/sub/<token>' | grep -i -E 'profile-|x-logo|x-background|subscription-userinfo'

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.