Javni API & API ključevi
Programski pristup radnom prostoru — čitanje projekata, sesija, prilagođenih događaja i segmenata, kao i dodavanje ID-jeva kupaca sesijama — zaštićen API ključevima sa opsegom radnog prostora.
1. Pregled
MousePlayer API omogućava preuzimanje podataka iz radnog prostora u vaše kontrolne table, skladište podataka ili interne alate. Osim dodavanja ID-jeva kupaca sesijama (identify zahteva ključ sa opsegom pisanja, pogledajte Opsezi ključeva), on je samo za čitanje: podaci ne mogu da se menjaju ili brišu preko API-ja.
- Osnovni URL:
https://www.mouseplayer.com/api/v1/ - Svi odgovori su JSON.
- Svaki zahtev se autentifikuje API ključem i automatski ograničava na radni prostor kome ključ pripada — ključ jednog radnog prostora nikada ne može da vidi podatke drugog, čak ni slučajno.
- Potpuni snimak sesije (pomeranja miša, DOM snimci) nije dostupan preko API-ja. Dobijate metapodatke sesije, prikaze stranica, prilagođene događaje i segmente — dovoljno za izveštaje i kontrolne table bez prenošenja sirovih podataka snimka.
2. Autentifikacija
Napravite API ključeve i upravljajte njima pod API ključevi u meniju naloga (/api-keys). Samo vlasnici i administratori radnog prostora mogu da prave ili opozivaju ključeve.
Čuvajte ključ u tajnosti. Daje pristup čitanju svega u radnom prostoru. Ceo ključ se prikazuje tačno jednom, odmah nakon pravljenja — sačuvajte ga u upravljaču lozinki ili trezoru tajni. Ako ga izgubite, opozovite ga i napravite novi.
Šaljite ključ kao Bearer token u zaglavlju Authorization svakog zahteva:
Nedostajući, neispravni ili opozvani ključevi dobijaju odgovor 401:
Zahtev plana
REST API je deo planova Business i Enterprise. Plan se preuzima od vlasnika radnog prostora, pa ga pozvani članovi tima nasleđuju. Provera se izvršava pri svakom zahtevu, ne samo pri pravljenju ključa — ako radni prostor pređe na niži plan, postojeći ključevi prestaju da rade i vraćaju 403.
Opsezi ključeva
Svaki ključ nosi opseg u svom prefiksu, pa možete da vidite šta radi samim pogledom — u .env, u tiketu, u terminalu.
| Prefiks | Značenje |
|---|---|
mp_ro_ | Samo čitanje. Čita projekte, sesije, događaje i segmente. Ne može ništa da menja. |
mp_rw_ | Čitanje i pisanje. Sve navedeno, uz dodavanje ID-jeva kupaca preko endpoint-a identify. |
403 uz poruku koja navodi šta ključ dozvoljava i šta endpoint zahteva. Opseg se ne može naknadno menjati — napravite novi ključ i opozovite stari.3. Ograničenja učestalosti
Svaki API ključ ograničen je na 60 zahteva u minuti, praćeno u kliznom vremenskom prozoru. Nakon prekoračenja, zahtevi dobijaju odgovor 429 dok se prozor ne oslobodi:
Pravite nešto što zahteva više ograničenje? Obratite se preko Podrške i opišite svoj slučaj upotrebe.
4. Endpoint-i
GET/api/v1/projects
Navodi sve projekte (praćene sajtove) u radnom prostoru.
GET/api/v1/projects/{channelid}/sessions
Navodi sesije posetilaca snimljene za projekat, prvo najnovije. Sa straničenjem.
| Parametar upita | Opis |
|---|---|
page | Broj stranice, podrazumevano 1. |
per_page | Rezultata po stranici, podrazumevano 25, najviše 100. |
since | Samo sesije koje počinju ovog datuma ili kasnije (YYYY-MM-DD). |
until | Samo sesije koje počinju ovog datuma ili ranije. |
GET/api/v1/sessions/{session_id}
Metapodaci jedne sesije uz njene prikaze stranica. Namerno izostavlja potpune podatke snimka — za njih koristite plejer kontrolne table.
GET/api/v1/sessions/{session_id}/events
Prilagođeni događaji pokrenuti tokom sesije (isti koje šaljete preko mp('event', ...)), uključujući parametre.
GET/api/v1/projects/{channelid}/segments
Navodi segmente posetilaca definisane za projekat (i segmente projekta i celog radnog prostora).
5. Dodavanje ID-ja kupca iz vašeg pozadinskog sistema
Pregledač često ne zna ko sedi za njim. U B2B proizvodu identitet se utvrđuje nakon prijave — u vašem pozadinskom sistemu. U prodavnici se utvrđuje pri potvrdi porudžbine. Ovaj endpoint služi upravo tom trenutku.
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 na listi sesija, tamo se može pretraživati i pokreće se webhook session_identified — tako stiže u vaš CRM.
"changed": false i webhook se ne šalje. Ponovljena porudžbina ne stvara drugog potencijalnog klijenta.| Status | Kada |
|---|---|
400 | Nedostajuće polje, user_id duže od 128 znakova ili sa kontrolnim znakovima. Odbijamo umesto da skratimo — neprimetno skraćen ID ne poklapa se ni sa čim u CRM-u, a i dalje izgleda kao uspeh. |
404 | Sesija ne postoji ili ne pripada vašem radnom prostoru. Namerno isti odgovor za oba slučaja. |
403 | Plan radnog prostora ne uključuje API. |
6. Webhook-ovi: provera potpisa
Webhook-ovi se podešavaju po projektu pod Integracije, gde se nalazi i tajna za potpisivanje. Svaka isporuka sadrži ova zaglavlja:
| Zaglavlje | Značenje |
|---|---|
X-MousePlayer-Event | Naziv događaja, npr. session_identified |
X-MousePlayer-Timestamp | Unix sekunde — deo 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, uz tajnu za potpisivanje vašeg projekta kao ključ.
// 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');
Isporuka i ponovni pokušaji
Neuspela isporuka pokušava se ponovo nakon 1 min, 5 min, 15 min, 1 h i 6 h, pa se odustaje. 4xx odgovori osim 408 i 429 se ne ponavljaju — znače "ne ovako", a ne "ne sada". Odgovorite sa 2xx brzo, a posao obavite posle; isporuka ističe nakon 10 sekundi.
Dostupni događaji
| Događaj | Pokreće se |
|---|---|
session_identified | Kada sesija prvi put dobije ID kupca — iz pregledača ili API-ja |
session_ended | Jednom, kada se sesija zatvori |
goal_reached | Jednom po sesiji, kada prilagođeni događaj ispuni neki vaš cilj. Samo ciljevi vrste „event“ — URL, trajanje, prikazi stranica i levci se ne procenjuju. Sadrži goal_id, goal_name, goal_value i currency. |
high_value_session | Kada posetilac prvi put pređe prag vrednosti ovog projekta određenog dana. Prag je izveden iz raspodele vaših bodova (90. percentil poslednjih 90 dana), a ne fiksni broj, i ne postoji dok najmanje 20 posetilaca ne bude bodovano. Sadrži visitor_id, value_score, threshold i sesiju tog dana koju najviše vredi pogledati. |
funnel_dropoff | Na kraju sesije koja je ušla u neki vaš levak, ali ga nije završila. Navodi korak na kome se zaustavila (dropped_at). Odustajanje je odsustvo događaja, pa se može utvrditi tek kada sesija završi. Sesije koje nikada nisu ušle u levak nisu odustajanja i ne pokreću događaj. |
high_friction_session | Jednom po sesiji, kada bodovi trenja prvi put dostignu prag (podrazumevano 60 od 100). Sadrži friction_score, signale iza njega (reasons) i signal koji je prešao granicu (trigger). |
element_broken | Jednom, kada praćeni element više dana nije pronašao ništa ni u jednom proverenom prikazu stranice — obično posle redizajna. Pokreće se ponovo tek kada se oznaka poklopi i još jednom prestane da radi. Ovaj događaj ne pripada nijednoj sesiji: session_id i session_url su null, link_url umesto toga otvara oznaku, a subject_id imenuje oznaku — isto za svaku verziju, pa se novi selektor koji ponovo prestane da radi pridružuje otvorenom incidentu. Sadrži rule_id, rule_name, selector, page, checked_page_views, window_days i last_matched. Bez podataka posetilaca. |
element_recovered | Obaveštenje o oporavku za element_broken: jednom kada oznaka zaista ponovo pronađe element — premalo prikaza stranica nije dovoljno. Šalje se samo ako je element_broken poslat webhook-om i nema svoj prekidač: pretplata na element_broken uključuje ga. Isti subject_id, pa PagerDuty rešava incident, a Opsgenie zatvara upozorenje. Dodatno sadrži matched_page_views i checked_page_views. |
anomaly_detected | Jednom dnevno, kada se jučerašnji dan jasno razlikovao od prethodnih 28 dana: mnogo manje ili više sesija, pad stope ciljeva, više sesija sa trenjem ili JS greškama. Isti pokazatelj i smer miruju nedelju dana (podesivo). Ovaj događaj ne pripada nijednoj sesiji: session_id i session_url su null, link_url otvara pregled projekta, a subject_id imenuje pokazatelj, smer i dan. Sadrži 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 čitljiv summary i hint. Bez podataka posetilaca. Za Web Vitals, measurements zamenjuje sessions, a page (prazno za ceo sajt) i device (desktop ili mobil) govore gde se dogodilo; link_url zatim otvara karticu Web Vitals. |
rage_click | Pri otkrivenom kliku iz frustracije |
error_detected | Pri izuzetku na klijentskoj strani |
ce | Zajednička pretplata na vaše prilagođene događaje. Ona ne uključuje navedene događaje — oni imaju svoje prekidače. |
7. Greške & statusni kodovi
| Status | Značenje |
|---|---|
200 | Uspešno. |
401 | Nedostajući, neispravan ili opozvan API ključ. |
404 | Traženi projekat ili sesija ne postoji ili ne pripada vašem radnom prostoru. |
429 | Ograničenje učestalosti prekoračeno — šaljete više od 60 zahteva/minut ovim ključem. |
403 | Plan radnog prostora ne uključuje REST API. Poruka navodi i potreban i trenutni plan. |
8. Bezbednosne napomene
- Ključevi samo za čitanje (mp_ro_) ne mogu ništa da menjaju. Ključevi pisanja (mp_rw_) mogu samo da dodaju ID-jeve kupaca; nijedan ključ ne može da briše podatke ili izvozi sirove podatke snimka.
- Svaki zahtev automatski je ograničen na radni prostor ključa — ne postoji način da se prosledi ID drugog radnog prostora i vide tuđi podaci.
- Opozovite ključ u bilo kom trenutku preko /api-keys; opoziv odmah stupa na snagu.
- Postupajte sa API ključem kao sa lozinkom. Ako ga slučajno komitujete u javni repozitorijum, odmah ga opozovite i napravite novi.
Ograničene stranice događaja (API v1, 14. oktobar 2026)
GET /api/v1/sessions/{session_id}/events podrazumevano vraća do 100 događaja. Postavite per_page na ceo broj od 1 do 100. Pratite pagination.next_cursor tako što šaljete cursor nepromenjen u sledećem zahtevu; zadržite istu sesiju i radni prostor. Događaji se ređaju po created_at i event_id. Kursori su potpisani i vezani za tu sesiju i radni prostor. Ne vraćaju se ukupan broj niti numerička stranica.
Postojeći data niz i params mapa ostaju dostupni. pagination.returned je stvarni vraćeni broj; pagination.has_more ukazuje na još jednu stranicu. next_cursor je null kada je završeno. Odgovor je ograničen na 524288 bajtova, pa stranica može da sadrži manje događaja od per_page. Po događaju vraća se 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 preko ovog endpoint-a. Smanjenje per_page ne povećava ograničenje parametara.
Nevažeće veličine stranica, izmenjeni kursori i kursori druge sesije/radnog prostora vraćaju 400. Preveliki podaci pojedinačnog događaja vraćaju 413. Postojeće provere pristupa i dalje vraćaju 401, 403, 404 ili 409 prema slučaju.
Ograničenje ostaje 60 autentifikovanih zahteva po API ključu u minuti. Iscrpljenje vraća 429 sa Retry-After: 60. Ako Redis ili ograničavač nije dostupan, zahtevi vraćaju 503 sa Retry-After: 5; nikada se ne propuštaju bez ograničenja. Poštujte Retry-After i dodajte nasumično produžavanje čekanja; ne ponavljajte u tesnoj petlji. Greške baze događaja takođe vraćaju 503. Kursori ne zamrzavaju presek: istovremeni unosi sa starijim vremenskim oznakama mogu zahtevati novo potpuno čitanje.
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 upravljačka ruta pozadinskog sistema samo za Dev pregled izvornog SDK-a. Ostaje isključena u produkciji. Backend Bearer ključevi zahtevaju opseg čitanja za list/replay i pisanja za register/grant/delete/disable. Važe dodatne provere dostupnosti izvornog pregleda. Nikada ne ugrađujte trajne API ključeve radnog prostora u mobilnu aplikaciju.