Offentligt API & API-nøgler
Programmatisk adgang til dit arbejdsområde — læs projekter, sessioner, brugerdefinerede hændelser og segmenter, og knyt kunde-ID'er til sessioner — sikret med API-nøgler afgrænset til arbejdsområdet.
1. Oversigt
MousePlayer-API'et lader dig hente data fra dit arbejdsområde til egne dashboards, data warehouses eller interne værktøjer. Bortset fra tilknytning af kunde-ID'er til sessioner (identify, kræver en nøgle med skriveadgang, se Nøgleadgang) er det skrivebeskyttet: ingen data kan ændres eller slettes via API'et.
- Basis-URL:
https://www.mouseplayer.com/api/v1/ - Alle svar er JSON.
- Hver forespørgsel godkendes med en API-nøgle og afgrænses automatisk til det arbejdsområde, nøglen tilhører — en nøgle fra ét arbejdsområde kan aldrig se et andets data, heller ikke ved et uheld.
- Den fulde sessionsoptagelse (musebevægelser, DOM-øjebliksbilleder) er ikke tilgængelig via API'et. Du får sessionsmetadata, sidevisninger, brugerdefinerede hændelser og segmenter — nok til rapporter og dashboards uden at flytte rå afspilningsdata rundt.
2. Godkendelse
Opret og administrer dine API-nøgler under API-nøgler i din kontomenu (/api-keys). Kun arbejdsområdets ejere og administratorer kan oprette eller tilbagekalde nøgler.
Hold nøglen hemmelig. Den giver læseadgang til alt i dit arbejdsområde. Hele nøglen vises præcis én gang, lige efter oprettelsen — gem den i en adgangskodeadministrator eller et sikkert hemmelighedslager. Mister du den, skal du tilbagekalde den og oprette en ny.
Send nøglen som et Bearer-token i Authorization-headeren på hver forespørgsel:
Manglende, forkert formaterede eller tilbagekaldte nøgler får et 401-svar:
Abonnementskrav
REST-API'et indgår i Business- og Enterprise-abonnementerne. Abonnementet bestemmes af arbejdsområdets ejer, så inviterede teammedlemmer arver det. Kontrollen udføres ved hver forespørgsel, ikke kun ved nøgleoprettelse — nedgraderes et arbejdsområde, holder eksisterende nøgler op med at virke og returnerer 403.
Nøgleadgang
Hver nøgles adgang fremgår af dens eget præfiks, så du kan se, hvad nøglen gør, blot ved at se på den — i en .env, i en sag eller i en terminal.
| Præfiks | Betydning |
|---|---|
mp_ro_ | Kun læseadgang. Læser projekter, sessioner, hændelser og segmenter. Kan ikke ændre noget. |
mp_rw_ | Læse- og skriveadgang. Alt ovenfor samt tilknytning af kunde-ID'er via identify-endepunktet. |
403 med en meddelelse om nøglens adgang og endepunktets krav. Adgangen kan ikke ændres bagefter — opret en ny nøgle, og tilbagekald den gamle.3. Forespørgselsgrænser
Hver API-nøgle er begrænset til 60 forespørgsler pr. minut, målt i et rullende tidsinterval. Overskrides grænsen, får forespørgsler et 429-svar, indtil intervallet er frigjort:
Bygger du noget, der kræver en højere grænse? Kontakt os via support og fortæl om dit formål.
4. Endepunkter
GET/api/v1/projects
Viser alle projekter (sporede websteder) i dit arbejdsområde.
GET/api/v1/projects/{channelid}/sessions
Viser besøgssessioner optaget for et projekt, nyeste først. Sideinddelt.
| Forespørgselsparameter | Beskrivelse |
|---|---|
page | Sidenummer, som standard 1. |
per_page | Resultater pr. side, som standard 25, højst 100. |
since | Kun sessioner, der starter på eller efter denne dato (YYYY-MM-DD). |
until | Kun sessioner, der starter på eller før denne dato. |
GET/api/v1/sessions/{session_id}
Metadata for én session samt dens sidevisninger. Udelader bevidst de fulde afspilningsdata — brug dashboardets afspiller til det.
GET/api/v1/sessions/{session_id}/events
Brugerdefinerede hændelser udløst under en session (de samme, du sender med mp('event', ...)), inklusive deres parametre.
GET/api/v1/projects/{channelid}/segments
Viser besøgssegmenter defineret for et projekt (både projektspecifikke segmenter og segmenter for hele arbejdsområdet).
5. Tilknyt et kunde-ID fra din backend
Browseren ved ofte ikke, hvem der sidder der. I et B2B-produkt fastlægges identiteten efter login — i din backend. I en butik sker det ved ordrebekræftelsen. Endepunktet er til netop det øjeblik.
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'et vises derefter på sessionslisten, kan søges frem der, og session_identified-webhooken udløses — sådan når det dit CRM.
"changed": false og ingen webhook sendes. En gentaget ordre opretter ikke endnu et lead.| Status | Hvornår |
|---|---|
400 | Manglende felt, user_id over 128 tegn eller med kontroltegn. Vi afviser i stedet for at afkorte — et stiltiende afkortet ID matcher intet i dit CRM og ligner stadig en succes. |
404 | Sessionen findes ikke eller tilhører ikke dit arbejdsområde. Bevidst samme svar i begge tilfælde. |
403 | Arbejdsområdets abonnement inkluderer ikke API'et. |
6. Webhooks: Kontrollér signaturen
Webhooks konfigureres pr. projekt under Integrationer, hvor du også finder signeringshemmeligheden. Hver levering indeholder disse headere:
| Header | Betydning |
|---|---|
X-MousePlayer-Event | Hændelsesnavn, f.eks. session_identified |
X-MousePlayer-Timestamp | Unix-sekunder — del af den signerede tekst |
X-MousePlayer-Attempt | 1 ved første forsøg, højere ved gentagne forsøg |
X-MousePlayer-Signature | sha256=<hex> |
Signaturen er en HMAC-SHA256 af timestamp + "." + raw body, med projektets signeringshemmelighed som nøgle.
// 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');
Levering og gentagne forsøg
En mislykket levering prøves igen efter 1 min., 5 min., 15 min., 1 t. og 6 t., hvorefter den opgives. 4xx-svar bortset fra 408 og 429 bliver ikke prøvet igen — de betyder "ikke sådan", ikke "ikke lige nu". Svar 2xx hurtigt, og udfør arbejdet bagefter; leveringen afbrydes efter 10 sekunder.
Tilgængelige hændelser
| Hændelse | Udløses |
|---|---|
session_identified | Når en session første gang får et kunde-ID — fra browseren eller API'et |
session_ended | Én gang, når sessionen lukkes |
goal_reached | Én gang pr. session, når en brugerdefineret hændelse opfylder et af dine mål. Kun mål af typen »event« — URL-, varigheds-, sidevisnings- og tragtmål evalueres ikke. Indeholder goal_id, goal_name, goal_value og currency. |
high_value_session | Når en besøgende første gang overskrider projektets værdigrænse på en given dag. Grænsen udledes af din egen scorefordeling (90-percentilen for de seneste 90 dage), ikke et fast tal, og findes først, når mindst 20 besøgende er vurderet. Indeholder visitor_id, value_score, threshold og dagens session, der er mest værd at se. |
funnel_dropoff | Ved afslutningen af en session, der gik ind i en af dine tragte, men ikke fuldførte den. Angiver trinnet, hvor den stoppede (dropped_at). Frafald er fraværet af en hændelse og kan derfor først konstateres, når sessionen er slut. Sessioner, der aldrig gik ind i tragten, er ikke frafald og udløser intet. |
high_friction_session | Én gang pr. session, når friktionsscoren første gang når grænsen (som standard 60 ud af 100). Indeholder friction_score, de bagvedliggende signaler (reasons) og det signal, der overskred grænsen (trigger). |
element_broken | Én gang, når et markeret element ikke har fundet noget i nogen kontrolleret sidevisning i flere dage — typisk efter en relancering. Udløses først igen, når markeringen har matchet og derefter fejlet på ny. Hændelsen tilhører ingen session: session_id og session_url er null, link_url åbner i stedet markeringen, og subject_id navngiver markeringen — ens for alle versioner, så en ny selektor, der fejler igen, knyttes til den åbne hændelse. Indeholder rule_id, rule_name, selector, page, checked_page_views, window_days og last_matched. Ingen besøgsdata. |
element_recovered | Raskmeldingen for element_broken: én gang, når markeringen faktisk finder et element igen — for få sidevisninger er ikke nok. Sendes kun, hvis element_broken blev sendt via webhook, og har ingen egen kontakt: et abonnement på element_broken inkluderer den. Samme subject_id, så PagerDuty løser hændelsen, og Opsgenie lukker advarslen. Indeholder matched_page_views og checked_page_views derudover. |
anomaly_detected | Én gang om dagen, når gårsdagen afveg tydeligt fra de foregående 28 dage: langt færre eller flere sessioner, fald i målopfyldelsen, flere sessioner med friktion eller JS-fejl. Samme måling og retning forbliver stille i en uge (kan justeres). Hændelsen tilhører ingen session: session_id og session_url er null, link_url åbner projektoversigten, og subject_id angiver måling, retning og dag. Indeholder metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score og en læsbar summary og hint. Ingen besøgsdata. Ved Web Vitals er measurements en erstatning for sessions, og page (tomt for hele webstedet) og device (desktop eller mobil) angiver, hvor det skete; link_url åbner så fanen Web Vitals. |
rage_click | Ved et registreret raseriklik |
error_detected | Ved en frontendundtagelse |
ce | Samlet abonnement på dine egne brugerdefinerede hændelser. Det inkluderer ikke hændelserne ovenfor — de har deres egne kontakter. |
7. Fejl & statuskoder
| Status | Betydning |
|---|---|
200 | Succes. |
401 | Manglende, forkert formateret eller tilbagekaldt API-nøgle. |
404 | Det ønskede projekt eller den ønskede session findes ikke eller tilhører ikke dit arbejdsområde. |
429 | Forespørgselsgrænsen er overskredet — du sender over 60 forespørgsler/minut med denne nøgle. |
403 | Arbejdsområdets abonnement inkluderer ikke REST-API'et. Meddelelsen angiver både det krævede og det aktuelle abonnement. |
8. Sikkerhedsbemærkninger
- Læsenøgler (mp_ro_) kan ikke ændre noget. Skrivenøgler (mp_rw_) kan kun tilknytte kunde-ID'er; ingen nøgle kan slette data eller eksportere rå afspilningsdata.
- Hver forespørgsel afgrænses automatisk til nøglens eget arbejdsområde — du kan ikke angive et andet arbejdsområdes ID og se andres data.
- Tilbagekald når som helst en nøgle fra /api-keys; tilbagekaldelsen træder straks i kraft.
- Behandl din API-nøgle som en adgangskode. Hvis du ved et uheld committer en til et offentligt repository, skal du straks tilbagekalde den og oprette en ny.
Begrænsede hændelsessider (API v1, 14. oktober 2026)
GET /api/v1/sessions/{session_id}/events returnerer som standard op til 100 hændelser. Sæt per_page til et heltal fra 1 til 100. Følg pagination.next_cursor ved at sende cursor uændret i næste forespørgsel; behold samme session og arbejdsområde. Hændelser sorteres efter created_at og event_id. Markører er signerede og bundet til den pågældende session og arbejdsområde. Der returneres intet samlet antal eller numerisk sidenummer.
Det eksisterende data-array og params-map er fortsat tilgængelige. pagination.returned er det faktisk returnerede antal; pagination.has_more angiver, om der er endnu en side. next_cursor er null, når alt er hentet. Et svar er begrænset til 524288 bytes, så en side kan have færre hændelser end per_page. Pr. hændelse returneres højst 128 parameterrækker; params_truncated er true, hvis der findes flere. Enkelte tekstparametre bevarer databasens grænse på 255 tegn. Afkortede parametre er ikke tilgængelige via dette endepunkt. Lavere per_page hæver ikke parametergrænsen.
Ugyldige sidestørrelser, ændrede markører og markører til en anden session eller et andet arbejdsområde giver 400. For store data i en enkelt hændelse giver 413. Eksisterende adgangskontroller returnerer fortsat 401, 403, 404 eller 409 efter behov.
Grænsen er fortsat 60 godkendte forespørgsler pr. API-nøgle pr. minut. Opbrug giver 429 med Retry-After: 60. Hvis Redis eller begrænseren er utilgængelig, giver forespørgsler 503 med Retry-After: 5; de tillades aldrig uden en grænse. Respektér Retry-After, og tilføj tilfældig ventetid; gentag ikke i en tæt løkke. Fejl i hændelsesdatabasen giver også 503. Markører fastlåser ikke et øjebliksbillede: samtidige indsættelser med ældre tidsstempler kan kræve en ny gennemlæsning.
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 er en backendkontrolrute kun i Dev til forhåndsvisning af det native SDK. Den forbliver deaktiveret i produktion. Backendens Bearer-nøgler kræver læseadgang til list/replay og skriveadgang til register/grant/delete/disable. Yderligere tilgængelighedskontroller for native-forhåndsvisning gælder. Indlejr aldrig permanente API-nøgler til arbejdsområder i en mobilapp.