Δημόσιο API & κλειδιά API

Προγραμματιστική πρόσβαση στον χώρο εργασίας σας — διαβάστε έργα, συνεδρίες, προσαρμοσμένα συμβάντα και τμήματα και συνδέστε ID πελατών με συνεδρίες — με προστασία μέσω κλειδιών API περιορισμένων στον χώρο εργασίας.

1. Επισκόπηση

Το API του MousePlayer σάς επιτρέπει να ανακτάτε δεδομένα από τον χώρο εργασίας σας στους δικούς σας πίνακες ελέγχου, στην αποθήκη δεδομένων ή στα εσωτερικά εργαλεία σας. Εκτός από τη σύνδεση ID πελατών με συνεδρίες (identify, απαιτεί κλειδί με δικαίωμα εγγραφής, δείτε Εμβέλεια κλειδιών), παρέχει μόνο ανάγνωση: κανένα δεδομένο δεν μπορεί να τροποποιηθεί ή να διαγραφεί μέσω του API.

  • Βασικό URL: https://www.mouseplayer.com/api/v1/
  • Όλες οι αποκρίσεις είναι JSON.
  • Κάθε αίτημα ελέγχεται με κλειδί API και περιορίζεται αυτόματα στον χώρο εργασίας στον οποίο ανήκει το κλειδί — ένα κλειδί από έναν χώρο εργασίας δεν μπορεί ποτέ να δει δεδομένα άλλου χώρου, ούτε κατά λάθος.
  • Η πλήρης καταγραφή αναπαραγωγής συνεδρίας (κινήσεις ποντικιού, στιγμιότυπα DOM) δεν διατίθεται μέσω του API. Λαμβάνετε μεταδεδομένα συνεδριών, προβολές σελίδας, προσαρμοσμένα συμβάντα και τμήματα — αρκετά για τη δημιουργία αναφορών και πινάκων ελέγχου χωρίς μεταφορά του ανεπεξέργαστου φορτίου αναπαραγωγής.

2. Έλεγχος ταυτότητας

Δημιουργήστε και διαχειριστείτε τα κλειδιά API στην ενότητα Κλειδιά API του μενού λογαριασμού σας (/api-keys). Μόνο κάτοχοι και διαχειριστές χώρου εργασίας μπορούν να δημιουργούν ή να ανακαλούν κλειδιά.

Κρατήστε το κλειδί σας μυστικό. Παρέχει πρόσβαση ανάγνωσης σε όλα όσα βρίσκονται στον χώρο εργασίας σας. Το πλήρες κλειδί εμφανίζεται ακριβώς μία φορά, αμέσως μετά τη δημιουργία του — αποθηκεύστε το σε διαχειριστή κωδικών πρόσβασης ή θυρίδα μυστικών. Αν το χάσετε, ανακαλέστε το και δημιουργήστε νέο.

Στείλτε το κλειδί ως token Bearer στην κεφαλίδα Authorization κάθε αιτήματος:

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

Κλειδιά που λείπουν, έχουν λανθασμένη μορφή ή έχουν ανακληθεί λαμβάνουν απόκριση 401:

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

Απαίτηση προγράμματος

Το REST API περιλαμβάνεται στα προγράμματα Business και Enterprise. Λαμβάνεται υπόψη το πρόγραμμα του κατόχου του χώρου εργασίας, οπότε τα προσκεκλημένα μέλη ομάδας το κληρονομούν. Ο έλεγχος εκτελείται σε κάθε αίτημα, όχι μόνο όταν δημιουργείται ένα κλειδί — αν υποβαθμιστεί ο χώρος εργασίας, τα υπάρχοντα κλειδιά παύουν να λειτουργούν και επιστρέφουν 403.

Εμβέλεια κλειδιών

Κάθε κλειδί δηλώνει την εμβέλειά του στο δικό του πρόθεμα, ώστε να μπορείτε να καταλάβετε τι κάνει απλώς κοιτάζοντάς το — σε ένα .env, σε ένα αίτημα, σε ένα τερματικό.

