Публичный API & API-ключи
Программный доступ к рабочему пространству — чтение проектов, сеансов, собственных событий и сегментов, присвоение ID клиентов сеансам — с API-ключами уровня рабочего пространства.
1. Обзор
API MousePlayer позволяет получать данные в свои панели, хранилища и инструменты. Кроме присвоения ID клиентов (identify, нужен ключ с записью, см. области ключей) он только для чтения: изменять и удалять данные через API нельзя.
- Базовый URL:
https://www.mouseplayer.com/api/v1/ - Все ответы — JSON.
- Каждый запрос авторизуется ключом и ограничен его рабочим пространством — ключ одного никогда не видит данные другого даже случайно.
- Полная запись сеанса (мышь, снимки DOM) не выдаётся через API. Доступны метаданные, просмотры, события и сегменты — достаточно для отчётов и панелей без передачи сырой записи.
2. Аутентификация
Создавайте и управляйте ключами в разделе API-ключи меню учётной записи (/api-keys). Только владельцы и администраторы создают и отзывают ключи.
Храните ключ в секрете. Он даёт чтение всего рабочего пространства. Полный ключ показан лишь раз после создания — сохраните в менеджере паролей или хранилище секретов. При потере отзовите и создайте новый.
Передавайте Bearer-токен в заголовке Authorization каждого запроса:
Отсутствующий, неверный или отозванный ключ получает ответ 401 :
Требование тарифа
REST API входит в тарифы Business и Enterprise . Используется тариф владельца рабочего пространства; приглашённые наследуют его. Проверка при каждом запросе, не только создании ключа — при понижении тарифа ключи перестают работать и возвращают 403.
Области ключей
Область видна в префиксе — действие ключа понятно по виду в .env, обращении или терминале.
| Префикс | Значение |
|---|---|
mp_ro_ | Только чтение. Читает проекты, сеансы, события и сегменты. Ничего не меняет. |
mp_rw_ | Чтение и запись. Всё выше плюс присвоение ID клиентов через identify. |
403 с описанием области ключа и требования эндпоинта. Позже область не меняется — создайте новый, отзовите старый.3. Ограничения частоты
На каждый ключ разрешено 60 запросов в минуту в скользящем окне. При превышении ответ 429 до освобождения окна:
Нужно больше? Обратитесь в поддержку и опишите задачу.
4. Эндпоинты
GET/api/v1/projects
Список всех проектов (отслеживаемых ресурсов) рабочего пространства.
GET/api/v1/projects/{channelid}/sessions
Записанные сеансы проекта, сначала новые. С пагинацией.
| Параметр запроса | Описание |
|---|---|
page | Номер страницы, по умолчанию 1. |
per_page | Результатов на страницу, по умолчанию 25, максимум 100. |
since | Только сеансы, начатые не раньше даты (YYYY-MM-DD). |
until | Только сеансы, начатые не позже даты. |
GET/api/v1/sessions/{session_id}
Метаданные одного сеанса и просмотры. Полная запись намеренно исключена — для неё плеер панели.
GET/api/v1/sessions/{session_id}/events
Собственные события сеанса (переданные через mp('event', ...)) с параметрами.
GET/api/v1/projects/{channelid}/segments
Сегменты посетителей проекта: проектные и всего рабочего пространства.
5. Присвоение ID клиента с сервера
Браузер часто не знает человека. В продукте B2B личность определяется после входа — на вашем сервере. В магазине — при подтверждении заказа. Эндпоинт именно для этого момента.
POST /api/v1/sessions/{session_id}/identify
Authorization: Bearer mp_live_xxxxxxxxxxxx
Content-Type: application/json
{"user_id": "customer-4711"}
// 200 OK
{"data": {"session_id": "s_a1b2c3", "user_id": "customer-4711",
"changed": true, "previous": null, "webhook_queued": true}}ID появляется в списке с поиском; срабатывает вебхук session_identified — так данные достигают CRM.
"changed": false без вебхука. Повтор заказа не создаёт второй лид.| Статус | Когда |
|---|---|
400 | Нет поля, user_id длиннее 128 символов или с управляющими символами. Отклоняем, не обрезаем — сокращённый ID ничего не найдёт в CRM, но выглядит успешным. |
404 | Сеанса нет или он не в вашем рабочем пространстве. Намеренно одинаковый ответ. |
403 | Тариф не включает API. |
6. Вебхуки: проверка подписи
Вебхуки настраиваются по проектам в Интеграциях, там же секрет подписи. Каждая доставка содержит заголовки:
| Заголовок | Значение |
|---|---|
X-MousePlayer-Event | Имя события, например session_identified |
X-MousePlayer-Timestamp | Секунды Unix — часть подписанного текста |
X-MousePlayer-Attempt | 1 при первой попытке, больше при повторе |
X-MousePlayer-Signature | sha256=<hex> |
Подпись — HMAC-SHA256 от timestamp + "." + raw body с секретом подписи проекта в качестве ключа.
// PHP $erwartet = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret); if (!hash_equals($erwartet, $signature)) { http_response_code(401); exit; } // Node const expected = 'sha256=' + crypto.createHmac('sha256', secret) .update(timestamp + '.' + rawBody).digest('hex');
Доставка и повторы
Неудачная доставка повторяется через 1 мин, 5 мин, 15 мин, 1 ч и 6 ч, затем прекращается. 4xx ответы, кроме 408 и 429 , не повторяются — означают "не так", а не "не сейчас". Отвечайте 2xx быстро и работайте после: время доставки ограничено 10 секундами.
Доступные события
| Событие | Когда |
|---|---|
session_identified | При первом присвоении сеансу ID клиента — из браузера или API |
session_ended | Один раз при закрытии сеанса |
goal_reached | Один раз за сеанс при достижении цели собственным событием. Только цели типа «event» — URL, длительность, просмотры и воронки не оцениваются. Содержит goal_id, goal_name, goal_value и currency. |
high_value_session | При первом за день превышении посетителем порога ценности проекта. Порог определяется по вашим оценкам (90-й процентиль последних 90 дней), не фиксирован, появляется после оценки минимум 20 посетителей. Содержит visitor_id, value_score, threshold и самый интересный для просмотра сеанс дня. |
funnel_dropoff | В конце сеанса, начавшего, но не завершившего воронку. Указывает последний шаг (dropped_at). Отток — отсутствие события, известно лишь после завершения. Не вошедшие в воронку сеансы не отток и не срабатывают. |
high_friction_session | Один раз за сеанс при первом достижении порога трения (по умолчанию 60 из 100). Содержит friction_score, признаки (reasons) и пересёкший порог признак (trigger). |
element_broken | Один раз, если элемент несколько дней не найден ни в одном проверенном просмотре — обычно после обновления сайта. Повтор лишь после восстановления и новой поломки. Событие не относится ни к одному сеансу: session_id и session_url имеют значение null, link_url открывает метку, а subject_id обозначает метку — одинаково для всех версий, поэтому повторная поломка нового селектора присоединяется к открытому инциденту. Содержит rule_id, rule_name, selector, page, checked_page_views, window_days и last_matched. Без данных посетителей. |
element_recovered | Восстановление после element_broken: когда метка снова нашла элемент — недостаточного числа просмотров недостаточно. Отправляется лишь если element_broken был доставлен вебхуком; отдельного переключателя нет: подписка на element_broken включает и его. Тот же subject_id позволяет PagerDuty разрешить инцидент, Opsgenie — закрыть оповещение. Дополнительно содержит matched_page_views и checked_page_views . |
anomaly_detected | Один раз в день при явном отличии вчера от предыдущих 28 дней: намного меньше или больше сеансов, падение целей, рост трения или ошибок JS. Те же метрика и направление молчат неделю (настраивается). Не относится ни к одному сеансу: session_id и session_url имеют значение null, link_url открывает обзор, а subject_id обозначает метрику, направление и день. Содержит metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score и читаемые summary и hint. Без данных посетителей. Для Web Vitals measurements заменяет sessions, а page (пусто для всего сайта) и device (desktop или mobil) указывают место; link_url затем открывает вкладку Web Vitals. |
rage_click | При яростном клике |
error_detected | При исключении интерфейса |
ce | Общая подписка на ваши события. Она не включает события выше — у них свои переключатели. |
7. Ошибки & коды статуса
| Статус | Значение |
|---|---|
200 | Успех. |
401 | Отсутствующий, неверный или отозванный API-ключ. |
404 | Проект или сеанс не существует либо не в вашем рабочем пространстве. |
429 | Превышен лимит — более 60 запросов/минуту с ключом. |
403 | Тариф не включает REST API. Сообщение называет нужный и текущий тарифы. |
8. Безопасность
- Ключи чтения (mp_ro_) ничего не меняют. Ключи записи (mp_rw_) лишь присваивают ID; ни один не удаляет данные и не экспортирует сырые записи.
- Каждый запрос ограничен пространством ключа — нельзя передать другой ID и увидеть чужие данные.
- Отозвать ключ можно в /api-keys; отзыв действует немедленно.
- Обращайтесь с ключом как с паролем. Если случайно внесли в публичный репозиторий, сразу отзовите и создайте новый.
Ограниченные страницы событий (API v1, 14 октября 2026)
GET /api/v1/sessions/{session_id}/events по умолчанию возвращает до 100 событий. per_page — целое от 1 до 100. Передавайте pagination.next_cursor как cursor без изменения в следующем запросе; сохраняйте сеанс и рабочее пространство. Порядок по created_at и event_id. Курсоры подписаны и связаны с сеансом и пространством. Общего числа и числовой страницы нет.
Массив data и карта params сохранены. pagination.returned — фактически возвращённое число; pagination.has_more — наличие следующей страницы; next_cursor — null при завершении. Ответ до 524288 байт, поэтому событий может быть меньше per_page. На событие до 128 строк параметров; params_truncated — true при превышении. Строковые параметры по-прежнему до 255 символов базы. Обрезанные параметры через эндпоинт недоступны. Сокращение per_page не повышает лимит параметров.
Неверный размер страницы, изменённый или чужой курсор дают 400. Слишком большое отдельное событие — 413. Проверки доступа по-прежнему дают 401, 403, 404 или 409 по ситуации.
Лимит остаётся 60 авторизованных запросов на ключ в минуту. Превышение — 429 с Retry-After: 60. При недоступности Redis или ограничителя — 503 с Retry-After: 5, без пропуска безлимитных запросов. Соблюдайте Retry-After и случайную задержку; не повторяйте плотным циклом. Сбой базы событий тоже даёт 503. Курсор не фиксирует снимок: параллельные вставки со старым временем могут требовать нового сканирования.
GET /api/v1/sessions/s_example/events?per_page=25 GET /api/v1/sessions/s_example/events?per_page=25&cursor=SIGNED_CURSOR
/api/v1/native — серверный управляющий маршрут только Dev для предпросмотра нативного SDK. В рабочей среде отключён. Серверным Bearer-ключам нужно чтение для list/replay и запись для register/grant/delete/disable. Действуют дополнительные проверки доступности предпросмотра. Никогда не встраивайте постоянные ключи рабочего пространства в мобильное приложение.