v1 · REST + Webhooks

Documentation développeur

Créez des applis client, livreur et marchand sur une seule API. Lisez et modifiez restaurants, menus, commandes et livreurs ; recevez des événements en temps réel via des webhooks signés. Tout est limité au propriétaire du token.

🛍️ appli client 🛵 App livreur 🧑‍🍳 Appli marchand

Vous développez pour la marketplace ? Documentation pour développeurs d’apps →  ·  Documentation pour développeurs de thèmes →

Nouveau notre Serveur Dev MCP transforme tout outil IA compatible MCP en expert de la plateforme. learn_platform l’initialise, get_liquid_reference lui fournit la liste blanche de référence, et validate_theme exécute les propres contrôles de la marketplace sur sa sortie — la boucle complète apprendre → construire → valider sans quitter votre éditeur. Connectez-vous en une commande →

Premiers pas

Créez un token API depuis votre tableau de bord, sous Tokens API et webhooks. Choisissez les read et/ou write et copiez le token — il n’est affiché qu’une seule fois.

URL de base : https://www.menubarcode.com/api/v1

Une vérification rapide que votre token fonctionne :

curl https://www.menubarcode.com/api/v1/restaurants \
  -H "Authorization: Bearer YOUR_TOKEN"
La racine GET https://www.menubarcode.com/api/v1 renvoie un index lisible par machine des endpoints disponibles (aucune authentification requise). Lisible par machine Spécification OpenAPI 3.1 (JSON) — générée à partir du routeur en direct, elle correspond donc toujours à l’API déployée.

Authentification

Envoyez votre token en en-tête Bearer sur chaque requête :

Authorization: Bearer YOUR_TOKEN

Pour des tests rapides, vous pouvez aussi passer ?api_token=YOUR_TOKEN en paramètre de requête, mais l’en-tête est fortement recommandé pour que les tokens ne fuient jamais dans les logs.

CapacitéAttributions
readTous GET endpoints (chaque ressource).
writeTous les endpoints de modification (et, en tant que sur-ensemble, toutes les lectures).

Tokens à portée limitée

Au-delà du grossier read/write, un token peut être limité à des ressources précises avec des resource:action capacités. Ressources : restaurants, menu, orders, customers, analytics, drivers, webhooks; Actions read, write. Sélectionnez-les lors de la création du token dans le tableau de bord.

Token d’exemplePeut faire
["orders:write"]Lecture + écriture des commandes uniquement (une intégration POS).
["menu:read"]Lire le menu ; rien d’autre.
["orders:read","analytics:read"]Un tableau de bord de reporting.

Règles de couverture : * accorde tout ; une portée :write accorde aussi ses :read; grossier read/write se comportent comme *:read / *:write. Une requête sans la portée requise renvoie 403. Anciens read/write les tokens ne sont pas affectés.

Les tokens sont hachés au repos (SHA-256) et peuvent avoir une expiration facultative. Révoquez n’importe quel token instantanément depuis le tableau de bord.

Limites de débit

L’API autorise 120 requêtes par minute par token. Le dépassement renvoie 429 Too Many Requests avec un en-tête Retry-After . Les en-têtes standard de limitation de débit sont inclus dans chaque réponse :

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

Erreurs

Chaque erreur sur une route /api/v1 renvoie des codes de statut HTTP conventionnels et une seule enveloppe JSON — un message lisible message, un code machine stable code, et (à la validation) un détail par champ errors Carte

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

{ "message": "The given data was invalid.",
  "code": "validation_failed",
  "errors": { "title": ["The title field is required."] } }
StatutcodeSignification
401unauthenticatedToken manquant, invalide ou expiré.
403forbiddenLe token n’a pas la capacité/portée requise.
404not_foundRessource introuvable ou non détenue par le token.
422validation_failedÉchec de la validation (voir errors).
429rate_limitedLimite de débit dépassée.
Analysez le code machine code, pas le message humain message — les messages peuvent être reformulés ou localisés ; les codes sont stables.
Demander une ressource qui ne vous appartient pas renvoie 404, non 403 — l’API ne confirme jamais l’existence des données d’un autre propriétaire.

Pagination

Les endpoints de liste renvoient des enveloppes paginées façon Laravel. Utilisez le ?page= paramètre de requête pour parcourir les pages.

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

