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:

# 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 sljedećeg oblika:

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

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.

PrefiksZnač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.
Odaberite opseg pri kreiranju; podrazumijevano je samo čitanje. Korištenje ključa za čitanje na endpointu pisanja vraća 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:

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

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.

{ "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 snimljene sesije posjetilaca projekta, prvo najnovije. Paginirano.

Parametar upitaOpis
pageBroj stranice, podrazumijevano 1.
per_pageRezultata po stranici, podrazumijevano 25, najviše 100.
sinceSamo sesije koje počinju na ovaj datum ili poslije (YYYY-MM-DD).
untilSamo sesije koje počinju na ovaj datum ili prije.
{ "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 i njeni pregledi stranica. Namjerno bez potpunih podataka reprodukcije — za to koristite plejer kontrolne ploče.

{ "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 sesije (isti koje šaljete pomoću 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 posjetilaca definirane za projekt, i one posebne za projekt i one za cijeli radni prostor.

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

Dva poziva s istim ID-jem su sigurna. Odgovor se vraća s "changed": false i webhook se ne šalje. Ponovljena narudžba ne stvara drugog potencijalnog klijenta.
StatusKada
400Nedostaje 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.
404Sesija ne postoji ili ne pripada vašem radnom prostoru. Namjerno isti odgovor za oboje.
403Plan 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:

ZaglavljeZnačenje
X-MousePlayer-EventNaziv događaja, npr. session_identified
X-MousePlayer-TimestampUnix sekunde — dio 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, 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');
Potpišite sirovo tijelo prije JSON parsiranja. Ponovna serijalizacija mijenja redoslijed ključeva i bjelinu pa potpis nikad neće odgovarati. Odbijte i sve s vremenskom oznakom starijom od nekoliko minuta — tome vremenska oznaka služi.

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đajAktivira se
session_identifiedKad sesija prvi put dobije ID klijenta — iz preglednika ili API-ja
session_endedJednom, pri zatvaranju sesije
goal_reachedJednom 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_sessionKad 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_dropoffNa 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_sessionJednom 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_brokenJednom, 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_recoveredObavijest 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_detectedJednom 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_clickPri otkrivenom kliku iz bijesa
error_detectedPri frontend izuzetku
ceZajednič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

StatusZnačenje
200Uspjeh.
401Nedostajući, neispravan ili opozvan API ključ.
404Traženi projekt ili sesija ne postoji ili ne pripada vašem radnom prostoru.
429Prekoračen limit učestalosti — šaljete više od 60 zahtjeva/minutu ovim ključem.
403Plan 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.