Guest API für AI-Agenten
Öffentliche API von cenaly.com, über die AI-Assistenten und Agenten im Namen des Gastes handeln: die Speisekarte des Restaurants lesen, den Katalog durchsuchen, den Warenkorb befüllen, eine Bestellung aufgeben und einen Tisch reservieren. Für all das ist keine Autorisierung nötig — es sind dieselben Vorgänge, die dem Gast auf der Menü-Website zur Verfügung stehen.
Adressierung des Restaurants#
Das Restaurant wird über den Standortcode adressiert — das ist das URL-Segment der Speisekarte in Großbuchstaben. Wenn die Speisekarte unter cenaly.com/MYCAFE geöffnet wird, lautet der Code MYCAFE. Derselbe Code ist in den QR-Codes der Tische hinterlegt.
Schnellstart (REST)#
# Was die API kann
curl https://api.cenaly.com/llm/v1
# Speisekarte des Restaurants auf Russisch
curl "https://api.cenaly.com/llm/v1/locations/MYCAFE/menu?lang=ru"
# Bestellung zum Mitnehmen aufgeben
curl -X POST https://api.cenaly.com/llm/v1/locations/MYCAFE/orders \
-H 'Content-Type: application/json' \
-d '{
"items": [{"itemId": "abc123", "quantity": 2}],
"orderType": "pickup",
"customer": {"name": "Гость", "phone": "+995555123456"},
"language": "ru"
}'
# → {"accepted": true, "orderId": "…", "total": 24, "statusUrl": "…"}
# Bestellstatus (orderId — geheimer Zugriffstoken)
curl https://api.cenaly.com/llm/v1/locations/MYCAFE/orders/{orderId}
Vollständige Spezifikation: OpenAPI 3.1 · interaktive Dokumentation (in der Sprache der Marke; ?lang=en|ka|ru|tr|sq).
Endpunkte#
| Methode | Pfad | Was er tut |
|---|---|---|
| GET | /llm/v1/locations/{DOMAIN}/menu?lang=xx |
Speisekarte: Kategorien, Gerichte, Preise, Varianten und Extras, Währung, Bezugsarten |
| GET | /llm/v1/locations/{DOMAIN}/items/{itemId} |
Ein Gericht mit Optionen |
| GET | /llm/v1/locations/{DOMAIN}/items?ids=a,b,c |
Mehrere Gerichte auf einmal (bis zu 10 pro Anfrage) |
| GET | /llm/v1/locations/{DOMAIN}/search?q=&limit= |
Semantische Suche im Katalog — nach Namen, Beschreibungen und Merkmalen |
| GET | /llm/v1/locations/{DOMAIN}/store-info |
Fakten außerhalb der Speisekarte: Adresse, Kontakte, Koordinaten, Öffnungszeiten |
| GET | /llm/v1/locations/{DOMAIN}/policies?q= |
Suche in den veröffentlichten Regeln, FAQ und Infoseiten des Betriebs |
| POST | /llm/v1/locations/{DOMAIN}/carts |
Warenkorb auf dem Server erstellen |
| GET / PATCH | /llm/v1/locations/{DOMAIN}/carts/{cartId} |
Warenkorb lesen / Zusammensetzung ändern |
| POST | /llm/v1/locations/{DOMAIN}/orders |
Bestellung aufgeben (der Server validiert die Zusammensetzung und berechnet die Summen) |
| GET | /llm/v1/locations/{DOMAIN}/orders/{orderId} |
Bestellstatus, Nummer, Artikel |
| GET | /llm/v1/locations/{DOMAIN}/reservations/availability?start=&durationMinutes= |
Freie/belegte Tische nach dem Saalplan |
| POST | /llm/v1/locations/{DOMAIN}/reservations |
Reservierungsanfrage (pending bis zur Bestätigung durch das Restaurant) |
| GET / DELETE | /llm/v1/locations/{DOMAIN}/reservations/{id} |
Status / Stornierung der Reservierung |
Warenkorb: die Bestellung Schritt für Schritt zusammenstellen#
Der Agent muss die Zusammensetzung der Bestellung nicht mit einem Schuss erraten — er kann den Warenkorb auf dem Server führen, so wie es ein Mensch im Web-Warenkorb tut:
POST /cartsmit den ersten Zeilen →cartIdPATCH /carts/{cartId}— hinzufügen, Menge ändern, entfernen (quantity: 0)POST /ordersmitcartId— aufgeben
Die Preise im Warenkorb werden immer anhand der aktuellen Speisekarte neu berechnet, sodass er keinen veralteten Betrag anzeigen kann. Der Warenkorb bleibt 7 Tage bestehen. In jeder Antwort gibt es checkoutUrl — den Link können Sie einfach an eine Person weitergeben, damit sie die Bestellung im normalen Checkout abschließt.
Beim Anlegen einer Bestellung kann idempotencyKey übergeben werden (8–64 Zeichen): eine Wiederholung mit demselben Schlüssel innerhalb von 48 Stunden gibt die ursprüngliche Bestellung zurück, statt eine zweite anzulegen. Dasselbe funktioniert auch für Reservierungen — eine Wiederholung im selben Fenster gibt die ursprüngliche Reservierung zurück, statt einen zweiten Tisch zu belegen.
Verbindung über MCP#
Server: https://api.cenaly.com/llm/mcp — Model Context Protocol, streamable HTTP, stateless. Die Gast-Tools funktionieren ohne Autorisierung; die Anmeldung per OAuth fügt ihnen die Tools Ihres Kontos hinzu.
Konfiguration für Claude Desktop / Claude Code und kompatible Clients:
{
"mcpServers": {
"meni-guest": {
"type": "http",
"url": "https://api.cenaly.com/llm/mcp"
}
}
}
Gast-Tools (13, ohne Autorisierung):
| Gruppe | Tools |
|---|---|
| Speisekarte und Katalog | get_menu, get_item, search_products |
| Betrieb | get_store_info, search_policies_and_faqs |
| Warenkorb | update_cart, get_cart |
| Bestellung | create_order, get_order_status |
| Tischreservierung | check_table_availability, create_reservation, get_reservation_status, cancel_reservation |
Typische Szenarien:
- Schnelle Bestellung:
get_menu→create_order→get_order_status(die 4-stellige Nummer erscheint nach ein paar Sekunden). - Bestellung im Dialog:
search_products→update_cart(Artikel für Artikel, wie im Gespräch) →get_cart→create_order, oder dem Gast diecheckoutUrlgeben und ihn die Bestellung selbst abschließen lassen. - Frage zum Betrieb:
get_store_info(Adresse, Öffnungszeiten, Kontakte) odersearch_policies_and_faqs(Lieferbedingungen, Rückgabe, Regeln). - Tischreservierung:
check_table_availability(Tische aus dem Saalplan, frei/belegt für die gewählte Zeit) →create_reservationmittableId→get_reservation_status(das Restaurant bestätigt die Anfrage) → bei Bedarfcancel_reservation.
Zugriff auf Ihre eigenen Daten#
Wenn Sie Inhaber eines Betriebs oder Mitarbeiter sind, kommen zu denselben 13 Gast-Tools 12 Tools für die Arbeit mit Ihrem eigenen Konto hinzu — in zwei Gruppen.
Kontodaten (6): resolve_domain, list_files, read_file, write_file, delete_file, write_signal. Sie öffnen nicht nur Menü und Bestellungen, sondern auch CRM, Lager, Personal, Einstellungen der Kasse und des Küchenbildschirms, Dokumente und fast alle übrigen Bereiche.
Kundenseite des Standorts (6): get_site_settings, update_site_settings, list_site_templates, apply_site_template, check_domain_availability, rename_site_domain.
| Tool | Was es tut |
|---|---|
get_site_settings |
Liest die Einstellungen des Schaufensters: Titel, Geschäftstyp, Schalter (Bestellungen, Ruf des Kellners, Rückruf, Cookie-Banner), Lieferung/Selbstabholung/WhatsApp, Gestaltung und Vorlage, Anordnung der Karten, Engagement-Kampagnen, Währungsmärkte, A/B-Test des Designs, und für den Einzelhandel — Schaufenster, SEO, Sektionen der Startseite und Shop-Plugins |
update_site_settings |
Ändert dieselben: Der Patch wird über dieselbe Pipeline mit dem Profil des Standorts zusammengeführt wie Änderungen aus dem Adminbereich — die Änderungen sind nach wenigen Sekunden sichtbar |
list_site_templates |
Galerie fertiger Design-Vorlagen — dieselbe wie im Panel |
apply_site_template |
Wendet eine Vorlage mit einer Aktion an: Gestaltung, Anordnung der Karten und id der Vorlage |
check_domain_availability |
Prüft, ob der Name der Subdomain frei ist (3–63 Zeichen, Buchstaben/Ziffern/Bindestriche, reservierte Namen werden abgelehnt). Ändert nichts |
rename_site_domain |
⚠️ Benennt die Domain des Schaufensters um: nur der Inhaber, und alle alten Links und gedruckten QR-Codes auf die bisherige Domain funktionieren nicht mehr |
Die Anmeldung erfolgt über normales OAuth 2.1 unter Ihrem cenaly.com-Konto: Der MCP-Client (Claude, ChatGPT, CLI) registriert sich selbst und öffnet ein Login-Fenster. Es muss nichts von Hand eingefügt werden.
- Metadaten der Ressource:
https://api.cenaly.com/.well-known/oauth-protected-resource - Metadaten des Autorisierungsservers:
https://api.cenaly.com/.well-known/oauth-authorization-server - Dynamische Client-Registrierung (RFC 7591):
POST https://api.cenaly.com/llm/oauth/register
Solange kein Token vorhanden ist, zeigt tools/list nur die Gast-Tools — die autorisierten sind einfach nicht sichtbar.
Regeln und Garantien#
- Die Bestellung wird am Live-Menü validiert: ein nicht existierendes Gericht, eine Variante oder ein Extra — Fehler 400 mit einer Liste der Probleme; Preise und Gesamtsumme berechnet der Server, der Agent hat keine Möglichkeit, einen Preis „festzulegen“.
- Für Selbstabholung und Lieferung sind Name und Telefon des Gastes Pflicht; für die Lieferung — die Adresse.
orderId/reservationIdsind geheime Token: Mit ihnen wird der Status geprüft und die Reservierung storniert. Veröffentlichen Sie sie nicht.- Bestellungen und Reservierungen erreichen das Restaurant in Echtzeit — im Adminbereich, auf dem Küchenbildschirm und in den Benachrichtigungen, wie normale Bestellungen von der Website.
- Reservierungen des Gastes haben den Status
pending, bis das Restaurant sie im Adminbereich bestätigt. - In Russland kann Alkohol über den Agenturkanal nicht bestellt werden. Der Fernverkauf alkoholischer Produkte ist gesetzlich verboten (Ziff. 14 Abs. 2 Art. 16 171-ФЗ), daher wird bei Standorten mit dem Land „Russland“ eine Bestellung mit einem Alkohol-Artikel nicht validiert: In der Antwort 400 kommt eine Zeile mit dem Namen dieses Artikels und der Erläuterung, dass er nur beim Kellner im Saal bestellt werden kann. Die Bestellung muss ohne Alkohol neu zusammengestellt werden.
Maschinenlesbare Erkennung#
https://cenaly.com/llms.txt— eine kurze API-Karte für LLM;GET https://api.cenaly.com/llm/v1— Discovery-Dokument: vollständige Liste der Endpunkte, Beispiele für Bestellung, Reservierung und Arbeit mit dem Warenkorb, Links zu den OAuth-Metadaten.