Analytics API
Analytics API предоставляет подробную аналитику использования Cursor вашей командой, включая метрики написания кода с ИИ-поддержкой, активных пользователей, использования моделей и многое другое.
- Analytics API использует базовую аутентификацию. Для большинства конечных точек требуется API-ключ администратора с областью действия
admin:*. Для аналитики ревью Bugbot требуется область действияread:*. Создайте ключ в Cursor Dashboard → API Keys. - Подробнее об аутентификации, ограничениях частоты запросов и рекомендациях см. в разделе API Overview.
- Доступность: Только для корпоративных команд
Доступные конечные точки
Правки Agent
/analytics/team/agent-editsВозвращает метрики по правкам кода, предложенным ИИ и принятым вашей командой в Cursor.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/agent-edits" \ -u YOUR_API_KEY:Ответ:
{ "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 }, { "event_date": "2025-01-16", "total_suggested_diffs": 132, "total_accepted_diffs": 89, "total_rejected_diffs": 43, "total_green_lines_accepted": 740, "total_red_lines_accepted": 150, "total_green_lines_rejected": 185, "total_red_lines_rejected": 55, "total_green_lines_suggested": 925, "total_red_lines_suggested": 175, "total_lines_suggested": 1100, "total_lines_accepted": 890 } ], "params": { "metric": "agent-edits", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование Tab
/analytics/team/tabsВозвращает метрики использования автодополнения Tab в вашей команде.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/tabs" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "total_suggestions": 5420, "total_accepts": 3210, "total_rejects": 2210, "total_green_lines_accepted": 4120, "total_red_lines_accepted": 2000, "total_green_lines_rejected": 1480, "total_red_lines_rejected": 730, "total_green_lines_suggested": 5600, "total_red_lines_suggested": 2740, "total_lines_suggested": 8340, "total_lines_accepted": 6120 }, { "event_date": "2025-01-16", "total_suggestions": 4980, "total_accepts": 3050, "total_rejects": 1930, "total_green_lines_accepted": 3890, "total_red_lines_accepted": 1890, "total_green_lines_rejected": 1350, "total_red_lines_rejected": 580, "total_green_lines_suggested": 5240, "total_red_lines_suggested": 2650, "total_lines_suggested": 7890, "total_lines_accepted": 5780 } ], "params": { "metric": "tabs", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Ежедневно активные пользователи (DAU)
/analytics/team/dauПолучить число ежедневно активных пользователей в вашей команде. DAU — это число уникальных пользователей, использовавших Cursor в определённый день. Активный пользователь — пользователь, который использовал хотя бы одну функцию ИИ в Cursor.
Ответ содержит метрики DAU с разбивкой по CLI Cursor, Cloud Agents и BugBot.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/dau?startDate=14d&endDate=today" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "date": "2025-01-15", "dau": 42, "cli_dau": 5, "cloud_agent_dau": 37, "bugbot_dau": 10 }, { "date": "2025-01-16", "dau": 4, "cli_dau": 4, "cloud_agent_dau": 34, "bugbot_dau": 12 } ], "params": { "metric": "dau", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Версии клиента
/analytics/team/client-versionsВозвращает распределение версий клиента Cursor, используемых вашей командой (по умолчанию — за последние 7 дней). Для каждого пользователя за каждый день указывается последняя использованная версия (если пользователь установил несколько версий, указывается последняя).
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/client-versions" \ -u YOUR_API_KEY:Ответ:
{ "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" }}Использование моделей
/analytics/team/modelsВозвращает метрики использования ИИ-моделей вашей командой.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/models" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "date": "2025-01-15", "model_breakdown": { "claude-sonnet-4.5": { "messages": 1250, "users": 28 }, "gpt-4o": { "messages": 450, "users": 15 }, "claude-opus-4.5": { "messages": 320, "users": 12 } } }, { "date": "2025-01-16", "model_breakdown": { "claude-sonnet-4.5": { "messages": 1180, "users": 26 }, "gpt-4o": { "messages": 420, "users": 14 } } } ], "params": { "metric": "models", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Самые популярные расширения файлов
/analytics/team/top-file-extensionsВозвращает наиболее часто редактируемые вашей командой в Cursor файлы. Для каждого дня возвращает 5 расширений файлов с наибольшим количеством предложений.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/top-file-extensions?startDate=30d&endDate=today" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "file_extension": "tsx", "total_files": 156, "total_accepts": 98, "total_rejects": 45, "total_lines_suggested": 3230, "total_lines_accepted": 2340, "total_lines_rejected": 890 }, { "event_date": "2025-01-15", "file_extension": "ts", "total_files": 142, "total_accepts": 89, "total_rejects": 38, "total_lines_suggested": 2850, "total_lines_accepted": 2100, "total_lines_rejected": 750 } ], "params": { "metric": "top-files", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование MCP
/analytics/team/mcpВозвращает метрики использования инструментов MCP (Model Context Protocol) в вашей команде, включая ежедневное количество использований с разбивкой по названию инструмента и сервера MCP.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/mcp" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "tool_name": "read_file", "mcp_server_name": "filesystem", "usage": 245 }, { "event_date": "2025-01-15", "tool_name": "search_web", "mcp_server_name": "brave-search", "usage": 128 }, { "event_date": "2025-01-16", "tool_name": "read_file", "mcp_server_name": "filesystem", "usage": 231 } ], "params": { "metric": "mcp", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование команд
/analytics/team/commandsВозвращает метрики использования команд Cursor в вашей команде, включая ежедневное количество использований с разбивкой по названию команды.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/commands" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "command_name": "explain", "usage": 89 }, { "event_date": "2025-01-15", "command_name": "refactor", "usage": 45 }, { "event_date": "2025-01-16", "command_name": "explain", "usage": 92 } ], "params": { "metric": "commands", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование режима Plan
/analytics/team/plansВозвращает метрики использования режима Plan в вашей команде, включая ежедневное количество использований с разбивкой по ИИ-моделям, использованным для генерации планов.
Если у пользователя включён автоматический выбор модели, API возвращает default в качестве имени модели. В интерфейсе Cursor пользователи видят этот режим как «Auto».
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/plans" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "model": "claude-sonnet-4.5", "usage": 156 }, { "event_date": "2025-01-15", "model": "default", "usage": 42 }, { "event_date": "2025-01-16", "model": "claude-sonnet-4.5", "usage": 148 } ], "params": { "metric": "plans", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование навыков
/analytics/team/skillsВозвращает метрики использования навыков в команде. Ежедневное количество использований приводится с разбивкой по названию навыка.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/skills" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "skill_name": "react-best-practices", "usage": 53 }, { "event_date": "2025-01-15", "skill_name": "usage-billing", "usage": 41 }, { "event_date": "2025-01-16", "skill_name": "react-best-practices", "usage": 48 } ], "params": { "metric": "skills", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Использование режима Ask
/analytics/team/ask-modeВозвращает метрики использования режима Ask в вашей команде, включая ежедневное количество использований с разбивкой по ИИ-моделям, применяемым для запросов в режиме Ask.
Параметры
startDate string
endDate string
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/team/ask-mode" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "event_date": "2025-01-15", "model": "claude-sonnet-4.5", "usage": 203 }, { "event_date": "2025-01-15", "model": "gpt-4o", "usage": 67 }, { "event_date": "2025-01-16", "model": "claude-sonnet-4.5", "usage": 198 } ], "params": { "metric": "ask-mode", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31" }}Аналитика диалогов
/analytics/team/conversation-insightsПолучите те же агрегированные данные Conversation Insights, что и на дашборде. Эта конечная точка возвращает агрегированную аналитику, а не необработанные экспортированные данные или содержимое диалогов.
Доступно только для корпоративных команд с включённой функцией Conversation Insights. Если в настройках команды включён параметр Disable Conversation Insights, эта конечная точка возвращает 401.
Для фильтрации по пользователям используйте общий параметр запроса users, описанный в разделе Конечные точки уровня команды. Фильтрация по группам SCIM доступна только в интерфейсе дашборда и не поддерживается в Analytics API.
intents и complexity описывают диалоги целиком.
categories, guidanceLevels и workTypes описывают работу в сегментах диалогов.
Параметры
startDate string
endDate string
include string | string[]
intents, complexity, categories, guidanceLevels и workTypes. include можно передать как список значений, разделённых запятыми, например include=intents,complexity, или указать несколько раз, например include=intents&include=workTypes.users string
users=alice@example.com,user_abc123.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:Ответ:
{ "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" ] }}Рейтинг
/analytics/team/leaderboardПолучить рейтинг участников команды по метрикам использования ИИ.
Поведение:
- Без фильтрации по пользователям: возвращает пользователей, ранжированных по указанной метрике (по умолчанию: суммарное количество принятых строк)
- С фильтрацией по пользователям: возвращает пользователей, соответствующих фильтру, с их фактическими позициями в рейтинге по всей команде
- Поддерживает пагинацию для команд с большим числом участников
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)Возвращает отдельные рейтинги для автодополнения по Tab и правок Agent. При фильтрации по пользователям они отображаются с их фактической позицией в рейтинге по всей команде, а не в отфильтрованном рейтинге. Например, если запрошенный пользователь занимает 45-е место в общем рейтинге, он будет показан с rank: 45.
# Получить первую страницу таблицы лидеров (10 лучших пользователей)curl -X GET "https://api.cursor.com/analytics/team/leaderboard" \ -u YOUR_API_KEY:# Получить вторую страницу с пользовательским размером страницыcurl -X GET "https://api.cursor.com/analytics/team/leaderboard?page=2&pageSize=20" \ -u YOUR_API_KEY:# Фильтрация по конкретным пользователямcurl -X GET "https://api.cursor.com/analytics/team/leaderboard?users=alice@example.com,bob@example.com" \ -u YOUR_API_KEY:Ответ:
{ "data": { "tab_leaderboard": { "data": [ { "email": "alice@example.com", "user_id": "user_abc123", "profile_picture_url": "https://example.com/avatars/alice.jpg", "total_accepts": 1334, "total_lines_accepted": 3455, "total_lines_suggested": 15307, "line_acceptance_ratio": 0.2256519892590384, "accept_ratio": 0.2330827067669173, "rank": 1 }, { "email": "bob@example.com", "user_id": "user_def789", "profile_picture_url": "https://example.com/avatars/bob.jpg", "total_accepts": 796, "total_lines_accepted": 2090, "total_lines_suggested": 7689, "line_acceptance_ratio": 0.2718168812589414, "accept_ratio": 0.2731256599787746, "rank": 2 } ], "total_users": 142 }, "agent_leaderboard": { "data": [ { "email": "alice@example.com", "user_id": "user_abc123", "profile_picture_url": "https://example.com/avatars/alice.jpg", "total_accepts": 914, "total_lines_accepted": 65947, "total_lines_suggested": 201467, "line_acceptance_ratio": 0.3273465219182842, "rank": 1 }, { "email": "bob@example.com", "user_id": "user_def789", "profile_picture_url": "https://example.com/avatars/bob.jpg", "total_accepts": 843, "total_lines_accepted": 61709, "total_lines_suggested": 51092, "line_acceptance_ratio": 1.2077924536684573, "rank": 2 } ], "total_users": 142 } }, "pagination": { "page": 1, "pageSize": 10, "totalUsers": 142, "totalPages": 15, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "leaderboard", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 10 }}Аналитика Bugbot
/analytics/team/bugbotВозвращает аналитику Bugbot review по PR вашей команды, включая количество задач по степени серьёзности и число решённых задач.
Для данных по отдельным ревью, включая стоимость и отдельные результаты, используйте аналитику Bugbot review.
Параметры
startDate string
endDate string
prState string
merged или all. По умолчанию: merged. Используйте merged только для аналитики по объединённым PR. Используйте all для аналитики по PR во всех состояниях.repo string
https://github.com/org/repo.git или github.com/org/repo). Приводится к формату host/owner/repo.page number
1pageSize number
100, максимум: 250)# Получить аналитику PR от Bugbot за последние 7 дней (период по умолчанию)curl -X GET "https://api.cursor.com/analytics/team/bugbot" \ -u YOUR_API_KEY:# Фильтрация по репозиторию и диапазону датcurl -X GET "https://api.cursor.com/analytics/team/bugbot?repo=github.com/acme/app&startDate=2025-01-01&endDate=2025-01-31" \ -u YOUR_API_KEY:# Разбить результаты на страницыcurl -X GET "https://api.cursor.com/analytics/team/bugbot?page=2&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": [ { "repo": "github.com/acme/app", "pr_number": 42, "timestamp": "2025-01-21T00:00:00.000Z", "reviews": 3, "issues": { "total": 5, "by_severity": { "high": 1, "medium": 2, "low": 2 } }, "issues_resolved": { "total": 2, "by_severity": { "high": 1, "medium": 1, "low": 0 } } } ], "pagination": { "page": 1, "pageSize": 100, "totalItems": 1, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }, "params": { "metric": "bugbot", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "repo": "github.com/acme/app", "prState": "merged", "page": 1, "pageSize": 100 }}Аналитика ревью Bugbot
/analytics/team/bugbot-reviewsВозвращает по одному элементу для каждого завершённого ревью Bugbot, включая проверенный коммит, количество находок, списанную стоимость и данные о статусе решения для каждой находки.
Включает опубликованные ревью и ревью в режиме dry-run. Опубликованные находки идентифицируются по comment_id и resolution_status. Для находок dry-run вместо этого возвращаются title, description и locations, поскольку в SCM ничего не публикуется.
Требуется API-ключ с областью действия read:*.
Параметры
startDate string
endDate string
now. См. Форматы дат.repo string
host/owner/repo. Протокол и суффикс .git необязательны.prNumber number
page number
1.pageSize number
100, максимум: 250.dryRun boolean
true) или опубликованные ревью (false).curl --get https://api.cursor.com/analytics/team/bugbot-reviews \ -u YOUR_API_KEY: \ --data-urlencode 'startDate=2026-06-01' \ --data-urlencode 'endDate=2026-06-29' \ --data-urlencode 'repo=github.com/your-org/your-repo' \ --data-urlencode 'prNumber=42' \ --data-urlencode 'page=1' \ --data-urlencode 'pageSize=100'curl --get https://api.cursor.com/analytics/team/bugbot-reviews \ -u YOUR_API_KEY: \ --data-urlencode 'dryRun=true' \ --data-urlencode 'repo=github.com/your-org/your-repo' \ --data-urlencode 'prNumber=42'Ответ (опубликованное ревью):
{ "data": [ { "request_id": "6e0d261c-86a2-4383-89f0-9162c1c10662", "timestamp": "2026-06-29T19:42:18.000Z", "repo": "github.com/your-org/your-repo", "repo_node_id": "R_kgDOABCDEF", "pr_number": 42, "commit_sha": "9f3c2a1b7d8e4f5061728394a5b6c7d8e9f0a1b2", "bugs_found": 2, "cost_cents": 42.5, "dry_run": false, "publication_status": "posted", "bugs": [ { "comment_id": "2147483999", "resolution_status": "resolved", "severity": "high" }, { "comment_id": "2147484000", "resolution_status": "unresolved", "severity": "medium" } ] } ], "pagination": { "page": 1, "pageSize": 100, "totalItems": 1, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }, "params": { "metric": "bugbot-reviews", "teamId": 12345, "startDate": "2026-06-01", "endDate": "2026-06-29", "repo": "github.com/your-org/your-repo", "prNumber": 42, "page": 1, "pageSize": 100 }}Ответ (ревью в режиме dry-run):
{ "data": [ { "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "timestamp": "2026-06-29T20:15:03.000Z", "repo": "github.com/your-org/your-repo", "repo_node_id": "R_kgDOABCDEF", "pr_number": 42, "commit_sha": "9f3c2a1b7d8e4f5061728394a5b6c7d8e9f0a1b2", "bugs_found": 1, "cost_cents": null, "dry_run": true, "publication_status": "dry_run", "bugs": [ { "comment_id": null, "resolution_status": null, "severity": "medium", "title": "Unbounded retry loop", "description": "retry() recurses without a ceiling.", "locations": [ { "file": "src/net.ts", "start_line": 5, "end_line": 9 } ] } ] } ], "pagination": { "page": 1, "pageSize": 100, "totalItems": 1, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }, "params": { "metric": "bugbot-reviews", "teamId": 12345, "startDate": "2026-06-01", "endDate": "2026-06-29", "repo": "github.com/your-org/your-repo", "prNumber": 42, "dryRun": true, "page": 1, "pageSize": 100 }}Значения repo_node_id, pr_number, commit_sha, cost_cents, bugs[].comment_id, bugs[].resolution_status и bugs[].severity могут быть null, если они недоступны. cost_cents равно null, если ревью не выставляется в счёт отдельно. Для ревью в режиме dry-run поля bugs[].title, bugs[].description и bugs[].locations содержат информацию о найденных проблемах. У результатов dry-run comment_id: null и resolution_status: null, поскольку в SCM ничего не публикуется.
Чтобы запустить ревью в режиме dry-run, отправьте запрос POST /bugbot/review с "dryRun": true. См. документацию API Bugbot.
Конечные точки By-User
Конечные точки by-user предоставляют те же метрики, что и конечные точки уровня команды, но с разбивкой по отдельным пользователям и поддержкой пагинации. Они идеально подходят для создания отчётов по пользователям или пакетной обработки больших команд.
Распространённые параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
startDate | Строка даты | Нет | Дата начала периода аналитики (по умолчанию: 7 дней назад) |
endDate | Строка даты | Нет | Дата окончания периода аналитики (по умолчанию: сегодня) |
page | number | Нет | Номер страницы (по умолчанию: 1) |
pageSize | number | Нет | Количество пользователей на странице (по умолчанию: 100, максимум: 500) |
users | string | Нет | Ограничить пагинацию указанными пользователями (электронные адреса или идентификаторы, разделённые запятыми, например alice@example.com,user_abc123) |
Фильтрация пользователей:
При передаче параметра users в конечные точки by-user:
- Фильтрация пагинации: В результаты и подсчёт страниц включаются только указанные пользователи
- Полезно для: Получения подробных данных по конкретным участникам команды без просмотра всех пользователей по страницам
- Пример: Если у вас 500 пользователей, но нужны данные только по 3 конкретным пользователям, отфильтруйте их по электронным адресам, чтобы получить всех троих на одной странице
Примечание: Конечные точки by-user поддерживают те же форматы дат и сокращения, что и конечные точки уровня команды. См. раздел Форматы дат выше.
Формат ответа
Все конечные точки by-user возвращают данные в следующем формате:
{ "data": { "user1@example.com": [ /* данные пользователя */ ], "user2@example.com": [ /* данные пользователя */ ] }, "pagination": { "page": 1, "pageSize": 100, "totalUsers": 250, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "agent-edits", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 100, "userMappings": [ { "id": "user_abc123", "email": "user1@example.com" }, { "id": "user_def456", "email": "user2@example.com" } ] }}Структура ответа:
data— object, где ключами служат адреса электронной почты пользователей, а значениями — массивы метрик соответствующих пользователейpagination— информация о пагинацииparams— параметры запроса, возвращённые в ответеuserMappings— массив сопоставлений адресов электронной почты с публичными идентификаторами пользователей на этой странице. Используется для сверки данных с другими API или создания ссылок на профили пользователей.
Доступные конечные точки
Все конечные точки by-user соответствуют шаблону: /analytics/by-user/{metric}
GET /analytics/by-user/agent-edits- Правки Agent по пользователямGET /analytics/by-user/tabs- Использование Tab по пользователямGET /analytics/by-user/models- Использование моделей по пользователямGET /analytics/by-user/top-file-extensions- Наиболее популярные файлы по пользователямGET /analytics/by-user/client-versions- Версии клиента по пользователямGET /analytics/by-user/mcp- Использование MCP по пользователямGET /analytics/by-user/commands- Использование команд по пользователямGET /analytics/by-user/plans- Использование тарифов по пользователямGET /analytics/by-user/skills- Использование навыков по пользователямGET /analytics/by-user/ask-mode- Использование режима Ask по пользователям
Правки Agent по пользователям
/analytics/by-user/agent-editsПолучить метрики правок Agent по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/agent-edits?page=1&pageSize=50" \ -u YOUR_API_KEY:curl -X GET "https://api.cursor.com/analytics/by-user/agent-edits?users=alice@example.com,bob@example.com,carol@example.com" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "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 }, { "event_date": "2025-01-16", "total_suggested_diffs": 132, "total_accepted_diffs": 89, "total_rejected_diffs": 43, "total_green_lines_accepted": 740, "total_red_lines_accepted": 150, "total_green_lines_rejected": 185, "total_red_lines_rejected": 55, "total_green_lines_suggested": 925, "total_red_lines_suggested": 175, "total_lines_suggested": 1100, "total_lines_accepted": 890 } ], "bob@example.com": [ { "event_date": "2025-01-15", "total_suggested_diffs": 95, "total_accepted_diffs": 72, "total_rejected_diffs": 23, "total_green_lines_accepted": 450, "total_red_lines_accepted": 90, "total_green_lines_rejected": 120, "total_red_lines_rejected": 35, "total_green_lines_suggested": 570, "total_red_lines_suggested": 125, "total_lines_suggested": 695, "total_lines_accepted": 540 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "agent-edits", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование Tab по пользователям
/analytics/by-user/tabsПолучить метрики использования автодополнения Tab по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/tabs?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "total_suggestions": 320, "total_accepts": 210, "total_rejects": 110, "total_green_lines_accepted": 280, "total_red_lines_accepted": 120, "total_green_lines_rejected": 90, "total_red_lines_rejected": 45, "total_green_lines_suggested": 370, "total_red_lines_suggested": 165, "total_lines_suggested": 535, "total_lines_accepted": 400 } ], "bob@example.com": [ { "event_date": "2025-01-15", "total_suggestions": 180, "total_accepts": 120, "total_rejects": 60, "total_green_lines_accepted": 150, "total_red_lines_accepted": 70, "total_green_lines_rejected": 50, "total_red_lines_rejected": 25, "total_green_lines_suggested": 200, "total_red_lines_suggested": 95, "total_lines_suggested": 295, "total_lines_accepted": 220 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "tabs", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование моделей по пользователям
/analytics/by-user/modelsПолучение метрик использования моделей по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/models?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "date": "2025-01-15", "model_breakdown": { "claude-sonnet-4.5": { "messages": 85, "users": 1 }, "gpt-4o": { "messages": 32, "users": 1 } } } ], "bob@example.com": [ { "date": "2025-01-15", "model_breakdown": { "claude-sonnet-4.5": { "messages": 64, "users": 1 } } } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "models", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Самые популярные расширения файлов по пользователям
/analytics/by-user/top-file-extensionsПолучает метрики по наиболее популярным расширениям файлов для отдельных пользователей с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/top-file-extensions?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "file_extension": "tsx", "total_files": 45, "total_accepts": 32, "total_rejects": 10, "total_lines_suggested": 890, "total_lines_accepted": 650, "total_lines_rejected": 240 }, { "event_date": "2025-01-15", "file_extension": "ts", "total_files": 38, "total_accepts": 28, "total_rejects": 8, "total_lines_suggested": 720, "total_lines_accepted": 540, "total_lines_rejected": 180 } ], "bob@example.com": [ { "event_date": "2025-01-15", "file_extension": "py", "total_files": 22, "total_accepts": 18, "total_rejects": 4, "total_lines_suggested": 410, "total_lines_accepted": 340, "total_lines_rejected": 70 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "top-files", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Версии клиентов по пользователям
/analytics/by-user/client-versionsПолучение метрик версий клиентов по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/client-versions?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "client_version": "0.42.3", "user_count": 1, "percentage": 1.0 } ], "bob@example.com": [ { "event_date": "2025-01-15", "client_version": "0.42.2", "user_count": 1, "percentage": 1.0 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "client-versions", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование MCP по пользователям
/analytics/by-user/mcpПолучение метрик использования инструментов MCP по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/mcp?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "tool_name": "read_file", "mcp_server_name": "filesystem", "usage": 45 }, { "event_date": "2025-01-16", "tool_name": "read_file", "mcp_server_name": "filesystem", "usage": 38 } ], "bob@example.com": [ { "event_date": "2025-01-15", "tool_name": "search_web", "mcp_server_name": "brave-search", "usage": 23 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "mcp", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование команд по пользователям
/analytics/by-user/commandsПолучение метрик использования команд по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/commands?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "command_name": "explain", "usage": 12 }, { "event_date": "2025-01-16", "command_name": "explain", "usage": 15 } ], "bob@example.com": [ { "event_date": "2025-01-15", "command_name": "refactor", "usage": 8 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "commands", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование тарифов по пользователям
/analytics/by-user/plansПолучение метрик использования режима Plan по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/plans?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "model": "claude-sonnet-4.5", "usage": 23 }, { "event_date": "2025-01-16", "model": "claude-sonnet-4.5", "usage": 19 } ], "bob@example.com": [ { "event_date": "2025-01-15", "model": "gpt-4o", "usage": 12 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "plans", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование навыков по пользователям
/analytics/by-user/skillsВозвращает показатели использования навыков по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/skills?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "skill_name": "react-best-practices", "usage": 8 }, { "event_date": "2025-01-15", "skill_name": "create-rule", "usage": 3 }, { "event_date": "2025-01-16", "skill_name": "react-best-practices", "usage": 5 } ], "bob@example.com": [ { "event_date": "2025-01-15", "skill_name": "commit-message-helper", "usage": 5 }, { "event_date": "2025-01-15", "skill_name": "create-skill", "usage": 2 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "skills", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Использование режима Ask по пользователям
/analytics/by-user/ask-modeПолучить метрики использования режима Ask по отдельным пользователям с поддержкой пагинации.
Параметры
startDate string
endDate string
page number
1pageSize number
users string
alice@example.com,user_abc123)curl -X GET "https://api.cursor.com/analytics/by-user/ask-mode?page=1&pageSize=50" \ -u YOUR_API_KEY:Ответ:
{ "data": { "alice@example.com": [ { "event_date": "2025-01-15", "model": "claude-sonnet-4.5", "usage": 34 }, { "event_date": "2025-01-16", "model": "claude-sonnet-4.5", "usage": 28 } ], "bob@example.com": [ { "event_date": "2025-01-15", "model": "gpt-4o", "usage": 15 } ] }, "pagination": { "page": 1, "pageSize": 50, "totalUsers": 120, "totalPages": 3, "hasNextPage": true, "hasPreviousPage": false }, "params": { "metric": "ask-mode", "teamId": 12345, "startDate": "2025-01-01", "endDate": "2025-01-31", "page": 1, "pageSize": 50, "userMappings": [ { "id": "user_abc123", "email": "alice@example.com" }, { "id": "user_def456", "email": "bob@example.com" } ] }}Конечные точки уровня команды
Конечные точки уровня команды предоставляют агрегированные метрики по всей команде или отфильтрованным группам пользователей. Все конечные точки поддерживают фильтрацию по диапазону дат и при необходимости — по пользователям.
Общие параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
startDate | Строка даты | Нет | Дата начала периода аналитики (по умолчанию: 7 дней назад) |
endDate | Строка даты | Нет | Дата окончания периода аналитики (по умолчанию: сегодня) |
users | string | Нет | Фильтрация данных по конкретным пользователям (значения через запятую). Каждое значение может быть адресом электронной почты (например, alice@example.com) или публичным ID пользователя (например, user_abc123). Можно сочетать оба формата. |
Фильтрация пользователей:
Параметр users принимает список идентификаторов, разделённых запятыми. Каждый идентификатор может быть:
- Адрес электронной почты (например,
alice@example.com) — определяется автоматически по наличию@ - Публичный ID пользователя (например,
user_abc123) — определяется автоматически по префиксуuser_ - Смешанный формат — в одном запросе можно сочетать адреса электронной почты и ID
Примеры:
# Фильтрация только по адресам электронной почты?users=alice@example.com,bob@example.com,carol@example.com# Фильтрация только по публичным идентификаторам пользователей?users=user_abc123,user_def456,user_ghi789# Смешанные адреса электронной почты и идентификаторы?users=alice@example.com,user_def456,bob@example.comПри фильтрации по пользователям API возвращает данные только по указанным пользователям. Это полезно для:
- Анализа конкретных участников команд или групп (например, руководителей разработки, отдельных проектных команд)
- Формирования отчётов по подмножеству пользователей
- Сравнения метрик между выбранными пользователями
Форматы дат
Поведение по умолчанию:
Если не указать startDate и endDate, API по умолчанию использует последние 7 дней (от 7 дней назад до сегодняшнего дня). Это удобно для быстрых запросов без указания дат.
Стандартные форматы:
YYYY-MM-DD— простой формат даты (например,2025-01-15) ← Рекомендуется- Метки времени ISO 8601 (например,
2025-01-15T00:00:00Z)
Сокращения:
nowилиtoday— текущая дата (в 00:00:00)yesterday— вчерашняя дата (в 00:00:00)<number>d— количество дней назад (например,7d= 7 дней назад,30d= 30 дней назад)
Важные примечания:
- Время игнорируется: Все даты приводятся к началу дня (00:00:00 UTC). Отправка
2025-01-15T14:30:00Zэквивалентна2025-01-15. - Используйте рекомендуемые форматы: Для более эффективного HTTP-кэширования используйте
YYYY-MM-DDили сокращения. Разные значения времени (например,T14:30:00ZиT08:00:00Z) не позволят использовать кэш, хотя соответствуют одному и тому же дню. - Диапазоны дат: Ограничены максимальной продолжительностью в 30 дней.
Примеры:
# Не указывайте даты: по умолчанию будут использованы последние 7 дней (проще всего и лучше для кэширования)curl "https://api.cursor.com/analytics/team/agent-edits"# Формат YYYY-MM-DD для конкретного диапазона дат (рекомендуется)?startDate=2025-01-01&endDate=2025-01-31# Сокращения для последних 30 дней?startDate=30d&endDate=today# Сокращения для последних 14 дней?startDate=14d&endDate=now# ❌ Не используйте временные метки: они мешают кэшированию, а время всё равно игнорируется?startDate=2025-01-15T14:30:00Z&endDate=2025-01-31T23:59:59ZОграничения частоты запросов
Ограничения частоты запросов действуют для каждой команды и сбрасываются каждую минуту:
- Конечные точки уровня команды: 100 запросов в минуту на команду
- Конечные точки by-user: 50 запросов в минуту на команду
Что происходит при превышении ограничения частоты запросов?
При превышении ограничения частоты запросов вы получите ответ 429 Too Many Requests:
{ "error": "Too Many Requests", "message": "Rate limit exceeded. Please try again later."}Рекомендации
Общие рекомендации по работе с API, включая экспоненциальную задержку, стратегии кэширования и обработку ошибок, см. в разделе Рекомендации в обзоре API.
- Используйте пагинацию для больших команд: Если в вашей команде более 100 пользователей, используйте конечные точки by-user с пагинацией, чтобы избежать тайм-аутов.
- Используйте кэширование: Конечные точки уровня Team и User поддерживают ETag. Сохраняйте ETag и используйте заголовки
If-None-Match, чтобы сократить объём передаваемых данных. - По возможности фильтруйте по пользователям: Если вам нужны данные только по конкретным пользователям, используйте параметр
users, чтобы сократить время выполнения запроса. - Диапазоны дат: Используйте разумные диапазоны дат (например, 1–3 месяца) для оптимальной производительности.