Мок-API
Ozon Seller API
Что покрыто в моке Ozon Seller API, откуда взята спецификация и чем мок отличается от боевого API.
На этой странице · 6
Ozon Seller API — почти целиком POST-over-HTTP в RPC-стиле, с единым хостом и конвертом ошибки в стиле gRPC. Мок повторяет и то, и другое.
Откуда взята спецификация
Зеркало отстаёт от живой спецификации
На дату снимка в зеркале 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:
Известные отличия от боя
Важно
- 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.