Перейти к основному содержимому

Ozon Seller API — Полная документация

Версия документа: 1.0 Дата обновления: 10 февраля 2026 Базовый URL: https://api-seller.ozon.ru


Содержание

  1. Аутентификация
  2. Базовый URL
  3. Ограничения на запросы (Rate Limits)
  4. Обзор категорий API
  5. Детальное описание эндпоинтов
  6. Коды ошибок
  7. Webhooks (Push-уведомления)
  8. Скачать файлы спецификаций

Аутентификация

Ozon Seller API использует два HTTP-заголовка для аутентификации:

Требуемые заголовки

Имя заголовкаТипОписаниеПример
Client-IdStringИдентификатор клиента продавца123456789
Api-KeyStringAPI-ключ для аутентификацииyour-api-key-here

Формат заголовков

Все запросы к API должны включать эти заголовки:

POST /v1/product/list HTTP/1.1
Host: api-seller.ozon.ru
Client-Id: 123456789
Api-Key: your-api-key-here
Content-Type: application/json

Как получить учетные данные

Пошаговая инструкция

1. Войдите в кабинет продавца

  • Перейдите на seller.ozon.ru
  • Войдите в аккаунт с правами администратора
  • Убедитесь, что ваш аккаунт имеет право управлять API-ключами

2. Перейдите в настройки API

  • Нажмите на аватар/иконку в правом верхнем углу интерфейса
  • Выберите "Настройки" из выпадающего меню
  • Перейдите в раздел "API ключи" или "Seller API"

3. Получите Client-Id

  • Client-Id генерируется автоматически и уже отображается в интерфейсе API-ключей
  • Просто скопируйте значение Client-Id
  • Ручная генерация не требуется

4. Сгенерируйте Api-Key

  • Нажмите кнопку "Сгенерировать ключ"
  • Введите описательное имя для ключа (например, "Production System", "Integration App")
  • Выберите роль/уровень доступа для ключа:
    • Администратор — полный доступ ко всем методам API
    • Другие уровни прав с ограниченным доступом
  • Нажмите "Подтвердить" для генерации
  • ⚠️ ВАЖНО: Api-Key отображается только один раз после генерации
  • Сразу скопируйте и сохраните его в безопасном месте

Визуальный путь навигации

seller.ozon.ru

[Иконка аватара справа вверху]

Настройки (Settings)

API ключи (API Keys)

┌─────────────────────────────────┐
│ Client-Id: [Автоматически создан]│ ← Скопируйте это
└─────────────────────────────────┘

[Сгенерировать ключ] (Generate Key)

┌─────────────────────────────────┐
│ 1. Введите имя ключа │
│ 2. Выберите роль (Administrator) │
│ 3. Подтвердите │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ Api-Key: [Показан только один раз]│ ← Скопируйте СЕЙЧАС!
└─────────────────────────────────┘

Управление API-ключами

Несколько ключей

  • Вы можете создать несколько API-ключей для разных систем интеграции
  • Рекомендуемая практика: используйте отдельные ключи для:
    • Продуктивной среды
    • Среды разработки/тестирования
    • Различных сторонних интеграций

Безопасность ключей

  • ⚠️ Api-Key отображается только один раз после генерации
  • Храните ключи безопасно (используйте переменные окружения, системы управления секретами)
  • Никогда не коммитьте ключи в системы контроля версий (Git и т.д.)
  • Периодически ротируйте ключи для безопасности
  • Сразу удаляйте неиспользуемые ключи

Ролевой доступ (RBAC)

При создании API-ключа вы можете указать уровень доступа:

  • Administrator: Полный доступ ко всем методам Seller API
  • Ограниченные роли: Ограниченный доступ к конкретным категориям API

Справка: Документация по отображению ролей


Примеры использования

Python (Async)

from ozon_api import OzonAPI
import asyncio

async def main():
# Рекомендуется: использовать context manager
async with OzonAPI(
client_id="your_client_id",
api_key="your_api_key"
) as api:
# Получить список товаров
products = await api.product_list(...)
print(products)

if __name__ == "__main__":
asyncio.run(main())

Python (HTTP-клиент)

import requests

headers = {
"Client-Id": "your_client_id",
"Api-Key": "your_api_key",
"Content-Type": "application/json"
}

response = requests.post(
"https://api-seller.ozon.ru/v1/product/list",
headers=headers,
json={"page": 1, "page_size": 100}
)

TypeScript/JavaScript

import { OzonSellerAPI } from 'daytona-ozon-seller-api';

const api = new OzonSellerAPI({
clientId: 'your-client-id',
apiKey: 'your-api-key'
});

// Получить товары
const products = await api.product.getList({ limit: 10 });

// Получить FBS-заказы
const orders = await api.fbs.getOrdersList({
filter: { status: 'awaiting_packaging' }
});

cURL

curl -X POST "https://api-seller.ozon.ru/v1/product/list" \
-H "Client-Id: your_client_id" \
-H "Api-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"page_size": 100
}'

PHP

use Gam6itko\OzonSeller\Service\V1\ProductService;

$client = new GuzzleHttp\Client([
'base_uri' => 'https://api-seller.ozon.ru',
'headers' => [
'Client-Id' => 'your_client_id',
'Api-Key' => 'your_api_key',
'Content-Type' => 'application/json'
]
]);

$productService = new ProductService($client);
$products = $productService->list(['page' => 1, 'page_size' => 100]);

Go

package main

import (
"context"
"github.com/diphantxm/ozon-api-client"
)

func main() {
client := ozon_api.NewClient(
"your_client_id",
"your_api_key",
)

products, err := client.Product().List(context.Background(), ...)
if err != nil {
panic(err)
}
}

Обработка ошибок аутентификации

HTTP КодТип ошибкиОписание
400OzonAPIClientErrorНеверный формат запроса
403OzonAPIForbiddenErrorНеверные учетные данные или недостаточно прав
404OzonAPINotFoundErrorЭндпоинт не найден
409OzonAPIConflictErrorКонфликт запроса
500OzonAPIServerErrorОшибка сервера

Пример ошибки:

{
"code": 403,
"message": "Invalid Client-Id or Api-Key",
"details": "Authentication failed"
}

Конфигурация

Переменные окружения (.env):

OZON_CLIENT_ID=your_client_id
OZON_API_KEY=your_api_key
OZON_API_URL=https://api-seller.ozon.ru

Python с python-dotenv:

from dotenv import load_dotenv
import os

load_dotenv()

client_id = os.getenv("OZON_CLIENT_ID")
api_key = os.getenv("OZON_API_KEY")

Поддержка языков

API поддерживает несколько языков через заголовок Accept-Language или конфигурацию клиента:

Поддерживаемые языки:

  • DEFAULT — язык по умолчанию
  • RU — Русский
  • EN — Английский
  • TR — Турецкий
  • ZH_HANS — Китайский (упрощенный)

Пример на Python:

api = OzonAPI(client_id="...", api_key="...")
api.language = "RU" # Установить язык

Базовый URL

https://api-seller.ozon.ru

Все эндпоинты API доступны через этот базовый URL.

Пример полного URL:

https://api-seller.ozon.ru/v1/product/list

Ограничения на запросы (Rate Limits)

Глобальные ограничения

Тип ограниченияЗначениеОбласть действияДата вступления в силу
Запросов в секунду50 RPSВсе методы на один Client ID19 мая 2025

Важные детали:

  • Ограничение 50 запросов в секунду применяется ко всем методам API с одного Client ID
  • Это ограничение на уровень аккаунта, а не на эндпоинт
  • Все запросы учитываются в этом едином лимите, независимо от эндпоинта
  • Ограничение было внедрено/увеличено 19 мая 2025

Ответы при превышении лимитов

HTTP-код состояния

HTTP КодКод ошибкиСообщениеОписание
4298"You have reached request rate limit per second"Превышен лимит запросов

Формат ответа с ошибкой

{
"code": 8,
"message": "You have reached request rate limit per second",
"details": "Too many requests"
}

Специфические ограничения эндпоинтов

Управление товарами

ОперацияОграничениеПримечания
POST /v2/product/importДо 100 товаров за запросЛимит импорта пакетами
POST /v1/product/import/stocksДо 100 товаров за запросРазмер пакета обновления остатков
POST /v1/product/import/pricesДо 100 товаров за запросРазмер пакета обновления цен
Создание товаров в день60 PDP в деньProduct Detail Pages
Редактирование товаров в день300 PDP в деньProduct Detail Pages
Общий лимит PDP120 PDPМаксимальное количество товаров

