Open Source|All improvements go through Pull Requests with automated CI checks before review by@Leo-Galli|Join Discord|Contributing guide
Whitelabel API

Whitelabel — API and configuration

Endpoints, email templates, custom domains and configuration reference.

Read active configuration

GET /api/whitelabel?organization=<slug>

Response:

{
  "organization": "aetheris",
  "config": {
    "brand": { "name": "Aetheris", "tagline": "..." },
    "theme": { "accent": "emerald" },
    "navigation": [],
    "emailTemplates": {},
    "modules": {}
  },
  "cache": "redis"
}

Update configuration (admin)

PUT /api/whitelabel
Authorization: Bearer <admin-jwt>
Content-Type: application/json

Writes PostgreSQL and invalidates Redis cache.

Configuration reference

{
  "brand": {
    "name": "Aetheris",
    "tagline": "Billing and virtualization control panel",
    "logoUrl": "https://cdn.example.com/logo.svg",
    "domain": "aetheris-web.vercel.app"
  },
  "theme": {
    "accent": "emerald",
    "borderRadius": "0.75rem",
    "fontFamily": "Inter, system-ui, sans-serif"
  },
  "navigation": [
    { "label": "Product", "href": "#product" },
    { "label": "Live demo", "href": "/demo", "cta": true }
  ],
  "emailTemplates": {
    "invoice.created": {
      "subject": "Your invoice {{invoice_number}} from {{brand_name}}",
      "body": "Hello,\nyour invoice of {{amount}} is due on {{due_date}}."
    }
  },
  "modules": {
    "billing": true,
    "vncConsole": true,
    "pterodactyl": true
  }
}

Email templates

KeyTriggerVariables
invoice.createdInvoice generatedinvoice_number, amount, due_date, brand_name
invoice.paidPayment succeededinvoice_number, amount, transaction_id
invoice.dunningPayment retryinvoice_number, attempt, next_attempt
server.suspendedDunning exhaustedserver_name, brand_name, support_url
server.provisionedServer readyserver_name, ipv4, console_url
account.welcomeAccount createdaccount_email, brand_name, portal_url

Variables use {{double_braces}} and are HTML-escaped.

Custom domains

  1. Set Organization.customDomain in the Admin Panel.
  2. Point DNS: CNAME panel.mybrand.com → panel.aetheris-web.vercel.app.
  3. Route by Host header in your reverse proxy.

The whitelabel endpoint resolves the tenant by domain automatically.

Cache

  • Redis TTL: 300 seconds.
  • Writes invalidate immediately.
  • When Redis is down, falls back to PostgreSQL.
  • cache field in response indicates source.

See also: Whitelabel overview, Theming.