# r_keeper Delivery API: Передать заказ с сайта в ресторан

Сценарий из mcp-everything. Актуально на 2026-10-24.

Заказ на доставку или самовывоз сразу попадает в 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 минут"
      }'
```

## Базовые 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 /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 | да | Номер заказа |

## Нюансы

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

## Другие сценарии

- [Подключить сайт и загрузить меню](https://mcp-everything.ru/integrations/r-keeper-delivery/scenarios/podklyuchit-sayt-i-zagruzit-menyu.md)
- [Отслеживать статусы заказов](https://mcp-everything.ru/integrations/r-keeper-delivery/scenarios/otslezhivat-statusy-zakazov.md)
- [Отменить заказ](https://mcp-everything.ru/integrations/r-keeper-delivery/scenarios/otmenit-zakaz.md)

---

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