Публичен API & ключове за API
Програмен достъп до работното ви пространство — четене на проекти, сесии, персонализирани събития и сегменти и добавяне на клиентски идентификатори към сесии — защитен с ключове за API с обхват работно пространство.
1. Общ преглед
API на MousePlayer позволява извличане на данни от работното ви пространство в собствени табла, хранилище за данни или вътрешни инструменти. Освен добавянето на клиентски идентификатори към сесии (identify, изисква ключ с право за запис, вижте „Обхвати на ключовете“) той е само за четене: през API не могат да се променят или изтриват данни.
- Базов URL адрес:
https://www.mouseplayer.com/api/v1/ - Всички отговори са JSON.
- Всяка заявка се удостоверява с ключ за API и автоматично се ограничава до работното пространство, на което ключът принадлежи — ключ от едно работно пространство никога не може да види данни от друго, дори случайно.
- Пълният запис за възпроизвеждане на сесията (движения на мишката, DOM снимки) не се предоставя чрез API. Получавате метаданни на сесията, показвания на страници, персонализирани събития и сегменти — достатъчно за отчети и табла, без прехвърляне на необработените данни за възпроизвеждане.
2. Удостоверяване
Създавайте и управлявайте ключовете си за API под Ключове за API в менюто на акаунта (/api-keys). Само собствениците и администраторите на работното пространство могат да създават или отменят ключове.
Пазете ключа си в тайна. Той дава достъп за четене до всичко в работното ви пространство. Пълният ключ се показва точно веднъж, веднага след създаване — съхранете го в мениджър на пароли или хранилище за тайни. Ако го загубите, отменете го и създайте нов.
Изпращайте ключа като Bearer токен в заглавката Authorization на всяка заявка:
При липсващ, неправилно оформен или отменен ключ се получава отговор 401:
Изискване за план
REST API е част от плановете Бизнес и Корпоративен. Планът се взема от собственика на работното пространство, така че поканените членове го наследяват. Проверката се изпълнява при всяка заявка, не само при създаване на ключ — ако работното пространство премине към по-нисък план, съществуващите ключове спират да работят и връщат 403.
Обхвати на ключовете
Всеки ключ съдържа обхвата си в собствения си префикс, така че можете да разберете какво прави само като го погледнете — в .env, в заявка за поддръжка, в терминал.
| Префикс | Значение |
|---|---|
mp_ro_ | Само за четене. Чете проекти, сесии, събития и сегменти. Не може да променя нищо. |
mp_rw_ | Четене и запис. Всичко по-горе плюс добавяне на клиентски идентификатори чрез крайната точка identify. |
403 със съобщение, посочващо какъв е ключът и какво изисква крайната точка. Обхватът не може да се променя впоследствие — създайте нов ключ и отменете стария.3. Ограничения на честотата
Всеки ключ за API е ограничен до 60 заявки в минута, отчитани в плъзгащ се времеви прозорец. При надвишаване заявките получават отговор 429 до освобождаване на прозореца:
Създавате нещо, което изисква по-висок лимит? Свържете се чрез Поддръжка и ни разкажете за случая си на употреба.
4. Крайни точки
GET/api/v1/projects
Изброява всички проекти (проследявани сайтове) в работното ви пространство.
GET/api/v1/projects/{channelid}/sessions
Изброява записаните посетителски сесии за проект, първо най-новите. С разделяне на страници.
| Параметър на заявката | Описание |
|---|---|
page | Номер на страницата, по подразбиране 1. |
per_page | Резултати на страница, по подразбиране 25, най-много 100. |
since | Само сесии, започващи на или след тази дата (YYYY-MM-DD). |
until | Само сесии, започващи на или преди тази дата. |
GET/api/v1/sessions/{session_id}
Метаданни за отделна сесия и показванията ѝ на страници. Умишлено изключва пълните данни за възпроизвеждане — използвайте плейъра в таблото за тях.
GET/api/v1/sessions/{session_id}/events
Персонализирани събития, задействани по време на сесия (същите събития, които изпращате с mp('event', ...)), включително параметрите им.
GET/api/v1/projects/{channelid}/segments
Изброява сегментите на посетителите, дефинирани за проект (както специфичните за проекта, така и общите за работното пространство).
5. Добавяне на клиентски идентификатор от вашия бекенд
Браузърът често не знае кой стои отсреща. В 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}}След това идентификаторът се появява в списъка със сесии, може да се търси там и се задейства webhook session_identified — така достига до CRM системата ви.
"changed": false и не се изпраща webhook. Повторена поръчка не създава втори потенциален клиент.| Състояние | Кога |
|---|---|
400 | Липсващо поле, user_id над 128 знака или с управляващи знаци. Отхвърляме, вместо да съкращаваме — незабележимо съкратен идентификатор не съвпада с нищо във вашата CRM система, но пак изглежда като успех. |
404 | Сесията не съществува или не принадлежи на работното ви пространство. Умишлено един и същ отговор и за двете. |
403 | Планът на работното пространство не включва API. |
6. Webhook заявки: проверка на подписа
Webhook заявките се конфигурират за всеки проект под Интеграции, където е и тайната за подписване. Всяко доставяне съдържа тези заглавки:
| Заглавка | Значение |
|---|---|
X-MousePlayer-Event | Име на събитието, напр. session_identified |
X-MousePlayer-Timestamp | Unix секунди — част от подписвания текст |
X-MousePlayer-Attempt | 1 при първия опит, по-високо при повторни опити |
X-MousePlayer-Signature | sha256=<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');
Доставяне и повторни опити
Неуспешното доставяне се повтаря след 1 мин., 5 мин., 15 мин., 1 ч. и 6 ч., след което се прекратява. 4xx отговори, различни от 408 и 429 не се повтарят — те означават "не по този начин", а не "не точно сега". Отговаряйте с 2xx бързо и вършете работата след това; доставянето изтича след 10 секунди.
Налични събития
| Събитие | Задейства се |
|---|---|
session_identified | Когато сесия за първи път получи клиентски идентификатор — от браузъра или от 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_) могат само да добавят клиентски идентификатори; никой ключ не може да изтрива данни или да експортира необработени данни за възпроизвеждане.
- Всяка заявка автоматично се ограничава до собственото работно пространство на ключа — няма начин да подадете друг идентификатор на работно пространство и да видите чужди данни.
- Отменяйте ключ по всяко време от /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 байта, затова страница може да съдържа по-малко събития от 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 на работно пространство в мобилно приложение.