Lire restaurants et menu

GET /restaurants

Liste les restaurants détenus par le token, paginés (20 par 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}

Un restaurant unique avec ses catégories de menu et son nombre d’articles.

GET /restaurants/{id}/menu

Le menu actif complet, regroupé par catégorie.

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

Commandes

GET /restaurants/{id}/orders

Commandes du plus récent au plus ancien, paginées (30/page). Filtrez avec ?status=.

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

Détail complet de la commande avec lignes, extras, livreur et chronologie de livraison.

POST /restaurants/{id}/orders Écrire

Créer une commande — c'est ainsi qu'un appli client soumet un panier (le backend du marchand détient le token). Chaque article est validé par rapport au menu en direct du restaurant ; les articles épuisés ou étrangers font rejeter toute la commande (422). Déclenche order.created et renvoie la commande complète, y compris son 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 }
    ]
  }'

Commande type est l'un de on-table, takeaway, delivery. pour on-table transmettez table_number; pour delivery transmettez address.

Idempotence. Envoyez un Idempotency-Key en-tête (ou un corps client_uuid) sur tout appel de création de commande. Réessayer avec la même clé renvoie la commande d'origine et ne crée jamais de doublon — sûr en cas de réponses perdues et de rejeu hors ligne. Les clés sont limitées à chaque restaurant.

PUT /restaurants/{id}/orders/{orderId}/status Écrire

Mettre à jour le statut en cuisine (new|preparing|ready|delivered|completed|cancelled). Déclenche order.status_changed.

API vitrine (token par restaurant)

Une API distincte, orientée public, authentifiée par un token vitrine par restaurant envoyé en tant que X-Storefront-Token (et non le token Bearer du propriétaire). Générez-les depuis votre tableau de bord ; chaque token ne peut jamais atteindre que son propre restaurant. La portée de lecture est menu:read; passer des commandes nécessite le order:write Portée

GET /storefront/menu

Menu complet du restaurant du token (variantes, extras, groupes, galerie).

GET /storefront/restaurant

Infos de base sur le restaurant du token.

POST /storefront/orders order:write

Soumettre un panier pour le compte d'un client. Prix calculé côté serveur et non payé (le client paie à l'arrivée) ; takeaway ou on-table uniquement. Chaque article est validé par rapport au menu en direct — les articles épuisés ou étrangers font rejeter toute la commande (422). Limites : 40 articles/commande, 30 qté/ligne. Facultatif coupon_code applique une remise propriétaire côté serveur. Déclenche order.created et renvoie 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 }
    ]
  }'

Analyses et clients

GET /restaurants/{id}/analytics

Récapitulatif des ventes sur une plage de dates (?from=YYYY-MM-DD&to=YYYY-MM-DD, 30 derniers jours par défaut) : nombre de commandes par statut/type, chiffre d'affaires brut et encaissé, valeur moyenne de commande et articles les plus vendus.

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

La liste des clients du restaurant (CRM), paginée. Filtrez avec ?search=.

Gérer les livreurs Écrire

Les livreurs vous appartiennent et (facultativement) à un restaurant. Créer ou renouveler un livreur renvoie un token de livreur brut exactement une fois — transmettez-le à l'application du livreur ; il s'authentifie avec (voir ci-dessous).

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

Invalide l'ancien token et en renvoie un nouveau.

Attribuer et suivre une livraison

GET /restaurants/{id}/deliveries

Commandes en livraison, filtrables par ?delivery_status= et ?driver_id=.

POST /restaurants/{id}/orders/{orderId}/assign Écrire

Attribuer un livreur {"driver_id": 7}. Définit delivery_status=assigned et déclenche order.driver_assigned.

PUT /restaurants/{id}/orders/{orderId}/delivery-status Écrire

Forcer l'étape de livraison : pending | assigned | picked_up | out_for_delivery | delivered | failed.

API appli livreur

L'application du livreur s'authentifie avec un Jeton de livreur (et non un token propriétaire) généré ci-dessus. Chemin de base https://www.menubarcode.com/api/v1/driver. Chaque réponse est limitée à ce seul livreur.

Authorization: Bearer RAW_DRIVER_TOKEN
GET /driver/me

Le profil du livreur authentifié.

GET /driver/deliveries

