Быстрый старт
Как начать отправлять события session_start и session_end и свои события без SDK.
appmetrica.online принимает события приложений по HTTP. SDK не нужен: приложение само
отправляет session_start, когда выходит на передний план, и session_end, когда уходит в фон. По
этим двум системным событиям считаются сессии, их длительность и retention. Свои события со
свойствами, например purchase, отправляются в тех же батчах: приславший их человек считается
активным, а сами события видны в realtime, в профилях и на вкладке «События»; см.
Свои события.
1. Создайте приложение
В портфеле нажмите «Добавить приложение», выберите платформы и часовой пояс. Приложение — это один
продукт: если он выходит на iOS, Android и в вебе, отметьте все три платформы, а не создавайте три
приложения. Часовой пояс задаёт границы суток в отчётах; если сменить его позже, прошлые дни
пересчитаются в новом поясе. На каждую платформу создаётся свой write-ключ
pk_…, а на вкладке «Интеграция» появятся ключи и готовые сниппеты по каждой платформе. Платформы
можно добавить позже в настройках приложения.
Write-ключ не секретный: он вшивается в приложение и виден любому, кто его разберёт. От злоупотреблений защищают лимиты частоты, а скомпрометированный ключ можно отозвать и выпустить новый.
2. Отправьте первое событие
Проверьте ключ из терминала. Подставьте его в переменную AM_PK:
export AM_PK="pk_…"и отправьте одно событие. В примерах документации стоит условный домен analytics.example.com:
замените i.analytics.example.com на адрес ingest своей установки, он есть на вкладке «Интеграция».
NOW=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
curl -sS https://i.analytics.example.com/v1/events \
-H "Content-Type: application/json" \
-H "X-App-Key: $AM_PK" \
--data-binary @- <<JSON
{
"sent_at": "$NOW",
"context": { "platform": "ios", "app_version": "1.0.0", "environment": "development" },
"events": [
{
"insert_id": "$(uuidgen | tr A-Z a-z)",
"name": "session_start",
"timestamp": "$NOW",
"install_id": "$(uuidgen | tr A-Z a-z)",
"session_id": "$(uuidgen | tr A-Z a-z)"
}
]
}
JSONОтвет 200 приходит только после записи в хранилище. accepted — число принятых событий,
rejected — отклонённые события с кодом причины, warnings — события, принятые с поправкой:
{ "accepted": 1, "rejected": [], "warnings": [], "server_time": "2026-10-14T09:15:02.318Z" }environment: "development" отделяет тестовые события от боевых: отчёты по умолчанию показывают
только production.
3. Встройте отправку в приложение
Аналитика создаётся один раз на процесс, а сессия следует за жизненным циклом всего приложения, а не отдельного экрана. Точки входа и хуки для каждой платформы собраны в разделе Где инициализировать метрику.
Затем выберите рецепт для своей платформы. В каждом есть хранение install_id, жизненный цикл сессии
и офлайн-очередь:
- iOS (Swift) — URLSession, Keychain, SwiftUI и UIKit;
- Android (Kotlin) — HttpURLConnection, SharedPreferences, ProcessLifecycleOwner;
- Веб (JavaScript) —
navigator.sendBeacon,localStorage; - React Native (TypeScript) —
fetch, Keychain и AsyncStorage,AppState; - Flutter (Dart) —
package:http, очередь в файле,WidgetsBindingObserverна телефонах и десктопе; - Kotlin Multiplatform — Ktor,
expect/actual, общий трекер для Android и iOS; - Боты и бэкенды — Telegram-боты, серверные сессии,
context.ip; - curl — все запросы из терминала: батчи, досыл, gzip, повторы, Read API;
- Go — клиент с повторами для бэкендов, CLI и cron-задач.
Встраиваете с помощью ИИ-агента? Дайте ему /llms.txt: инструкция по интеграции для
всех платформ в одном файле. В /llms-full.txt — вся документация одним
Markdown-файлом на английском.
4. Проверьте данные
На вкладке «Интеграция» видны последние события и ошибки отклонённых событий по версиям приложения. На вкладке «Realtime» событие появится в течение 10 секунд, на вкладке «Аудитория» — DAU и новые пользователи за выбранный период.
Платформа события
Одно приложение принимает события со всех своих платформ. Платформа события определяется по порядку:
context.platformсобытия или батча; контекст события перекрывает контекст батча;- платформа write-ключа, которым отправлен батч;
- единственная платформа приложения, если она одна;
- иначе
other, и ответ несёт предупреждениеplatform_missingс индексом события.
Ключи, созданные вместе с приложением, привязаны к своим платформам: вшейте в каждую сборку ключ её
платформы, и платформа определится даже без context.platform. В настройках можно выпустить ключ
«Любая платформа» — он удобен, когда одна кодовая база собирается под несколько платформ (Flutter,
React Native, Kotlin Multiplatform). С таким ключом передавайте context.platform в каждом батче.
Событие с платформой, которой нет в наборе приложения, принимается как есть.
Отчёты по умолчанию сводные и считают людей сквозь платформы — см. Люди на нескольких платформах.
Телевизоры, часы и планшеты
Набор платформ фиксирован: ios, android, web, macos, windows, linux, bot, server и
other. Любое другое значение, например tvos, отклоняется с кодом
invalid_field. Устройство без собственной платформы
отправляет события с платформой своего семейства ОС, своими device_type и os_name и ключом
платформы семейства: Apple TV — ключом iOS, Android TV — ключом Android.
| Устройство | platform | device_type | os_name |
|---|---|---|---|
| iPhone | ios | phone | iOS |
| iPad | ios | tablet | Как сообщает система: iPadOS или iOS |
| Apple TV | ios | tv | tvOS |
| Apple Watch | ios | watch | watchOS |
| Apple Vision Pro | ios | unknown | visionOS |
| Android-смартфон | android | phone | Android |
| Android-планшет | android | tablet | Android |
| Android TV, Google TV, Fire TV | android | tv | Android TV |
| Часы на Wear OS | android | watch | Wear OS |
| Веб-приложение на смарт-ТВ (Tizen, webOS) | web | tv | Tizen, webOS |
| Roku и другие ТВ-платформы | other | tv | Название ОС, например Roku OS |
Отчёты фильтруются по os_name, а не по device_type, поэтому у телевизоров и часов своё название ОС:
фильтр Android TV открывает отчёты только по телевизорам, а разбивка по типу устройства показывает
долю каждого типа. На устройствах Apple UIDevice.current.systemName уже возвращает tvOS или
visionOS. Как определить тип устройства:
- Swift:
UIDevice.current.userInterfaceIdiom, где.pad— планшет,.tv— телевизор, как в рецепте для iOS; - Kotlin:
resources.configuration.uiMode and Configuration.UI_MODE_TYPE_MASK, гдеUI_MODE_TYPE_TELEVISION— телевизор,UI_MODE_TYPE_WATCH— часы, как в рецепте для Android; - React Native:
DeviceInfo.getDeviceType()изreact-native-device-infoвозвращаетTv; - Flutter: на Android TV
systemFeaturesуAndroidDeviceInfoизdevice_info_plusсодержитandroid.software.leanback; - веб: user agent браузеров телевизоров содержит
SMART-TV,TizenилиWeb0S.
Что почитать дальше
- Где инициализировать метрику — точки входа и хуки жизненного цикла.
- Идентичность —
install_id,user_idи как считаются люди. - Сессии — когда начинать и заканчивать сессию.
- Свои события — имена и свойства своих событий.
- Время и офлайн-очередь — сбитые часы и досыл через 7 дней.
- Ошибки и повторы — коды ответа и что делать с каждым.
- Приватность и GDPR — что хранится и как удалить данные.
- Ingestion API — полный формат батча.
- Read API — те же отчёты для скриптов по ключу
sk_….