API pública & claves API

Acceso programático ao espazo de traballo — lea proxectos, sesións, eventos personalizados e segmentos e engada ID de clientes ás sesións — protexido por claves API limitadas ao espazo de traballo.

1. Resumo

A API MousePlayer permite extraer datos do espazo de traballo aos seus paneis, almacén de datos ou ferramentas internas. Salvo engadir ID de clientes ás sesións (identify, require clave con ámbito de escritura; vexa Ámbitos das claves), é só de lectura: non se poden modificar nin eliminar datos mediante a API.

  • URL base: https://www.mouseplayer.com/api/v1/
  • Todas as respostas son JSON.
  • Cada petición autentícase cunha clave API e limítase automaticamente ao espazo de traballo desa clave — a clave dun espazo nunca pode ver os datos doutro, nin por accidente.
  • A gravación completa da reprodución (movementos do rato e capturas DOM) non está exposta na API. Obtén metadatos de sesión, vistas de páxina, eventos personalizados e segmentos — suficiente para crear informes e paneis sen mover os datos de reprodución en bruto.

2. Autenticación

Cree e xestione as claves API en Claves API no menú da conta (/api-keys). Só os propietarios e administradores do espazo de traballo poden crear ou revogar claves.

Manteña a clave en segredo. Dá acceso de lectura a todo o espazo de traballo. A clave completa móstrase exactamente unha vez, xusto despois de creala — gárdea nun xestor de contrasinais ou caixa forte de segredos. Se a perde, revóguea e cree outra.

Envíe a clave como token Bearer na cabeceira Authorization de cada petición:

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

As claves ausentes, mal formadas ou revogadas reciben unha resposta 401 co seguinte contido:

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

Requisito do plan

A API REST forma parte dos plans Business e Enterprise e o plan aplicable é o do propietario do espazo de traballo, polo que o herdan os membros invitados. A comprobación execútase en cada petición, non só ao crear a clave — se se reduce o nivel do espazo, as claves existentes deixan de funcionar e devolven 403.

Ámbitos das claves

Cada clave leva o ámbito no prefixo para saber que fai con só mirala — nun .env, nun tícket ou nun terminal.

PrefixoSignificado
mp_ro_Só lectura. Le proxectos, sesións, eventos e segmentos. Non pode cambiar nada.
mp_rw_Lectura e escritura. Todo o anterior máis engadir ID de clientes mediante o endpoint identify.
Escolla o ámbito ao crear a clave; o predeterminado é só lectura. Usar unha clave de lectura nun endpoint de escritura devolve 403 cunha mensaxe que indica que é a clave e que necesita o endpoint. O ámbito non se pode cambiar despois — cree outra clave e revogue a anterior.

3. Límites de frecuencia

Cada clave API limítase a 60 peticións por minuto, medidas nunha xanela móbil. Se supera o límite, as peticións reciben unha resposta 429 ata que se libere a xanela:

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

Está a crear algo que necesita máis límite? Contacte coa Asistencia e explíquenos o caso de uso.

4. Endpoints

GET/api/v1/projects

Lista todos os proxectos (sitios seguidos) do espazo de traballo.

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

Lista as sesións de visitantes gravadas nun proxecto, as máis recentes primeiro. Paxinado.

Parámetro de consultaDescrición
pageNúmero de páxina, predeterminado 1.
per_pageResultados por páxina, predeterminado 25, máximo 100.
sinceSó sesións que comezan nesta data ou despois (YYYY-MM-DD).
untilSó sesións que comezan nesta data ou antes.
{ "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}

Metadatos dunha sesión e as súas vistas de páxina. Exclúe deliberadamente os datos completos da reprodución — use o reprodutor do panel para iso.

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

Eventos personalizados activados nunha sesión (os mesmos que envía con mp('event', ...)), cos seus parámetros.

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

Lista os segmentos de visitantes definidos para un proxecto, tanto os propios como os de todo o espazo de traballo.

{ "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. Engadir un ID de cliente desde o backend

O navegador a miúdo non sabe quen está aí. Nun produto B2B a identidade determínase tras iniciar sesión — no backend. Nunha tenda determínase coa confirmación do pedido. Este endpoint é para ese momento.

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}}

