Плейбук · Автоматизация

Яндекс Директ через API: промт и плейбук

Скопируй промт в любую нейронку, подставь свои данные, забери рабочие Python-скрипты для своего бизнеса. Тут собраны ошибки API, нюансы стратегий, «Интересы и привычки» и cron-агент мониторинга — то, на чём обычно теряют первые недели запуска.

Проверено на реальном проекте (кайт-школа, Анапа) · май 2026 · Python stdlib без pip

01 · Промт

Скопируй и запусти в нейронке

Вставь в Claude, ChatGPT или Gemini. Заполни блок «ТВОИ ДАННЫЕ», и нейронка создаст все скрипты под твой проект. Работает на Python stdlib, без pip.

// промт: вставить в нейронку целиком
Ты эксперт по Яндекс Директ API v5 и Яндекс Метрике.
Создай полный комплект Python-скриптов для запуска рекламы с нуля.
Скрипты должны работать на Python stdlib (только urllib, json, csv — без pip).
Токены читаются из файла .env в корне проекта.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ТВОИ ДАННЫЕ (заменить на реальные)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

YANDEX_DIRECT_TOKEN=   # OAuth-токен (как получить — см. раздел ниже)
YANDEX_DIRECT_LOGIN=   # логин рекламного аккаунта

БИЗНЕС:
  Название:            [например: Школа кайтсёрфинга]
  Продукт/услуга:      [например: обучение кайтсёрфингу, курсы от 27 000 руб]
  Посадочная страница: [например: https://mysite.ru/]
  Регион бизнеса:      [например: Анапа, Краснодарский край]

МЕТРИКА:
  Счётчик ID:          [ID счётчика Метрики]
  Цель «Заявка» ID:    [ID цели — создать в Метрике если нет]
  Ценность заявки:     [например: 500 руб]

ДИРЕКТ:
  Sitelink Set ID:     [ID набора быстрых ссылок — создать в UI или пропустить]
  Video Creative ID:   [ID видеодополнения — пропустить если нет]
  CPA цель:            [сколько готов платить за заявку, например 700 руб]
  Недельный бюджет РСЯ: [например: 7000 руб]
  Потолок ставки РСЯ:  [например: 150 руб/клик]

ГЕО (ID регионов, найти на tech.yandex.ru/regions):
  Поиск холодный:      [например: 213,1,2,10174,35,37,38,39]
  РСЯ:                 [те же или шире]
  Конкуренты из других городов: [например: 213,1,11]

АУДИТОРИЯ КОНКУРЕНТОВ (боль и крючок):
  Боль клиента:        [например: катается на озере, прогресс медленный]
  Наше преимущество:   [например: на море ветер стабильнее, результат за 3 дня]

МИНУС-СЛОВА:
  Чужие темы:          [например: серфинг, вейкборд, виндсёрфинг, яхта]
  Чужое гео:           [если работаешь локально — чужие города]
  Коммерческий мусор:  [купить, цена, продам, бу, бесплатно, аренда]
  Инфо-мусор:          [видео, скачать, форум, отзыв, вики, что такое]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЧТО СОЗДАТЬ (6 скриптов)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. setup_campaigns.py — 4 кампании:
   • search         — Поиск, холодный трафик, AVERAGE_CPA
   • search_rt      — Поиск, ретаргет, AVERAGE_CPA (CPA × 0.8)
   • rsya_rt        — РСЯ ретаргет, WB_MAXIMUM_CONVERSION_RATE
   • rsya_konkurenti— РСЯ конкуренты, WB_MAXIMUM_CONVERSION_RATE
   Все кампании: ADD_METRICA_TAG=YES, AttributionModel=AUTO, статус SUSPENDED

2. setup_groups.py — группы объявлений:
   • Поиск: автотаргетинг ТОЛЬКО COMPETITOR=YES (остальные NO)
   • РСЯ ретаргет: группа «Ретаргетинг»
   • РСЯ конкуренты: группа «Интересы и привычки» (URL добавить вручную в UI!)
   API-нюанс: AutotargetingCategories = массив [...], НЕ {"Items": [...]}

3. setup_ads.py — по 5 объявлений на кампанию:
   Title ≤56 / Title2 ≤30 / Text ≤81 символов
   Для конкурентов: сравнение «твой способ vs наш», скорость результата
   Для ретаргета: FOMO («были у нас — осталось N мест»)

4. setup_retargeting.py — ретаргет-инфраструктура:
   POST /json/v5/retargetinglists — правила Rules.Arguments[].ExternalId
   POST /json/v5/audiencetargets  — ставка ContextBid ≥ 20 000 000 (= 20 руб)
   (При 300 000 = 0.30 руб алгоритм не покупает показы!)

5. report_search_queries.py — раз в 3 дня:
   SEARCH_QUERY_PERFORMANCE_REPORT → разделить на мусор / нормальные
   Отправить в Telegram через Bot API

6. diag_campaigns.py — диагностика:
   Проверить статусы, стратегии, GoalId, audience targets, ADD_METRICA_TAG

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
КРИТИЧЕСКИЕ ПРИНЦИПЫ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. Метрика загружается БЕЗ ожидания cookie-согласия
2. Цель стратегии = Заявка (НЕ «просмотр страницы», НЕ «переход в мессенджер»)
3. На старте — WB_MAXIMUM_CONVERSION_RATE (PAY_FOR_CONVERSION требует 10+ конв/неделю)
4. Автотаргетинг — только COMPETITOR (Узкие запросы)
5. Ставки audiencetargets — минимум 20 руб
6. «Интересы и привычки» — только в UI, через API недоступно
7. ADD_METRICA_TAG = YES во всех кампаниях
8. Мусорные площадки РСЯ — чистить раз в месяц через UI
9. Поисковые запросы — аудит раз в 3 дня, добавлять в минус-слова
02 · OAuth

Как получить токен Яндекс Директ

Нужен OAuth-токен с правом direct:api. Для таргетинга на Аудитории добавь audience:read и audience:write.

1

Зайди на oauth.yandex.ru

Создай приложение → тип «Веб-сервисы». Callback URI: https://oauth.yandex.ru/verification_code

2

Добавь права доступа

Раздел «Доступ к данным» → «Использование API Яндекс.Директа» (direct:api). Для Аудиторий добавь audience:read + audience:write.

3

Получи токен через браузер

Скопируй ClientID и открой в браузере:
https://oauth.yandex.ru/authorize?response_type=token&client_id=ТВОй_CLIENT_ID&redirect_uri=https://oauth.yandex.ru/verification_code

4

Скопируй access_token из адресной строки

После разрешения доступа в URL появится access_token=y0_.... Это и есть токен. Положи в .env как YANDEX_DIRECT_TOKEN.

Грабли: у приложения может не оказаться нужных scope. Если при создании кампании приходит 401 или «нет прав», заведи новое приложение с правильными scope и возьми новый токен.
// .env файл
YANDEX_DIRECT_TOKEN=y0_AgAAAA...
YANDEX_DIRECT_LOGIN=твой_логин
TELEGRAM_BOT_TOKEN=...    # для отчётов
TELEGRAM_CHAT_ID=...      # твой chat_id
// как читать .env в скрипте (Python stdlib)
# Все скрипты читают .env одинаково:
for line in Path('.env').read_text(encoding='utf-8').splitlines():
    if not line.strip() or line.startswith('#') or '=' not in line: continue
    k, v = line.split('=', 1)
    os.environ.setdefault(k.strip(), v.strip().strip('"').strip("'"))
03 · Принципы

9 принципов. Нарушишь хоть один, кампания не взлетит

Принцип 1

Метрика грузится без ожидания cookie

Счётчик Метрики запускается сразу при загрузке страницы, до согласия на cookie. Иначе Директ показывает 50 кликов, а Метрика всего 5 визитов. Согласие нужно маркетинговым пикселям, обычному счётчику аналитики оно ни к чему.

Принцип 2

Цель = Заявка, не поведение

Целью для стратегии ставь конкретное действие: отправку формы, клик на звонок. НЕ «Просмотр страницы», НЕ «Переход в мессенджер»: на таких целях алгоритм гонит мусорный трафик. Ценность цели тоже задай обязательно: хотя бы 500 руб, без неё автостратегия не обучается.

Принцип 3

Стратегия на старте = WB_MAXIMUM_CONVERSION_RATE

PAY_FOR_CONVERSION требует минимум 10 конверсий в неделю для обучения. На старте их нет, поэтому алгоритм останавливается. WB_MAXIMUM_CONVERSION_RATE работает сразу и учится по ходу. На PAY_FOR_CONVERSION переходи только после того, как накопил статистику.

Принцип 4

Автотаргетинг = только узкие (COMPETITOR)

Включи только категорию COMPETITOR (Узкие запросы). Широкие, Альтернативные и Сопутствующие тянут нецелевой трафик: гидрокостюм, сапсёрфинг, виндсёрфинг. В API: keyword ---autotargeting, AutotargetingCategories передаётся массивом напрямую, не объектом Items.

Принцип 5

Ставки audiencetargets: минимум 20 руб

При ставке 0.30 руб (300 000 микрорублей) алгоритм физически не может купить показы в аукционе. Минимум 20–30 руб на старте, оптимизировать по данным через 2 недели.

Принцип 6

«Интересы и привычки»: только в UI, не через API

Таргетинг на посетителей сайтов конкурентов настраивается только через интерфейс Директа. Яндекс Аудитории API поддерживает один GET, так что создать этот тип сегмента через API не выйдет.

Принцип 7

ADD_METRICA_TAG = YES во всех кампаниях

Без этой настройки Метрика не видит источник трафика. Ставь флаг на все кампании без исключений, иначе атрибуция слепая.

Принцип 8

Мусорные площадки РСЯ: чистить раз в месяц

DSP-биржи, мобильные игры, взрослые сайты сжигают бюджет без конверсий. Раз в месяц бери отчёт по площадкам → отбирай площадки с 0 конверсий и расходом >500 руб → отправляй в «Запрещённые площадки» через UI (API это поле не поддерживает).

Принцип 9

Поисковые запросы: аудит раз в 3 дня

Выгружать SEARCH_QUERY_PERFORMANCE_REPORT. Добавлять в минус-слова: чужие темы, чужое гео, покупной интент. Автоматизировать через cron на VPS → отчёт в Telegram.

04 · Структура

Архитектура: 4 кампании на старте

Это тот минимум, с которого стоит стартовать. Четыре кампании крутятся параллельно, каждая на свою аудиторию, и не отбирают показы друг у друга.

НазваниеТипАудиторияСтратегия
search Поиск Холодный трафик, ищут прямо сейчас AVERAGE_CPA
search_rt Поиск RT Были на сайте, снова ищут AVERAGE_CPA (CPA × 0.8)
rsya_rt РСЯ RT Были на сайте, догоняем баннером WB_MAXIMUM_CONVERSION_RATE
rsya_konkurenti РСЯ Посетители сайтов конкурентов WB_MAXIMUM_CONVERSION_RATE
Порядок запуска: сначала запускай search, ретаргет без трафика на сайт ничего не даст. Через 2–3 недели подключай rsya_rt и rsya_konkurenti, ещё через 4–6 недель search_rt.
05 · Стратегии

Стратегии: почему именно эти

Поиск: AVERAGE_CPA

Цель: GoalId = Заявка, ценность 500 руб, CPA 700 руб. Поиск включён, РСЯ выключена. Почему не HIGHEST_POSITION: без явного CPA алгоритм разгоняет ставки и сливает бюджет в показы без заявок. AVERAGE_CPA задаёт цель, а ставками алгоритм управляет сам.

РСЯ холодная и ретаргет: WB_MAXIMUM_CONVERSION_RATE

WeeklySpendLimit и BidCeiling задаёшь сам. Поиск SERVING_OFF. PAY_FOR_CONVERSION требует минимум 10 конверсий в неделю, на старте их нет, и алгоритм встаёт. WB_MAXIMUM_CONVERSION_RATE показывает сразу и учится постепенно.

Почему ретаргет РСЯ не работал на старте

Останавливали три вещи разом: (1) цель стратегии стояла «Переход в мессенджер» вместо «Заявка», (2) PAY_FOR_CONVERSION работал без истории конверсий, (3) ставки audiencetargets = 0.30 руб, на них алгоритм просто не мог купить показы. Починили все три за один заход.
06 · Метрика

Яндекс Метрика: правильная настройка

Цели и ценности

ЦельЦенностьНазначение
Заявка (отправка формы)500 рубГлавная цель для всех стратегий
Оплата10 000 рубМетрика конверсии воронки

Cookie Consent Gate: главная причина расхождений

Симптом: в Директе 50 кликов, в Метрике 5 визитов.

Причина: счётчик Метрики грузился только после нажатия «Принять всё» в cookie-баннере. Все, кто закрыл баннер, в статистику не попадали.

Решение: счётчик Метрики срабатывает сразу при загрузке, для всех посетителей. Согласие требуется маркетинговым пикселям, обычной аналитике оно не нужно.
07 · Автотаргетинг

Автотаргетинг: только узкие запросы

UI-названиеAPI-значениеСтатус
ЦелевыеEXACTNO
УзкиеCOMPETITORYES
ШирокиеBROADERNO
СопутствующиеACCESSORYNO
АльтернативныеALTERNATIVENO
// API-нюанс: AutotargetingCategories передаётся массивом
# Правильно — при UPDATE передавать как массив []:
"AutotargetingCategories": [
    {"Category": "EXACT",       "Value": "NO"},
    {"Category": "COMPETITOR",  "Value": "YES"},
    {"Category": "BROADER",     "Value": "NO"},
    {"Category": "ACCESSORY",   "Value": "NO"},
    {"Category": "ALTERNATIVE", "Value": "NO"},
]
# НЕ как объект {"Items": [...]} — это формат ответа GET, не запроса UPDATE
08 · Минус-слова

Минус-слова: 4 категории мусора

Чужие виды спорта

гидрокостюм · сап · сапборд · серфинг · вейк · виндсёрфинг · сноуборд · яхтинг · парус

Чужое гео

спб · питер · москва · сочи · адлер · ялта · крым · калининград
(если работаешь локально)

Коммерческий мусор

купить · цена · продам · бесплатно · бу · магазин · каталог · аренда · комплект

Инфо-мусор

видео · скачать · форум · отзыв · вики · что такое · фото · смотреть · работа

09 · Аудитория конкурентов

Таргетинг на посетителей сайтов конкурентов

«Интересы и привычки» через API не настроить. Яндекс Аудитории API поддерживает только GET. Остаётся UI Директа: Кампания → Группа → «Интересы и привычки» → вставить URL.

Принцип текстов под аудиторию конкурентов

Аудитория локальная

Человек выбирает между школами, давим на доверие: IKO, опыт, группы до 4, рассрочку.

Аудитория из других городов

Человек катается на озере, давим на сравнение «море vs озеро», скорость результата, стабильность ветра.

10 · РСЯ площадки

Мусорные площадки РСЯ — чистить раз в месяц

DSP-биржи
dsp-webeye.yandex.ru
dsp-minimob-ww.yandex.ru
dsp-yeahmobi.yandex.ru
dsp.yandex.ru
Мобильные игры
com.vitastudio.mahjong
com.oakever.tiletrip
com.Earthkwak.Platformer
com.* (шаблон)
Критерий отключения

0 конверсий
+ расход >500 руб
за любой период
= блокировать

Через API не добавить. ExcludedSites не поддерживается API Директа на запись. Только UI: Директ → Кампания → Параметры → «Запрещённые площадки».
11 · Ретаргетинг API

Ретаргетинг: правильная структура API

// создание ретаргет-листа: правильная структура
{
  "method": "add",
  "params": {
    "RetargetingLists": [{
      "Name": "Был на сайте",
      "Rules": [{
        "Arguments": [{           // НЕ Goals, НЕ MetrikaGoals
          "ExternalId": 330452088, // НЕ MetrikaGoalId
          "Operator": "ANY"        // НЕ Type, НЕ OR
        }],
        "MembershipLifeSpan": 540  // НЕ Time, НЕ Days
      }]
    }]
  }
}
// создание audience target: ставка минимум 20 руб
{
  "method": "add",
  "params": {
    "AudienceTargets": [{
      "AdGroupId": GROUP_ID,
      "RetargetingListId": LIST_ID,
      "ContextBid": 20000000   // 20 руб (МИНИМУМ)
                                   // При 300 000 = 0.30 руб → 0 показов
    }]
  }
}
12 · Мониторинг

Агент мониторинга — cron + Telegram

// cron на VPS: /etc/cron.d/ydirect
# Ежедневная статистика в 09:00 МСК (06:00 UTC)
0 6 * * *   root  python3 /usr/local/bin/yd_daily_stats.py >> /var/log/yd_stats/$(date +\%Y-\%m-\%d).log 2>&1

# Аудит поисковых запросов каждые 3 дня в 09:00 МСК
0 6 */3 * * root  python3 /usr/local/bin/yd_search_queries.py >> /var/log/yd_queries/$(date +\%Y-\%m-\%d).log 2>&1
// заголовки запроса: одинаковые во всех скриптах
H = {
    "Authorization":   f"Bearer {TOKEN}",
    "Client-Login":    LOGIN,
    "Accept-Language": "ru",
    "Content-Type":    "application/json; charset=utf-8",
}
H_REPORT = {
    **H,
    "processingMode":      "auto",
    "skipReportHeader":    "true",
    "skipColumnHeader":    "false",
    "skipReportSummary":   "true",
    "returnMoneyInMicros": "false",
}
13 · API endpoints

Все endpoint'ы API

ЧтоURL
Кампанииhttps://api.direct.yandex.com/json/v5/campaigns
Группы объявленийhttps://api.direct.yandex.com/json/v5/adgroups
Объявленияhttps://api.direct.yandex.com/json/v5/ads
Ключевые словаhttps://api.direct.yandex.com/json/v5/keywords
Ретаргет-листыhttps://api.direct.yandex.com/json/v5/retargetinglists
Audience targetshttps://api.direct.yandex.com/json/v5/audiencetargets
Отчётыhttps://api.direct.yandex.com/json/v5/reports
Аудитории (только GET)https://api-audience.yandex.ru/v1/segments
14 · Чеклист

Чеклист запуска: 10 пунктов

  • Все кампании в статусе ACCEPTED (не DRAFT, не SUSPENDED)
  • ADD_METRICA_TAG = YES во всех кампаниях
  • Цель в стратегии = реальная цель из Метрики (не 0, не поведение)
  • Audience targets: state = ON, ставка > 20 руб
  • «Интересы и привычки» добавлены вручную в UI группы конкурентов
  • Автотаргетинг: только COMPETITOR = YES, остальные NO
  • Минус-слова добавлены в поисковые кампании
  • Метрика грузится без ожидания cookie-согласия
  • Cron настроен на VPS для отчётов по запросам и статистике
  • Первый отчёт в Telegram пришёл и данные адекватны
15 · Запуск

Порядок запуска скриптов

1

python setup_campaigns.py

Создать 4 кампании в статусе SUSPENDED (на паузе для проверки)

2

python setup_groups.py

Создать группы объявлений с автотаргетингом и гео

3

python setup_ads.py

Создать по 5 объявлений на каждую кампанию

4

python setup_retargeting.py

Создать ретаргет-листы и audience targets со ставками ≥20 руб

UI

Ручные шаги в Директе

Добавить «Интересы и привычки» в группу rsya_konkurenti · проверить тексты · снять SUSPENDED с кампаний

5

python diag_campaigns.py

Проверить что всё активно, GoalId корректен, статусы ACCEPTED

6

Настроить cron на VPS

Скопировать скрипты на VPS, добавить cron-задачи, проверить первый запуск

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

Бесплатный аудит рекламы по фреймворку Direct Response × StoryBrand. 30 минут, без обязательств.

Написать →

Что не так с твоим сайтом или рекламой?

Разберу за 30 минут. Найду 2-3 конкретные точки, где сайт теряет клиентов, и покажу как чинить. Бесплатно, без обязательств и без продаж в лоб.

Связаться по делу

Заявка прилетит мне и в Telegram, и на почту. Отвечу в течение рабочего дня.

Куда удобнее ответить?
или сразу написать в Telegram →

Нажимая кнопку, даёте согласие на обработку персональных данных (оператор № 23-25-044738).