Statistics
Platform analytics and usage metrics. Some responses are cached server-side — see the per-endpoint cache lifetime below. For course, journey and quiz figures, see Academy Statistics.
Required scope: read:stats
Endpoints
/api/open/v1/stats/usersUser counts and activity summary (cached 1h)
/api/open/v1/stats/engagementEngagement time series (not cached)
/api/open/v1/stats/adoptionAdoption rate by department (cached 1h)
/api/open/v1/stats/contentContent activity in the last 7 days vs the 7 before (recomputed hourly, cached 2h)
/stats/users
Counts every user who is not deleted, shadow users excluded. active_* counts users by when they last used the app; new_* counts users by when the account was created.
{
"data": {
"total": 1250,
"registered": 1100,
"active_yesterday": 340,
"active_7d": 780,
"active_30d": 1050,
"new_yesterday": 5,
"new_7d": 32,
"new_30d": 95
}
}/stats/engagement
| Query param | Default | Notes |
|---|---|---|
granularity | week | day, week, month or year. |
scope | 12 | Number of periods to return, 1 to 52. Outside that range returns 422. |
group_ids | — | Comma-separated group IDs. Narrows the figures to users in any of the given groups. IDs that do not exist are ignored; when none of them exist the figures cover every user. |
One row per period, oldest first. Each row names its period by year plus week (week), month (month) or month and day (day); a year row has year only. start is the period's first date.
| Field | Notes |
|---|---|
total_users | Users who existed at the end of the period. Shadow, banned, kiosk, bot and other non-employee users are left out of every figure. |
app_users | Of those, users who had registered by the end of the period. |
active_users | Distinct users who used the app in the period. |
app_time | Time spent in the app in the period, in seconds. |
sessions | Number of app sessions in the period. |
{
"data": [
{
"year": 2026,
"week": 10,
"start": "2026-03-02",
"total_users": 1250,
"app_users": 1100,
"active_users": 340,
"app_time": 52800,
"sessions": 890
}
]
}/stats/adoption
The share of employees who have registered (accepted their invite), overall and per department. Banned and terminated employees do not count as active.
| Query param | Notes |
|---|---|
group_ids | Optional. Comma-separated group IDs. Narrows the calculation to users in any of the given groups. An ID that does not exist returns 404. |
{
"data": {
"adoption_rate": {
"average": 72.5,
"active": 290,
"total_employees": 400,
"departments": [
{ "id": 1, "name": "Kitchen", "active": 18, "not_active": 7, "total_employees": 25, "average": 72 }
]
}
}
}average, active and total_employees at the top count each employee in a department once, however many departments they are in. departments lists every department; average is a percentage with one decimal.
/stats/content
this_week is the last 7 days up to now and last_week the 7 days before that; they are rolling windows, not calendar weeks. total counts everything. todo_tasks_completed counts to-do tasks by when they were checked off.
The figures are recomputed at the start of every hour and kept in the cache for 2 hours, so a response is normally at most an hour old and the windows end at the time of that refresh, not at the time of your request. When nothing is cached yet, the request computes the figures itself and caches them for 2 hours.
{
"data": {
"posts": { "this_week": 45, "last_week": 38, "total": 1250 },
"comments": { "this_week": 120, "last_week": 95, "total": 4800 },
"reactions": { "this_week": 230, "last_week": 210, "total": 8900 },
"chat_messages": { "this_week": 560, "last_week": 480, "total": 22000 },
"todo_tasks_completed": { "this_week": 85, "last_week": 72, "total": 3400 }
}
}