# API Яндекс Метрики: Выгрузить сырые визиты через Logs API

Сценарий из mcp-everything. Актуально на 2026-10-24.

Неагрегированные данные о каждом визите или хите — для своего хранилища и сквозной аналитики.

1. Проверь, можно ли выгрузить: GET /management/v1/counter/{counterId}/logrequests/evaluate с date1, date2 (не сегодняшний день, период до года), fields (например, ym:s:visitID,ym:s:dateTime,ym:s:lastTrafficSource,ym:s:goalsID) и source = visits.
2. Создай запрос: POST /management/v1/counter/{counterId}/logrequests с теми же параметрами. В ответе log_request с request_id.
3. Опрашивай статус: GET /management/v1/counter/{counterId}/logrequest/{requestId}, пока status не станет processed. Тогда в parts[] — номера частей.
4. Скачай каждую часть: GET /management/v1/counter/{counterId}/logrequest/{requestId}/part/{partNumber}/download — данные в TSV.
5. После скачивания очисти запрос: POST /management/v1/counter/{counterId}/logrequest/{requestId}/clean — подготовленные логи занимают квоту.

```bash
H="Authorization: OAuth $METRIKA_TOKEN"
API=https://api-metrika.yandex.net/management/v1/counter/44147844
FIELDS=ym:s:visitID,ym:s:dateTime,ym:s:clientID,ym:s:lastTrafficSource,ym:s:goalsID

REQ=$(curl -s -X POST "$API/logrequests?date1=2026-10-01&date2=2026-10-23&source=visits&fields=$FIELDS" -H "$H" | jq -r .log_request.request_id)
curl -s "$API/logrequest/$REQ" -H "$H" | jq .log_request.status        # повторять до processed
curl -s "$API/logrequest/$REQ/part/0/download" -H "$H" -o visits-part0.tsv
curl -s -X POST "$API/logrequest/$REQ/clean" -H "$H"
```

## Базовые URL

- Боевой: `https://api-metrika.yandex.net`

## Авторизация

Тип: OAuth 2.0

OAuth-токен Яндекса передаётся в заголовке `Authorization` в каждом запросе. Без токена или с недействительным токеном сервер отвечает `401`.

```
Authorization: OAuth <токен>
```

## Методы сценария

### GET /management/v1/counter/{counterId}/logrequests/evaluate — Оценка возможности выгрузки логов

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `counterId` | path | integer | да | ID счётчика |
| `date1` | query | string | да | Первый день, например 2016-01-01 |
| `date2` | query | string | да | Последний день (не текущий) |
| `fields` | query | string | да | Поля через запятую, например ym:pv:dateTime,ym:pv:referer |
| `source` | query | string | да | hits (события) или visits (визиты) |

### POST /management/v1/counter/{counterId}/logrequests — Создание запроса логов

В ответе — `log_request`: `request_id`, `counter_id`, `status`, `size`, `parts`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `counterId` | path | integer | да | ID счётчика |
| `date1` | query | string | да | Первый день периода |
| `date2` | query | string | да | Последний день (не текущий) |
| `fields` | query | string | да | Поля через запятую, до 3000 символов |
| `source` | query | string | да | hits или visits |
| `attribution` | query | string | нет | Модель атрибуции: FIRST, LAST, LASTSIGN, LAST_YANDEX_DIRECT_CLICK, AUTOMATIC и др. |

### GET /management/v1/counter/{counterId}/logrequest/{requestId} — Информация о запросе логов

Статусы: `created`, `canceled`, `processed`, `cleaned_by_user`, `cleaned_automatically_as_too_old`, `processing_failed`, `awaiting_retry`. Для `processed` в `parts[]` — номера и размеры частей.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `counterId` | path | integer | да | ID счётчика |
| `requestId` | path | integer | да | ID запроса логов |

### GET /management/v1/counter/{counterId}/logrequest/{requestId}/part/{partNumber}/download — Скачивание части логов

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `counterId` | path | integer | да | ID счётчика |
| `requestId` | path | integer | да | ID запроса логов |
| `partNumber` | path | integer | да | Номер части |

### POST /management/v1/counter/{counterId}/logrequest/{requestId}/clean — Очистка подготовленных логов

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `counterId` | path | integer | да | ID счётчика |
| `requestId` | path | integer | да | ID запроса логов |

## Нюансы

- Префиксы метрик и группировок: `ym:s:` — визиты, `ym:pv:` — хиты; смешивать их в одном запросе нельзя.
- Социально-демографические данные выдаются только при выборке больше 10 посетителей; признак ограничения — `contains_sensitive_data: true`.
- Logs API: период запроса — не больше 1 года, `date2` не может быть текущим днём, фильтрации на уровне запроса нет.
- Поток выгрузки логов: `evaluate` → создание запроса → опрос статуса до `processed` → скачивание частей → `clean`.
- Ограничения фильтров отчётов: до 20 фильтров, до 10 000 символов в строке, до 100 значений в одном условии.

## Другие сценарии

- [Получить посещаемость и источники трафика за период](https://mcp-everything.ru/integrations/yandex-metrika/scenarios/poluchit-poseschaemost-i-istochniki.md)
- [Построить график посещаемости по дням](https://mcp-everything.ru/integrations/yandex-metrika/scenarios/postroit-grafik-poseschaemosti-po-dnyam.md)
- [Посчитать конверсию по целям](https://mcp-everything.ru/integrations/yandex-metrika/scenarios/poschitat-konversiyu-po-tselyam.md)

---

Если этого недостаточно — официальная документация: https://yandex.ru/dev/metrika/ru/
Вся интеграция одним документом: https://mcp-everything.ru/integrations/yandex-metrika.md
