v1 · REST + Webhooks

Entwicklerdokumentation

Erstellen Sie Kunden-, Fahrer- und Händler-Apps über eine einzige API. Lesen und schreiben Sie Restaurants, Menüs, Bestellungen und Fahrer; empfangen Sie Echtzeit-Events über signierte Webhooks. Alles ist auf den Token-Inhaber beschränkt.

🛍️ Kunden-App 🛵 Fahrer-App 🧑‍🍳 Händler-App

Entwickeln Sie für den Marketplace? App-Entwicklerdokumentation →  ·  Theme-Entwicklerdokumentation →

Neu Unser Dev MCP-Server macht jedes MCP-fähige KI-Tool zu einem Plattform-Experten. learn_platform bereitet es vor, get_liquid_reference gibt ihm die maßgebliche Whitelist und validate_theme führt die eigenen Prüfungen des Marketplace für dessen Ausgabe aus — die komplette Schleife aus Lernen → Erstellen → Validieren, ohne Ihren Editor zu verlassen. Mit einem Befehl verbinden →

Erste Schritte

Erstellen Sie ein API-Token in Ihrem Dashboard unter API-Tokens & Webhooks. Wählen Sie die read und/oder write Berechtigungen und kopieren Sie das Token — es wird nur einmal angezeigt.

Basis-URL: https://www.menubarcode.com/api/v1

Eine schnelle Prüfung, ob Ihr Token funktioniert:

curl https://www.menubarcode.com/api/v1/restaurants \
  -H "Authorization: Bearer YOUR_TOKEN"
Der Root GET https://www.menubarcode.com/api/v1 gibt einen maschinenlesbaren Index der verfügbaren Endpunkte zurück (keine Authentifizierung erforderlich). Maschinenlesbar OpenAPI 3.1-Spezifikation (JSON) — generiert aus dem Live-Router, sodass sie immer der bereitgestellten API entspricht.

Authentifizierung

Senden Sie Ihr Token bei jeder Anfrage als Bearer-Header:

Authorization: Bearer YOUR_TOKEN

Für schnelle Tests können Sie stattdessen ?api_token=YOUR_TOKEN als Query-Parameter übergeben, der Header wird jedoch dringend empfohlen, damit Tokens nie in Logs gelangen.

BerechtigungZuweisungen
readAlle GET Endpunkte (jede Ressource).
writeAlle schreibenden Endpunkte (und, als Obermenge, alle Lesezugriffe).

Beschränkte Tokens

Über grob hinaus read/write, kann ein Token mit spezifischen Ressourcen eingeschränkt werden über resource:action Berechtigungen. Ressourcen: restaurants, menu, orders, customers, analytics, drivers, webhooks; Aktionen read, write. Wählen Sie sie beim Erstellen des Tokens im Dashboard aus.

Beispiel-TokenKann tun
["orders:write"]Nur Bestellungen lesen + schreiben (eine POS-Integration).
["menu:read"]Das Menü lesen; sonst nichts.
["orders:read","analytics:read"]Ein Reporting-Dashboard.

Abdeckungsregeln: * gewährt alles; ein :write Scope gewährt auch dessen :read; grob read/write verhalten sich wie *:read / *:write. Eine Anfrage ohne den erforderlichen Scope gibt zurück 403. Legacy read/write Tokens sind nicht betroffen.

Tokens werden gespeichert gehasht (SHA-256) und können ein optionales Ablaufdatum tragen. Widerrufen Sie jedes Token sofort über das Dashboard.

Ratenlimits

Die API erlaubt 120 Anfragen pro Minute pro Token. Wird dies überschritten, gibt sie zurück 429 Too Many Requests mit einem Retry-After -Header. Standard-Rate-Limit-Header sind in jeder Antwort enthalten:

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

Fehler

Jeder Fehler auf einer /api/v1 -Route gibt konventionelle HTTP-Statuscodes und einen einzigen JSON-Envelope zurück — eine menschenlesbare message, eine stabile maschinen- code, und (bei der Validierung) eine feldbezogene errors Karte

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

{ "message": "The given data was invalid.",
  "code": "validation_failed",
  "errors": { "title": ["The title field is required."] } }
