Разбор

ИИ-агент аудирует Яндекс.Директ: как находить деньги которые ты теряешь каждую неделю

Ручной аудит Директа — 3–4 часа раз в месяц. ИИ-агент делает то же самое за 5 минут каждую неделю. Схема Директ API → Python → Claude → Telegram, 10 метрик с порогами и код который можно запустить сегодня.

• 6 мин чтения

Ручной аудит Яндекс.Директ в агентстве стоит от 8 000 до 15 000 рублей. Делают его раз в квартал — и только если клиент настаивает. За три месяца рекламный аккаунт успевает накопить столько проблем, что к моменту аудита деньги уже давно потрачены впустую.

11%
бюджета нашли как прямые потери в аккаунте с расходом 90 000 руб./мес. — за первые 5 минут работы агента

Почему раз в месяц — уже слишком редко

Рекламный аккаунт деградирует постоянно. Не потому что настройки меняются, а потому что меняется всё вокруг: конкуренты переписывают объявления, ставки скачут, пользователи ищут новыми запросами которых ты не предусмотрел. Ключи которые работали в прошлом месяце, в этом могут сжигать бюджет в минус.

Три вещи происходят незаметно между аудитами:

Первая — ключевые слова накапливают расход без конверсий. Кто-то кликает, деньги списываются, заявок нет. Если не смотреть 30 дней, один такой ключ съедает 2 000–5 000 рублей прежде чем его заметят.

Вторая — дневной бюджет начинает исчерпываться раньше. Сначала заканчивается в 21:00, потом в 18:00, потом в 14:00. Вторая половина дня — без показов. Рекламодатель платит за период, когда аудитория уже не видит его объявлений.

Третья — появляются нецелевые запросы из-за широкого соответствия ключей. Продаёшь «корпоративный транспорт», а показываешься по «транспорт для детей». Без регулярного добавления минус-слов эта пропасть только растёт.

Из чего складываются потери бюджета в типичном аккаунте МСБ
Ключи без конверсий
~40%
Нецелевой трафик
~30%
Слабые объявления
~20%
Бюджет до 14:00
~10%
Структура потерь по данным анализа 20+ рекламных аккаунтов МСБ, бюджеты 50–300 тыс. руб./мес. Распределение — доли от общей суммы потерь, не от общего бюджета.

Что именно проверяет агент: 10 метрик с порогами

Каждый пункт — конкретная проверка с числовым порогом. Если порог превышен, агент включает это в отчёт с объяснением и рекомендацией.

#МетрикаПорогПриоритет
1Кампании без минус-слов0 минус-слов = стопВысокий
2Ключи с расходом и нулевой конверсией> 500 ₽ за 30 дней без заявкиВысокий
3Бюджет исчерпан до 14:00Дневной лимит = 0 раньше полудняВысокий
4Высокий CTR при низкой конверсииCTR > 5%, CR < 0.5%Высокий
5Объявления без быстрых ссылокАктивные объявления без расширенийСредний
6Дублирующиеся ключевые словаОдин ключ в 2+ группах/кампанияхСредний
7Отклонённые объявления в активных кампанияхStatus = REJECTED при Status кампании = ONСредний
8Завышенные ставкиСтавка > 3× от медианы по кампанииСредний
9Кампании с нулевыми показами 7 днейActive + 0 показов = что-то не такНизкий
10Отсутствие уточнений и промоакцийОбъявления без Sitelinks и CalloutsНизкий

Как устроена схема

📊Директ API v5кампании, ключи, статистика
🐍Pythonсбор и структуризация данных
🤖Claude Sonnetанализ и рекомендации
✈️Telegramотчёт каждую неделю

Python выступает здесь оркестратором: забирает сырые данные через Директ API, форматирует их в структурированный JSON и передаёт Claude одним большим промптом. Claude не работает с API напрямую — он получает уже подготовленный срез данных и возвращает текстовый отчёт на русском.

