Publiczne API i Klucze API

Programistyczny dostęp do Twojego Workspace — odczyt projektów, sesji, Custom Events i segmentów oraz przypisywanie identyfikatorów klientów do sesji — zabezpieczony kluczami API przypisanymi do konkretnego Workspace.

1. Przegląd

API MousePlayer pozwala pobierać dane z Twojego Workspace do własnych dashboardów, hurtowni danych lub wewnętrznych narzędzi. Poza przypisywaniem identyfikatorów klientów do sesji (identify, wymaga klucza z prawem zapisu, zob. zakresy kluczy) jest ono tylko do odczytu: przez API nie można zmieniać ani usuwać danych.

  • Bazowy URL: https://www.mouseplayer.com/api/v1/
  • Wszystkie odpowiedzi są w formacie JSON.
  • Każde zapytanie jest uwierzytelniane kluczem API i automatycznie ograniczone do Workspace, do którego ten klucz należy — klucz z jednego Workspace nigdy nie zobaczy danych innego, nawet przez przypadek.
  • Pełne nagranie Session Replay (ruchy myszy, snapshoty DOM) nie jest udostępniane przez API. Otrzymujesz metadane sesji, pageviews, Custom Events i segmenty — wystarczająco, by budować raporty i dashboardy bez przesyłania surowego payloadu nagrania.

2. Uwierzytelnianie

Twórz i zarządzaj kluczami API w sekcji Klucze API w menu konta (/api-keys). Tylko właściciele i administratorzy Workspace mogą tworzyć lub unieważniać klucze.

Trzymaj swój klucz w tajemnicy. Daje on dostęp do odczytu wszystkiego w Twoim Workspace. Pełny klucz jest pokazywany dokładnie raz, zaraz po utworzeniu — zapisz go w menedżerze haseł lub innym bezpiecznym miejscu. Jeśli go zgubisz, unieważnij go i utwórz nowy.

Wysyłaj klucz jako token Bearer w nagłówku Authorization każdego zapytania:

# Lista projektów w Twoim Workspace curl -H "Authorization: Bearer mp_live_..." \ https://www.mouseplayer.com/api/v1/projects

Brakujący, błędny lub unieważniony klucz zwraca odpowiedź 401:

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

Wymagany plan

REST API jest częścią planów Business i Enterprise. Liczy się plan właściciela Workspace — zaproszeni członkowie zespołu go dziedziczą. Sprawdzenie odbywa się przy każdym zapytaniu, nie tylko przy tworzeniu klucza: po obniżeniu planu istniejące klucze zwracają 403.

Zakres uprawnień kluczy

Każdy klucz niesie swój zakres we własnym prefiksie. Po samym kluczu widać, co wolno mu zrobić — w .env, w zgłoszeniu, w terminalu.

PrefiksZnaczenie
mp_ro_Tylko odczyt. Czyta projekty, sesje, zdarzenia i segmenty. Niczego nie zmienia.
mp_rw_Odczyt i zapis. Wszystko powyżej oraz dołączanie identyfikatorów klienta przez endpoint identify.
Zakres wybiera się przy tworzeniu klucza; domyślnie jest to tylko odczyt. Klucz tylko do odczytu użyty na endpoincie zapisującym otrzyma 403 z komunikatem, który podaje, czym jest klucz i czego wymaga endpoint. Zakresu nie da się później zmienić — utwórz nowy klucz i unieważnij stary.

3. Limity zapytań (Rate Limits)

Każdy klucz API jest ograniczony do 60 zapytań na minutę, liczonych w kroczącym oknie czasowym. Po przekroczeniu tego limitu zapytania otrzymują odpowiedź 429, aż okno się zresetuje:

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

Budujesz coś, co potrzebuje wyższego limitu? Napisz do nas przez Wsparcie i opisz swój przypadek użycia.

4. Endpointy

GET/api/v1/projects

Zwraca listę wszystkich projektów (śledzonych Property) w Twoim Workspace.