Обновление складских остатков

ОперацияОграничениеПримечания
Обновление остатков (один товар/склад)Раз в 2 минутыНа один SKU на склад
Обновление доступности товаровДо 80 запросов/минутуОбщая рекомендация
POST /v2/products/stocksДо 100 товаров за запросОбновление остатков на нескольких складах

Операции с штрихкодами

ОперацияОграничениеПримечания
POST /v1/barcode/addМаксимум 100 товаров за запросПакетная привязка штрихкодов
Штрихкодов на товарМаксимум 100 штрихкодовЛимит на товар
Использование методаМаксимум 20 разЗа период времени

Аналитика и отчеты

КатегорияОграничениеПримечания
Performance API100,000 запросов в деньДля аккаунтов Ozon Performance
Генерация отчетовПо типу отчетаАсинхронная генерация с проверкой статуса

Заголовки ограничения частоты

Текущий статус: ❌ Нет стандартных заголовков

Важно: В отличие от многих других API (Amazon, GitHub и т.д.), Ozon Seller API не предоставляет стандартные заголовки ограничения частоты в ответах API.

Отсутствующие заголовки:

  • Нет заголовка X-RateLimit-Limit
  • Нет заголовка X-RateLimit-Remaining
  • Нет заголовка X-RateLimit-Reset
  • Нет заголовка retry-after в ответах 429

Следствия:

  • Нельзя проактивно мониторить оставшуюся квоту
  • Необходимо реализовать ограничение частоты на стороне клиента
  • Необходимо реактивно обрабатывать ошибки 429

Лучшие практики обработки ограничений

1. Ограничение частоты на стороне клиента

Рекомендуемый подход:

import time
from collections import deque
from threading import Lock

class RateLimiter:
def __init__(self, max_requests=50, time_window=1.0):
self.max_requests = max_requests
self.time_window = time_window # секунды
self.requests = deque()
self.lock = Lock()

def wait_if_needed(self):
with self.lock:
now = time.time()
# Удалить старые запросы за пределами временного окна
while self.requests and self.requests[0] <= now - self.time_window:
self.requests.popleft()

# Если достигнут лимит, подождать
if len(self.requests) >= self.max_requests:
sleep_time = self.time_window - (now - self.requests[0])
if sleep_time > 0:
time.sleep(sleep_time)
# Очистить старые запросы после ожидания
now = time.time()
while self.requests and self.requests[0] <= now - self.time_window:
self.requests.popleft()

# Добавить текущий запрос
self.requests.append(now)

# Использование
rate_limiter = RateLimiter(max_requests=50, time_window=1.0)

def make_api_request(url, headers, data):
rate_limiter.wait_if_needed()
response = requests.post(url, headers=headers, json=data)
# Обработать ответ...

2. Логика повторных попыток с экспоненциальной задержкой

import time
import random

def make_request_with_retry(url, headers, data, max_retries=5):
for attempt in range(max_retries):
rate_limiter.wait_if_needed()
response = requests.post(url, headers=headers, json=data)

if response.status_code == 429:
# Превышен лимит - экспоненциальная задержка
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"Превышен лимит. Ожидание {wait_time:.2f}с...")
time.sleep(wait_time)
continue

elif response.status_code >= 500:
# Ошибка сервера - повторная попытка с задержкой
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"Ошибка сервера {response.status_code}. Повтор через {wait_time:.2f}с...")
time.sleep(wait_time)
continue

else:
# Успех или другая ошибка - вернуть как есть
return response

raise Exception(f"Превышено максимальное количество попыток: {max_retries}")

3. Пакетирование запросов

Оптимизируйте запросы с помощью пакетирования:

# Вместо множественных отдельных вызовов:
for product in products:
update_stock(product['sku'], product['stock']) # ❌ Неэффективно

# Используйте пакетные операции:
batch_size = 100
for i in range(0, len(products), batch_size):
batch = products[i:i+batch_size]
update_stocks_batch(batch) # ✅ Эффективно

4. Асинхронная обработка запросов

import asyncio
import aiohttp

async def fetch_with_rate_limit(session, url, headers, data, semaphore):
async with semaphore: # Ограничить параллельные запросы
async with session.post(url, headers=headers, json=data) as response:
return await response.json()

async def bulk_request(items, max_concurrent=10):
semaphore = asyncio.Semaphore(max_concurrent)
async with aiohttp.ClientSession() as session:
tasks = [
fetch_with_rate_limit(session, url, headers, item, semaphore)
for item in items
]
return await asyncio.gather(*tasks)

Мониторинг ограничений частоты

Ведение журнала

import logging
from datetime import datetime

class APIRequestLogger:
def __init__(self):
self.request_count = 0
self.rate_limit_hits = 0
self.logger = logging.getLogger('ozon_api')

def log_request(self, url, status_code, response_time):
self.request_count += 1

if status_code == 429:
self.rate_limit_hits += 1

self.logger.info(
f"[{datetime.now().isoformat()}] "
f"Запрос #{self.request_count} | "
f"Статус: {status_code} | "
f"Время: {response_time:.3f}с | "
f"URL: {url}"
)

if status_code == 429:
self.logger.warning(
f"Превышен лимит! Всего попаданий: {self.rate_limit_hits}"
)

Метрики для отслеживания

  1. Всего запросов в секунду — Мониторинг RPS в реальном времени
  2. Процент попаданий в лимит — Процент запросов с кодом 429
  3. Среднее время ответа — Обнаружение ухудшения производительности
  4. Пиковые часы использования — Идентификация периодов высокого трафика
  5. Использование по эндпоинтам — Наиболее часто вызываемые эндпоинты

Распределение ограничений по категориям API

Товары

  • Общие операции: Подчинены глобальному ограничению 50 RPS
  • Пакетные операции: Максимум 100 элементов за запрос
  • Создание товаров: 60 PDP в день
  • Редактирование товаров: 300 PDP в день

Заказы

  • Получение списка заказов: Подчинено глобальному ограничению 50 RPS
  • Обновление статуса заказа: Рекомендуется пакетировать запросы
  • Операции FBO/FBS: Специфических ограничений нет, кроме глобальных

Финансы

  • Списки транзакций: Подчинены глобальному ограничению 50 RPS
  • Финансовые отчеты: Асинхронная генерация, без синхронных ограничений

Аналитика

  • Получение данных: Подчинено глобальному ограничению 50 RPS
  • Performance API: 100,000 запросов в день (специальные аккаунты)

Склад и Цены

  • Обновление остатков: Рекомендуется 80 запросов/минуту
  • Обновление одного SKU: Раз в 2 минуты на склад
  • Пакетные обновления: До 100 товаров за запрос

Рекомендации по интеграции

1. Не выходите за пределы лимита

  • Целевая нагрузка 40-45 RPS вместо полных 50 RPS
  • Учитывайте сетевые задержки и повторы
  • Создайте буфер для неожиданных скачков

2. Реализуйте плавную деградацию

  • Ставьте запросы в очередь при достижении лимита
  • Обрабатывайте queued запросы в непиковые часы
  • Предоставляйте пользователю информацию о задержках

3. Мониторинг и оповещения

  • Настройте оповещения о высоком проценте попаданий в лимит
  • Отслеживайте метрики RPS в дашбордах
  • Регулярно просматривайте журналы

4. Оптимизация шаблонов запросов

  • Используйте пакетные операции где возможно
  • Кэшируйте часто используемые данные
  • Приоритизируйте критические операции

5. Планирование роста

  • Проектируйте для горизонтального масштабирования
  • Используйте пулы соединений
  • Реализуйте очереди приоритетов запросов

Резюме по ограничениям

Ключевые моменты:

  • Глобальный лимит: 50 запросов в секунду на Client ID (с 19 мая 2025)
  • Ошибка: HTTP 429 с кодом ошибки 8
  • Нет заголовков лимита: Необходимо реализовать ограничение на стороне клиента
  • Специфические лимиты: Различные ограничения для обновления остатков, создания товаров и т.д.
  • Пакетные операции: Используйте пакетирование для минимизации количества запросов
  • Стратегия повтора: Реализуйте экспоненциальную задержку для ошибок 429
  • Мониторинг: Ведите журналы запросов и отслеживайте попадания в лимит

