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:

# List projects in your workspace curl -H "Authorization: Bearer mp_live_..." \ https://www.mouseplayer.com/api/v1/projects

Nedostajući, neispravni ili opozvani ključevi dobijaju odgovor 401:

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

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.

PrefiksZnač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.
Izaberite opseg pri pravljenju ključa; podrazumevano je samo čitanje. Korišćenje ključa samo za čitanje na endpoint-u za pisanje vraća 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:

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

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.

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

Navodi sesije posetilaca snimljene za projekat, prvo najnovije. Sa straničenjem.

Parametar upitaOpis
pageBroj stranice, podrazumevano 1.
per_pageRezultata po stranici, podrazumevano 25, najviše 100.
sinceSamo sesije koje počinju ovog datuma ili kasnije (YYYY-MM-DD).
untilSamo sesije koje počinju ovog datuma ili ranije.
{ "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}

Metapodaci jedne sesije uz njene prikaze stranica. Namerno izostavlja potpune podatke snimka — za njih koristite plejer kontrolne table.

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

Prilagođeni događaji pokrenuti tokom sesije (isti koje šaljete preko mp('event', ...)), uključujući parametre.

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

Navodi segmente posetilaca definisane za projekat (i segmente projekta i celog radnog prostora).

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

Bezbedno je pozvati dvaput sa istim ID-jem. Odgovor se vraća sa "changed": false i webhook se ne šalje. Ponovljena porudžbina ne stvara drugog potencijalnog klijenta.
StatusKada
400Nedostajuć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.
404Sesija ne postoji ili ne pripada vašem radnom prostoru. Namerno isti odgovor za oba slučaja.
403Plan 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:

ZaglavljeZnačenje
X-MousePlayer-EventNaziv događaja, npr. session_identified
X-MousePlayer-TimestampUnix sekunde — deo potpisanog teksta
X-MousePlayer-Attempt1 pri prvom pokušaju, više pri ponovnim pokušajima
X-MousePlayer-Signaturesha256=<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');
Potpisujte sirovo telo pre bilo kakvog JSON parsiranja. Ponovna serijalizacija menja redosled ključeva i razmake i potpis se nikada neće poklopiti. Odbijte i sve čija je vremenska oznaka starija od nekoliko minuta — tome vremenska oznaka služi.

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đajPokreće se
session_identifiedKada sesija prvi put dobije ID kupca — iz pregledača ili API-ja
session_endedJednom, kada se sesija zatvori
goal_reachedJednom 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_sessionKada 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_dropoffNa 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_sessionJednom 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_brokenJednom, 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_recoveredObaveš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_detectedJednom 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_clickPri otkrivenom kliku iz frustracije
error_detectedPri izuzetku na klijentskoj strani
ceZajednič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

StatusZnačenje
200Uspešno.
401Nedostajući, neispravan ili opozvan API ključ.
404Traženi projekat ili sesija ne postoji ili ne pripada vašem radnom prostoru.
429Ograničenje učestalosti prekoračeno — šaljete više od 60 zahteva/minut ovim ključem.
403Plan 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.