M cenaly.ru
🔗 Интеграции

🛒 Guest API для AI-агентов

Меню, заказы и брони для AI-ассистентов — публичный REST + MCP, без авторизации

Документация

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} Статус / отмена брони

Корзина: собрать заказ по шагам#

Агенту не обязательно угадывать состав заказа одним выстрелом — можно вести корзину на сервере, как это делает человек в веб-корзине:

  1. POST /carts с первыми строками → cartId
  2. PATCH /carts/{cartId} — добавить, изменить количество, убрать (quantity: 0)
  3. 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_menucreate_orderget_order_status (4-значный номер появляется через пару секунд).
  • Заказ в диалоге: search_productsupdate_cart (по одной позиции, как в разговоре) → get_cartcreate_order, либо отдать гостю checkoutUrl и дать ему завершить заказ самому.
  • Вопрос о заведении: get_store_info (адрес, часы, контакты) или search_policies_and_faqs (условия доставки, возврат, правила).
  • Бронь столика: check_table_availability (столы со схемы зала, свободен/занят на выбранное время) → create_reservation с tableIdget_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-метаданные.