Адкрыты API & API-ключы

Праграмны доступ да прасторы — чытанне праектаў, сеансаў, уласных падзей і сегментаў, далучэнне ID кліентаў — з абаронай ключамі ўзроўню прасторы.

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. Кропкі API

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 спрацоўвае — так ID трапляе ў CRM.

Двойчы выклікаць з тым жа ID бяспечна. Адказ вяртаецца з "changed": false , вэбхук не адпраўляецца. Паўтор замовы не стварае другі лід.
СтатусКалі
400Адсутнічае поле, user_id даўжэй за 128 сімвалаў або мае кіруючыя сімвалы. Мы адхіляем, а не абразаем — скарочаны ID не супадзе ў CRM, але выглядаў бы поспехам.
404Сеанс не існуе або не належыць прасторы. Наўмысна адзін адказ для абодвух.
403План прасторы не ўключае API.

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

Вэбхукі наладжваюцца па праектах у раздзеле Інтэграцыі, дзе ёсць і сакрэт подпісу. Кожная дастаўка мае загалоўкі:

ЗагаловакЗначэнне
X-MousePlayer-EventНазва падзеі, напрыклад session_identified
X-MousePlayer-TimestampUnix-секунды — частка падпісанага тэксту
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 сімвалаў. Абрэзаныя параметры праз API недаступныя. Памяншэнне 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. Дзейнічаюць дадатковыя праверкі даступнасці. Ніколі не ўбудоўвайце пастаянныя ключы прасторы ў мабільную праграму.