Sessions for one tracked user, cursor-paginated
VIEWER+. Slim shape — no event payload, no trait JSON. Detail fields hydrate per-row via the session detail endpoint on demand. `userDisplayName` is `null` here on purpose (the user-detail page already surfaces the identity above the table).
/api/tracked-users/{userId}/sessionsVIEWER+. Slim shape — no event payload, no trait JSON. Detail fields hydrate per-row via the session detail endpoint on demand. userDisplayName is null here on purpose (the user-detail page already surfaces the identity above the table).
Path Parameters
TrackedUser id (cuid)
Query Parameters
1 <= value <= 100Response Body
application/json
curl -X GET "https://loading/api/tracked-users/string/sessions"{
"data": [
{
"id": "ses_p1q2r3s4",
"externalId": "9b2e1d4c-6a3f-4f8e-9b1d-2c8a4e6f7a90",
"projectId": "prj_x9y8z7w6",
"projectName": "Production",
"url": "https://your-app.com/checkout",
"duration": 184320,
"eventCount": 1247,
"createdAt": "2026-04-26T10:30:00.000Z",
"trackedUserId": "tu_t5u6v7w8",
"userId": "usr_abc123",
"userDisplayName": null,
"userTraits": null
}
],
"nextCursor": null
}Activity dashboard data bundle GET
VIEWER+. Three SQL queries in parallel — histogram, page distribution, KPI aggregates — in a rolling window picked from `?range=` (default `24h`). `Cache-Control: no-store` because the histogram advances with each ingest batch.
Online-status heartbeat GET
VIEWER+. Lightweight — `MAX(Session.endedAt)` keyed on the indexed `trackedUserId`, no `Event` table scan. Online flag flips when the most recent session ended within `ONLINE_THRESHOLD_MS`. `Cache-Control: no-store` so polling sees fresh values.