ΠρόθεμαΣημασία
mp_ro_Μόνο ανάγνωση. Διαβάζει έργα, συνεδρίες, συμβάντα και τμήματα. Δεν μπορεί να αλλάξει τίποτα.
mp_rw_Ανάγνωση και εγγραφή. Όλα τα παραπάνω, συν σύνδεση ID πελατών μέσω του τελικού σημείου ταυτοποίησης.
Επιλέξτε την εμβέλεια όταν δημιουργείτε το κλειδί· η προεπιλογή είναι μόνο ανάγνωση. Η χρήση κλειδιού μόνο ανάγνωσης σε τελικό σημείο εγγραφής επιστρέφει 403 με μήνυμα που κατονομάζει τι είναι το κλειδί και τι χρειάζεται το τελικό σημείο. Η εμβέλεια δεν μπορεί να αλλάξει εκ των υστέρων — δημιουργήστε νέο κλειδί και ανακαλέστε το παλιό.

3. Όρια ρυθμού αιτημάτων

Κάθε κλειδί API περιορίζεται σε 60 αιτήματα ανά λεπτό, με παρακολούθηση σε κυλιόμενο χρονικό παράθυρο. Μόλις το υπερβείτε, τα αιτήματα λαμβάνουν απόκριση 429 μέχρι να εκκαθαριστεί το παράθυρο:

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

Δημιουργείτε κάτι που χρειάζεται υψηλότερο όριο; Επικοινωνήστε μέσω της Υποστήριξης και πείτε μας την περίπτωση χρήσης σας.

4. Τελικά σημεία

GET/api/v1/projects

Παραθέτει κάθε έργο (παρακολουθούμενο ιστότοπο) στον χώρο εργασίας σας.

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

Παραθέτει τις συνεδρίες επισκεπτών που καταγράφηκαν για ένα έργο, με τις νεότερες πρώτα. Με σελιδοποίηση.

