Данные OZON через API в ClickHouse, Postgres и MySQL на Python

Данные OZON через API в ClickHouse, Postgres и MySQL на Python

Продавцы на 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 и другими источниками - о них есть отдельные статьи.

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