StatuscodeBedeutung
401unauthenticatedFehlendes, ungültiges oder abgelaufenes Token.
403forbiddenDem Token fehlt die erforderliche Berechtigung/der erforderliche Scope.
404not_foundRessource nicht gefunden oder gehört nicht zum Token.
422validation_failedValidierung fehlgeschlagen (siehe errors).
429rate_limitedRate-Limit überschritten.
Parsen Sie die maschinen- code, nicht die menschen- message — Meldungen können umformuliert oder lokalisiert werden; Codes sind stabil.
Das Anfordern einer Ressource, die Ihnen nicht gehört, gibt zurück 404, nicht 403 — die API bestätigt niemals die Existenz von Daten eines anderen Inhabers.

Seitennummerierung

Listen-Endpunkte geben paginierte Envelopes im Laravel-Stil zurück. Verwenden Sie den ?page= Query-Parameter, um durch die Seiten zu blättern.

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

Restaurants & Menü lesen

GET /restaurants

Listet die dem Token gehörenden Restaurants auf, paginiert (20 pro Seite).

{
  "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}

Ein einzelnes Restaurant mit seinen Menükategorien und der Artikelanzahl.

GET /restaurants/{id}/menu

Das vollständige aktive Menü, nach Kategorie gruppiert.

[
  { "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 }
    ]
  }
]

Bestellungen

GET /restaurants/{id}/orders

Bestellungen, neueste zuerst, paginiert (30/Seite). Filtern Sie mit ?status=.

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

Vollständige Bestelldetails mit Positionen, Extras, Fahrer und Lieferverlauf.

POST /restaurants/{id}/orders Schreiben

Eine Bestellung erstellen — so übermittelt eine Kunden-App einen Warenkorb (das Backend des Händlers hält das Token). Jeder Artikel wird gegen das Live-Menü des Restaurants validiert; ausverkaufte oder fremde Artikel lehnen die gesamte Bestellung ab (422). Löst order.created aus und gibt die vollständige Bestellung inklusive ihres 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 }
    ]
  }'

Bestellung type ist einer von on-table, takeaway, delivery. für on-table übergeben Sie table_number; für delivery übergeben Sie address.

Idempotenz. Senden Sie einen Idempotency-Key -Header (oder einen Body client_uuid) bei jedem Bestell-Erstellungsaufruf. Ein erneuter Versuch mit demselben Schlüssel gibt die ursprüngliche Bestellung zurück und erstellt nie ein Duplikat — sicher bei verlorenen Antworten und Offline-Replay. Schlüssel sind pro Restaurant beschränkt.

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

Den Küchenstatus aktualisieren (new|preparing|ready|delivered|completed|cancelled). Löst aus order.status_changed.

Storefront API (Token pro Restaurant)

Eine separate, öffentlich zugängliche API, authentifiziert durch ein Storefront-Token pro Restaurant gesendet als X-Storefront-Token (nicht das Inhaber-Bearer-Token). Erstellen Sie diese über Ihr Dashboard; jedes Token kann immer nur sein eigenes Restaurant erreichen. Der Lesescope ist menu:read; das Aufgeben von Bestellungen erfordert den order:write Umfang

GET /storefront/menu

Vollständiges Menü für das Restaurant des Tokens (Varianten, Extras, Gruppen, Galerie).

GET /storefront/restaurant

Grundlegende Restaurant-Informationen für das Restaurant des Tokens.

POST /storefront/orders order:write

Einen Warenkorb im Namen eines Gastes übermitteln. Serverseitig bepreist und unbezahlt (der Gast zahlt bei Ankunft); takeaway oder on-table nur. Jeder Artikel wird gegen das Live-Menü validiert — ausverkaufte oder fremde Artikel lehnen die gesamte Bestellung ab (422). Limits: 40 Artikel/Bestellung, 30 Menge/Position. Optional coupon_code wendet serverseitig einen Inhaberrabatt an. Löst aus order.created und gibt zurück 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 & Kunden

GET /restaurants/{id}/analytics

Umsatzübersicht über einen Zeitraum (?from=YYYY-MM-DD&to=YYYY-MM-DD, Standard: letzte 30 Tage): Bestellzahlen nach Status/Typ, Brutto- & bezahlter Umsatz, durchschnittlicher Bestellwert und Top-Artikel.