Обзор категорий API

Ozon Seller API предоставляет 247 эндпоинтов в 22 категориях, охватывающих все аспекты управления продажами на маркетплейсе.

Основные категории

КатегорияЭндпоинтовОписание
Товары (Products)21Управление товарами: создание, обновление, архивация, изображения, характеристики, цифровые товары
Заказы (Orders)68Управление заказами по всем моделям fulfilment: FBO, FBS, rFBS. Отслеживание статусов, отмена, этикетки
FBO/FBS Исполнение81Специализированные операции fulfilment: поставки на склад, интервалы отгрузки, документы, маркировка
Финансы (Finance)7Финансовые операции: транзакции, отчеты о реализации, взаиморасчеты, B2B продажи
Аналитика (Analytics)4Бизнес-аналитика: отчеты по остаткам, оборачиваемость, управление запасами
Цены и Склад (Prices & Stocks)20Управление ценами и остатками: обновление цен, управление скидками, автоматические стратегии ценообразования
Возвраты и Акции (Returns & Promotions)31Управление возвратами (18) и промо-акциями (13): заявки на возврат, скидки, Hot Sales

Дополнительные категории

КатегорияЭндпоинтовОписание
Категории (Categories)4Дерево категорий товаров, характеристики, справочники значений атрибутов
Штрихкоды (Barcodes)2Генерация и привязка штрихкодов к товарам
Бренды (Brands)1Сертификация брендов
Сертификация (Certification)15Управление сертификацией товаров (самая большая дополнительная категория)
Чаты (Chats)6Обмен сообщениями с поддержкой Ozon
Грузы (Cargoes)10Управление грузоперевозками и перевозками
Пропуска (Passes)7Пропуска для водителей и транспорта на склады
Полигоны (Polygons)2Управление зонами доставки
Вопросы и ответы (Q&A)7Вопросы покупателей о товарах и ответы на них
Отзывы (Reviews)7Управление отзывами на товары
Рейтинг продавца (Seller Rating)2Метрики качества продаж и производительности
Поставщики/Счета (Supplier/Invoices)4B2B операции, управление счетами
Склады (Warehouses)2Информация о складах Ozon
Quants6Операции с количеством товаров
Отчеты (Reports)8Генерация различных типов отчетов

Статистика по категориям

ПоказательЗначение
Всего категорий22
Всего эндпоинтов247
Крупнейшая категорияFBO/FBS Исполнение (81)
Основные бизнес-категории7 (208 эндпоинтов)
Дополнительные категории15 (39 эндпоинтов)
Самый используемый HTTP методPOST (97%+)

Модели fulfilment

Ozon использует три модели исполнения заказов, каждая со специализированным набором эндпоинтов:

МодельОписаниеКоличество эндпоинтов
FBOFulfillment by Ozon — Ozon хранит, упаковывает и отправляет товары~22 эндпоинта
FBSFulfillment by Seller — Продавец хранит и отправляет на склад Ozon~35 эндпоинтов
rFBSrealized FBS — Продавец хранит и отправляет напрямую покупателям~12 эндпоинтов

Детальное описание эндпоинтов

Ниже представлены подробные таблицы эндпоинтов для всех категорий Ozon Seller API.


1. Товары (Products) — 21 эндпоинт

Управление товарами: создание, обновление, архивация, изображения, характеристики, цифровые товары.

#МетодПутьОписание
1POST/v2/products/deleteУдалить товар без SKU из архива
2POST/v1/product/import/infoУзнать статус добавления товара
3POST/v4/product/info/attributesПолучить описание характеристик товара
4POST/v1/product/info/descriptionПолучить описание товара
5POST/v3/product/info/listПолучить информацию о товарах по идентификаторам
6POST/v1/product/info/subscriptionКоличество подписавшихся на товар пользователей
7POST/v2/product/infoИнформация о товарах
8POST/v3/product/listСписок товаров
9POST/v1/product/rating-by-skuПолучить контент-рейтинг товаров по SKU
10POST/v4/product/info/limitЛимиты на ассортимент, создание и обновление товаров
11POST/v1/product/import-by-skuСоздать товар по SKU
12POST/v3/product/importСоздать или обновить товар
13POST/v1/product/archiveПеренести товар в архив
14POST/v1/product/related-sku/getПолучить связанные SKU
15POST/v1/product/pictures/importЗагрузить или обновить изображения товара
16POST/v2/product/pictures/infoПолучить изображения товаров
17POST/v1/product/unarchiveВернуть товар из архива
18POST/v1/product/attributes/updateОбновить характеристики товара
19POST/v1/product/update/offer-idИзменить артикулы товаров из системы продавца
20POST/v1/product/upload_digital_codesЗагрузить коды активации для услуг и цифровых товаров
21POST/v1/product/upload_digital_codes/infoСтатус загрузки кодов активации

Группировка по функциям:

  • Получение информации (7): list, info, info/list, info/attributes, info/description, rating-by-sku, info/subscription
  • Создание и обновление (3): import, import-by-sku, attributes/update
  • Изображения (2): pictures/import, pictures/info
  • Архив (3): archive, unarchive, delete
  • Идентификаторы (2): update/offer-id, related-sku/get
  • Цифровые товары (2): upload_digital_codes, upload_digital_codes/info
  • Статус и лимиты (2): import/info, info/limit

2. Заказы (Orders) — 68 эндпоинтов

Управление заказами по всем моделям fulfilment: FBO, FBS, rFBS. Отслеживание статусов, отмена, этикетки.

2.1 FBO Заказы (7 эндпоинтов)

#МетодПутьОписание
1POST/v2/posting/fbo/getИнформация об отправлении FBO
2POST/v2/posting/fbo/listСписок отправлений FBO
3POST/v1/posting/fbo/cancel-reason/listПричины отмены отправлений по схеме FBO
4GET/v1/supplier/available_warehousesЗагруженность складов Ozon
5POST/v1/supply-order/timeslot/statusСтатус интервала поставки
6POST/v1/supply-order/timeslot/getИнтервалы поставки
7POST/v2/supply-order/listСписок заявок на поставку на склад Ozon

2.2 Управление поставками FBO (6 эндпоинтов)

#МетодПутьОписание
8POST/v2/supply-order/getИнформация о заявке на поставку
9POST/v1/supply-order/pass/createУказать данные о водителе и автомобиле
10POST/v1/supply-order/pass/statusСтатус ввода данных о водителе и автомобиле
11POST/v1/supply-order/status/counterКоличество заявок по статусам
12POST/v1/supply-order/timeslot/updateОбновить интервал поставки
13POST/v1/supply-order/bundleСостав поставки или заявки на поставку

2.3 FBS Заказы — Основные операции (20 эндпоинтов)

#МетодПутьОписание
14POST/v2/posting/fbs/cancelОтменить отправление
15POST/v2/posting/fbs/product/cancelОтменить отправку некоторых товаров в отправлении
16POST/v2/posting/fbs/product/changeДобавить вес для весовых товаров в отправлении
17POST/v1/posting/fbs/package-label/createСоздать задание на выгрузку этикеток
18POST/v2/posting/fbs/package-label/createСоздать задание на формирование этикеток (v2)
19POST/v1/posting/global/etgbТаможенные декларации ETGB
20POST/v2/posting/fbs/get-by-barcodeПолучить информацию об отправлении по штрихкоду
21POST/v3/posting/fbs/listСписок отправлений (версия 3)
22POST/v3/posting/fbs/unfulfilled/listСписок необработанных отправлений (версия 3)
23POST/v3/posting/fbs/getПолучить информацию об отправлении по идентификатору
24POST/v1/posting/fbs/package-label/getПолучить файл с этикетками
25POST/v2/posting/fbs/cancel-reason/listПричины отмены отправлений
26POST/v1/posting/fbs/cancel-reasonПричины отмены отправления (v1)
27POST/v1/posting/fbs/restrictionsПолучить ограничения пункта приёма
28POST/v2/posting/fbs/product/country/listСписок доступных стран-изготовителей
29POST/v2/posting/fbs/arbitrationОткрыть спор по отправлению
30POST/v2/posting/fbs/awaiting-deliveryПередать отправление к отгрузке
31POST/v2/posting/fbs/package-labelНапечатать этикетку
32POST/v1/posting/fbs/pick-up-code/verifyПроверить код курьера
33POST/v3/posting/multiboxqty/setУказать количество коробок для многокоробочных отправлений
34POST/v2/posting/fbs/product/country/setДобавить информацию о стране-изготовителе товара
35POST/v1/posting/unpaid-legal/product/listСписок неоплаченных товаров, заказанных юридическими лицами

