Read API: обзор
Те же отчёты, что в дашборде, для скриптов и выгрузок по секретному ключу sk_.
Read API отдаёт портфель, аудиторию, retention, realtime, свои события, профили и здоровье интеграции в JSON. Это те же эндпоинты, которыми пользуется дашборд, поэтому цифры совпадают с экранами до последней единицы. Полный список параметров и схем — в разделе API reference.
Адрес и ключ
Базовый адрес — API вашей установки; в примерах стоит условный https://api.analytics.example.com.
Ключ sk_… создаётся в «Настройки → API-ключи» и показывается один раз: сервер хранит только хеш и
префикс. Ключ передаётся в заголовке:
export AM_SK="sk_…"
curl -sS https://api.analytics.example.com/v1/apps -H "Authorization: Bearer $AM_SK"Ключ в query string не принимается. Write-ключ pk_… для Read API не подходит.
| Настройка ключа | Что даёт |
|---|---|
scope read | Все GET /v1/* |
scope delete | Создание запросов на удаление данных (POST …/deletion-requests) |
| Привязка к приложению | Ключ видит только одно приложение; остальные отвечают 404 app_not_found |
Отозванный ключ перестаёт работать сразу.
Общие параметры отчётов
| Параметр | Значение |
|---|---|
from, to | Даты YYYY-MM-DD в часовом поясе приложения, обе включительно; не больше 366 дней |
environment | production (по умолчанию) или development |
unit | persons (по умолчанию) — люди, installs — установки, как в AppMetrica (см. Идентичность) |
platform, app_version, os_name, country | Фильтры; параметр можно повторить: значения одного параметра объединяются через ИЛИ, разные параметры — через И |
compare | previous_period (по умолчанию) — добавить такой же период перед from; none — без сравнения |
split | Только audience/timeseries: platform — отдельный ряд на каждую платформу периода в splits[], compare при этом игнорируется; none (по умолчанию) — один ряд |
Пример — сводка аудитории за неделю для iOS-версий 3.4.0 и 3.5.0:
curl -sS -G "https://api.analytics.example.com/v1/apps/$APP_ID/audience/summary" \
-H "Authorization: Bearer $AM_SK" \
--data-urlencode "from=2026-10-06" \
--data-urlencode "to=2026-10-12" \
--data-urlencode "platform=ios" \
--data-urlencode "app_version=3.4.0" \
--data-urlencode "app_version=3.5.0"{
"from": "2026-10-06",
"to": "2026-10-12",
"active": 41230,
"new": 8120,
"sessions": 201554,
"avg_duration_ms": 214500,
"median_duration_ms": 98000,
"compare": {
"from": "2026-09-29",
"to": "2026-10-05",
"active": 40102,
"new": 7998,
"sessions": 195020,
"avg_duration_ms": 209870,
"median_duration_ms": 96500,
"delta_pct": { "active": 2.81, "new": 1.53, "sessions": 3.35, "avg_duration_ms": 2.21, "median_duration_ms": 1.55 }
}
}Доли (retention, share) — числа от 0 до 1, delta_pct — проценты, null при нулевой базе.
Время — UTC, кроме начала корзин рядов (ts, minute): они со смещением часового пояса
приложения, чтобы граница суток совпадала с отчётом.
Эндпоинты
| Эндпоинт | Что возвращает |
|---|---|
GET /v1/apps | Приложения; include_archived=true — с архивными |
GET /v1/apps/{app_id} | Одно приложение: платформы (platforms; поле platform устарело), часовой пояс, статус |
GET /v1/portfolio | Портфель: DAU и его изменение к тому же дню прошлой недели, новые, сессии, D1, D7, тренд за 30 дней и доли активных по платформам (platforms, сумма долей может превышать DAU) по каждому приложению |
GET /v1/apps/{app_id}/audience/summary | Активные, новые, сессии, длительность за период |
GET /v1/apps/{app_id}/audience/timeseries | Ряд метрики по часам, дням, неделям или месяцам; split=platform — ряд на каждую платформу |
GET /v1/apps/{app_id}/audience/rolling-active | DAU, WAU, MAU по дням |
GET /v1/apps/{app_id}/audience/breakdown | Разбивка по платформе, ОС и её версии, версии приложения, модели и типу устройства, стране, городу, языку |
GET /v1/apps/{app_id}/retention | Классический retention по дневным и недельным когортам |
GET /v1/apps/{app_id}/realtime | Активные сейчас и последние события; фильтр platform |
GET /v1/apps/{app_id}/events | Свои события периода: события и люди по каждому имени, с прошлым периодом |
GET /v1/apps/{app_id}/events/{event_name} | Одно событие: итоги, ряд по часам, дням, неделям или месяцам и ключи свойств периода |
GET /v1/apps/{app_id}/events/{event_name}/breakdown | Разбивка события по значениям одного свойства: события и люди по значению, строки «остальные» и «нет свойства» |
GET /v1/apps/{app_id}/profiles | Поиск людей по точному user_id или install_id |
GET /v1/apps/{app_id}/profiles/{person_key} | Профиль и лента сессий |
GET /v1/apps/{app_id}/profiles/{person_key}/events | Свои события человека со свойствами, новые первыми |
GET /v1/apps/{app_id}/integration/health | Первое событие, принятые и отклонённые события по часам, причины отказов, версии клиентов |
POST /v1/apps/{app_id}/deletion-requests | Удаление данных человека (scope delete) |
GET /v1/apps/{app_id}/deletion-requests/{request_id} | Статус запроса на удаление (scope read или delete) |
Сессии в профиле листаются курсором: sessions_limit (до 500) и before — значение next_before
из предыдущего ответа. Остальные списки отдаются целиком.
Свои события
Операции событий работают со своими событиями приложения. Системные события
(session_start, session_end) в них не входят: запрос с таким именем отвечает 404 event_not_found, а
событие без вхождений за период — 200 с нулями.
listEventsотдаёт имена, у которых есть события за период, по убыванию числа событий, затем по имени, не больше 500 имён;truncatedравенtrue, если их было больше.prev_eventsиprev_peopleесть только приcompare=previous_period.getEventReportпринимаетgranularity(hour,day,week,month), как ряд аудитории.events_per_personокругляется до двух знаков и равен0, если событие никто не совершал.getEventBreakdownтребуетproperty— ключ по шаблону^[a-z][a-z0-9_]{0,63}$— и принимаетlimitот 1 до 100 (по умолчанию 20). Сначала идут топ-значения;otherсуммирует события остальных значений и считает их людей без повторов, аmissingописывает события без свойства.listProfileEventsлистается курсором, как сессии профиля:limit(от 1 до 200, по умолчанию 50) иbefore— значениеnext_beforeпредыдущей страницы.
curl -sS -G "https://api.analytics.example.com/v1/apps/$APP_ID/events/purchase/breakdown" \
-H "Authorization: Bearer $AM_SK" \
--data-urlencode "from=2026-10-06" \
--data-urlencode "to=2026-10-12" \
--data-urlencode "property=plan"Ошибки и лимиты
Ошибки приходят в конверте error с полями code, message и request_id, как в ingest (см.
Ошибки и повторы).
| HTTP | Код | Причина |
|---|---|---|
| 400 | invalid_request | Неверный параметр; поле — в details.field |
| 400 | range_too_large | Период больше 366 дней или больше 7 дней для granularity=hour |
| 401 | unauthenticated | Нет ключа, ключ неверный или отозван |
| 403 | insufficient_scope | У ключа нет нужного scope |
| 404 | app_not_found | Приложения нет или ключ к нему не привязан |
| 404 | event_not_found | Имя — системное событие, а не своё |
| 429 | rate_limited | Больше 10 запросов в секунду на ключ (кратковременно до 30); ответ с Retry-After |
| 503 | storage_unavailable | Хранилище недоступно; ответ с Retry-After |
В дашборде у каждого отчёта аудитории есть кнопка «Скопировать как запрос к Read API» — она кладёт в буфер готовую команду curl с текущим периодом и фильтрами.
Приватность и GDPR
Какие данные хранятся, сколько и как удалить данные пользователя по запросу.
Ingest a batch of events (1..500) POST
Validates, enriches (geo, default context) and writes the events. Invalid events do not fail the batch: they are listed in `rejected`. The whole batch is rejected only on batch-level errors (400/401/403/413/415/429/503).