White-label
White-label flips the dashboard, transactional emails, and the edge splash interstitial from Elido branding to your own. It runs in three phases internally, but from the API surface it’s a single record:
PUT /v1/workspaces/{workspace_id}/brandingBusiness plan only. Mutations from Free/Paid workspaces return
402 Payment Required. Reads always succeed so a downgrade never wipes your config.
Configure
curl -X PUT \
https://api.elido.app/v1/workspaces/1/branding \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"brand_name": "Acme Links",
"logo_url": "https://cdn.acme.com/logo.svg",
"primary_color": "#5b6cff",
"email_from_name": "Acme Links",
"portal_hostname": "links.acme.com",
"enabled": true
}'| Field | Notes |
|---|---|
brand_name | Replaces “Elido” in the topbar, page titles, and email subjects. ≤80 chars. |
logo_url | Public HTTPS URL. Square SVG/PNG, recommended ≤512 KB. |
primary_color | Hex (#rrggbb) or oklch(...). Drives the --primary CSS var. |
email_from_name | Sender display name on transactional emails. Defaults to brand_name. |
portal_hostname | Custom dashboard host (e.g. links.acme.com). Globally unique. |
enabled | Master switch. Defaults false — set true to activate. |
enabled: false keeps the config but renders nothing — useful for
staging changes before flipping the brand on.
Where it shows up
The same config is read in three places:
Dashboard
The web app fetches /branding on load and injects brand_name,
logo_url, and primary_color into the shell. Users see your name
and colors instead of Elido’s the moment they sign in.
Transactional emails
Invitation, verification, password-reset, and webhook-failure emails
render from a templated header that uses brand_name, logo_url, and
email_from_name. The From: line becomes
"Acme Links" <noreply@elido.app> — the sending domain stays
Elido-managed for SPF/DKIM reasons.
Edge splash
When a link uses the conversion splash interstitial (see Retargeting pixels), the edge fetches the workspace’s branding via gRPC and renders the splash with your logo and colors instead of Elido’s.
Custom portal hostname
Setting portal_hostname is the difference between
acme.elido.app/dashboard and links.acme.com/dashboard. The flow:
- Set the field via the API or Settings → Branding.
- Add a
CNAME links.acme.com → portal.elido.apprecord at your registrar. - The first request triggers Caddy on-demand TLS — Elido issues a Let’s Encrypt cert in under 30 seconds.
The public lookup endpoint that drives this:
GET /v1/portal/lookup?host=links.acme.com
→ 200 { "workspace_id": 1 } # if claimed and enabled
→ 404 # otherwise (Caddy refuses cert issuance)Hostnames are reserved globally — if a different workspace already
claims links.acme.com, your PUT returns 409 Conflict.
Reset to defaults
curl -X DELETE \
https://api.elido.app/v1/workspaces/1/branding \
-H "Authorization: Bearer $ELIDO_TOKEN"Reverts the workspace to Elido branding immediately. The custom hostname stops resolving on the next Caddy ask.
Limits
- One branding record per workspace.
- Hostname conflicts return
409— pick another or contact support if you believe the claim is stale. - The dashboard previews changes live, but the edge splash pulls via gRPC and may take up to ~60s to reflect a fresh config.