v1 · REST + Webhooks

Developer documentation

Build customer, driver, and merchant apps on one API. Read and write restaurants, menus, orders, and drivers; receive real-time events over signed webhooks. Everything is scoped to the token owner.

🛍️ customer app 🛵 Driver App 🧑‍🍳 Merchant app

Building for the marketplace? App developer docs →  ·  Theme developer docs →

New our Dev MCP server turns any MCP-capable AI tool into a platform expert. learn_platform primes it, get_liquid_reference gives it the authoritative whitelist, and validate_theme runs the marketplace's own checks on its output — the full learn → build → validate loop without leaving your editor. Connect in one command →

Getting started

Create an API token from your dashboard under API tokens & webhooks. Choose the read and/or write abilities and copy the token — it is shown only once.

Base URL: https://www.menubarcode.com/api/v1

A quick check that your token works:

curl https://www.menubarcode.com/api/v1/restaurants \
  -H "Authorization: Bearer YOUR_TOKEN"
The root GET https://www.menubarcode.com/api/v1 returns a machine-readable index of available endpoints (no auth required). Machine-readable OpenAPI 3.1 spec (JSON) — generated from the live router, so it always matches the deployed API.

Authentication

Send your token as a Bearer header on every request:

Authorization: Bearer YOUR_TOKEN

For quick tests you may instead pass ?api_token=YOUR_TOKEN as a query parameter, but the header is strongly preferred so tokens never leak into logs.

AbilityGrants
readAll GET endpoints (every resource).
writeAll mutating endpoints (and, being a superset, all reads).

Scoped tokens

Beyond coarse read/write, a token can be limited to specific resources with resource:action abilities. Resources: restaurants, menu, orders, customers, analytics, drivers, webhooks; Actions read, write. Pick them when creating the token in the dashboard.

Example tokenCan do
["orders:write"]Read + write orders only (a POS integration).
["menu:read"]Read the menu; nothing else.
["orders:read","analytics:read"]A reporting dashboard.

Coverage rules: * grants everything; a :write scope also grants its :read; coarse read/write behave like *:read / *:write. A request lacking the required scope returns 403. Legacy read/write tokens are unaffected.

Tokens are hashed at rest (SHA-256) and may carry an optional expiry. Revoke any token instantly from the dashboard.

Rate Limits

The API allows 120 requests per minute per token. Exceeding it returns 429 Too Many Requests with a Retry-After header. Standard rate-limit headers are included on every response:

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118

Errors

Every error on an /api/v1 route returns conventional HTTP status codes and a single JSON envelope — a human message, a stable machine code, and (on validation) a per-field errors Map

{ "message": "Invalid or expired token.", "code": "unauthenticated" }

{ "message": "The given data was invalid.",
  "code": "validation_failed",
  "errors": { "title": ["The title field is required."] } }
StatuscodeMeaning
401unauthenticatedMissing, invalid, or expired token.
403forbiddenToken lacks the required ability/scope.
404not_foundResource not found or not owned by the token.
422validation_failedValidation failed (see errors).
429rate_limitedRate limit exceeded.
Parse the machine code, not the human message — messages may be reworded or localized; codes are stable.
Requesting a resource you do not own returns 404, not 403 — the API never confirms the existence of another owner's data.

Pagination

List endpoints return Laravel-style paginated envelopes. Use the ?page= query parameter to walk pages.

{
  "data": [ ... ],
  "current_page": 1,
  "last_page": 3,
  "per_page": 20,
  "total": 47
}

Read restaurants & menu

GET /restaurants

List the restaurants owned by the token, paginated (20 per page).

{
  "data": [
    { "id": 12, "title": "Nova Bistro", "slug": "nova-bistro",
      "url": "https://.../nova-bistro", "template": "linen",
      "created_at": "2026-06-01T10:22:00+00:00" }
  ],
  "current_page": 1, "last_page": 1, "total": 1
}
GET /restaurants/{id}

