# iikoCloud API: Передать заказ доставки с сайта на кассу

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

Заказ с сайта сразу появляется на кухне и у курьеров — без ручного переноса оператором.

1. Получи типы оплат: POST /api/1/payment_types с organizationIds — нужен ID типа оплаты для order.payments.
2. Создай заказ: POST /api/1/deliveries/create с organizationId, terminalGroupId и order — phone (с +), orderServiceType (DeliveryByCourier или DeliveryByClient для самовывоза), deliveryPoint.address, items (тип, productId, amount; productSizeId — если у блюда есть размеры), payments. Передай свой order.id (UUID) — он защитит от дублей при повторе.
3. createOrderSettings.checkStopList = true не даст создать заказ с позицией из стоп-листа.
4. Создание асинхронное: в ответе correlationId. Проверяй POST /api/1/commands/status с organizationId и correlationId, пока state не станет Success или Error.
5. Текущий статус и детали заказа — POST /api/1/deliveries/by_id с organizationId и orderIds. Время в iiko — локальное время терминала, без часового пояса.

```python
import time, uuid, requests

API = "https://api-ru.iiko.services/api/1"
H = {"Authorization": f"Bearer {token}"}
org, tg = "<organizationId>", "<terminalGroupId>"
order_id = str(uuid.uuid4())

resp = requests.post(f"{API}/deliveries/create", headers=H, json={
    "organizationId": org,
    "terminalGroupId": tg,
    "createOrderSettings": {"checkStopList": True},
    "order": {
        "id": order_id,
        "externalNumber": "SITE-1042",
        "phone": "+79990001122",
        "orderServiceType": "DeliveryByCourier",
        "deliveryPoint": {"address": {"street": {"name": "Ленина", "city": "Екатеринбург"}, "house": "10"},
                          "comment": "Домофон 45"},
        "items": [{"type": "Product", "productId": "<productId>", "amount": 2}],
        "payments": [{"paymentTypeKind": "Card", "paymentTypeId": "<paymentTypeId>", "sum": 1580}],
        "comment": "Без лука",
    },
}).json()

while True:
    st = requests.post(f"{API}/commands/status", headers=H,
                       json={"organizationId": org, "correlationId": resp["correlationId"]}).json()
    if st["state"] != "InProgress":
        break
    time.sleep(2)
print(st["state"])
```

## Базовые URL

- Боевой: `https://api-ru.iiko.services`

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

Тип: Bearer-токен

- Зарегистрируйтесь на портале разработчика `https://public-api.iikoweb.ru/portal` и создайте приложение — получите `appId` и одноразово показываемый `clientSecret`.
- В iikoWeb → «Интеграции» → «API-ключи» сгенерируйте `apiKey`.
- Получите токен методом `POST /api/v2/access_token` и передавайте его во всех запросах: `Authorization: Bearer {token}`.

Токен (JWT) действует 1 час; refresh-токена нет — запрашивайте новый до истечения срока. Старый метод `POST /api/1/access_token` с `apiLogin` устарел.

## Методы сценария

### POST /api/1/payment_types — Типы оплат

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `organizationIds` | body | array | да | ID организаций |

### POST /api/1/deliveries/create — Создание заказа на доставку

