Публичный 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 каждого запроса:

# List projects in your workspace curl -H "Authorization: Bearer mp_live_..." \ https://www.mouseplayer.com/api/v1/projects

Отсутствующий, неверный или отозванный ключ получает ответ 401 :

{ "error": "Invalid or missing API key. Use: Authorization: Bearer <key>" }

Требование тарифа

REST API входит в тарифы Business и Enterprise . Используется тариф владельца рабочего пространства; приглашённые наследуют его. Проверка при каждом запросе, не только создании ключа — при понижении тарифа ключи перестают работать и возвращают 403.

Области ключей

Область видна в префиксе — действие ключа понятно по виду в .env, обращении или терминале.

ПрефиксЗначение
mp_ro_Только чтение. Читает проекты, сеансы, события и сегменты. Ничего не меняет.
mp_rw_Чтение и запись. Всё выше плюс присвоение ID клиентов через identify.
Выберите область при создании; по умолчанию чтение. Ключ чтения на пишущем эндпоинте возвращает 403 с описанием области ключа и требования эндпоинта. Позже область не меняется — создайте новый, отзовите старый.

3. Ограничения частоты

На каждый ключ разрешено 60 запросов в минуту в скользящем окне. При превышении ответ 429 до освобождения окна:

{ "error": "Rate limit exceeded. Max 60 requests per minute." }

Нужно больше? Обратитесь в поддержку и опишите задачу.

4. Эндпоинты

GET/api/v1/projects

Список всех проектов (отслеживаемых ресурсов) рабочего пространства.

{ "data": [ { "channelid": "955a45df5ee842cb", "domain": "yourdomain.com", "status": "active", "total_traffic_bytes": 27304765, "created_at": "2026-07-19 22:06:39", "last_used": "2026-08-05 01:12:55" } ] }

GET/api/v1/projects/{channelid}/sessions

Записанные сеансы проекта, сначала новые. С пагинацией.

Параметр запросаОписание
pageНомер страницы, по умолчанию 1.
per_pageРезультатов на страницу, по умолчанию 25, максимум 100.
sinceТолько сеансы, начатые не раньше даты (YYYY-MM-DD).
untilТолько сеансы, начатые не позже даты.
{ "data": [ { "session_id": "s_kfmist058_1785795295504", "visitor_id": "v_sv90jdpzo_1785795296042", "custom_user_id": null, "country": "DE", "device_type": "desktop", "is_bot": 0, "start_time": "2026-08-04 00:14:56", "end_time": "2026-08-04 00:16:41", "duration_seconds": 105 } ], "pagination": { "page": 1, "per_page": 25, "total": 142, "total_pages": 6 } }

GET/api/v1/sessions/{session_id}

Метаданные одного сеанса и просмотры. Полная запись намеренно исключена — для неё плеер панели.

{ "data": { "session_id": "s_kfmist058_1785795295504", "channelid": "955a45df5ee842cb", "visitor_id": "v_sv90jdpzo_1785795296042", "country": "DE", "asn_org": "Deutsche Telekom AG", "referrer": "https://duckduckgo.com/", "device_type": "desktop", "start_time": "2026-08-04 00:14:56", "end_time": "2026-08-04 00:16:41", "duration_seconds": 105, "pageviews": [ { "pageview_id": 1199, "url": "https://yourdomain.com/pricing", "page_title": "Pricing", "start_time": "2026-08-04 00:14:56", "end_time": "2026-08-04 00:16:41" } ] } }

GET/api/v1/sessions/{session_id}/events

Собственные события сеанса (переданные через mp('event', ...)) с параметрами.

{ "data": [ { "event_id": 61, "pageview_id": 1199, "event_name": "add_to_cart", "created_at": "2026-08-04 00:14:59", "params": { "item_id": "SKU_98765", "price": 299.99 } } ] }

GET/api/v1/projects/{channelid}/segments

Сегменты посетителей проекта: проектные и всего рабочего пространства.

{ "data": [ { "segment_id": 4, "name": "High Intent Visitors", "description": "Pageviews > 5", "badge_color": "cyan", "is_global": 0, "created_at": "2026-08-03 00:00:43" } ] }

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.

Повтор с тем же ID безопасен. Ответ содержит "changed": false без вебхука. Повтор заказа не создаёт второй лид.
СтатусКогда
400Нет поля, user_id длиннее 128 символов или с управляющими символами. Отклоняем, не обрезаем — сокращённый ID ничего не найдёт в CRM, но выглядит успешным.
404Сеанса нет или он не в вашем рабочем пространстве. Намеренно одинаковый ответ.
403Тариф не включает API.

6. Вебхуки: проверка подписи

Вебхуки настраиваются по проектам в Интеграциях, там же секрет подписи. Каждая доставка содержит заголовки:

ЗаголовокЗначение
X-MousePlayer-EventИмя события, например session_identified
X-MousePlayer-TimestampСекунды Unix — часть подписанного текста
X-MousePlayer-Attempt1 при первой попытке, больше при повторе
X-MousePlayer-Signaturesha256=<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');
Подписывайте исходное тело до разбора JSON. Повторная сериализация меняет порядок и пробелы, подпись не совпадёт. Отклоняйте метки старше нескольких минут — для этого они и нужны.

Доставка и повторы

Неудачная доставка повторяется через 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. Действуют дополнительные проверки доступности предпросмотра. Никогда не встраивайте постоянные ключи рабочего пространства в мобильное приложение.