Јавен API & API-клучеви

Програмски пристап до работниот простор — читајте проекти, сесии, приспособени настани и сегменти и додавајте ID на клиенти во сесии — заштитен со API-клучеви ограничени на работниот простор.

1. Преглед

API на MousePlayer ви овозможува да преземате податоци од работниот простор во сопствени контролни табли, складиште на податоци или внатрешни алатки. Освен додавање ID на клиенти во сесии (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_Читање и запишување. Сè погоре, плус додавање ID на клиенти преку крајната точка за идентификација.
Изберете го опсегот при создавање на клучот; стандардно е само за читање. Користење клуч само за читање на крајна точка за запишување враќа 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. Додавање 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-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Еднаш по сесија, кога приспособен настан исполнува една од вашите цели. Само цели од тип „настан“ — цели со 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-клучот како лозинка. Ако случајно го зачувате во јавно складиште за код, веднаш отповикајте го и создајте нов.

Ограничени страници со настани (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. Важат дополнителни проверки за достапност на изворниот преглед. Никогаш не вградувајте трајни API-клучеви на работниот простор во мобилна апликација.