A single restaurant with its menu categories and item count.

GET /restaurants/{id}/menu

The full active menu grouped by category.

[
  { "id": 3, "name": "Starters",
    "items": [
      { "id": 88, "name": "Bruschetta", "price": 6.50,
        "is_sold_out": false, "is_popular": true, "is_vegan": true,
        "is_halal": true, "calories": 210 }
    ]
  }
]

Orders

GET /restaurants/{id}/orders

Orders newest first, paginated (30/page). Filter with ?status=.

GET /restaurants/{id}/orders/{orderId}

Full order detail with line items, extras, driver, and delivery timeline.

POST /restaurants/{id}/orders Write

Create an order — this is how a customer app submits a cart (the merchant's backend holds the token). Every item is validated against the restaurant's live menu; sold-out or foreign items reject the whole order (422). Fires order.created and returns the full order including its track_token.

curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/orders \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "delivery",
    "customer_name": "A. Idriss",
    "phone": "+15551234567",
    "address": "9 Cedar Road",
    "tip_amount": 3.00,
    "note": "Ring the bell",
    "source": "customer_app",
    "items": [
      { "item_id": 88, "quantity": 2, "variation": 5, "extras": [12], "note": "no onion" },
      { "item_id": 91, "quantity": 1 }
    ]
  }'

Order type is one of on-table, takeaway, delivery. for on-table pass table_number; for delivery pass address.

Idempotency. Send an Idempotency-Key header (or a body client_uuid) on any order-create call. Retrying with the same key returns the original order and never creates a duplicate — safe for dropped responses and offline replay. Keys are scoped per restaurant.

PUT /restaurants/{id}/orders/{orderId}/status Write

Update the kitchen status (new|preparing|ready|delivered|completed|cancelled). Fires order.status_changed.

Storefront API (per-restaurant token)

A separate, public-facing API authenticated by a per-restaurant storefront token sent as X-Storefront-Token (not the owner Bearer token). Issue these from your dashboard; each token can only ever reach its own restaurant. Read scope is menu:read; placing orders needs the order:write Scope

GET /storefront/menu

Full menu for the token's restaurant (variants, extras, groups, gallery).

GET /storefront/restaurant

Basic restaurant info for the token's restaurant.

POST /storefront/orders order:write

Submit a cart on behalf of a diner. Server-priced and unpaid (the diner pays on arrival); takeaway or on-table only. Every item is validated against the live menu — sold-out or foreign items reject the whole order (422). Caps: 40 items/order, 30 qty/line. Optional coupon_code applies an owner discount server-side. Fires order.created and returns track_token + continue_url.

curl -X POST https://www.menubarcode.com/api/v1/storefront/orders \
  -H "X-Storefront-Token: YOUR_STOREFRONT_TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "takeaway",
    "customer_name": "A. Idriss",
    "phone": "+15551234567",
    "coupon_code": "WELCOME10",
    "items": [
      { "item_id": 88, "quantity": 2, "variation": 5, "extras": [12] },
      { "item_id": 91, "quantity": 1 }
    ]
  }'

Analytics & customers

GET /restaurants/{id}/analytics

Sales summary over a date range (?from=YYYY-MM-DD&to=YYYY-MM-DD, default last 30 days): order counts by status/type, gross & paid revenue, average order value, and top items.

{
  "range": { "from": "2026-06-02", "to": "2026-07-02" },
  "orders": { "total": 214, "paid": 198, "by_status": {...}, "by_type": {...} },
  "revenue": { "gross": 8420.50, "paid": 7990.00, "avg_order_value": 39.35 },
  "top_items": [ { "item_id": 88, "name": "Margherita", "quantity": 143 } ]
}
GET /restaurants/{id}/customers

The restaurant's customer list (CRM), paginated. Filter with ?search=.

Manage drivers Write

Drivers belong to you and (optionally) to one restaurant. Creating or rotating a driver returns a raw driver token exactly once — hand it to the driver's app; they authenticate with it (see below).

