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ó:

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

Les claus absents, mal formades o revocades reben una resposta 401 com aquesta:

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

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.

PrefixSignificat
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ó.
Triï l’abast en crear la clau; per defecte és de només lectura. Utilitzar una clau de només lectura en un endpoint d’escriptura retorna 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:

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

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.

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

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 consultaDescripció
pageNúmero de pàgina, per defecte 1.
per_pageResultats per pàgina, per defecte 25, màxim 100.
sinceNomés sessions iniciades en aquesta data o després (YYYY-MM-DD).
untilNomés sessions iniciades en aquesta data o abans.
{ "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}

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.

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

Esdeveniments personalitzats activats durant una sessió (els mateixos que envia amb mp('event', ...)), inclosos els seus paràmetres.

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

Llista els segments de visitants definits per a un projecte (tant els específics del projecte com els de tot l’espai de treball).

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

És segur fer dues crides amb el mateix identificador. La resposta retorna amb "changed": false i no s’envia cap webhook. Una comanda repetida no crea un segon client potencial.
EstatQuan
400Falta 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.
404La sessió no existeix o no pertany al seu espai de treball. Expressament la mateixa resposta en tots dos casos.
403El 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çaleraSignificat
X-MousePlayer-EventNom de l’esdeveniment, p. ex. session_identified
X-MousePlayer-TimestampSegons Unix — part del text signat
X-MousePlayer-Attempt1 en el primer intent, més alt en els reintents
X-MousePlayer-Signaturesha256=<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');
Signi el cos en brut abans d’analitzar el JSON. Tornar-lo a serialitzar canvia l’ordre de les claus i els espais en blanc, i la signatura no coincidirà mai. Rebutgi també tot allò que tingui una marca de temps de fa més d’uns quants minuts — per això serveix la marca de temps.

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

EsdevenimentS’activa
session_identifiedQuan una sessió rep un identificador de client per primera vegada — des del navegador o des de l’API
session_endedUna vegada, quan es tanca la sessió
goal_reachedUna 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_sessionQuan 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_dropoffAl 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_sessionUna 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_brokenUna 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_recoveredL’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_detectedUna 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_clickEn detectar un clic de ràbia
error_detectedEn una excepció del frontend
ceSubscripció conjunta als seus propis esdeveniments personalitzats. No inclou els esdeveniments anteriors — tenen interruptors propis.

7. Errors & codis d’estat

EstatSignificat
200Èxit.
401Clau d’API absent, mal formada o revocada.
404El projecte o la sessió sol·licitats no existeixen o no pertanyen al seu espai de treball.
429Límit de peticions superat — envia més de 60 peticions/minut amb aquesta clau.
403El 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.