{
  "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

Die Kundenliste des Restaurants (CRM), paginiert. Filtern Sie mit ?search=.

Fahrer verwalten Schreiben

Fahrer gehören zu Ihnen und (optional) zu einem Restaurant. Das Erstellen oder Rotieren eines Fahrers gibt ein rohes Fahrer-Token genau einmal zurück — Geben Sie es an die App des Fahrers weiter; sie authentifiziert sich damit (siehe unten).

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

Macht das alte Token ungültig und gibt ein neues zurück.

Eine Lieferung zuweisen & verfolgen

GET /restaurants/{id}/deliveries

Lieferbestellungen, filterbar nach ?delivery_status= und ?driver_id=.

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

Fahrer zuweisen {"driver_id": 7}. Setzt delivery_status=assigned und löst aus order.driver_assigned.

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

Die Lieferphase überschreiben: pending | assigned | picked_up | out_for_delivery | delivered | failed.

Fahrer-App-API

Die Fahrer-App authentifiziert sich mit einem Fahrer-Token (kein Inhaber-Token), das oben erstellt wurde. Basispfad https://www.menubarcode.com/api/v1/driver. Jede Antwort ist auf diesen einen Fahrer beschränkt.

Authorization: Bearer RAW_DRIVER_TOKEN
GET /driver/me

Das Profil des authentifizierten Fahrers.

GET /driver/deliveries

Diesem Fahrer zugewiesene Bestellungen. Fügen Sie ?active=1 hinzu, um zugestellt/fehlgeschlagen auszublenden.

PUT /driver/deliveries/{orderId}/status

Die Lieferung voranbringen: {"delivery_status":"out_for_delivery"} dann "delivered" oder "picked_up" / "failed", optional note). Löst dieselben Webhooks aus wie der Inhaber-Endpunkt.

PUT /driver/location

Live-Position senden: {"lat":25.2048,"lng":55.2708}. Wird in der Tracking-Ansicht des Kunden angezeigt, während die Lieferung unterwegs ist.

Kundenkonten

A eigenständige Kunden-App authentifiziert ihre eigenen Nutzer mit einem Token pro Kunde (Sanctum-Stil: mehrere Geräte, einzeln widerrufbar). Es ist kein Inhaber-Token beteiligt. Kunden sind pro Restaurant beschränkt, daher liegt die Authentifizierung unter /restaurants/{id}/customer/…. Durchsuchen Sie zuerst das Menü mit dem öffentlichen Endpunkt:

GET /menu/{restaurantId} Öffentlich

Aktives Menü, nach Kategorie gruppiert (ausverkaufte Artikel ausgelassen). Keine Authentifizierung.

Registrieren / Anmelden

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", ... } }

Passwortlos (SMS OTP)

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

Fordern Sie einen Code für eine Telefonnummer an und verifizieren Sie ihn dann. Die Verifizierung findet oder erstellt den Kunden und gibt ein Token zurück. Auth-Endpunkte sind rate-limitiert (Login/Registrierung 10/Min., OTP-Anfrage 6/Min.).

Kunden-App-API

Authentifizieren Sie sich mit dem Kunden-Token. Basispfad https://www.menubarcode.com/api/v1/customer. Alles ist auf den authentifizierten Kunden beschränkt — der Bestell-Body kann niemals die ID eines anderen Kunden vortäuschen.

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

Profil lesen / aktualisieren (Name, E-Mail, Telefon, Geburtstag, Einwilligungen).

POST /customer/orders

Eine Bestellung als dieser Kunde aufgeben (gleiche Artikelstruktur wie beim Händler-Erstellungsendpunkt; die Identität wird dem Token entnommen). Gibt die Bestellung mit ihrem track_token.

GET /customer/orders

Der eigene Bestellverlauf des Kunden, paginiert.

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

Gespeicherte Lieferadressen (die erste wird zum Standard; unterstützt lat/lng).

POST /customer/logout

Widerruft das für die Anfrage verwendete Token (nur dieses Gerät).

Bestellverfolgung Öffentlich

Keine Authentifizierung — der Zugriff wird durch das nicht erratbare track_token der Bestellung gesteuert (bei der Bestellerstellung zurückgegeben). Dies treibt einen Kunden-App Live-Tracking-Bildschirm an.

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": "..." }
}

Der Fahrerblock (mit Live-Koordinaten) erscheint erst, sobald die Bestellung abgeholt wurde / unterwegs ist.

Mitarbeiter-Login