O ID aparece na lista de sesións, pódese buscar nela e actívase o webhook session_identified — así chega ao CRM.

Chamar dúas veces co mesmo ID é seguro. A resposta volve con "changed": false e non se envía ningún webhook. Un pedido repetido non crea un segundo contacto potencial.
EstadoCando
400Falta un campo, user_id ten máis de 128 caracteres ou contén caracteres de control. Rexeitamos en lugar de truncar — un ID acurtado en silencio non coincide con nada no CRM e segue parecendo un éxito.
404A sesión non existe ou non pertence ao espazo de traballo. A mesma resposta para ambos deliberadamente.
403O plan do espazo de traballo non inclúe a API.

6. Webhook: verificar a sinatura

Os webhook configúranse por proxecto en Integracións, onde tamén está o segredo de sinatura. Cada entrega leva estas cabeceiras:

CabeceiraSignificado
X-MousePlayer-EventNome do evento, p. ex. session_identified
X-MousePlayer-TimestampSegundos Unix — parte do texto asinado
X-MousePlayer-Attempt1 no primeiro intento, maior nos novos intentos
X-MousePlayer-Signaturesha256=<hex>

A sinatura é un HMAC-SHA256 de timestamp + "." + raw body, usando como clave o segredo de sinatura do proxecto.

// 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');
Asine o corpo en bruto antes de analizar o JSON. Volver serializar cambia a orde das claves e os espazos e a sinatura nunca coincidirá. Rexeite tamén calquera marca de tempo de hai máis duns minutos — para iso serve.

Entrega e novos intentos

Unha entrega fallida reinténtase despois de 1 min, 5 min, 15 min, 1 h e 6 h e despois abandónase. As respostas 4xx distintas de 408 e 429 non se reintentan — significan "non así", non "non agora". Responda 2xx rapidamente e faga o traballo despois; a entrega esgota o tempo de espera tras 10 segundos.

Eventos dispoñibles

EventoActívase
session_identifiedCando unha sesión recibe por primeira vez un ID de cliente — desde o navegador ou a API
session_endedUnha vez, ao pechar a sesión
goal_reachedUnha vez por sesión cando un evento personalizado cumpre un dos obxectivos. Só obxectivos de tipo "event" — non se avalían os obxectivos URL, duración, vistas de páxina nin funís. Leva goal_id, goal_name, goal_value e currency.
high_value_sessionCando un visitante supera por primeira vez nun día o limiar de valor deste proxecto. O limiar derívase da súa propia distribución de puntuacións (percentil 90 dos últimos 90 días), non dun número fixo, e non existe ata puntuar polo menos 20 visitantes. Leva visitor_id, value_score, threshold e a sesión dese día que máis paga a pena ver.
funnel_dropoffAo final dunha sesión que entrou nun dos seus funís pero non o rematou. Indica o paso no que se detivo (dropped_at). Un abandono é a ausencia dun evento, polo que só se coñece tras rematar a sesión. As sesións que nunca entraron non son abandonos e non o activan.
high_friction_sessionUnha vez por sesión cando a puntuación de fricción alcanza por primeira vez o limiar (predeterminado: 60 de 100). Leva friction_score, os sinais que a explican (reasons) e o sinal que cruzou a liña (trigger).
element_brokenUnha vez cando un elemento seguido non atopou nada en ningunha vista de páxina comprobada durante varios días — normalmente tras un relanzamento. Só se activa de novo despois de que a marca coincida e volva fallar. Este evento non pertence a ningunha sesión: session_id e session_url son null, link_url abre a marca no seu lugar e subject_id identifica a marca — a mesma en cada versión, polo que un selector novo que volva fallar se une á incidencia aberta. Leva rule_id, rule_name, selector, page, checked_page_views, window_days e last_matched. Sen datos de visitantes.
element_recoveredO aviso de recuperación de element_broken: cando a marca realmente volve atopar un elemento — poucas vistas de páxina non abondan. Só se envía se element_broken se enviou por webhook e non ten interruptor propio: subscribirse a element_broken inclúeo. Usa o mesmo subject_id para que PagerDuty resolva a incidencia e Opsgenie peche a alerta. Leva matched_page_views e checked_page_views ademais.
anomaly_detectedUnha vez ao día cando onte foi claramente distinto dos 28 días anteriores: moitas menos ou máis sesións, caída da taxa de obxectivos, máis sesións con fricción ou erros de JS. A mesma métrica e dirección non se notifican durante unha semana (axustable). Este evento non pertence a ningunha sesión: session_id e session_url son null, link_url abre o resumo do proxecto e subject_id identifica a métrica, a dirección e o día. Leva metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score e un summary lexible e hint. Sen datos de visitantes. Para Web Vitals, measurements substitúe sessions, e page (baleiro para todo o sitio) e device (desktop ou mobil) indican onde ocorreu; link_url abre entón a lapela Web Vitals.
rage_clickAo detectar un clic de rabia
error_detectedNunha excepción do cliente
ceSubscrición conxunta para os eventos personalizados propios. Esta non inclúe os eventos anteriores — teñen os seus propios interruptores.