{ "data": [ { "channelid": "955a45df5ee842cb", "domain": "twojadomena.pl", "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

Zwraca listę sesji odwiedzających zarejestrowanych dla projektu, od najnowszych. Paginowane.

Parametr zapytaniaOpis
pageNumer strony, domyślnie 1.
per_pageWyników na stronę, domyślnie 25, maks. 100.
sinceTylko sesje od tej daty (YYYY-MM-DD).
untilTylko sesje do tej daty.
{ "data": [ { "session_id": "s_kfmist058_1785795295504", "visitor_id": "v_sv90jdpzo_1785795296042", "custom_user_id": null, "country": "PL", "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}

Metadane pojedynczej sesji wraz z jej pageviews. Pełny payload nagrania jest celowo pominięty — użyj do tego Playera w dashboardzie.

{ "data": { "session_id": "s_kfmist058_1785795295504", "channelid": "955a45df5ee842cb", "visitor_id": "v_sv90jdpzo_1785795296042", "country": "PL", "asn_org": "Orange Polska", "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://twojadomena.pl/cennik", "page_title": "Cennik", "start_time": "2026-08-04 00:14:56", "end_time": "2026-08-04 00:16:41" } ] } }

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

Custom Events wywołane w trakcie sesji (te same, które wysyłasz przez mp('event', ...)), wraz z ich parametrami.

{ "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

Zwraca listę segmentów odwiedzających zdefiniowanych dla projektu (zarówno specyficznych dla projektu, jak i wspólnych dla całego Workspace).

{ "data": [ { "segment_id": 4, "name": "Odwiedzający z wysoką intencją zakupu", "description": "Pageviews > 5", "badge_color": "cyan", "is_global": 0, "created_at": "2026-08-03 00:00:43" } ] }

5. Dołączanie identyfikatora klienta z własnego backendu

Przeglądarka często w ogóle nie wie, kto przy niej siedzi. W produkcie B2B tożsamość jest znana dopiero po zalogowaniu — a to dzieje się w backendzie. W sklepie dopiero przy potwierdzeniu zamówienia. Dokładnie na ten moment jest ten endpoint.

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}}

Identyfikator pojawia się następnie na liście sesji, można go tam wyszukiwać, a webhook session_identified zostaje wysłany — tak trafia do Twojego CRM.

Dwukrotne wywołanie z tym samym identyfikatorem jest bezpieczne. Odpowiedź wraca z "changed": false i webhook nie zostaje wysłany. Powtórzone zamówienie nie tworzy drugiego leada.
StatusKiedy
400Brak pola, user_id dłuższe niż 128 znaków albo znaki sterujące. Odrzucamy zamiast skracać — po cichu skrócony identyfikator nie pasuje do żadnego rekordu w CRM, a mimo to wygląda jak sukces.
404Sesja nie istnieje albo nie należy do Twojego Workspace. Celowo ta sama odpowiedź w obu przypadkach.
403Plan Workspace nie obejmuje API.

6. Webhooki: weryfikacja podpisu

Webhooki konfiguruje się per projekt w sekcji Integracje; tam znajduje się też sekret podpisu. Każda dostawa niesie te nagłówki:

NagłówekZnaczenie
X-MousePlayer-EventNazwa zdarzenia, np. session_identified
X-MousePlayer-TimestampSekundy uniksowe — część podpisywanego tekstu
X-MousePlayer-Attempt1 przy pierwszej próbie, więcej przy ponowieniach
X-MousePlayer-Signaturesha256=<hex>

Podpis to HMAC-SHA256 z timestamp + "." + surowe ciało, kluczowany sekretem podpisu Twojego projektu.

// 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');
Podpisuj surowe ciało, przed jakimkolwiek parsowaniem JSON. Ponowna serializacja zmienia kolejność kluczy i białe znaki, a podpis nigdy się nie zgodzi. Odrzucaj też wszystko, czego timestamp jest starszy niż kilka minut — po to on jest.

Dostarczanie i ponowienia

Nieudana dostawa jest ponawiana po 1 min, 5 min, 15 min, 1 h i 6 h, potem porzucana. Odpowiedzi 4xx inne niż 408 i 429 nie są ponawiane — mówią "nie w ten sposób", a nie "nie teraz". Odpowiadaj szybko 2xx i pracuj potem; dostawa wygasa po 10 sekundach.

Dostępne zdarzenia

ZdarzenieKiedy
session_identifiedGdy sesja po raz pierwszy otrzymuje identyfikator klienta — z przeglądarki lub z API
session_endedRaz, gdy sesja się kończy
goal_reachedRaz na sesję, gdy custom event spełnia jeden z Twoich celów. Tylko cele typu „event" — cele URL, czasu, odsłon i lejka nie są tu oceniane. Zawiera goal_id, goal_name, goal_value i currency.
high_value_sessionGdy odwiedzający po raz pierwszy w danym dniu przekroczy próg wartości tego projektu. Próg jest wyprowadzany z Twojego własnego rozkładu punktów (90. percentyl ostatnich 90 dni), a nie ustalony na sztywno, i nie istnieje, dopóki nie oceniono co najmniej 20 odwiedzających. Zawiera visitor_id, value_score, threshold oraz najbardziej wartą obejrzenia sesję tego dnia.
funnel_dropoffNa końcu sesji, która weszła do jednego z Twoich lejków, ale go nie ukończyła. Podaje krok, na którym się zatrzymała (dropped_at). Porzucenie to brak zdarzenia, więc można je stwierdzić dopiero po zakończeniu sesji. Sesje, które nigdy nie weszły do lejka, nie są porzuceniami i niczego nie wyzwalają.
high_friction_sessionRaz na sesję, gdy jej wskaźnik frustracji po raz pierwszy osiągnie próg (domyślnie 60 na 100). Zawiera friction_score, sygnały, które go tworzą (reasons), oraz sygnał, który przekroczył próg (trigger).
element_brokenRaz, gdy zaznaczenie elementu przez kilka dni nie znalazło niczego w żadnym sprawdzonym wyświetleniu — zwykle po odświeżeniu strony. Ponownie dopiero wtedy, gdy znowu zacznie trafiać i ponownie przestanie. To zdarzenie nie należy do żadnej sesji: session_id i session_url mają wartość null, zamiast tego link_url otwiera zaznaczenie, a subject_id wskazuje zaznaczenie — to samo dla każdej wersji, więc nowy selektor, który znów przestaje trafiać, dołącza do otwartego incydentu. Zawiera rule_id, rule_name, selector, page, checked_page_views, window_days i last_matched. Bez danych odwiedzających.
element_recoveredOdwołanie alarmu dla element_broken: gdy zaznaczenie faktycznie znów znajdzie element — za mało wyświetleń nie wystarcza. Wysyłane tylko wtedy, gdy element_broken wyszło webhookiem, i bez osobnego przełącznika: subskrypcja element_broken je obejmuje. To samo subject_id, więc PagerDuty rozwiązuje incydent, a Opsgenie zamyka alert. Zawiera dodatkowo matched_page_views i checked_page_views.
anomaly_detectedRaz dziennie, gdy poprzedni dzień wyraźnie odbiegał od 28 dni wcześniej: dużo mniej lub dużo więcej sesji, spadek konwersji celów, więcej sesji z frustracją lub z błędami JS. Ten sam wskaźnik w tym samym kierunku nie zgłasza się potem przez tydzień (konfigurowalne). To zdarzenie nie należy do żadnej sesji: session_id i session_url są null, link_url otwiera przegląd projektu, a subject_id wskazuje wskaźnik, kierunek i dzień. Zawiera metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score oraz czytelne summary i hint. Bez danych odwiedzających. Przy Web Vitals zamiast sessions jest measurements, a page (puste dla całej witryny) i device (desktop lub mobil) mówią, gdzie to było; link_url otwiera wtedy zakładkę Web Vitals.
rage_clickPrzy wykrytym rage clicku
error_detectedPrzy błędzie front-endu
ceZbiorcza subskrypcja własnych custom events. Nie obejmuje powyższych zdarzeń — te mają własne przełączniki.

7. Błędy i kody statusu

StatusZnaczenie
200Sukces.
401Brakujący, błędny lub unieważniony klucz API.
404Żądany projekt lub sesja nie istnieje albo nie należy do Twojego Workspace.
429Przekroczono limit zapytań — wysyłasz tym kluczem więcej niż 60 zapytań/minutę.
403Plan Workspace nie obejmuje REST API. Komunikat podaje wymagany i obecny plan.

8. Uwagi dotyczące bezpieczeństwa

  • Klucze tylko do odczytu (mp_ro_) niczego nie zmieniają. Klucze z prawem zapisu (mp_rw_) mogą jedynie przypisywać identyfikatory klientów; żaden klucz nie może usuwać danych ani eksportować surowych danych nagrań.
  • Każde zapytanie jest automatycznie ograniczone do własnego Workspace klucza — nie ma możliwości podania innego Workspace ID i zobaczenia cudzych danych.
  • Możesz w każdej chwili unieważnić klucz w /api-keys; unieważnienie działa natychmiast.
  • Traktuj swój klucz API jak hasło. Jeśli przypadkowo umieścisz go w publicznym repozytorium, natychmiast go unieważnij i utwórz nowy.

Ograniczone strony zdarzen (API v1, 14 pazdziernika 2026)

GET /api/v1/sessions/{session_id}/events domyslnie zwraca do 100 zdarzen. per_page musi byc liczba calkowita od 1 do 100. Aby pobrac kolejna strone, przeslij pagination.next_cursor bez zmian jako cursor dla tej samej sesji i obszaru roboczego. Kolejnosc: created_at, nastepnie event_id. Kursory sa podpisane i przypisane do sesji oraz obszaru roboczego. Brak lacznej liczby wynikow i numeru strony.

Dotychczasowe data i mapa params pozostaja dostepne. pagination.returned oznacza liczbe zwroconych zdarzen; pagination.has_more wskazuje kolejna strone. Na koncu next_cursor jest null. Odpowiedz ma limit 524288 bajtow, dlatego moze zawierac mniej zdarzen niz per_page. Zdarzenie zawiera maksymalnie 128 wierszy parametrow; params_truncated=true oznacza dalsze parametry. Tekstowe wartosci zachowuja limit bazy danych: 255 znakow. Pominiete parametry nie sa dostepne przez ten endpoint. Zmniejszenie per_page nie zwieksza limitu parametrow.

Nieprawidlowa wielkosc strony, zmieniony kursor lub kursor innej sesji/obszaru roboczego zwracaja 400. Pojedyncze zbyt duze zdarzenie zwraca 413. Dotychczasowe kontrole dostepu nadal moga zwracac 401, 403, 404 lub 409.

Limit to nadal 60 uwierzytelnionych zapytan na klucz API na minute. Przekroczenie: 429 i Retry-After: 60. Gdy Redis lub kontrola limitu nie dziala: 503 i Retry-After: 5; API nie dziala wtedy bez ograniczen. Respektuj Retry-After, dodaj losowy odstep i unikaj ciasnej petli ponawiania. Blad bazy zdarzen rowniez zwraca 503. Kursor nie tworzy zamrozonego obrazu danych: rownolegle dodane zdarzenia ze starszym czasem moga wymagac ponownego odczytu.

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 to dostepna tylko w Dev trasa sterowania backendem podgladu Native SDK. W produkcji pozostaje wylaczona. Klucze Bearer backendu wymagaja read dla list/replay oraz write dla register/grant/delete/disable. Obowiazuja dodatkowe kontrole dostepnosci podgladu. Nigdy nie umieszczaj stalych kluczy API obszaru roboczego w aplikacji mobilnej.