Guest API dla agentów AI
Publiczne API cenaly.com, przez które asystenci i agenci AI działają w imieniu gościa: czytają menu restauracji, wyszukują w katalogu, kompletują koszyk, składają zamówienie i rezerwują stolik. Do tego wszystkiego autoryzacja nie jest potrzebna — to te same operacje, które są dostępne dla gościa na stronie menu.
Adresowanie restauracji#
Restauracja jest adresowana kodem lokalizacji — to segment URL menu zapisany wielkimi literami. Jeśli menu otwiera się pod cenaly.com/MYCAFE, kod to MYCAFE. Ten sam kod jest zaszyty w kodach QR stolików.
Szybki start (REST)#
# Co potrafi API
curl https://api.cenaly.com/llm/v1
# Menu restauracji po rosyjsku
curl "https://api.cenaly.com/llm/v1/locations/MYCAFE/menu?lang=ru"
# Złożyć zamówienie na wynos
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": "…"}
# Status zamówienia (orderId — tajny token dostępu)
curl https://api.cenaly.com/llm/v1/locations/MYCAFE/orders/{orderId}
Pełna specyfikacja: OpenAPI 3.1 · dokumentacja interaktywna (w języku marki; ?lang=en|ka|ru|tr|sq).
Endpointy#
| Metoda | Ścieżka | Co robi |
|---|---|---|
| GET | /llm/v1/locations/{DOMAIN}/menu?lang=xx |
Menu: kategorie, dania, ceny, warianty i dodatki, waluta, sposoby odbioru |
| GET | /llm/v1/locations/{DOMAIN}/items/{itemId} |
Jedno danie z opcjami |
| GET | /llm/v1/locations/{DOMAIN}/items?ids=a,b,c |
Kilka dań naraz (do 10 na zapytanie) |
| GET | /llm/v1/locations/{DOMAIN}/search?q=&limit= |
Wyszukiwanie semantyczne w katalogu — po nazwach, opisach i cechach |
| GET | /llm/v1/locations/{DOMAIN}/store-info |
Fakty poza menu: adres, kontakty, współrzędne, godziny pracy |
| GET | /llm/v1/locations/{DOMAIN}/policies?q= |
Wyszukiwanie w opublikowanych zasadach, FAQ i stronach informacyjnych lokalu |
| POST | /llm/v1/locations/{DOMAIN}/carts |
Utworzyć koszyk na serwerze |
| GET / PATCH | /llm/v1/locations/{DOMAIN}/carts/{cartId} |
Odczytać koszyk / zmienić skład |
| POST | /llm/v1/locations/{DOMAIN}/orders |
Złożyć zamówienie (serwer waliduje skład i liczy kwoty) |
| GET | /llm/v1/locations/{DOMAIN}/orders/{orderId} |
Status zamówienia, numer, przedmioty |
| GET | /llm/v1/locations/{DOMAIN}/reservations/availability?start=&durationMinutes= |
Stoliki wolne/zajęte według schematu sali |
| POST | /llm/v1/locations/{DOMAIN}/reservations |
Zgłoszenie rezerwacji (pending do potwierdzenia przez restaurację) |
| GET / DELETE | /llm/v1/locations/{DOMAIN}/reservations/{id} |
Status / anulowanie rezerwacji |
Koszyk: złożyć zamówienie krok po kroku#
Agent nie musi zgadywać składu zamówienia jednym strzałem — może prowadzić koszyk na serwerze, tak jak robi to człowiek w koszyku w przeglądarce:
POST /cartsz pierwszymi pozycjami →cartIdPATCH /carts/{cartId}— dodać, zmienić ilość, usunąć (quantity: 0)POST /orderszcartId— złożyć
Ceny w koszyku są zawsze przeliczane według aktualnego menu, więc nie może pokazać nieaktualnej kwoty. Koszyk żyje 7 dni. W każdej odpowiedzi jest checkoutUrl — link można po prostu przekazać człowiekowi, żeby dokończył zamówienie w zwykłym checkoutcie.
Przy tworzeniu zamówienia można przekazać idempotencyKey (8–64 znaki): powtórzenie z tym samym kluczem w ciągu 48 godzin zwróci pierwotne zamówienie, a nie utworzy drugiego. To samo działa dla rezerwacji — powtórzenie w tym samym oknie zwróci pierwotną rezerwację, a nie zajmie drugiego stolika.
Połączenie przez MCP#
Serwer: https://api.cenaly.com/llm/mcp — Model Context Protocol, streamable HTTP, stateless. Narzędzia gościa działają bez autoryzacji; logowanie przez OAuth dodaje do nich narzędzia Twojego konta.
Konfiguracja dla Claude Desktop / Claude Code i zgodnych klientów:
{
"mcpServers": {
"meni-guest": {
"type": "http",
"url": "https://api.cenaly.com/llm/mcp"
}
}
}
Narzędzia gościa (13, bez autoryzacji):
| Grupa | Narzędzia |
|---|---|
| Menu i katalog | get_menu, get_item, search_products |
| Lokal | get_store_info, search_policies_and_faqs |
| Koszyk | update_cart, get_cart |
| Zamówienie | create_order, get_order_status |
| Rezerwacja stolika | check_table_availability, create_reservation, get_reservation_status, cancel_reservation |
Typowe scenariusze:
- Szybkie zamówienie:
get_menu→create_order→get_order_status(4-cyfrowy numer pojawia się po kilku sekundach). - Zamówienie w dialogu:
search_products→update_cart(po jednym przedmiocie, jak w rozmowie) →get_cart→create_order, albo przekazać gościowicheckoutUrli pozwolić mu dokończyć zamówienie samemu. - Pytanie o lokal:
get_store_info(adres, godziny, kontakty) lubsearch_policies_and_faqs(warunki dostawy, zwrot, zasady). - Rezerwacja stolika:
check_table_availability(stoliki ze schematu sali, wolny/zajęty na wybrany czas) →create_reservationztableId→get_reservation_status(restauracja potwierdza zgłoszenie) → w razie potrzebycancel_reservation.
Dostęp do własnych danych#
Jeśli jesteś właścicielem lokalu lub pracownikiem, do tych samych 13 narzędzi gościnnych dochodzi 12 narzędzi pracy z własnym kontem — w dwóch grupach.
Dane konta (6): resolve_domain, list_files, read_file, write_file, delete_file, write_signal. Otwierają nie tylko menu i zamówienia, ale też CRM, magazyn, personel, ustawienia kasy i ekranu kuchennego, dokumenty oraz niemal wszystkie pozostałe sekcje.
Strona klienta placówki (6): get_site_settings, update_site_settings, list_site_templates, apply_site_template, check_domain_availability, rename_site_domain.
| Narzędzie | Co robi |
|---|---|
get_site_settings |
Czyta ustawienia witryny: nagłówek, typ biznesu, przełączniki (zamówienia, wezwanie kelnera, oddzwonienie, banner cookie), dostawa/odbiór osobisty/WhatsApp, wygląd i szablon, układ kart, kampanie zaangażowania, rynki walutowe, test A/B designu, a w przypadku sprzedaży detalicznej — witryna, SEO, sekcje strony głównej i wtyczki sklepu |
update_site_settings |
Zmienia je: patch jest scalany z profilem placówki tym samym potokiem co poprawki z panelu administracyjnego — zmiany są widoczne po kilku sekundach |
list_site_templates |
Galeria gotowych szablonów designu — ta sama co w panelu |
apply_site_template |
Stosuje szablon w jednej akcji: wygląd, układ kart i id szablonu |
check_domain_availability |
Sprawdza, czy nazwa subdomeny jest wolna (3–63 znaki, litery/cyfry/myślniki, nazwy zastrzeżone są odrzucane). Niczego nie zmienia |
rename_site_domain |
⚠️ Zmienia nazwę domeny witryny: tylko właściciel, a wszystkie stare linki i wydrukowane kody QR na poprzednią domenę przestają działać |
Logowanie — zwykły OAuth 2.1 na Twoim koncie cenaly.com: klient MCP (Claude, ChatGPT, CLI) rejestruje się sam i otwiera okno logowania. Niczego nie trzeba wklejać ręcznie.
- Metadane zasobu:
https://api.cenaly.com/.well-known/oauth-protected-resource - Metadane serwera autoryzacji:
https://api.cenaly.com/.well-known/oauth-authorization-server - Dynamiczna rejestracja klienta (RFC 7591):
POST https://api.cenaly.com/llm/oauth/register
Dopóki nie ma tokenu, tools/list pokazuje tylko narzędzia gościnne — autoryzowane po prostu nie są widoczne.
Zasady i gwarancje#
- Zamówienie jest walidowane na żywym menu: nieistniejące danie, wariant lub dodatek — błąd 400 z listą problemów; ceny i podsumowanie liczy serwer, agent nie ma sposobu, by „ustalić” cenę.
- Dla odbioru osobistego i dostawy obowiązkowe są imię i telefon gościa; dla dostawy — adres.
orderId/reservationId— tajne tokeny: na ich podstawie sprawdza się status i anuluje rezerwację. Nie publikuj ich.- Zamówienia i rezerwacje trafiają do restauracji w czasie rzeczywistym — do panelu administracyjnego, na ekran kuchenny i do powiadomień, jak zwykłe zamówienia ze strony.
- Rezerwacje gościa mają status
pending, dopóki restauracja nie potwierdzi ich w panelu administracyjnym. - W Rosji alkoholu nie można zamówić kanałem agentowym. Zdalna sprzedaż wyrobów alkoholowych jest zabroniona przez prawo (pp. 14 p. 2 art. 16 171-FZ), dlatego w placówkach z krajem „Rosja” zamówienie z pozycją alkoholową nie przechodzi walidacji: w odpowiedzi 400 przychodzi wiersz z nazwą tej pozycji i wyjaśnieniem, że można ją zamówić tylko u kelnera na sali. Zamówienie trzeba złożyć ponownie bez alkoholu.
Wykrywanie maszynowe#
https://cenaly.com/llms.txt— skrócona mapa API dla LLM;GET https://api.cenaly.com/llm/v1— dokument discovery: pełna lista endpointów, przykłady zamówienia, rezerwacji i pracy z koszykiem, linki do metadanych OAuth.