Brands API

The demo brand profiles, as JSON — so seed scripts and other tools can read the same data the Brands page renders.

Endpoints

Method & pathReturns
GET /api/brandsAll brands: { count, brands }
GET /api/brands?id=<id>A single brand object, or 404 if the id is unknown.

Valid ids: praxis-kessler, decades, soma-studio.

Asset URLs

The logo, service image, and staff image fields are returned as absolute URLs against the request origin, so a script can fetch them directly without rebuilding paths.

List response

{
  "count": 3,
  "brands": [
    { /* brand object, see below */ }
  ]
}

Brand object

Each brand has these fields. Arrays are trimmed to one entry here for brevity.

{
  "id": "praxis-kessler",
  "name": "Praxis Kessler",
  "type": "Small solo Heilpraktiker",
  "shortDescription": "A one-woman naturopathic practice in Hamburg…",
  "description": "A one-woman naturopathic practice run by Nora Kessler…",
  "website": "praxis-kessler.de",
  "offering": "Naturopathy, acupuncture & herbal medicine",
  "logo": "https://<host>/brands/logos/kessler.png",
  "initials": "NK",
  "typeface": "Jost / Inter",
  "palette": {
    "bg": "#F5F0EB",
    "primary": "#9C8B7E",
    "accent": "#6F5F52",
    "ink": "#25201C",
    "onPrimary": "#FFFFFF"
  },
  "locations": ["Hamburg-Eimsbüttel"],
  "services": [
    {
      "name": "Naturopathy Consultation",
      "description": "90 min initial deep-dive, 45 min follow-ups.",
      "icon": "consultation",
      "image": "https://<host>/brands/kessler/services/naturopathy.png"
    }
  ],
  "staff": [
    {
      "name": "Nora Kessler",
      "role": "Heilpraktikerin & Founder",
      "image": "https://<host>/brands/kessler/staff/nora-kessler.png"
    }
  ],
  "personality": "Traditional and relationship-first…",
  "circleOS": {
    "used": ["Online booking for new and returning patients"],
    "notUsed": ["Multi-location configuration (single location only)"]
  }
}
FieldDescription
id, name, typeIdentity and category label.
shortDescription, descriptionOne-line and full company copy.
website, offering, personalityDomain, what they offer, and tone.
logo, initials, typefaceAbsolute logo URL, fallback initials, and the typeface label.
paletteBrand colours: bg, primary, accent, ink, onPrimary.
locationsArray of location strings.
services[]name, description, icon, and optional image / price.
staff[]name, role, and optional image.
circleOSused and notUsed feature lists.

Use it from a script

// All brands
const { brands } = await fetch("https://<host>/api/brands").then((r) =>
  r.json(),
);

for (const brand of brands) {
  console.log(brand.name, brand.services.length);
}

// A single brand
const decades = await fetch("https://<host>/api/brands?id=decades").then((r) =>
  r.json(),
);