Яндекс Директ через API: промт и плейбук
Скопируй промт в любую нейронку, подставь свои данные, забери рабочие Python-скрипты для своего бизнеса. Тут собраны ошибки API, нюансы стратегий, «Интересы и привычки» и cron-агент мониторинга — то, на чём обычно теряют первые недели запуска.
Проверено на реальном проекте (кайт-школа, Анапа) · май 2026 · Python stdlib без pip
- Промт для нейронки: скопировать и запустить
- Как получить OAuth-токен
- 9 критических принципов
- Архитектура кампаний
- Стратегии: поиск / РСЯ / ретаргет
- Метрика: правильная настройка
- Автотаргетинг: только узкие
- Минус-слова по категориям
- Таргетинг на аудиторию конкурентов
- Мусорные площадки РСЯ
- Ретаргетинг: инфраструктура API
- Агент мониторинга: cron + Telegram
- Все endpoint'ы API
- Чеклист запуска
Скопируй и запусти в нейронке
Вставь в 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 дня, добавлять в минус-слова
Как получить токен Яндекс Директ
Нужен OAuth-токен с правом direct:api. Для таргетинга на Аудитории добавь audience:read и audience:write.
Зайди на oauth.yandex.ru
Создай приложение → тип «Веб-сервисы». Callback URI: https://oauth.yandex.ru/verification_code
Добавь права доступа
Раздел «Доступ к данным» → «Использование API Яндекс.Директа» (direct:api). Для Аудиторий добавь audience:read + audience:write.
Получи токен через браузер
Скопируй ClientID и открой в браузере:
https://oauth.yandex.ru/authorize?response_type=token&client_id=ТВОй_CLIENT_ID&redirect_uri=https://oauth.yandex.ru/verification_code
Скопируй access_token из адресной строки
После разрешения доступа в URL появится access_token=y0_.... Это и есть токен. Положи в .env как YANDEX_DIRECT_TOKEN.
YANDEX_DIRECT_TOKEN=y0_AgAAAA... YANDEX_DIRECT_LOGIN=твой_логин TELEGRAM_BOT_TOKEN=... # для отчётов TELEGRAM_CHAT_ID=... # твой chat_id
# Все скрипты читают .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("'"))
9 принципов. Нарушишь хоть один, кампания не взлетит
Метрика грузится без ожидания cookie
Счётчик Метрики запускается сразу при загрузке страницы, до согласия на cookie. Иначе Директ показывает 50 кликов, а Метрика всего 5 визитов. Согласие нужно маркетинговым пикселям, обычному счётчику аналитики оно ни к чему.
Цель = Заявка, не поведение
Целью для стратегии ставь конкретное действие: отправку формы, клик на звонок. НЕ «Просмотр страницы», НЕ «Переход в мессенджер»: на таких целях алгоритм гонит мусорный трафик. Ценность цели тоже задай обязательно: хотя бы 500 руб, без неё автостратегия не обучается.
Стратегия на старте = WB_MAXIMUM_CONVERSION_RATE
PAY_FOR_CONVERSION требует минимум 10 конверсий в неделю для обучения. На старте их нет, поэтому алгоритм останавливается. WB_MAXIMUM_CONVERSION_RATE работает сразу и учится по ходу. На PAY_FOR_CONVERSION переходи только после того, как накопил статистику.
Автотаргетинг = только узкие (COMPETITOR)
Включи только категорию COMPETITOR (Узкие запросы). Широкие, Альтернативные и Сопутствующие тянут нецелевой трафик: гидрокостюм, сапсёрфинг, виндсёрфинг. В API: keyword ---autotargeting, AutotargetingCategories передаётся массивом напрямую, не объектом Items.
Ставки audiencetargets: минимум 20 руб
При ставке 0.30 руб (300 000 микрорублей) алгоритм физически не может купить показы в аукционе. Минимум 20–30 руб на старте, оптимизировать по данным через 2 недели.
«Интересы и привычки»: только в UI, не через API
Таргетинг на посетителей сайтов конкурентов настраивается только через интерфейс Директа. Яндекс Аудитории API поддерживает один GET, так что создать этот тип сегмента через API не выйдет.
ADD_METRICA_TAG = YES во всех кампаниях
Без этой настройки Метрика не видит источник трафика. Ставь флаг на все кампании без исключений, иначе атрибуция слепая.
Мусорные площадки РСЯ: чистить раз в месяц
DSP-биржи, мобильные игры, взрослые сайты сжигают бюджет без конверсий. Раз в месяц бери отчёт по площадкам → отбирай площадки с 0 конверсий и расходом >500 руб → отправляй в «Запрещённые площадки» через UI (API это поле не поддерживает).
Поисковые запросы: аудит раз в 3 дня
Выгружать SEARCH_QUERY_PERFORMANCE_REPORT. Добавлять в минус-слова: чужие темы, чужое гео, покупной интент. Автоматизировать через cron на VPS → отчёт в Telegram.
Архитектура: 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 |
Стратегии: почему именно эти
Поиск: 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 показывает сразу и учится постепенно.
Почему ретаргет РСЯ не работал на старте
Яндекс Метрика: правильная настройка
Цели и ценности
| Цель | Ценность | Назначение |
|---|---|---|
| Заявка (отправка формы) | 500 руб | Главная цель для всех стратегий |
| Оплата | 10 000 руб | Метрика конверсии воронки |
Cookie Consent Gate: главная причина расхождений
Симптом: в Директе 50 кликов, в Метрике 5 визитов.
Причина: счётчик Метрики грузился только после нажатия «Принять всё» в cookie-баннере. Все, кто закрыл баннер, в статистику не попадали.
Автотаргетинг: только узкие запросы
| UI-название | API-значение | Статус |
|---|---|---|
| Целевые | EXACT | NO |
| Узкие | COMPETITOR | YES |
| Широкие | BROADER | NO |
| Сопутствующие | ACCESSORY | NO |
| Альтернативные | ALTERNATIVE | NO |
# Правильно — при 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
Минус-слова: 4 категории мусора
гидрокостюм · сап · сапборд · серфинг · вейк · виндсёрфинг · сноуборд · яхтинг · парус
спб · питер · москва · сочи · адлер · ялта · крым · калининград
(если работаешь локально)
купить · цена · продам · бесплатно · бу · магазин · каталог · аренда · комплект
видео · скачать · форум · отзыв · вики · что такое · фото · смотреть · работа
Таргетинг на посетителей сайтов конкурентов
Принцип текстов под аудиторию конкурентов
Человек выбирает между школами, давим на доверие: IKO, опыт, группы до 4, рассрочку.
Человек катается на озере, давим на сравнение «море vs озеро», скорость результата, стабильность ветра.
Мусорные площадки РСЯ — чистить раз в месяц
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
{
"method": "add",
"params": {
"RetargetingLists": [{
"Name": "Был на сайте",
"Rules": [{
"Arguments": [{ // НЕ Goals, НЕ MetrikaGoals
"ExternalId": 330452088, // НЕ MetrikaGoalId
"Operator": "ANY" // НЕ Type, НЕ OR
}],
"MembershipLifeSpan": 540 // НЕ Time, НЕ Days
}]
}]
}
}
{
"method": "add",
"params": {
"AudienceTargets": [{
"AdGroupId": GROUP_ID,
"RetargetingListId": LIST_ID,
"ContextBid": 20000000 // 20 руб (МИНИМУМ)
// При 300 000 = 0.30 руб → 0 показов
}]
}
}
Агент мониторинга — cron + Telegram
# Ежедневная статистика в 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",
}
Все 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 targets | https://api.direct.yandex.com/json/v5/audiencetargets |
| Отчёты | https://api.direct.yandex.com/json/v5/reports |
| Аудитории (только GET) | https://api-audience.yandex.ru/v1/segments |
Чеклист запуска: 10 пунктов
- Все кампании в статусе ACCEPTED (не DRAFT, не SUSPENDED)
- ADD_METRICA_TAG = YES во всех кампаниях
- Цель в стратегии = реальная цель из Метрики (не 0, не поведение)
- Audience targets: state = ON, ставка > 20 руб
- «Интересы и привычки» добавлены вручную в UI группы конкурентов
- Автотаргетинг: только COMPETITOR = YES, остальные NO
- Минус-слова добавлены в поисковые кампании
- Метрика грузится без ожидания cookie-согласия
- Cron настроен на VPS для отчётов по запросам и статистике
- Первый отчёт в Telegram пришёл и данные адекватны
Порядок запуска скриптов
python setup_campaigns.py
Создать 4 кампании в статусе SUSPENDED (на паузе для проверки)
python setup_groups.py
Создать группы объявлений с автотаргетингом и гео
python setup_ads.py
Создать по 5 объявлений на каждую кампанию
python setup_retargeting.py
Создать ретаргет-листы и audience targets со ставками ≥20 руб
Ручные шаги в Директе
Добавить «Интересы и привычки» в группу rsya_konkurenti · проверить тексты · снять SUSPENDED с кампаний
python diag_campaigns.py
Проверить что всё активно, GoalId корректен, статусы ACCEPTED
Настроить cron на VPS
Скопировать скрипты на VPS, добавить cron-задачи, проверить первый запуск
Нужна помощь с настройкой Директа или автоматизацией?
Бесплатный аудит рекламы по фреймворку Direct Response × StoryBrand. 30 минут, без обязательств.
Написать →