A Mitarbeiter-App (POS / KDS / Kellner) authentifiziert jeden Mitarbeiter mit einem Token pro Mitarbeiter. Zwei Wege spiegeln das Dashboard: E-Mail + Passwort oder eine schnelle numerische PIN für gemeinsam genutzte Küchentablets. Mitarbeiter sind pro Restaurant beschränkt.

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"] } }

Die Antwort listet die effektiven Berechtigungen — eine Teilmenge von orders, menu_edit, coupons, analytics, kds, customers abgeleitet aus ihrer Rolle (Manager / Kassierer / Küche / Kellner) plus etwaiger mitarbeiterbezogener Überschreibungen. Endpunkte sind berechtigungsgeschützt (403 andernfalls).

Mitarbeiter-App-API

Authentifizieren Sie sich mit dem Mitarbeiter-Token. Basispfad https://www.menubarcode.com/api/v1/staff. Alle Aktionen sind auf das Restaurant des Mitarbeiters beschränkt.

Authorization: Bearer RAW_STAFF_TOKEN
GET /staff/me

Profil mit Rolle und Berechtigungsliste.

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

Bestellungen auflisten und Küchenstatus aktualisieren. Erfordert die orders Berechtigung.

GET /staff/kds kds

Live-Küchentickets, nach Bestellung gruppiert, gefiltert auf die Station des Mitarbeiters (oder ?station_id=). Zeigt nur Artikel an, die noch queued|preparing|ready.

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

Voranbringen (queued → preparing → ready → served) oder einen KDS-Status zurück. Der Status der übergeordneten Bestellung synchronisiert sich automatisch neu.

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

Das Menü aus dem Servicebereich bearbeiten (Manager). Gleiche Payloads wie die Händler-Menü-Endpunkte, beschränkt auf das Restaurant des Mitarbeiters.

GET /staff/analytics analytics

Umsatzübersicht für das Restaurant des Mitarbeiters (gleiche Struktur wie der Händler-Analytics-Endpunkt; ?from=&to=).

POST /staff/logout

Widerruft das Token dieses Geräts.

Webhooks — Einrichtung

Registrieren Sie Endpunkte über das Dashboard unter API-Tokens & Webhooks. Wählen Sie, welche Events jeder Endpunkt empfängt. Beim Speichern erhalten Sie ein endpunktbezogenes Signaturgeheimnis; Verwenden Sie die Test -Schaltfläche, um ein ping. Pausieren Sie einen Endpunkt, um die Zustellung zu stoppen, ohne sein Secret zu verlieren.

Ihr Endpunkt sollte mit einem 2xx -Status schnell antworten (innerhalb von 10 s). Jeder andere Status — oder ein Timeout — wird als Fehler behandelt und wiederholt.

Endpunkte können auch programmatisch (für Zapier/Make REST-Hooks) mit einem webhooks:write Token verwaltet werden:

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

Das secret wird zurückgegeben nur beim Erstellen — speichern Sie es, um die Signatur zu verifizieren. url muss ein öffentlicher HTTPS-Endpunkt sein (SSRF-geschützt); events muss aus der Liste unten stammen (oder *).

Webhook-Events

EreignisWird ausgelöst, wenn
order.createdEine neue Bestellung aufgegeben wird (Dashboard oder API).
order.status_changedSich der Küchenstatus einer Bestellung ändert (Dashboard, POS oder API).
order.paidEine Bestellung als vollständig bezahlt markiert wird (Gateway oder geteilte Rechnung).
order.driver_assignedEin Fahrer einer Lieferung zugewiesen wird.
order.out_for_deliveryDer Fahrer zum Kunden unterwegs ist.
order.deliveredDie Lieferung abgeschlossen wurde.
order.delivery_failedDie Lieferung nicht abgeschlossen werden konnte.
refund.completedEine Rückerstattung für eine Bestellung wird abgeschlossen.
reservation.createdEine Tischreservierung wird erstellt.
reservation.cancelledEine Tischreservierung wird storniert.
customer.createdEin neuer Kundendatensatz wird erstellt.
shift.openedEine Kassen-/POS-Schicht wird geöffnet.
shift.closedEine Kassen-/POS-Schicht wird abgeschlossen.
menu.updatedEin Menüartikel oder eine Kategorie erstellt, aktualisiert oder gelöscht wird (jede Oberfläche). Payload: {restaurant_id, change, entity, id}.
entitlement.changedEine Funktionsberechtigung für den Workspace gewährt oder widerrufen wird (Tarifwechsel, Add-on, App-Installation/-Deinstallation, Admin-Override). Payload: {action, feature_key, source_type, source_id, user_id, occurred_at} wobei action ist granted oder revoked.
subscription.*Abonnement-Lebenszyklus: subscription.paused, .resumed, .renewed, .expired, .plan_changed, .past_due, .expiring, .trial_ending.
app.uninstalledEine Marketplace-App deinstalliert wird (an den Endpunkt der App zugestellt).
*Alle oben genannten Events abonnieren.
pingGesendet über die Test -Schaltfläche, um die Verkabelung zu prüfen.

