Как работать с API Яндекс Метрики
Зачем это нужно
Яндекс Метрика — один из главных инструментов web-аналитики в России. Она даёт отчёты по трафику, поведению пользователей, источникам. Но интерфейс ограничен: нельзя соединить данные с CRM, нельзя хранить историю для ML, нельзя делать сложные кастомные отчёты.
Решение — API. Вы выгружаете данные в свою базу и дальше работаете как с любыми другими источниками. Это стандартная практика для data-driven компаний.
Получение доступа
Чтобы пользоваться API, нужен OAuth token. Процесс:
Заходите на oauth.yandex.ru, создаёте приложение. Выбираете права: «Доступ к API Метрики» (get-only достаточно для аналитики).
Получаете Client ID и Secret. Через OAuth flow получаете access token. Для single-user scripts можно сделать простой flow через implicit grant.
Token храните в environment variable, не в коде:
export YM_TOKEN="OAuth_your_token_here"Первый запрос
Minimal Python-скрипт:
import requests
import os
TOKEN = os.environ['YM_TOKEN']
COUNTER_ID = '12345678' # ID вашего счётчика Метрики
headers = {
'Authorization': f'OAuth {TOKEN}'
}
params = {
'ids': COUNTER_ID,
'date1': '2026-04-01',
'date2': '2026-04-15',
'metrics': 'ym:s:visits,ym:s:users,ym:s:pageviews',
'dimensions': 'ym:s:date'
}
response = requests.get(
'https://api-metrika.yandex.net/stat/v1/data',
headers=headers,
params=params
)
data = response.json()
print(data)В ответе приходит JSON с данными по датам. Metrics — это показатели (визиты, посетители), dimensions — разрезы (дата, источник трафика).
Основные метрики и измерения
Справочник полный и огромный, но для аналитика нужен базовый набор.
Метрики:
ym:s:visits— визиты.ym:s:users— уникальные посетители.ym:s:pageviews— просмотры страниц.ym:s:bounceRate— bounce rate.ym:s:avgVisitDurationSeconds— средняя длительность визита.ym:s:ecommercePurchases— покупки.ym:s:ecommerceRevenue— выручка из ecommerce events.
Dimensions:
ym:s:date— дата.ym:s:trafficSource— источник трафика.ym:s:UTMSource,UTMMedium,UTMCampaign— UTM-метки.ym:s:deviceCategory— тип устройства.ym:s:regionCity— город.ym:s:startURLPath— первая страница входа.
Если хочется сразу закрепить тему на практике — открой тренажёр в Telegram. 10 минут в день — и синтаксис в пальцах.
Загрузка в DataFrame
Сразу в pandas:
import pandas as pd
data = response.json()
# Метрика возвращает структуру "data" с именами колонок в "query"
rows = []
for row in data['data']:
rows.append({
**{f'dim_{i}': d['name'] for i, d in enumerate(row['dimensions'])},
**{f'metric_{i}': m for i, m in enumerate(row['metrics'])}
})
df = pd.DataFrame(rows)Для нормальных колонок-названий нужно парсить ответ аккуратнее, учитывая query.
UTM-метки
Самая часто нужная задача — разбор трафика по UTM. Пример:
params = {
'ids': COUNTER_ID,
'date1': '2026-04-01',
'date2': '2026-04-30',
'metrics': 'ym:s:visits,ym:s:ecommerceRevenue',
'dimensions': 'ym:s:UTMSource,ym:s:UTMMedium,ym:s:UTMCampaign',
'sort': '-ym:s:visits',
'limit': 100
}Получаем разбивку визитов и выручки по источнику/среде/кампании. Удобно для анализа эффективности рекламных кампаний.
Pagination
Для больших запросов результаты paginated. По умолчанию limit=100, максимум 10000 за раз. Для большего — offset:
all_rows = []
offset = 1
limit = 10000
while True:
params['limit'] = limit
params['offset'] = offset
response = requests.get(url, headers=headers, params=params)
data = response.json()
all_rows.extend(data['data'])
if len(data['data']) < limit:
break
offset += limitДля огромных выгрузок лучше использовать Logs API (см. ниже).
Logs API — raw события
Для получения сырых событий (не агрегатов) есть Logs API. Это асинхронный endpoint: делаете запрос, ждёте, скачиваете результат.
# 1. Создаём запрос
create = requests.post(
f'https://api-metrika.yandex.net/management/v1/counter/{COUNTER_ID}/logrequests',
headers=headers,
params={
'date1': '2026-04-01',
'date2': '2026-04-15',
'source': 'visits',
'fields': 'ym:s:visitID,ym:s:date,ym:s:UTMSource,ym:s:pageViews'
}
)
request_id = create.json()['log_request']['request_id']
# 2. Ждём готовности
import time
while True:
status = requests.get(
f'https://api-metrika.yandex.net/management/v1/counter/{COUNTER_ID}/logrequest/{request_id}',
headers=headers
).json()
if status['log_request']['status'] == 'processed':
break
time.sleep(30)
# 3. Скачиваем результат
part = 0
while True:
data = requests.get(
f'https://api-metrika.yandex.net/management/v1/counter/{COUNTER_ID}/logrequest/{request_id}/part/{part}/download',
headers=headers
)
if data.status_code != 200:
break
# Обрабатываем TSV
with open(f'part_{part}.tsv', 'w') as f:
f.write(data.text)
part += 1Logs API даёт raw events — каждый визит отдельно. Для ML и глубокой аналитики это must have.
Лимиты
API Метрики имеет rate limits. Примерно 100 запросов/сек для обычного использования. При превышении приходит 429.
Для массовой загрузки делайте sleep между запросами или используйте exponential backoff.
Чтобы не только читать теорию, но и решать реальные задачи — загляните в бот Карьерника. Там по каждой теме подборка вопросов с разборами.
Типовые задачи
Daily ETL в DWH. Airflow DAG раз в день выгружает предыдущий день и кладёт в PostgreSQL. Потом можно делать join с внутренними данными.
Анализ UTM-кампаний. Сравнение trafic и revenue по источникам, поиск worst/best каналов.
Cohort analysis из Logs API. Сырые события → собственная когортная логика в SQL/pandas.
Визуализация в BI. Загружаем в DWH → строим dashboard в Tableau / DataLens / Metabase.
Альтернативы
Кроме Метрики есть другие инструменты web-аналитики:
- Google Analytics 4 — мировой стандарт. Похожий API.
- Amplitude, Mixpanel — продуктовая аналитика, не web.
- Yandex AppMetrica — мобильная аналитика Яндекса.
- PostHog — open-source альтернатива.
Для российских компаний Метрика остаётся основой.
Читайте также
FAQ
Нужен ли премиум аккаунт?
Нет. API работает на стандартной Метрике.
Ограничения по retention данных?
До 18 месяцев в standard tier, больше — в Pro.
Что делать, если token expired?
Сделать refresh через OAuth. Для long-running scripts автоматизируйте обновление.
Rate limit слишком строгий?
Запрашивайте увеличение у саппорта Яндекса, если реально нужно.