Публічний API & ключі API

Програмний доступ до робочого простору — читання проєктів, сеансів, власних подій і сегментів, а також додавання ідентифікаторів клієнтів до сеансів — захищений ключами API, обмеженими робочим простором.

1. Огляд

API MousePlayer дає змогу отримувати дані з робочого простору для власних панелей показників, сховища даних чи внутрішніх інструментів. Окрім додавання ідентифікаторів клієнтів до сеансів (identify, потрібен ключ із правом запису, див. «Області доступу ключів»), він працює лише для читання: через API неможливо змінити чи видалити дані.

  • Базовий URL: https://www.mouseplayer.com/api/v1/
  • Усі відповіді у форматі JSON.
  • Кожен запит автентифікується ключем API й автоматично обмежується робочим простором цього ключа — ключ одного простору ніколи не побачить даних іншого, навіть випадково.
  • Повний запис для відтворення сеансу (рухи миші, знімки DOM) не надається через API. Ви отримуєте метадані сеансів, перегляди сторінок, власні події й сегменти — достатньо для звітів і панелей показників без передавання необроблених даних відтворення.

2. Автентифікація

Створюйте ключі API й керуйте ними в розділі Ключі 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_Читання й запис. Усе перелічене вище, а також додавання ідентифікаторів клієнтів через кінцеву точку ідентифікації.
Виберіть область доступу під час створення ключа; за замовчуванням — лише читання. Використання ключа лише для читання з кінцевою точкою запису повертає 403 з повідомленням про тип ключа й потрібний доступ. Надалі область змінити неможливо — створіть новий ключ і відкличте старий.

3. Обмеження частоти запитів

Кожен ключ API обмежено 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. Додавання ідентифікатора клієнта із сервера

Браузер часто не знає, хто перед ним. У продукті 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}}

Тоді ідентифікатор з’являється в списку сеансів, стає доступним для пошуку, а вебхук session_identified спрацьовує — так він і потрапляє до CRM.

Повторний виклик із тим самим ідентифікатором безпечний. У відповіді повертається "changed": false і вебхук не надсилається. Повторне замовлення не створює другого ліда.
СтатусКоли
400Відсутнє поле, user_id довше за 128 символів або містить керівні символи. Ми відхиляємо, а не обрізаємо — непомітно скорочений ідентифікатор ні з чим не зіставиться у вашій 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Коли сеанс уперше отримує ідентифікатор клієнта — з браузера або API
session_endedОдин раз, коли сеанс закривається
goal_reachedОдин раз на сеанс, коли власна подія виконує одну з ваших цілей. Лише цілі типу «подія» — цілі 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_) можуть лише додавати ідентифікатори клієнтів; жоден ключ не може видаляти дані чи експортувати необроблені дані відтворення.
  • Кожен запит автоматично обмежено власним робочим простором ключа — неможливо передати ідентифікатор іншого простору й побачити чужі дані.
  • Відкликайте ключ будь-коли в розділі /api-keys; відкликання діє негайно.
  • Поводьтеся з ключем API як із паролем. Якщо випадково додасте його до публічного репозиторію, негайно відкличте й створіть новий.

Обмежені сторінки подій (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 автентифікованих запитів на ключ API за хвилину. Вичерпання повертає 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. Діють додаткові перевірки доступності native-preview. Ніколи не вбудовуйте постійні ключі API робочого простору в мобільний застосунок.