7. Erros & códigos de estado

EstadoSignificado
200Éxito.
401Clave API ausente, mal formada ou revogada.
404O proxecto ou sesión solicitado non existe ou non pertence ao espazo de traballo.
429Límite de frecuencia superado — envía máis de 60 peticións/minuto con esta clave.
403O plan do espazo de traballo non inclúe a API REST. A mensaxe indica tanto o plan necesario como o actual.

8. Notas de seguridade

  • As claves de só lectura (mp_ro_) non cambian nada. As de escritura (mp_rw_) só poden engadir ID de clientes; ningunha pode eliminar datos nin exportar reproducións en bruto.
  • Cada petición limítase automaticamente ao espazo de traballo da clave — non hai maneira de pasar outro ID de espazo de traballo e ver datos alleos.
  • Revogue unha clave en calquera momento desde /api-keys; a revogación aplícase inmediatamente.
  • Trate a clave API como un contrasinal. Se a publica accidentalmente nun repositorio público, revóguea inmediatamente e cree outra.

Páxinas de eventos limitadas (API v1, 14 de outubro de 2026)

GET /api/v1/sessions/{session_id}/events devolve ata 100 eventos de xeito predeterminado. Estableza per_page nun enteiro de 1 a 100. Siga pagination.next_cursor enviando cursor sen cambios na seguinte petición; conserve a mesma sesión e espazo de traballo. Os eventos ordénanse por created_at e event_id. Os cursores están asinados e vinculados a esa sesión e espazo de traballo. Non se devolve ningún total nin número de páxina.

A matriz data e o mapa params existentes seguen dispoñibles. pagination.returned é o número realmente devolto; pagination.has_more indica outra páxina. next_cursor é null ao rematar. A resposta limítase a 524288 bytes, polo que unha páxina pode conter menos eventos que per_page. Por evento devólvense como máximo 128 filas de parámetros; params_truncated é true se hai máis. Os parámetros de texto individuais conservan o límite de 255 caracteres da base de datos. Os parámetros truncados non están dispoñibles neste endpoint. Reducir per_page non aumenta o límite de parámetros.

Os tamaños de páxina non válidos, cursores alterados e cursores doutra sesión ou espazo de traballo devolven 400. Os datos excesivos dun evento individual devolven 413. As comprobacións de acceso existentes seguen devolvendo 401, 403, 404 ou 409 segundo corresponda.

O límite segue en 60 peticións autenticadas por clave API e minuto. Esgotalo devolve 429 con Retry-After: 60. Se Redis ou o limitador non están dispoñibles, as peticións devolven 503 con Retry-After: 5; nunca se aceptan sen límite. Respecte Retry-After e engada unha espera aleatoria; non reintente nun bucle axustado. Os fallos da base de datos de eventos tamén devolven 503. Os cursores non conxelan unha captura: as insercións simultáneas con marcas de tempo anteriores poden requirir outra exploración.

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 é unha ruta de control do backend só para Dev da vista previa do SDK nativo. Segue desactivada en produción. As claves Bearer do backend necesitan ámbito de lectura para list/replay e de escritura para register/grant/delete/disable. Aplícanse comprobacións adicionais de dispoñibilidade da vista previa nativa. Nunca integre claves API permanentes do espazo de traballo nunha aplicación móbil.