All API reference pages

Organizations, sites, and people

The account backbone: the organization itself, its sites, and its members. All endpoints here require a user session; permissions noted per endpoint.

The organization

GET   /orgs/{orgId}          — the org row (name, slug, kind, settings)
PATCH /orgs/{orgId}          — update name / settings / kind        (owner)

settings is a JSON object carried on the organization. Notable keys: plan and trialEndsAt (managed by billing endpoints — don't write them directly), vertical, and brand:

PATCH /orgs/{orgId}
{ "settings": { "brand": { "primary": "#283040", "accent": "#F36744" } } }

Brand colors theme kitchen boards, menu boards, and diner-facing screens. `PATCH` replaces the whole `settings` object — read it first, merge, then write.

Operator organizations (kind: "operator") manage client organizations:

GET  /orgs/{orgId}/children   — client orgs under this operator      (admin)
POST /orgs/{orgId}/children   — create a client org                  (owner)

Sites

GET   /orgs/{orgId}/sites
POST  /orgs/{orgId}/sites                       (admin)
PATCH /orgs/{orgId}/sites/{siteId}              (admin; archive with {"archived": true})

A site list looks like:

[
  {
    "id": "76e372c4-0b3e-48ad-8ae2-2b6531081847",
    "orgId": "05b955b6-c196-4e31-a383-4251dee16f8a",
    "name": "Riverbend HQ — Tower Café",
    "code": "TWR",
    "address": null,
    "timezone": "America/New_York",
    "functionalAreas": ["foodservice"],
    "joinCode": "RIVER1",
    "populationTargetId": null,
    "archived": false,
    "createdAt": "2026-07-12 00:40:10.126421+00"
  }
]

The timezone matters: production days, tray generation, and every "today" on that site resolve in it. joinCode is the diner-app join code (null until minted).

Members

GET    /orgs/{orgId}/users                       — members with role, siteIds, credentials
POST   /orgs/{orgId}/users                       — invite            (admin)
PATCH  /orgs/{orgId}/users/{userId}              — role / siteIds / credentials / phone (admin)
DELETE /orgs/{orgId}/users/{userId}              — remove membership (admin)

Inviting:

{ "email": "sam@example.com", "name": "Sam Ortiz", "role": "manager", "siteIds": [], "credentials": ["rd"] }

If the person has no Miseline account, one is created and they're emailed a temporary password (or pass a password yourself and no email is sent). Inviting an existing member returns 409. role is one of owner | admin | manager | inspector | viewer; empty siteIds means all sites; credentials may include rd, servsafe, cdm.

Plan and usage

GET /orgs/{orgId}/billing        (any member)

Returns the current plan, trial state, limits, live usage (sites, devices, members, diners, AI tokens this month), and the available plans — the machine-readable version of the Billing page. Feature gating itself is enforced per-endpoint via the 402 paywall shape.

Notifications

GET  /orgs/{orgId}/notifications             — the caller's in-app notifications
POST /orgs/{orgId}/notifications/{id}/read