Мониторинг бюджетов Яндекс Директа через API: 250 строк Python вместо ежедневной ручной проверки

Мониторинг бюджетов Яндекс Директа через API: 250 строк Python вместо ежедневной ручной проверки

01.04.2026 0 Автор Павел

Шесть компаний в одном холдинге, у каждой свой аккаунт в Яндекс Директе, свой бюджет, свои кампании. Каждый день нужно заходить в шесть разных интерфейсов, смотреть расход, прикидывать в голове прогноз на месяц, сверять с планом. На это уходит 30-40 минут ежедневно, а если забыл проверить пару дней подряд, можно улететь в перерасход на сотню тысяч.

Я написал скрипт на Python, который подключается к API Директа, собирает расход по всем шести аккаунтам, сравнивает с месячным планом и показывает, где проблема. 250 строк кода, минута на запуск. При первом же прогоне нашёл перерасход, о котором никто не подозревал.

Проблема: шесть аккаунтов, ноль контроля

Промышленный холдинг, шесть юрлиц, у каждого свой сайт и свой рекламный аккаунт. Общий месячный бюджет на Директ порядка 400 000 рублей.

Контроль бюджетов выглядел так: маркетолог раз в несколько дней открывал каждый аккаунт, смотрел расход, записывал в табличку, сравнивал с планом. Иногда забывал. Иногда не хватало времени. А Директ тем временем тратил деньги в своём темпе.

Ручной контроль

  • Зайти в 6 аккаунтов Директа
  • Записать расход в таблицу
  • Посчитать план на сегодня
  • Сравнить факт с планом
  • Прикинуть прогноз на месяц

30-40 минут ежедневно

Через скрипт

  • Запустить python budget_monitor.py
  • Получить таблицу с расходом, отклонением, прогнозом и безопасным дневным бюджетом

1 минута от запуска до результата

Подключение API: это не так просто, как кажется

Яндекс не раздаёт доступ к API Директа просто так. Нельзя зарегистрировать приложение, получить токен и начать делать запросы. Нужно пройти модерацию заявки, и Яндекс реально проверяет, что ты собираешься делать с их API.

Семь этапов получения доступа

1

Регистрация приложения

Создать OAuth-приложение в Яндексе. Выбрать тип: веб-сервис. Указать права на API Директа.

2

Заявка на доступ

Заполнить форму с подробным описанием: зачем нужен API, какие методы будете использовать, какие данные собирать.

3

Описание логики

Яндекс хочет знать архитектуру: что за скрипт, как часто запускается, сколько запросов в секунду, как храните данные.

4

Получение токена

OAuth-авторизация: пользователь переходит по ссылке, разрешает доступ, получает код, обменивает на токен.

5

Тестовый запрос

Проверить, что токен работает, авторизация проходит, данные возвращаются. Обычно первый запрос к Reports API.

6

Настройка агентского доступа

Если работаете как агентство, нужен заголовок Client-Login для переключения между аккаунтами клиентов.

7

Продакшен

Обработка ошибок, пауза между запросами (3 секунды), async-обработка отчётов (статусы 201/202).

Главный совет: не пишите в заявке «хочу получать данные». Распишите конкретно: «Скрипт запрашивает отчёт ACCOUNT_PERFORMANCE_REPORT по полю Cost за текущий месяц, сравнивает с плановым бюджетом, формирует сводку для менеджера». Чем конкретнее, тем быстрее одобрят.

Архитектура скрипта

Скрипт устроен просто. Конфиг с клиентами, функция запроса к API, функция расчёта отклонений, вывод результата. Никаких фреймворков, базы данных, веб-интерфейса. Запускается из терминала, выводит таблицу.

.env (токен) Конфиг клиентов Reports API v5 Расчёт отклонений Сводная таблица

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

Каждый клиент: логин Директа, месячный бюджет, название. Токен и логин агента в .env.

API-запрос

ACCOUNT_PERFORMANCE_REPORT по полю Cost за период с первого числа месяца по сегодня. TSV-формат, с НДС.

Async-обработка

Reports API возвращает 201/202, пока отчёт готовится. Скрипт ждёт и повторяет запрос через интервал из заголовка retryIn.

Расчёты

Линейный план на сегодня, отклонение в %, прогноз на месяц, безопасный дневной бюджет на остаток дней.

Ключевые формулы

Логика простая, но именно её не хватает, когда проверяешь бюджеты вручную:

# План на сегодня (линейный)
plan_today = monthly_budget / days_in_month * today.day

# Отклонение от плана
deviation = (actual_spent - plan_today) / plan_today * 100

# Прогноз на конец месяца
projected = (actual_spent / today.day) * days_in_month

# Безопасный дневной бюджет
safe_daily = (monthly_budget - actual_spent) / days_left

Безопасный дневной бюджет — самая полезная метрика. Если видишь, что safe_daily для конкретного клиента стал 500 рублей при обычном расходе 3000, значит, пора резать кампании прямо сейчас.

Честно про рекламу и маркетинг

Разбираю реальные кейсы, делюсь цифрами и инструментами в Telegram-канале. Без воды и мотивационных цитат.

Подписаться на канал

Что показал первый запуск

