
Get Conversation Insights with the Analytics API
Pull team-level aggregate Conversation Insights with GET https://api.cursor.com/analytics/team/conversation-insights. Official reference: Analytics API → Conversation Insights.
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, with Conversation Insights enabled. If Disable Conversation Insights is turned on in team settings, this endpoint returns 401. Team-level rate limit: 100 requests per minute per team (by-user Analytics endpoints are 50/min — covered in a later batch).
Returns the same aggregate Conversation Insights data the dashboard shows. Raw conversation exports and raw conversation content stay off this endpoint. intents and complexity describe whole conversations. categories, guidanceLevels, and workTypes describe work across conversation segments. The shared users filter still works. SCIM group filtering stays in the dashboard UI; the Analytics API omits it.
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. |
include |
Required. Comma-separated list or repeated param. Supported values: intents, complexity, categories, guidanceLevels, workTypes. Examples: include=intents,complexity or include=intents&include=workTypes. |
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/conversation-insights?include=intents,complexity,categories,guidanceLevels,workTypes" \
-u YOUR_API_KEY:
With a date window and user filter:
curl -X GET "https://api.cursor.com/analytics/team/conversation-insights?startDate=2026-03-01&endDate=2026-03-07&include=intents,complexity,categories,guidanceLevels,workTypes&users=alice@example.com,bob@example.com" \
-u YOUR_API_KEY:
Example response:
{
"data": {
"intents": {
"distribution": [
{
"intent": "Write Code",
"count": 18
},
{
"intent": "Ask",
"count": 7
},
{
"intent": "Plan",
"count": 3
}
],
"topValues": [
{
"intent": "Write Code",
"count": 18
},
{
"intent": "Ask",
"count": 7
}
],
"timeSeries": [
{
"date": "2026-03-01",
"intent": "Ask",
"count": 2
},
{
"date": "2026-03-02",
"intent": "Write Code",
"count": 6
}
],
"subcategories": {
"askMode": [
{
"subcategory": "error_fix",
"count": 4
}
],
"planMode": [
{
"subcategory": "implementation",
"count": 3
}
],
"writeCode": [
{
"subcategory": "feature",
"count": 11
}
]
}
},
"complexity": {
"distribution": [
{
"complexity": "high",
"count": 12
},
{
"complexity": "medium",
"count": 10
}
],
"timeSeries": [
{
"date": "2026-03-01",
"complexity": "medium",
"count": 4
},
{
"date": "2026-03-02",
"complexity": "high",
"count": 5
}
]
},
"categories": {
"distribution": [
{
"category": "New Features",
"count": 9
},
{
"category": "Bug Fixing & Debugging",
"count": 6
}
],
"timeSeries": [
{
"date": "2026-03-01",
"category": "Bug Fixing & Debugging",
"count": 2
},
{
"date": "2026-03-02",
"category": "New Features",
"count": 4
}
]
},
"guidanceLevels": {
"distribution": [
{
"guidanceLevel": "high",
"count": 8
},
{
"guidanceLevel": "medium",
"count": 7
}
],
"timeSeries": [
{
"date": "2026-03-01",
"guidanceLevel": "medium",
"count": 3
},
{
"date": "2026-03-02",
"guidanceLevel": "high",
"count": 4
}
]
},
"workTypes": {
"distribution": [
{
"workType": "new_feature",
"count": 9
},
{
"workType": "bug",
"count": 6
}
],
"timeSeries": [
{
"date": "2026-03-01",
"workType": "bug",
"count": 2
},
{
"date": "2026-03-02",
"workType": "new_feature",
"count": 4
}
]
}
},
"params": {
"metric": "conversation-insights",
"teamId": 12345,
"startDate": "2026-03-01",
"endDate": "2026-03-07",
"include": [
"intents",
"complexity",
"categories",
"guidanceLevels",
"workTypes"
]
}
}
Response fields
| Field | Type | Meaning |
|---|---|---|
data.intents |
object | Whole-conversation intent distribution, topValues, timeSeries, subcategories (when include requests it) |
data.complexity |
object | Whole-conversation complexity distribution and timeSeries |
data.categories |
object | Segment-level category distribution and timeSeries |
data.guidanceLevels |
object | Segment-level guidanceLevel distribution and timeSeries |
data.workTypes |
object | Segment-level workType distribution and timeSeries |
params.metric |
string | Echoes conversation-insights |
params.teamId |
number | Team id for the key |
params.startDate / params.endDate |
string | Resolved range |
params.include |
string[] | Echo of requested slices |
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
- Omitting
include— the parameter is required; pick at least one ofintents,complexity,categories,guidanceLevels,workTypes. - Calling with Conversation Insights disabled — team setting Disable Conversation Insights yields
401. - Expecting SCIM group filters on the API — those filters live in the dashboard only; use
usersfor API-side filtering. - Requesting more than 30 days — the Analytics date range caps at 30 days.
- Polling without
If-None-Match— burns the 100/min team budget on identical payloads.
Sibling how-tos in this batch: Get Plans adoption, Get Skills adoption, Get Ask mode adoption. Related: Get MCP adoption, Get model usage, Get daily active users.