Ozon Seller API можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Seller API и openpyxl превращают сырой каталог в привычный XLSX с фильтром, закреплённой строкой и подсветкой дефицита. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Один запрос редко возвращает весь каталог, а связывание product_id, offer_id и остатков требует явной нормализации. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте скрипт, который получает страницы товаров, сопоставляет остатки и сохраняет форматированный Excel. Проверка: в книге одна строка на товар, повторный запуск перезаписывает отчёт, а дефицит выделяется цветом.
прочитать Client-Id и Api-Key из окружения. Не расширяйте проект до первого успешного запуска.
собраны product_id и offer_id. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте лист Сводка и дату формирования отчёта. Так копирование станет практикой.
Как устроен учебный проект Ozon Seller API
Ozon Seller API разделяет подготовку, основное действие, проверку ответа и сохранение результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Доступ | прочитать Client-Id и Api-Key из окружения | заголовки готовы без печати |
| Каталог | запросить product/info/list страницами | собраны product_id и offer_id |
| Остатки | получить данные по товарам | количество связано с нужным offer_id |
| Excel | записать лист, фильтр и стиль | report.xlsx открывается без предупреждений |
Контрольные точки: доступ, каталог, остатки и excel. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
Собираем рабочий пример шаг за шагом
Материал сверялся с официальной документацией сервиса 21 октября 2026 года. Установите httpx и openpyxl. Задайте OZN_CLIENT_ID и OZN_API_KEY через окружение. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
import os
import httpx
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Font
HEADERS = {"Client-Id": os.environ["OZN_CLIENT_ID"], "Api-Key": os.environ["OZN_API_KEY"]}
BASE = "https://api-seller.ozon.ru"
def request(path, payload):
response = httpx.post(BASE + path, headers=HEADERS, json=payload, timeout=30)
response.raise_for_status()
return response.json()
def save_report(items, filename='ozon-report.xlsx'):
book = Workbook(); sheet = book.active; sheet.title = 'Остатки'
sheet.append(['offer_id', 'product_id', 'Название', 'Остаток'])
for cell in sheet[1]: cell.font = Font(bold=True)
red = PatternFill('solid', fgColor='FFD6D6')
for item in items:
sheet.append([item['offer_id'], item['product_id'], item['name'], item['stock']])
if item['stock'] < 5:
for cell in sheet[sheet.max_row]: cell.fill = red
sheet.freeze_panes = 'A2'; sheet.auto_filter.ref = sheet.dimensions
book.save(filename)- report.xlsx содержит заголовок, фильтр и закреплённую первую строку.
- Товары с остатком меньше пяти выделены, идентификаторы остаются в отдельных колонках.
- Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Код держит подготовку отдельно от внешнего действия, поэтому ошибку можно найти на конкретном шаге. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Клиент API отвечает только за запрос и пагинацию. Нормализованный список отделяет контракт Ozon от структуры Excel, поэтому отчёт можно тестировать локально. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Секреты и персональные данные не должны попадать в репозиторий, журнал или публичный скриншот.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| Seller API | возвращает товары страницами | курсор или last_id обновляется |
| Нормализация | связывает идентификаторы и остаток | одна строка на offer_id |
| openpyxl | создаёт XLSX и стили | книга открывается и фильтруется |
Не смешивайте product_id и offer_id: первый задаётся платформой, второй часто является артикулом продавца. Используйте имена полей в коде и заголовках, а не безымянные списки. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
Проверяем проект и добавляем свою функцию
Добавьте второй лист Сводка с количеством товаров, суммой остатков и числом позиций ниже порога. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: в книге одна строка на товар, повторный запуск перезаписывает отчёт, а дефицит выделяется цветом.
- Измените правило: добавьте лист Сводка и дату формирования отчёта. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- заголовки готовы без печати
- собраны product_id и offer_id
- количество связано с нужным offer_id
- report.xlsx открывается без предупреждений
Полезное улучшение сохраняет исходный сценарий и добавляет одну новую проверяемую возможность. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Для регулярного запуска добавьте кеш идентификаторов, ограниченный повтор запросов и архив предыдущих отчётов. Для закрепления откройте в автоматизации Excel, в выгрузке Wildberries и в анализе CSV через pandas.
Как изучить тему в Кодике
Сначала разберите входные данные и один успешный вызов, затем изучайте дополнительные параметры. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Словари, циклы, функции и файлы Python | Объясните вход и выход функции. |
| 2. Инструмент | POST-запросы, заголовки и пагинацию Seller API | Повторите команду по памяти. |
| 3. Проект | Связь товаров и запись XLSX | Проверьте два сценария. |
| 4. Рефакторинг | Сводку, расписание и контроль лимитов | Разделите ввод, логику и вывод. |
Перепишите ключевую функцию по памяти и проверьте её на корректном, пустом и ошибочном вводе. Базовый синтаксис закрепите через курс Python.
Секреты не относятся к отчёту. Используйте окружение.
Большая часть каталога пропадает. Идите до окончания курсора.
Строки связываются неверно. Храните оба поля.
Диапазон не охватывает новые данные. Применяйте после записи.
Что получится в итоге

Финальный экран показывает результат, состояние запроса и понятное сообщение об ошибке без раскрытия секретов.
Зачем отделять API от Excel?
Так обработку данных и оформление можно проверять без реального доступа.
Чем offer_id полезен в отчёте?
Это понятный продавцу идентификатор для сопоставления с учётной системой.
Что проверять первым, если Ozon Seller API не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект Ozon Seller API работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.