Отрасль: Ритейл и e-commerce. Актуально на 2026-10-24.
API интеграции ресторанов и сетей с Яндекс Едой по моделям Yandex (доставка Яндекс Еды) и Marketplace (доставка партнёра). Большую часть методов реализует партнёр на своей стороне — Яндекс Еда вызывает их как клиент: получает меню и стоп-листы, список заведений, зоны доставки и график, передаёт заказы и их статусы. Отдельный блок Vendor Management Integration API — push-методы, которые вызывает партнёр: блокировка ресторанов, запуск обновления меню, история заказов, ответы на отзывы.
Заказы из Яндекс Еды сразу попадают на кассу или кухню ресторана. Особенность API: эти методы реализуешь ты, а Яндекс Еда вызывает их на твоём сервере.
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
Меню и недоступные позиции в Яндекс Еде совпадают с кассой — без ручного редактирования в кабинете.
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"}'
Кухня перегружена или ресторан закрыт на санитарный день — приём заказов останавливается из твоей системы. В конце месяца заказы сверяются с кассой.
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": "<тег блокировки>"
}'
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.
Тело — application/x-www-form-urlencoded в одну строку.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
client_id |
body | string | да | Идентификатор клиента |
client_secret |
body | string | да | Секрет |
grant_type |
body | string | да | Тип доступа |
scope |
body | string | да | Права доступа (read, write) |
Возвращает заведения партнёра.
Актуальная модель ответа — application/vnd.eats.menu.composition.v2+json. Позиции с несоответствиями (слишком длинная строка, цена 0.00) могут быть проигнорированы.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
restaurantId |
path | string | да | ID ресторана в системе партнёра |
Стоп-лист на текущий момент; модель ответа — application/vnd.eats.menu.availability.v2+json.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
restaurantId |
path | string | да | ID ресторана в системе партнёра |
Модель запроса — application/vnd.eats.order.v2+json; схемы YandexOrder (доставка Яндекс Еды), MarketplaceOrder (доставка партнёра), PickupOrder (самовывоз). В ответе — orderId (рекомендуется UUID4) и result.
Статусы: NEW → ACCEPTED_BY_RESTAURANT → COOKING → READY → TAKEN_BY_COURIER → DELIVERED; в CANCELLED — из любого статуса.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
orderId |
path | string | да | ID заказа в системе партнёра |
Ответ 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 с долями секунд |
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
orderId |
path | string | да | ID заказа в системе партнёра |
eatsId |
body | string | да | Сквозной ID заказа в Яндекс Еде |
comment |
body | string | нет | Причина отмены |
Хост dc-partner.eda.yandex.net, тело application/x-www-form-urlencoded.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
client_id |
body | string | да | Идентификатор клиента |
client_secret |
body | string | да | Секретный ключ |
Хост dc-partner.eda.yandex.net.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
Authorization |
header | string | нет | Токен, полученный на стороне Яндекс Еды |
Partner-Name |
header | string | нет | Имя партнёра |
restaurantId |
body | string | да | ID ресторана в системе партнёра |
operationType |
body | string | нет | menu, menu_stop_list или promo |
Хост 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 | да | Тег блокировки |
Хост 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 | да | Пагинация |
dc-partner.eda.yandex.net.Content-Type/Accept: application/vnd.eats.order.v2+json, application/vnd.eats.menu.composition.v2+json и т. п.POST /v1/feedback, POST /feedback-answer), зон доставки (GET /places/{restaurantId}/zones), графика работы (GET /places/{restaurantId}/schedule) и валидации кода курьера.| Код | Описание |
|---|---|
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