---
slug: "r-keeper-delivery"
name: "r_keeper Delivery API"
vendor: "UCS (r_keeper)"
industry: "retail"
docsUrl: "https://docs.rkeeper.ru/delivery/vozmoyonosti-api-4041552.html"
version: 2
updatedAt: "2026-10-24"
---

# r_keeper Delivery 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».

```bash
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}.

```bash
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 и условием по статусу. Неотправленные события стоят в очереди и повторяются.

```bash
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 нельзя, нужен звонок в ресторан.

```bash
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

- Боевой: `https://delivery.ucs.ru`
- Авторизация: `https://auth-delivery.ucs.ru`

## Авторизация

Тип: 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`.

## Нюансы

- `expectedAt` передаётся обязательно с часовым поясом, например `2021-06-16T14:03:42.504+03:00`.
- Позиции заказа ссылаются на ID блюд и ингредиентов из представления меню, назначенного подключению; блюдо в стоп-листе или неверная цена дают ошибку `order_validation`.
- Push-уведомления о статусах настраиваются в админке: внешний API (URL и токен в заголовке) + шаблон в разделе «Коммуникации» с каналом API и условием (например, статус «Передан на кухню»). При ошибке доставки — повтор, неотправленные события хранятся в очереди.
- Есть также методы изменения заказа, оплаты и завершения, предоплаты, справочники стран, городов, валют и курьеров.

## Ошибки

| Код | Описание |
|---|---|
| `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` | Нет лицензии на расширение |

## Ограничения

- Токен действует 3600 секунд — после истечения запросите новый.

## Источники

- [Возможности API](https://docs.rkeeper.ru/delivery/vozmoyonosti-api-4041552.html)
- [Подключение по API](https://docs.rkeeper.ru/delivery/administrativnaya-panel/integratsii/podklyuchenie-po-api)
- [Получение доступа к API](https://docs.rkeeper.ru/delivery/poluchenie-dostupa-k-api-4043829.html)
- [Действия с меню](https://docs.rkeeper.ru/delivery/dejstviya-s-menyu-10819549.html)
- [Создание заказа](https://docs.rkeeper.ru/delivery/sozdanie-zakaza-4043824.html)
- [Вызов отмены заказа](https://docs.rkeeper.ru/delivery/vyzov-otmeny-zakaza-10819412.html)
- [Поиск заказов](https://docs.rkeeper.ru/delivery/poisk-zakazov-29406926.html)
- [Получение заказов по ID](https://docs.rkeeper.ru/delivery/poluchenie-zakazov-po-id-19614188.html)
- [Список заведений](https://docs.rkeeper.ru/delivery/spisok-zavedenij-19605216.html)
- [Подписка на статусы](https://docs.rkeeper.ru/delivery/podpiska-na-statusy-veb-huki-141984100.html)
- [Описание ошибок](https://docs.rkeeper.ru/delivery/opisanie-oshibok-4043826.html)

---

Если этого недостаточно — официальная документация: 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
