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

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

Промт для нейронки + 6 Python-скриптов: 4 кампании, ретаргет, мониторинг. 9 принципов из реального проекта. Работает на stdlib без pip.

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

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

Если хочешь сначала увидеть общую картину, прочитай гайд про настройку Директа через Claude Code. Связки и цифры до и после на трёх проектах разобраны в статье про Директ для локального бизнеса.

Что внутри: промт для нейронки → 6 скриптов → плейбук по 13 темам → чеклист запуска → 9 критических принципов.

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-задачи, проверить первый запуск

Владимир Кулиев

Об авторе

Меня зовут Владимир Кулиев. Сначала я занялся вайбкодингом сам: собрал себе сайты, ботов и автоматизацию. Теперь делаю такое же для клиентов.

  • 13 лет веду свою кайт-школу, 2000+ клиентов
  • Собрал публикатор для нескольких площадок и Telegram-бота с метками для рекламы
  • Настраиваю Яндекс Директ и Яндекс Бизнес
  • Строю SEO-систему для собственного сайта

Что собрал

Все кейсы

Клиентов показываю без названий.

Какой продукт вам нужен

Выберите свою ситуацию, покажу, что подходит и сколько стоит.

Начните с доступа

Гайд про регистрацию и оплату Claude из России: текст со скриншотами, что делать, если не проходит карта.

Схематично: вопрос про доступ и ответ из гайда

Группа, один на один или установка

Вы собираете своё, я рядом: в Zoom с группой или лично.

Схематично: встреча в Zoom

Сделаю за вас

Разработка и ведение под ваш процесс. Типовые сайты и боты лежат в услугах.

Схематично: выбор задачи

Помочь выбрать продукт

Сделать самому

Гайды, уроки и шаблоны без живой поддержки, в своём темпе.

  • Гайд «Старт с Claude»

    Регистрация в Claude из России: номер, почта, оплата и защита от бана.

    Что внутри

    • 15 глав текстом, около 3,5 часа
    • VPN, оплата картами и USDT
    • Модели, проекты, артефакты
    990 ₽ разово
  • Гайд «Claude Code глубже»

    Sub-агенты, hooks и MCP-серверы. 10 глав, доступ навсегда.

    Что внутри

    • 10 глав, около 6-7 часов
    • MCP-серверы, скиллы, Computer Use
    • Cron и бенчмарк моделей
    990 ₽ разово
  • Семь уроков по вайбкодингу

    Лендинг, Telegram-бот и парсер данных на Claude Code. Без поддержки.

    Что внутри

    • Около 4 часов
    • Установка, промпты, отладка
    • Безопасность и секреты
    1 490 ₽ разово
  • 12 готовых шаблонов

    Заготовки для Claude Code, MCP и n8n, чтобы не собирать с нуля.

    Что внутри

    • CLAUDE.md и промпт-паки
    • Конфиги MCP и сценарии n8n
    • Обновления без подписки
    4 990 ₽ разово

Работать со мной

Практикум и менторство я веду сам. Группа идёт неделю, менторство один месяц.

  • Практикум на неделю

    Группа 8-10 человек в Zoom, 7 встреч по 2 часа. За неделю собираете бота, сайт и таблицу-CRM на своём сервере.

    Что внутри

    • Лендинг, Telegram-бот, Google Sheets
    • Деплой на сервер и безопасность
    • Записи встреч остаются у вас
    15 000 ₽
  • Менторство один на один

    Четыре встречи по 2 часа за месяц на вашем проекте, всего 8 часов. Беру двух человек одновременно.

    Что внутри

    • Бриф и разбор вашего стека
    • Личный чат в Telegram
    • Запись каждой встречи
    72 000 ₽ за месяц

Разработка под заказ

Если делать самому некогда, я собираю и веду систему за вас.

  • Кастомная разработка

    CRM, платежи и связка систем под ваш процесс. Стандартные боты и ИИ-агентов беру как услугу.

    Что внутри

    • Бриф и разбор задачи до договора
    • Договор, оплата этапами 50% и 50%
    • 4 недели сопровождения после сдачи
    Цена по согласованию
  • Абонемент на ведение

    Помесячное ведение собранной системы: правки, новые сценарии, отчёт.

    Что внутри

    • Три тарифа: 20 000, 35 000 и 60 000 ₽ в месяц
    • Реакция в течение рабочего дня
    • Договор помесячный
    от 20 000 ₽ в месяц

Остались вопросы по статье?

Напишите мне в Telegram: подскажу, с чего начать. Или оставьте заявку, я отвечу сам.

Claude CodeChatGPTAntigravityVS CodeGeminiCodexGigaChatYandexGPT
Хватайте и бросайте

Или оставьте контакты, я свяжусь

Напишите, что хотите разобрать или настроить.

Данные нужны только для ответа вам

Форма работает с включённым JavaScript. Напишите мне в Telegram или позвоните +7 909 457‑10‑62.