Guest API per agenti AI
API pubblico di cenaly.com, tramite il quale gli assistenti e gli agenti AI agiscono per conto dell'ospite: consultano il menù del ristorante, cercano nel catalogo, compongono il carrello, effettuano l'ordine e prenotano un tavolo. Per tutto questo non serve l'autorizzazione: sono le stesse operazioni disponibili all'ospite sul sito del menù.
Indirizzamento del ristorante#
Il ristorante è identificato da un codice di sede: è il segmento dell'URL del menù in maiuscolo. Se il menù si apre su cenaly.com/MYCAFE, il codice è MYCAFE. Lo stesso codice è incorporato nei codici QR dei tavoli.
Avvio rapido (REST)#
# Cosa sa fare l'API
curl https://api.cenaly.com/llm/v1
# Menù del ristorante in russo
curl "https://api.cenaly.com/llm/v1/locations/MYCAFE/menu?lang=ru"
# Effettuare un ordine da asporto
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": "…"}
# Stato dell'ordine (orderId — token di accesso segreto)
curl https://api.cenaly.com/llm/v1/locations/MYCAFE/orders/{orderId}
Specifica completa: OpenAPI 3.1 · documentazione interattiva (nella lingua del brand; ?lang=en|ka|ru|tr|sq).
Endpoint#
| Metodo | Percorso | Cosa fa |
|---|---|---|
| GET | /llm/v1/locations/{DOMAIN}/menu?lang=xx |
Menù: categorie, piatti, prezzi, varianti e supplementi, valuta, modalità di ritiro |
| GET | /llm/v1/locations/{DOMAIN}/items/{itemId} |
Un singolo piatto con le opzioni |
| GET | /llm/v1/locations/{DOMAIN}/items?ids=a,b,c |
Più piatti in una volta (fino a 10 per richiesta) |
| GET | /llm/v1/locations/{DOMAIN}/search?q=&limit= |
Ricerca semantica nel catalogo — per nomi, descrizioni e caratteristiche |
| GET | /llm/v1/locations/{DOMAIN}/store-info |
Informazioni fuori dal menù: indirizzo, contatti, coordinate, orari di apertura |
| GET | /llm/v1/locations/{DOMAIN}/policies?q= |
Ricerca nelle regole pubblicate, nelle FAQ e nelle pagine informative della struttura |
| POST | /llm/v1/locations/{DOMAIN}/carts |
Creare un carrello sul server |
| GET / PATCH | /llm/v1/locations/{DOMAIN}/carts/{cartId} |
Leggere il carrello / modificarne la composizione |
| POST | /llm/v1/locations/{DOMAIN}/orders |
Effettuare l'ordine (il server convalida la composizione e calcola gli importi) |
| GET | /llm/v1/locations/{DOMAIN}/orders/{orderId} |
Stato dell'ordine, numero, articoli |
| GET | /llm/v1/locations/{DOMAIN}/reservations/availability?start=&durationMinutes= |
Tavoli liberi/occupati secondo la piantina della sala |
| POST | /llm/v1/locations/{DOMAIN}/reservations |
Richiesta di prenotazione (pending fino alla conferma del ristorante) |
| GET / DELETE | /llm/v1/locations/{DOMAIN}/reservations/{id} |
Stato / annullamento della prenotazione |
Carrello: comporre l'ordine passo dopo passo#
L'agente non deve indovinare la composizione dell'ordine in un colpo solo: può gestire il carrello sul server, come farebbe una persona nel carrello web:
POST /cartscon le prime righe →cartIdPATCH /carts/{cartId}— aggiungere, modificare la quantità, rimuovere (quantity: 0)POST /ordersconcartId— effettuare l'ordine
I prezzi nel carrello vengono sempre ricalcolati sul menù in tempo reale, quindi non può mostrare un importo obsoleto. Il carrello dura 7 giorni. In ogni risposta è presente checkoutUrl: il link può essere semplicemente consegnato alla persona, perché completi l'ordine nel normale checkout.
Alla creazione dell'ordine si può passare una idempotencyKey (8–64 caratteri): una ripetizione con la stessa chiave entro 48 ore restituirà l'ordine originale, senza crearne un secondo. Lo stesso vale per le prenotazioni: una ripetizione nella stessa finestra restituirà la prenotazione originale, senza occupare un secondo tavolo.
Connessione tramite MCP#
Server: https://api.cenaly.com/llm/mcp — Model Context Protocol, streamable HTTP, stateless. Gli strumenti per gli ospiti funzionano senza autorizzazione; l'accesso tramite OAuth vi aggiunge gli strumenti del proprio account.
Configurazione per Claude Desktop / Claude Code e client compatibili:
{
"mcpServers": {
"meni-guest": {
"type": "http",
"url": "https://api.cenaly.com/llm/mcp"
}
}
}
Strumenti per gli ospiti (13, senza autorizzazione):
| Gruppo | Strumenti |
|---|---|
| Menù e catalogo | get_menu, get_item, search_products |
| Struttura | get_store_info, search_policies_and_faqs |
| Carrello | update_cart, get_cart |
| Ordine | create_order, get_order_status |
| Prenotazione del tavolo | check_table_availability, create_reservation, get_reservation_status, cancel_reservation |
Scenari tipici:
- Ordine rapido:
get_menu→create_order→get_order_status(il numero a 4 cifre compare dopo un paio di secondi). - Ordine in conversazione:
search_products→update_cart(un articolo alla volta, come in una conversazione) →get_cart→create_order, oppure consegnare all'ospite ilcheckoutUrle lasciargli completare l'ordine da solo. - Domanda sulla struttura:
get_store_info(indirizzo, orari, contatti) oppuresearch_policies_and_faqs(condizioni di consegna, reso, regole). - Prenotazione del tavolo:
check_table_availability(tavoli dalla piantina della sala, libero/occupato per l'orario scelto) →create_reservationcontableId→get_reservation_status(il ristorante conferma la richiesta) → se necessariocancel_reservation.
Accesso ai propri dati#
Se sei il titolare di una sede o un collaboratore, ai medesimi 13 strumenti guest si aggiungono 12 strumenti per lavorare con il proprio account — in due gruppi.
Dati dell'account (6): resolve_domain, list_files, read_file, write_file, delete_file, write_signal. Aprono non solo menu e ordini, ma anche CRM, magazzino, personale, impostazioni della cassa e dello schermo cucina, documenti e quasi tutte le altre sezioni.
Sito client della sede (6): get_site_settings, update_site_settings, list_site_templates, apply_site_template, check_domain_availability, rename_site_domain.
| Strumento | Cosa fa |
|---|---|
get_site_settings |
Legge le impostazioni della vetrina: titolo, tipo di attività, interruttori (ordini, chiamata del cameriere, richiamata, banner cookie), consegna/asporto/WhatsApp, allestimento e modello, layout delle schede, campagne di coinvolgimento, mercati valutari, test A/B del design e, per il commercio al dettaglio, vetrina, SEO, sezioni della home e plugin del negozio |
update_site_settings |
Modifica le stesse: la patch si unisce al profilo della sede con lo stesso flusso delle modifiche dall'area di amministrazione — le modifiche sono visibili dopo qualche secondo |
list_site_templates |
Galleria di modelli di design pronti — la stessa del pannello |
apply_site_template |
Applica un modello in un'unica azione: allestimento, layout delle schede e id del modello |
check_domain_availability |
Verifica se il nome del sottodominio è libero (3–63 caratteri, lettere/cifre/trattini, i nomi riservati vengono rifiutati). Non modifica nulla |
rename_site_domain |
⚠️ Rinomina il dominio della vetrina: solo il titolare, e tutti i vecchi link e i codici QR stampati sul dominio precedente smettono di funzionare |
L'accesso avviene con il normale OAuth 2.1 sotto il proprio account cenaly.com: il client MCP (Claude, ChatGPT, CLI) si registra da solo e apre la finestra di login. Non serve incollare nulla a mano.
- Metadati della risorsa:
https://api.cenaly.com/.well-known/oauth-protected-resource - Metadati del server di autorizzazione:
https://api.cenaly.com/.well-known/oauth-authorization-server - Registrazione dinamica del client (RFC 7591):
POST https://api.cenaly.com/llm/oauth/register
Finché non c'è un token, tools/list mostra solo gli strumenti guest — quelli autorizzati semplicemente non sono visibili.
Regole e garanzie#
- L'ordine viene validato sul menu live: un piatto, una variante o un extra inesistente dà errore 400 con l'elenco dei problemi; prezzi e totale li calcola il server, l'agente non ha modo di «assegnare» un prezzo.
- Per l'asporto e la consegna sono obbligatori nome e telefono dell'ospite; per la consegna anche l'indirizzo.
orderId/reservationId— token segreti: con questi si verifica lo stato e si annulla la prenotazione. Non pubblicarli.- Ordini e prenotazioni arrivano al ristorante in tempo reale — nell'area di amministrazione, sullo schermo cucina e nelle notifiche, come i normali ordini dal sito.
- Le prenotazioni dell'ospite hanno stato
pendingfinché il ristorante non le conferma nell'area di amministrazione. - In Russia non è possibile ordinare alcolici tramite il canale dell'agente. La vendita a distanza di prodotti alcolici è vietata per legge (sott. 14 comma 2 art. 16 171-ФЗ), perciò per le sedi con paese «Russia» un ordine con un articolo alcolico non supera la validazione: nella risposta 400 arriva una riga con il nome di quell'articolo e la spiegazione che lo si può ordinare solo dal cameriere in sala. L'ordine va ricomposto senza alcolici.
Rilevamento machine-readable#
https://cenaly.com/llms.txt— mappa sintetica dell'API per gli LLM;GET https://api.cenaly.com/llm/v1— documento di discovery: elenco completo degli endpoint, esempi di ordine, prenotazione e uso del carrello, link ai metadati OAuth.