Commandes attribuées à ce livreur. Ajoutez ?active=1 pour masquer livrées/échouées.

PUT /driver/deliveries/{orderId}/status

Faire avancer la livraison : {"delivery_status":"out_for_delivery"} puis "delivered" ou "picked_up" / "failed", facultatif note). Déclenche les mêmes webhooks que le point de terminaison propriétaire.

PUT /driver/location

Envoyer la position en direct : {"lat":25.2048,"lng":55.2708}. Affichée dans la vue de suivi du client pendant la livraison.

Comptes clients

A application client autonome authentifie ses propres utilisateurs avec un token par client (façon Sanctum : plusieurs appareils, révocables individuellement). Aucun token propriétaire n'est impliqué. Les clients sont limités à chaque restaurant, donc l'authentification se trouve sous /restaurants/{id}/customer/…. Parcourez d'abord le menu avec le point de terminaison public :

GET /menu/{restaurantId} Public

Menu actif groupé par catégorie (articles épuisés omis). Sans authentification.

Inscription / connexion

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

Sans mot de passe (OTP par SMS)

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

Demandez un code pour un numéro de téléphone, puis vérifiez-le. La vérification trouve ou crée le client et renvoie un token. Les points de terminaison d'authentification sont limités en débit (connexion/inscription 10/min, demande OTP 6/min).

API appli client

Authentifiez-vous avec le token client. Chemin de base https://www.menubarcode.com/api/v1/customer. Tout est limité au client authentifié — le corps de la commande ne peut jamais usurper l'id d'un autre client.

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

Lecture / mise à jour du profil (nom, e-mail, téléphone, anniversaire, consentements).

POST /customer/orders

Passer une commande en tant que ce client (même structure d'article que le point de terminaison de création marchand ; l'identité est tirée du token). Renvoie la commande avec son track_token.

GET /customer/orders

L'historique de commandes propre au client, paginé.

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

Adresses de livraison enregistrées (la première devient celle par défaut ; prend en charge lat/lng).

POST /customer/logout

Révoque le token utilisé pour la requête (cet appareil uniquement).

Suivi de commande Public

Sans authentification — l'accès est protégé par le track_token impossible à deviner de la commande (renvoyé à la création de la commande). Cela alimente un appli client écran de suivi en direct.

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

Le bloc livreur (avec coordonnées en direct) n'apparaît qu'une fois la commande récupérée / en cours de livraison.

Connexion du personnel

A app du personnel (POS / KDS / serveur) authentifie chaque membre du personnel avec un token par employé. Deux voies reflètent le tableau de bord : e-mail + mot de passe, ou un PIN numérique rapide pour les tablettes de cuisine partagées. Le personnel est limité à chaque 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"] } }

La réponse liste les Autorisations — un sous-ensemble de orders, menu_edit, coupons, analytics, kds, customers effectives du membre du personnel, dérivées de son rôle (gérant / caissier / cuisine / serveur) plus toute exception par employé. Les points de terminaison sont soumis aux permissions (403 sinon).

API appli personnel

Authentifiez-vous avec le token du personnel. Chemin de base https://www.menubarcode.com/api/v1/staff. Toutes les actions sont limitées au restaurant du membre du personnel.

Authorization: Bearer RAW_STAFF_TOKEN
GET /staff/me

Profil avec rôle et liste des permissions.

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

Lister les commandes et mettre à jour le statut en cuisine. Nécessite la orders autorisation.

GET /staff/kds kds

Tickets de cuisine en direct groupés par commande, filtrés sur le poste du membre du personnel (ou ?station_id=). N'affiche que les articles encore queued|preparing|ready.

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

Faire avancer (queued → preparing → ready → served) ou reculer d'un statut KDS. Le statut de la commande parente se resynchronise automatiquement.

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

Modifier le menu depuis la salle (gérants). Mêmes charges utiles que les points de terminaison de menu marchand, limitées au restaurant du membre du personnel.

GET /staff/analytics analytics