2.4 Управление доставкой FBS (12 эндпоинтов)

#МетодПутьОписание
36POST/v1/carriage/getИнформация о перевозке
37POST/v1/posting/fbs/splitРазделить заказ на отправления без сборки
38POST/v2/posting/fbs/act/get-postingsСписок отправлений в акте
39POST/v2/posting/fbs/act/listСписок актов по отгрузкам
40POST/v1/posting/carriage-available/listСписок доступных перевозок
41POST/v2/posting/fbs/act/check-statusСтатус отгрузки и документов
42POST/v2/posting/fbs/act/createПодтвердить отгрузку и создать документы
43POST/v2/posting/fbs/act/get-container-labelsЭтикетки для грузового места
44POST/v2/posting/fbs/digital/act/check-statusСтатус формирования накладной
45POST/v2/posting/fbs/act/get-pdfПолучить PDF c документами
46POST/v2/posting/fbs/act/get-barcodeШтрихкод для отгрузки отправления
47POST/v2/posting/fbs/act/get-barcode/textЗначение штрихкода для отгрузки отправления

2.5 Статусы доставки rFBS (7 эндпоинтов)

#МетодПутьОписание
48POST/v2/fbs/posting/deliveredИзменить статус на «Доставлено»
49POST/v2/fbs/posting/deliveringИзменить статус на «Доставляется»
50POST/v2/fbs/posting/last-mileИзменить статус на «Последняя миля»
51POST/v2/fbs/posting/sent-by-sellerИзменить статус на «Отправлено продавцом»
52POST/v2/fbs/posting/tracking-number/setДобавить трек-номера
53POST/v1/posting/fbs/timeslot/change-restrictionsДоступные даты для переноса доставки
54POST/v1/posting/cutoff/setУточнить дату отгрузки отправления
55POST/v1/posting/fbs/timeslot/setПеренести дату доставки

2.6 Отмена rFBS (4 эндпоинта)

#МетодПутьОписание
56POST/v1/conditional-cancellation/approveПодтвердить заявку на отмену rFBS
57POST/v1/conditional-cancellation/rejectОтклонить заявку на отмену rFBS
58POST/v1/conditional-cancellation/getПолучить информацию о заявке на отмену rFBS
59POST/v1/conditional-cancellation/listПолучить список заявок на отмену rFBS

2.7 Управление маркировкой товаров (10 эндпоинтов)

#МетодПутьОписание
60POST/v5/fbs/posting/product/exemplar/create-or-getПолучить данные созданных экземпляров
61POST/v5/fbs/posting/product/exemplar/setПроверить и сохранить данные экземпляров (v5)
62POST/v4/fbs/posting/product/exemplar/validateВалидация кодов маркировки
63POST/v4/fbs/posting/product/exemplar/statusПолучить статус добавления экземпляров
64POST/v4/fbs/posting/product/exemplar/setПроверить и сохранить данные экземпляров
65POST/v4/posting/fbs/ship/packageЧастичная сборка отправления (v4)
66POST/v4/posting/fbs/shipСобрать заказ (v4)
67POST/v6/fbs/posting/product/exemplar/create-or-getПолучить данные созданных экземпляров (v6)
68POST/v6/fbs/posting/product/exemplar/setПроверить и сохранить данные экземпляров (v6)
69POST/v5/fbs/posting/product/exemplar/statusПолучить статус добавления экземпляров (v5)
70POST/v5/fbs/posting/product/exemplar/validateВалидация кодов маркировки (v5)
71POST/v1/fbs/posting/product/exemplar/updateОбновить данные экземпляров

Примечание: Маркировка товаров поддерживает несколько версий API (v4, v5, v6) для различных операций.


3. FBO/FBS Исполнение — 81 эндпоинт

Специализированные операции fulfilment: поставки на склад, интервалы отгрузки, документы, маркировка.

Подробные таблицы эндпоинтов FBO/FBS приведены в разделе «Заказы» выше, так как эти категории тесно связаны.

Распределение по моделям исполнения:

  • FBO (Ozon Fulfillment): 22 эндпоинта — заказы + управление поставками
  • FBS (Seller Fulfillment): 35 эндпоинтов — жизненный цикл заказа + доставка + документы
  • rFBS (Direct Fulfillment): 12 эндпоинтов — статусы + условная отмена
  • Маркировка товаров: 12 эндпоинтов (v4, v5, v6)

4. Финансы (Finance) — 7 эндпоинтов

Финансовые операции: транзакции, отчеты о реализации, взаиморасчеты, B2B продажи.

#МетодПутьОписание
1POST/v3/finance/transaction/listСписок транзакций
2POST/v3/finance/transaction/totalsСуммы транзакций
3POST/v1/finance/realizationОтчёт о реализации товаров
4POST/v2/finance/realizationОтчёт о реализации товаров (версия 2)
5POST/v1/finance/cash-flow-statement/listФинансовый отчёт
6POST/v1/finance/document-b2b-salesРеестр продаж юридическим лицам
7POST/v1/finance/mutual-settlementОтчёт о взаиморасчётах

Группировка по функциям:

  • Управление транзакциями (2): transaction/list, transaction/totals
  • Отчеты о реализации (2): realization (v1, v2)
  • Финансовые отчеты (1): cash-flow-statement/list
  • B2B операции (1): document-b2b-sales
  • Взаиморасчеты (1): mutual-settlement

5. Аналитика (Analytics) — 4 эндпоинта

Бизнес-аналитика: отчеты по остаткам, оборачиваемость, управление запасами.

#МетодПутьОписание
1POST/v1/analytics/dataДанные аналитики
2POST/v2/analytics/stock_on_warehousesОтчёт по остаткам и товарам
3POST/v1/analytics/turnover/stocksОборачиваемость товара
4POST/v1/analytics/manage/stocksУправление остатками (Beta)

Группировка по функциям:

  • Общая аналитика (1): analytics/data
  • Отчеты по складам (1): stock_on_warehouses (v2)
  • Оборачиваемость (1): turnover/stocks
  • Управление запасами (1): manage/stocks (Beta)

6. Цены и Склад (Prices & Stocks) — 20 эндпоинтов

Управление ценами и остатками: обновление цен, управление скидками, автоматические стратегии ценообразования.

6.1 Управление ценами и остатками (8 эндпоинтов)

#МетодПутьОписание
1POST/v5/product/info/pricesПолучить информацию о цене товара
2POST/v1/product/import/pricesОбновить цену
3POST/v4/product/info/stocksИнформация о количестве товаров
4POST/v1/product/import/stocksОбновить остатки
5POST/v1/product/info/stocks-by-warehouse/fbsИнформация об остатках на складах продавца (FBS и rFBS)
6POST/v2/products/stocksОбновить количество товаров на складах
7POST/v1/product/info/discountedУзнать информацию об уценке и основном товаре по SKU уценённого товара
8POST/v1/product/update/discountУстановить скидку на уценённый товар

6.2 Стратегии ценообразования (13 эндпоинтов)

#МетодПутьОписание
9POST/v1/pricing-strategy/competitors/listСписок конкурентов
10POST/v1/pricing-strategy/createСоздать стратегию
11POST/v1/pricing-strategy/deleteУдалить стратегию
12POST/v1/pricing-strategy/strategy-ids-by-product-idsСписок идентификаторов стратегий
13POST/v1/pricing-strategy/infoИнформация о стратегии
14POST/v1/pricing-strategy/products/addДобавить товары в стратегию
15POST/v1/pricing-strategy/products/deleteУдалить товары из стратегии
16POST/v1/pricing-strategy/product/infoЦена товара у конкурента
17POST/v1/pricing-strategy/products/listСписок товаров в стратегии
18POST/v1/pricing-strategy/listСписок стратегий
19POST/v1/pricing-strategy/statusИзменить статус стратегии
20POST/v1/pricing-strategy/updateОбновить стратегию

