ax.SEO
🐱 🦊 🐼 🦝 🐰 🦉
Кто сегодня с нами? 🐾

Животные меняются при загрузке страницы

Главная / Блог / MyTarget API: как автоматизировать VK Ads с Python – практическое руководство

MyTarget API: как автоматизировать VK Ads с Python – практическое руководство

Практическое руководство по работе с MyTarget API: подключение, токены, создание кампаний и автоматическая оптимизация ставок в VK Ads с помощью Python.
🐱
Читать проще с подсказками

Карточки, чек-листы, таблицы и примеры помогают быстро найти нужный ответ.

✅ чек-листы 📈 SEO-практика ⚡ быстро

В 2026‑м году рекламные бюджеты в VK Ads растут, а конкуренция усиливается. Автоматизация через MyTarget API позволяет быстро менять ставки, добавлять объявления и получать статистику без ручного вмешательства. Ниже представлен практический план: подключение API, работа с токенами, создание кампаний и их оптимизация на Python.

MyTarget API позволяет управлять рекламой в VK через скрипты на Python: получить токен, создать кампанию, загрузить креативы, собрать статистику и автоматически корректировать ставки. Важно правильно настроить авторизацию, соблюдать лимиты и вести логирование, чтобы быстро реагировать на ошибки.

Подготовка к работе с MyTarget API

Перед отправкой запросов к MyTarget необходимо иметь client_id и client_secret. Это как пароль к API: без них сервис не ответит, а скрипт будет в ожидании. Создайте приложение в кабинете MyTarget, скопируйте эти значения и храните их в безопасном месте.

  • В кабинете MyTarget: «Создать приложение» / запомнить client_id и client_secret.
  • На локальном компьютере: pip install requests python-dotenv – библиотека для запросов и удобное хранение переменных.
  • В корне проекта создать файл .env и положить туда: MT_CLIENT_ID=…, MT_CLIENT_SECRET=….
# .env
MT_CLIENT_ID=123456
MT_CLIENT_SECRET=abcdef1234567890

Если переменные неверны, запросы вернут 401 – «Unauthorized». Проверьте, что в .env нет лишних пробелов и символов, иначе Python не прочитает их, и скрипт упадёт при авторизации.

Получение и хранение токенов доступа

  1. Зарегистрируйте приложение в кабинете MyTarget, получите client_id и client_secret – они нужны для всех дальнейших запросов.
  2. Переадресуйте пользователя на URL авторизации: https://oauth.mytarget.ru/authorize?client_id=<ID>&response_type=code&redirect_uri=<URI>&scope=ads. После подтверждения вы получите code в параметре redirect_uri.
  3. Обменяйте code на токены, отправив POST‑запрос к https://oauth.mytarget.ru/token с телом: grant_type=authorization_code&code=<CODE>&client_id=<ID>&client_secret=<SECRET>&redirect_uri=<URI>.
  4. Сохраните access_token и refresh_token в переменных окружения, например: MYTARGET_ACCESS_TOKEN и MYTARGET_REFRESH_TOKEN. Это избавит от хранения токенов в коде и позволит менять их без деплоя.
  5. Периодически проверяйте expires_in (в секундах). Когда токен почти истёк, отправьте запрос: grant_type=refresh_token&refresh_token=<REFRESH>&client_id=<ID>&client_secret=<SECRET> и обновите переменные окружения новыми значениями.
import os, requests, json

