Javni API & API ključevi
Programski pristup radnom prostoru — čitajte projekte, sesije, prilagođene događaje i segmente te dodajte ID-jeve klijenata sesijama — zaštićen API ključevima ograničenim na radni prostor.
1. Pregled
MousePlayer API omogućava preuzimanje podataka iz radnog prostora u vlastite kontrolne ploče, skladište podataka ili interne alate. Osim dodavanja ID-jeva klijenata sesijama (identify, potreban ključ s opsegom pisanja, pogledajte Opsezi ključeva), služi samo za čitanje: putem API-ja nije moguće mijenjati ni brisati podatke.
- Osnovni URL:
https://www.mouseplayer.com/api/v1/ - Svi odgovori su JSON.
- Svaki zahtjev se autentificira API ključem i automatski ograničava na njegov radni prostor — ključ jednog radnog prostora nikad ne može vidjeti podatke drugog, čak ni slučajno.
- Potpun snimak reprodukcije sesije (pokreti miša, DOM snimci) nije dostupan putem API-ja. Dobijate metapodatke sesije, preglede stranica, prilagođene događaje i segmente — dovoljno za izvještaje i kontrolne ploče bez premještanja sirovih podataka reprodukcije.
2. Autentifikacija
Kreirajte i uređujte API ključeve pod API ključevi u meniju računa (/api-keys). Samo vlasnici i administratori radnog prostora mogu kreirati ili opozivati ključeve.
Čuvajte ključ u tajnosti. Omogućava čitanje svega u radnom prostoru. Cijeli ključ prikazuje se tačno jednom, odmah nakon kreiranja — sačuvajte ga u upravitelju lozinki ili trezoru tajni. Ako ga izgubite, opozovite ga i kreirajte novi.
Šaljite ključ kao Bearer token u zaglavlju Authorization svakog zahtjeva:
Nedostajući, neispravni ili opozvani ključevi dobijaju odgovor 401 sljedećeg oblika:
Potreban plan
REST API je dio planova Business i Enterprise u ponudi. Plan se uzima od vlasnika radnog prostora, pa ga pozvani članovi tima nasljeđuju. Provjera se izvršava pri svakom zahtjevu, ne samo pri kreiranju ključa — ako se plan radnog prostora smanji, postojeći ključevi prestaju raditi i vraćaju 403.
Opsezi ključeva
Svaki ključ nosi opseg u svom prefiksu, pa iz njega vidite šta radi — u datoteci .env, tiketu ili terminalu.
| Prefiks | Značenje |
|---|---|
mp_ro_ | Samo čitanje. Čita projekte, sesije, događaje i segmente. Ne može ništa promijeniti. |
mp_rw_ | Čitanje i pisanje. Sve iznad, uz dodavanje ID-jeva klijenata putem endpointa identifikacije. |
403 s porukom koja navodi šta ključ jeste i šta endpoint treba. Opseg se ne može naknadno mijenjati — kreirajte novi ključ i opozovite stari.3. Ograničenja učestalosti
Svaki API ključ je ograničen na 60 zahtjeva u minuti u pomičnom vremenskom prozoru. Kad prekoračite limit, zahtjevi dobijaju odgovor 429 dok se prozor ne oslobodi:
Razvijate nešto što treba veći limit? Javite se putem Podrške i opišite slučaj upotrebe.
4. Endpointi
GET/api/v1/projects
Navodi sve projekte (praćena svojstva) radnog prostora.
GET/api/v1/projects/{channelid}/sessions
Navodi snimljene sesije posjetilaca projekta, prvo najnovije. Paginirano.
| Parametar upita | Opis |
|---|---|
page | Broj stranice, podrazumijevano 1. |
per_page | Rezultata po stranici, podrazumijevano 25, najviše 100. |
since | Samo sesije koje počinju na ovaj datum ili poslije (YYYY-MM-DD). |
until | Samo sesije koje počinju na ovaj datum ili prije. |
GET/api/v1/sessions/{session_id}
Metapodaci jedne sesije i njeni pregledi stranica. Namjerno bez potpunih podataka reprodukcije — za to koristite plejer kontrolne ploče.
GET/api/v1/sessions/{session_id}/events
Prilagođeni događaji sesije (isti koje šaljete pomoću mp('event', ...)), uključujući parametre.
GET/api/v1/projects/{channelid}/segments
Navodi segmente posjetilaca definirane za projekt, i one posebne za projekt i one za cijeli radni prostor.
5. Dodavanje ID-ja klijenta iz backenda
Preglednik često ne zna ko je s druge strane. U B2B proizvodu identitet se utvrđuje nakon prijave — u backendu. U prodavnici se utvrđuje potvrdom narudžbe. Ovaj endpoint je upravo za taj trenutak.
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 se zatim pojavljuje u listi sesija, može se pretraživati i aktivira se webhook session_identified koji ga prenosi — tako stiže do CRM-a.
"changed": false i webhook se ne šalje. Ponovljena narudžba ne stvara drugog potencijalnog klijenta.| Status | Kada |
|---|---|
400 | Nedostaje polje, user_id ima preko 128 znakova ili sadrži kontrolne znakove. Odbijamo umjesto skraćivanja — tiho skraćen ID ne odgovara ničemu u CRM-u, a i dalje izgleda kao uspjeh. |
404 | Sesija ne postoji ili ne pripada vašem radnom prostoru. Namjerno isti odgovor za oboje. |
403 | Plan radnog prostora ne uključuje API. |
6. Webhookovi: provjera potpisa
Webhookovi se postavljaju po projektu pod Integracije, gdje je i tajna potpisivanja. Svaka dostava nosi ova zaglavlja:
| Zaglavlje | Značenje |
|---|---|
X-MousePlayer-Event | Naziv događaja, npr. session_identified |
X-MousePlayer-Timestamp | Unix sekunde — dio potpisanog teksta |
X-MousePlayer-Attempt | 1 pri prvom pokušaju, više pri ponovnim pokušajima |
X-MousePlayer-Signature | sha256=<hex> |
Potpis je HMAC-SHA256 nad timestamp + "." + raw body, s tajnom potpisivanja projekta kao ključem.
// 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');
Dostava i ponovni pokušaji
Neuspjela dostava ponavlja se nakon 1 min, 5 min, 15 min, 1 h i 6 h pa se odustaje. Odgovori 4xx koji nisu 408 ili 429 ne podliježu ponovnim pokušajima — znače "ne ovako", ne "ne sada". Odgovorite 2xx brzo i obavite posao poslije; dostava ističe nakon 10 sekundi.
Dostupni događaji
| Događaj | Aktivira se |
|---|---|
session_identified | Kad sesija prvi put dobije ID klijenta — iz preglednika ili API-ja |
session_ended | Jednom, pri zatvaranju sesije |
goal_reached | Jednom po sesiji kad prilagođeni događaj ostvari jedan cilj. Samo ciljevi vrste „event“ — URL, trajanje, pregledi stranica i lijevci se ne procjenjuju. Nosi goal_id, goal_name, goal_value i currency. |
high_value_session | Kad posjetilac prvi put u danu pređe prag vrijednosti ovog projekta. Prag je izveden iz vaše raspodjele bodova (90. percentil posljednjih 90 dana), ne fiksan broj i ne postoji dok se ne boduje najmanje 20 posjetilaca. Nosi visitor_id, value_score, threshold i sesiju tog dana koju najviše vrijedi pogledati. |
funnel_dropoff | Na kraju sesije koja je ušla u jedan lijevak, ali ga nije završila. Navodi korak na kojem je stala (dropped_at). Odustajanje je odsustvo događaja pa se može znati tek po završetku sesije. Sesije koje nisu ušle u lijevak nisu odustajanja i ne aktiviraju ga. |
high_friction_session | Jednom po sesiji kad bodovi trenja prvi put dosegnu prag (podrazumijevano 60 od 100). Nosi friction_score, signale iza njih (reasons) i signal koji je prešao granicu (trigger). |
element_broken | Jednom, kad praćeni element više dana ništa ne pronalazi ni u jednom provjerenom pregledu stranice — obično nakon ponovnog lansiranja. Ponovo se aktivira samo kad je oznaka odgovarala pa se opet pokvarila. Ovaj događaj ne pripada nijednoj sesiji: session_id i session_url su null, link_url umjesto toga otvara oznaku, a subject_id imenuje oznaku — isto za svaku verziju, pa se novi selektor koji opet zakaže pridružuje otvorenom incidentu. Nosi rule_id, rule_name, selector, page, checked_page_views, window_days i last_matched. Bez podataka posjetilaca. |
element_recovered | Obavijest o oporavku za element_broken: kad oznaka stvarno ponovo nađe element — premalo pregleda stranica nije dovoljno. Šalje se samo ako je element_broken poslan webhookom i nema vlastiti prekidač: pretplata na element_broken uključuje i njega. Isti identifikator subject_id omogućava da PagerDuty riješi incident i Opsgenie zatvori upozorenje. Nosi matched_page_views i checked_page_views dodatno. |
anomaly_detected | Jednom dnevno kad se jučerašnji dan jasno razlikovao od prethodnih 28: mnogo manje ili više sesija, pad stope ciljeva, više sesija s trenjem ili JS greškama. Ista metrika i smjer miruju sedmicu (podesivo). Ovaj događaj ne pripada nijednoj sesiji: session_id i session_url su null, link_url otvara pregled projekta, a subject_id imenuje metriku, smjer i dan. Nosi metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score i čitljivi summary i hint. Bez podataka posjetilaca. Za Web Vitals, measurements zamjenjuje sessions, a page (prazno za cijeli sajt) i device (desktop ili mobil) govore gdje se desilo; link_url tada otvara karticu Web Vitals. |
rage_click | Pri otkrivenom kliku iz bijesa |
error_detected | Pri frontend izuzetku |
ce | Zajednička pretplata za vaše prilagođene događaje. Ona ne uključuje događaje iznad — imaju vlastite prekidače. |
7. Greške & statusni kodovi
| Status | Značenje |
|---|---|
200 | Uspjeh. |
401 | Nedostajući, neispravan ili opozvan API ključ. |
404 | Traženi projekt ili sesija ne postoji ili ne pripada vašem radnom prostoru. |
429 | Prekoračen limit učestalosti — šaljete više od 60 zahtjeva/minutu ovim ključem. |
403 | Plan radnog prostora ne uključuje REST API. Poruka navodi potreban i trenutni plan. |
8. Sigurnosne napomene
- Ključevi čitanja (mp_ro_) ne mogu ništa mijenjati. Ključevi pisanja (mp_rw_) mogu samo dodati ID-jeve klijenata; nijedan ključ ne može brisati podatke ili izvoziti sirove podatke reprodukcije.
- Svaki zahtjev automatski je ograničen na radni prostor ključa — nema načina da pošaljete drugi ID radnog prostora i vidite tuđe podatke.
- Opozovite ključ bilo kada sa /api-keys; opoziv djeluje odmah.
- Tretirajte API ključ kao lozinku. Ako ga slučajno pohranite u javni repozitorij, odmah ga opozovite i kreirajte novi.
Ograničene stranice događaja (API v1, 14. oktobra 2026)
GET /api/v1/sessions/{session_id}/events podrazumijevano vraća do 100 događaja. Postavite per_page na cijeli broj od 1 do 100. Pratite pagination.next_cursor slanjem nepromijenjenog cursor u sljedećem zahtjevu; zadržite istu sesiju i radni prostor. Događaji se redaju po created_at i event_id. Kursori su potpisani i vezani za sesiju i radni prostor. Ne vraća se ukupan broj niti numerička stranica.
Postojeći niz data i mapa params ostaju dostupni. pagination.returned je stvarno vraćeni broj; pagination.has_more označava još jednu stranicu. next_cursor je null kad je gotovo. Odgovor je ograničen na 524288 bajtova pa stranica može sadržavati manje događaja od per_page. Po događaju se vraća najviše 128 redova parametara; params_truncated je true ako ih ima više. Pojedinačni tekstualni parametri zadržavaju ograničenje baze od 255 znakova. Skraćeni parametri nisu dostupni ovim endpointom. Smanjivanje per_page ne povećava limit parametara.
Nevažeće veličine stranica, izmijenjeni kursori i kursori druge sesije/radnog prostora vraćaju 400. Preveliki podaci pojedinačnog događaja vraćaju 413. Postojeće provjere pristupa i dalje vraćaju 401, 403, 404 ili 409 prema slučaju.
Ograničenje ostaje 60 autentificiranih zahtjeva po API ključu u minuti. Prekoračenje vraća 429 uz Retry-After: 60. Ako Redis ili limitator nije dostupan, zahtjevi vraćaju 503 uz Retry-After: 5; nikad se ne primaju bez limita. Poštujte Retry-After i dodajte nasumično odgađanje; ne pokušavajte u tijesnoj petlji. Greške baze događaja također vraćaju 503. Kursori ne zamrzavaju snimak stanja: istovremeni unosi sa starijim vremenskim oznakama mogu zahtijevati novo pretraživanje.
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 je backend kontrolna ruta samo za Dev pregled izvornog SDK-a. Ostaje isključena u produkciji. Backend Bearer ključevi trebaju opseg čitanja za list/replay i pisanja za register/grant/delete/disable. Važe dodatne provjere dostupnosti izvornog pregleda. Nikad ne ugrađujte trajne API ključeve radnog prostora u mobilnu aplikaciju.