Récapitulatif des ventes pour le restaurant du membre du personnel (même structure que le point de terminaison d'analytique marchand ; ?from=&to=).

POST /staff/logout

Révoque le token de cet appareil.

Webhooks — configuration

Enregistrez les points de terminaison depuis le tableau de bord sous Tokens API et webhooks. Choisissez les événements que reçoit chaque point de terminaison. À l'enregistrement, vous obtenez un Secret de signature; utilisez le Test bouton pour envoyer un ping. Suspendez un point de terminaison pour arrêter la remise sans perdre son secret.

Votre point de terminaison doit répondre avec un 2xx statut rapidement (dans les 10 s). Tout autre statut — ou un dépassement de délai — est traité comme un échec et réessayé.

Les points de terminaison peuvent aussi être gérés par programmation (pour les REST-Hooks Zapier/Make) avec un 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

Le secret est renvoyé uniquement à la création — conservez-le pour vérifier la signature. url doit être un point de terminaison HTTPS public (protégé contre le SSRF) ; events doit provenir de la liste ci-dessous (ou *).

Événements de webhook

ÉvénementSe déclenche quand
order.createdUne nouvelle commande est passée (tableau de bord ou API).
order.status_changedLe statut en cuisine d'une commande change (tableau de bord, POS ou API).
order.paidUne commande est marquée entièrement payée (passerelle ou partage d'addition).
order.driver_assignedUn livreur est attribué à une livraison.
order.out_for_deliveryLe livreur est en route vers le client.
order.deliveredLa livraison a été effectuée.
order.delivery_failedLa livraison n'a pas pu être effectuée.
refund.completedUn remboursement est finalisé pour une commande.
reservation.createdUne réservation de table est créée.
reservation.cancelledUne réservation de table est annulée.
customer.createdUne nouvelle fiche client est créée.
shift.openedUne session de caisse / point de vente est ouverte.
shift.closedUne session de caisse / point de vente est clôturée.
menu.updatedUn article ou une catégorie de menu est créé, modifié ou supprimé (toute interface). Charge utile : {restaurant_id, change, entity, id}.
entitlement.changedUn droit d'accès à une fonctionnalité est accordé ou révoqué pour l'espace de travail (changement de forfait, module complémentaire, installation/désinstallation d'app, dérogation admin). Charge utile : {action, feature_key, source_type, source_id, user_id, occurred_at}action est granted ou revoked.
subscription.*Cycle de vie de l'abonnement : subscription.paused, .resumed, .renewed, .expired, .plan_changed, .past_due, .expiring, .trial_ending.
app.uninstalledUne app de la marketplace est désinstallée (remise au point de terminaison de l'app).
*S'abonner à tous les événements ci-dessus.
pingEnvoyé par le Test bouton pour vérifier le câblage.

Une remise a échoué pendant que votre point de terminaison était hors service ? Utilisez Redistribuer sur toute ligne du journal des remises récentes du tableau de bord pour la remettre en file avec un nouveau webhook-id.

Charge utile du webhook

Chaque remise est un POST avec cette enveloppe JSON et ces en-têtes :

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

Le id est unique par remise. Comme les nouvelles tentatives réutilisent le même id, utilisez-le pour rendre votre gestionnaire idempotent.

Vérifier la signature

Le webhook-signature en-tête est un HMAC-SHA256, encodé en base64, calculé sur {id}.{timestamp}.{body} à l'aide du secret de signature de votre point de terminaison. Lier l'id et l'horodatage à la signature est ce qui rend une requête capturée sûre contre le rejeu. Rejetez toute requête dont le webhook-timestamp a plus de ~5 minutes.

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 || ''));
}
un ancien X-Webhook-Signature en-tête (HMAC-SHA256 simple du corps, en hexadécimal) est aussi envoyé pour compatibilité ascendante. Les nouvelles intégrations devraient utiliser webhook-signature.

Nouvelles tentatives et journal des remises

La remise est asynchrone et réessayée en cas d'échec avec un délai exponentiel plus une variation aléatoire : environ 1m → 5m → 15m → 1h (jusqu'à 5 tentatives au total). Chaque tentative — réussie ou échouée — est enregistrée dans le journal des remises de votre tableau de bord avec son statut HTTP, son numéro de tentative et un extrait de réponse.

La remise est au moins une fois. Dédupliquez sur le webhook-id pour gérer les répétitions occasionnelles.

Serveurs MCP

Nouveau un guide de configuration d'une page, à copier-coller, pour chaque client se trouve à /mcp — commandes d'installation par client, deeplinks en un clic, catalogue d'outils et exemples de prompts. Cette page reste la référence approfondie.

