Guest API за AI агенти
Публичен API на cenaly.com, чрез който AI асистенти и агенти действат от името на госта: четат менюто на ресторанта, търсят в каталога, събират кошница, оформят поръчка и резервират маса. За всичко това не е нужна авторизация — това са същите операции, които са достъпни за госта в сайта с менюто.
Адресиране на ресторанта#
Ресторантът се адресира с код на обекта — това е сегментът от URL адреса на менюто с главни букви. Ако менюто се отваря на cenaly.com/MYCAFE, кодът е MYCAFE. Същият код е вграден в QR кодовете на масите.
Бърз старт (REST)#
# Какво може API
curl https://api.cenaly.com/llm/v1
# Меню на ресторанта на руски
curl "https://api.cenaly.com/llm/v1/locations/MYCAFE/menu?lang=ru"
# Оформяне на поръчка за вкъщи
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": "…"}
# Статус на поръчката (orderId — таен токен за достъп)
curl https://api.cenaly.com/llm/v1/locations/MYCAFE/orders/{orderId}
Пълна спецификация: OpenAPI 3.1 · интерактивна документация (на езика на бранда; ?lang=en|ka|ru|tr|sq).
Ендпойнти#
| Метод | Път | Какво прави |
|---|---|---|
| GET | /llm/v1/locations/{DOMAIN}/menu?lang=xx |
Меню: категории, ястия, цени, варианти и добавки, валута, начини на получаване |
| GET | /llm/v1/locations/{DOMAIN}/items/{itemId} |
Едно ястие с опции |
| GET | /llm/v1/locations/{DOMAIN}/items?ids=a,b,c |
Няколко ястия наведнъж (до 10 на заявка) |
| GET | /llm/v1/locations/{DOMAIN}/search?q=&limit= |
Смислово търсене в каталога — по названия, описания и характеристики |
| GET | /llm/v1/locations/{DOMAIN}/store-info |
Факти извън менюто: адрес, контакти, координати, работно време |
| GET | /llm/v1/locations/{DOMAIN}/policies?q= |
Търсене в публикуваните правила, FAQ и информационни страници на заведението |
| POST | /llm/v1/locations/{DOMAIN}/carts |
Създаване на кошница на сървъра |
| GET / PATCH | /llm/v1/locations/{DOMAIN}/carts/{cartId} |
Прочитане на кошницата / промяна на състава |
| POST | /llm/v1/locations/{DOMAIN}/orders |
Оформяне на поръчка (сървърът валидира състава и изчислява сумите) |
| GET | /llm/v1/locations/{DOMAIN}/orders/{orderId} |
Статус на поръчката, номер, позиции |
| GET | /llm/v1/locations/{DOMAIN}/reservations/availability?start=&durationMinutes= |
Свободни/заети маси по схемата на залата |
| POST | /llm/v1/locations/{DOMAIN}/reservations |
Заявка за резервация (pending до потвърждение от ресторанта) |
| GET / DELETE | /llm/v1/locations/{DOMAIN}/reservations/{id} |
Статус / отмяна на резервация |
Кошница: събиране на поръчка стъпка по стъпка#
На агента не е задължително да отгатва състава на поръчката с един изстрел — може да води кошница на сървъра, както прави човек в уеб кошницата:
POST /cartsс първите редове →cartIdPATCH /carts/{cartId}— добавяне, промяна на количество, премахване (quantity: 0)POST /ordersсcartId— оформяне
Цените в кошницата винаги се преизчисляват по живото меню, така че тя не може да покаже остаряла сума. Кошницата живее 7 дни. Във всеки отговор има checkoutUrl — връзката може просто да се даде на човек, за да завърши поръчката в обичайния чекаут.
При създаване на поръчка може да се подаде idempotencyKey (8–64 символа): повторение със същия ключ в рамките на 48 часа ще върне първоначалната поръчка, а няма да създаде втора. Същото работи и за резервациите — повторение в същия прозорец ще върне първоначалната резервация, а няма да заеме втора маса.
Свързване по MCP#
Сървър: https://api.cenaly.com/llm/mcp — Model Context Protocol, streamable HTTP, stateless. Гостуващите инструменти работят без авторизация; входът по OAuth добавя към тях инструментите на вашия акаунт.
Конфигурация за Claude Desktop / Claude Code и съвместими клиенти:
{
"mcpServers": {
"meni-guest": {
"type": "http",
"url": "https://api.cenaly.com/llm/mcp"
}
}
}
Гостуващи инструменти (13, без авторизация):
| Група | Инструменти |
|---|---|
| Меню и каталог | get_menu, get_item, search_products |
| Заведение | get_store_info, search_policies_and_faqs |
| Кошница | update_cart, get_cart |
| Поръчка | create_order, get_order_status |
| Резервация на маса | check_table_availability, create_reservation, get_reservation_status, cancel_reservation |
Типични сценарии:
- Бърза поръчка:
get_menu→create_order→get_order_status(4-цифрен номер се появява след няколко секунди). - Поръчка в диалог:
search_products→update_cart(по една позиция, както в разговор) →get_cart→create_order, или да се даде на гостаcheckoutUrlи да му се позволи сам да завърши поръчката. - Въпрос за заведението:
get_store_info(адрес, часове, контакти) илиsearch_policies_and_faqs(условия за доставка, връщане, правила). - Резервация на маса:
check_table_availability(маси от схемата на залата, свободна/заета за избраното време) →create_reservationсtableId→get_reservation_status(ресторантът потвърждава заявката) → при необходимостcancel_reservation.
Достъп до собствените ви данни#
Ако сте собственик на заведение или служител, към същите 13 гостевски инструмента се добавят 12 инструмента за работа със собствения ви акаунт — в две групи.
Данни на акаунта (6): resolve_domain, list_files, read_file, write_file, delete_file, write_signal. Те отварят не само менюто и поръчките, но и CRM, склада, персонала, настройките на касата и кухненския екран, документите и почти всички останали раздели.
Клиентски сайт на обекта (6): get_site_settings, update_site_settings, list_site_templates, apply_site_template, check_domain_availability, rename_site_domain.
| Инструмент | Какво прави |
|---|---|
get_site_settings |
Чете настройките на витрината: заглавие, тип бизнес, превключватели (поръчки, повикване на сервитьор, обратно обаждане, cookie банер), доставка/самовземане/WhatsApp, оформление и шаблон, подредба на картите, кампании за ангажиране, валутни пазари, A/B тест на дизайна, а за търговията на дребно — витрина, SEO, секции на началната страница и плъгини на магазина |
update_site_settings |
Променя същите: пачът се слива с профила на обекта по същия конвейер, както и редакциите от админ панела — промените се виждат след няколко секунди |
list_site_templates |
Галерия с готови шаблони за дизайн — същата като в панела |
apply_site_template |
Прилага шаблон с едно действие: оформление, подредба на картите и id на шаблона |
check_domain_availability |
Проверява дали името на поддомейна е свободно (3–63 символа, букви/цифри/тирета, запазените имена се отхвърлят). Нищо не променя |
rename_site_domain |
⚠️ Преименува домейна на витрината: само собственик, и всички стари връзки и отпечатани QR кодове към предишния домейн спират да работят |
Входът е обикновен OAuth 2.1 под вашия акаунт в cenaly.com: MCP клиентът (Claude, ChatGPT, CLI) се регистрира сам и отваря прозорец за вход. Нищо не трябва да се поставя на ръка.
- Метаданни на ресурса:
https://api.cenaly.com/.well-known/oauth-protected-resource - Метаданни на сървъра за авторизация:
https://api.cenaly.com/.well-known/oauth-authorization-server - Динамична регистрация на клиент (RFC 7591):
POST https://api.cenaly.com/llm/oauth/register
Докато няма токен, tools/list показва само гостевските инструменти — оторизираните просто не се виждат.
Правила и гаранции#
- Поръчката се валидира по живото меню: несъществуващо ястие, вариант или допълнение — грешка 400 със списък на проблемите; цените и общата сума се изчисляват от сървъра, агентът няма начин да „назначи“ цена.
- За самовземане и доставка са задължителни име и телефон на госта; за доставка — адрес.
orderId/reservationId— секретни токени: по тях се проверява статусът и се отменя резервацията. Не ги публикувайте.- Поръчките и резервациите стигат до ресторанта в реално време — в админ панела, на кухненския екран и в известията, като обикновени поръчки от сайта.
- Резервациите на госта имат статус
pending, докато ресторантът не ги потвърди в админ панела. - В Русия алкохол през агентския канал за поръчки не може да се поръча. Дистанционната продажба на алкохолна продукция е забранена със закон (пп. 14 п. 2 ст. 16 171-FZ), затова при обектите със страна „Русия“ поръчка с алкохолна позиция не минава валидация: в отговора 400 идва ред с името на тази позиция и пояснение, че тя може да се поръча само от сервитьор в залата. Поръчката трябва да се събере отново без алкохол.
Машиночитаемо откриване#
https://cenaly.com/llms.txt— кратка карта на API за LLM;GET https://api.cenaly.com/llm/v1— discovery документ: пълен списък на ендпойнтите, примери за поръчка, резервация и работа с кошницата, връзки към OAuth метаданните.