Παράμετρος ερωτήματοςΠεριγραφή
pageΑριθμός σελίδας, προεπιλογή 1.
per_pageΑποτελέσματα ανά σελίδα, προεπιλογή 25, μέγιστο 100.
sinceΜόνο συνεδρίες που ξεκινούν κατά ή μετά από αυτή την ημερομηνία (YYYY-MM-DD).
untilΜόνο συνεδρίες που ξεκινούν κατά ή πριν από αυτή την ημερομηνία.
{ "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}

Μεταδεδομένα μίας συνεδρίας μαζί με τις προβολές σελίδας της. Σκόπιμα εξαιρείται το πλήρες φορτίο αναπαραγωγής — γι’ αυτό χρησιμοποιήστε το πρόγραμμα αναπαραγωγής του πίνακα ελέγχου.

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

Προσαρμοσμένα συμβάντα που ενεργοποιήθηκαν στη διάρκεια μιας συνεδρίας (τα ίδια συμβάντα που στέλνετε με mp('event', ...)), μαζί με τις παραμέτρους τους.

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

Παραθέτει τα τμήματα επισκεπτών που έχουν οριστεί για ένα έργο (τόσο τα ειδικά για το έργο όσο και εκείνα για ολόκληρο τον χώρο εργασίας).

{ "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. Σύνδεση ID πελάτη από τον διακομιστή σας

Το πρόγραμμα περιήγησης συχνά δεν γνωρίζει ποιος βρίσκεται μπροστά του. Σε ένα προϊόν B2B η ταυτότητα καθορίζεται μετά τη σύνδεση — στον διακομιστή σας. Σε ένα κατάστημα καθορίζεται με την επιβεβαίωση παραγγελίας. Αυτό το τελικό σημείο προορίζεται ακριβώς για εκείνη τη στιγμή.

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 εμφανίζεται έπειτα στη λίστα συνεδριών, μπορεί να αναζητηθεί εκεί και ενεργοποιείται το webhook session_identified — έτσι φτάνει στο CRM σας.

Η διπλή κλήση με το ίδιο ID είναι ασφαλής. Η απόκριση επιστρέφει με "changed": false και δεν αποστέλλεται webhook. Μια επαναλαμβανόμενη παραγγελία δεν δημιουργεί δεύτερο υποψήφιο πελάτη.
ΚατάστασηΠότε
400Πεδίο που λείπει, user_id με περισσότερους από 128 χαρακτήρες ή με χαρακτήρες ελέγχου. Απορρίπτουμε αντί να περικόπτουμε — ένα ID που συντομεύεται σιωπηλά δεν αντιστοιχεί σε τίποτα στο CRM σας και παρ’ όλα αυτά μοιάζει με επιτυχία.
404Η συνεδρία δεν υπάρχει ή δεν ανήκει στον χώρο εργασίας σας. Σκόπιμα η ίδια απάντηση και για τα δύο.
403Το πρόγραμμα του χώρου εργασίας δεν περιλαμβάνει το API.

6. Webhook: επαλήθευση της υπογραφής

Τα webhook διαμορφώνονται ανά έργο στην ενότητα Ενσωματώσεις, όπου βρίσκετε και το μυστικό υπογραφής. Κάθε παράδοση περιέχει αυτές τις κεφαλίδες:

ΚεφαλίδαΣημασία
X-MousePlayer-EventΌνομα συμβάντος, π.χ. session_identified
X-MousePlayer-TimestampΔευτερόλεπτα Unix — μέρος του υπογεγραμμένου κειμένου
X-MousePlayer-Attempt1 στην πρώτη προσπάθεια, υψηλότερο στις επαναλήψεις
X-MousePlayer-Signaturesha256=<hex>

Η υπογραφή είναι HMAC-SHA256 επί του timestamp + "." + raw body, με κλειδί το μυστικό υπογραφής του έργου σας.

// 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');
Υπογράψτε το ανεπεξέργαστο σώμα πριν από οποιαδήποτε ανάλυση JSON. Η εκ νέου σειριοποίηση αλλάζει τη σειρά κλειδιών και τα λευκά διαστήματα και η υπογραφή δεν θα ταιριάξει ποτέ. Απορρίψτε επίσης οτιδήποτε έχει χρονική σήμανση παλαιότερη από λίγα λεπτά — γι’ αυτό υπάρχει η χρονική σήμανση.

Παράδοση και επαναλήψεις

Μια αποτυχημένη παράδοση επαναλαμβάνεται μετά από 1 λεπτό, 5 λεπτά, 15 λεπτά, 1 ώρα και 6 ώρες και μετά εγκαταλείπεται. 4xx αποκρίσεις εκτός από 408 και 429 δεν επαναλαμβάνονται — δηλώνουν "όχι έτσι", όχι "όχι αυτή τη στιγμή". Απαντήστε 2xx γρήγορα και κάντε την εργασία μετά· η παράδοση λήγει μετά από 10 δευτερόλεπτα.

Διαθέσιμα συμβάντα

ΣυμβάνΕνεργοποιείται
session_identifiedΌταν μια συνεδρία αποκτά για πρώτη φορά ID πελάτη — από το πρόγραμμα περιήγησης ή από το API
session_endedΜία φορά, όταν κλείνει η συνεδρία
goal_reachedΜία φορά ανά συνεδρία, όταν ένα προσαρμοσμένο συμβάν εκπληρώνει έναν από τους στόχους σας. Μόνο στόχοι τύπου «event» — οι στόχοι URL, διάρκειας, προβολών σελίδας και χοάνης δεν αξιολογούνται. Περιέχει goal_id, goal_name, goal_value και currency.
high_value_sessionΌταν ένας επισκέπτης υπερβαίνει για πρώτη φορά το όριο αξίας αυτού του έργου σε συγκεκριμένη ημέρα. Το όριο προκύπτει από τη δική σας κατανομή βαθμολογιών (90ό εκατοστημόριο των τελευταίων 90 ημερών), δεν είναι σταθερός αριθμός και δεν υπάρχει μέχρι να βαθμολογηθούν τουλάχιστον 20 επισκέπτες. Περιέχει visitor_id, value_score, threshold και τη συνεδρία εκείνης της ημέρας που προσφέρεται περισσότερο για παρακολούθηση.
funnel_dropoffΣτο τέλος συνεδρίας που εισήλθε σε μία από τις χοάνες σας αλλά δεν την ολοκλήρωσε. Κατονομάζει το βήμα στο οποίο σταμάτησε (dropped_at). Μια αποχώρηση είναι η απουσία συμβάντος, οπότε μπορεί να διαπιστωθεί μόνο όταν ολοκληρωθεί η συνεδρία. Οι συνεδρίες που δεν εισήλθαν ποτέ στη χοάνη δεν είναι αποχωρήσεις και δεν ενεργοποιούν το συμβάν.
high_friction_sessionΜία φορά ανά συνεδρία, όταν η βαθμολογία τριβής της φτάνει για πρώτη φορά το όριο (προεπιλογή 60 από 100). Περιέχει friction_score, τις ενδείξεις πίσω από αυτήν (reasons) και την ένδειξη που υπερέβη το όριο (trigger).
element_brokenΜία φορά, όταν ένα παρακολουθούμενο στοιχείο δεν έχει βρει τίποτα σε καμία ελεγμένη προβολή σελίδας επί αρκετές ημέρες — συνήθως μετά από ανανέωση του ιστοτόπου. Ενεργοποιείται ξανά μόνο αφού η επισήμανση αντιστοιχιστεί και πάψει να λειτουργεί εκ νέου. Αυτό το συμβάν δεν ανήκει σε καμία συνεδρία: session_id και session_url είναι null, το link_url ανοίγει αντί γι’ αυτό την επισήμανση και το subject_id κατονομάζει την επισήμανση — το ίδιο για κάθε έκδοση, ώστε ένας νέος επιλογέας που παύει ξανά να λειτουργεί να συσχετίζεται με το ανοιχτό περιστατικό. Περιέχει rule_id, rule_name, selector, page, checked_page_views, window_days και last_matched. Χωρίς δεδομένα επισκεπτών.
element_recoveredΗ άρση συναγερμού για το element_broken: μόλις η επισήμανση βρει πράγματι ξανά στοιχείο — οι πολύ λίγες προβολές σελίδας δεν αρκούν. Αποστέλλεται μόνο αν το element_broken στάλθηκε μέσω webhook και δεν έχει δικό του διακόπτη: η εγγραφή στο element_broken το περιλαμβάνει. Ίδιο subject_id, οπότε το PagerDuty επιλύει το περιστατικό και το Opsgenie κλείνει την ειδοποίηση. Περιέχει matched_page_views και checked_page_views επιπλέον.
anomaly_detectedΜία φορά την ημέρα, όταν η χθεσινή ημέρα διέφερε σαφώς από τις προηγούμενες 28: πολύ λιγότερες ή πολύ περισσότερες συνεδρίες, μειωμένο ποσοστό επίτευξης στόχου, περισσότερες συνεδρίες με τριβή ή σφάλματα JS. Η ίδια μέτρηση και κατεύθυνση παραμένουν σιωπηλές για μία εβδομάδα (ρυθμιζόμενο). Αυτό το συμβάν δεν ανήκει σε καμία συνεδρία: session_id και session_url είναι null, το link_url ανοίγει την επισκόπηση έργου και το subject_id κατονομάζει μέτρηση, κατεύθυνση και ημέρα. Περιέχει metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score και ένα αναγνώσιμο summary και hint. Χωρίς δεδομένα επισκεπτών. Για τα Web Vitals, το measurements αντικαθιστά το sessions και τα page (κενό για ολόκληρο τον ιστότοπο) και device (desktop ή mobil) δηλώνουν πού συνέβη· το link_url ανοίγει τότε την καρτέλα Web Vitals.
rage_clickΣε εντοπισμένο κλικ οργής
error_detectedΣε εξαίρεση στην πλευρά του χρήστη
ceΣυλλογική εγγραφή για τα δικά σας προσαρμοσμένα συμβάντα. Δεν περιλαμβάνει τα παραπάνω συμβάντα — εκείνα έχουν τους δικούς τους διακόπτες.

7. Σφάλματα & κωδικοί κατάστασης

ΚατάστασηΣημασία
200Επιτυχία.
401Κλειδί API που λείπει, έχει λανθασμένη μορφή ή έχει ανακληθεί.
404Το ζητούμενο έργο ή η συνεδρία δεν υπάρχει ή δεν ανήκει στον χώρο εργασίας σας.
429Υπέρβαση ορίου ρυθμού αιτημάτων — στέλνετε περισσότερα από 60 αιτήματα/λεπτό με αυτό το κλειδί.
403Το πρόγραμμα του χώρου εργασίας δεν περιλαμβάνει το REST API. Το μήνυμα κατονομάζει τόσο το απαιτούμενο όσο και το τρέχον πρόγραμμα.

8. Σημειώσεις ασφαλείας

  • Τα κλειδιά μόνο ανάγνωσης (mp_ro_) δεν μπορούν να αλλάξουν τίποτα. Τα κλειδιά εγγραφής (mp_rw_) μπορούν μόνο να συνδέουν ID πελατών· κανένα κλειδί δεν μπορεί να διαγράψει δεδομένα ή να εξαγάγει ανεπεξέργαστα δεδομένα αναπαραγωγής.
  • Κάθε αίτημα περιορίζεται αυτόματα στον χώρο εργασίας του ίδιου του κλειδιού — δεν υπάρχει τρόπος να μεταβιβάσετε διαφορετικό ID χώρου εργασίας και να δείτε δεδομένα άλλου.
  • Ανακαλέστε ένα κλειδί ανά πάσα στιγμή από το /api-keys· η ανάκληση τίθεται σε ισχύ αμέσως.
  • Αντιμετωπίζετε το κλειδί API σας όπως έναν κωδικό πρόσβασης. Αν κατά λάθος το καταχωρίσετε σε δημόσιο αποθετήριο, ανακαλέστε το αμέσως και δημιουργήστε νέο.

Περιορισμένες σελίδες συμβάντων (API v1, 14 Οκτωβρίου 2026)

Το GET /api/v1/sessions/{session_id}/events επιστρέφει έως 100 συμβάντα από προεπιλογή. Ορίστε το per_page σε ακέραιο από 1 έως 100. Ακολουθήστε το pagination.next_cursor στέλνοντας το cursor αμετάβλητο στο επόμενο αίτημα· διατηρήστε την ίδια συνεδρία και τον ίδιο χώρο εργασίας. Τα συμβάντα ταξινομούνται βάσει created_at και event_id. Οι δρομείς σελιδοποίησης είναι υπογεγραμμένοι και δεσμευμένοι σε εκείνη τη συνεδρία και τον χώρο εργασίας. Δεν επιστρέφεται συνολικό πλήθος ή αριθμητική σελίδα.

Ο υπάρχων πίνακας data και η αντιστοίχιση params παραμένουν διαθέσιμα. Το pagination.returned είναι το πραγματικό πλήθος που επιστράφηκε· το pagination.has_more υποδεικνύει επιπλέον σελίδα. Το next_cursor είναι null όταν ολοκληρωθεί η ανάκτηση. Μια απόκριση περιορίζεται σε 524288 byte, οπότε μια σελίδα μπορεί να περιέχει λιγότερα συμβάντα από το per_page. Ανά συμβάν επιστρέφονται το πολύ 128 γραμμές παραμέτρων· το params_truncated είναι true αν υπάρχουν περισσότερες. Οι μεμονωμένες παράμετροι συμβολοσειράς διατηρούν το όριο της βάσης δεδομένων των 255 χαρακτήρων. Οι περικομμένες παράμετροι δεν διατίθενται μέσω αυτού του τελικού σημείου. Η μείωση του per_page δεν αυξάνει το όριο παραμέτρων.

Μη έγκυρα μεγέθη σελίδας, αλλοιωμένοι δρομείς σελιδοποίησης και δρομείς για άλλη συνεδρία/χώρο εργασίας επιστρέφουν 400. Υπερμεγέθη δεδομένα μεμονωμένου συμβάντος επιστρέφουν 413. Οι υπάρχοντες έλεγχοι πρόσβασης εξακολουθούν να επιστρέφουν 401, 403, 404 ή 409, ανάλογα με την περίπτωση.

Το όριο παραμένει 60 αιτήματα με έλεγχο ταυτότητας ανά κλειδί API ανά λεπτό. Η εξάντληση επιστρέφει 429 με Retry-After: 60. Αν το Redis ή ο περιοριστής δεν είναι διαθέσιμος, τα αιτήματα επιστρέφουν 503 με Retry-After: 5· δεν γίνονται ποτέ δεκτά χωρίς όριο. Τηρείτε το Retry-After και προσθέστε τυχαία καθυστέρηση επανάληψης· μην επαναλαμβάνετε σε σφιχτό βρόχο. Οι αστοχίες της βάσης δεδομένων συμβάντων επίσης επιστρέφουν 503. Οι δρομείς σελιδοποίησης δεν παγώνουν ένα στιγμιότυπο: οι ταυτόχρονες εισαγωγές με παλαιότερες χρονικές σημάνσεις μπορεί να απαιτήσουν νέα σάρωση.

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 είναι διαδρομή ελέγχου του διακομιστή αποκλειστικά στο Dev για την προεπισκόπηση του εγγενούς SDK. Παραμένει απενεργοποιημένο στην παραγωγή. Τα κλειδιά Bearer του διακομιστή χρειάζονται δικαίωμα ανάγνωσης για list/replay και εγγραφής για register/grant/delete/disable. Ισχύουν επιπλέον έλεγχοι διαθεσιμότητας της εγγενούς προεπισκόπησης. Μην ενσωματώνετε ποτέ μόνιμα κλειδιά API χώρου εργασίας σε εφαρμογή κινητού.