Группировка по функциям:

  • Информация о ценах и обновление (3): info/prices, import/prices, info/discounted
  • Информация об остатках и обновление (4): info/stocks, import/stocks, products/stocks, stocks-by-warehouse/fbs
  • Управление скидками (2): info/discounted, update/discount
  • CRUD стратегий (4): create, info, update, delete
  • Управление товарами в стратегиях (3): products/add, products/delete, products/list
  • Конкуренты и анализ (2): competitors/list, product/info
  • Управление стратегиями (2): list, status

7. Возвраты и Акции (Returns & Promotions) — 31 эндпоинт

Управление возвратами (18) и промо-акциями (13): заявки на возврат, скидки, Hot Sales.

7.1 Возвраты (18 эндпоинтов)

rFBS Управление возвратами (7 эндпоинтов):

#МетодПутьОписание
1POST/v2/returns/rfbs/listСписок заявок на возврат
2POST/v2/returns/rfbs/getИнформация о заявке на возврат
3POST/v2/returns/rfbs/return-moneyВернуть деньги покупателю
4POST/v2/returns/rfbs/rejectОтклонить заявку на возврат
5POST/v2/returns/rfbs/verifyОдобрить заявку на возврат
6POST/v2/returns/rfbs/compensateВернуть часть стоимости товара
7POST/v2/returns/rfbs/receive-returnПодтвердить получение товара на проверку

Операции с возвратными отгрузками (7 эндпоинтов):

#МетодПутьОписание
8POST/v1/return/giveout/listСписок возвратных отгрузок
9POST/v1/return/giveout/infoИнформация о возвратной отгрузке
10POST/v1/return/giveout/is-enabledПроверить возможность получения возвратных отгрузок по штрихкоду
11POST/v1/return/giveout/barcodeЗначение штрихкода для возвратных отгрузок
12POST/v1/return/giveout/get-pdfШтрихкод для получения возвратной отгрузки в формате PDF
13POST/v1/return/giveout/get-pngШтрихкод для получения возвратной отгрузки в формате PNG
14POST/v1/return/giveout/barcode-resetСгенерировать новый штрихкод

Общая информация о возвратах (2 эндпоинта):

#МетодПутьОписание
15POST/v1/returns/listИнформация о возвратах FBO и FBS
16POST/v1/returns/company/fbs/infoКоличество возвратов FBS

7.2 Акции (13 эндпоинтов)

Общие акции (5 эндпоинтов):

#МетодПутьОписание
17GET/v1/actionsСписок акций
18POST/v1/actions/candidatesСписок доступных для акции товаров
19POST/v1/actions/productsСписок участвующих в акции товаров
20POST/v1/actions/products/activateДобавить товар в акцию
21POST/v1/actions/products/deactivateУдалить товары из акции

Управление заявками на скидки (3 эндпоинта):

#МетодПутьОписание
22POST/v1/actions/discounts-task/listСписок заявок на скидку
23POST/v1/actions/discounts-task/approveСогласовать заявку на скидку
24POST/v1/actions/discounts-task/declineОтклонить заявку на скидку

Акции Hot Sale (5 эндпоинтов):

#МетодПутьОписание
25POST/v1/actions/hotsales/listСписок доступных акций Hot Sale
26POST/v1/actions/hotsales/productsСписок товаров, которые участвуют в акции Hot Sale
27POST/v1/actions/hotsales/activateДобавить товары в акцию Hot Sale
28POST/v1/actions/hotsales/deactivateУдалить товары из акции Hot Sale

8. Дополнительные категории

Категории (Categories) — 4 эндпоинта

Дерево категорий товаров, характеристики, справочники значений атрибутов.

Штрихкоды (Barcodes) — 2 эндпоинта

Генерация и привязка штрихкодов к товарам.

Бренды (Brands) — 1 эндпоинт

Сертификация брендов.

Сертификация (Certification) — 15 эндпоинтов

Управление сертификацией товаров (самая большая дополнительная категория, отражает требования российского законодательства).

Чаты (Chats) — 6 эндпоинтов

Обмен сообщениями с поддержкой Ozon.

Грузы (Cargoes) — 10 эндпоинтов

Управление грузоперевозками и перевозками.

Пропуска (Passes) — 7 эндпоинтов

Пропуска для водителей и транспорта на склады.

Полигоны (Polygons) — 2 эндпоинта

Управление зонами доставки.

Вопросы и ответы (Q&A) — 7 эндпоинтов

Вопросы покупателей о товарах и ответы на них.

Отзывы (Reviews) — 7 эндпоинтов

Управление отзывами на товары.

Рейтинг продавца (Seller Rating) — 2 эндпоинта

Метрики качества продаж и производительности.

Поставщики/Счета (Supplier/Invoices) — 4 эндпоинта

B2B операции, управление счетами.

Склады (Warehouses) — 2 эндпоинта

Информация о складах Ozon.

Quants — 6 эндпоинтов

Операции с количеством товаров.

Отчеты (Reports) — 8 эндпоинтов

Генерация различных типов отчетов.


Примечания к эндпоинтам

Версии API

Ozon Seller API активно развивается, и многие эндпоинты доступны в нескольких версиях:

  • v1: Базовые стабильные эндпоинты
  • v2: Улучшенные версии с расширенным функционалом
  • v3-v6: Последние версии для специализированных операций

Рекомендации:

  • Используйте последние версии API (v2, v3, v4, v5, v6) для новых интеграций
  • v1 поддерживается для обратной совместимости

HTTP Методы

Подавляющее большинство эндпоинтов (97%+) используют метод POST, что соответствует паттерну дизайна Ozon API для сложных запросов и операций.

Модели исполнения

Ozon использует три модели исполнения заказов, каждая со специализированным набором эндпоинтов:

  • FBO: Ozon хранит, упаковывает и отправляет товары (~22 эндпоинта)
  • FBS: Продавец хранит и отправляет на склад Ozon (~35 эндпоинтов)
  • rFBS: Продавец хранит и отправляет напрямую покупателям (~12 эндпоинтов)

Специфичные для России функции

Некоторые категории эндпоинтов специфичны для российского рынка:

  • Маркировка товаров (Chestny Znak): 12 эндпоинтов для работы с системой «Честный ЗНАК»
  • Сертификация: 15 эндпоинтов для управления сертификатами соответствия


Коды ошибок

Ozon Seller API использует комбинированную систему кодов ошибок, включающую:

  • HTTP статусы — основные коды состояния HTTP
  • Числовые коды ошибок Ozon — специфические коды ошибок платформы
  • Строковые коды ошибок — описательные коды для конкретных сценариев

HTTP Статус коды

400 Bad Request — Ошибка клиента

Python исключение: OzonAPIClientError

Описание: Неверный формат запроса, невалидные данные или параметры.

Частые причины:

  • Неверный JSON формат в теле запроса
  • Отсутствие обязательных полей
  • Неверные значения параметров
  • Нарушение валидации данных

Пример ответа:

{
"code": 400,
"message": "Bad Request",
"details": [
{
"field": "price",
"message": "Ставка не входит в диапазон допустимых значений"
}
]
}

403 Forbidden — Ошибка доступа

Python исключение: OzonAPIForbiddenError

Описание: Доступ запрещён или недостаточно прав.

Частые причины:

  • Offer not signed — в личном кабинете продавца отсутствует подписанная офферта
  • Обращение к методу, недоступному в текущей роли
  • Недостаточно прав для выполнения операции

Пример ответа:

{
"code": 403,
"message": "Forbidden",
"details": "Offer not signed"
}

404 Not Found — Ресурс не найден

Python исключение: OzonAPINotFoundError

Описание: Запрашиваемый ресурс не существует или недоступен.

Частые причины:

  • Invalid Api-Key — неверный API ключ
  • Несуществующий endpoint URL
  • Удалённый ресурс (товар, заказ и т.д.)

Пример ответа:

{
"code": 404,
"message": "Not Found",
"details": "Invalid Api-Key, please contact support"
}

409 Conflict — Конфликт

Python исключение: OzonAPIConflictError

Описание: Конфликт состояния ресурса с выполняемой операцией.

Частые причины:

  • Попытка создать уже существующий ресурс
  • Конфликт версий при обновлении
  • Нарушение бизнес-логики

Пример ответа:

{
"code": 409,
"message": "Conflict",
"details": "Product already exists"
}

429 Too Many Requests — Превышение лимита запросов

Числовой код ошибки Ozon: 8

Описание: Превышен лимит частоты запросов.

