Продавцы на OZON тонут в данных: заказы, остатки, возвраты, комиссии, реклама. В личном кабинете это разложено по десяткам вкладок, а для нормальной аналитики хочется собрать всё в одном месте и строить свои отчёты. Хорошо, что есть OZON Seller API:)
В этой статье покажу, как выгружать данные из OZON через API на Python и складывать их в базу данных: ClickHouse, PostgreSQL или MySQL. Использовать будем бесплатную библиотеку morin, а начнём с простой демонстрации, которую можно запустить локально без сервера и без Docker.
Зачем выгружать данные из OZON
Личный кабинет OZON Seller удобен для оперативной работы, но не для аналитики. Как только отчётов становится много, упираешься в потолок:
- История ограничена, а хочется хранить данные за все периоды.
- Свести продажи, рекламу и остатки в одном отчёте внутри кабинета нельзя.
- Построить свои метрики (маржа, ДРР, оборачиваемость) неудобно.
- Автоматизировать ежедневную выгрузку под дашборд руками невозможно.
Для всех источников решение одно: забрать данные по API в свою базу данных и работать там. В базе лежит вся история, к ней подключается любой BI-инструмент, а обновление идёт автоматически.
Что такое API OZON
API OZON - это интерфейс, через который программа получает данные магазина напрямую, без захода в кабинет. У Озона несколько API:
- Seller API - основной. Отдаёт товары, остатки, заказы, транзакции, финансы, возвраты. С ним и будем работать в первую очередь.
- Performance API - рекламный. Отдаёт статистику по рекламным кампаниям.
- Аналитический - данные аналитики OZON (показы, заказы, выручка в разрезах товаров и дней).
Работает OZON API так: вы отправляете HTTP-запрос с ключами доступа, а в ответ получаете данные в JSON. Библиотека morin прячет постраничную выгрузку, ожидание отчётов и разбор ответов внутри, отдавая готовые строки для базы данных.
Получаем доступ к API: Client-Id и Api-Key
Для работы с Seller API OZON нужны два параметра - Client-Id (идентификатор магазина) и Api-Key (ключ доступа). Оба берутся в личном кабинете OZON Seller:

Ключ даёт доступ к данным магазина, поэтому храните его в секрете. Для статистики рекламы OZON ключи отдельные - их получают в кабинете Performance API.
Устанавливаем библиотеку morin
morin - бесплатная библиотека для получения данных из разных API (OZON, Яндекс Директ, WB, Метрика и другие) и загрузки в базу. Ставится обычным pip:
pip install morin
Драйверы для ClickHouse, PostgreSQL и MySQL ставятся автоматически вместе с morin, отдельно доустанавливать ничего не нужно.
Для первой демонстрации без базы хватит одной morin.
Бесплатный старт: получаем данные OZON на Python
Начнём с простого - вытащим данные магазина в Python и посмотрим на них. База и Docker пока не нужны, всё запускается локально и бесплатно.
Создаём объект коннектора с ключами:
from morin import OZONbyDate
ozon = OZONbyDate(
clientid='ВАШ_CLIENT_ID', # Client-Id магазина
token='ВАШ_API_KEY', # Api-Key
add_name='shop1', # метка магазина (префикс таблиц)
start='2025-01-01',
)
Список товаров. Проверим доступ, получив товары магазина:
products = ozon.get_all_products()
for p in products[:5]:
print(p.get('product_id'), p.get('offer_id'))
Остатки на складах. Сколько чего лежит по складам:
stocks = ozon.get_stock_on_warehouses()
for s in stocks[:5]:
print(s)
Транзакции за день. Финансовые операции (продажи, комиссии, логистика) за конкретную дату:
tx = ozon.get_transactions('2025-06-01')
print(f'Операций за день: {len(tx)}')
На выходе - списки словарей, готовые к анализу: можно сразу закинуть в pandas или сохранить. Уже на этом этапе morin работает как обычный клиент ozon api, без всякой инфраструктуры.
Загрузка данных OZON в ClickHouse
Теперь сложим данные в базу. Начнём с ClickHouse - аналитической СУБД, которая отлично подходит под такие данные (про неё у нас есть отдельные статьи). Нужен запущенный ClickHouse: локально его поднимают одной командой Docker или ставят на сервер.
Добавляем параметры подключения к базе и указываем, какие отчёты собрать. Отчёты перечисляются через запятую - это удобно, за один запуск можно забрать сразу несколько:
from morin import OZONbyDate
ozon = OZONbyDate(
subd='clickhouse', # тип базы данных
host='localhost', port='8123',
username='default', password='',
database='ozon',
add_name='shop1', # префикс таблиц этого магазина
clientid='ВАШ_CLIENT_ID',
token='ВАШ_API_KEY',
start='2025-01-01',
backfill_days=3, # сколько последних дней переспрашивать
reports='transactions,products,stocks',
)
ozon.collecting_manager()
Что делает collecting_manager:
- сам создаёт таблицы в ClickHouse и определяет столбцы по данным;
- работает по принципу Airflow - в служебной таблице фиксирует какие дни уже собраны;
- при повторном запуске догружает только недостающие дни, а не тянет всё заново;
backfill_daysперезабирает несколько последних дней (данные OZON задним числом уточняются).
После запуска в базе появятся таблицы с транзакциями, товарами и остатками. Дальше к ним подключается любой дашборд. Так выглядит таблица "products" в Clickhouse:

