
Get daily active users with the Analytics API
Pull daily active user counts with GET https://api.cursor.com/analytics/team/dau. Official reference: Analytics API → Daily Active Users (DAU).
DAU is the number of unique users who used Cursor on a given day. An active user is a user who used at least one AI feature. The response also breaks out CLI, Cloud Agents, and BugBot DAU fields.
Authenticate with Basic auth (API key as username, empty password). Create keys at Cursor Dashboard → API Keys. Most Analytics endpoints need scope admin:*. Availability: Enterprise only. Team-level rate limit: 100 requests per minute per team (by-user endpoints: 50/min).
Query parameters
| Parameter | Rules |
|---|---|
startDate |
Optional. Default: 7 days ago. Prefer YYYY-MM-DD, or shortcuts now / today / yesterday / Nd. Max range 30 days. Time is ignored. |
endDate |
Optional. Default: today. Same formats as startDate. |
users |
Optional. Comma-separated emails and/or public user ids (user_…). |
Request
curl -X GET "https://api.cursor.com/analytics/team/dau?startDate=14d&endDate=today" \
-u YOUR_API_KEY:
Omit dates for the last 7 days:
curl -X GET "https://api.cursor.com/analytics/team/dau" \
-u YOUR_API_KEY:
Example response:
{
"data": [
{
"date": "2025-01-15",
"dau": 42,
"cli_dau": 5,
"cloud_agent_dau": 37,
"bugbot_dau": 10
},
{
"date": "2025-01-16",
"dau": 38,
"cli_dau": 4,
"cloud_agent_dau": 34,
"bugbot_dau": 12
}
],
"params": {
"metric": "dau",
"teamId": 12345,
"startDate": "2025-01-01",
"endDate": "2025-01-31"
}
}
Response fields
| Field | Type | Meaning |
|---|---|---|
date |
string | Day covered (YYYY-MM-DD). This endpoint names the day field date (agent-edits and tabs name theirs event_date) |
dau |
number | Unique users who used at least one AI feature that day |
cli_dau |
number | DAU breakdown for Cursor CLI |
cloud_agent_dau |
number | DAU breakdown for Cloud Agents |
bugbot_dau |
number | DAU breakdown for BugBot |
params.metric |
string | Echoes dau |
params.teamId |
number | Team id |
params.startDate / params.endDate |
string | Resolved range |
Caching
Send prior ETag values with If-None-Match. 304 Not Modified responses do not count against the rate limit. Cache window: Cache-Control: public, max-age=900. See API Overview → Caching.
Pitfalls
- Treating
cli_dau+cloud_agent_dau+bugbot_dauas a partition ofdau— breakdown metrics are separate counters; a user can land in more than one surface on the same day. - Requesting ranges wider than 30 days.
- Calling this for Bugbot review-level analytics — dedicated Bugbot analytics and review analytics endpoints (review analytics need
read:*) ship in a later batch; this response only includesbugbot_dau.
Sibling how-tos: Get agent edits, Get tab usage, Get model usage.