Глобальные лимиты (на 19 мая 2025):

  • 50 запросов в секунду на Client ID

Пример ответа:

{
"code": 8,
"message": "Too many requests",
"details": "Rate limit exceeded. Please retry later."
}

500 Internal Server Error — Ошибка сервера

Python исключение: OzonAPIServerError

Описание: Внутренняя ошибка сервера Ozon.

Частые причины:

  • Временные сбои на стороне Ozon
  • Ошибка в обработке запроса
  • Проблемы с инфраструктурой

Рекомендация: Повторить запрос через некоторое время.

Пример ответа:

{
"code": 500,
"message": "Internal Server Error",
"details": "An unexpected error occurred. Please try again later."
}

Специфические коды ошибок Ozon

"Circle is open" — Блокировка метода

Описание: Система блокирует работу метода на несколько минут при выполнении слишком большого количества запросов.

Тип ошибки: Rate limiting / Request throttling

Причина: Превышение порога частоты запросов

Длительность блокировки: Несколько минут

Решение:

  1. Реализовать rate limiting на стороне клиента
  2. Использовать экспоненциальную задержку (exponential backoff)
  3. Оптимизировать код для уменьшения количества запросов
  4. Мониторить частоту запросов

Строковые коды ошибок

Ошибки API ключей (обновлено февраль 2025)

  • INVALID_API_KEY — Неверный API ключ
  • API_KEY_DISABLED — API ключ отключён
  • API_KEY_EXPIRED — Срок действия API ключа истёк

Ошибки товаров и цен

  • PRICE_IS_NOT_SENT — товар ещё не создан или находится на стадии обновления
  • MP_DELIVERY_ONLY_3PL_ERROR — товар нельзя размещать на складе с методом доставки «Ozon»
  • PRODUCT_NOT_FOUND — товар не найден
  • INVALID_PRODUCT_ID — неверный ID товара

Ошибки атрибутов товаров

  • MISSING_REQUIRED_ATTRIBUTE — отсутствует обязательный атрибут
  • INVALID_ATTRIBUTE_VALUE — неверное значение атрибута
  • TYPE_ID_REQUIRED — не указан тег type_id

Ошибки категорий

  • INVALID_CATEGORY_ID — неверная категория
  • CATEGORY_NOT_FOUND — категория не найдена

Структура ошибок в ответах API

Базовая структура ошибки

{
"code": <числовой_код>,
"message": "<текст_ошибки>",
"details": [<дополнительная_информация>]
}

Пример полной структуры ошибки

{
"code": 5,
"message": "Validation error",
"details": [
{
"code": "MISSING_REQUIRED_FIELD",
"field": "barcode",
"message": "Поле 'barcode' обязательно для заполнения"
},
{
"code": "INVALID_VALUE",
"field": "price",
"message": "Цена должна быть больше 0"
}
]
}

Обработка ошибок

Python (с библиотекой ozon-api)

from ozon_api import OzonAPIError, OzonAPIClientError, OzonAPIForbiddenError
from ozon_api import OzonAPINotFoundError, OzonAPIConflictError, OzonAPIServerError

try:
response = await api.product_list(request)
except OzonAPIClientError as e:
print(f"Ошибка клиента (400): {e.message}")
except OzonAPIForbiddenError as e:
print(f"Ошибка доступа (403): {e.message}")
print("Проверьте подписанную офферт в личном кабинете")
except OzonAPINotFoundError as e:
print(f"Ресурс не найден (404): {e.message}")
print("Проверьте API ключ")
except OzonAPIConflictError as e:
print(f"Конфликт (409): {e.message}")
except OzonAPIServerError as e:
print(f"Ошибка сервера (500): {e.message}")
print("Повторите запрос позже")
except OzonAPIError as e:
print(f"Общая ошибка API: {e.message}")

Обработка rate limiting (429)

import asyncio
from asyncio import sleep

async def call_with_retry(api_call, max_retries=5):
for attempt in range(max_retries):
try:
return await api_call()
except Exception as e:
if e.code == 8 or e.status == 429: # Rate limit
wait_time = 2 ** attempt # Экспоненциальная задержка
print(f"Rate limit exceeded. Waiting {wait_time}s...")
await sleep(wait_time)
else:
raise e
raise Exception("Max retries exceeded")

Go (с библиотекой ozon-api-client)

package main

import (
"fmt"
"github.com/diphantxm/ozon-api-client/ozon"
)

func handleError(err error) {
if ozonErr, ok := err.(*ozon.Error); ok {
switch ozonErr.StatusCode {
case 400:
fmt.Printf("Client Error: %s\n", ozonErr.Message)
case 403:
fmt.Printf("Forbidden: %s\n", ozonErr.Message)
case 404:
fmt.Printf("Not Found: %s\n", ozonErr.Message)
case 429:
fmt.Printf("Rate Limit: %s\n", ozonErr.Message)
case 500:
fmt.Printf("Server Error: %s\n", ozonErr.Message)
default:
fmt.Printf("Unknown Error: %s\n", ozonErr.Message)
}
}
}

Стратегии обработки ошибок

1. Retry Logic (Повторные попытки)

Применимо для:

  • HTTP 429 (Too Many Requests)
  • HTTP 500 (Internal Server Error)
  • Временных сетевых ошибок

Стратегия:

  • Экспоненциальная задержка (exponential backoff)
  • Максимум 3-5 попыток
  • Увеличение времени ожидания между попытками

2. Логирование ошибок

Рекомендации:

  • Логировать все ошибки с контекстом
  • Сохранять request ID для трассировки
  • Записывать параметры запроса (без чувствительных данных)
  • Фиксировать timestamp для анализа

3. Мониторинг

Метрики для отслеживания:

  • Частота ошибок по типам
  • Время ответа
  • Процент неудачных запросов
  • Количество retry операций

4. Обработка специфических ошибок

Invalid Api-Key (404):

  • Проверить корректность API ключа
  • Убедиться, что ключ не отозван
  • Проверить права доступа роли

Offer not signed (403):

  • Подписать оферту в личном кабинете
  • Проверить роль пользователя

"Circle is open":

  • Уменьшить частоту запросов
  • Реализовать пакетную обработку
  • Добавить задержки между запросами

Лучшие практики

  1. Rate Limiting на стороне клиента — реализовать ограничение частоты запросов
  2. Пакетная обработка — использовать пакетные запросы вместо множества одиночных
  3. Асинхронная обработка — использовать асинхронные библиотеки для эффективности
  4. Circuit Breaker Pattern — прекратить запросы при постоянных ошибках
  5. Логирование — сохранять подробную информацию об ошибках
  6. Мониторинг — отслеживать метрики ошибок

Полезные ресурсы


Webhooks (Push-уведомления)

Ozon Seller API использует механизм push-уведомлений (webhooks) для отправки реальных событий на ваш сервер. Это позволяет вашей системе мгновенно реагировать на изменения в заказах, товарах, сообщениях и других сущностях маркетплейса.

Официальная документация: https://docs.ozon.ru/api/seller/en/#tag/push_intro


Обзор

Ozon Seller API поддерживает 13 типов push-уведомлений для автоматической интеграции:

КатегорияТипы уведомленийКоличество
Управление заказамиНовый заказ, отмена, изменение статуса, изменение дат5
Управление товарамиСоздание/обновление, изменение цены, изменение остатков3
КоммуникацииНовое сообщение, редактирование, прочтение, закрытие чата4
СлужебныеПроверка соединения1
ИТОГО13

Важные термины

  • Push-уведомление — HTTP-запрос, который Ozon отправляет на ваш URL при наступлении события
  • MessageType — тип уведомления (константа, идентифицирующая событие)
  • Payload — JSON-тело уведомления с данными события

Типы уведомлений (Message Types)

1. TYPE_PING — Проверка соединения

Отправляется при первоначальном подключении и периодически для проверки доступности вашего сервера.

Payload:

{
"message_type": "TYPE_PING",
"time": "2026-02-10T12:00:00Z"
}

Ожидаемый ответ:

{
"version": "1.0",
"name": "Ozon Seller API",
"time": "2026-02-10T12:00:00Z"
}

2. TYPE_NEW_POSTING — Новое отправление (заказ)

Уведомление о создании нового заказа.

Payload:

