Яндекс Еда 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 — проверяй его в каждом запросе.
  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 заказа в Яндекс Еде, он нужен для сверки и поддержки.
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

Авторизация

Тип: 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 нет Причина отмены

Нюансы

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


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