
Get agent edits with the Analytics API
Pull team-level metrics on AI-suggested code edits accepted in Cursor with GET https://api.cursor.com/analytics/team/agent-edits. Official reference: Analytics API → Agent Edits.
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).
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/agent-edits" \
-u YOUR_API_KEY:
With a date window and user filter:
curl -X GET "https://api.cursor.com/analytics/team/agent-edits?startDate=14d&endDate=today&users=alice@example.com,user_abc123" \
-u YOUR_API_KEY:
Example response:
{
"data": [
{
"event_date": "2025-01-15",
"total_suggested_diffs": 145,
"total_accepted_diffs": 98,
"total_rejected_diffs": 47,
"total_green_lines_accepted": 820,
"total_red_lines_accepted": 160,
"total_green_lines_rejected": 210,
"total_red_lines_rejected": 60,
"total_green_lines_suggested": 1030,
"total_red_lines_suggested": 220,
"total_lines_suggested": 1250,
"total_lines_accepted": 980
}
],
"params": {
"metric": "agent-edits",
"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) |
total_suggested_diffs |
number | AI-suggested diffs offered |
total_accepted_diffs |
number | Diffs accepted |
total_rejected_diffs |
number | Diffs rejected |
total_green_lines_accepted / total_red_lines_accepted |
number | Accepted added / removed lines |
total_green_lines_rejected / total_red_lines_rejected |
number | Rejected added / removed lines |
total_green_lines_suggested / total_red_lines_suggested |
number | Suggested added / removed lines |
total_lines_suggested |
number | Total suggested lines |
total_lines_accepted |
number | Total accepted lines |
params.metric |
string | Echoes agent-edits |
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.
- Reading Tab autocomplete volume from this endpoint — use Get tab usage for
/analytics/team/tabs. - Polling without
If-None-Match— burns the 100/min team budget on identical payloads.
Sibling how-tos in this batch: Get tab usage, Get daily active users, Get model usage.