Julkinen API & API-avaimet

Ohjelmallinen pääsy työtilaan — lue projektit, istunnot, mukautetut tapahtumat ja segmentit sekä liitä asiakastunnukset istuntoihin — työtilaan rajatuilla API-avaimilla suojattuna.

1. Yleiskuva

MousePlayerin API tuo työtilan tiedot omiin koontinäyttöihin, tietovarastoon tai sisäisiin työkaluihin. Asiakastunnusten liittämistä lukuun ottamatta (identify, vaatii kirjoitusoikeudellisen avaimen, katso Avainten oikeudet) se on vain lukuun: tietoja ei voi muokata tai poistaa API:n kautta.

  • Perus-URL: https://www.mouseplayer.com/api/v1/
  • Kaikki vastaukset ovat JSON-muodossa.
  • Jokainen pyyntö todennetaan API-avaimella ja rajataan automaattisesti avaimen omaan työtilaan — yhden työtilan avain ei koskaan näe toisen tietoja edes vahingossa.
  • Koko istuntotoistotallennetta (hiiren liikkeet, DOM-tilannekuvat) ei julkaista API:n kautta. Saat istunnon metatiedot, sivun katselut, mukautetut tapahtumat ja segmentit — riittävästi raportteihin ja koontinäyttöihin ilman raakojen toistotietojen siirtelyä.

2. Todennus

Luo ja hallitse API-avaimia tilivalikon kohdassa API-avaimet (/api-keys). Vain työtilan omistajat ja ylläpitäjät voivat luoda tai perua avaimia.

Pidä avain salassa. Se antaa lukuoikeuden kaikkeen työtilassa. Koko avain näytetään täsmälleen kerran heti luonnin jälkeen — tallenna se salasananhallintaan tai salaisuusholviin. Jos se katoaa, peru se ja luo uusi.

Lähetä avain Bearer-tunnuksena jokaisen pyynnön otsakkeessa Authorization:

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

Puuttuva, virheellinen tai peruttu avain saa vastauksen 401:

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

Tilausvaatimus

REST API sisältyy tilauksiin Business ja Enterprise. Tilaus tarkistetaan työtilan omistajalta, joten kutsutut tiimin jäsenet perivät sen. Tarkistus tehdään jokaisessa pyynnössä, ei vain avainta luotaessa — jos työtilan tilaus alennetaan, olemassa olevat avaimet lakkaavat toimimasta ja palauttavat 403.

Avainten oikeudet

Jokaisen avaimen oikeus näkyy sen omassa etuliitteessä. Avaimen toiminnan näkee siis katsomalla sitä — kohteessa .env, tukipyynnössä tai päätteessä.

EtuliiteMerkitys
mp_ro_Vain luku. Lukee projektit, istunnot, tapahtumat ja segmentit. Ei voi muuttaa mitään.
mp_rw_Luku ja kirjoitus. Kaikki edellä mainittu sekä asiakastunnusten liittäminen identify-päätepisteellä.
Valitse oikeudet avainta luotaessa; oletus on vain luku. Vain lukuun tarkoitetun avaimen käyttö kirjoituspäätepisteessä palauttaa 403 ja viestin, joka kertoo avaimen oikeudet ja päätepisteen tarpeet. Oikeuksia ei voi muuttaa jälkikäteen — luo uusi avain ja peru vanha.

3. Pyyntörajoitukset

Jokaisen API-avaimen raja on 60 pyyntöä minuutissa, liukuvassa aikaikkunassa. Ylityksen jälkeen pyynnöt saavat vastauksen 429, kunnes aikaikkunassa on taas tilaa:

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

Tarvitseeko rakennettava ratkaisu korkeamman rajan? Ota yhteyttä asiakastukeen ja kerro käyttötapauksesta.

4. Päätepisteet

GET/api/v1/projects

Luettelee työtilan kaikki projektit (seurattavat sivustot).

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

