Javni API & API ključevi
Programski pristup radnom prostoru — čitanje projekata, sesija, prilagođenih događaja i segmenata te pridruživanje ID-jeva kupaca sesijama — zaštićen API ključevima s opsegom radnog prostora.
1. Pregled
MousePlayer API omogućuje dohvat podataka iz radnog prostora u vlastite nadzorne ploče, skladište podataka ili interne alate. Osim pridruživanja ID-jeva kupaca sesijama (identify, potreban ključ s pravom pisanja, vidi Opsezi ključeva) služi samo za čitanje: podaci se putem API-ja ne mogu mijenjati ni brisati.
- Osnovni URL:
https://www.mouseplayer.com/api/v1/ - Svi su odgovori JSON.
- Svaki se zahtjev autentificira API ključem i automatski ograničava na radni prostor kojem ključ pripada — ključ jednog radnog prostora nikad ne može vidjeti podatke drugog, čak ni slučajno.
- Cjelovita snimka reprodukcije sesije (pokreti miša, snimke stanja DOM-a) nije dostupna putem API-ja. Dobivate metapodatke sesije, prikaze stranica, prilagođene događaje i segmente — dovoljno za izvještaje i nadzorne ploče bez slanja neobrađenih podataka reprodukcije.
2. Autentifikacija
Izradite API ključeve i upravljajte njima pod API ključevi u izborniku računa (/api-keys). Samo vlasnici i administratori radnog prostora mogu izrađivati ili opozivati ključeve.
Čuvajte ključ u tajnosti. Daje pristup za čitanje svemu u radnom prostoru. Cijeli ključ prikazuje se točno jednom, odmah nakon izrade — spremite ga u upravitelj lozinki ili trezor tajni. Ako ga izgubite, opozovite ga i izradite novi.
Pošaljite ključ kao Bearer token u zaglavlju Authorization svakog zahtjeva:
Za nedostajuće, neispravno oblikovane ili opozvane ključeve dobiva se odgovor 401:
Potreban plan
REST API dio je planova Business i Enterprise. Plan se preuzima od vlasnika radnog prostora pa ga pozvani članovi tima nasljeđuju. Provjera se izvršava pri svakom zahtjevu, a ne samo pri izradi ključa — ako radni prostor prijeđe na niži plan, postojeći ključevi prestaju raditi i vraćaju 403.
Opsezi ključeva
Svaki ključ nosi opseg u vlastitom prefiksu pa već pogledom možete reći što radi — u .env, u zadatku, u terminalu.
| Prefiks | Značenje |
|---|---|
mp_ro_ | Samo čitanje. Čita projekte, sesije, događaje i segmente. Ne može ništa mijenjati. |
mp_rw_ | Čitanje i pisanje. Sve navedeno te pridruživanje ID-jeva kupaca putem krajnje točke identify. |
403 uz poruku koja navodi opseg ključa i zahtjev krajnje točke. Opseg se poslije ne može promijeniti — izradite novi ključ i opozovite stari.3. Ograničenja zahtjeva
Svaki API ključ ograničen je na 60 zahtjeva u minuti, uz praćenje u pomičnom vremenskom okviru. Nakon prekoračenja zahtjevi dobivaju odgovor 429 dok se okvir ne oslobodi:
Izrađujete nešto što zahtijeva veće ograničenje? Javite se putem Podrške i opišite svoj slučaj upotrebe.
4. Krajnje točke
GET/api/v1/projects
Navodi svaki projekt (praćeno web-mjesto) u radnom prostoru.
GET/api/v1/projects/{channelid}/sessions
Navodi sesije posjetitelja snimljene za projekt, najnovije prvo. S podjelom na stranice.
| Parametar upita | Opis |
|---|---|
page | Broj stranice, zadano 1. |
per_page | Rezultati po stranici, zadano 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 pojedine sesije i njezini prikazi stranica. Namjerno ne uključuje cjelovite podatke reprodukcije — za to koristite reproduktor na nadzornoj ploči.
GET/api/v1/sessions/{session_id}/events
Prilagođeni događaji pokrenuti tijekom sesije (isti događaji koje šaljete s mp('event', ...)), uključujući parametre.
GET/api/v1/projects/{channelid}/segments
Navodi segmente posjetitelja definirane za projekt (i projektne i one za cijeli radni prostor).
5. Pridruživanje ID-ja kupca iz pozadinskog sustava
Preglednik često ne zna tko je pred njim. U B2B proizvodu identitet se utvrđuje nakon prijave — u vašem pozadinskom sustavu. U trgovini se utvrđuje potvrdom narudžbe. Ova krajnja točka 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 popisu sesija, može se pretraživati i pokreće se webhook session_identified — tako stiže u vaš CRM.
"changed": false i webhook se ne šalje. Ponovljena narudžba ne stvara drugog potencijalnog kupca.| Status | Kada |
|---|---|
400 | Nedostajuće polje, user_id dulji od 128 znakova ili s kontrolnim znakovima. Odbijamo umjesto da skraćujemo — neprimjetno skraćeni ID ne podudara se ni s čim u CRM-u, a 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 za svaki projekt pod Integracije, gdje se nalazi i tajna za potpisivanje. Svaka isporuka 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 izračunat nad timestamp + "." + raw body, uz tajnu za potpisivanje 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
Neuspjela isporuka ponavlja se nakon 1 min, 5 min, 15 min, 1 h i 6 h, zatim se odustaje. 4xx odgovori osim 408 i 429 se ne ponavljaju — znače "ne ovako", a ne "ne sada". Brzo odgovorite s 2xx i posao obavite poslije; isporuka istječe nakon 10 sekundi.
Dostupni događaji
| Događaj | Pokreće se |
|---|---|
session_identified | Kad sesija prvi put dobije ID kupca — iz preglednika ili API-ja |
session_ended | Jednom, kad se sesija zatvori |
goal_reached | Jednom po sesiji, kad prilagođeni događaj ispuni jedan od ciljeva. Samo ciljevi vrste „event“ — ciljevi URL-a, trajanja, prikaza stranica i lijevka ne vrednuju se. Sadrži goal_id, goal_name, goal_value i currency. |
high_value_session | Kad posjetitelj prvi put prijeđe prag vrijednosti ovog projekta određenog dana. Prag se izvodi iz raspodjele vaših ocjena (90. percentil posljednjih 90 dana), nije fiksni broj i ne postoji dok se ne ocijeni barem 20 posjetitelja. Sadrži visitor_id, value_score, threshold i sesiju tog dana najprikladniju za gledanje. |
funnel_dropoff | Na kraju sesije koja je ušla u jedan od vaših lijevaka, ali ga nije dovršila. Navodi korak na kojem je stala (dropped_at). Odustajanje je izostanak događaja pa ga je moguće utvrditi tek nakon završetka sesije. Sesije koje nikad nisu ušle u lijevak nisu odustajanja i ne pokreću događaj. |
high_friction_session | Jednom po sesiji, kad ocjena trenja prvi put dosegne prag (zadano 60 od 100). Sadrži friction_score, signale na kojima se temelji (reasons) i signal koji je prešao granicu (trigger). |
element_broken | Jednom, kad praćeni element nekoliko dana ništa ne pronađe ni u jednom provjerenom prikazu stranice — obično nakon ponovne objave web-mjesta. Ponovno se pokreće tek nakon što oznaka pronađe podudaranje pa opet prestane raditi. 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 — jednako za svaku verziju pa se novi selektor koji ponovno prestane raditi pridružuje otvorenom incidentu. Sadrži rule_id, rule_name, selector, page, checked_page_views, window_days i last_matched. Bez podataka o posjetiteljima. |
element_recovered | Obavijest da je problem riješen za element_broken: jednom kad oznaka ponovno stvarno pronađe element — premalo prikaza stranice nije dovoljno. Šalje se samo ako je element_broken poslan webhookom i nema vlastiti prekidač: pretplata na element_broken uključuje ga. Isti subject_id omogućuje da PagerDuty riješi incident, a Opsgenie zatvori upozorenje. Dodatno sadrži matched_page_views i checked_page_views. |
anomaly_detected | Jednom dnevno, kad se jučerašnji dan jasno razlikovao od prethodnih 28 dana: znatno manje ili više sesija, pad stope ostvarivanja ciljeva, više sesija s trenjem ili JS pogreškama. Ista metrika i smjer šute tjedan 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 metriku, smjer 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 o posjetiteljima. Za Web Vitals measurements zamjenjuje sessions, a page (prazno za cijelo web-mjesto) i device (desktop ili mobil) govore gdje se dogodilo; link_url tada otvara karticu Web Vitals. |
rage_click | Pri otkrivenom bijesnom kliku |
error_detected | Pri iznimci na klijentskoj strani |
ce | Zajednička pretplata na vaše prilagođene događaje. Ona ne uključuje događaje iznad — oni imaju vlastite prekidače. |
7. Pogreške & statusni kodovi
| Status | Značenje |
|---|---|
200 | Uspjeh. |
401 | Nedostajući, neispravno oblikovan ili opozvan API ključ. |
404 | Zatraženi projekt ili sesija ne postoji ili ne pripada vašem radnom prostoru. |
429 | Ograničenje zahtjeva prekoračeno — ovim ključem šaljete više od 60 zahtjeva u minuti. |
403 | Plan radnog prostora ne uključuje REST API. Poruka navodi i potreban i trenutačni plan. |
8. Sigurnosne napomene
- Ključevi samo za čitanje (mp_ro_) ne mogu ništa mijenjati. Ključevi za pisanje (mp_rw_) mogu samo pridruživati ID-jeve kupaca; nijedan ključ ne može brisati podatke ni izvoziti neobrađene podatke reprodukcije.
- Svaki zahtjev automatski je ograničen na radni prostor ključa — ne postoji način da proslijedite ID drugog radnog prostora i vidite tuđe podatke.
- Opozovite ključ bilo kada na /api-keys; opoziv djeluje odmah.
- Postupajte s API ključem kao s lozinkom. Ako ga slučajno uključite u commit javnog repozitorija, odmah ga opozovite i izradite novi.
Ograničene stranice događaja (API v1, 14. listopada 2026.)
GET /api/v1/sessions/{session_id}/events zadano vraća do 100 događaja. Postavite per_page na cijeli broj od 1 do 100. Pratite pagination.next_cursor slanjem neizmijenjene vrijednosti cursor u sljedećem zahtjevu; zadržite istu sesiju i radni prostor. Događaji su poredani prema created_at i event_id. Kursori su potpisani i vezani uz tu sesiju i radni prostor. Ne vraća se ukupan broj ni brojčana stranica.
Postojeće polje data i mapa params ostaju dostupni. pagination.returned stvarni je broj vraćenih stavki; pagination.has_more označava sljedeću stranicu. next_cursor je null kad je dohvat dovršen. Odgovor je ograničen na 524288 bajtova pa stranica može sadržavati manje događaja od per_page. Po događaju vraća se najviše 128 redaka parametara; params_truncated je true ako ih ima više. Pojedini tekstualni parametri zadržavaju ograničenje baze od 255 znakova. Skraćeni parametri nisu dostupni putem ove krajnje točke. Smanjenje per_page ne povećava ograničenje parametara.
Nevaljane veličine stranica, izmijenjeni kursori i kursori za drugu sesiju/radni prostor vraćaju 400. Preveliki podaci pojedinog događaja vraćaju 413. Postojeće provjere pristupa i dalje vraćaju 401, 403, 404 ili 409, prema potrebi.
Ograničenje ostaje 60 autentificiranih zahtjeva po API ključu u minuti. Iscrpljenje vraća 429 uz Retry-After: 60. Ako Redis ili sustav ograničavanja nije dostupan, zahtjevi vraćaju 503 uz Retry-After: 5; nikad se ne propuštaju bez ograničenja. Poštujte Retry-After i dodajte nasumičan odmak; ne pokušavajte ponovno u brzoj petlji. Pogreške baze događaja također vraćaju 503. Kursori ne zamrzavaju snimku stanja: istodobni unosi sa starijim vremenskim oznakama mogu zahtijevati novo skeniranje.
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 kontrolna je ruta pozadinskog sustava samo za Dev, za pretpregled nativnog SDK-a. Ostaje onemogućena u produkciji. Pozadinski Bearer ključevi trebaju opseg čitanja za list/replay i pisanja za register/grant/delete/disable. Primjenjuju se dodatne provjere dostupnosti nativnog pretpregleda. Nikad ne ugrađujte trajne API ključeve radnog prostora u mobilnu aplikaciju.