Это важный момент. Можно было бы сделать так, чтобы Claude сам формулировал API-запросы в режиме агента с инструментами. Но для регулярного аудита с фиксированными проверками — проще и дешевле передать структурированные данные один раз. Меньше токенов, предсказуемый результат.

Код который работает

Базовый скрипт на Python. Запускается раз в неделю через cron или n8n.

🐍 audit_direct.py — установить: pip install anthropic requests python-telegram-bot
import requests
import anthropic
import json
from datetime import datetime, timedelta

DIRECT_TOKEN = "YOUR_DIRECT_TOKEN"   # OAuth-токен Яндекс.Директ
CLAUDE_API_KEY = "YOUR_CLAUDE_KEY"   # ключ Anthropic API
TELEGRAM_TOKEN = "YOUR_BOT_TOKEN"   # токен бота @BotFather
CHAT_ID = "YOUR_CHAT_ID"            # ID чата для отчёта

DIRECT_URL = "https://api.direct.yandex.com/json/v5/"
HEADERS = {
  "Authorization": f"Bearer {DIRECT_TOKEN}",
  "Accept-Language": "ru",
}

def get_campaigns():
  """Получаем все активные кампании."""
  payload = {
      "method": "get",
      "params": {
          "SelectionCriteria": {"States": ["ON", "SUSPENDED"]},
          "FieldNames": [
              "Id", "Name", "Status", "State",
              "DailyBudget", "NegativeKeywords"
          ],
      }
  }
  r = requests.post(DIRECT_URL + "campaigns", headers=HEADERS, json=payload)
  r.raise_for_status()
  return r.json().get("result", {}).get("Campaigns", [])

def get_stats_report():
  """Статистика по ключам за последние 30 дней через Reports API."""
  date_to = datetime.now().strftime("%Y-%m-%d")
  date_from = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")

  payload = {
      "params": {
          "SelectionCriteria": {"DateFrom": date_from, "DateTo": date_to},
          "Goals": [],
          "AttributionModels": ["LC"],
          "FieldNames": [
              "CampaignName", "CampaignId", "Keyword",
              "Cost", "Clicks", "Impressions", "Conversions", "Ctr"
          ],
          "ReportName": f"weekly_audit_{date_from}",
          "ReportType": "KEYWORD_PERFORMANCE_REPORT",
          "DateRangeType": "CUSTOM_DATE",
          "Format": "JSON",
          "IncludeVAT": "YES",
          "IncludeDiscount": "NO"
      }
  }
  # Reports API может вернуть 201 — отчёт строится, нужно повторить
  r = requests.post(DIRECT_URL + "reports", headers=HEADERS, json=payload)
  if r.status_code == 201:
      import time; time.sleep(5)
      r = requests.post(DIRECT_URL + "reports", headers=HEADERS, json=payload)
  r.raise_for_status()
  return r.json()

def analyze_with_claude(campaigns, stats):
  """Отправляем данные в Claude, получаем отчёт."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  # Находим проблемы самостоятельно для ускорения
  no_minus = [c["Name"] for c in campaigns if not c.get("NegativeKeywords")]
  zero_conv = []
  for kw in stats.get("data", []):
      cost = float(kw.get("Cost", 0))
      convs = int(kw.get("Conversions", 0))
      if cost > 500 and convs == 0:
          zero_conv.append({
              "campaign": kw["CampaignName"],
              "keyword": kw["Keyword"],
              "cost_rub": round(cost / 1_000_000, 2)  # Директ хранит в микрорублях
          })

  prompt = f"""Ты помощник по анализу Яндекс.Директ. Составь еженедельный отчёт.

Данные аудита за последние 30 дней:

1. КАМПАНИИ БЕЗ МИНУС-СЛОВ ({len(no_minus)} шт.):
{json.dumps(no_minus, ensure_ascii=False, indent=2)}

2. КЛЮЧИ С РАСХОДОМ БЕЗ КОНВЕРСИЙ (расход > 500 ₽):
{json.dumps(zero_conv[:20], ensure_ascii=False, indent=2)}