Команда: статус выполнения проверяется через `/api/1/commands/status`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `organizationId` | body | string | да | ID организации (uuid) |
| `terminalGroupId` | body | string | нет | ID терминальной группы, куда отправить заказ |
| `createOrderSettings.transportToFrontTimeout` | body | integer | нет | Сколько секунд даётся на доставку заказа в iikoFront |
| `createOrderSettings.checkStopList` | body | boolean | нет | Проверять позиции по стоп-листу |
| `order` | body | object | да | Заказ |
| `order.id` | body | string | нет | ID заказа (уникальный uuid); если не передан — генерируется |
| `order.externalNumber` | body | string | нет | Внешний номер заказа |
| `order.completeBefore` | body | string | нет | Время выполнения yyyy-MM-dd HH:mm:ss.fff, локальное для терминала |
| `order.phone` | body | string | да | Телефон: начинается с +, не меньше 8 цифр |
| `order.orderTypeId` | body | string | нет | Тип заказа; указывается он или orderServiceType |
| `order.orderServiceType` | body | string | нет | Тип обслуживания; указывается он или orderTypeId |
| `order.deliveryPoint.address` | body | object | нет | Адрес доставки (не нужен для самовывоза) |
| `order.deliveryPoint.coordinates` | body | object | нет | Координаты адреса |
| `order.deliveryPoint.comment` | body | string | нет | Доп. информация |
| `order.comment` | body | string | нет | Комментарий к заказу |
| `order.customer.type` | body | string | да | Тип клиента (если передаётся customer) |
| `order.guests.count` | body | integer | да | Число персон — определяет число приборов (если передаётся guests) |
| `order.items` | body | array | да | Позиции заказа |
| `order.items[].type` | body | string | да | Тип позиции |
| `order.items[].amount` | body | number | да | Количество |
| `order.items[].productSizeId` | body | string | нет | Размер; обязателен, если у позиции есть шкала размеров |
| `order.items[].comment` | body | string | нет | Комментарий |
| `order.combos` | body | array | нет | Комбо: id, name, amount, price, sourceId |
| `order.payments` | body | array | нет | Оплаты заказа |
| `order.marketingSourceId` | body | string | нет | Рекламный источник |
| `order.priceCategoryId` | body | string | нет | Ценовая категория |

### POST /api/1/deliveries/by_id — Заказы доставки по ID

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `organizationId` | body | string | да | ID организации |
| `orderIds` | body | array | нет | ID заказов; обязательно, если нет posOrderIds |
| `posOrderIds` | body | array | нет | ID заказов в POS; обязательно, если нет orderIds |
| `sourceKeys` | body | array | нет | Ключи источников |
| `returnExternalDataKeys` | body | array | нет | Ключи внешних данных |

### POST /api/1/commands/status — Статус команды

Код ответа `410` — `correlationId` больше не поддерживается.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `organizationId` | body | string | да | ID организации |
| `correlationId` | body | string | да | ID операции из ответа команды |

## Нюансы

- Все запросы, кроме получения токена, требуют заголовок `Authorization`; в каждом можно передать заголовок `Timeout` (секунды).
- Методы-команды (создание, отмена, изменение заказов) выполняются асинхронно: в ответе `correlationId`, итог — через `/api/1/commands/status`.
- Форматы: uuid — строка UUID; дата-время — `yyyy-MM-dd HH:mm:ss.fff` без часового пояса, локальное время терминала.
- Методы сгруппированы по группам ограничений (`Data: dictionaries`, `Data: menu`, `Orders: creating` и др.) — права API-ключа настраиваются по этим группам.
- Часть полей доступна только с определённой версии iikoRMS (в документации — пометки «Allowed from version»).
- Устаревшие методы: `/api/1/access_token`, `/api/1/nomenclature`, `/api/2/menu/by_id` — используйте `/api/v2/access_token` и `/api/menu/v3/by_id`.

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

- [Подключиться и найти свои рестораны](https://mcp-everything.ru/integrations/iiko/scenarios/podklyuchitsya-i-nayti-svoi-restorany.md)
- [Выгрузить меню на сайт с учётом стоп-листа](https://mcp-everything.ru/integrations/iiko/scenarios/vygruzit-menyu-na-sayt-s-uchetom-stop.md)
- [Отменить заказ и получать статусы вебхуками](https://mcp-everything.ru/integrations/iiko/scenarios/otmenit-zakaz-i-poluchat-statusy.md)

---

Если этого недостаточно — официальная документация: https://api-ru.iiko.services/docs
Вся интеграция одним документом: https://mcp-everything.ru/integrations/iiko.md