Eine Zustellung ist fehlgeschlagen, während Ihr Endpunkt offline war? Verwenden Sie Erneut zustellen in einer beliebigen Zeile im Protokoll „Letzte Zustellungen“ des Dashboards, um sie mit einem neuen webhook-id.

Webhook-Payload

Jede Zustellung ist ein POST mit diesem JSON-Envelope und diesen Headern:

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" }
}

Das id ist pro Zustellung eindeutig. Da Wiederholungen dasselbe id, verwenden, machen Sie damit Ihren Handler idempotent.

Die Signatur verifizieren

Das webhook-signature -Header ist ein HMAC-SHA256, base64-kodiert, berechnet über {id}.{timestamp}.{body} mit dem Signatur-Secret Ihres Endpunkts. Das Einbinden von ID und Zeitstempel in die Signatur macht eine abgefangene Anfrage sicher gegen Replay. Lehnen Sie jede Anfrage ab, deren webhook-timestamp älter als ~5 Minuten ist.

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 || ''));
}
ein Legacy- X-Webhook-Signature -Header (einfacher HMAC-SHA256 des Bodys, hex) wird aus Gründen der Abwärtskompatibilität ebenfalls gesendet. Neue Integrationen sollten webhook-signature.

Wiederholungen & Zustellungsprotokoll

Die Zustellung erfolgt asynchron und wird bei Fehlern mit exponentiellem Backoff plus Jitter wiederholt: etwa 1m → 5m → 15m → 1h (insgesamt bis zu 5 Versuche). Jeder Versuch — Erfolg oder Fehler — wird im Zustellungsprotokoll Ihres Dashboards mit HTTP-Status, Versuchsnummer und Antwort-Snippet festgehalten.

Die Zustellung erfolgt mindestens einmal. Deduplizieren Sie über die webhook-id um gelegentliche Wiederholungen zu behandeln.

MCP-Server

Neu eine einseitige Copy-Paste-Einrichtungsanleitung für jeden Client finden Sie unter /mcp — clientspezifische Installationsbefehle, One-Click-Deeplinks, den Tool-Katalog und Beispiel-Prompts. Diese Seite bleibt die ausführliche Referenz.

Fünf Model-Context-Protocol-Server verbinden KI-Agenten (ChatGPT, Claude, Cursor) mit der Plattform — wählen Sie den, der zu Ihrer Zielgruppe passt. Alle sprechen JSON-RPC 2.0 über HTTP und verhandeln Protokollversionen 2024-11-05 / 2025-03-26 / 2025-06-18.

ServerEndpunktZielgruppeAuthentifizierungWerkzeuge
Adminhttps://www.menubarcode.com/mcpStore-Inhaber — verwalten den StoreAPI-Token (Bearer)23
Storefronthttps://www.menubarcode.com/mcp/storefrontDer Agent eines Gastes — in einem Store stöbern & bestellenStorefront-Token (Agent-Scope)12
Customerhttps://www.menubarcode.com/mcp/customerEin angemeldeter Gast — seine eigenen BestellungenKunden-Token (OTP-Login)5
Cataloghttps://www.menubarcode.com/mcp/catalogJeder — Stores plattformweit entdeckenÖffentlich3
Devhttps://www.menubarcode.com/mcp/devKI-Coding-Tools — Themes/Integrationen erstellenÖffentlich7

Schnellstart: springen zu Admin, Catalog, Customer, oder Dev. Der Storefront-Server teilt sich das Admin-Verbindungsmuster mit einem X-Storefront-Token -Header anstelle eines Bearer-Tokens.