GET /drivers
POST /drivers
curl -X POST https://www.menubarcode.com/api/v1/drivers \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Alex","phone":"+15550001111","restaurant_id":12}'

# → { "id": 7, "name": "Alex", ..., "token": "RAW_DRIVER_TOKEN_SHOWN_ONCE" }
PUT /drivers/{id}
DELETE /drivers/{id}
POST /drivers/{id}/rotate-token

Invalidates the old token and returns a fresh one.

Assign & track a delivery

GET /restaurants/{id}/deliveries

Delivery orders, filterable by ?delivery_status= and ?driver_id=.

POST /restaurants/{id}/orders/{orderId}/assign Write

Assign a driver {"driver_id": 7}. Sets delivery_status=assigned and fires order.driver_assigned.

PUT /restaurants/{id}/orders/{orderId}/delivery-status Write

Override the delivery stage: pending | assigned | picked_up | out_for_delivery | delivered | failed.

Driver app API

The driver app authenticates with a Driver token (not an owner token) issued above. Base path https://www.menubarcode.com/api/v1/driver. Every response is scoped to that one driver.

Authorization: Bearer RAW_DRIVER_TOKEN
GET /driver/me

The authenticated driver's profile.

GET /driver/deliveries

Orders assigned to this driver. Add ?active=1 to hide delivered/failed.

PUT /driver/deliveries/{orderId}/status

Advance the delivery: {"delivery_status":"out_for_delivery"} then "delivered" or "picked_up" / "failed", optional note). Fires the same webhooks as the owner endpoint.

PUT /driver/location

Push live position: {"lat":25.2048,"lng":55.2708}. Surfaced to the customer's tracking view while out for delivery.

Customer accounts

A standalone customer app authenticates its own users with a per-customer token (Sanctum-style: multiple devices, individually revocable). No owner token is involved. Customers are scoped per restaurant, so auth is under /restaurants/{id}/customer/…. Browse the menu first with the public endpoint:

GET /menu/{restaurantId} Public

Active menu grouped by category (sold-out items omitted). No auth.

Register / login

POST /restaurants/{id}/customer/register
POST /restaurants/{id}/customer/login
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/login \
  -H "Content-Type: application/json" \
  -d '{"email":"sam@example.com","password":"secret123","device":"iPhone 15"}'

# → { "token": "RAW_CUSTOMER_TOKEN", "customer": { "id": 42, "name": "Sam", ... } }

Passwordless (SMS OTP)

POST /restaurants/{id}/customer/otp/request
POST /restaurants/{id}/customer/otp/verify

Request a code for a phone number, then verify it. Verify finds-or-creates the customer and returns a token. Auth endpoints are rate-limited (login/register 10/min, OTP request 6/min).

Customer app API

Authenticate with the customer token. Base path https://www.menubarcode.com/api/v1/customer. Everything is scoped to the authenticated customer — the order body can never spoof another customer's id.

Authorization: Bearer RAW_CUSTOMER_TOKEN
GET /customer/me
PUT /customer/me

Profile read / update (name, email, phone, birthday, consents).

POST /customer/orders

Place an order as this customer (same item shape as the merchant create endpoint; identity is taken from the token). Returns the order with its track_token.

GET /customer/orders

The customer's own order history, paginated.

GET /customer/addresses
POST /customer/addresses
DELETE /customer/addresses/{id}

Saved delivery addresses (first one becomes default; supports lat/lng).

POST /customer/logout

Revokes the token used for the request (that device only).

Order tracking Public

No auth — access is gated by the order's unguessable track_token (returned when the order is created). This powers a customer app live-tracking screen.

GET /track/{token}
{
  "id": 5501, "status": "preparing", "delivery_status": "out_for_delivery",
  "is_paid": true, "total": 42.00,
  "timeline": { "preparing_at": "...", "out_for_delivery_at": "..." },
  "items": [ { "name": "Margherita", "quantity": 2 } ],
  "driver": { "name": "Alex", "lat": 25.2, "lng": 55.27, "location_updated_at": "..." }
}