Cinq serveurs Model Context Protocol connectent les agents IA (ChatGPT, Claude, Cursor) à la plateforme — choisissez celui qui correspond à votre public. Tous parlent JSON-RPC 2.0 sur HTTP et négocient les versions de protocole 2024-11-05 / 2025-03-26 / 2025-06-18.

ServeurPoint de terminaisonAudienceAuthentificationOutils
Adminhttps://www.menubarcode.com/mcpPropriétaires de boutique — gérer la boutiqueJeton API (Bearer)23
Storefronthttps://www.menubarcode.com/mcp/storefrontL'agent d'un client — parcourir et commander dans une boutiqueJeton de boutique (portée agent)12
Customerhttps://www.menubarcode.com/mcp/customerUn client connecté — ses propres commandesJeton client (connexion OTP)5
Cataloghttps://www.menubarcode.com/mcp/catalogTout le monde — découvrir les boutiques sur toute la plateformePublic3
Devhttps://www.menubarcode.com/mcp/devOutils de codage IA — créer des thèmes/intégrationsPublic7

Démarrage rapide : aller à Admin, Catalog, Customer, ou Dev. Le serveur vitrine partage le schéma de connexion Admin avec un X-Storefront-Token en-tête au lieu d'un token Bearer.

Serveur MCP (Admin)

Un client IA compatible MCP (Claude, ChatGPT, Cursor) peut piloter votre restaurant en langage naturel à l'aide des mêmes tokens API. Pointez-le vers :

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

Authentifiez-vous avec Authorization: Bearer YOUR_TOKEN. Chaque outil déclare la capacité granulaire dont il a besoin (resource:action); un ancien read token couvre chaque :read outil et write couvre tout. Tous les appels sont limités à vos restaurants et à débit limité. Les outils pour lesquels vous n'avez pas la capacité sont masqués dans tools/list.

Connecter (Claude Code)

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

Lister les outils

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

Appeler un outil (p. ex. ajouter un article au menu)

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

Outils

OutilCapacitéCe qu'il fait
list_restaurantsreadRestaurants que vous possédez.
get_menureadCatégories et articles d'un restaurant.
list_categoriesmenu:readCatégories avec le nombre d'articles.
add_categorymenu:writeCréer une catégorie.
update_categorymenu:writeRenommer / réordonner une catégorie.
delete_categorymenu:writeSupprimer une catégorie (refuse si elle contient des articles).
add_menu_itemwriteCréer un article de menu (limite du forfait vérifiée).
update_menu_itemwriteModifiez le nom, le prix ou la description d'un article.
delete_menu_itemmenu:writeSupprimez définitivement un article.
set_item_availabilitymenu:writeMarquer un article en stock/épuisé (bascule 86).
list_ordersorders:readCommandes du plus récent au plus ancien ; filtres statut/date/recherche.
get_orderorders:readDétail complet de la commande, lignes incluses.
update_order_statuswriteFaire avancer le statut en cuisine d'une commande.
list_customerscustomers:read + crm_suiteListe CRM ; recherche par nom/téléphone/e-mail. Masquée de tools/list sans le droit d'accès.
get_customercustomers:read + crm_suiteLa fiche complète d'un client. Masquée de tools/list sans le droit d'accès.
sales_reportanalytics:readChiffre d'affaires + nombre de commandes + articles les plus vendus pour une plage.
get_restaurant_settingsrestaurants:readAperçu du profil et des paramètres de commande.
update_business_hoursrestaurants:writeDéfinir le texte des horaires d'ouverture.
list_couponsorders:readVos coupons de réduction.
create_couponorders:writeCréer un coupon en pourcentage/montant fixe.
update_couponorders:writeModifiez un coupon.
delete_couponorders:writeSupprimez un coupon.

MCP Catalogue (découvrir des restaurants)

Un serveur MCP public en lecture seule qui permet aux agents IA de découvrir des restaurants et des plats sur toute la plateforme, puis de créer un deep link vers une boutique précise pour commander. Sans authentification, à débit limité.

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

Connecter (Claude Code)

