r_keeper Delivery API API

Отрасль: Ритейл и e-commerce. Актуально на 2026-10-24.

API модуля доставки r_keeper Delivery для внешних источников заказов (сайт, мобильное приложение, агрегатор): получение меню, создание заказов на доставку и самовывоз, поиск и получение заказов, отмена, список заведений, справочник причин отмены. Подключение создаётся в административной панели r_keeper Delivery; для работы нужна лицензия «R-Keeper модуль Delivery_Api».

Сценарии

Подключить сайт и загрузить меню

Сайт или приложение доставки показывает актуальное меню ресторана на r_keeper — с ценами, КБЖУ и стоп-листом.

  1. В админке r_keeper Delivery создай подключение: «Интеграции» → «Подключение по API». Выбери заведения и представление меню. В карточке появятся Client ID и Client Secret.
  2. Получи токен: POST /connect/token на хосте auth-delivery.ucs.ru, form-urlencoded, с client_Id, client_secret, grant_type = client_credentials и scopes = orders. Токен живёт 3600 секунд — обновляй его заранее.
  3. Получи список заведений: GET /orders/api/v1/orderSources/{orderSourceId}/restaurants, где orderSourceId — твой Client ID. В result[] — id, name, actualAddress и state. Показывай только active.
  4. Загрузи меню: GET /orders/api/v1/menu/view с restaurantId. В result — categories, products, ingredients. У каждого продукта есть isContainInStopList — такие позиции скрывай или помечай.
  5. Ошибка licence_not_found означает, что у ресторана нет лицензии «R-Keeper модуль Delivery_Api».
TOKEN=$(curl -s -X POST https://auth-delivery.ucs.ru/connect/token \
  -d client_Id=<client_id> -d client_secret=<client_secret> \
  -d grant_type=client_credentials -d scopes=orders | jq -r .access_token)

curl -s "https://delivery.ucs.ru/orders/api/v1/orderSources/<client_id>/restaurants" \
  -H "Authorization: Bearer $TOKEN"

curl -s -G "https://delivery.ucs.ru/orders/api/v1/menu/view" \
  -H "Authorization: Bearer $TOKEN" -d restaurantId=<restaurant_guid>

Передать заказ с сайта в ресторан

Заказ на доставку или самовывоз сразу попадает в r_keeper — без звонка оператору.

  1. Создай заказ: POST /orders/api/v1/orders с restaurantId, expeditionType (delivery или pickup), dishList (id блюда из меню и quantity; модификаторы — в ingredients), paymentTypeId (cash, card или online) и guest.phone.
  2. Время: либо soonest = true («как можно скорее»), либо expectedAt — обязательно с часовым поясом, например 2026-10-24T19:30:00+03:00.
  3. Для доставки обязателен адрес: address.cityName, houseNumber, fullAddress (до 150 символов) и, если есть, street и apartmentNumber. Для оплаты наличными укажи changeFrom — с какой суммы сдача.
  4. Ответ 201 — {"result": {"orderId": "..."}}. Ошибка order_validation значит, что блюда нет в меню, оно в стоп-листе, неверна цена или не хватает обязательных полей. Перед заказом проверяй стоп-лист по меню.
  5. Статус и детали заказа — GET /orders/api/v1/orders/{orderId}.
curl -s -X POST https://delivery.ucs.ru/orders/api/v1/orders \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{
        "restaurantId": "<restaurant_guid>",
        "expeditionType": "delivery",
        "dishList": [{"id": "<dish_guid>", "quantity": 2}],
        "paymentTypeId": "cash",
        "changeFrom": 5000,
        "soonest": true,
        "guest": {"phone": "+79990001122", "firstName": "Анна"},
        "address": {"cityName": "Москва", "street": "Тверская", "houseNumber": "7",
                    "apartmentNumber": "12", "fullAddress": "Москва, Тверская ул., д. 7, кв. 12"},
        "persons": 2,
        "comment": "Позвонить за 10 минут"
      }'

Отслеживать статусы заказов

Гость видит на сайте, что заказ принят, готовится или уже у курьера.

  1. Опрашивай изменения: GET /orders/api/v1/orders с fromDate (начало окна), orderBy = updatedAt, sortOrder = desc и, при необходимости, includeStatusIds — например, 1, 2, 3 (новый, подтверждённый, принят рестораном).
  2. В result[] — orderId, orderStatusId, orderStatusName, courierName и состав заказа. Сравнивай статус с сохранённым и обновляй только изменившиеся заказы.
  3. Чтобы не опрашивать API, настрой push-уведомления в админке: внешний API с URL и токеном в заголовке и шаблон в разделе «Коммуникации» с каналом API и условием по статусу. Неотправленные события стоят в очереди и повторяются.
curl -s -G "https://delivery.ucs.ru/orders/api/v1/orders" \
  -H "Authorization: Bearer $TOKEN" \
  -d fromDate=2026-10-24T00:00:00+03:00 -d orderBy=updatedAt -d sortOrder=desc \
  -d includeStatusIds=1 -d includeStatusIds=2 -d includeStatusIds=3

Отменить заказ

Гость отменил заказ в приложении — отмена уходит в ресторан с понятной причиной.

  1. Загрузи справочник причин: GET /orders/api/v1/rejectionReasons — в result[] id и reason.
  2. Отмени заказ: PUT /orders/api/v1/orders/{orderId}/reject с restaurantId в строке запроса и rejectionReasonId или rejectionReasonText в теле. Если причины отмены в ресторане выключены, передай оба поля пустыми.
  3. Ошибки status_change_forbidden и err_unprocessable_entity значат, что заказ уже завершён: отменить его через API нельзя, нужен звонок в ресторан.
