DocsSign in

Public API

Storefront

One request for everything needed to render a restaurant site. Preferred for SSR.

Retrieve storefront

GET/storefrontpublishable or secret
Request
curl -H "Authorization: Bearer $KEY" \
  https://www.kitchensflow.com/api/public/v1/storefront

Response

`tenant.site` holds admin-editable overrides for storefront chrome/marketing copy (nav labels, homepage sections, footer, banner…), set from `/admin/content`. Only keys the admin has filled in are present. Clients should fall back to their own static default copy for any key that is missing — never treat an absent `site` map as an error.

`tenant.branding.heroCoverImage(Url)`, `brandCoverImage(Url)`, and `experienceCoverImage(Url)` are independent cover images for the homepage hero, brand-story, and experience sections. Each falls back to the legacy shared `coverImage(Url)` when unset, so clients should read the section-specific field first and fall back to `coverImage(Url)` before using their own static default.

`tenant.branding.chefPhotoImage(Url)` is the chef section portrait. Unlike the section covers it has **no** `coverImage` fallback — when it is absent, render the chef section without a photo rather than substituting another image.

Every `image` asset records the real `width` and `height` of each variant. Branding images are stored uncropped (the upload only caps the long edge and preserves the source aspect ratio), so clients should size containers from those dimensions instead of assuming a fixed ratio. Images uploaded before 2026-09-07 may still be stored pre-cropped to 16:9.

json
{
  "tenant": {
    "id": "meatup",
    "name": "Meatup",
    "branding": {
      "primaryColor": "#C41E3A",
      "logoUrl": "...", "logo": { "basePath": "...", "variants": { "thumb": { "url": "...", "width": 128, "height": 128 } } },
      "coverImageUrl": "...", "coverImage": { "...": "..." },
      "heroCoverImageUrl": "...", "heroCoverImage": { "...": "..." },
      "brandCoverImageUrl": "...", "brandCoverImage": { "...": "..." },
      "experienceCoverImageUrl": "...", "experienceCoverImage": { "...": "..." },
      "chefPhotoImageUrl": "...", "chefPhotoImage": { "...": "..." },
      "tagline": { "fr": "...", "en": "...", "ar": "..." }
    },
    "contact": { "email": "...", "whatsapp": "..." },
    "social": { "instagram": "...", "facebook": "..." },
    "site": { "whyTitle": { "fr": "...", "en": "...", "ar": "..." } }
  },
  "menu": [ /* categories with items + modifierGroups */ ],
  "locations": [ /* open locations */ ]
}