{
"message_type": "TYPE_NEW_POSTING",
"posting_number": "12345678-0001",
"products": [
{
"sku": 123456,
"quantity": 2
}
],
"in_process_at": "2026-02-10T12:00:00Z",
"warehouse_id": 123456789,
"seller_id": 12345
}

Поля:

  • posting_number (string) — Номер отправления
  • products (array) — Массив товаров в отправлении
  • in_process_at (datetime) — Дата и время начала обработки в UTC
  • warehouse_id (int64) — ID склада
  • seller_id (int64) — ID продавца

3. TYPE_POSTING_CANCELLED — Отмена отправления

Заказ был отменён.

Payload:

{
"message_type": "TYPE_POSTING_CANCELLED",
"posting_number": "12345678-0001",
"products": [
{
"sku": 123456,
"quantity": 2
}
],
"old_state": "awaiting_packaging",
"new_state": "posting_canceled",
"changed_state_date": "2026-02-10T12:00:00Z",
"reason": {
"id": 1,
"message": "Покупатель отменил заказ"
},
"warehouse_id": 123456789,
"seller_id": 12345
}

Дополнительные поля:

  • old_state (string) — Предыдущий статус
  • new_state (string) — Новый статус
  • reason (object) — Причина отмены

4. TYPE_STATE_CHANGED — Изменение статуса отправления

Статус заказа изменился.

Payload:

{
"message_type": "TYPE_STATE_CHANGED",
"posting_number": "12345678-0001",
"new_state": "delivering",
"changed_state_date": "2026-02-10T12:00:00Z",
"warehouse_id": 123456789,
"seller_id": 12345
}

5. TYPE_CUTOFF_DATE_CHANGED — Изменение даты отгрузки

Дата, к которой нужно подготовить товар, изменилась.

Payload:

{
"message_type": "TYPE_CUTOFF_DATE_CHANGED",
"posting_number": "12345678-0001",
"new_cutoff_date": "2026-02-12T18:00:00Z",
"old_cutoff_date": "2026-02-11T18:00:00Z",
"warehouse_id": 123456789,
"seller_id": 12345
}

6. TYPE_DELIVERY_DATE_CHANGED — Изменение даты доставки

Промежуток времени для доставки изменился.

Payload:

{
"message_type": "TYPE_DELIVERY_DATE_CHANGED",
"posting_number": "12345678-0001",
"new_delivery_date_begin": "2026-02-15T00:00:00Z",
"new_delivery_date_end": "2026-02-17T23:59:59Z",
"old_delivery_date_begin": "2026-02-14T00:00:00Z",
"old_delivery_date_end": "2026-02-16T23:59:59Z",
"warehouse_id": 123456789,
"seller_id": 12345
}

7. TYPE_CREATE_OR_UPDATE_ITEM — Создание/обновление товара

Товар создан, обновлён или возникла ошибка при обработке.

Payload:

{
"message_type": "TYPE_CREATE_OR_UPDATE_ITEM",
"offer_id": "PRODUCT-123",
"product_id": 123456789,
"is_error": false,
"changed_at": "2026-02-10T12:00:00Z",
"seller_id": 12345
}

Поля:

  • offer_id (string) — Идентификатор товара в системе продавца
  • product_id (int64) — ID товара в Ozon
  • is_error (boolean) — true если при создании/обновлении возникли ошибки

8. TYPE_PRICE_INDEX_CHANGED — Изменение ценового индекса

Изменился ценовой индекс товара.

Payload:

{
"message_type": "TYPE_PRICE_INDEX_CHANGED",
"updated_at": "2026-02-10T12:00:00Z",
"sku": 123456,
"product_id": 123456789,
"price_index": 1500,
"seller_id": 12345
}

Поля:

  • price_index (int64) — Новый ценовой индекс (в копейках)

9. TYPE_STOCKS_CHANGED — Изменение остатков

Остатки товаров на складе изменились.

Payload:

{
"message_type": "TYPE_STOCKS_CHANGED",
"items": [
{
"updated_at": "2026-02-10T12:00:00Z",
"sku": 123456,
"product_id": 123456789,
"stocks": [
{
"warehouse_id": 123456789,
"present": 100,
"reserved": 10
}
]
}
],
"seller_id": 12345
}

Поля:

  • items (array) — Массив товаров с изменившимися остатками
  • stocks (array) — Массив остатков по складам
    • present (int64) — Общее количество товара
    • reserved (int64) — Зарезервировано

10. TYPE_NEW_MESSAGE — Новое сообщение в чате

Покупатель или служба поддержки отправили сообщение.

Payload:

{
"message_type": "TYPE_NEW_MESSAGE",
"chat_id": "chat-12345",
"chat_type": "CUSTOMER",
"message_id": "msg-67890",
"created_at": "2026-02-10T12:00:00Z",
"user": {
"id": "user-999",
"type": "CUSTOMER"
},
"data": [
"Здравствуйте, когда будет отправка?"
],
"seller_id": 12345
}

Поля:

  • chat_id (string) — ID чата
  • chat_type (string) — Тип чата (CUSTOMER, SUPPORT)
  • message_id (string) — ID сообщения
  • data (array of strings) — Содержание сообщения в формате Markdown

11. TYPE_UPDATE_MESSAGE — Изменение сообщения в чате

Сообщение было отредактировано.

Payload:

{
"message_type": "TYPE_UPDATE_MESSAGE",
"chat_id": "chat-12345",
"chat_type": "CUSTOMER",
"message_id": "msg-67890",
"created_at": "2026-02-10T12:00:00Z",
"updated_at": "2026-02-10T12:05:00Z",
"user": {
"id": "user-999",
"type": "CUSTOMER"
},
"data": [
"Здравствуйте, уточните когда будет отправка?"
],
"seller_id": 12345
}

12. TYPE_MESSAGE_READ — Прочитанное сообщение

Покупатель или служба поддержки прочитали ваше сообщение.

Payload:

{
"message_type": "TYPE_MESSAGE_READ",
"chat_id": "chat-12345",
"chat_type": "CUSTOMER",
"message_id": "msg-67890",
"created_at": "2026-02-10T12:00:00Z",
"user": {
"id": "user-999",
"type": "CUSTOMER"
},
"data": [
"Ваше сообщение"
],
"last_read_message_id": "msg-67890",
"seller_id": 12345
}

Дополнительное поле:

  • last_read_message_id (string) — ID последнего прочитанного сообщения

13. TYPE_CHAT_CLOSED — Чат закрыт

Чат с покупателем был закрыт.

Payload:

{
"message_type": "TYPE_CHAT_CLOSED",
"chat_id": "chat-12345",
"chat_type": "CUSTOMER",
"user": {
"id": "user-999",
"type": "SELLER"
},
"seller_id": 12345
}

Настройка webhook-сервера

Требования к серверу

  1. Доступность: Сервер должен быть доступен из интернета по HTTPS
  2. Порт: Любой порт (настраивается в личном кабинете Ozon)
  3. Отклик: Сервер должен отвечать HTTP 200 с телом {"result": true}
  4. Timeout: Обрабатывать запросы быстро (рекомендуется < 5 секунд)

Пример реализации на Python (Flask)

from flask import Flask, request, jsonify
from datetime import datetime

app = Flask(__name__)

@app.route('/', methods=['POST'])
def handle_webhook():
data = request.json
message_type = data.get('message_type')

if message_type == 'TYPE_PING':
# Проверка соединения
return jsonify({
'version': '1.0',
'name': 'Ozon Seller API',
'time': datetime.utcnow().isoformat()
})

elif message_type == 'TYPE_NEW_POSTING':
posting_number = data.get('posting_number')
products = data.get('products', [])
# Обработка нового заказа
print(f"Новое отправление: {posting_number}")
for product in products:
print(f" SKU: {product['sku']}, Кол-во: {product['quantity']}")

elif message_type == 'TYPE_POSTING_CANCELLED':
posting_number = data.get('posting_number')
reason = data.get('reason', {}).get('message', 'Неизвестно')
print(f"Отправление {posting_number} отменено: {reason}")

elif message_type == 'TYPE_NEW_MESSAGE':
chat_id = data.get('chat_id')
message_data = data.get('data', [])
print(f"Новое сообщение в чате {chat_id}: {message_data}")

# ... обработка остальных типов ...

# Всегда возвращаем успешный ответ
return jsonify({'result': True})

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, ssl_context='adhoc')

Пример реализации на Go

package main

