Яндекс Еда Vendor API API

Отрасль: Ритейл и e-commerce. Актуально на 2026-10-24.

API интеграции ресторанов и сетей с Яндекс Едой по моделям Yandex (доставка Яндекс Еды) и Marketplace (доставка партнёра). Большую часть методов реализует партнёр на своей стороне — Яндекс Еда вызывает их как клиент: получает меню и стоп-листы, список заведений, зоны доставки и график, передаёт заказы и их статусы. Отдельный блок Vendor Management Integration API — push-методы, которые вызывает партнёр: блокировка ресторанов, запуск обновления меню, история заказов, ответы на отзывы.

Сценарии

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

Заказы из Яндекс Еды сразу попадают на кассу или кухню ресторана. Особенность 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

Отдавать меню и стоп-лист

Меню и недоступные позиции в Яндекс Еде совпадают с кассой — без ручного редактирования в кабинете.

  1. Реализуй список заведений: GET /restaurants — ID ресторанов в твоей системе.
  2. Реализуй меню: GET /menu/{restaurantId}/composition с моделью application/vnd.eats.menu.composition.v2+json. Позиции с ошибками — слишком длинные названия, цена 0.00 — Яндекс Еда может пропустить, поэтому валидируй меню до отдачи.
  3. Реализуй стоп-лист: GET /menu/{restaurantId}/availability — позиции, недоступные прямо сейчас (application/vnd.eats.menu.availability.v2+json).
  4. Чтобы изменения применились сразу, а не при следующем плановом опросе, сам инициируй обновление. Получи токен на стороне Яндекс Еды: POST /oauth2/token на dc-partner.eda.yandex.net с client_id и client_secret. Затем вызови POST /menu/import/initiation с restaurantId и operationType = menu (меню) или menu_stop_list (стоп-лист), передав заголовки Authorization и Partner-Name.
EDA=https://dc-partner.eda.yandex.net

PUSH_TOKEN=$(curl -s -X POST "$EDA/oauth2/token" \
  -d client_id=<client_id> -d client_secret=<client_secret> | jq -r .access_token)

# Позиция закончилась на кухне — просим Яндекс Еду перечитать стоп-лист
curl -s -X POST "$EDA/menu/import/initiation" \
  -H "Authorization: Bearer $PUSH_TOKEN" -H 'Partner-Name: <partner_name>' \
  -H 'Content-Type: application/json' \
  -d '{"restaurantId": "msk-tverskaya-7", "operationType": "menu_stop_list"}'

Временно закрыть ресторан и сверить заказы

Кухня перегружена или ресторан закрыт на санитарный день — приём заказов останавливается из твоей системы. В конце месяца заказы сверяются с кассой.

  1. Заблокируй приём заказов: POST /block на dc-partner.eda.yandex.net с vendorInfo (какие рестораны), from, to (без него блокировка бессрочная), message (причина) и tag. Заголовки — Authorization и Partner-Name.
  2. Сними блокировку методом unblock, когда ресторан снова готов. Статус блокировок отдаёт отдельный метод статуса.
  3. Для сверки выгрузи историю: POST /v1/orders-history с origin_ids (рестораны и тип доставки), from и to в RFC3339 и pagination. В ответе до 1000 заказов, история хранится 180 дней — выгружай ежемесячно.
curl -s -X POST https://dc-partner.eda.yandex.net/block \
  -H "Authorization: Bearer $PUSH_TOKEN" -H 'Partner-Name: <partner_name>' \
  -H 'Content-Type: application/json' \
  -d '{
        "vendorInfo": <рестораны в формате из документации метода>,
        "from": "2026-10-25T10:00:00.000+03:00",
        "to": "2026-10-25T23:00:00.000+03:00",
        "message": "Санитарный день",
        "tag": "<тег блокировки>"
      }'

Базовые 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)

GET /restaurants — Список заведений партнёра (реализует партнёр)

Возвращает заведения партнёра.

GET /menu/{restaurantId}/composition — Актуальное меню ресторана (реализует партнёр)

Актуальная модель ответа — application/vnd.eats.menu.composition.v2+json. Позиции с несоответствиями (слишком длинная строка, цена 0.00) могут быть проигнорированы.

Параметр Где Тип Обяз. Описание
restaurantId path string да ID ресторана в системе партнёра

GET /menu/{restaurantId}/availability — Недоступные позиции меню (реализует партнёр)

Стоп-лист на текущий момент; модель ответа — application/vnd.eats.menu.availability.v2+json.

Параметр Где Тип Обяз. Описание
restaurantId path string да ID ресторана в системе партнёра

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

POST /oauth2/token — Токен для push-методов

Хост dc-partner.eda.yandex.net, тело application/x-www-form-urlencoded.

Параметр Где Тип Обяз. Описание
client_id body string да Идентификатор клиента
client_secret body string да Секретный ключ

POST /menu/import/initiation — Запуск обновления меню и стоп-листов

Хост dc-partner.eda.yandex.net.

Параметр Где Тип Обяз. Описание
Authorization header string нет Токен, полученный на стороне Яндекс Еды
Partner-Name header string нет Имя партнёра
restaurantId body string да ID ресторана в системе партнёра
operationType body string нет menu, menu_stop_list или promo

POST /block — Блокировка ресторанов

Хост dc-partner.eda.yandex.net. Разблокировка — POST /unblock, статус блокировок — POST /v2/status.

Параметр Где Тип Обяз. Описание
Authorization header string нет Токен
Partner-Name header string нет Имя партнёра
vendorInfo body array да Рестораны для блокировки
from body string да Начало блокировки
to body string нет Окончание; без него — навсегда
message body string нет Причина блокировки
tag body string да Тег блокировки

POST /v1/orders-history — История заказов

Хост dc-partner.eda.yandex.net. До 1000 заказов в ответе; история хранится 180 дней.

Параметр Где Тип Обяз. Описание
origin_ids body array да Рестораны партнёра и тип доставки в них
from body string да С какой даты, RFC3339
to body string да По какую дату, RFC3339
service body array нет Сервисы, для которых вернуть заказы
status body array нет Фильтр по статусам
pagination body object да Пагинация

Нюансы

Ошибки

Код Описание
400 Некорректный запрос
401 Нет авторизации
404 Объект не найден
406 Неподдерживаемая версия модели (POST /order)
500 Внутренняя ошибка

Источники


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