Brands

A brand is a structured token kit — logos, colors, typography, icons — that templates bind to. Bind a layer's fill to colors.primary once, and every render follows the brand; swap the brand (or override tokens per render) and the same design re-skins itself.

Token model

Brand tokens are a nested object addressed by dot paths:

GroupExample tokens
logoslogos.logo, logos.logoDark, logos.logoLight, logos.icon, logos.iconLight
colorscolors.primary, colors.secondary, colors.accent, copy/background colors
Typography, icons, …font families and weights, icon style preferences

Each brand holds draft tokens (being edited) and live tokens (what published renders use). Templates reference tokens through brand bindings in the editor; a template can also declare a defaultBrandId.

A brand's token book: logo variants, color tokens, and live previews of templates rendered with the brand

Per-render overrides (brandTweaks)

Any render can override brand tokens by dot path without touching the brand itself — see the Rendering API:

{
  "pageId": "PAGE_ID",
  "format": "png",
  "brandTweaks": {
    "colors.primary": "#7c3aed",
    "logos.logo": "https://cdn.example.com/acme-logo.svg"
  }
}

This is the multi-brand pattern: one template, N brands, N on-brand outputs — without duplicating designs.

Managing brands

In the app: create and edit brands under your space's Brands section; the editor's brand panel binds layers to tokens.

Via MCP (API-key friendly): AI agents and scripts can manage brands through the MCP server with a Bearer API key — list_brands, get_brand, create_brand, update_brand, and resolve_brand (extract brand tokens from a website).

Via REST (session-authenticated): the dashboard uses these endpoints. They require a logged-in session — they are not callable with an API key today; use MCP for programmatic access.

MethodPathNotes
GET/api/v1/brands?page=&perPage=List brands in the current space. ?public=true lists public brands without auth.
GET/api/v1/brands/:idFetch one brand. Public brands (with publicOn) need no auth.
POST/api/v1/brandsCreate — { name, tokens?, draftTokens?, liveTokens?, variants?, extra? }. External image URLs in tokens are re-uploaded to your space.
PUT/api/v1/brands/:idUpdate (same fields, all optional).
DELETE/api/v1/brands/:idSoft-delete.

List responses have the standard shape { list, count, pagesCount }; single-document responses return { doc }.

Brand fields

FieldDescription
_id, nameIdentity.
draftTokensTokens as currently edited.
liveTokensTokens used by published renders.
tokensResolved/legacy token set.
variantsNamed variations of the kit.
publicOnWhen set, the brand is publicly readable.