API pública & claus d’API
Accés programàtic al seu espai de treball — llegir projectes, sessions, esdeveniments personalitzats i segments, i adjuntar identificadors de client a les sessions — protegit per claus d’API limitades a l’espai de treball.
1. Visió general
L’API de MousePlayer permet extreure dades de l’espai de treball per als seus propis taulers, magatzems de dades o eines internes. A banda d’adjuntar identificadors de client a les sessions (identify, requereix una clau amb abast d’escriptura; vegi Abasts de les claus), és de només lectura: no es pot modificar ni suprimir cap dada mitjançant l’API.
- URL base:
https://www.mouseplayer.com/api/v1/ - Totes les respostes són JSON.
- Cada petició s’autentica amb una clau d’API i es limita automàticament a l’espai de treball al qual pertany la clau — una clau d’un espai de treball no pot veure mai les dades d’un altre, ni per accident.
- La gravació completa de reproducció de la sessió (moviments del ratolí, captures del DOM) no s’exposa mitjançant l’API. Obtindrà metadades de sessió, visualitzacions de pàgina, esdeveniments personalitzats i segments — prou per crear informes i taulers sense moure la càrrega útil de reproducció en brut.
2. Autenticació
Creï i gestioni les claus d’API a Claus d’API del menú del seu compte (/api-keys). Només els propietaris i administradors de l’espai de treball poden crear o revocar claus.
Mantingui la clau en secret. Dona accés de lectura a tot el que hi ha a l’espai de treball. La clau completa es mostra exactament una vegada, just després de crear-la — desi-la en un gestor de contrasenyes o un dipòsit de secrets. Si la perd, revoqui-la i creï’n una de nova.
Enviï la clau com a token Bearer a la capçalera Authorization de cada petició:
Les claus absents, mal formades o revocades reben una resposta 401 com aquesta:
Requisit de pla
L’API REST forma part dels plans Business i Enterprise corresponents. El pla es determina a partir del propietari de l’espai de treball; per tant, els membres convidats l’hereten. La comprovació es fa en cada petició, no només en crear una clau — si es baixa de pla un espai de treball, les claus existents deixen de funcionar i retornen 403.
Abasts de les claus
Cada clau incorpora l’abast al prefix, perquè pugui saber què fa només de mirar-la — en un .env, en un tiquet o en un terminal.
| Prefix | Significat |
|---|---|
mp_ro_ | Només lectura. Llegeix projectes, sessions, esdeveniments i segments. No pot canviar res. |
mp_rw_ | Lectura i escriptura. Tot l’anterior, més adjuntar identificadors de client mitjançant l’endpoint d’identificació. |
403 amb un missatge que indica què permet la clau i què necessita l’endpoint. L’abast no es pot canviar després — creï una clau nova i revoqui l’antiga.3. Límits de peticions
Cada clau d’API està limitada a 60 peticions per minut, comptades en una finestra mòbil. En superar el límit, les peticions reben una resposta 429 fins que s’allibera la finestra:
Està creant alguna cosa que necessita un límit més alt? Contacti amb nosaltres a Suport i expliqui’ns el seu cas d’ús.
4. Endpoints
GET/api/v1/projects
Llista tots els projectes (propietats amb seguiment) del seu espai de treball.
GET/api/v1/projects/{channelid}/sessions
Llista les sessions de visitants gravades per a un projecte, de la més recent a la més antiga. Amb paginació.
| Paràmetre de consulta | Descripció |
|---|---|
page | Número de pàgina, per defecte 1. |
per_page | Resultats per pàgina, per defecte 25, màxim 100. |
since | Només sessions iniciades en aquesta data o després (YYYY-MM-DD). |
until | Només sessions iniciades en aquesta data o abans. |
GET/api/v1/sessions/{session_id}
Metadades d’una sessió i les seves visualitzacions de pàgina. Exclou expressament la càrrega útil completa de reproducció — per a això utilitzi el reproductor del tauler.
GET/api/v1/sessions/{session_id}/events
Esdeveniments personalitzats activats durant una sessió (els mateixos que envia amb mp('event', ...)), inclosos els seus paràmetres.
GET/api/v1/projects/{channelid}/segments
Llista els segments de visitants definits per a un projecte (tant els específics del projecte com els de tot l’espai de treball).
5. Adjuntar un identificador de client des del backend
El navegador sovint no sap qui hi ha a l’altra banda. En un producte B2B, la identitat es determina després de l’inici de sessió — al seu backend. En una botiga, es determina amb la confirmació de la comanda. Aquest endpoint és precisament per a aquell 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}}L’identificador apareix després a la llista de sessions, on es pot cercar, i s’activa el webhook session_identified corresponent — així arriba al seu CRM.
"changed": false i no s’envia cap webhook. Una comanda repetida no crea un segon client potencial.| Estat | Quan |
|---|---|
400 | Falta un camp, user_id té més de 128 caràcters o conté caràcters de control. Rebutgem en lloc de truncar — un identificador escurçat sense avís no coincideix amb res al CRM i tot i així sembla un èxit. |
404 | La sessió no existeix o no pertany al seu espai de treball. Expressament la mateixa resposta en tots dos casos. |
403 | El pla de l’espai de treball no inclou l’API. |
6. Webhooks: verificar la signatura
Els webhooks es configuren per projecte a Integracions, on també trobarà el secret de signatura. Cada lliurament conté aquestes capçaleres:
| Capçalera | Significat |
|---|---|
X-MousePlayer-Event | Nom de l’esdeveniment, p. ex. session_identified |
X-MousePlayer-Timestamp | Segons Unix — part del text signat |
X-MousePlayer-Attempt | 1 en el primer intent, més alt en els reintents |
X-MousePlayer-Signature | sha256=<hex> |
La signatura és un HMAC-SHA256 de timestamp + "." + raw body, amb el secret de signatura del seu projecte com a clau.
// 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');
Lliurament i reintents
Un lliurament fallit es reintenta al cap de 1 min, 5 min, 15 min, 1 h i 6 h i després s’abandona. Les respostes 4xx que no siguin 408 o 429 mai no es reintenten — indiquen "no d’aquesta manera", no "ara no". Respongui 2xx ràpidament i faci la feina després; el lliurament esgota el temps d’espera al cap de 10 segons.
Esdeveniments disponibles
| Esdeveniment | S’activa |
|---|---|
session_identified | Quan una sessió rep un identificador de client per primera vegada — des del navegador o des de l’API |
session_ended | Una vegada, quan es tanca la sessió |
goal_reached | Una vegada per sessió, quan un esdeveniment personalitzat compleix un dels seus objectius. Només objectius de tipus «esdeveniment» — no s’avaluen objectius d’URL, durada, visualitzacions de pàgina ni embut. Conté goal_id, goal_name, goal_value i currency. |
high_value_session | Quan un visitant supera per primera vegada en un dia el llindar de valor d’aquest projecte. El llindar es deriva de la distribució de les seves pròpies puntuacions (percentil 90 dels últims 90 dies), no és un número fix i no existeix fins que s’hagin puntuat almenys 20 visitants. Conté visitor_id, value_score, threshold i la sessió d’aquell dia que més val la pena mirar. |
funnel_dropoff | Al final d’una sessió que ha entrat en un dels seus embuts però no l’ha completat. Indica el pas on s’ha aturat (dropped_at). Un abandonament és l’absència d’un esdeveniment, de manera que només es pot saber quan la sessió s’ha acabat. Les sessions que no han entrat mai a l’embut no són abandonaments i no l’activen. |
high_friction_session | Una vegada per sessió, quan la puntuació de fricció arriba per primera vegada al llindar (per defecte, 60 de 100). Conté friction_score, els senyals que hi ha al darrere (reasons) i el senyal que ha superat el límit (trigger). |
element_broken | Una vegada, quan un element amb seguiment no ha trobat res en cap visualització de pàgina comprovada durant diversos dies — normalment després d’un rellançament. Només es torna a activar després que el marcatge hagi coincidit i hagi tornat a fallar. Aquest esdeveniment no pertany a cap sessió: session_id i session_url són null, link_url obre el marcatge en lloc de la sessió, i subject_id identifica el marcatge — és el mateix en totes les versions, de manera que un selector nou que torni a fallar s’afegeix a la incidència oberta. Conté rule_id, rule_name, selector, page, checked_page_views, window_days i last_matched. Cap dada de visitants. |
element_recovered | L’avís de resolució de element_broken: una vegada, quan el marcatge torna a trobar realment un element — un nombre insuficient de visualitzacions de pàgina no és suficient. Només s’envia si element_broken s’ha enviat per webhook, i no té cap interruptor propi: subscriure’s a element_broken l’inclou. El mateix valor subject_id permet que PagerDuty resolgui la incidència i Opsgenie tanqui l’alerta. Conté matched_page_views i checked_page_views a més. |
anomaly_detected | Una vegada al dia, quan ahir ha diferit clarament dels 28 dies anteriors: moltes menys o moltes més sessions, una caiguda de la taxa d’objectius, més sessions amb fricció o amb errors JS. La mateixa mètrica i direcció no tornen a generar avisos durant una setmana (ajustable). Aquest esdeveniment no pertany a cap sessió: session_id i session_url són null, link_url obre la visió general del projecte, i subject_id identifica la mètrica, la direcció i el dia. Conté 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 un valor llegible summary i hint. Cap dada de visitants. Per a Web Vitals, measurements substitueix sessions, i page (buit per a tot el lloc) i device (desktop o mobil) indiquen on ha passat; link_url llavors obre la pestanya Web Vitals. |
rage_click | En detectar un clic de ràbia |
error_detected | En una excepció del frontend |
ce | Subscripció conjunta als seus propis esdeveniments personalitzats. No inclou els esdeveniments anteriors — tenen interruptors propis. |
7. Errors & codis d’estat
| Estat | Significat |
|---|---|
200 | Èxit. |
401 | Clau d’API absent, mal formada o revocada. |
404 | El projecte o la sessió sol·licitats no existeixen o no pertanyen al seu espai de treball. |
429 | Límit de peticions superat — envia més de 60 peticions/minut amb aquesta clau. |
403 | El pla de l’espai de treball no inclou l’API REST. El missatge indica tant el pla necessari com l’actual. |
8. Notes de seguretat
- Les claus de només lectura (mp_ro_) no poden canviar res. Les d’escriptura (mp_rw_) només poden adjuntar identificadors de client; cap clau no pot suprimir dades ni exportar dades de reproducció en brut.
- Cada petició es limita automàticament a l’espai de treball de la mateixa clau — no es pot passar un identificador d’espai de treball diferent per veure les dades d’algú altre.
- Revoqui una clau en qualsevol moment des de /api-keys; la revocació és immediata.
- Tracti la clau d’API com una contrasenya. Si la incorpora per accident a un repositori públic, revoqui-la immediatament i creï’n una de nova.
Pàgines d’esdeveniments limitades (API v1, 14 d’octubre de 2026)
GET /api/v1/sessions/{session_id}/events retorna fins a 100 esdeveniments per defecte. Estableixi per_page en un enter d’1 a 100. Segueixi pagination.next_cursor enviant cursor sense canvis a la petició següent; mantingui la mateixa sessió i el mateix espai de treball. Els esdeveniments s’ordenen per created_at i event_id. Els cursors estan signats i vinculats a aquella sessió i espai de treball. No es retorna cap recompte total ni cap número de pàgina.
La matriu data i el mapa params existents continuen disponibles. pagination.returned és el nombre real retornat; pagination.has_more indica que hi ha una altra pàgina. next_cursor és null en acabar. Una resposta està limitada a 524288 bytes, de manera que una pàgina pot contenir menys esdeveniments que per_page. Per esdeveniment, es retornen com a màxim 128 files de paràmetres; params_truncated és true si n’hi ha més. Els paràmetres de text individuals mantenen el límit de base de dades de 255 caràcters. Els paràmetres truncats no estan disponibles mitjançant aquest endpoint. Reduir per_page no augmenta el límit de paràmetres.
Les mides de pàgina no vàlides, els cursors modificats i els cursors d’una altra sessió o espai de treball retornen 400. Les dades d’esdeveniments individuals massa grans retornen 413. Les comprovacions d’accés existents continuen retornant 401, 403, 404 o 409 segons correspongui.
El límit continua sent de 60 peticions autenticades per clau d’API per minut. Esgotar-lo retorna 429 amb Retry-After: 60. Si Redis o el limitador no estan disponibles, les peticions retornen 503 amb Retry-After: 5; no s’admeten mai sense límit. Respecti Retry-After i afegeixi una espera aleatòria progressiva; no ho reintenti en un bucle continu. Els errors de la base de dades d’esdeveniments també retornen 503. Els cursors no fixen una captura: les insercions simultànies amb marques de temps anteriors poden requerir un nou escaneig.
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 és una ruta de control de backend exclusiva de Dev per a la vista prèvia de l’SDK natiu. Continua desactivada a producció. Les claus Bearer de backend necessiten abast de lectura per a list/replay i d’escriptura per a register/grant/delete/disable. S’apliquen comprovacions addicionals de disponibilitat de la vista prèvia nativa. No integri mai claus d’API permanents de l’espai de treball a una aplicació mòbil.