Skip to content
MeridFlow AiFlow v8.x • self-hosted

White-labeling

Deployment-wide branding for a reseller running AiFlow under their own name for their own clients: brand name, logo, and two colors, set once and applied everywhere "AiFlow" and its default indigo and violet colors would otherwise show. Unlike everything else covered in these guides, this isn't per-agent: it's one setting for the whole deployment. A reseller runs one deployment per client, each with its own branding, not one deployment multiplexing many brands.

Endpoint family

GET /api/v1/branding
PUT /api/v1/branding

Authentication and roles

GET is public and unauthenticated: the admin dashboard's login page and every embedded widget's config fetch both need it before any session exists. PUT requires Owner or Admin: the same bar as every other deployment-wide (not per-agent) setting.

What each field controls

Field Applied to
brand_name Admin dashboard sidebar and page title text; login page heading.
brand_logo_url Replaces the default "A" badge in the sidebar and on the login page.
brand_primary_color The admin dashboard's primary accent (buttons, focus rings, active nav) and the widget's default --af-accent.
brand_accent_color A secondary admin dashboard accent shade and the widget's default --af-accent-2.

Every field is optional and independent. Leaving one unset (or setting it back to null) falls back to AiFlow's own default for just that field. A deployment that never calls PUT sees no change at all.

Read the current branding

GET /api/v1/branding
curl https://api.your-domain.com/api/v1/branding
{
  "brand_name": null,
  "brand_logo_url": null,
  "brand_primary_color": null,
  "brand_accent_color": null
}

Set it

PUT /api/v1/branding
Field Type Required Description
brand_name string No Up to 120 characters.
brand_logo_url string No Up to 2048 characters, any image URL.
brand_primary_color string No 6-digit hex, e.g. #e0592a.
brand_accent_color string No 6-digit hex, e.g. #f2a154.
curl -X PUT https://api.your-domain.com/api/v1/branding \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -d '{
    "brand_name": "Acme Voice",
    "brand_logo_url": "https://acme.example.com/logo.png",
    "brand_primary_color": "#e0592a",
    "brand_accent_color": "#f2a154"
  }'

The admin dashboard picks up a new value on its next page load (each page reads GET /api/v1/branding once per session). An already-open widget embed keeps the colors it started with. A page the widget is embedded on picks up the new value the next time a visitor loads it.

Building a custom widget client

The drop-in embed applies brand_primary_color and brand_accent_color automatically from GET /api/v1/agents/{slug}/widget/config's response (see embedding-the-widget). A custom client built directly against the widget's session and WebSocket API, instead of the drop-in embed, would need to apply the same two colors itself: setting --af-accent and --af-accent-2 (or your own equivalent custom properties) on whatever element hosts the widget's styles.

Next

  • Team: who can reach Settings → Branding (Owner or Admin).
  • Embedding the widget: where the widget picks up its default accent color from.