# 1. обмен кода на токены
resp = requests.post(
 "https://oauth.mytarget.ru/token",
 data={
 "grant_type": "authorization_code",
 "code": os.getenv("MYTARGET_CODE"),
 "client_id": os.getenv("MYTARGET_CLIENT_ID"),
 "client_secret": os.getenv("MYTARGET_CLIENT_SECRET"),
 "redirect_uri": os.getenv("MYTARGET_REDIRECT_URI"),
 },
)
tokens = resp.json()
os.environ["MYTARGET_ACCESS_TOKEN"] = tokens["access_token"]
os.environ["MYTARGET_REFRESH_TOKEN"] = tokens["refresh_token"]
os.environ["MYTARGET_EXPIRES_IN"] = str(tokens["expires_in"])
  • MYTARGET_CLIENT_ID – уникальный идентификатор приложения.
  • MYTARGET_CLIENT_SECRET – секретный ключ, хранить только в переменных окружения.
  • MYTARGET_ACCESS_TOKEN – токен для запросов к API.
  • MYTARGET_REFRESH_TOKEN – токен для обновления доступа.
  • MYTARGET_EXPIRES_IN – время жизни access_token в секундах.
  • Не хранить токены в репозитории – это открывает доступ к API всем, кто видит код.
  • Если забыть обновить access_token, запросы вернут 401, и автоматизация перестанет работать.
  • Проверяйте expires_in каждую минуту; иначе токен может истечь в середине цикла обновления кампаний.

Создание и настройка кампаний через API

  1. Подготовьте токен и базовый URL. В типовой ситуации токен хранится в переменной окружения, чтобы не попадать в репозиторий. Если токен неверен, API вернёт 401 и ничего не создаст.
  2. Создайте кампанию. В ответе вы получите campaign_id, который понадобится далее. Если не указать название, API может вернуть ошибку 400.
  3. Создайте группу объявлений внутри кампании. Укажите budget, schedule и тип группы (трафик, конверсия). Если забыть указать бюджет, группа будет остановлена сразу.
  4. Определите таргетинг: age_range, region_ids, interests. В типовой ситуации можно задать age_range: "18-35", region_ids: [1, 2], interests: ["fitness", "travel"]. Если интересы не совпадают с доступными, API вернёт 400 с описанием недопустимых значений.
  5. Загрузите креатив. Сначала загрузите изображение через endpoint upload, получите media_id, затем создайте креатив с text, url и media_id. Если изображение не соответствует требованиям (размер, формат), API вернёт 422.
  6. Свяжите креатив с группой объявлений. После этого объявление будет готово к запуску. Если пропустить этот шаг, креатив останется в «draft» и не будет показан.
import requests, os

BASE_URL = 'https://api.mytarget.com'
TOKEN = os.getenv('MT_TOKEN')
headers = {
 'Authorization': f'Bearer {TOKEN}',
 'Content-Type': 'application/json'
}

# 1. Создать кампанию
campaign_resp = requests.post(
 f'{BASE_URL}/campaigns',
 json={'name': 'Test Campaign'},
 headers=headers
)
campaign_id = campaign_resp.json()['id']

# 2. Создать группу объявлений
group_resp = requests.post(
 f'{BASE_URL}/campaigns/{campaign_id}/adgroups',
 json={
 'name': 'Group 1',
 'budget': 1000,
 'targeting': {
 'age_range': '18-35',
 'region_ids': [1, 2],
 'interests': ['fitness', 'travel']
 }
 },
 headers=headers
)
group_id = group_resp.json()['id']

# 3. Загрузить изображение
with open('banner.jpg', 'rb') as f:
 upload_resp = requests.post(
 f'{BASE_URL}/media',
 files={'file': f},
 headers={'Authorization': f'Bearer {TOKEN}'}
 )
media_id = upload_resp.json()['id']

# 4. Создать креатив
creative_resp = requests.post(
 f'{BASE_URL}/adgroups/{group_id}/creatives',
 json={
 'text': 'Buy now',
 'url': 'https://example.com',
 'media_id': media_id
 },
 headers=headers
)
creative_id = creative_resp.json()['id']

# 5. Связать креатив с группой
link_resp = requests.post(
 f'{BASE_URL}/adgroups/{group_id}/creatives/{creative_id}/link',
 headers=headers
)

print('Campaign', campaign_id, 'ready')

После выполнения запросов вы увидите в ответе статус 200 и идентификаторы. Если получите 4xx, проверьте payload – часто ошибка в неправильных полях таргетинга или недоступном media_id. В логах сервера будет сообщение об ошибке. Если креатив не показывается, проверьте статус группы – она должна быть running.

Автоматизация оптимизации: правила и примеры

