
Get client versions with the Analytics API
Pull team-level distribution of Cursor client versions with GET https://api.cursor.com/analytics/team/client-versions. Official reference: Analytics API → Client Versions.
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 Analytics endpoints are 50/min — covered in a later batch).
Defaults to the last 7 days. When a user has multiple versions installed on a day, the API reports the latest version for that user that day.
Query parameters
| Parameter | Rules |
|---|---|
startDate |
Optional. Default: 7 days ago. Prefer YYYY-MM-DD, or shortcuts now / today / yesterday / Nd (e.g. 14d). Max range 30 days. Time is ignored (day-level UTC). |
endDate |
Optional. Default: today. Same formats as startDate. |
users |
Optional. Comma-separated emails and/or public user ids (user_…). Mix formats in one request. |
Omit both dates for the last 7 days (simplest path for HTTP caching). Prefer day shortcuts or YYYY-MM-DD over ISO timestamps so ETag cache hits stay stable.
Request
curl -X GET "https://api.cursor.com/analytics/team/client-versions" \
-u YOUR_API_KEY:
With a date window and user filter:
curl -X GET "https://api.cursor.com/analytics/team/client-versions?startDate=14d&endDate=today&users=alice@example.com,user_abc123" \
-u YOUR_API_KEY:
Example response:
{
"data": [
{
"event_date": "2025-01-01",
"client_version": "0.42.3",
"user_count": 35,
"percentage": 0.833
},
{
"event_date": "2025-01-01",
"client_version": "0.42.2",
"user_count": 7,
"percentage": 0.167
}
],
"params": {
"metric": "client-versions",
"teamId": 12345,
"startDate": "2025-01-01",
"endDate": "2025-01-31"
}
}
Response fields
| Field | Type | Meaning |
|---|---|---|
event_date |
string | Day the metrics cover (YYYY-MM-DD) |
client_version |
string | Cursor client version string |
user_count |
number | Users on that version that day |
percentage |
number | Share of users on that version (0–1 scale in the docs example) |
params.metric |
string | Echoes client-versions |
params.teamId |
number | Team id for the key |
params.startDate / params.endDate |
string | Resolved range |
Caching
Store the response ETag and send it back as If-None-Match on the next poll. Unchanged data returns 304 Not Modified with no body; 304s do not count against the rate limit. Analytics endpoints use Cache-Control: public, max-age=900 (15 minutes). See API Overview → Caching.
Pitfalls
- Requesting more than 30 days — the Analytics date range caps at 30 days.
- Sending timestamps with clock times — time is ignored, and varying times break ETag cache hits.
- Treating every installed build as a separate daily row — the API keeps the latest version per user per day.
- Polling without
If-None-Match— burns the 100/min team budget on identical payloads.
Sibling how-tos in this batch: Get top file extensions, Get MCP adoption, Get commands adoption. Related: Get agent edits, Get daily active users, Get model usage.