Публичен 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 на всяка заявка:

# 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 е част от плановете Бизнес и Корпоративен. Планът се взема от собственика на работното пространство, така че поканените членове го наследяват. Проверката се изпълнява при всяка заявка, не само при създаване на ключ — ако работното пространство премине към по-нисък план, съществуващите ключове спират да работят и връщат 403.

Обхвати на ключовете

Всеки ключ съдържа обхвата си в собствения си префикс, така че можете да разберете какво прави само като го погледнете — в .env, в заявка за поддръжка, в терминал.

ПрефиксЗначение
mp_ro_Само за четене. Чете проекти, сесии, събития и сегменти. Не може да променя нищо.
mp_rw_Четене и запис. Всичко по-горе плюс добавяне на клиентски идентификатори чрез крайната точка identify.
Изберете обхвата при създаване на ключа; по подразбиране е само за четене. Използване на ключ само за четене с крайна точка за запис връща 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. Добавяне на клиентски идентификатор от вашия бекенд

Браузърът често не знае кой стои отсреща. В 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-TimestampUnix секунди — част от подписвания текст
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Когато сесия за първи път получи клиентски идентификатор — от браузъра или от 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 на работно пространство в мобилно приложение.