API / get-conversation-insights-via-analytics-api

API

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 of intents, 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 users for 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.