Общее число кампаний: {len(campaigns)}
Ключей с нулевой конверсией: {len(zero_conv)}
Суммарный расход на «пустые» ключи: {sum(k['cost_rub'] for k in zero_conv):.0f} ₽

Напиши отчёт в формате:
- Кратко: 2-3 предложения о состоянии аккаунта
- Топ-3 проблемы с конкретными суммами
- 3 действия на эту неделю (конкретные, с названиями кампаний)

Пиши по-русски, кратко и по делу."""

  message = client.messages.create(
      model="claude-sonnet-4-6",
      max_tokens=1024,
      messages=[{"role": "user", "content": prompt}]
  )
  return message.content[0].text

def send_telegram(text):
  """Отправляем отчёт в Telegram."""
  requests.post(
      f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage",
      json={
          "chat_id": CHAT_ID,
          "text": f"📊 <b>Еженедельный аудит Директа</b>\n\n{text}",
          "parse_mode": "HTML"
      }
  )

if __name__ == "__main__":
  print("Собираем данные...")
  campaigns = get_campaigns()
  stats = get_stats_report()

  print(f"Кампаний: {len(campaigns)}, анализируем...")
  report = analyze_with_claude(campaigns, stats)

  send_telegram(report)
  print("Отчёт отправлен в Telegram.")

Несколько деталей которые важны:

Директ хранит суммы в микрорублях — нужно делить на 1 000 000. Это нигде не написано крупно в документации, находишь методом проб когда получаешь расход «89 000 000» вместо «89».

Reports API возвращает 201 когда отчёт ещё строится. Скрипт это обрабатывает одним sleep(5), но для больших аккаунтов лучше сделать цикл с тремя попытками.

Токен Директа нужно обновлять через OAuth каждые 90 дней — добавь себе напоминание или автообновление через refresh_token.

Ручной vs автоматический: разница в цифрах

Ручной аудит
Время на аудит3–4 часа
Частотараз в месяц
Стоимость (агентство)8 000–15 000 ₽
Охват проверокзависит от человека
Потери за периоднакапливаются 30 дней
ИИ-агент
Время на аудит5–7 минут
Частотакаждую неделю
Стоимость (API)5–15 ₽ за запуск
Охват провероквсе 10 метрик всегда
Потери за периодмаксимум 7 дней

Сколько теряет твой Директ прямо сейчас

Быстрая диагностика

4 вопроса — оценим объём потерь

Вопрос 1 из 4
Когда последний раз добавлял минус-слова в кампании?
Вопрос 2 из 4
Есть ключевые слова которые тратят деньги, но не дают заявок больше 30 дней?
Вопрос 3 из 4
Дневной бюджет заканчивается до конца рабочего дня?
Вопрос 4 из 4
Есть активные объявления без быстрых ссылок и уточнений?

Как запустить: 5 шагов

1
Зарегистрировать приложение в Яндекс OAuth

Зайти на dev.ya.ru, создать приложение, указать права доступа к Яндекс.Директ (chargeable). Получить Client ID и Client Secret. Авторизоваться через OAuth-форму и сохранить токен.

dev.ya.ru → Создать приложение → Директ
2
Установить зависимости

Три библиотеки: anthropic для работы с Claude API, requests для вызовов Директ API, python-telegram-bot для отправки уведомлений. Python 3.9+.

pip install anthropic requests python-telegram-bot
3
Создать Telegram-бота и получить Chat ID

Написать @BotFather, создать бота, получить токен. Отправить ему любое сообщение, затем открыть getUpdates — там будет chat.id твоего аккаунта.

https://api.telegram.org/bot{‘{TOKEN}’}/getUpdates
4
Прописать токены и запустить первый тест

Вставить все четыре токена в константы скрипта. Запустить вручную, убедиться что отчёт пришёл в Telegram. При ошибке 400 от Директ API — проверить права токена (нужны read + chargeable).

python audit_direct.py
5
Настроить запуск по расписанию

На Linux-сервере — cron каждый понедельник в 9:00. В n8n — Schedule Trigger раз в неделю + Execute Command. На Windows — Task Scheduler. Скрипт работает на любом хостинге с Python.

0 9 * * 1 python /path/to/audit_direct.py

Что агент не заменит

Честно о границах. Агент хорош для регулярного контроля известных метрик — но есть вещи где он бессилен.

Он не видит стратегические проблемы: неправильно выбранная целевая аудитория, неконкурентное УТП в объявлениях, неправильный выбор типа кампании. Это требует понимания бизнеса, а не анализа цифр.

Он не заменит просмотр реальных поисковых запросов. В Директе есть отчёт «Поисковые запросы» — там видно по каким фразам реально показывались объявления. Там всегда найдётся что-то неожиданное, что никакой автоматизации не поймать без человека.

Он не поможет с посадочными страницами. Высокий CTR при низкой конверсии — это или нецелевой трафик, или проблема с лендингом. Агент зафиксирует симптом, но диагноз нужно ставить руками.

Задача агента другая: убрать рутинный мониторинг с радара и сигнализировать когда что-то пошло не так. Час в неделю который раньше уходил на «посмотреть как дела» — теперь уходит на работу с теми проблемами которые агент нашёл.


Аккаунт с бюджетом 90 000 руб./мес. из кейса выше — первый прогон агента нашёл 4 ключа с суммарным расходом 9 800 рублей и нулевыми конверсиями за 30 дней. Это те самые 11%. Все четыре ключа были отключены в тот же день. Не потому что кто-то умный их нашёл — просто агент посмотрел туда куда человек не успел заглянуть последние три недели.

Похожие кейсы

Источники

Источники

Часто задаваемые вопросы

Что умеет ИИ-агент для аудита Яндекс.Директ?
Агент подключается к Яндекс.Директ API v5, собирает данные по кампаниям, объявлениям и ключевым словам. Claude анализирует их по 10 метрикам — ищет кампании без минус-слов, ключи с расходом без конверсий, исчерпанные бюджеты, дублирующиеся ключи. Итоговый отчёт с конкретными рекомендациями приходит в Telegram каждую неделю.
Сколько стоит запустить агента для аудита Директа?
Разработка базовой версии — 2–3 часа. Расходы на Claude API для одного еженедельного аудита — 5–15 рублей в зависимости от размера аккаунта. Для сравнения: ручной аудит в агентстве — 8 000–15 000 рублей за разовую работу.
Какие ошибки в Директе находит ИИ-агент?
10 типов ошибок: отсутствие минус-слов, высокий CTR при низкой конверсии, объявления без расширений, дублирующиеся ключи, ключи с расходом и нулевыми конверсиями за 30 дней, завышенные ставки, неактивные кампании, отклонённые объявления при активных кампаниях, исчерпанные дневные лимиты до 14:00.
Нужно ли уметь программировать для настройки агента?
Базовый Python — достаточно. Нужно уметь запустить скрипт, установить pip-зависимости и зарегистрировать приложение в Яндекс OAuth. Весь код — в статье. Для автоматического запуска по расписанию понадобится cron на сервере или n8n.
Как получить доступ к Яндекс.Директ API v5?
Зарегистрировать приложение на dev.ya.ru, пройти OAuth-авторизацию и получить токен доступа. Для работы с чужими аккаунтами нужен статус рекламного агентства или согласие клиента. Тестовая среда — sandbox.direct.yandex.ru.
Сколько денег реально находит автоматический аудит?
В типичном аккаунте МСБ с бюджетом 50 000–200 000 руб./мес. агент находит 8–15% потерянного бюджета. Основные утечки: ключи с расходом без конверсий (обычно 5–10% бюджета) и показы по нецелевым запросам из-за отсутствия минус-слов. В кейсе из статьи — 11% на аккаунте с бюджетом 90 000 руб./мес.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.