MCP-Server (Admin)

Ein MCP-kompatibler KI-Client (Claude, ChatGPT, Cursor) kann Ihr Restaurant in natürlicher Sprache mit denselben API-Tokens bedienen. Richten Sie ihn aus auf:

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

Authentifizieren mit Authorization: Bearer YOUR_TOKEN. Jedes Tool deklariert die granulare Berechtigung, die es benötigt (resource:action); ein Legacy- read -Token deckt jedes :read -Tool ab und write deckt alles ab. Alle Aufrufe sind auf Ihre Restaurants beschränkt und rate-limitiert. Tools, für die Ihnen die Berechtigung fehlt, sind ausgeblendet in tools/list.

Verbinden (Claude Code)

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

Tools auflisten

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"}'

Ein Tool aufrufen (z. B. einen Menüartikel hinzufügen)

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}}}'

Werkzeuge

WerkzeugBerechtigungWas es tut
list_restaurantsreadRestaurants, die Ihnen gehören.
get_menureadKategorien & Artikel eines Restaurants.
list_categoriesmenu:readKategorien mit Artikelanzahl.
add_categorymenu:writeEine Kategorie erstellen.
update_categorymenu:writeEine Kategorie umbenennen / neu anordnen.
delete_categorymenu:writeEine Kategorie löschen (verweigert, wenn sie Artikel enthält).
add_menu_itemwriteEinen Menüartikel erstellen (Tariflimit wird geprüft).
update_menu_itemwriteName/Preis/Beschreibung eines Artikels bearbeiten.
delete_menu_itemmenu:writeEinen Artikel dauerhaft löschen.
set_item_availabilitymenu:writeEinen Artikel als verfügbar/ausverkauft markieren (86-Umschalter).
list_ordersorders:readBestellungen, neueste zuerst; Filter nach Status/Datum/Suche.
get_orderorders:readVollständige Bestelldetails inkl. Positionen.
update_order_statuswriteDen Küchenstatus einer Bestellung voranbringen.
list_customerscustomers:read + crm_suiteCRM-Liste; Suche nach Name/Telefon/E-Mail. Ohne die Berechtigung aus tools/list ausgeblendet.
get_customercustomers:read + crm_suiteDer vollständige Datensatz eines Kunden. Ohne die Berechtigung aus tools/list ausgeblendet.
sales_reportanalytics:readUmsatz + Bestellzahlen + Top-Artikel für einen Zeitraum.
get_restaurant_settingsrestaurants:readMomentaufnahme von Profil- und Bestelleinstellungen.
update_business_hoursrestaurants:writeDen Text der Öffnungszeiten festlegen.
list_couponsorders:readIhre Rabattgutscheine.
create_couponorders:writeEinen Prozent-/Festbetrag-Gutschein erstellen.
update_couponorders:writeEinen Gutschein bearbeiten.
delete_couponorders:writeEinen Gutschein löschen.

Catalog MCP (Restaurants entdecken)

Ein öffentlicher, schreibgeschützter MCP-Server, mit dem KI-Agenten Restaurants und Gerichte auf der gesamten Plattform entdecken und dann per Deeplink zu einem bestimmten Store gelangen, um zu bestellen. Keine Authentifizierung, rate-limitiert.

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

Verbinden (Claude Code)

claude mcp add --transport http platform-catalog https://www.menubarcode.com/mcp/catalog
WerkzeugWas es tut
search_storesRestaurants nach Stichwort/Stadt finden (Name, Adresse, menu_url, storefront_mcp-Hinweis).
search_itemsGerichte über alle Stores hinweg finden (Suche/Ernährung/max_price/Stadt), nach Store gruppiert.
get_storeVollständige öffentliche Details für einen Store nach Slug oder ID.
list_starter_menusDie mitgelieferten Starter-Menü-Vorlagen, aus denen ein neues Geschäft starten kann (Café, Pizzeria, Burger, Bäckerei, Lounge).

Nur aktive, öffentlich gelistete Stores erscheinen; Inhaber können sich in ihren Store-Einstellungen abmelden. Es werden niemals Kontaktdaten des Inhabers zurückgegeben. Um eine Bestellung aufzugeben, verwenden Sie das Storefront MCP mit einem Agent-Token pro Store.

Customer Account MCP

