Мок-API

Ozon Seller API

Что покрыто в моке Ozon Seller API, откуда взята спецификация и чем мок отличается от боевого API.

На этой странице · 6

Ozon Seller API — почти целиком POST-over-HTTP в RPC-стиле, с единым хостом и конвертом ошибки в стиле gRPC. Мок повторяет и то, и другое.

Откуда взята спецификация

ЧтоЗначение
Источникdocs.ozon.ru/api/seller/ — закрыт JS-антиботом, напрямую не читается
Зеркалоgithub.com/PCDCK/ozon-mcp (лицензия зеркала MIT)
Лицензия самой спецификациине объявлена
Снимок2026-04-16

Зеркало отстаёт от живой спецификации

На дату снимка в зеркале 420 методов против 467 в живой спецификации Ozon. Разница — 47 методов, которых в стенде нет: на них шлюз ответит 404 с подсказкой похожих путей. Это записано в specs/ozon/SOURCE.json и не скрывается.

Что покрыто

420 методов на момент написания: 128 с примером ответа из документации, 255 собираются по схеме и 37 отдают пустой конверт {"result":{}}. Числа живые — актуальные показывает /api/services и каталог.

Крупные разделы: заявки на поставку FBO, доставка и обработка заказов FBS и rFBS, загрузка и обновление товаров, цены и остатки, сертификаты, отчёты, стратегии ценообразования. Разделы, которые Ozon считает отдельными продуктами — «Бета-методы», «Premium-методы», «Ozon Доставка», «Приложения», — в каталоге помечены явно и не подмешиваются к базовым.

Особенности вызова

Авторизация — заголовки Client-Id и Api-Key; в Api-Key кладётся ключ песочницы, Client-Id шлюз не проверяет.

curl -s localhost:8080/oz/v3/product/info/list \
  -H "Client-Id: 123" -H "Api-Key: $KEY" \
  -H "Content-Type: application/json" -d '{}'

Глагол здесь значим: из 420 методов 414 — POST и только 6 — GET. Запрос GET /oz/v3/product/info/list вернёт 404, а не ответ POST-метода:

HTTP/1.1 404 Not Found
x-apistend-did-you-mean: /v3/product/info/list, /v3/product/list, /v4/product/info/limit

{"code":5,"message":"Not Found","details":[]}

Лимиты и ошибки

Профиль — около 50 запросов в секунду на аккаунт продавца, ёмкость ведра 50, при превышении 429. Заголовков лимита Ozon не отдаёт ни на успешном ответе, ни на 429 — их и в песочнице нет; рекомендуемая пауза приходит в собственном заголовке X-APIStend-Retry-After.

Конверт ошибки — rpcStatus: {"code": …, "message": …, "details": []}. Поле details присутствует всегда, даже пустое: клиенты на строгих типах без него падают. Числовой code — код gRPC:

СитуацияHTTPcode
ключ не подошёл40116 (UNAUTHENTICATED)
не найдено4045 (NOT_FOUND)
превышен лимит4298 (RESOURCE_EXHAUSTED)
внутренняя ошибка50013 (INTERNAL)
таймаут (сценарий)5044 (DEADLINE_EXCEEDED)

Известные отличия от боя

Важно

  • 47 методов живой спецификации в стенде отсутствуют — зеркало на дату снимка отстаёт.
  • Больше половины ответов собрано по схеме. У 255 методов X-APIStend-Source: schema: форма и типы из спецификации, значения выдуманы. Строковые поля демо-данных прямо содержат текст «Демо-данные песочницы APIStend».
  • Авторизация в спецификации не описана вовсе — components.securitySchemes у Ozon пустой. Пара Client-Id + Api-Key взята из профиля сервиса, а не из спеки.
  • Из запроса читается страница, но не фильтры. limit, offset и last_id двигают выдачу по каталогу; фильтры, поиск и диапазоны дат в расчёт не берутся.
  • Хост один — api-seller.ozon.ru. Методы Performance API (реклама) в каталог не входят.

Запись сохраняется

Три метода меняют то, что видит следующий запрос той же песочницы:

  • POST /v1/product/attributes/update — характеристики товара по offer_id. Название (name) этим методом не задаётся — и в бою тоже: это отдельное поле карточки, которое трогает только тяжёлый /v3/product/import (обязательны категория, тип, цена и объёмно-весовые характеристики), он не реализован. Описание — характеристика id: 4191 («Аннотация» — тот же ID, что и в примере спецификации, не выдуманный). Отвечает task_id, который сразу же обработан (status: "imported" в POST /v1/product/ import/info) — песочница не моделирует очередь.
  • POST /v1/product/import/prices — цена и старая цена по offer_id или product_id; в отличие от WB метод синхронный, результат приходит тем же ответом.
  • POST /v1/product/pictures/import — изображения по product_id; новый список полностью заменяет прежний, как и в бою.

POST /v4/product/info/attributes, POST /v5/product/info/prices и POST /v3/product/info/list отдают уже сохранённое. Изменения приватны для ключа, которым записаны, и переживают перезапуск стенда — до POST /api/ sandbox/reset.