API public & chei API
Acces programatic la spațiul de lucru — citiți proiecte, sesiuni, evenimente personalizate și segmente și atașați ID-uri de client sesiunilor — protejat prin chei API limitate la spațiul de lucru.
1. Prezentare generală
API-ul MousePlayer vă permite să extrageți date din spațiul de lucru în propriile tablouri de bord, depozite de date sau instrumente interne. În afară de atașarea ID-urilor de client la sesiuni (identify, necesită o cheie cu permisiune de scriere, consultați Permisiunile cheilor), permite doar citirea: datele nu pot fi modificate sau șterse prin API.
- URL de bază:
https://www.mouseplayer.com/api/v1/ - Toate răspunsurile sunt în format JSON.
- Fiecare cerere este autentificată printr-o cheie API și limitată automat la spațiul de lucru căruia îi aparține cheia — o cheie dintr-un spațiu de lucru nu poate vedea niciodată datele altuia, nici măcar accidental.
- Înregistrarea completă pentru redarea sesiunii (mișcările mouse-ului, capturile DOM) nu este expusă prin API. Primiți metadatele sesiunii, vizualizările de pagină, evenimentele personalizate și segmentele — suficiente pentru rapoarte și tablouri de bord, fără a transfera datele brute de redare.
2. Autentificare
Creați și administrați cheile API în secțiunea Chei API din meniul contului (/api-keys). Doar proprietarii și administratorii spațiului de lucru pot crea sau revoca chei.
Păstrați cheia secretă. Aceasta oferă acces de citire la tot ce se află în spațiul de lucru. Cheia completă este afișată o singură dată, imediat după creare — păstrați-o într-un manager de parole sau într-un seif de secrete. Dacă o pierdeți, revocați-o și creați alta.
Trimiteți cheia ca token Bearer în antetul Authorization al fiecărei cereri:
Cheile lipsă, cu format incorect sau revocate primesc un răspuns 401:
Cerință de abonament
API-ul REST este inclus în abonamentele Business și Enterprise. Se aplică abonamentul proprietarului spațiului de lucru, deci membrii invitați ai echipei îl moștenesc. Verificarea are loc la fiecare cerere, nu doar la crearea cheii — dacă spațiul de lucru trece la un abonament inferior, cheile existente nu mai funcționează și returnează 403.
Permisiunile cheilor
Fiecare cheie își indică permisiunile prin propriul prefix, astfel încât puteți vedea ce permite doar privind-o — într-un .env, într-o solicitare de asistență sau într-un terminal.
| Prefix | Semnificație |
|---|---|
mp_ro_ | Doar citire. Citește proiecte, sesiuni, evenimente și segmente. Nu poate modifica nimic. |
mp_rw_ | Citire și scriere. Toate cele de mai sus, plus atașarea ID-urilor de client prin endpointul de identificare. |
403 cu un mesaj care precizează ce permite cheia și ce necesită endpointul. Permisiunile nu pot fi schimbate ulterior — creați o cheie nouă și revocați-o pe cea veche.3. Limite de cereri
Fiecare cheie API este limitată la 60 de cereri pe minut, într-o fereastră de timp glisantă. Dacă depășiți limita, cererile primesc un răspuns 429 până când fereastra permite din nou cereri:
Construiți ceva care necesită o limită mai mare? Contactați-ne prin Asistență și descrieți-ne cazul de utilizare.
4. Endpointuri
GET/api/v1/projects
Listează toate proiectele (site-urile monitorizate) din spațiul de lucru.
GET/api/v1/projects/{channelid}/sessions
Listează sesiunile vizitatorilor înregistrate pentru un proiect, începând cu cele mai recente. Rezultatele sunt paginate.
| Parametru de interogare | Descriere |
|---|---|
page | Numărul paginii, implicit 1. |
per_page | Rezultate pe pagină, implicit 25, maximum 100. |
since | Doar sesiunile începute la această dată sau ulterior (YYYY-MM-DD). |
until | Doar sesiunile începute la această dată sau anterior. |
GET/api/v1/sessions/{session_id}
Metadatele unei singure sesiuni și vizualizările sale de pagină. Datele complete de redare sunt excluse intenționat — pentru acestea, folosiți playerul din tabloul de bord.
GET/api/v1/sessions/{session_id}/events
Evenimentele personalizate declanșate într-o sesiune (aceleași evenimente pe care le trimiteți cu mp('event', ...)), inclusiv parametrii acestora.
GET/api/v1/projects/{channelid}/segments
Listează segmentele de vizitatori definite pentru un proiect (atât cele specifice proiectului, cât și cele valabile în întregul spațiu de lucru).
5. Atașarea unui ID de client din backend
Browserul nu știe adesea cine îl folosește. Într-un produs B2B, identitatea este stabilită după autentificare — în backendul dvs. Într-un magazin, este stabilită la confirmarea comenzii. Acest endpoint este destinat exact acelui moment.
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-ul apare apoi în lista sesiunilor, poate fi căutat acolo și se declanșează webhookul session_identified — astfel ajunge în CRM.
"changed": false și nu se trimite niciun webhook. O comandă repetată nu creează un al doilea client potențial.| Stare | Când |
|---|---|
400 | Câmp lipsă, user_id cu peste 128 de caractere sau cu caractere de control. Respingem în loc să trunchiem — un ID scurtat fără avertizare nu se mai potrivește cu nimic în CRM, deși pare un succes. |
404 | Sesiunea nu există sau nu aparține spațiului dvs. de lucru. Intenționat, același răspuns pentru ambele situații. |
403 | Abonamentul spațiului de lucru nu include API-ul. |
6. Webhookuri: verificarea semnăturii
Webhookurile se configurează pentru fiecare proiect în Integrări, unde găsiți și secretul de semnare. Fiecare livrare include aceste antete:
| Antet | Semnificație |
|---|---|
X-MousePlayer-Event | Numele evenimentului, de ex. session_identified |
X-MousePlayer-Timestamp | Secunde Unix — parte din textul semnat |
X-MousePlayer-Attempt | 1 la prima încercare, mai mare la reîncercări |
X-MousePlayer-Signature | sha256=<hex> |
Semnătura este un HMAC-SHA256 calculat pe timestamp + "." + raw body, folosind drept cheie secretul de semnare al proiectului.
// 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');
Livrare și reîncercări
O livrare eșuată este reîncercată după 1 min, 5 min, 15 min, 1 h și 6 h, apoi este abandonată. Pentru răspunsurile 4xx diferite de 408 și 429 reîncercarea nu are loc — ele spun "nu în acest mod", nu "nu acum". Răspundeți rapid cu 2xx și efectuați prelucrarea ulterior; livrarea expiră după 10 secunde.
Evenimente disponibile
| Eveniment | Se declanșează |
|---|---|
session_identified | Când o sesiune primește pentru prima dată un ID de client — din browser sau prin API |
session_ended | O singură dată, la închiderea sesiunii |
goal_reached | O dată pe sesiune, când un eveniment personalizat îndeplinește unul dintre obiective. Doar obiective de tip „event” — obiectivele de tip URL, durată, vizualizare de pagină și pâlnie nu sunt evaluate. Include goal_id, goal_name, goal_value și currency. |
high_value_session | Când un vizitator depășește pentru prima dată pragul de valoare al proiectului într-o anumită zi. Pragul este derivat din propria distribuție a scorurilor (percentila 90 din ultimele 90 de zile), nu un număr fix, și nu există până când nu au fost evaluați cel puțin 20 de vizitatori. Include visitor_id, value_score, threshold și sesiunea din acea zi care merită cel mai mult vizionată. |
funnel_dropoff | La sfârșitul unei sesiuni care a intrat într-una dintre pâlnii, dar nu a finalizat-o. Numește pasul la care s-a oprit (dropped_at). Abandonul reprezintă absența unui eveniment, deci poate fi constatat doar după încheierea sesiunii. Sesiunile care nu au intrat în pâlnie nu sunt abandonuri și nu declanșează evenimentul. |
high_friction_session | O dată pe sesiune, când scorul de fricțiune atinge pentru prima dată pragul (implicit 60 din 100). Include friction_score, semnalele care îl explică (reasons) și semnalul care a depășit pragul (trigger). |
element_broken | O singură dată, când un element monitorizat nu a găsit nimic în nicio vizualizare de pagină verificată timp de câteva zile — de obicei după o relansare. Se declanșează din nou doar după ce marcarea a găsit din nou o potrivire și apoi a încetat iar să funcționeze. Acest eveniment nu aparține niciunei sesiuni: session_id și session_url sunt null, link_url deschide în schimb marcarea, iar subject_id identifică marcarea — aceeași pentru toate versiunile, astfel încât un selector nou care nu mai funcționează din nou se asociază incidentului deschis. Include rule_id, rule_name, selector, page, checked_page_views, window_days și last_matched. Fără date despre vizitatori. |
element_recovered | Semnalul de remediere pentru element_broken: când marcarea găsește efectiv din nou un element — prea puține vizualizări de pagină nu sunt suficiente. Este trimis doar dacă element_broken a fost transmis prin webhook și nu are propriul comutator: abonarea la element_broken îl include. Același subject_id, astfel încât PagerDuty rezolvă incidentul, iar Opsgenie închide alerta. Include matched_page_views și checked_page_views în plus. |
anomaly_detected | O dată pe zi, când ziua de ieri a diferit clar de cele 28 de zile anterioare: mult mai puține sau mult mai multe sesiuni, scăderea ratei de atingere a obiectivelor, mai multe sesiuni cu fricțiune sau erori JS. Aceeași metrică și direcție nu mai declanșează notificări timp de o săptămână (configurabil). Acest eveniment nu aparține niciunei sesiuni: session_id și session_url sunt null, link_url deschide prezentarea generală a proiectului, iar subject_id indică metrica, direcția și ziua. Include 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 câmpurile lizibile summary și hint. Fără date despre vizitatori. Pentru Web Vitals, measurements înlocuiește sessions, iar page (gol pentru întregul site) și device (desktop sau mobil) indică unde s-a întâmplat; link_url deschide atunci fila Web Vitals. |
rage_click | La detectarea unui clic furios |
error_detected | La o excepție în interfață |
ce | Abonare colectivă la propriile evenimente personalizate. Aceasta nu include evenimentele de mai sus — acestea au propriile comutatoare. |
7. Erori & coduri de stare
| Stare | Semnificație |
|---|---|
200 | Succes. |
401 | Cheie API lipsă, cu format incorect sau revocată. |
404 | Proiectul sau sesiunea solicitată nu există ori nu aparține spațiului dvs. de lucru. |
429 | Limita de cereri a fost depășită — trimiteți peste 60 de cereri/minut cu această cheie. |
403 | Abonamentul spațiului de lucru nu include API-ul REST. Mesajul numește atât abonamentul necesar, cât și pe cel curent. |
8. Note de securitate
- Cheile doar pentru citire (mp_ro_) nu pot modifica nimic. Cheile de scriere (mp_rw_) pot doar atașa ID-uri de client; nicio cheie nu poate șterge date sau exporta date brute de redare.
- Fiecare cerere este limitată automat la spațiul de lucru al cheii — nu există o modalitate de a transmite alt ID de spațiu de lucru pentru a vedea datele altcuiva.
- Revocați oricând o cheie din /api-keys; revocarea intră în vigoare imediat.
- Tratați cheia API ca pe o parolă. Dacă o includeți accidental într-un commit într-un depozit public, revocați-o imediat și creați alta.
Pagini de evenimente cu limite (API v1, 14 octombrie 2026)
GET /api/v1/sessions/{session_id}/events returnează implicit cel mult 100 de evenimente. Setați per_page la un număr întreg de la 1 la 100. Urmați pagination.next_cursor trimițând cursor neschimbat în cererea următoare; păstrați aceeași sesiune și același spațiu de lucru. Evenimentele sunt ordonate după created_at și event_id. Cursoarele sunt semnate și legate de acea sesiune și de acel spațiu de lucru. Nu se returnează numărul total sau un număr de pagină.
Lista data și harta params existente rămân disponibile. pagination.returned este numărul efectiv returnat; pagination.has_more indică existența altei pagini. next_cursor este null la finalizare. Un răspuns este limitat la 524288 de octeți, deci o pagină poate conține mai puține evenimente decât per_page. Pentru fiecare eveniment se returnează cel mult 128 de rânduri de parametri; params_truncated este true dacă există mai multe. Parametrii individuali de tip șir păstrează limita bazei de date de 255 de caractere. Parametrii trunchiați nu sunt disponibili prin acest endpoint. Reducerea per_page nu mărește limita parametrilor.
Dimensiunile de pagină nevalide, cursoarele modificate și cursoarele pentru altă sesiune sau alt spațiu de lucru returnează 400. Datele unui singur eveniment care depășesc limita returnează 413. Verificările de acces existente returnează în continuare 401, 403, 404 sau 409, după caz.
Limita rămâne de 60 de cereri autentificate pe cheie API pe minut. Epuizarea ei returnează 429 cu Retry-After: 60. Dacă Redis sau limitatorul nu este disponibil, cererile returnează 503 cu Retry-After: 5; nu sunt niciodată acceptate fără limitare. Respectați Retry-After și adăugați întârzieri aleatorii între reîncercări; nu reîncercați într-o buclă rapidă. Erorile bazei de date de evenimente returnează și ele 503. Cursoarele nu fixează o captură a datelor: inserările simultane cu marcaje temporale mai vechi pot necesita o scanare nouă.
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 este o rută de control în backend, disponibilă doar în Dev, pentru previzualizarea SDK-ului nativ. Rămâne dezactivată în producție. Cheile Bearer pentru backend necesită permisiune de citire pentru list/replay și de scriere pentru register/grant/delete/disable. Se aplică verificări suplimentare privind disponibilitatea previzualizării native. Nu integrați niciodată chei API permanente ale spațiului de lucru într-o aplicație mobilă.