Generated from the @openpizza/core zod contract. Machine-readable: /openapi.json (OpenAPI 3.1). Auth: Authorization: Bearer <core token> from POST /oauth/token; the tenant always comes from the token. Writes need Idempotency-Key. Errors are RFC 9457 problem+json with a stable code.
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
tenant.get The calling tenant | GET /v1/tenant | tenant:read | tenant source |
capabilities.get What the tenant's commerce source supports | GET /v1/capabilities | any token | hub |
entitlements.get Module entitlements (core.tenant_modules) + POS plan | GET /v1/entitlements | entitlements:read | hub |
moduleSettings.get Per-tenant module settings | GET /v1/modules/{module}/settings | entitlements:read | hub |
moduleSettings.update Patch module settings (needs <module>:admin; own module or POS) | PATCH /v1/modules/{module}/settingsIdempotency-Key | entitlements:read | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
locations.list List locations | GET /v1/locations | locations:read | tenant source |
locations.get Get a location | GET /v1/locations/{location_id} | locations:read | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
menu.get Resolved menu for a location (overrides + 86 folded in) | GET /v1/locations/{location_id}/menu | menu:read | tenant source |
menu.setAvailability 86 / un-86 an item, size or modifier | PUT /v1/locations/{location_id}/menu/availabilityIdempotency-Key | menu.availability:write | tenant source |
menu.publishAllergens Publish the allergen matrix (emits menu.allergens.published) | PUT /v1/catalog/allergensIdempotency-Key | menu.allergens:write | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
quotes.create Server-priced quote (priceCart) | POST /v1/quotesIdempotency-Key | quotes:write | tenant source |
quotes.get Get a quote | GET /v1/quotes/{quote_id} | quotes:write | tenant source |
orders.list List orders | GET /v1/orders | orders:read | tenant source |
orders.get Get an order | GET /v1/orders/{order_id} | orders:read | tenant source |
orders.create Place an order (priced server-side; Idempotency-Key = order id) | POST /v1/ordersIdempotency-Key | orders:write | tenant source |
orders.cancel Cancel an order | POST /v1/orders/{order_id}/cancelIdempotency-Key | orders:write | tenant source |
orders.release Release a held order to the kitchen | POST /v1/orders/{order_id}/releaseIdempotency-Key | orders:write | tenant source |
orders.extendHold Extend a held order's hold (0.3.1; creator only, capped) | POST /v1/orders/{order_id}/hold/extendIdempotency-Key | orders:write | tenant source |
orders.updateStatus Move fulfillment status | POST /v1/orders/{order_id}/statusIdempotency-Key | orders:write | tenant source |
kitchen.load Live kitchen load signal for a location | GET /v1/locations/{location_id}/kitchen-load | orders:read | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
payments.listForOrder Payments for an order | GET /v1/orders/{order_id}/payments | payments:read | tenant source |
payments.get Get a payment | GET /v1/payments/{payment_id} | payments:read | tenant source |
payments.recordExternal Record a tender taken outside core | POST /v1/orders/{order_id}/paymentsIdempotency-Key | payments:write | tenant source |
payments.createSession Create a hosted payment session (pay link) for an order | POST /v1/orders/{order_id}/payment-sessionsIdempotency-Key | payments:write | tenant source |
payments.getSession Get a payment session | GET /v1/payment-sessions/{session_id} | payments:read | tenant source |
payments.account Processor account (Connect id) and platform fee schedule | GET /v1/payments/account | payments:read | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
customers.list List customers | GET /v1/customers | customers:read | tenant source |
customers.get Get a customer | GET /v1/customers/{customer_id} | customers:read | tenant source |
customers.lookup Find a customer by email or phone (404 when none) | GET /v1/customers/lookup | customers:read | tenant source |
customers.upsert Upsert a customer by email/phone | POST /v1/customersIdempotency-Key | customers:write | tenant source |
customerAuth.start Send a customer one-time code (SMS/email) | POST /v1/customer-auth/challengesIdempotency-Key | customers:auth | hub |
customerAuth.verify Verify the code → customer + customer session token | POST /v1/customer-auth/challenges/{challenge_id}/verify | customers:auth | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
staff.list List staff | GET /v1/staff | staff:read | tenant source |
staff.get Get a staff member | GET /v1/staff/{staff_id} | staff:read | tenant source |
drawerSessions.list Cash drawer sessions (POS shifts) at a location | GET /v1/locations/{location_id}/drawer-sessions | drawer_sessions:read | tenant source |
staff.setPin Set or clear a staff member's quick-switch PIN | PUT /v1/staff/{staff_id}/pinIdempotency-Key | staff:set_pin | tenant source |
staff.resetLoginIdentity Forget a staff member's staff-login email binding (0.3.1; owner staff session) | POST /v1/staff/{staff_id}/login-identity/resetIdempotency-Key | staff:write | hub |
staff.roster Active staff roster: ids, names, roles, locations; no contact info (0.3.3; staff:roster, clock devices) | GET /v1/staff/roster | staff:roster | hub |
staff.verifyPin Verify a staff PIN → acting-staff session token | POST /v1/staff/verify-pin | staff:pin_verify | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
deliveries.list List deliveries | GET /v1/deliveries | deliveries:read | tenant source |
deliveries.get Get a delivery | GET /v1/deliveries/{delivery_id} | deliveries:read | tenant source |
deliveries.updateStatus Update delivery status | POST /v1/deliveries/{delivery_id}/statusIdempotency-Key | deliveries:write | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
sales.daily Daily sales for a location | GET /v1/locations/{location_id}/sales/daily | sales:read | tenant source |
sales.summary Sales summary grouped by location/channel/item/hour/day | GET /v1/sales/summary | sales:read | tenant source |
sales.hourly Hourly sales buckets (location-local hours) | GET /v1/locations/{location_id}/sales/hourly | sales:read | tenant source |
sales.items Item-level sales per business date | GET /v1/sales/items | sales:read | tenant source |
tips.list Normalised tip facts (tender tips vs order tips, no double count) | GET /v1/tips | tips:read | tenant source |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
events.list Pull feed (same envelope as webhooks), oldest first | GET /v1/events | events:subscribe | hub |
events.ingest Publish a module event (module namespace only) | POST /v1/events/ingestIdempotency-Key | events:publish | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
webhookEndpoints.list List webhook endpoints | GET /v1/webhook-endpoints | events:subscribe | hub |
webhookEndpoints.create Register a webhook endpoint (secret shown once) | POST /v1/webhook-endpointsIdempotency-Key | events:subscribe | hub |
webhookEndpoints.get Get a webhook endpoint | GET /v1/webhook-endpoints/{endpoint_id} | events:subscribe | hub |
webhookEndpoints.update Update url/types/status | PATCH /v1/webhook-endpoints/{endpoint_id} | events:subscribe | hub |
webhookEndpoints.delete Delete a webhook endpoint | DELETE /v1/webhook-endpoints/{endpoint_id} | events:subscribe | hub |
webhookEndpoints.rotateSecret Rotate the signing secret (old one signs for 24h more) | POST /v1/webhook-endpoints/{endpoint_id}/rotate-secretIdempotency-Key | events:subscribe | hub |
webhookEndpoints.replay Replay events (by id or time range) to this endpoint | POST /v1/webhook-endpoints/{endpoint_id}/replayIdempotency-Key | events:subscribe | hub |
webhookEndpoints.deliveries Delivery log for this endpoint | GET /v1/webhook-endpoints/{endpoint_id}/deliveries | events:subscribe | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
directory.tenants.list Tenants that enabled the calling module | GET /v1/directory/tenants | directory:read | hub |
directory.tenants.get Look up a tenant (that enabled the calling module) by slug | GET /v1/directory/tenants/{slug} | directory:read | hub |
directory.locations.search Geo search across tenants that enabled the calling module | GET /v1/directory/locations | directory:read | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
devices.createPairing Create a one-time device pairing code (kiosk, board, terminal, KDS) | POST /v1/devices/pairingsIdempotency-Key | devices:pair | hub |
devices.list Paired devices | GET /v1/devices | devices:read | hub |
devices.revoke Revoke a device credential | POST /v1/devices/{device_id}/revokeIdempotency-Key | devices:write | hub |
devices.createPairingOnBehalf Create a pairing code for a signed-in staff member (0.3.2; module client + staff_token, no devices:pair) | POST /v1/devices/pairings/on-behalfIdempotency-Key | any token | hub |
devices.revokeOwn Revoke a device your module paired (0.3.3; module client, no staff token, no devices:* scope) | POST /v1/devices/{device_id}/revoke/ownIdempotency-Key | any token | hub |
devices.revokeOnBehalf Revoke a device for a signed-in staff member (0.3.2; module client + staff_token) | POST /v1/devices/{device_id}/revoke/on-behalfIdempotency-Key | any token | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
realtime.publish Nudge a realtime channel (bumps its version) | POST /v1/realtime/channels/{channel}/nudge | realtime:publish | hub |
realtime.subscribeToken Client-safe subscribe token + SSE URL for a channel | POST /v1/realtime/channels/{channel}/subscribe-token | realtime:subscribe | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
notifications.send Send an email/SMS through the hub's provider | POST /v1/notificationsIdempotency-Key | notifications:send | hub |
notifications.get Get a notification's status | GET /v1/notifications/{notification_id} | notifications:send | hub |
| Operation | Endpoint | Scopes | Served by |
|---|---|---|---|
providers.list Registered checkout/delivery providers | GET /v1/providers | providers:read | hub |
providers.register Register (upsert) a provider for this tenant (own module key only) | PUT /v1/providers/{kind}/{key}Idempotency-Key | providers:write | hub |
providers.remove Remove a provider registration | DELETE /v1/providers/{kind}/{key} | providers:write | hub |