Спецификация 03. Контракты API и событий¶
Статус: ревизия №2 по итогам аудита корпуса · 10.10.2026. Числовые факты сопровождаются ссылками; канонические перечисления — в «Модели данных», §0.
Наружная поверхность платформы: для витрин, агрегаторов, партнёров и внутренних фронтендов. Версия контрактов —
v1. Формат — JSON; время — ISO 8601 (UTC); деньги — десятичные строки.
1. Поверхность REST (ресурсы)¶
| Группа | Метод и путь | Назначение |
|---|---|---|
| Заказы | POST /v1/orders |
создать заказ (любой канал) |
| Заказы | GET /v1/orders/{id} |
состояние заказа |
| Заказы | POST /v1/orders/{id}/status |
смена статуса (касса, кухня, курьер) |
| Меню | GET /v1/menu?location= |
витрина меню (категории, модификаторы, цены канала, стоп-лист) |
| Меню | POST /v1/menu/stop-list |
стоп-лист (распространяется во все каналы) |
| Оплаты | POST /v1/payments/intent |
намерение оплаты (эквайринг/СБП) |
| Чеки | GET /v1/fiscal/receipts?order= |
фискальные документы заказа |
| Гости | POST /v1/guests/identify |
идентификация по телефону |
| Лояльность | GET /v1/guests/{id}/loyalty |
баланс и история |
| Лояльность | POST /v1/loyalty/redeem |
списание бонусов в чек |
| Доставка | POST /v1/delivery/quote |
расчёт зоны, стоимости, обещания |
| Курьерам | GET /v1/courier/assignments |
назначения смены |
| Курьерам | POST /v1/courier/assignments/{id}/status |
статус вручения (с фото) |
| Склад | POST /v1/inventory/receive |
приёмка (план/факт) |
| Склад | POST /v1/inventory/count |
результаты инвентаризации |
| Отзывы | POST /v1/reviews |
отзыв (привязка к заказу) |
| Франшиза | GET /v1/franchise/invoices?period= |
счета роялти |
2. Контракт создания заказа (единый для всех каналов)¶
{
"location_id": "loc_01",
"channel": "pos | site | app | miniapp | kiosk | phone | aggregator:yandex",
"items": [
{
"menu_item_id": "mi_123",
"qty": 2,
"modifiers": ["mod_extra_cheese"],
"comment_to_kitchen": "без лука"
}
],
"guest": { "phone": "+79000000000", "consent": true },
"delivery": { "address": "...", "zone_id": "dz_3", "slot": "asap" },
"idempotency_key": "5b6f..."
}
Ответ: 201 с order_id, promise_time, status_url. Ошибки: 409 стоп-лист, 422 вне зоны, 423 точка закрыта.
Канонические словари статусов (источник — ../components/12-data-model.md, §0):
Order.status:new | accepted | kitchen | ready | served | packed | delivered | cancelled— используется вPOST /v1/orders/{id}/statusи событияхorder.status_changed.KitchenTicket.status:queued | cooking | ready | served— событияkitchen.ticket_status.DeliveryAssignment.status:assigned | picked_up | delivering | delivered | failed—POST /v1/courier/assignments/{id}/statusпринимаетpicked_up | delivering | delivered | failedсproof_photoи/илиproof_code; событияdelivery.status_changedпитают обещания времени и уведомления гостя.channel:pos | site | app | miniapp | kiosk | phone | aggregator:{name}(канал колл-центраphoneравноправен в аналитике).
3. Каталог событий шины (наружу — вебхуки)¶
| Событие | Полезная нагрузка (ключевое) | Типичные получатели |
|---|---|---|
order.created / order.status_changed |
статус, состав, обещание | витрины, агрегаторы, экраны |
payment.completed |
сумма, метод, чек-референс | финучёт, аналитика |
fiscal.receipt_sent |
фискальные реквизиты | ОФД-мониторинг, роялти |
kitchen.ticket_status |
станция, время, отклонение | дашборды УК |
stock.movement |
тип, количество, документ | остатки, фудкост |
delivery.status_changed |
курьер, статус, фото | уведомления гостя |
review.created |
оценка, привязки заказа | сервис-рекавери |
audit.finished |
балл, нарушения | кабинет УК |
franchise.invoice_created |
период, сумма | биллинг |
Формат вебхука:
{
"event": "order.status_changed",
"tenant": "tn_7",
"location": "loc_01",
"object_id": "ord_42",
"version": 12,
"data": { "status": "ready", "at": "2026-10-10T18:30:00Z" }
}
4. Правила надёжности¶
- Идемпотентность: все создающие запросы принимают
idempotency_key; повтор с тем же ключом не создаёт дубль. - Доставка вебхуков — минимум-один-раз с подписью; получатель обязан быть идемпотентным (по
object_id + version). - Оптимистичные версии: обновление ресурсов — по
version(конфликт →409). - Пагинация курсорами (
?cursor=); списки заказов — только по тенанту и точке. - Авторизация: токены с областью видимости (тенант, точка, роль); устройство кассы — отдельный класс токенов с короткой жизнью.
- Ошибки — структурированные:
{ "error": "code", "message": "...", "details": {...} }.
5. Ограничение доступа по ролям (пример)¶
| Роль | Ресурсы |
|---|---|
| Касса точки | заказы (создание/статусы), оплаты, смены |
| Кухня | тикеты, стоп-лист |
| Управляющий | склад, инвентаризация, персонал точки, отчёты точки |
| Франчайзи | все свои точки, счета роялти, заявки в УК |
| УК | агрегаты сети, шаблоны, аудиты, биллинг |