Для быстрой реакции на изменение эффективности объявлений сначала собираем статистику по группам через GET /adgroups. В ответе находятся impressions, clicks и conversions. Коэффициент конверсии – conversions / clicks. Если он ниже целевого уровня, ставка нуждается в корректировке. Пример: группа A – 1 000 показов, 50 кликов, 5 конверсий (10 %). Целевой коэффициент 12 %. Чтобы достичь цели, нужно снизить ставку. Расчёт целевой ставки: target_bid = current_bid × (target_conv / current_conv). Это простая пропорция: если коэффициент ниже, ставка уменьшается; если выше – повышается. После расчёта отправляем PATCH‑запрос к /adgroups/{id} с полем bid. Если запрос вернёт 200, ставка обновилась, и в отчётах появится новый CPC. Если ответ 400, проверьте, что bid указан как число и не меньше нуля. Корректно изменённая ставка повышает эффективность бюджета и рост конверсий; ошибка сохраняет прежнюю ставку, и лишние деньги тратятся на низкоперформансные объявления.

import requests, json

adgroup_id = 123456
current_bid = 50 # руб
target_conv = 0.12
current_conv = 0.10

target_bid = current_bid * (target_conv / current_conv)

payload = {"bid": target_bid}
headers = {"Authorization": "Bearer YOUR_TOKEN", "Content-Type": "application/json"}

response = requests.patch(
 f"https://api.mytarget.com/v1/adgroups/{adgroup_id}",
 headers=headers,
 data=json.dumps(payload)
)

print(response.status_code, response.text)

Проверка и отладка запросов

Логирование ответов и кода статуса – первый шаг к надёжной интеграции с MyTarget API. Если запрос вернёт 200, но тело пустое, проблема может остаться незамеченной до раздачи объявлений без бюджета.