The driver block (with live coordinates) appears only once the order is picked up / out for delivery.

Staff Login

A staff app (POS / KDS / waiter) authenticates each staff member with a per-staff token. Two paths mirror the dashboard: email + password, or a quick numeric PIN for shared kitchen tablets. Staff are scoped per restaurant.

POST /restaurants/{id}/staff/login
POST /restaurants/{id}/staff/pin
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/staff/pin \
  -H "Content-Type: application/json" -d '{"pin":"4321","device":"Kitchen iPad"}'

# → { "token": "RAW_STAFF_TOKEN",
#     "staff": { "id": 3, "role": "kitchen", "permissions": ["kds"] } }

The response lists the staff member's effective Permissions — a subset of orders, menu_edit, coupons, analytics, kds, customers derived from their role (manager / cashier / kitchen / waiter) plus any per-staff overrides. Endpoints are permission-gated (403 otherwise).

Staff app API

Authenticate with the staff token. Base path https://www.menubarcode.com/api/v1/staff. All actions are scoped to the staff member's restaurant.

Authorization: Bearer RAW_STAFF_TOKEN
GET /staff/me

Profile with role and permission list.

GET /staff/orders orders
PUT /staff/orders/{orderId}/status orders

List orders and update kitchen status. Requires the orders permission.

GET /staff/kds kds

Live kitchen tickets grouped by order, filtered to the staff member's station (or ?station_id=). Shows only items still queued|preparing|ready.

PUT /staff/kds/items/{itemId}/bump kds
PUT /staff/kds/items/{itemId}/recall kds

Advance (queued → preparing → ready → served) or step back one KDS status. The parent order's status re-syncs automatically.

POST /staff/menu/items menu_edit
PUT /staff/menu/items/{itemId} menu_edit
DELETE /staff/menu/items/{itemId} menu_edit
PATCH /staff/menu/items/{itemId}/sold-out menu_edit
POST /staff/menu/categories menu_edit

Edit the menu from the floor (managers). Same payloads as the merchant menu endpoints, scoped to the staff member's restaurant.

GET /staff/analytics analytics

Sales summary for the staff member's restaurant (same shape as the merchant analytics endpoint; ?from=&to=).

POST /staff/logout

Revokes this device's token.

Webhooks — setup

Register endpoints from the dashboard under API tokens & webhooks. Pick which events each endpoint receives. On save you get a per-endpoint Signing Secret; use the Test button to send a ping. Pause an endpoint to stop delivery without losing its secret.

Your endpoint should respond with a 2xx status quickly (within 10s). Any other status — or a timeout — is treated as a failure and retried.

Endpoints can also be managed programmatically (for Zapier/Make REST-Hooks) with a webhooks:write token:

GET    /api/v1/webhook-endpoints            # list your endpoints
POST   /api/v1/webhook-endpoints            # {"url":"https://…","events":["order.created"]} → 201 {id, secret, …}
DELETE /api/v1/webhook-endpoints/{id}       # unsubscribe → 204

The secret is returned only on create — store it to verify the signature. url must be a public HTTPS endpoint (SSRF-guarded); events must be from the list below (or *).

Webhook events

