{"name":"r_keeper Delivery API","vendor":"UCS (r_keeper)","industry":"retail","summary":"API модуля доставки r_keeper Delivery для внешних источников заказов (сайт, мобильное приложение, агрегатор): получение меню, создание заказов на доставку и самовывоз, поиск и получение заказов, отмена, список заведений, справочник причин отмены. Подключение создаётся в административной панели r_keeper Delivery; для работы нужна лицензия «R-Keeper модуль Delivery_Api».","docsUrl":"https://docs.rkeeper.ru/delivery/vozmoyonosti-api-4041552.html","coverage":{"included":[],"excluded":[]},"scenarios":[{"id":"podklyuchit-sayt-i-zagruzit-menyu","title":"Подключить сайт и загрузить меню","summary":"Сайт или приложение доставки показывает актуальное меню ресторана на r_keeper — с ценами, КБЖУ и стоп-листом.","steps":["В админке r_keeper Delivery создай подключение: «Интеграции» → «Подключение по API». Выбери заведения и представление меню. В карточке появятся Client ID и Client Secret.","Получи токен: POST /connect/token на хосте auth-delivery.ucs.ru, form-urlencoded, с client_Id, client_secret, grant_type = client_credentials и scopes = orders. Токен живёт 3600 секунд — обновляй его заранее.","Получи список заведений: GET /orders/api/v1/orderSources/{orderSourceId}/restaurants, где orderSourceId — твой Client ID. В result[] — id, name, actualAddress и state. Показывай только active.","Загрузи меню: GET /orders/api/v1/menu/view с restaurantId. В result — categories, products, ingredients. У каждого продукта есть isContainInStopList — такие позиции скрывай или помечай.","Ошибка licence_not_found означает, что у ресторана нет лицензии «R-Keeper модуль Delivery_Api»."],"code":"TOKEN=$(curl -s -X POST https://auth-delivery.ucs.ru/connect/token \\\n  -d client_Id=<client_id> -d client_secret=<client_secret> \\\n  -d grant_type=client_credentials -d scopes=orders | jq -r .access_token)\n\ncurl -s \"https://delivery.ucs.ru/orders/api/v1/orderSources/<client_id>/restaurants\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\ncurl -s -G \"https://delivery.ucs.ru/orders/api/v1/menu/view\" \\\n  -H \"Authorization: Bearer $TOKEN\" -d restaurantId=<restaurant_guid>","language":"bash","methods":["POST /connect/token","GET /orders/api/v1/orderSources/{orderSourceId}/restaurants","GET /orders/api/v1/menu/view"]},{"id":"peredat-zakaz-s-sayta-v-restoran","title":"Передать заказ с сайта в ресторан","summary":"Заказ на доставку или самовывоз сразу попадает в r_keeper — без звонка оператору.","steps":["Создай заказ: POST /orders/api/v1/orders с restaurantId, expeditionType (delivery или pickup), dishList (id блюда из меню и quantity; модификаторы — в ingredients), paymentTypeId (cash, card или online) и guest.phone.","Время: либо soonest = true («как можно скорее»), либо expectedAt — обязательно с часовым поясом, например 2026-10-24T19:30:00+03:00.","Для доставки обязателен адрес: address.cityName, houseNumber, fullAddress (до 150 символов) и, если есть, street и apartmentNumber. Для оплаты наличными укажи changeFrom — с какой суммы сдача.","Ответ 201 — {\"result\": {\"orderId\": \"...\"}}. Ошибка order_validation значит, что блюда нет в меню, оно в стоп-листе, неверна цена или не хватает обязательных полей. Перед заказом проверяй стоп-лист по меню.","Статус и детали заказа — GET /orders/api/v1/orders/{orderId}."],"code":"curl -s -X POST https://delivery.ucs.ru/orders/api/v1/orders \\\n  -H \"Authorization: Bearer $TOKEN\" -H 'Content-Type: application/json' \\\n  -d '{\n        \"restaurantId\": \"<restaurant_guid>\",\n        \"expeditionType\": \"delivery\",\n        \"dishList\": [{\"id\": \"<dish_guid>\", \"quantity\": 2}],\n        \"paymentTypeId\": \"cash\",\n        \"changeFrom\": 5000,\n        \"soonest\": true,\n        \"guest\": {\"phone\": \"+79990001122\", \"firstName\": \"Анна\"},\n        \"address\": {\"cityName\": \"Москва\", \"street\": \"Тверская\", \"houseNumber\": \"7\",\n                    \"apartmentNumber\": \"12\", \"fullAddress\": \"Москва, Тверская ул., д. 7, кв. 12\"},\n        \"persons\": 2,\n        \"comment\": \"Позвонить за 10 минут\"\n      }'","language":"bash","methods":["POST /orders/api/v1/orders","GET /orders/api/v1/orders/{orderId}"]},{"id":"otslezhivat-statusy-zakazov","title":"Отслеживать статусы заказов","summary":"Гость видит на сайте, что заказ принят, готовится или уже у курьера.","steps":["Опрашивай изменения: GET /orders/api/v1/orders с fromDate (начало окна), orderBy = updatedAt, sortOrder = desc и, при необходимости, includeStatusIds — например, 1, 2, 3 (новый, подтверждённый, принят рестораном).","В result[] — orderId, orderStatusId, orderStatusName, courierName и состав заказа. Сравнивай статус с сохранённым и обновляй только изменившиеся заказы.","Чтобы не опрашивать API, настрой push-уведомления в админке: внешний API с URL и токеном в заголовке и шаблон в разделе «Коммуникации» с каналом API и условием по статусу. Неотправленные события стоят в очереди и повторяются."],"code":"curl -s -G \"https://delivery.ucs.ru/orders/api/v1/orders\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d fromDate=2026-10-24T00:00:00+03:00 -d orderBy=updatedAt -d sortOrder=desc \\\n  -d includeStatusIds=1 -d includeStatusIds=2 -d includeStatusIds=3","language":"bash","methods":["GET /orders/api/v1/orders"]},{"id":"otmenit-zakaz","title":"Отменить заказ","summary":"Гость отменил заказ в приложении — отмена уходит в ресторан с понятной причиной.","steps":["Загрузи справочник причин: GET /orders/api/v1/rejectionReasons — в result[] id и reason.","Отмени заказ: PUT /orders/api/v1/orders/{orderId}/reject с restaurantId в строке запроса и rejectionReasonId или rejectionReasonText в теле. Если причины отмены в ресторане выключены, передай оба поля пустыми.","Ошибки status_change_forbidden и err_unprocessable_entity значат, что заказ уже завершён: отменить его через API нельзя, нужен звонок в ресторан."],"code":"curl -s \"https://delivery.ucs.ru/orders/api/v1/rejectionReasons\" -H \"Authorization: Bearer $TOKEN\"\n\ncurl -s -X PUT \"https://delivery.ucs.ru/orders/api/v1/orders/<orderId>/reject?restaurantId=<restaurant_guid>\" \\\n  -H \"Authorization: Bearer $TOKEN\" -H 'Content-Type: application/json' \\\n  -d '{\"rejectionReasonId\": \"<reason_id>\", \"rejectionReasonText\": \"\"}'","language":"bash","methods":["PUT /orders/api/v1/orders/{orderId}/reject","GET /orders/api/v1/rejectionReasons"]}],"baseUrls":[{"label":"Боевой","url":"https://delivery.ucs.ru"},{"label":"Авторизация","url":"https://auth-delivery.ucs.ru"}],"auth":{"type":"oauth2","description":"В админке: «Интеграции» → «Подключение по API» → добавить подключение (заведения, представление меню, GUID валют для онлайн-оплаты). В карточке появятся Client ID (16 символов) и Client Secret (128 символов).\n\nТокен получают запросом `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 секунд и передаётся во всех запросах:","example":"Authorization: Bearer eyJhbGciOiJSUzI....aXHgrHV-I"},"methods":[{"id":"POST /connect/token","title":"Получение токена","httpMethod":"POST","path":"/connect/token","description":"Хост `auth-delivery.ucs.ru`.","params":[{"name":"client_Id","in":"body","type":"string","required":true,"description":"Client ID подключения"},{"name":"client_secret","in":"body","type":"string","required":true,"description":"Client Secret подключения"},{"name":"grant_type","in":"body","type":"string","required":true,"description":"client_credentials"},{"name":"scopes","in":"body","type":"string","required":true,"description":"orders"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders/api/v1/orderSources/{orderSourceId}/restaurants","title":"Список заведений","httpMethod":"GET","path":"/orders/api/v1/orderSources/{orderSourceId}/restaurants","description":"В ответе `result[]`: `id`, `objectId`, `name`, `actualAddress`, `state` (`active`/`noActive`).","params":[{"name":"orderSourceId","in":"path","type":"string","required":true,"description":"Ваш Client ID"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders/api/v1/menu/view","title":"Актуальное меню","httpMethod":"GET","path":"/orders/api/v1/menu/view","description":"Без `restaurantId` возвращается меню по умолчанию (представление меню назначается в карточке подключения). В `result`: `categories`, `products` (с `isContainInStopList`, ценой, КБЖУ), `ingredientsSchemes`, `ingredientsGroups`, `ingredients`.","params":[{"name":"restaurantId","in":"query","type":"string","required":false,"description":"ID заведения"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"POST /orders/api/v1/orders","title":"Создание заказа","httpMethod":"POST","path":"/orders/api/v1/orders","description":"Ответ `201`: `{\"result\": {\"orderId\": \"...\"}}`.","params":[{"name":"restaurantId","in":"body","type":"string","required":true,"description":"GUID заведения"},{"name":"expeditionType","in":"body","type":"string","required":true,"description":"delivery или pickup"},{"name":"dishList","in":"body","type":"array","required":true,"description":"Состав заказа"},{"name":"dishList[].id","in":"body","type":"string","required":false,"description":"GUID блюда из меню; обязателен, если нет externalId"},{"name":"dishList[].quantity","in":"body","type":"number","required":true,"description":"Количество"},{"name":"dishList[].ingredients","in":"body","type":"array","required":false,"description":"Ингредиенты и модификаторы: id, quantity (больше 0)"},{"name":"paymentTypeId","in":"body","type":"string","required":true,"description":"cash, card или online"},{"name":"paymentStatus","in":"body","type":"string","required":false,"description":"prepaid — только при paymentTypeId: online"},{"name":"expectedAt","in":"body","type":"string","required":false,"description":"Время получения с часовым поясом; обязателен, если нет soonest"},{"name":"soonest","in":"body","type":"boolean","required":false,"description":"«Как можно скорее»"},{"name":"guest.phone","in":"body","type":"string","required":true,"description":"Телефон гостя"},{"name":"guest.firstName","in":"body","type":"string","required":false,"description":"Имя"},{"name":"guest.lastName","in":"body","type":"string","required":false,"description":"Фамилия"},{"name":"guest.email","in":"body","type":"string","required":false,"description":"Email"},{"name":"address.cityName","in":"body","type":"string","required":false,"description":"Город (обязателен для доставки)"},{"name":"address.street","in":"body","type":"string","required":false,"description":"Улица (для доставки, кроме адресов без улиц)"},{"name":"address.houseNumber","in":"body","type":"string","required":false,"description":"Дом, до 200 символов (обязателен для доставки)"},{"name":"address.fullAddress","in":"body","type":"string","required":false,"description":"Полный адрес, до 150 символов (обязателен для доставки)"},{"name":"address.apartmentNumber","in":"body","type":"string","required":false,"description":"Квартира, до 20 символов"},{"name":"address.lat","in":"body","type":"number","required":false,"description":"Широта"},{"name":"address.lon","in":"body","type":"number","required":false,"description":"Долгота"},{"name":"persons","in":"body","type":"integer","required":false,"description":"Число персон"},{"name":"changeFrom","in":"body","type":"number","required":false,"description":"Сдача с суммы"},{"name":"comment","in":"body","type":"string","required":false,"description":"Комментарий к заказу"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders/api/v1/orders/{orderId}","title":"Заказ по ID","httpMethod":"GET","path":"/orders/api/v1/orders/{orderId}","description":"","params":[{"name":"orderId","in":"path","type":"string","required":true,"description":"Номер заказа"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders/api/v1/orders","title":"Поиск заказов","httpMethod":"GET","path":"/orders/api/v1/orders","description":"В ответе `result[]`: `orderId`, `restaurantId`, `orderStatusId`, `orderStatusName`, даты, `guest`, суммы, `expeditionType`, `address`, `courierName`, `dishList` и др.","params":[{"name":"includeStatusIds","in":"query","type":"array","required":false,"description":"Статусы: 1 новый, 2 подтверждённый, 3 принят рестораном, 4 передан на кухню, 5 готовится, 6 приготовлен, 7 сборка, 8 собран, 9 у курьера, 10 в пути, 13 доставлен, 11 выполнен, 12 отменён"},{"name":"sortOrder","in":"query","type":"string","required":false,"description":"asc или desc"},{"name":"orderBy","in":"query","type":"string","required":false,"description":"updatedAt или expectedAt"},{"name":"q","in":"query","type":"string","required":false,"description":"Поисковый запрос"},{"name":"fromDate","in":"query","type":"string","required":false,"description":"Начало выборки (дата или дата-время)"},{"name":"toDate","in":"query","type":"string","required":false,"description":"Конец выборки"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"PUT /orders/api/v1/orders/{orderId}/reject","title":"Отмена заказа","httpMethod":"PUT","path":"/orders/api/v1/orders/{orderId}/reject","description":"Ответ `200 OK`. Если причины отмены выключены, передайте оба поля пустыми.","params":[{"name":"orderId","in":"path","type":"string","required":true,"description":"Номер заказа"},{"name":"restaurantId","in":"query","type":"string","required":false,"description":"ID заведения"},{"name":"rejectionReasonId","in":"body","type":"string","required":false,"description":"ID причины отмены"},{"name":"rejectionReasonText","in":"body","type":"string","required":false,"description":"Текст причины отмены"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders/api/v1/rejectionReasons","title":"Причины отмены","httpMethod":"GET","path":"/orders/api/v1/rejectionReasons","description":"В ответе `result[]`: `id`, `reason`, `type`, `isPossibleDelete`.","params":[],"requestExample":"","responseExample":"","docsUrl":""}],"codeExamples":[],"errors":[{"code":"order_not_found","description":"Заказ не найден"},{"code":"order_source_not_found","description":"Источник заказа не найден или выключен"},{"code":"restaurant_not_found","description":"Заведение не найдено или не подключено к доставке"},{"code":"order_source_not_found_for_restaurant","description":"Источник не привязан к заведению"},{"code":"order_validation","description":"Ошибка валидации заказа (обязательные поля, меню, цены, стоп-лист)"},{"code":"err_parse_request","description":"Ошибка разбора запроса (например, не указана причина отмены)"},{"code":"err_unprocessable_entity","description":"Заказ уже выполнен"},{"code":"rejection_reason_not_found","description":"Причина отмены не найдена"},{"code":"status_change_forbidden","description":"Заказ уже завершён"},{"code":"status_incorrect","description":"Недопустимый переход статуса"},{"code":"dish_not_found","description":"Блюдо не найдено"},{"code":"licence_not_found","description":"Нет лицензии на расширение"}],"limits":"- Токен действует 3600 секунд — после истечения запросите новый.","gotchas":["`expectedAt` передаётся обязательно с часовым поясом, например `2021-06-16T14:03:42.504+03:00`.","Позиции заказа ссылаются на ID блюд и ингредиентов из представления меню, назначенного подключению; блюдо в стоп-листе или неверная цена дают ошибку `order_validation`.","Push-уведомления о статусах настраиваются в админке: внешний API (URL и токен в заголовке) + шаблон в разделе «Коммуникации» с каналом API и условием (например, статус «Передан на кухню»). При ошибке доставки — повтор, неотправленные события хранятся в очереди.","Есть также методы изменения заказа, оплаты и завершения, предоплаты, справочники стран, городов, валют и курьеров."],"slug":"r-keeper-delivery","version":2,"updatedAt":"2026-10-24T17:05:35.401Z","sources":[{"title":"Возможности API","url":"https://docs.rkeeper.ru/delivery/vozmoyonosti-api-4041552.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Подключение по API","url":"https://docs.rkeeper.ru/delivery/administrativnaya-panel/integratsii/podklyuchenie-po-api","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Получение доступа к API","url":"https://docs.rkeeper.ru/delivery/poluchenie-dostupa-k-api-4043829.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Действия с меню","url":"https://docs.rkeeper.ru/delivery/dejstviya-s-menyu-10819549.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Создание заказа","url":"https://docs.rkeeper.ru/delivery/sozdanie-zakaza-4043824.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Вызов отмены заказа","url":"https://docs.rkeeper.ru/delivery/vyzov-otmeny-zakaza-10819412.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Поиск заказов","url":"https://docs.rkeeper.ru/delivery/poisk-zakazov-29406926.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Получение заказов по ID","url":"https://docs.rkeeper.ru/delivery/poluchenie-zakazov-po-id-19614188.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Список заведений","url":"https://docs.rkeeper.ru/delivery/spisok-zavedenij-19605216.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Подписка на статусы","url":"https://docs.rkeeper.ru/delivery/podpiska-na-statusy-veb-huki-141984100.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Описание ошибок","url":"https://docs.rkeeper.ru/delivery/opisanie-oshibok-4043826.html","kind":"research","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"Вставленный текст","url":"","kind":"import","addedAt":"2026-10-17T07:10:19.390Z"},{"title":"scenarios-r-keeper-delivery.md","url":"","kind":"import","addedAt":"2026-10-24T17:05:26.184Z"}],"logoUrl":null}