Как работать с 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 += 1

Logs 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 слишком строгий?

Запрашивайте увеличение у саппорта Яндекса, если реально нужно.