Skip to main content

Resolve the effective branding for your tenant

One read returns the branding your dashboard, hosted sign-in page, and white-label surfaces should render with. The resolver walks a three-step chain — your own settings first, your reseller parent second, the platform default theme last — and answers it in one envelope so no surface needs a second round-trip.
Every field is returned; a field you never set (and a parent, if any, never set) comes back null, which signals “fall back to the platform default theme.”

Resolution chain

  1. Tenant override wins. Fields you set directly — under Settings → Branding in the dashboard, or via the organization branding API — are self-authoritative.
  2. Reseller parent fills the gaps. For a subaccount with inherits_from_parent: true, any unset field is pulled from the parent organization. inherited_from_organization_id names the org that supplied values, and inherited_fields maps each inherited field to that org, so the dashboard can badge “Inherited from Acme HQ.”
  3. Null means platform default. A field still null after both steps renders with the unbranded default theme — the merger never invents a value.
The help-center theming fields (help_logo_url, help_primary_color, help_secondary_color, help_header_links, help_show_powered_by) are returned on the same record; they control the public help center and join the chain exactly like the dashboard fields. When branding cannot be resolved — a transient database blip, or a subdomain that is still provisioning — the read still returns 200 with every field nulled, so the shell your authenticating user is waiting on never fails to render.
The response carries Cache-Control: private, max-age=60. Cache it for a minute per client rather than polling on every render.

Custom domains before a session exists

The same resolution powers your white-labelled sign-in page. The page passes its domain in X-Tenant-Host — no API key — and receives the resolved branding of the tenant that registered that domain, so custom.acme.example.com shows your logo and palette before anyone signs in. custom_domain in the response names the registered domain. That unsigned path is IP-rate-limited at a lower ceiling than authenticated calls; the resolution chain above is unchanged.