import (
"log"
"github.com/diphantxm/ozon-api-client/ozon/notifications"
)

func main() {
port := 5000
server := notifications.NewNotificationServer(port)

server.Register(notifications.NewPostingType, func(req interface{}) error {
notification := req.(*notifications.NewPosting)
log.Printf("Новое отправление: %s\n", notification.PostingNumber)
return nil
})

server.Register(notifications.PostingCancelledType, func(req interface{}) error {
notification := req.(*notifications.PostingCancelled)
log.Printf("Отправление %s отменено\n", notification.PostingNumber)
return nil
})

server.Register(notifications.StateChangedType, func(req interface{}) error {
notification := req.(*notifications.StateChanged)
log.Printf("Статус отправления %s изменен на %s\n",
notification.PostingNumber, notification.NewState)
return nil
})

if err := server.Run(); err != nil {
log.Printf("Ошибка запуска сервера: %s", err)
}
}

Процесс настройки webhook-интеграции

Шаг 1: Разверните webhook-сервер

  1. Разработайте и разверните сервер для приёма webhook-уведомлений
  2. Убедитесь, что сервер доступен из интернета по HTTPS
  3. Протестируйте обработку TYPE_PING запроса

Шаг 2: Зарегистрируйте webhook в личном кабинете

Процесс регистрации:

  1. Войдите в личный кабинет продавца Ozon (seller.ozon.ru)
  2. Перейдите в раздел Настройки → API
  3. Найдите подраздел Push-уведомления или Webhooks
  4. Укажите URL вашего webhook-сервера
  5. Выберите типы уведомлений, которые хотите получать
  6. Сохраните настройки

Важно: Точный путь настройки может отличаться. Рекомендуется обратиться к официальной документации Ozon.

Шаг 3: Проверьте работу webhook

  1. Ozon отправит тестовый запрос TYPE_PING на ваш URL
  2. Ваш сервер должен ответить корректной структурой с версией и временем
  3. После успешной проверки Ozon начнёт отправлять уведомления

Обработка ошибок webhook

Структура ошибки

{
"error": {
"code": "400",
"message": "Ошибка валидации",
"details": "Поле 'posting_number' обязательно"
}
}

HTTP-коды ответов

  • 200 OK — Уведомление успешно обработано
  • 400 Bad Request — Неверный формат запроса или невалидные данные
  • 500 Internal Server Error — Внутренняя ошибка вашего сервера

Важно: Даже если ваш сервер вернёт ошибку, Ozon может повторить отправку уведомления. Рекомендуется всегда возвращать 200 с {"result": true} после успешной обработки.


Рекомендации по реализации

1. Идемпотентность

Уведомления могут дублироваться. Обеспечьте идемпотентность обработки:

  • Используйте message_id или posting_number как ключ идемпотентности
  • Храните обработанные уведомления в базе данных
  • Перед обработкой проверяйте, не было ли уведомление уже обработано

2. Асинхронная обработка

Не выполняйте длительные операции синхронно:

  • Сразу верните HTTP 200
  • Поместите уведомление в очередь (RabbitMQ, Redis, Kafka)
  • Обрабатывайте в фоновых воркерах

3. Логирование

Логируйте все входящие уведомления:

  • Сохраняйте исходный JSON
  • Записывайте время получения
  • Фиксируйте результаты обработки

4. Мониторинг

Настройте мониторинг:

  • Количество полученных уведомлений по типам
  • Время обработки
  • Ошибки и исключения
  • Доступность webhook-сервера

5. Безопасность

Проверяйте входящие запросы:

  • Используйте HTTPS
  • Проверяйте IP-адреса источника (если Ozon предоставит список)
  • Валидируйте структуру JSON
  • Не доверяйте данным из уведомлений без проверки

Категории уведомлений по бизнес-процессам

Управление заказами

  • TYPE_NEW_POSTING — Новый заказ
  • TYPE_POSTING_CANCELLED — Отмена заказа
  • TYPE_STATE_CHANGED — Изменение статуса
  • TYPE_CUTOFF_DATE_CHANGED — Изменение даты отгрузки
  • TYPE_DELIVERY_DATE_CHANGED — Изменение даты доставки

Управление товарами

  • TYPE_CREATE_OR_UPDATE_ITEM — Создание/обновление товара
  • TYPE_PRICE_INDEX_CHANGED — Изменение цены
  • TYPE_STOCKS_CHANGED — Изменение остатков

Коммуникации с клиентами

  • TYPE_NEW_MESSAGE — Новое сообщение
  • TYPE_UPDATE_MESSAGE — Редактирование сообщения
  • TYPE_MESSAGE_READ — Прочитанное сообщение
  • TYPE_CHAT_CLOSED — Закрытие чата

Служебные

  • TYPE_PING — Проверка соединения

Полезные ссылки

Официальная документация

Клиентские библиотеки с поддержкой webhook

Сообщество



Скачать файлы спецификаций

В этом разделе приведены ссылки на файлы спецификаций API Ozon Seller, которые могут быть полезны для интеграции.

Локальные файлы

ФайлОписаниеФормат
ozon-postman-collection.jsonКоллекция запросов Postman для Ozon Seller APIPostman Collection v2.1.0

Путь к файлу: ./ozon-postman-collection.json

Описание: Коллекция Postman содержит примеры запросов ко всем основным эндпоинтам Ozon Seller API. Включает предварительно настроенные заголовки (Client-Id, Api-Key) и примеры тел запросов. Полезна для тестирования API и изучения формата запросов/ответов.

Онлайн спецификации

РесурсURLОписание
OpenAPI/Swagger JSONhttps://docs.ozon.ru/api/seller/swagger.jsonОфициальная спецификация OpenAPI/Swagger в формате JSON
Postman Collectionhttps://www.postman.com/googlesheets/ozon-seller-api/documentation/m2uvw9f/ozon-seller-apiОнлайн-коллекция Postman с документацией
Официальная документацияhttps://docs.ozon.ru/api/seller/Полная документация API (на русском языке)
English Documentationhttps://docs.ozon.ru/api/seller/en/Документация API на английском языке

Использование спецификаций

Импорт Postman коллекции

  1. Откройте Postman
  2. Нажмите Import в левом верхнем углу
  3. Выберите файл ozon-postman-collection.json
  4. Коллекция будет загружена в ваш Postman workspace

Преимущества:

  • Готовые примеры запросов для всех эндпоинтов
  • Предварительно настроенные заголовки аутентификации
  • Удобное тестирование API без написания кода
  • Возможность сохранять окружения (environments) для разных аккаунтов

Использование OpenAPI/Swagger спецификации

Для генерации клиентских библиотек:

# OpenAPI Generator (Java)
openapi-generator generate -i ozon-swagger.json -g python -o ./ozon-client

# Swagger Codegen
swagger-codegen generate -i ozon-swagger.json -l python -o ./ozon-client

Для загрузки в инструменты:

  • Insomnia: File → Import → From File → ozon-swagger.json
  • Swagger UI: https://editor.swagger.io/ (загрузите файл)
  • Stoplight Studio: Import → OpenAPI Document

Дополнительные ресурсы

Клиентские библиотеки (с исходным кодом)

ЯзыкБиблиотекаРепозиторий
Pythonozon-apihttps://pypi.org/project/ozon-api/
Pythonozon-api-clienthttps://pypi.org/project/ozon-api-client/
PHPgam6itko/ozon-sellerhttps://github.com/gam6itko/ozon-seller
GodiPhantxm/ozon-api-clienthttps://github.com/diPhantxm/ozon-api-client
TypeScriptozon-daytona-seller-apihttps://www.npmjs.com/package/ozon-daytona-seller-api
C#OzonSellerApihttps://github.com/feeleen/OzonSellerApi

Эти библиотеки содержат реализации всех методов API и могут использоваться как справочник при интеграции.


Примечания к спецификациям

⚠️ Важно:

  • Ozon периодически обновляет API и добавляет новые эндпоинты
  • Рекомендуется регулярно проверять актуальность спецификаций
  • Некоторые новые эндпоинты могут отсутствовать в старых версиях коллекций
  • Официальная документация на docs.ozon.ru является наиболее авторитетным источником

Актуальность:

  • Локальный файл Postman коллекции: загружен 10 февраля 2026
  • Swagger JSON доступен онлайн в реальном времени
  • Рекомендуется использовать swagger.json для проверки последних изменений

Конец документа