claude mcp add --transport http platform-catalog https://www.menubarcode.com/mcp/catalog
OutilCe qu'il fait
search_storesTrouver des restaurants par mot-clé/ville (name, address, menu_url, indice storefront_mcp).
search_itemsTrouver des plats dans toutes les boutiques (query/dietary/max_price/city), groupés par boutique.
get_storeDétail public complet d'une boutique par slug ou id.
list_starter_menusLes modèles de menu de démarrage fournis à partir desquels un nouveau magasin peut s'initialiser (café, pizzeria, burger, boulangerie, lounge).

Seules les boutiques actives et répertoriées publiquement apparaissent ; les propriétaires peuvent se désinscrire dans les paramètres de leur boutique. Aucune coordonnée du propriétaire n'est jamais renvoyée. Pour passer une commande, utilisez le MCP vitrine de la boutique avec un token d'agent par boutique.

MCP Compte client

Permet à l'assistant IA d'un client de lire, suivre et recommander ses propres commandes. Authentifié par un token par client issu de la connexion OTP existante ; l'identité du client provient uniquement du token — un numéro de téléphone ou un id client n'est jamais accepté comme argument.

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

Obtenir un token (flux OTP)

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

Connecter (Claude Code)

claude mcp add --transport http my-orders https://www.menubarcode.com/mcp/customer \
  --header "Authorization: Bearer CUSTOMER_TOKEN"
OutilCe qu'il fait
my_ordersVos commandes récentes (les plus récentes d'abord).
order_detailDétail complet + lignes pour l'une de vos commandes.
track_orderStatut en direct par id de commande ou token de suivi.
reorderReconstituer une commande passée sous forme de brouillon de panier (ignore les articles épuisés).
my_profileVotre nom, téléphone et nombre de commandes.
my_bookingsVos propres réservations de chambres d'hôtel dans ce lieu (code, statut, dates, type de chambre, 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}}}'

Connectez votre éditeur IA

Vous créez un thème ou une intégration avec Claude Code, Cursor ou VS Code ? Pointez-le vers le Serveur Dev MCP public — votre outil IA obtient la doc de la plateforme en direct, la liste blanche Liquid générée et la validation de thème côté serveur. Aucun token nécessaire.

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

Outils learn_platform (commencez ici), search_docs / fetch_full_doc, get_liquid_reference, get_section_schema, validate_theme, list_webhook_events. Flux de travail d'agent recommandé : apprendre → créer → valider → livrer.

Le serveur MCP authentifié ci-dessus (https://www.menubarcode.com/mcp) pilote vos données de restaurant ; celui-ci sert la documentation et la validation et peut être partagé publiquement en toute sécurité.

Journal des modifications

DateModifier
2026-08-20Version PMS hôtel + croissance : refund.completed, reservation.created, reservation.cancelled, customer.created, shift.opened, shift.closed événements de webhook ; enregistrement des appareils push du personnel + 2fa points de terminaison ; nouveaux outils MCP hotel_availability, my_bookings, list_starter_menus, list_webhook_events.
2026-07-28Index de découverte généré par le routeur + Spécification OpenAPI 3.1 (toujours en parité avec l'API déployée) ; Idempotency-Key à la création de commande ; limites de débit API par token ; subscription.* + app.uninstalled événements de webhook + remise Redistribuer.
2026-07-07Public Serveur Dev MCP pour les outils de codage IA : recherche de doc en direct, référence Liquid générée, validation de thème côté serveur.
2026-07-02Portées de token granulaires (resource:action); points de terminaison d'édition de menu et d'analytique pour le personnel.
2026-07-02Application personnel : authentification par token par employé (mot de passe + PIN), gestion des permissions par rôle, statut des commandes, avancement/rappel KDS.
2026-07-02Application client autonome : authentification par token par client (inscription/connexion/OTP), profil, passage de commande + historique, adresses enregistrées, consultation du menu public.
2026-07-02API de gestion complète : CRUD du menu, création de commande, livreurs + cycle de vie de la livraison, API de token pour application livreur, suivi public des commandes, analytique des ventes, clients. Nouveaux événements de webhook de livraison.
2026-07-02Remise de webhook en file d'attente avec nouvelles tentatives ; signature Standard-Webhooks (webhook-id/timestamp/signature); order.paid événement ; doc publique.
2026-06-26API REST v1 initiale, tokens et points de terminaison de webhook.

Retour à Menubarcode

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

Contactez-nous

Suivez-nous