Guest API для AI-агентов
Публичный API cenaly.ru, через который AI-ассистенты и агенты действуют от имени гостя: читают меню ресторана, ищут по каталогу, собирают корзину, оформляют заказ и бронируют столик. Для всего этого авторизация не нужна — это те же операции, что доступны гостю на сайте меню.
Если войти под своим аккаунтом cenaly.ru (OAuth), к гостевым инструментам добавляются ещё двенадцать — уже к данным и настройкам вашего заведения. См. раздел «Доступ к своим данным» ниже.
Есть и отдельный MCP-сервер управления аккаунтом по API-ключам, с готовыми командами по меню, локациям и заказам: MCP Server Guide.
Адресация ресторана#
Ресторан адресуется кодом локации — это сегмент URL меню в верхнем регистре. Если меню открывается по cenaly.ru/MYCAFE, код — MYCAFE. Тот же код зашит в QR-коды столиков.
Быстрый старт (REST)#
# Что умеет API
curl https://api.cenaly.ru/llm/v1
# Меню ресторана на русском
curl "https://api.cenaly.ru/llm/v1/locations/MYCAFE/menu?lang=ru"
# Оформить заказ навынос
curl -X POST https://api.cenaly.ru/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.ru/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.ru/llm/mcp — Model Context Protocol, streamable HTTP, stateless. Гостевые инструменты работают без авторизации; вход по OAuth добавляет к ним инструменты вашего аккаунта.
Конфигурация для Claude Desktop / Claude Code и совместимых клиентов:
{
"mcpServers": {
"meni-guest": {
"type": "http",
"url": "https://api.cenaly.ru/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.ru: MCP-клиент (Claude, ChatGPT, CLI) регистрируется сам и открывает окно логина. Ничего вставлять руками не нужно.
Где это работает. Авторизованное плечо доступно на брендах, работающих в облаке AWS с общим аккаунтом (cenaly.ru, cenaly.com и другие) — сервером авторизации служит наш общий Cognito. В российском контуре (
cenaly.ru) вход устроен иначе, и OAuth туда пока не подключён: там работают только гостевые инструменты.
- Метаданные ресурса:
https://api.cenaly.ru/.well-known/oauth-protected-resource - Метаданные сервера авторизации:
https://api.cenaly.ru/.well-known/oauth-authorization-server - Динамическая регистрация клиента (RFC 7591):
POST https://api.cenaly.ru/llm/oauth/register
Пока токена нет, tools/list показывает только гостевые инструменты — авторизованные просто не видны.
Права ровно те же, что у вас в админке: владелец видит весь аккаунт, сотрудник — свою локацию и по своей роли. Файлы, которые продукт ведёт как журнал событий (профиль, снимок меню, карточки блюд), напрямую переписать нельзя — для них есть безопасный
write_signal.
Правила и гарантии#
- Заказ валидируется по живому меню: несуществующее блюдо, вариант или доп — ошибка 400 со списком проблем; цены и итог считает сервер, у агента нет способа «назначить» цену.
- Для самовывоза и доставки обязательны имя и телефон гостя; для доставки — адрес.
orderId/reservationId— секретные токены: по ним проверяется статус и отменяется бронь. Не публикуйте их.- Заказы и брони попадают ресторану в реальном времени — в админку, на кухонный экран и в уведомления, как обычные заказы с сайта.
- Брони гостя имеют статус
pending, пока ресторан не подтвердит их в админке. - В России алкоголь через агентский канал заказать нельзя. Дистанционная продажа алкогольной продукции запрещена законом (пп. 14 п. 2 ст. 16 171-ФЗ), поэтому у локаций со страной «Россия» заказ с алкогольной позицией не проходит валидацию: в ответе 400 приходит строка с названием этой позиции и пояснением, что заказать её можно только у официанта в зале. Заказ нужно пересобрать без алкоголя.
Машиночитаемое обнаружение#
https://cenaly.ru/llms.txt— краткая карта API для LLM;GET https://api.cenaly.ru/llm/v1— discovery-документ: полный список эндпоинтов, примеры заказа, брони и работы с корзиной, ссылки на OAuth-метаданные.