Luettelee projektin tallennetut kävijäistunnot uusimmasta alkaen. Sivutettu.

KyselyparametriKuvaus
pageSivunumero, oletus 1.
per_pageTuloksia sivulla, oletus 25, enintään 100.
sinceVain istunnot, jotka alkavat tänä päivänä tai myöhemmin (YYYY-MM-DD).
untilVain istunnot, jotka alkavat tänä päivänä tai aiemmin.
{ "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}

Yhden istunnon metatiedot ja sivun katselut. Koko toistosisältö on tarkoituksella jätetty pois — käytä siihen koontinäytön soitinta.

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

Istunnon aikana lauenneet mukautetut tapahtumat (samat, jotka lähetetään kutsulla mp('event', ...)), parametrit mukana.

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

Luettelee projektille määritetyt kävijäsegmentit (sekä projekti- että työtilakohtaiset).

{ "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. Asiakastunnuksen liittäminen taustajärjestelmästä

Selain ei usein tiedä, kuka sitä käyttää. B2B-tuotteessa henkilöllisyys selviää kirjautumisen jälkeen — taustajärjestelmässä. Kaupassa se selviää tilausvahvistuksesta. Tämä päätepiste on juuri sitä hetkeä varten.

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

Tunnus näkyy sitten istuntoluettelossa ja on haettavissa. Samalla webhook session_identified laukeaa — ja näin tieto päätyy CRM:ään.

Saman tunnuksen kutsuminen kahdesti on turvallista. Vastauksessa on "changed": false, eikä webhookia lähetetä. Toistettu tilaus ei luo toista liidiä.
TilaMilloin
400Puuttuva kenttä, user_id on yli 128 merkkiä pitkä tai sisältää ohjausmerkkejä. Hylkäämme katkaisun sijaan — hiljaa lyhennetty tunnus ei vastaa mitään CRM:ssä ja näyttää silti onnistumiselta.
404Istuntoa ei ole olemassa tai se ei kuulu työtilaan. Molemmissa tarkoituksella sama vastaus.
403Työtilan tilaus ei sisällä API:a.

6. Webhookit: allekirjoituksen tarkistaminen

Webhookit määritetään projektikohtaisesti kohdassa Integraatiot, jossa on myös allekirjoitussalaisuus. Jokaisessa toimituksessa ovat seuraavat otsakkeet:

OtsakeMerkitys
X-MousePlayer-EventTapahtuman nimi, esim. session_identified
X-MousePlayer-TimestampUnix-sekunnit — osa allekirjoitettua tekstiä
X-MousePlayer-AttemptEnsimmäisellä yrityksellä 1, uusinnoissa suurempi
X-MousePlayer-Signaturesha256=<hex>

Allekirjoitus on HMAC-SHA256-tiiviste arvosta timestamp + "." + raw body, avaimena projektin allekirjoitussalaisuus.

// 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');
Allekirjoita raaka sisältö ennen JSON-jäsennystä. Uudelleensarjoitus muuttaa avainten järjestystä ja välilyöntejä, eikä allekirjoitus enää täsmää. Hylkää myös yli muutaman minuutin vanhat aikaleimat — sitä varten aikaleima on.

Toimitus ja uusinnat

Epäonnistunutta toimitusta yritetään uudelleen aikojen 1 min, 5 min, 15 min, 1 h ja 6 h jälkeen, sitten luovutetaan. 4xx-vastauksia, lukuun ottamatta 408 ja 429, ei yritetä uudelleen — ne sanovat "ei näin", eivät "ei juuri nyt". Vastaa 2xx nopeasti ja tee työ sen jälkeen; toimitus aikakatkaistaan 10 sekunnissa.

Saatavilla olevat tapahtumat

TapahtumaLaukeaa
session_identifiedKun istunto saa asiakastunnuksen ensimmäistä kertaa — selaimesta tai API:n kautta
session_endedKerran istunnon sulkeutuessa
goal_reachedKerran istunnossa, kun mukautettu tapahtuma täyttää yhden tavoitteista. Vain tavoitteet tyyppiä ”event” — URL-, kesto-, sivun katselu- ja suppilotavoitteita ei arvioida. Mukana ovat goal_id, goal_name, goal_value ja currency.
high_value_sessionKun kävijä ylittää projektin arvokynnyksen ensimmäistä kertaa tiettynä päivänä. Kynnys johdetaan omasta pistejakaumasta (viimeisten 90 päivän 90. persentiili), ei kiinteästä luvusta. Sitä ei ole ennen vähintään 20 kävijän pisteytystä. Mukana ovat visitor_id, value_score, threshold ja päivän katselun arvoisin istunto.
funnel_dropoffSuppiloon tulleen mutta sitä kesken jättäneen istunnon lopussa. Nimeää vaiheen, johon se pysähtyi (dropped_at). Keskeytys on tapahtuman puuttumista, joten se tiedetään vasta istunnon loputtua. Istunnot, jotka eivät koskaan tulleet suppiloon, eivät ole keskeytyksiä eivätkä laukaise tapahtumaa.
high_friction_sessionKerran istunnossa kitkapisteiden saavuttaessa kynnyksen ensimmäistä kertaa (oletus 60/100). Mukana ovat friction_score, taustalla olevat signaalit (reasons) ja rajan ylittänyt signaali (trigger).
element_brokenKerran, kun seurattu elementti ei ole löytänyt mitään yhdestäkään tarkistetusta sivun katselusta useaan päivään — yleensä uudelleenjulkaisun jälkeen. Laukeaa uudelleen vasta, kun merkintä on ensin osunut ja sitten rikkoutunut taas. Tapahtuma ei kuulu mihinkään istuntoon: session_id ja session_url ovat null, link_url avaa sen sijaan merkinnän, ja subject_id nimeää merkinnän — sama kaikissa versioissa, joten uudelleen rikkoutuva uusi valitsin liittyy avoimeen häiriöön. Mukana ovat rule_id, rule_name, selector, page, checked_page_views, window_days ja last_matched. Ei kävijätietoja.
element_recoveredPalautumisilmoitus tapahtumalle element_broken: kun merkintä taas todella löytää elementin — liian vähäinen sivun katselujen määrä ei riitä. Lähetetään vain, jos element_broken on toimitettu webhookilla. Omaa kytkintä ei ole: tilaus kohteeseen element_broken sisältää sen. Sama subject_id, joten PagerDuty ratkaisee häiriön ja Opsgenie sulkee hälytyksen. Mukana ovat lisäksi matched_page_views ja checked_page_views.
anomaly_detectedKerran päivässä, kun eilinen poikkesi selvästi edeltävistä 28 päivästä: selvästi vähemmän tai enemmän istuntoja, laskenut tavoiteaste, enemmän kitkaa tai JS-virheitä sisältäviä istuntoja. Sama mittari ja suunta pysyvät hiljaa viikon (säädettävissä). Tapahtuma ei kuulu mihinkään istuntoon: session_id ja session_url ovat null, link_url avaa projektin yleiskuvan, ja subject_id nimeää mittarin, suunnan ja päivän. Mukana ovat metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score ja luettavat summary ja hint. Ei kävijätietoja. Web Vitals -mittareissa measurements korvaa arvon sessions, ja page (tyhjä koko sivustolle) sekä device (desktop tai mobil) kertovat tapahtumapaikan; link_url avaa tällöin Web Vitals -välilehden.
rage_clickHavaitun raivoklikkauksen yhteydessä
error_detectedKäyttöliittymäpoikkeuksen yhteydessä
ceOmien mukautettujen tapahtumien yhteistilaus. Se ei sisällä yllä olevia tapahtumia — niillä on omat kytkimensä.

7. Virheet & tilakoodit

TilaMerkitys
200Onnistui.
401Puuttuva, virheellinen tai peruttu API-avain.
404Pyydettyä projektia tai istuntoa ei ole tai se ei kuulu työtilaan.
429Pyyntöraja ylitetty — avaimella lähetetään yli 60 pyyntöä minuutissa.
403Työtilan tilaus ei sisällä REST API:a. Viesti nimeää sekä vaaditun että nykyisen tilauksen.

8. Tietoturvahuomioita

  • Vain lukuun tarkoitetut avaimet (mp_ro_) eivät voi muuttaa mitään. Kirjoitusavaimet (mp_rw_) voivat vain liittää asiakastunnuksia; mikään avain ei voi poistaa tietoja tai viedä raakoja toistotietoja.
  • Jokainen pyyntö rajataan automaattisesti avaimen omaan työtilaan — toista työtilatunnusta ei voi antaa muiden tietojen katsomiseksi.
  • Peru avain milloin tahansa kohdassa /api-keys; peruminen tulee voimaan heti.
  • Käsittele API-avainta kuin salasanaa. Jos se päätyy vahingossa julkisen koodivaraston committiin, peru se heti ja luo uusi.

Rajatut tapahtumasivut (API v1, 14. lokakuuta 2026)

GET /api/v1/sessions/{session_id}/events palauttaa oletuksena enintään 100 tapahtumaa. Aseta per_page kokonaisluvuksi väliltä 1–100. Seuraa pagination.next_cursor-arvoa lähettämällä cursor muuttumattomana seuraavassa pyynnössä; pidä sama istunto ja työtila. Tapahtumat järjestetään kenttien created_at ja event_id mukaan. Kohdistimet allekirjoitetaan ja sidotaan istuntoon ja työtilaan. Kokonaismäärää tai numeerista sivua ei palauteta.

Nykyiset data-taulukko ja params-kartta säilyvät käytettävissä. pagination.returned on palautettu määrä; pagination.has_more ilmaisee seuraavan sivun. next_cursor on null lopussa. Vastauksen raja on 524288 tavua, joten sivulla voi olla vähemmän tapahtumia kuin per_page. Tapahtumaa kohti palautetaan enintään 128 parametririviä; params_truncated on true, jos rivejä on enemmän. Yksittäisten merkkijonoparametrien tietokantaraja on edelleen 255 merkkiä. Katkaistut parametrit eivät ole saatavilla tästä päätepisteestä. per_page-arvon pienentäminen ei nosta parametrirajaa.

Virheelliset sivukoot, muutetut kohdistimet ja toisen istunnon tai työtilan kohdistimet palauttavat 400:n. Liian suuri yksittäinen tapahtuma palauttaa 413:n. Nykyiset käyttöoikeustarkistukset palauttavat edelleen tilanteen mukaan 401, 403, 404 tai 409.

Raja on edelleen 60 todennettua pyyntöä API-avainta ja minuuttia kohti. Ylitys palauttaa 429:n ja Retry-After: 60. Jos Redis tai rajoitin ei ole käytettävissä, pyyntö palauttaa 503:n ja Retry-After: 5; rajoittamatonta pääsyä ei koskaan sallita. Noudata Retry-After-arvoa ja lisää satunnaista uudelleenyritysviivettä; älä yritä tiheässä silmukassa. Tapahtumatietokannan virheet palauttavat myös 503:n. Kohdistimet eivät jäädytä tilannekuvaa: samanaikaiset lisäykset vanhoilla aikaleimoilla voivat vaatia uuden läpikäynnin.

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 on vain Dev-ympäristön taustajärjestelmän ohjausreitti natiivin SDK:n esikatseluun. Se pysyy poissa käytöstä tuotannossa. Taustajärjestelmän Bearer-avaimet tarvitsevat lukuoikeuden toimintoihin list/replay ja kirjoitusoikeuden toimintoihin register/grant/delete/disable. Lisäksi tehdään natiiviesikatselun saatavuustarkistukset. Älä koskaan upota pysyviä työtilan API-avaimia mobiilisovellukseen.