Ermöglicht dem KI-Assistenten eines Gastes, zu lesen, zu verfolgen und erneut zu bestellen ihre eigenen Bestellungen. Authentifiziert durch ein Token pro Kunde aus dem bestehenden OTP-Login; die Kundenidentität stammt ausschließlich aus dem Token — eine Telefonnummer oder Kunden-ID wird niemals als Argument akzeptiert.

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

Ein Token erhalten (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"}'

Verbinden (Claude Code)

claude mcp add --transport http my-orders https://www.menubarcode.com/mcp/customer \
  --header "Authorization: Bearer CUSTOMER_TOKEN"
WerkzeugWas es tut
my_ordersIhre letzten Bestellungen (neueste zuerst).
order_detailVollständige Details + Positionen für eine Ihrer Bestellungen.
track_orderLive-Status nach Bestell-ID oder Tracking-Token.
reorderEine frühere Bestellung als Warenkorb-Entwurf wiederherstellen (überspringt ausverkaufte Artikel).
my_profileIhr Name, Ihre Telefonnummer und Bestellanzahl.
my_bookingsIhre eigenen Hotelzimmerbuchungen an diesem Ort (Code, Status, Daten, Zimmertyp, Gesamt).
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}}}'

Verbinden Sie Ihren KI-Editor

Erstellen Sie ein Theme oder eine Integration mit Claude Code, Cursor oder VS Code? Richten Sie es auf die öffentliche Dev MCP-Server — Ihr KI-Tool erhält Live-Plattformdokumentation, die generierte Liquid-Whitelist und serverseitige Theme-Validierung. Kein Token erforderlich.

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" } } }

Werkzeuge learn_platform (hier beginnen), search_docs / fetch_full_doc, get_liquid_reference, get_section_schema, validate_theme, list_webhook_events. Empfohlener Agent-Workflow: Lernen → Erstellen → Validieren → Ausliefern.

Der authentifizierte MCP-Server oben (https://www.menubarcode.com/mcp) arbeitet mit Ihren Restaurantdaten; dieser hier stellt Dokumentation und Validierung bereit und kann bedenkenlos öffentlich geteilt werden.

Änderungsprotokoll

DatumÄndern
2026-08-20Hotel-PMS + Wachstums-Release: refund.completed, reservation.created, reservation.cancelled, customer.created, shift.opened, shift.closed Webhook-Ereignisse; Registrierung von Personal-Push-Geräten + 2fa Endpunkte; neue MCP-Tools hotel_availability, my_bookings, list_starter_menus, list_webhook_events.
2026-07-28Vom Router generierter Discovery-Index + OpenAPI 3.1-Spezifikation (immer im Einklang mit der bereitgestellten API); Idempotency-Key bei der Bestellerstellung; API-Rate-Limits pro Token; subscription.* + app.uninstalled Webhook-Events + Zustellung Erneut zustellen.
2026-07-07Öffentlich Dev MCP-Server für KI-Coding-Tools: Live-Dokumentationssuche, generierte Liquid-Referenz, serverseitige Theme-Validierung.
2026-07-02Granulare Token-Scopes (resource:action); Mitarbeiter-Menübearbeitung + Analytics-Endpunkte.
2026-07-02Mitarbeiter-App: Token-Auth pro Mitarbeiter (Passwort + PIN), Rollenberechtigungs-Gating, Bestellstatus, KDS Bump/Recall.
2026-07-02Eigenständige Kunden-App: Token-Auth pro Kunde (Registrierung/Login/OTP), Profil, Bestellaufgabe + Verlauf, gespeicherte Adressen, öffentliches Menü-Browsing.
2026-07-02Vollständige Management-API: Menü-CRUD, Bestellerstellung, Fahrer + Lieferlebenszyklus, Fahrer-App-Token-API, öffentliche Bestellverfolgung, Umsatz-Analytics, Kunden. Neue Liefer-Webhook-Events.
2026-07-02Warteschlangenbasierte Webhook-Zustellung mit Wiederholungen; Standard-Webhooks-Signierung (webhook-id/timestamp/signature); order.paid -Event; öffentliche Dokumentation.
2026-06-26Erste v1 REST-API, Tokens und Webhook-Endpunkte.

Zurück zu Menubarcode

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

Kontaktieren Sie uns

Folgen Sie uns