Написал скрипт, запустил, получил таблицу. И сразу увидел проблему, которую в интерфейсе Директа без калькулятора не посчитаешь: три из шести компаний в марте вышли за бюджет.

budget_monitor.py
> python budget_monitor.py

═══ Мониторинг бюджетов Яндекс Директ ═══
Период: 2026-03-01 — 2026-03-31 (день 31 из 31)

Компания А: 69 800 / 70 000 (−0.3%)
Компания Б: 95 200 / 100 000 (−4.8%)
Компания В: 115 500 / 70 000 (+65.0%)
Компания Г: 113 600 / 80 000 (+42.0%)
! Компания Д: 88 200 / 70 000 (+26.0%)
Компания Е: 0 / 0 (нет активных кампаний)

Три компании перерасходовали мартовский бюджет. Одна — на 65%. Это 45 000 рублей сверх плана только по одному аккаунту. По трём суммарно — больше 90 000 рублей перерасхода за месяц.

Перерасход за март

Компания Бюджет Факт Перерасход
Компания В 70 000 115 500 +45 500 (+65%)
Компания Г 80 000 113 600 +33 600 (+42%)
Компания Д 70 000 88 200 +18 200 (+26%)
Суммарный перерасход +97 300

Почему это произошло? Автостратегии Директа оптимизируются под конверсии, но не следят за месячным бюджетом. Дневной лимит кампании — это не то же самое, что контроль месячного плана. Если в какой-то день конверсий было много, Директ спокойно потратит больше дневного бюджета (да, он это делает). А за месяц эти «небольшие превышения» складываются в десятки тысяч.

Что скрипт считает по каждому клиенту

Не просто «факт vs. план». Скрипт даёт четыре метрики, которые показывают полную картину:

Факт Расход с начала месяца (с НДС)
% откл. Отклонение от линейного плана на сегодня
Прогноз Экстраполяция на конец месяца
Safe Безопасный дневной бюджет до конца месяца

Самый ценный показатель — безопасный дневной бюджет. Скрипт берёт остаток бюджета, делит на оставшиеся дни и говорит: «Чтобы уложиться в план, трать не больше X рублей в день». Если этот X значительно ниже среднего дневного расхода — пора снижать ставки или отключать часть кампаний.

Техническая реализация

Конфиг клиентов

Каждый клиент — словарь с тремя полями: логин Директа, месячный бюджет, название для отчёта. Плюс система алиасов, чтобы можно было запросить данные по конкретному клиенту по имени.

CLIENTS = {
    "company-a.ru": {
        "login": "company_a_login",
        "budget": 70_000,
        "name": "Компания А",
    },
    # ... ещё 5 клиентов
}

Запрос к Reports API

Яндекс Reports API работает асинхронно. Отправляешь запрос на формирование отчёта, получаешь статус 201 или 202 (отчёт готовится), ждёшь, повторяешь. Когда готово — статус 200 и TSV-данные в теле ответа.

headers = {
    "Authorization": f"Bearer {TOKEN}",
    "Client-Login": client_login,  # переключение между аккаунтами
    "processingMode": "auto",
    "returnMoneyInMicros": "false",
}

# Если статус 201/202 --- ждём и повторяем
while response.status_code in (201, 202):
    wait = int(response.headers.get("retryIn", 5))
    time.sleep(wait)
    response = requests.post(url, headers=headers, json=body)

Между запросами к разным клиентам — пауза 3 секунды. Яндекс ограничивает частоту запросов, и без паузы можно получить блокировку.

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

API может вернуть ошибку, пустой ответ или невалидные данные. Скрипт обрабатывает каждый случай: логирует ошибку, помечает клиента как «ОШИБКА API» в итоговой таблице и продолжает работу по остальным. Один упавший аккаунт не ломает весь отчёт.

Что я бы добавил дальше

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

  • Автозапуск по расписанию — cron-задача каждое утро, результат в Telegram-бот или на почту. Чтобы не запускать руками.
  • Алерты по порогу — если отклонение больше 20%, скрипт сам отправляет уведомление. Не нужно читать весь отчёт.
  • История в базе — записывать расход каждый день, строить графики. Видеть тренд, а не только текущую точку.
  • Автоматическое снижение ставок — через Bids API можно снижать ставки, когда бюджет уходит за план. Но это уже требует осторожности.

Выводы

Итого

  • 250 строк Python заменили 30-40 минут ежедневной ручной работы
  • Первый запуск сразу нашёл перерасход на 97 000 рублей, о котором никто не знал
  • Безопасный дневной бюджет — метрика, которой нет в интерфейсе Директа, но которая спасает от перерасхода
  • Подключение API занимает один день, если правильно описать заявку

Если у вас больше двух-трёх аккаунтов в Директе, ручной контроль бюджетов — это просто лотерея. Рано или поздно пропустите перерасход. API + Python решает эту задачу раз и навсегда.

Я собрал шаблоны, которые использую в работе с клиентами: медиаплан, учёт рабочего времени, аналитические отчёты. Скачайте бесплатно на странице шаблонов.

Нужна помощь с автоматизацией рекламы или аналитикой?

Написать мне

Шаблоны для маркетинга

Профессиональные шаблоны для организации работы:
медиапланирование, учёт времени, аналитические отчёты
Telegram-канал Павезло маркетинг Павезло во ВКонтакте