Используйте sandbox‑эндпоинт (https://api.mytarget.ru/sandbox/) для тестов, чтобы не тратить реальные деньги и не менять живые кампании.

Проверяйте, что ответ – валидный JSON и содержит обязательные поля, например id и status. Если их нет, API отклонит запрос, но клиент может не получить ошибку, если не обрабатывать исключения.

import logging, json, requests

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

def send_request(url, payload, token):
 headers = {"Authorization": f"Bearer {token}"}
 try:
 resp = requests.post(url, json=payload, headers=headers, timeout=10)
 logger.info(f"Status: {resp.status_code}")
 logger.debug(f"Response: {resp.text}")
 resp.raise_for_status()
 data = resp.json()
 # обязательные поля
 if "id" not in data or "status" not in data:
 raise ValueError("Missing required fields")
 return data
 except (requests.RequestException, ValueError) as e:
 logger.error(f"Request failed: {e}")
 raise

# пример использования
sandbox_url = "https://api.mytarget.ru/sandbox/campaigns"
payload = {"name": "Test", "budget": 1000}
token = "your_token_here"
campaign = send_request(sandbox_url, payload, token)
print(campaign)
  • Код статуса 200 / запрос прошёл, но проверьте тело.
  • Тело – валидный JSON.
  • Наличие обязательных полей (id, status, …).
  • Если статус 4xx/5xx – логируйте ошибку и останавливайте дальнейшие шаги.
  • В sandbox‑режиме изменения не влияют на живые кампании.
  • Неправильный токен / 401, но тело может быть пустым.
  • Отправка в production вместо sandbox / реальные бюджеты расходуются.
  • Пустой JSON / API вернёт 400, но клиент может не обрабатывать исключение.
  • Отсутствие обязательных полей / данные не сохраняются, но клиент видит 200.

Ошибки и ловушки при работе с MyTarget API

  • Rate limits – API позволяет около 200 запросов в минуту. При превышении сервер отвечает 429 и блокирует дальнейшие запросы. Например, цикл создания 300 кампаний без паузы приводит к серии 429. В итоге операции откладываются, лог показывает «Too many requests». Чтобы избежать, добавьте небольшую задержку или используйте пакетный эндпоинт.
  • Невалидные параметры – отправка строк вместо чисел, например, «budget»: “1000” вместо 1000. Запрос на создание кампании с «budget»: “one thousand” приводит к 400. Проверяйте JSON по схеме перед отправкой.
  • Неверные типы данных – булевы значения как строки, например, «is_active”: “true”. Запрос отклоняется, статус остаётся прежним. Убедитесь, что типы соответствуют API‑документации.
  • Ошибки при загрузке креативов – неверный формат файла или превышение размеров. Попытка загрузить 5 МБ PNG, тогда как лимит 3 МБ и формат должен быть JPG, приводит к 422/413. Проверяйте MIME‑тип и размер до загрузки, используйте утилиту для ресайзинга.
  • Коррупция файла – загрузка обрезанного изображения. Файл с 0 КБ после передачи приводит к 400. Проверяйте контрольную сумму или размер перед отправкой.

Мониторинг и аналитика результатов

Сначала настроим два вида запросов: daily и weekly. Daily‑запрос покажет показ, клики и расходы за день, weekly‑запрос даст сравнение за неделю. Далее подключаем webhooks к GA4 и Яндекс Метрике: каждый раз, когда MyTarget обновляет статистику, он посылает POST‑запрос в ваш webhook‑endpoint. В ответе данные можно сразу отразить в событиях GA4 (например, event “mt_daily_stats”) или в Метрике как пользовательские события. Наконец, автоматические отчёты в CSV/JSON позволяют выгружать данные в BI‑систему или хранить в облаке. Такой поток делает анализ прозрачным: вы видите, какие бюджеты работают, а какие – нет, без ручного копирования таблиц.

# Пример скрипта на Python
import requests, json, time
MT_TOKEN = "your_mtarget_token"
MT_ENDPOINT = "https://api.mytarget.ru/v2/traffic/stat"

def fetch_stats(period="daily"):
 payload = {
 "period": period,
 "ad_group_ids": [12345],
 "metrics": ["clicks", "spend", "impressions"]
 }
 headers = {"Authorization": f"Bearer {MT_TOKEN}"}
 resp = requests.post(MT_ENDPOINT, json=payload, headers=headers)
 return resp.json()

def send_webhook(data):
 webhook_url = "https://example.com/webhook"
 requests.post(webhook_url, json=data)

def export_csv(data, filename):
 import csv
 with open(filename, "w", newline="") as f:
 writer = csv.DictWriter(f, fieldnames=data[0].keys())
 writer.writeheader()
 writer.writerows(data)

# Запускаем каждый день в 02:00
if __name__ == "__main__":
 stats = fetch_stats("daily")
 send_webhook(stats)
 export_csv(stats, f"mt_daily_{time.strftime('%Y%m%d')}.csv")
  • Периодический запрос – daily в 02:00, weekly в 03:00, чтобы не мешать работе.
  • Webhook‑endpoint должен возвращать 200 OK в течение 5 секунд, иначе MyTarget повторит попытку.
  • В GA4 создайте событие с параметром “mt_period” (daily/weekly) – это позволит фильтровать отчёты.
  • В Яндекс Метрике настройте пользовательское событие “mt_stats” и добавьте параметры расхода и кликов.
  • Автогенерация CSV/JSON сохраняйте в облачном хранилище с датой в имени файла для историзации.

Переключение между тестовой и продакшн средой

ЭтапЧто делаемКогда
1. Подключаем sandbox Ставим переменную API_URL на https://api.sandbox.mytarget.ru и используем тестовый токен. Проверяем, что запросы возвращают 200 OK без ошибок. Сразу после создания скрипта
2. Проверяем права доступа Отправляем GET‑запрос к /v2/advertiser/permissions и убеждаемся, что токен имеет campaign:create, campaign:update и adgroup:read. Перед запуском любой операции
3. Тестируем логику Создаём кампанию, меняем ставку, проверяем отчёты в sandbox. Если что‑то падает, фиксируем в логах и поправляем код. После проверки прав, до перехода на prod
4. Переходим на продакшн Меняем API_URL на https://api.mytarget.ru и подставляем продакшн‑токен. Перезапускаем скрипт и проверяем, что все endpoints работают. После успешного тестирования
5. Мониторинг и откат Включаем логирование ошибок в продакшн‑режиме. Если в течение 24 чеканка появляется 403 Forbidden, мгновенно откатываем переменную обратно в sandbox. Непрерывно после запуска
# пример переключения среды в Python
import os
import requests

API_URL = os.getenv("API_URL", "https://api.sandbox.mytarget.ru")
TOKEN = os.getenv("MYTARGET_TOKEN")

headers = {"Authorization": f"Bearer {TOKEN}"}

def check_permissions():
 resp = requests.get(f"{API_URL}/v2/advertiser/permissions", headers=headers)
 if resp.status_code != 200:
 raise RuntimeError("Нет прав: " + resp.text)
 print("Права OK:", resp.json())

def create_campaign(name, budget):
 payload = {"name": name, "budget": budget}
 resp = requests.post(f"{API_URL}/v2/campaigns", json=payload, headers=headers)
 return resp.json()

# Тестовый запуск
if __name__ == "__main__":
 check_permissions()
 result = create_campaign("TestCamp", 1000)
 print("Создана:", result)

Переход из sandbox в продакшн похож на смену ключа: если он не подходит, всё замок. Тестируйте каждый шаг, а не просто «переходите».

Вопросы и ответы

Можно ли использовать MyTarget API для массовой генерации объявлений?

Массовую генерацию креативов можно осуществлять, если создать цикл, формируя JSON‑объекты с разными заголовками, текстами и ссылками, и отправлять их через POST /ads. Учтите, что каждый креатив проходит проверку VK, иначе отклоняется.

Какие ограничения по количеству запросов в минуту?

Ограничения в MyTarget – 60 запросов в минуту на один токен. Если превышать, получите 429. Чтобы не заморачиваться, ставьте таймеры или используйте очередь, а не спамить.

Как обновлять токен без перезапуска скрипта?

Токен можно обновлять через /oauth/token, отправив refresh_token. В скрипте держите таймер, который по истечении 59 минут запрашивает новый токен и заменяет старый в заголовках. Так перезапуск не нужен.

Как быстро отреагировать на падение качества кампании?

Если качество падает, сразу проверьте показатели CTR и CPM. Если они упали, попробуйте снизить ставку или изменить креатив. В API можно быстро менять bid и pause кампанию, не дожидаясь интерфейса.

Можно ли менять таргетинг в реальном времени?

Таргетинг менять в реальном времени – да, через PATCH /adgroups. Но учтите, что обновления применяются через несколько минут, а слишком частые изменения могут вызвать throttling.

Что делать, если API возвращает ошибку 400 при создании креатива?

Ошибка 400 обычно значит, что JSON не валиден или поле отсутствует. Проверьте схему, убедитесь, что все обязательные поля заполнены, и используйте валидатор JSON Schema, чтобы быстро локализовать проблему.

Как использовать UTM при работе с MyTarget API?

UTM‑метки добавляйте в поле url, например https://example.com?utm_source=mytarget&utm_medium=cpc. После клика они попадут в Метрику, где можно отфильтровать трафик по кампании.

Есть ли возможность получать отчёты в формате CSV через API?

Отчёты можно получить в CSV через /reports. Параметры – format=csv, period, adgroup_ids. API вернёт файл, который можно парсить в pandas или Excel. Это удобно для офлайн‑аналитики.

Важно

Материал носит информационный характер. Перед внедрением рекомендаций учитывайте нишу, регион, конкурентов, текущее состояние сайта и бизнес-цели проекта.

Редакционная проверка

Материал подготовлен и проверен редакцией AX.SEO

Проверено
AX
Автор Редакция AX.SEO
Digital-редактор 7 лет опыта

Редакция AX.SEO готовит материалы о SEO, разработке, AI, аналитике, маркетинге и росте digital-проектов.

Проверил Александр SEO
SEO-специалист 10 лет опыта

Проверяет практическую применимость рекомендаций, корректность терминов и соответствие материала digital-тематике.

AX.SEO объясняет digital простым языком: без магии, пустых обещаний и “секретных кнопок роста”.