
Plans
Get daily usage data with the Organization API
Retrieve daily usage metrics for every member across teams linked to your organization with POST https://api.cursor.com/organizations/daily-usage-data. Each row matches the team daily-usage shape and adds an owning teamId. Official reference: Organization API → Get Daily Usage Data.
Authenticate with an Organization API key (Basic auth, key as username, empty password). Usage routes need usage:* (or admin:*). Enterprise only. For one team, use the team Admin API (Get daily usage data).
Usage aggregates at the hourly level. Poll at most once per hour. Org usage routes share the 20 requests per minute rate limit. The date range cannot exceed 30 days — split longer windows into multiple requests.
Request
curl -X POST https://api.cursor.com/organizations/daily-usage-data \
-u YOUR_ORGANIZATION_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"organizationId": "org_abc123",
"startDate": 1710720000000,
"endDate": 1710892800000,
"page": 1,
"pageSize": 1000
}'
| Field | Rules |
|---|---|
organizationId |
Required. Public org id. Must match the key’s organization |
startDate |
Optional. Epoch ms. Defaults to 7 days ago |
endDate |
Optional. Epoch ms. Defaults to now |
teamIds |
Optional. Org-linked teams to include. Max 100 teams per request. Omitted = all teams in the pool |
page |
Optional. 1-indexed. Default 1 |
pageSize |
Optional. Users per page (1–1000). Default 1000 |
userEmail |
Optional. One email or a comma-separated list. userEmails is accepted as an alias |
Results are paginated by user and cover every member with a membership during the requested range.
Response fields (each data row)
| Field | Meaning |
|---|---|
userId |
Encoded user id with the user_ prefix |
teamId |
Org-linked team this row belongs to |
day |
ISO date for the record (e.g. 2024-03-18) |
date |
Date as epoch milliseconds |
email |
User email |
isActive |
Whether the user had activity that day |
totalLinesAdded / totalLinesDeleted |
Lines of code added / deleted |
acceptedLinesAdded / acceptedLinesDeleted |
AI-suggested lines accepted |
totalApplies / totalAccepts / totalRejects |
Apply / accept / reject counts |
totalTabsShown / totalTabsAccepted |
Tab completion shown / accepted |
composerRequests / chatRequests / agentRequests / cmdkUsages |
Surface request counts |
subscriptionIncludedReqs / apiKeyReqs / usageBasedReqs |
Raw usage-event counters (not billable request units under older request-based pricing) |
bugbotUsages |
Bugbot usages that day |
mostUsedModel |
Most-used model id, or null |
applyMostUsedExtension / tabMostUsedExtension |
Common extensions, or null |
clientVersion |
Cursor client version, or null |
Response also includes period (startDate, endDate) and pagination (page, pageSize, totalUsers, totalPages, hasNextPage, hasPreviousPage).
Pitfalls
- Body
organizationIdmust match the Organization API key or the call is rejected. - Ranges longer than 30 days are rejected — page the calendar instead of widening one request.
- At most 100
teamIdsper call. - Prefer summing
chargedCentsfrom filtered usage events (orrequestsCostsunder older request-based pricing) when you need billable cost; the*Reqscounters here are raw event counts. - Mint a key with
usage:*oradmin:*for reporting.