# Яндекс Еда Vendor API: Принимать заказы Яндекс Еды в своей системе

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

Заказы из Яндекс Еды сразу попадают на кассу или кухню ресторана. Особенность API: эти методы реализуешь ты, а Яндекс Еда вызывает их на твоём сервере.

1. Реализуй выдачу токена: POST /security/oauth/token принимает form-urlencoded client_id, client_secret, grant_type и scope (read, write) и возвращает токен. Дальше Яндекс Еда передаёт его как Authorization: Bearer <token> — проверяй его в каждом запросе.
2. Реализуй приём заказа: POST /order с моделью application/vnd.eats.order.v2+json. Тип заказа — YandexOrder (везёт курьер Яндекс Еды), MarketplaceOrder (везёт ресторан) или PickupOrder (самовывоз). Создай заказ у себя и верни orderId (лучше UUID4) и result. Неподдерживаемая версия модели — ответ 406.
3. Реализуй статус: GET /order/{orderId}/status. Статусы идут только вперёд: NEW → ACCEPTED_BY_RESTAURANT → COOKING → READY → TAKEN_BY_COURIER → DELIVERED; в CANCELLED — из любого.
4. Реализуй приём статусов от Яндекс Еды: PUT /order/{orderId}/status с status (TAKEN_BY_COURIER, DELIVERED или CANCELLED), reason и updatedAt — ответ 204. Отмену Яндекс Еда обычно присылает через DELETE /order/{orderId} с eatsId и comment.
5. Даты — RFC3339 с долями секунд. Сохраняй eatsId — сквозной ID заказа в Яндекс Еде, он нужен для сверки и поддержки.

```python
import uuid
from datetime import datetime, timezone
from flask import Flask, request, jsonify, abort

app = Flask(__name__)
ORDERS = {}

def now():
    return datetime.now(timezone.utc).isoformat(timespec="milliseconds")

@app.before_request
def auth():
    if request.path != "/security/oauth/token" and request.headers.get("Authorization") != f"Bearer {TOKEN}":
        abort(401)

@app.post("/security/oauth/token")
def token():
    if request.form.get("client_id") != CLIENT_ID or request.form.get("client_secret") != CLIENT_SECRET:
        abort(401)
    return jsonify(access_token=TOKEN, token_type="bearer", expires_in=3600)

@app.post("/order")
def create_order():
    order = request.get_json()
    order_id = str(uuid.uuid4())
    ORDERS[order_id] = {"eatsId": order.get("eatsId"), "status": "NEW", "updatedAt": now(), "payload": order}
    send_to_kitchen(order_id, order)                  # твоя касса или кухонный экран
    return jsonify(result="OK", orderId=order_id)

@app.get("/order/<order_id>/status")
def order_status(order_id):
    o = ORDERS.get(order_id) or abort(404)
    return jsonify(status=o["status"], updatedAt=o["updatedAt"])

@app.put("/order/<order_id>/status")
def status_from_eda(order_id):
    o = ORDERS.get(order_id) or abort(404)
    o.update(status=request.get_json()["status"], updatedAt=now())
    return "", 204

@app.delete("/order/<order_id>")
def cancel(order_id):
    o = ORDERS.get(order_id) or abort(404)
    o.update(status="CANCELLED", updatedAt=now())
    return "", 200
```

## Базовые URL

- Боевой (push-методы Vendor Management Integration API): `https://dc-partner.eda.yandex.net`
- Методы меню, заказов, ресторанов, зон и графика размещаются на сервере партнёра (: `{host}`

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

Тип: OAuth 2.0

На своей стороне партнёр реализует OAuth 2.0 `client_credentials`: метод `POST /security/oauth/token` выдаёт токен по `client_id`, `client_secret`, `grant_type` и `scope` (`read`, `write`). Яндекс Еда передаёт токен в каждом запросе как `Authorization: Bearer token`.

Для push-методов партнёр получает токен на стороне Яндекс Еды (`POST /oauth2/token` на `dc-partner.eda.yandex.net`) и передаёт заголовки `Authorization` и `Partner-Name`.

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

### POST /security/oauth/token — Выдача токена (реализует партнёр)

Тело — `application/x-www-form-urlencoded` в одну строку.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `client_id` | body | string | да | Идентификатор клиента |
| `client_secret` | body | string | да | Секрет |
| `grant_type` | body | string | да | Тип доступа |
| `scope` | body | string | да | Права доступа (read, write) |

### POST /order — Создание заказа в системе ресторана (реализует партнёр)

Модель запроса — `application/vnd.eats.order.v2+json`; схемы `YandexOrder` (доставка Яндекс Еды), `MarketplaceOrder` (доставка партнёра), `PickupOrder` (самовывоз). В ответе — `orderId` (рекомендуется UUID4) и `result`.

### GET /order/{orderId}/status — Статус заказа (реализует партнёр)

Статусы: `NEW` → `ACCEPTED_BY_RESTAURANT` → `COOKING` → `READY` → `TAKEN_BY_COURIER` → `DELIVERED`; в `CANCELLED` — из любого статуса.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `orderId` | path | string | да | ID заказа в системе партнёра |

### PUT /order/{orderId}/status — Обновление статуса со стороны Яндекс Еды (реализует партнёр)

Ответ `204`. Отмену Яндекс Еда обычно передаёт через `DELETE /order/{orderId}`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `orderId` | path | string | да | ID заказа в системе партнёра |
| `status` | body | string | да | TAKEN_BY_COURIER, DELIVERED или CANCELLED |
| `attributes` | body | array | нет | Доп. атрибуты, например признак оплаты при отмене |
| `comment` | body | string | нет | Комментарий |
| `reason` | body | string | нет | Причина отмены (только для CANCELLED) |
| `updatedAt` | body | string | нет | Время смены статуса, RFC3339 с долями секунд |

### DELETE /order/{orderId} — Отмена заказа (реализует партнёр)

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `orderId` | path | string | да | ID заказа в системе партнёра |
| `eatsId` | body | string | да | Сквозной ID заказа в Яндекс Еде |
| `comment` | body | string | нет | Причина отмены |

## Нюансы

- Направление вызовов: методы меню, заказов, ресторанов, зон доставки и графика реализует партнёр, а Яндекс Еда их вызывает; push-методы вызывает партнёр на `dc-partner.eda.yandex.net`.
- Модели запросов и ответов версионируются через `Content-Type`/`Accept`: `application/vnd.eats.order.v2+json`, `application/vnd.eats.menu.composition.v2+json` и т. п.
- Статус заказа меняется только вперёд по цепочке; приготовленный заказ нельзя снова сделать новым.
- Даты — RFC3339 с дробной частью секунд.
- Есть также методы отзывов (`POST /v1/feedback`, `POST /feedback-answer`), зон доставки (`GET /places/{restaurantId}/zones`), графика работы (`GET /places/{restaurantId}/schedule`) и валидации кода курьера.

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

- [Отдавать меню и стоп-лист](https://mcp-everything.ru/integrations/yandex-eda-vendor/scenarios/otdavat-menyu-i-stop-list.md)
- [Временно закрыть ресторан и сверить заказы](https://mcp-everything.ru/integrations/yandex-eda-vendor/scenarios/vremenno-zakryt-restoran-i-sverit-zakazy.md)

---

Если этого недостаточно — официальная документация: https://yandex.ru/dev/eda-vendor/doc/ru/ref/
Вся интеграция одним документом: https://mcp-everything.ru/integrations/yandex-eda-vendor.md
