Мониторинг бюджетов Яндекс Директа через API: 250 строк Python вместо ежедневной ручной проверки
Шесть компаний в одном холдинге, у каждой свой аккаунт в Яндекс Директе, свой бюджет, свои кампании. Каждый день нужно заходить в шесть разных интерфейсов, смотреть расход, прикидывать в голове прогноз на месяц, сверять с планом. На это уходит 30-40 минут ежедневно, а если забыл проверить пару дней подряд, можно улететь в перерасход на сотню тысяч.
Я написал скрипт на Python, который подключается к API Директа, собирает расход по всем шести аккаунтам, сравнивает с месячным планом и показывает, где проблема. 250 строк кода, минута на запуск. При первом же прогоне нашёл перерасход, о котором никто не подозревал.
Проблема: шесть аккаунтов, ноль контроля
Промышленный холдинг, шесть юрлиц, у каждого свой сайт и свой рекламный аккаунт. Общий месячный бюджет на Директ порядка 400 000 рублей.
Контроль бюджетов выглядел так: маркетолог раз в несколько дней открывал каждый аккаунт, смотрел расход, записывал в табличку, сравнивал с планом. Иногда забывал. Иногда не хватало времени. А Директ тем временем тратил деньги в своём темпе.
Ручной контроль
- Зайти в 6 аккаунтов Директа
- Записать расход в таблицу
- Посчитать план на сегодня
- Сравнить факт с планом
- Прикинуть прогноз на месяц
30-40 минут ежедневно
Через скрипт
- Запустить
python budget_monitor.py - Получить таблицу с расходом, отклонением, прогнозом и безопасным дневным бюджетом
1 минута от запуска до результата
Подключение API: это не так просто, как кажется
Яндекс не раздаёт доступ к API Директа просто так. Нельзя зарегистрировать приложение, получить токен и начать делать запросы. Нужно пройти модерацию заявки, и Яндекс реально проверяет, что ты собираешься делать с их API.
Семь этапов получения доступа
Регистрация приложения
Создать OAuth-приложение в Яндексе. Выбрать тип: веб-сервис. Указать права на API Директа.
Заявка на доступ
Заполнить форму с подробным описанием: зачем нужен API, какие методы будете использовать, какие данные собирать.
Описание логики
Яндекс хочет знать архитектуру: что за скрипт, как часто запускается, сколько запросов в секунду, как храните данные.
Получение токена
OAuth-авторизация: пользователь переходит по ссылке, разрешает доступ, получает код, обменивает на токен.
Тестовый запрос
Проверить, что токен работает, авторизация проходит, данные возвращаются. Обычно первый запрос к Reports API.
Настройка агентского доступа
Если работаете как агентство, нужен заголовок Client-Login для переключения между аккаунтами клиентов.
Продакшен
Обработка ошибок, пауза между запросами (3 секунды), async-обработка отчётов (статусы 201/202).
Главный совет: не пишите в заявке «хочу получать данные». Распишите конкретно: «Скрипт запрашивает отчёт ACCOUNT_PERFORMANCE_REPORT по полю Cost за текущий месяц, сравнивает с плановым бюджетом, формирует сводку для менеджера». Чем конкретнее, тем быстрее одобрят.
Архитектура скрипта
Скрипт устроен просто. Конфиг с клиентами, функция запроса к API, функция расчёта отклонений, вывод результата. Никаких фреймворков, базы данных, веб-интерфейса. Запускается из терминала, выводит таблицу.
Конфигурация
Каждый клиент: логин Директа, месячный бюджет, название. Токен и логин агента в .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-канале. Без воды и мотивационных цитат.
Подписаться на каналЧто показал первый запуск
Написал скрипт, запустил, получил таблицу. И сразу увидел проблему, которую в интерфейсе Директа без калькулятора не посчитаешь: три из шести компаний в марте вышли за бюджет.
═══ Мониторинг бюджетов Яндекс Директ ═══
Период: 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. план». Скрипт даёт четыре метрики, которые показывают полную картину:
Самый ценный показатель — безопасный дневной бюджет. Скрипт берёт остаток бюджета, делит на оставшиеся дни и говорит: «Чтобы уложиться в план, трать не больше 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 решает эту задачу раз и навсегда.
Я собрал шаблоны, которые использую в работе с клиентами: медиаплан, учёт рабочего времени, аналитические отчёты. Скачайте бесплатно на странице шаблонов.
Нужна помощь с автоматизацией рекламы или аналитикой?
Написать мне