API công khai & khóa API
Truy cập không gian làm việc bằng mã — đọc dự án, phiên, sự kiện tùy chỉnh và phân khúc, gắn ID khách hàng vào phiên — được bảo vệ bằng khóa API giới hạn theo không gian làm việc.
1. Tổng quan
API MousePlayer cho phép lấy dữ liệu từ không gian làm việc vào bảng điều khiển, kho dữ liệu hoặc công cụ nội bộ của bạn. Ngoài việc gắn ID khách hàng vào phiên (identify, cần khóa có phạm vi ghi, xem Phạm vi khóa), API chỉ đọc: không thể sửa hoặc xóa dữ liệu qua API.
- URL cơ sở:
https://www.mouseplayer.com/api/v1/ - Mọi phản hồi đều là JSON.
- Mọi yêu cầu được xác thực bằng khóa API và tự giới hạn trong không gian làm việc của khóa — khóa của một không gian làm việc không bao giờ thấy dữ liệu của không gian khác, kể cả vô tình.
- Bản ghi phát lại phiên đầy đủ (di chuyển chuột, ảnh chụp DOM) không được cung cấp qua API. Bạn nhận siêu dữ liệu phiên, lượt xem trang, sự kiện tùy chỉnh và phân khúc — đủ để xây dựng báo cáo và bảng điều khiển mà không chuyển payload phát lại thô đi khắp nơi.
2. Xác thực
Tạo và quản lý khóa API trong mục Khóa API trên menu tài khoản (/api-keys). Chỉ chủ sở hữu và quản trị viên không gian làm việc có thể tạo hoặc thu hồi khóa.
Giữ bí mật khóa. Khóa cấp quyền đọc mọi thứ trong không gian làm việc. Khóa đầy đủ được hiển thị đúng một lần ngay sau khi tạo — lưu trong trình quản lý mật khẩu hoặc kho bí mật. Nếu mất, thu hồi và tạo khóa mới.
Gửi khóa dưới dạng token Bearer trong tiêu đề Authorization của mọi yêu cầu:
Khóa thiếu, sai định dạng hoặc đã thu hồi nhận phản hồi 401:
Yêu cầu về gói
REST API là một phần của các gói Business và Enterprise. Gói được lấy từ chủ sở hữu không gian làm việc nên thành viên được mời kế thừa. Kiểm tra chạy trên mọi yêu cầu, không chỉ khi tạo khóa — nếu không gian làm việc hạ gói, khóa hiện có ngừng hoạt động và trả 403.
Phạm vi khóa
Mọi khóa mang phạm vi trong tiền tố nên chỉ cần nhìn là biết khóa làm gì — trong .env, trong phiếu hoặc trong terminal.
| Tiền tố | Ý nghĩa |
|---|---|
mp_ro_ | Chỉ đọc. Đọc dự án, phiên, sự kiện và phân khúc. Không thể thay đổi gì. |
mp_rw_ | Đọc và ghi. Mọi chức năng trên, cộng gắn ID khách hàng qua điểm cuối identify. |
403 kèm thông báo nêu rõ loại khóa và quyền điểm cuối cần. Không thể đổi phạm vi về sau — tạo khóa mới và thu hồi khóa cũ.3. Giới hạn tần suất
Mỗi khóa API giới hạn 60 yêu cầu mỗi phút, theo cửa sổ trượt. Vượt giới hạn, yêu cầu nhận phản hồi 429 cho đến khi cửa sổ được giải phóng:
Bạn cần giới hạn cao hơn? Liên hệ qua Hỗ trợ và cho biết trường hợp sử dụng.
4. Điểm cuối
GET/api/v1/projects
Liệt kê mọi dự án (thuộc tính được theo dõi) trong không gian làm việc.
GET/api/v1/projects/{channelid}/sessions
Liệt kê phiên khách được ghi cho dự án, mới nhất trước. Có phân trang.
| Tham số truy vấn | Mô tả |
|---|---|
page | Số trang, mặc định 1. |
per_page | Kết quả mỗi trang, mặc định 25, tối đa 100. |
since | Chỉ phiên bắt đầu vào hoặc sau ngày này (YYYY-MM-DD). |
until | Chỉ phiên bắt đầu vào hoặc trước ngày này. |
GET/api/v1/sessions/{session_id}
Siêu dữ liệu của một phiên cùng các lượt xem trang. Chủ động không gồm payload phát lại đầy đủ — dùng trình phát trong bảng điều khiển để xem.
GET/api/v1/sessions/{session_id}/events
Sự kiện tùy chỉnh kích hoạt trong phiên (cùng sự kiện bạn gửi bằng mp('event', ...)), gồm các tham số.
GET/api/v1/projects/{channelid}/segments
Liệt kê phân khúc khách được định nghĩa cho dự án (cả riêng dự án và toàn không gian làm việc).
5. Gắn ID khách hàng từ hệ thống phía sau
Trình duyệt thường không biết ai đang ngồi đó. Với sản phẩm B2B, danh tính được xác định sau đăng nhập — trong hệ thống phía sau của bạn. Với cửa hàng, khi xác nhận đơn hàng. Điểm cuối này dành cho đúng thời điểm đó.
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 xuất hiện trong danh sách phiên, tìm kiếm được tại đó và webhook session_identified kích hoạt — nhờ đó đến CRM.
"changed": false và không gửi webhook. Đơn hàng lặp lại không tạo khách hàng tiềm năng thứ hai.| Trạng thái | Khi nào |
|---|---|
400 | Thiếu trường, user_id dài hơn 128 ký tự hoặc chứa ký tự điều khiển. Chúng tôi từ chối thay vì cắt ngắn — ID âm thầm bị rút gọn không khớp gì trong CRM mà vẫn trông như thành công. |
404 | Phiên không tồn tại hoặc không thuộc không gian làm việc của bạn. Chủ động cùng câu trả lời cho cả hai. |
403 | Gói của không gian làm việc không có API. |
6. Webhook: xác minh chữ ký
Webhook được cấu hình theo dự án tại Tích hợp, nơi có khóa bí mật ký. Mỗi lần gửi có các tiêu đề:
| Tiêu đề | Ý nghĩa |
|---|---|
X-MousePlayer-Event | Tên sự kiện, ví dụ: session_identified |
X-MousePlayer-Timestamp | Giây Unix — một phần văn bản được ký |
X-MousePlayer-Attempt | 1 ở lần thử đầu, cao hơn khi thử lại |
X-MousePlayer-Signature | sha256=<hex> |
Chữ ký là HMAC-SHA256 trên timestamp + "." + raw body với khóa bí mật ký của dự án.
// 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');
Gửi và thử lại
Lần gửi thất bại được thử lại sau 1 phút, 5 phút, 15 phút, 1 giờ và 6 giờ rồi bỏ cuộc. Với loại 4xx, các phản hồi ngoài 408 và 429 đều không được thử lại — chúng nói "không được làm như vậy", không phải "không phải lúc này". Hãy trả 2xx nhanh rồi làm việc sau; lần gửi hết thời gian chờ sau 10 giây.
Sự kiện có sẵn
| Sự kiện | Kích hoạt |
|---|---|
session_identified | Khi phiên lần đầu nhận ID khách hàng — từ trình duyệt hoặc API |
session_ended | Một lần khi phiên đóng |
goal_reached | Một lần mỗi phiên, khi sự kiện tùy chỉnh hoàn thành một mục tiêu. Chỉ mục tiêu loại “event” — không đánh giá mục tiêu URL, thời lượng, lượt xem trang và phễu. Chứa goal_id, goal_name, goal_value và currency. |
high_value_session | Khi khách lần đầu vượt ngưỡng giá trị của dự án trong một ngày. Ngưỡng được suy ra từ phân bố điểm của chính bạn (phân vị thứ 90 của 90 ngày qua), không phải số cố định và chưa tồn tại cho đến khi có ít nhất 20 khách được chấm điểm. Chứa visitor_id, value_score, threshold và phiên đáng xem nhất ngày đó. |
funnel_dropoff | Cuối phiên đã vào một phễu nhưng chưa hoàn tất. Nêu bước dừng tại (dropped_at). Rời bỏ là sự vắng mặt của sự kiện nên chỉ biết khi phiên kết thúc. Phiên chưa từng vào phễu không phải rời bỏ và không kích hoạt. |
high_friction_session | Một lần mỗi phiên khi điểm trở ngại lần đầu đạt ngưỡng (mặc định 60 trên 100). Chứa friction_score, các tín hiệu tạo nên điểm (reasons) và tín hiệu vượt ngưỡng (trigger). |
element_broken | Một lần khi phần tử được theo dõi không tìm thấy kết quả trong mọi lượt xem trang đã kiểm tra suốt vài ngày — thường sau khi ra mắt lại. Chỉ kích hoạt lại sau khi phần đánh dấu đã khớp rồi lại hỏng. Sự kiện này thuộc không phiên nào: session_id và session_url là null, link_url thay vào đó mở phần đánh dấu và subject_id chỉ định phần đánh dấu — giống nhau cho mọi phiên bản nên bộ chọn mới lại hỏng sẽ gộp vào sự cố đang mở. Chứa rule_id, rule_name, selector, page, checked_page_views, window_days và last_matched. Không có dữ liệu khách. |
element_recovered | Tín hiệu hoạt động trở lại cho element_broken: một lần khi phần đánh dấu thực sự tìm thấy phần tử trở lại — quá ít lượt xem trang không đủ. Chỉ gửi nếu element_broken đã được gửi qua webhook và không có công tắc riêng: đăng ký element_broken bao gồm cả sự kiện này. Cùng subject_id nên PagerDuty giải quyết sự cố và Opsgenie đóng cảnh báo. Chứa thêm matched_page_views và checked_page_views. |
anomaly_detected | Một lần mỗi ngày khi hôm qua khác rõ rệt so với 28 ngày trước đó: số phiên ít hoặc nhiều hơn hẳn, tỷ lệ đạt mục tiêu giảm, nhiều phiên có trở ngại hoặc lỗi JS hơn. Cùng chỉ số và hướng sẽ im lặng một tuần (có thể chỉnh). Sự kiện này thuộc không phiên nào: session_id và session_url là null, link_url mở tổng quan dự án và subject_id chỉ định chỉ số, hướng và ngày. Chứa metric (sessions, goal_rate, friction_rate, js_error_rate, lcp_p75, inp_p75, cls_p75), direction, day, value, expected, sessions, robust_z, z_score cùng nội dung dễ đọc summary và hint. Không có dữ liệu khách. Với Web Vitals, measurements thay cho sessions và page (trống cho toàn trang web) cùng device (desktop hoặc mobil) cho biết nơi xảy ra; link_url khi đó mở thẻ Web Vitals. |
rage_click | Khi phát hiện nhấp do bực bội |
error_detected | Khi có ngoại lệ phía giao diện |
ce | Đăng ký chung các sự kiện tùy chỉnh của bạn. Điều này không gồm sự kiện ở trên — chúng có công tắc riêng. |
7. Lỗi & mã trạng thái
| Trạng thái | Ý nghĩa |
|---|---|
200 | Thành công. |
401 | Khóa API thiếu, sai định dạng hoặc đã thu hồi. |
404 | Dự án hoặc phiên yêu cầu không tồn tại hoặc không thuộc không gian làm việc của bạn. |
429 | Vượt giới hạn tần suất — bạn gửi hơn 60 yêu cầu/phút với khóa này. |
403 | Gói của không gian làm việc không có REST API. Thông báo nêu cả gói cần thiết và gói hiện tại. |
8. Lưu ý bảo mật
- Khóa chỉ đọc (mp_ro_) không thay đổi được gì. Khóa ghi (mp_rw_) chỉ gắn ID khách hàng; không khóa nào xóa dữ liệu hoặc xuất dữ liệu phát lại thô.
- Mọi yêu cầu tự giới hạn trong không gian làm việc của khóa — không có cách truyền ID không gian làm việc khác để xem dữ liệu người khác.
- Thu hồi khóa bất cứ lúc nào tại /api-keys; có hiệu lực ngay lập tức.
- Coi khóa API như mật khẩu. Nếu vô tình commit vào kho mã công khai, thu hồi ngay rồi tạo khóa mới.
Trang sự kiện có giới hạn (API v1, 14 tháng 10 năm 2026)
GET /api/v1/sessions/{session_id}/events mặc định trả tối đa 100 sự kiện. Đặt per_page thành số nguyên từ 1 đến 100. Theo pagination.next_cursor bằng cách gửi nguyên cursor trong yêu cầu tiếp theo; giữ cùng phiên và không gian làm việc. Sự kiện sắp theo created_at và event_id. Con trỏ phân trang được ký và gắn với phiên và không gian làm việc đó. Không trả tổng số hay số trang.
Mảng data và ánh xạ params hiện có vẫn khả dụng. pagination.returned là số lượng thực tế trả về; pagination.has_more cho biết có trang nữa. next_cursor là null khi hoàn tất. Phản hồi giới hạn 524288 byte nên trang có thể ít sự kiện hơn per_page. Mỗi sự kiện trả tối đa 128 hàng tham số; params_truncated là true nếu còn nhiều hơn. Tham số chuỗi riêng vẫn giữ giới hạn cơ sở dữ liệu 255 ký tự. Không thể lấy tham số bị cắt qua điểm cuối này. Giảm per_page không tăng giới hạn tham số.
Kích thước trang không hợp lệ, con trỏ phân trang bị sửa và con trỏ cho phiên/không gian làm việc khác trả 400. Dữ liệu riêng của sự kiện quá lớn trả 413. Kiểm tra quyền truy cập hiện có vẫn trả 401, 403, 404 hoặc 409 tùy trường hợp.
Giới hạn vẫn là 60 yêu cầu được xác thực mỗi khóa API mỗi phút. Hết hạn mức trả 429 với Retry-After: 60. Nếu Redis hoặc bộ giới hạn không khả dụng, yêu cầu trả 503 với Retry-After: 5; không bao giờ được chấp nhận mà không có giới hạn. Tuân thủ Retry-After và thêm thời gian chờ ngẫu nhiên; không thử lại trong vòng lặp sát nhau. Lỗi cơ sở dữ liệu sự kiện cũng trả 503. Con trỏ không đóng băng ảnh chụp: dữ liệu thêm đồng thời có dấu thời gian cũ hơn có thể cần quét mới.
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 là tuyến kiểm soát phía máy chủ chỉ dành cho Dev để xem trước SDK native. Vẫn tắt trong production. Khóa Bearer phía máy chủ cần phạm vi đọc cho list/replay và ghi cho register/grant/delete/disable. Áp dụng thêm kiểm tra khả dụng native-preview. Không bao giờ nhúng khóa API không gian làm việc vĩnh viễn vào ứng dụng di động.