EventFires when
order.createdA new order is placed (dashboard or API).
order.status_changedAn order's kitchen status changes (dashboard, POS, or API).
order.paidAn order is marked fully paid (gateway or split bill).
order.driver_assignedA driver is assigned to a delivery.
order.out_for_deliveryThe driver is en route to the customer.
order.deliveredThe delivery was completed.
order.delivery_failedThe delivery could not be completed.
refund.completedA refund is completed for an order.
reservation.createdA table reservation is created.
reservation.cancelledA table reservation is cancelled.
customer.createdA new customer record is created.
shift.openedA cash-drawer / POS shift is opened.
shift.closedA cash-drawer / POS shift is closed.
menu.updatedA menu item or category is created, updated, or deleted (any surface). Payload: {restaurant_id, change, entity, id}.
entitlement.changedA feature entitlement is granted or revoked for the workspace (plan change, add-on, app install/uninstall, admin override). Payload: {action, feature_key, source_type, source_id, user_id, occurred_at} where action is granted or revoked.
subscription.*Subscription lifecycle: subscription.paused, .resumed, .renewed, .expired, .plan_changed, .past_due, .expiring, .trial_ending.
app.uninstalledA marketplace app is uninstalled (delivered to the app's endpoint).
*Subscribe to every event above.
pingSent by the Test button to verify wiring.

Failed a delivery while your endpoint was down? Use Redeliver on any row in the dashboard's Recent deliveries log to re-queue it with a fresh webhook-id.

Webhook payload

Every delivery is a POST with this JSON envelope and these headers:

POST /your-endpoint HTTP/1.1
Content-Type: application/json
webhook-id: msg_a1b2c3d4e5f6g7h8i9j0k1l2
webhook-timestamp: 1751472240
webhook-signature: v1,K5f...base64...==
X-Webhook-Event: order.created          (legacy)
X-Webhook-Signature: 9a3f...hex...      (legacy, HMAC of body only)

{
  "id": "msg_a1b2c3d4e5f6g7h8i9j0k1l2",
  "event": "order.created",
  "created_at": "2026-07-02T18:04:00+00:00",
  "data": { "order_id": 5501, "total": "42.00" }
}

The id is unique per delivery. Because retries reuse the same id, use it to make your handler idempotent.

Verifying the signature

The webhook-signature header is an HMAC-SHA256, base64-encoded, computed over {id}.{timestamp}.{body} using your endpoint's signing secret. Binding the id and timestamp into the signature is what makes a captured request safe against replay. Reject any request whose webhook-timestamp is more than ~5 minutes old.

PHP

$secret  = 'whsec_from_dashboard';
$id      = $_SERVER['HTTP_WEBHOOK_ID'];
$ts      = $_SERVER['HTTP_WEBHOOK_TIMESTAMP'];
$body    = file_get_contents('php://input');
$sent    = explode(',', $_SERVER['HTTP_WEBHOOK_SIGNATURE'])[1] ?? '';

if (abs(time() - (int) $ts) > 300) { http_response_code(400); exit; }

$expected = base64_encode(hash_hmac('sha256', "$id.$ts.$body", $secret, true));
if (!hash_equals($expected, $sent)) { http_response_code(401); exit; }

// verified — process $body
http_response_code(200);

Node.js

const crypto = require('crypto');

function verify(req, secret) {
  const id  = req.headers['webhook-id'];
  const ts  = req.headers['webhook-timestamp'];
  const sig = (req.headers['webhook-signature'] || '').split(',')[1];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${id}.${ts}.${req.rawBody}`)
    .digest('base64');

  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig || ''));
}
a legacy X-Webhook-Signature header (plain HMAC-SHA256 of the body, hex) is also sent for backward compatibility. New integrations should use webhook-signature.

Retries & delivery log

Delivery is asynchronous and retried on failure with exponential backoff plus jitter: roughly 1m → 5m → 15m → 1h (up to 5 attempts total). Every attempt — success or failure — is recorded in the delivery log on your dashboard with its HTTP status, attempt number, and response snippet.

Delivery is at-least-once. Deduplicate on the webhook-id to handle occasional repeats.

MCP servers

New a one-page, copy-paste setup guide for every client lives at /mcp — per-client install commands, one-click deeplinks, the tool catalog and sample prompts. This page stays the deep reference.

Five Model Context Protocol servers connect AI agents (ChatGPT, Claude, Cursor) to the platform — pick the one that matches your audience. All speak JSON-RPC 2.0 over HTTP and negotiate protocol versions 2024-11-05 / 2025-03-26 / 2025-06-18.

ServerEndpointAudienceAuthTools
Adminhttps://www.menubarcode.com/mcpStore owners — manage the storeAPI token (Bearer)23
Storefronthttps://www.menubarcode.com/mcp/storefrontA diner's agent — shop & order one storeStorefront token (agent scope)12
Customerhttps://www.menubarcode.com/mcp/customerA signed-in diner — their own ordersCustomer token (OTP login)5
Cataloghttps://www.menubarcode.com/mcp/catalogAnyone — discover stores platform-widePublic3
Devhttps://www.menubarcode.com/mcp/devAI coding tools — build themes/integrationsPublic7

Quickstart: jump to Admin, Catalog, Customer, or Dev. The Storefront server shares the Admin connect pattern with an X-Storefront-Token header instead of a Bearer token.

MCP server (Admin)

An MCP-compatible AI client (Claude, ChatGPT, Cursor) can operate your restaurant in natural language using the same API tokens. Point it at:

POST https://www.menubarcode.com/mcp JSON-RPC 2.0

Authenticate with Authorization: Bearer YOUR_TOKEN. Every tool declares the granular ability it needs (resource:action); a legacy read token covers every :read tool and write covers everything. All calls are scoped to your restaurants and rate-limited. Tools you lack the ability for are hidden from tools/list.

Connect (Claude Code)

claude mcp add --transport http platform-admin https://www.menubarcode.com/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"

List tools

curl -X POST https://www.menubarcode.com/mcp \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Call a tool (e.g. add a menu item)

curl -X POST https://www.menubarcode.com/mcp \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"add_menu_item",
                 "arguments":{"restaurant_id":12,"name":"Latte","price":4.5}}}'

Tools

ToolAbilityWhat it does
list_restaurantsreadRestaurants you own.
get_menureadA restaurant's categories & items.
list_categoriesmenu:readCategories with item counts.
add_categorymenu:writeCreate a category.
update_categorymenu:writeRename / reorder a category.
delete_categorymenu:writeDelete a category (refuses if it has items).
add_menu_itemwriteCreate a menu item (plan-limit checked).
update_menu_itemwriteEdit an item's name/price/description.
delete_menu_itemmenu:writePermanently delete an item.
set_item_availabilitymenu:writeMark an item in/out of stock (86 toggle).
list_ordersorders:readOrders newest first; status/date/search filters.
get_orderorders:readFull order detail incl. line items.
update_order_statuswriteAdvance an order's kitchen status.
list_customerscustomers:read + crm_suiteCRM list; search name/phone/email. Hidden from tools/list without the entitlement.
get_customercustomers:read + crm_suiteOne customer's full record. Hidden from tools/list without the entitlement.
sales_reportanalytics:readRevenue + order counts + top items for a range.
get_restaurant_settingsrestaurants:readProfile + ordering settings snapshot.
update_business_hoursrestaurants:writeSet the business-hours text.
list_couponsorders:readYour discount coupons.
create_couponorders:writeCreate a percentage/fixed coupon.
update_couponorders:writeEdit a coupon.
delete_couponorders:writeDelete a coupon.

Catalog MCP (discover restaurants)

A public, read-only MCP server that lets AI agents discover restaurants and dishes across the whole platform, then deep-link into a specific store to order. No auth, rate-limited.

POST https://www.menubarcode.com/mcp/catalog JSON-RPC 2.0 · public

Connect (Claude Code)

claude mcp add --transport http platform-catalog https://www.menubarcode.com/mcp/catalog
ToolWhat it does
search_storesFind restaurants by keyword/city (name, address, menu_url, storefront_mcp hint).
search_itemsFind dishes across all stores (query/dietary/max_price/city), grouped by store.
get_storeFull public detail for one store by slug or id.
list_starter_menusThe bundled starter-menu presets a new store can seed from (cafe, pizzeria, burger, bakery, lounge).

Only active, publicly listed stores appear; owners can opt out in their store settings. No owner contact details are ever returned. To place an order, use the store's storefront MCP with a per-store agent token.

Customer Account MCP

Lets a diner's AI assistant read, track, and reorder their own orders. Authenticated by a per-customer token from the existing OTP login; customer identity comes only from the token — a phone or customer id is never accepted as an argument.

POST https://www.menubarcode.com/mcp/customer JSON-RPC 2.0 · customer token

Get a token (OTP flow)

# 1) request a one-time code (sent to the customer's phone)
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/otp/request \
  -H "Content-Type: application/json" -d '{"phone":"+15551234567"}'

# 2) verify the code → returns a customer bearer token
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/otp/verify \
  -H "Content-Type: application/json" -d '{"phone":"+15551234567","code":"123456"}'

Connect (Claude Code)

claude mcp add --transport http my-orders https://www.menubarcode.com/mcp/customer \
  --header "Authorization: Bearer CUSTOMER_TOKEN"
ToolWhat it does
my_ordersYour recent orders (most recent first).
order_detailFull detail + line items for one of your orders.
track_orderLive status by order id or track token.
reorderRebuild a past order as a cart draft (skips sold-out items).
my_profileYour name, phone, and order count.
my_bookingsYour own hotel room bookings at this venue (code, status, dates, room type, total).
curl -X POST https://www.menubarcode.com/mcp/customer \
  -H "Authorization: Bearer CUSTOMER_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"my_orders","arguments":{"limit":5}}}'

Connect your AI editor

Building a theme or an integration with Claude Code, Cursor, or VS Code? Point it at the public Dev MCP server — your AI tool gets live platform docs, the generated Liquid whitelist, and server-side theme validation. No token needed.

POST https://www.menubarcode.com/mcp/dev JSON-RPC 2.0 · public

Claude Code

claude mcp add --transport http platform-dev https://www.menubarcode.com/mcp/dev

Cursor.cursor/mcp.json

{ "mcpServers": { "platform-dev": { "url": "https://www.menubarcode.com/mcp/dev" } } }

VS Code.vscode/mcp.json

{ "servers": { "platform-dev": { "type": "http", "url": "https://www.menubarcode.com/mcp/dev" } } }

Tools learn_platform (start here), search_docs / fetch_full_doc, get_liquid_reference, get_section_schema, validate_theme, list_webhook_events. Recommended agent workflow: learn → build → validate → deliver.

The authenticated MCP server above (https://www.menubarcode.com/mcp) operates your restaurant data; this one serves documentation and validation and is safe to share publicly.

Changelog

DateChange
2026-08-20Hotel PMS + growth release: refund.completed, reservation.created, reservation.cancelled, customer.created, shift.opened, shift.closed webhook events; staff push-device registration + 2fa endpoints; new MCP tools hotel_availability, my_bookings, list_starter_menus, list_webhook_events.
2026-07-28Router-generated discovery index + OpenAPI 3.1 spec (always in parity with the deployed API); Idempotency-Key on order-create; per-token API rate limits; subscription.* + app.uninstalled webhook events + delivery Redeliver.
2026-07-07Public Dev MCP server for AI coding tools: live docs search, generated Liquid reference, server-side theme validation.
2026-07-02Granular token scopes (resource:action); staff menu editing + analytics endpoints.
2026-07-02Staff app: per-staff token auth (password + PIN), role-permission gating, order status, KDS bump/recall.
2026-07-02Standalone customer app: per-customer token auth (register/login/OTP), profile, order placement + history, saved addresses, public menu browse.
2026-07-02Full management API: menu CRUD, order creation, drivers + delivery lifecycle, driver-app token API, public order tracking, sales analytics, customers. New delivery webhook events.
2026-07-02Queued webhook delivery with retries; Standard-Webhooks signing (webhook-id/timestamp/signature); order.paid event; public docs.
2026-06-26Initial v1 REST API, tokens, and webhook endpoints.

Back to Menubarcode

Menubarcode API v1 · Base URL https://www.menubarcode.com/api/v1

Contact Us

Follow Us