То же самое в PostgreSQL и MySQL
Как и с Директом, чтобы грузить не в ClickHouse, а в PostgreSQL или MySQL, меняется один параметр - subd. Остальной код тот же.
Для PostgreSQL:
ozon = OZONbyDate(
subd='postgresql',
host='localhost', port='5432',
username='postgres', password='postgres',
database='ozon',
add_name='shop1',
clientid='ВАШ_CLIENT_ID', token='ВАШ_API_KEY',
start='2025-01-01', backfill_days=3,
reports='transactions,products,stocks',
)
ozon.collecting_manager()
Для MySQL меняем subd на 'mysql' и порт на 3306. morin сама подберёт типы столбцов под выбранную базу данных и создаст таблицы. Один и тот же коннектор Озона наполняет три разные СУБД.
Какие отчёты умеет коннектор OZON
У Seller-коннектора десятки готовых отчётов, они задаются параметром reports (через запятую). Вот полный список, кроме рекламы и аналитики (их забирают отдельно, см. ниже) - с функцией, которая вызывает каждый отчёт:
transactions- финансовые операции (транзакции) по дням, функцияget_transactions()products- список товаров магазина, функцияget_all_products()products_info- подробные характеристики товаров, функцияget_all_products_info()stocks- остатки на складах, функцияget_stock_on_warehouses()stocks_sku- остатки по SKU, функцияget_stocks_sku()stocks_sku_history- история остатков по SKU, функцияget_stocks_sku()stocks_history- история остатков на складах, функцияget_stock_on_warehouses()returns- все возвраты, функцияget_all_returns()returns_days- возвраты по дням, функцияget_returns()realization- отчёт о реализации (по месяцам), функцияget_realization()realization_posting- отчёт о реализации в разрезе отправлений, функцияget_realization_posting()postings_fbo- отправления по схеме FBO, функцияget_postings_fbo()postings_fbs_rep- отчёт по отправлениям FBS, функцияget_postings_fbs_report()finance_details- детализация финансов (движение денежных средств), функцияget_finance_details()finance_cashflow- денежный поток, функцияget_finance_cashflow()products_buyout- выкупы товаров, функцияget_products_buyout()accrual_by_day- начисления по дням, функцияget_accrual_by_day()accrual_types- справочник типов начислений, функцияget_accrual_types()
Для регулярного сбора берут нужный набор, например transactions,stocks,products, и запускают ежедневно. Коннектор сам копит историю день за днём.
Аналитика OZON отдельным коннектором
Данные аналитики Озон (показы, заказы, выручка в разрезах) забирает отдельный коннектор OZONANbyDate. У него те же ключи Client-Id и Api-Key, но задаются измерения и метрики:
from morin import OZONANbyDate
an = OZONANbyDate(
subd='clickhouse',
host='localhost', port='8123',
username='default', password='', database='ozon',
add_name='shop1',
clientid='ВАШ_CLIENT_ID', token='ВАШ_API_KEY',
start='2025-01-01',
dimensions='sku,day', # разрезы
metrics='revenue,ordered_units,hits_view', # метрики
reports='analytics',
)
an.collecting_manager()
Так в базу попадёт аналитика OZON по товарам и дням: выручка, заказанные единицы, показы. Набор метрик и измерений меняется параметрами metrics и dimensions.
Автоматизация через Docker
Демонстрация выше запускается руками. Чтобы данные OZON обновлялись сами каждый день, morin разворачивают в Docker - сбор идёт по расписанию, с логами и уведомлениями в Telegram. Подробно этот сценарий разобран в отдельной статье про коннекторы к API в ClickHouse на Docker: там про сервер, настройку и команды.
Библиотека одинаково работает и как простой Python-клиент (как в нашей демонстрации), и внутри Docker-контейнера для боевой автоматизации. Начать проще с локального запуска, а перенести на сервер уже потом.
FAQ
Как получить данные из OZON через API на Python?
Установите библиотеку morin (pip install morin), создайте объект OZONbyDate с Client-Id и Api-Key и вызовите методы get_all_products, get_transactions, get_stock_on_warehouses. Данные вернутся списком словарей.
Где взять Client-Id и Api-Key для OZON API?
В личном кабинете OZON Seller, раздел Настройки → Seller API. Там генерируется ключ; для выгрузки данных достаточно роли только для чтения.
Бесплатно ли пользоваться API OZON?
Да, сам ozon api и библиотека morin бесплатны. Платить нужно только за сервер и базу данных, если вынесете сбор в облако. Для теста всё запускается локально.
В какую базу данных можно грузить данные Озона?
Коннектор morin умеет ClickHouse, PostgreSQL и MySQL. База выбирается одним параметром subd, остальной код не меняется.
Можно ли забирать аналитику и рекламу OZON?
Да. Аналитику Озон забирает коннектор OZONANbyDate, статистику рекламы - отчёт reklama через Performance API. Ключи для рекламы берутся отдельно, в кабинете Performance.
Заключение
Мы разобрали, как выгружать данные из OZON через API на Python и грузить их в ClickHouse, PostgreSQL или MySQL с помощью бесплатной библиотеки morin. Начали с простой локальной демонстрации, а затем одной строкой направили те же данные в базу.
Главное: получение данных Озона сводится к паре методов, выбор базы - к одному параметру, а список отчётов задаётся через запятую. Дальше остаётся подключить дашборд и автоматизировать сбор. По такому же принципу morin работает с Яндекс Директом, Метрикой, WB и другими источниками - о них есть отдельные статьи.