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:

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

Manglende, forkert formaterede eller tilbagekaldte nøgler får et 401-svar:

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

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æfiksBetydning
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.
Vælg adgangen, når du opretter nøglen; standarden er kun læseadgang. Brug af en læsenøgle på et skriveendepunkt returnerer 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:

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

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.

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

Viser besøgssessioner optaget for et projekt, nyeste først. Sideinddelt.

ForespørgselsparameterBeskrivelse
pageSidenummer, som standard 1.
per_pageResultater pr. side, som standard 25, højst 100.
sinceKun sessioner, der starter på eller efter denne dato (YYYY-MM-DD).
untilKun sessioner, der starter på eller før denne dato.
{ "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}

Metadata for én session samt dens sidevisninger. Udelader bevidst de fulde afspilningsdata — brug dashboardets afspiller til det.

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

Brugerdefinerede hændelser udløst under en session (de samme, du sender med mp('event', ...)), inklusive deres parametre.

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

Viser besøgssegmenter defineret for et projekt (både projektspecifikke segmenter og segmenter for hele arbejdsområdet).

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

Det er sikkert at kalde to gange med samme ID. Svaret returneres med "changed": false og ingen webhook sendes. En gentaget ordre opretter ikke endnu et lead.
StatusHvornår
400Manglende 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.
404Sessionen findes ikke eller tilhører ikke dit arbejdsområde. Bevidst samme svar i begge tilfælde.
403Arbejdsområ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:

HeaderBetydning
X-MousePlayer-EventHændelsesnavn, f.eks. session_identified
X-MousePlayer-TimestampUnix-sekunder — del af den signerede tekst
X-MousePlayer-Attempt1 ved første forsøg, højere ved gentagne forsøg
X-MousePlayer-Signaturesha256=<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');
Signer det rå indhold før JSON-fortolkning. Ny serialisering ændrer nøglerækkefølge og blanktegn, så signaturen aldrig matcher. Afvis også alt med et tidsstempel, der er mere end få minutter gammelt — det er formålet med tidsstemplet.

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ændelseUdløses
session_identifiedNå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_sessionNå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_dropoffVed 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_recoveredRaskmeldingen 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_clickVed et registreret raseriklik
error_detectedVed en frontendundtagelse
ceSamlet abonnement på dine egne brugerdefinerede hændelser. Det inkluderer ikke hændelserne ovenfor — de har deres egne kontakter.

7. Fejl & statuskoder

StatusBetydning
200Succes.
401Manglende, forkert formateret eller tilbagekaldt API-nøgle.
404Det ønskede projekt eller den ønskede session findes ikke eller tilhører ikke dit arbejdsområde.
429Forespørgselsgrænsen er overskredet — du sender over 60 forespørgsler/minut med denne nøgle.
403Arbejdsområ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.