All API reference pages

Commerce resources

The revenue-facing families: front of house, meal-plan money, the register, catering, and the growth layer.

Dining room

GET   /orgs/{orgId}/dining/floor?siteId            — rooms, tables, live seat assignments
POST  /orgs/{orgId}/dining/tables                  (+ PATCH /{id})
POST  /orgs/{orgId}/dining/seats                   — assign; {tableId: null} unassigns
GET/POST /orgs/{orgId}/reservations                (+ PATCH /{id})

Seat assignment replaces the diner's previous seat and enforces table capacity.

Tableside orders

POST  /orgs/{orgId}/tableside-orders               — returns per-item diet warnings inline
PATCH /orgs/{orgId}/tableside-orders/{id}
GET   /orgs/{orgId}/tableside-orders?siteId&date

Each line item is checked against the diner's active diet order with the same deterministic rules as the tray line; warnings come back on the line so the server sees them while still at the table. Captured order volume also sets the floor for production planning.

Meal plans and the ledger

GET/POST /orgs/{orgId}/meal-plans                  (+ PUT /{id})   — swipes | declining | hybrid
POST     /orgs/{orgId}/meal-plans/enroll
GET      /orgs/{orgId}/plan-balance?dinerId
POST     /orgs/{orgId}/swipe                       — enforces per-meal/weekly limits, balance floor
POST     /orgs/{orgId}/charges                     — guest meals, one-off charges
GET/POST /orgs/{orgId}/house-accounts              (+ PUT /{id})
GET      /orgs/{orgId}/transactions?from&to
POST     /orgs/{orgId}/transactions/export         — month-end CSV, stamps exportedAt

Limits are enforced at the swipe moment from the current plan row; weekly counters reset automatically when the week rolls over. Exceeding a limit or balance floor returns 422.

POS (Pro+)

POST /orgs/{orgId}/pos/sessions                    — open register with a cash float
POST /orgs/{orgId}/pos/sessions/{id}/close         — reconciliation (over/short)
POST /orgs/{orgId}/pos/orders                      — subtotal → discount → tax → total
POST /orgs/{orgId}/pos/orders/{id}/settle          — payments[]; methods: cash|card|meal_plan|house|comp
POST /orgs/{orgId}/pos/orders/{id}/void
GET  /orgs/{orgId}/pos/summary?siteId&date         — the Z-report

Settlement validates before writing: payments must cover the total, cash over-tender returns change, meal_plan debits the plan (insufficient balance → 422, nothing written), house posts to the house account. Full settlement awards loyalty points when a diner is attached.

Catering (Pro+)

GET/POST /orgs/{orgId}/catering                    (+ PUT /{id})   — events
GET      /orgs/{orgId}/catering/{id}/full          — event + quotes + invoices in one call
POST     /orgs/{orgId}/catering/draft-from-brief   — AI quote draft from a client brief
POST     /orgs/{orgId}/catering/{id}/quotes        — new quote version (supersedes)
POST     /orgs/{orgId}/catering/quotes/{quoteId}/send | /decide | /deposit-paid
PUT      /orgs/{orgId}/catering/{id}/run-sheet
POST     /orgs/{orgId}/catering/{id}/invoices      (+ POST /invoices/{invoiceId}/{action})
POST     /orgs/{orgId}/catering/{id}/costing       — actuals vs quote → margin
POST     /orgs/{orgId}/catering/{id}/generate-production
POST     /orgs/{orgId}/share/quote/{quoteId}       — mint a public share link
POST     /orgs/{orgId}/share/invoice/{invoiceId}

Quotes are versioned and a new version supersedes the old — refetch /full before deciding so you accept the version the client actually saw. Acceptance stamps signature and deposit terms; invoices credit the recorded deposit. catering.quote_accepted and catering.invoice_paid fire webhooks.

Loyalty, campaigns, storefront (Pro+)

GET/PUT  /orgs/{orgId}/loyalty/program
GET/POST /orgs/{orgId}/rewards                     (+ PATCH /{id})
GET      /orgs/{orgId}/loyalty/accounts
POST     /orgs/{orgId}/loyalty/adjust              — spendable points never go negative
POST     /orgs/{orgId}/loyalty/redemptions/fulfill — by the diner's 8-char code
GET/POST /orgs/{orgId}/campaigns                   (+ PUT /{id}, GET /{id}/audience, POST /{id}/send)
GET/PUT  /orgs/{orgId}/storefront                  (+ products, orders, import-partner)
GET      /public/store/{slug}                      — public storefront (no auth)
POST     /public/store/{slug}/orders               — public checkout (rate-limited)

Redemption is an atomic conditional decrement — insufficient points return 422, never a double spend. Sent campaigns are immutable (422); social channels require the Enterprise social_publishing feature at send time. The public store never exposes billing state: a lapsed plan returns 404 Store not found.