curl -s "https://delivery.ucs.ru/orders/api/v1/rejectionReasons" -H "Authorization: Bearer $TOKEN"

curl -s -X PUT "https://delivery.ucs.ru/orders/api/v1/orders/<orderId>/reject?restaurantId=<restaurant_guid>" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"rejectionReasonId": "<reason_id>", "rejectionReasonText": ""}'

Базовые URL

Авторизация

Тип: OAuth 2.0

В админке: «Интеграции» → «Подключение по API» → добавить подключение (заведения, представление меню, GUID валют для онлайн-оплаты). В карточке появятся Client ID (16 символов) и Client Secret (128 символов).

Токен получают запросом POST https://auth-delivery.ucs.ru/connect/token (application/x-www-form-urlencoded) с параметрами client_Id, client_secret, grant_type=client_credentials, scopes=orders. Токен (JWT) действует 3600 секунд и передаётся во всех запросах:

Authorization: Bearer eyJhbGciOiJSUzI....aXHgrHV-I

Методы

POST /connect/token — Получение токена

Хост auth-delivery.ucs.ru.

Параметр Где Тип Обяз. Описание
client_Id body string да Client ID подключения
client_secret body string да Client Secret подключения
grant_type body string да client_credentials
scopes body string да orders

GET /orders/api/v1/orderSources/{orderSourceId}/restaurants — Список заведений

В ответе result[]: id, objectId, name, actualAddress, state (active/noActive).

Параметр Где Тип Обяз. Описание
orderSourceId path string да Ваш Client ID

GET /orders/api/v1/menu/view — Актуальное меню

Без restaurantId возвращается меню по умолчанию (представление меню назначается в карточке подключения). В result: categories, products (с isContainInStopList, ценой, КБЖУ), ingredientsSchemes, ingredientsGroups, ingredients.

Параметр Где Тип Обяз. Описание
restaurantId query string нет ID заведения

POST /orders/api/v1/orders — Создание заказа

Ответ 201: {"result": {"orderId": "..."}}.

Параметр Где Тип Обяз. Описание
restaurantId body string да GUID заведения
expeditionType body string да delivery или pickup
dishList body array да Состав заказа
dishList[].id body string нет GUID блюда из меню; обязателен, если нет externalId
dishList[].quantity body number да Количество
dishList[].ingredients body array нет Ингредиенты и модификаторы: id, quantity (больше 0)
paymentTypeId body string да cash, card или online
paymentStatus body string нет prepaid — только при paymentTypeId: online
expectedAt body string нет Время получения с часовым поясом; обязателен, если нет soonest
soonest body boolean нет «Как можно скорее»
guest.phone body string да Телефон гостя
guest.firstName body string нет Имя
guest.lastName body string нет Фамилия
guest.email body string нет Email
address.cityName body string нет Город (обязателен для доставки)
address.street body string нет Улица (для доставки, кроме адресов без улиц)
address.houseNumber body string нет Дом, до 200 символов (обязателен для доставки)
address.fullAddress body string нет Полный адрес, до 150 символов (обязателен для доставки)
address.apartmentNumber body string нет Квартира, до 20 символов
address.lat body number нет Широта
address.lon body number нет Долгота
persons body integer нет Число персон
changeFrom body number нет Сдача с суммы
comment body string нет Комментарий к заказу

GET /orders/api/v1/orders/{orderId} — Заказ по ID

Параметр Где Тип Обяз. Описание
orderId path string да Номер заказа

GET /orders/api/v1/orders — Поиск заказов

В ответе result[]: orderId, restaurantId, orderStatusId, orderStatusName, даты, guest, суммы, expeditionType, address, courierName, dishList и др.

Параметр Где Тип Обяз. Описание
includeStatusIds query array нет Статусы: 1 новый, 2 подтверждённый, 3 принят рестораном, 4 передан на кухню, 5 готовится, 6 приготовлен, 7 сборка, 8 собран, 9 у курьера, 10 в пути, 13 доставлен, 11 выполнен, 12 отменён
sortOrder query string нет asc или desc
orderBy query string нет updatedAt или expectedAt
q query string нет Поисковый запрос
fromDate query string нет Начало выборки (дата или дата-время)
toDate query string нет Конец выборки

PUT /orders/api/v1/orders/{orderId}/reject — Отмена заказа

Ответ 200 OK. Если причины отмены выключены, передайте оба поля пустыми.

Параметр Где Тип Обяз. Описание
orderId path string да Номер заказа
restaurantId query string нет ID заведения
rejectionReasonId body string нет ID причины отмены
rejectionReasonText body string нет Текст причины отмены

GET /orders/api/v1/rejectionReasons — Причины отмены

В ответе result[]: id, reason, type, isPossibleDelete.

Нюансы

Ошибки

Код Описание
order_not_found Заказ не найден
order_source_not_found Источник заказа не найден или выключен
restaurant_not_found Заведение не найдено или не подключено к доставке
order_source_not_found_for_restaurant Источник не привязан к заведению
order_validation Ошибка валидации заказа (обязательные поля, меню, цены, стоп-лист)
err_parse_request Ошибка разбора запроса (например, не указана причина отмены)
err_unprocessable_entity Заказ уже выполнен
rejection_reason_not_found Причина отмены не найдена
status_change_forbidden Заказ уже завершён
status_incorrect Недопустимый переход статуса
dish_not_found Блюдо не найдено
licence_not_found Нет лицензии на расширение

Ограничения

Источники


Если этого недостаточно — официальная документация: https://docs.rkeeper.ru/delivery/vozmoyonosti-api-4041552.html JSON: https://mcp-everything.ru/api/integrations/r-keeper-delivery. MCP: https://mcp-everything.ru/mcp