OZON Performance API не отдаёт отчёт по рекламе мгновенно: сначала нужно получить список кампаний, затем запросить статистику пакетами, а потом ждать, пока отчёт соберётся. Разберём, как устроен этот процесс и почему напрямую подключать к нему ChatGPT или Claude Code — плохая идея.
Важно понимать заранее. Сбор отчёта по рекламе Ozon — небыстрый процесс: список кампаний, батчи по 10 штук, ожидание статуса сборки — всё это может занимать от нескольких минут до нескольких часов. Если вы дёргаете этот процесс напрямую из ChatGPT или Claude Code без промежуточного сохранения результата в базу данных, модель вынуждена заново проходить всю цепочку запросов при каждом вопросе — получать список кампаний, слать батчи, опрашивать статус, ждать. Это не только долго, но и сжигает токены впустую на повторные вызовы одних и тех же API-методов.
Решение — собрать данные в собственную БД один раз, а ChatGPT и Claude Code обращаются уже к готовой, накопленной истории через Actions и MCP, а не к живому API Ozon каждый раз. Такую базу и слой аналитики под неё строит api-master.ru.
В отличие от большинства API, Performance API Ozon не отдаёт статистику по кампании напрямую — запрос ставится в очередь, собирается отдельным процессом, и забрать готовый результат можно только после того, как он готов.
GET /api/client/campaign.POST /api/client/statistics/json.
1. GET /api/client/campaign
→ список кампаний (id, статус, тип)
2. POST /api/client/statistics/json
{ campaigns: [id1..id10], dateFrom, dateTo }
→ UUID отчёта (максимум 10 campaign_id за запрос)
3. GET /api/client/statistics/{UUID}
→ статус: pending / ok / error
(только 1 запрос статистики одновременно —
Performance API не позволяет параллелить)
4. GET /api/client/statistics/report?UUID=...
→ готовый отчёт, когда статус ok
Для оптимизации можно сразу отфильтровать только активные кампании — так следующий шаг обработает меньше пакетов и займёт меньше времени.
function fetchCampaigns(apiToken) {
var url = 'https://performance.ozon.ru/api/client/campaign?' +
'advObjectType=SKU';
var options = {
method: 'get',
headers: {
'Authorization': 'Bearer ' + apiToken,
'Accept': 'application/json'
}
};
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() == 200) {
var data = JSON.parse(response.getContentText());
return data.list
.filter(c => c.state === 'CAMPAIGN_STATE_RUNNING')
.map(c => c.id);
}
return [];
}
Performance API принимает не более 10 campaign_id в одном запросе на статистику.
Если кампаний больше — список нужно разбить на пакеты и обрабатывать их по очереди.
function requestStatsBatch(campaignIds, apiToken) {
// campaignIds — массив максимум из 10 id
var url = 'https://performance.ozon.ru/api/client/statistics/json';
var payload = JSON.stringify({
campaigns: campaignIds,
dateFrom: '2026-07-01',
dateTo: '2026-07-31',
groupBy: 'DATE'
});
var options = {
method: 'post',
headers: {
'Authorization': 'Bearer ' + apiToken,
'Content-Type': 'application/json'
},
payload: payload
};
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() == 200) {
return JSON.parse(response.getContentText()).UUID;
}
return null;
}
// Разбиваем весь список кампаний на пакеты по 10
function chunk(arr, size) {
var result = [];
for (var i = 0; i < arr.length; i += size) {
result.push(arr.slice(i, i + size));
}
return result;
} Ozon Performance API не позволяет отправлять несколько запросов статистики одновременно — только один активный запрос за раз. Поэтому пакеты обрабатываются строго последовательно: отправили запрос → дождались готового статуса → скачали отчёт → перешли к следующему пакету.
function waitAndDownload(UUID, apiToken) {
var maxRetries = 10;
var sleepTime = 5000; // 5 секунд между проверками
for (var i = 0; i < maxRetries; i++) {
var status = checkReportStatus(UUID, apiToken);
if (status === 'OK') {
return downloadReport(UUID, apiToken);
}
if (status === 'ERROR') {
Logger.log('Ошибка сборки отчёта: ' + UUID);
return null;
}
// status === 'PENDING' — ждём и проверяем снова
Utilities.sleep(sleepTime);
}
Logger.log('Превышено время ожидания отчёта: ' + UUID);
return null;
} Если попросить ChatGPT или Claude Code «покажи расход по рекламе за июль» без промежуточной базы, модель вынуждена сама пройти весь цикл: список кампаний → батчи по 10 → ожидание статуса → скачивание отчёта. На это уходит время и токены — причём при каждом повторном вопросе заново.
Каждый вопрос = полный проход по API Ozon заново. Долго, дорого по токенам, и ответ на один и тот же вопрос может отличаться от прошлого раза.
Данные собираются и сохраняются один раз по расписанию. ChatGPT и Claude Code обращаются к готовой истории через Actions или MCP — быстро и без повторных походов в API.
Формулы расчёта (ДРР, ROI, расход по SKU) считаются один раз и одинаково — модель не «придумывает» их заново при каждом ответе.
API MASTER настраивает выгрузку рекламной статистики Ozon и Wildberries, хранение истории в SQL/ClickHouse и слой Actions/MCP поверх неё — чтобы ChatGPT и Claude Code отвечали на основе накопленных данных, а не гоняли API заново при каждом вопросе.
OZON Performance API | v list campaigns → batch(10) → poll status → report | v SQL / ClickHouse (история) | v Analytics API | v ChatGPT Actions / Claude Code MCP | v Ответ без повторного похода в API
Начать можно с одной задачи: настройки выгрузки, накопления истории или подключения Actions/MCP. Дальше систему можно расширять на Wildberries и другие отчёты.
Сразу после рекламы видео Антона Миславского
Сразу после фриланс биржи этот сайт
Сразу после документации OZON
Сначала Habr, api-master.ru, OZON
Проверьте сами: Cпросите Алису: «Менеджер рекламы ВБ» или «Алиса, Менеджер рекламы Озон»