Admin API 允许你以编程方式访问团队数据,包括成员信息、用量指标、支出明细和模型访问。
- Admin API 使用 Basic Authentication,并将你的 API 密钥作为用户名。
- 有关创建 API 密钥、认证方式、速率限制和最佳实践的详细信息,请参阅 API 概览。
如需执行跨团队的组织级操作,请参阅 组织 和 Organization API。
端点¶
获取团队成员¶
/teams/members
获取所有团队成员及其详细信息。
响应字段¶
teamMembers array
团队成员对象数组,每个对象包含:
idstring - 团队成员的编码用户 ID (例如user_PDSPmvukpYgZEDXsoNirw3CFhy)emailstring - 团队成员的邮箱地址namestring - 团队成员的显示名称rolestring - 在团队中的角色 (例如member、owner)isRemovedboolean - 该成员是否已从团队中移除
curl -X GET https://api.cursor.com/teams/members \
-u YOUR_API_KEY:
响应:
{
"teamMembers": [
{
"id": "user_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Alex",
"email": "developer@company.com",
"role": "member",
"isRemoved": false
},
{
"id": "user_kljUvI0ASZORvSEXf9hV0ydcso",
"name": "Sam",
"email": "admin@company.com",
"role": "owner",
"isRemoved": false
}
]
}
获取审计日志¶
/teams/audit-logs
通过筛选获取团队的审计日志事件,用于跟踪团队活动、安全事件和配置变更。每个团队每分钟最多 20 次请求。详见 速率限制和最佳实践。
参数¶
startTime string | number
开始时间 (默认为 7 天前) 。参见 日期格式
endTime string | number
结束时间 (默认是当前时间) 。参见 日期格式
eventTypes string
要筛选的事件类型,使用逗号分隔。可能的取值:login、logout、add_user、remove_user、update_user_role、team_settings、mcp_server_config、team_api_key、user_api_key、privacy_mode、user_spend_limit、team_rule、team_repo、team_hook、team_command、create_directory_group、delete_directory_group、update_directory_group、update_directory_group_permissions、add_user_to_directory_group、remove_user_from_directory_group、bugbot_installation、bugbot_installation_settings、bugbot_repo_settings、bugbot_team_rule、bugbot_team_settings、bugbot_bulk_repo_update
search string
用于筛选事件的搜索词
page number
页码 (从1开始) 。默认值:1
pageSize number
每页结果数 (1-500) 。默认值:100
users string
按用户筛选。参见下方的 用户筛选
日期范围不能超过 30 天。更长时间段请拆分为多次请求。
日期格式¶
startTime 和 endTime 参数支持多种格式:
- 相对快捷方式:
now、today、yesterday、7d(7 天前) 、5h(5 小时前) 、300s(300 秒前) - ISO 8601 字符串:
2024-01-15T12:00:00Z或2024-01-15T10:00:00-05:00 - YYYY-MM-DD 格式:
2024-01-15(时间默认为 00:00:00 UTC) - Unix 时间戳:
1705315200(秒) 或1705315200000(毫秒)
示例:
?startTime=7d&endTime=now- 最近 7 天?startTime=5h&endTime=now- 最近 5 小时?startTime=2024-01-15&endTime=2024-01-20- 指定日期范围?startTime=1705315200000&endTime=1705401600000- Unix 时间戳
用户筛选¶
users 参数支持多种格式,使用逗号分隔:
- 邮箱地址:
developer@company.com,admin@company.com - 编码用户 ID:
user_PDSPmvukpYgZEDXsoNirw3CFhy,user_kljUvI0ASZORvSEXf9hV0ydcso
你可以混合使用这些格式:developer@company.com,12345,user_PDSPmvukpYgZEDXsoNirw3CFhy
每次请求的最大用户数等于 pageSize。
curl -X GET "https://api.cursor.com/teams/audit-logs?users=admin@company.com,developer@company.com&eventTypes=login,add_user" \
-u YOUR_API_KEY:
响应:
{
"events": [
{
"event_id": "evt_abc123",
"timestamp": "2024-01-15T12:30:00.000Z",
"ip_address": "203.0.113.42",
"user_email": "admin@company.com",
"event_type": "add_user",
"event_data": {
"email": "admin@company.com",
"method": "manual"
}
},
{
"event_id": "evt_def456",
"timestamp": "2024-01-15T10:15:00.000Z",
"ip_address": "192.168.1.1",
"user_email": "developer@company.com",
"event_type": "login",
"event_data": {
"ip_address": "192.168.1.1",
"user_agent": "Cursor/0.42.0"
}
}
],
"pagination": {
"page": 1,
"pageSize": 100,
"totalCount": 2,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
},
"params": {
"teamId": 12345,
"startDate": 1704729600000,
"endDate": 1705334400000
}
}
获取每日使用情况数据¶
/teams/daily-usage-data
获取团队的每日用量指标。数据按小时汇总,建议对此端点每小时最多轮询一次。每个团队每分钟最多可发送 20 个请求。请参阅最佳实践。
参数¶
startDate 数值 必填
开始日期 (自纪元起的毫秒数)
endDate number 必填
结束日期 (Unix 纪元毫秒数)
page number
页码 (从 1 开始) 。与 pageSize 同时提供时,将启用分页,并返回在所请求日期范围内具有成员资格的所有团队成员的数据。
pageSize number
每页用户数。与 page 一同提供时,将启用分页,并返回在所请求日期范围内具有成员资格的所有团队成员的数据。
未指定分页参数时,此端点仅返回活跃用户 (即在该日期范围内有活动的用户) 。要获取所有团队成员,请同时提供 page 和 pageSize 参数。
使用分页时,响应会为每位用户返回一个 isActive 字段,用于指示该用户当天是否有活动。请求时间段结束后才加入的成员不包括在内。
日期范围不能超过 30 天。如需查询更长时段,请分多次请求。
字段 subscriptionIncludedReqs、usageBasedReqs 和 apiKeyReqs 统计的是原始使用事件,而非较早的基于请求的定价模式中的可计费请求单位。要获取准确的可计费请求数量,请使用 /teams/filtered-usage-events 端点,并对 requestsCosts 字段求和。
响应字段¶
data 数组中的每个对象包含:
userIdnumber - 用户的唯一标识符daystring - 此记录所涵盖的日期 (ISO 日期,例如2024-03-18)datenumber - 以纪元毫秒为单位的日期emailstring - 用户的电子邮件地址isActive布尔值 - 用户当天是否有活动 (仅在分页时提供)totalLinesAddednumber - 新增代码行总数totalLinesDeletednumber - 删除的代码行总数acceptedLinesAddednumber - 已接受的 AI 建议新增行数acceptedLinesDeletednumber - 已接受的 AI 建议删除行数totalAppliesnumber - 应用 AI 代码的操作总数totalAcceptsnumber - 已接受的 AI 建议总数totalRejectsnumber - 被拒绝的 AI 建议总数totalTabsShownnumber - 向用户展示的 Tab 补全总数totalTabsAcceptednumber - 用户接受的 Tab 补全数量composerRequestsnumber - 发起的 Composer 请求数chatRequestsnumber - 发起的 chat 请求数量agentRequestsnumber - 发起的 Agent 模式请求数cmdkUsagesnumber - Cmd+K 内联编辑的使用次数subscriptionIncludedReqsnumber - 订阅方案包含的请求数apiKeyReqsnumber - 通过 API 密钥发起的请求数usageBasedReqsnumber - 按用量计费的 (超额) 请求数bugbotUsagesnumber - Bugbot 使用次数mostUsedModelstring | null - 当天使用频率最高的 AI 模型applyMostUsedExtensionstring | null - 应用操作最常用的文件扩展名tabMostUsedExtensionstring | null - Tab 补全最常用的文件扩展名clientVersionstring | null - 所使用的 Cursor 客户端版本
# 仅获取活跃用户的数据(不分页)
curl -X POST https://api.cursor.com/teams/daily-usage-data \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000
}'
# 获取所有团队成员的数据(分页)
curl -X POST https://api.cursor.com/teams/daily-usage-data \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000,
"page": 1,
"pageSize": 1000
}'
响应 (不分页,仅限活跃用户) :
{
"data": [
{
"userId": 12345,
"day": "2024-03-18",
"date": 1710720000000,
"isActive": true,
"totalLinesAdded": 1543,
"totalLinesDeleted": 892,
"acceptedLinesAdded": 1102,
"acceptedLinesDeleted": 645,
"totalApplies": 87,
"totalAccepts": 73,
"totalRejects": 14,
"totalTabsShown": 342,
"totalTabsAccepted": 289,
"composerRequests": 45,
"chatRequests": 128,
"agentRequests": 12,
"cmdkUsages": 67,
"subscriptionIncludedReqs": 180,
"apiKeyReqs": 0,
"usageBasedReqs": 5,
"bugbotUsages": 3,
"mostUsedModel": "gpt-5",
"applyMostUsedExtension": ".tsx",
"tabMostUsedExtension": ".ts",
"clientVersion": "0.25.1",
"email": "developer@company.com"
}
],
"period": {
"startDate": 1710720000000,
"endDate": 1710892800000
}
}
响应 (含分页——所有团队成员) :
{
"data": [
{
"userId": 12345,
"day": "2024-03-18",
"date": 1710720000000,
"isActive": true,
"totalLinesAdded": 1543,
"totalLinesDeleted": 892,
"acceptedLinesAdded": 1102,
"acceptedLinesDeleted": 645,
"totalApplies": 87,
"totalAccepts": 73,
"totalRejects": 14,
"totalTabsShown": 342,
"totalTabsAccepted": 289,
"composerRequests": 45,
"chatRequests": 128,
"agentRequests": 12,
"cmdkUsages": 67,
"subscriptionIncludedReqs": 180,
"apiKeyReqs": 0,
"usageBasedReqs": 5,
"bugbotUsages": 3,
"mostUsedModel": "gpt-5",
"applyMostUsedExtension": ".tsx",
"tabMostUsedExtension": ".ts",
"clientVersion": "0.25.1",
"email": "developer@company.com"
},
{
"userId": 12346,
"day": "2024-03-18",
"date": 1710720000000,
"isActive": false,
"totalLinesAdded": 0,
"totalLinesDeleted": 0,
"acceptedLinesAdded": 0,
"acceptedLinesDeleted": 0,
"totalApplies": 0,
"totalAccepts": 0,
"totalRejects": 0,
"totalTabsShown": 0,
"totalTabsAccepted": 0,
"composerRequests": 0,
"chatRequests": 0,
"agentRequests": 0,
"cmdkUsages": 0,
"subscriptionIncludedReqs": 0,
"apiKeyReqs": 0,
"usageBasedReqs": 0,
"bugbotUsages": 0,
"mostUsedModel": null,
"applyMostUsedExtension": null,
"tabMostUsedExtension": null,
"clientVersion": null,
"email": "inactive-user@company.com"
}
],
"period": {
"startDate": 1710720000000,
"endDate": 1710892800000
},
"pagination": {
"page": 1,
"pageSize": 1000,
"totalUsers": 150,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
获取支出数据¶
/teams/spend
获取当前计费周期的支出数据,支持搜索、排序和分页。
参数¶
searchTerm string
在用户姓名和邮箱地址中搜索
sortBy string
排序字段:amount、date、user。默认值:date
sortDirection string
排序方向:asc、desc。默认值:desc
page number
页码 (从 1 开始) 。默认值:1
pageSize number
每页返回的结果数量
响应字段¶
teamMemberSpend 中的每个对象包含:
userIdstring - 编码后的用户 ID (例如:user_PDSPmvukpYgZEDXsoNirw3CFhy) 。与/teams/members中的teamMembers[].id使用相同的标识符命名空间。namestring - 用户显示名称emailstring - 用户邮箱地址rolestring - 在团队中的角色 (例如:member、owner)spendCentsnumber - 当前计费周期内按需支出金额 (单位:美分),不包括包含的用量overallSpendCentsnumber - 当前计费周期内的总支出金额 (单位:美分),包括按需用量和包含的用量fastPremiumRequestsnumber - 该计费周期内按用量计费的高级请求次数hardLimitOverrideDollarsnumber - 为该用户设置的自定义硬性支出上限覆盖值 (单位:美元,0 表示不覆盖)monthlyLimitDollarsnumber | null - 为该用户设置的每月支出上限 (单位:美元),若未设置上限则为nulleffectivePerUserLimitDollarsnumber - 当前生效的按用户支出上限 (单位:美元),由monthlyLimitDollars和hardLimitOverrideDollars推导得出
2026 年 6 月 4 日,我们为 spendCents 和 overallSpendCents 字段增加了额外精度,以避免在将结果与发票金额比较时出现舍入误差。
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"searchTerm": "alex@company.com",
"page": 2,
"pageSize": 25
}'
响应:
{
"teamMemberSpend": [
{
"userId": "user_PDSPmvukpYgZEDXsoNirw3CFhy",
"spendCents": 2450.125487,
"overallSpendCents": 2450.125487,
"fastPremiumRequests": 1250,
"name": "Alex",
"email": "developer@company.com",
"role": "member",
"hardLimitOverrideDollars": 100,
"monthlyLimitDollars": 200,
"effectivePerUserLimitDollars": 100
},
{
"userId": "user_kljUvI0ASZORvSEXf9hV0ydcso",
"spendCents": 1875.500123,
"overallSpendCents": 3200.750456,
"fastPremiumRequests": 980,
"name": "Sam",
"email": "admin@company.com",
"role": "owner",
"hardLimitOverrideDollars": 0,
"monthlyLimitDollars": null,
"effectivePerUserLimitDollars": 50
}
],
"subscriptionCycleStart": 1708992000000,
"totalMembers": 15,
"totalPages": 1
}
获取使用事件数据¶
/teams/filtered-usage-events
为你的团队检索带有筛选、搜索和分页选项的详细使用事件。此端点可提供对 API 调用、模型使用、令牌消耗和费用的细致洞察。数据按小时汇总。我们建议最多每小时轮询此端点一次。每个团队的速率限制为每分钟 60 次请求。参见 API 指南。
成本计算:要将事件级成本与 /teams/spend 总计对齐,请汇总所有事件的 chargedCents 字段。此字段包含模型费用和 Cursor Token 费率 (在请求适用该费率时) ,与仪表盘总计一致。它适用于按 token 和按请求计费的方案。
cursorTokenFee 字段表示 Cursor Token 费率,且仅在该费率适用于第三方模型请求时才会出现。这包括 Auto 将请求路由至第三方模型的情况。Cursor 的一方模型 (如 Grok 和 Composer) 以及按请求计费的企业版账户均不包含此费用。参见 Cursor Token 费率。
参数¶
startDate number
起始时间 (纪元毫秒) 。此边界为包含边界。
endDate number
结束时间 (epoch 毫秒) 。此界限包含在内。
startDate 和 endDate 是精确到毫秒的时间点,并且
两个边界都包含在内。恰好发生在 2026-05-08T00:00:00.000Z 的事件,
当 endDate 为 1778198400000 时也会被包含在内。对于不重叠的每日
摄取时间窗口,请将前一个窗口的 endDate 设为当天最后一
毫秒,例如 2026-05-07T23:59:59.999Z。
userId number
按指定用户 ID 筛选
page number
页码 (从 1 开始) 。默认:1
pageSize number
每页结果数量。默认:100。最大值:1000。
email string
按用户邮箱地址筛选
serviceAccountId string
按服务账户 ID 过滤
cloudAgentId string
按指定的云代理运行 ID 过滤。传入 * 可返回来自所有云代理运行的事件。
automationId string
按指定自动化 UUID 过滤。传入 * 可返回所有自动化的事件。
hostingType string
按执行地点筛选云端代理 (后台代理) 的运行。使用此选项可将自托管代理的推理开支与 Cursor 托管的运行区分开来。可接受的值:
CLOUD- Cursor 托管的运行SELF_HOSTED- 任何自托管运行 (自托管用量池 worker 或个人 “My Machine” worker)SELF_HOSTED_POOL- 仅限团队自托管用量池 workerSELF_HOSTED_MACHINE- 仅限个人 “My Machine” worker
无法识别的 hostingType 值会返回 400 错误,而不是空结果,因此不会把拼写错误误当成自托管支出确实为零。此过滤器仅涵盖推理支出;自托管计算在你自己的机器上运行,且永远不会由 Cursor 计量。
当你传入多个筛选条件时,此端点会使用 AND 将它们组合。例如,同时传入 automationId 和 serviceAccountId 时,将返回同时匹配这两个值的事件。
响应字段¶
usageEvents 中的每个对象包含:
timestampstring - 事件时间戳 (epoch 毫秒,以字符串形式表示)userEmailstring - 发出该请求的用户邮箱地址serviceAccountIdstring | undefined - 发出该请求的服务账户 ID。对于由人工用户发起的事件,此字段会被省略。serviceAccountNamestring | undefined - 发出该请求的服务账户显示名称。人工用户事件中会省略此字段。cloudAgentIdstring | undefined - 与此事件关联的云端代理运行 ID。对于云端代理之外的事件,会省略此字段。automationIdstring | undefined - 与此事件关联的自动化 UUID。自动化之外的事件中会省略此字段。conversationIdstring | undefined - 生成此事件的对话 (智能体会话) ID。可用它将费用归因于某个会话,或作为与其他提供对话 ID 的来源 (如 AI Code Tracking API) 进行关联的键。未关联对话的事件会省略此字段。modelstring - 用于该请求的 AI 模型kindstring - 计费类别 (例如Usage-based、Included in Business)maxModeboolean - 请求是否使用 Max 模式requestsCostsnumber - 按请求单位计算的成本isTokenBasedCallboolean - 请求是否按 token 用量计费isChargeableboolean - 此事件是否计费isHeadlessboolean - 此请求是否在没有连接客户端的情况下发出 (例如后台 Agent)tokenUsageobject | undefined - Token 使用明细 (当isTokenBasedCall为true时存在) :inputTokensnumber - 消耗的输入 token 数outputTokensnumber - 生成的输出 token 数cacheWriteTokensnumber - 写入缓存的 token 数cacheReadTokensnumber - 从缓存读取的 token 数totalCentsnumber - 模型总费用 (美分)discountPercentOffnumber | undefined - 已应用的折扣百分比 (如有)chargedCentsnumber - 此事件实际收取的总金额 (单位:美分)。对于适用 Cursor Token 费率的第三方模型请求,此金额包含模型费用以及 Cursor Token 费率。使用此字段可将事件级成本与/teams/spend总计对齐。适用于按 token 和按请求计费的方案。cursorTokenFeenumber | undefined - Cursor Token 费率 (单位:美分)。仅当该费率适用于第三方模型请求时出现 (包括 Auto 路由到第三方模型时) 。
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
响应:
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 5,
"currentPage": 1,
"pageSize": 25,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"userEmail": "developer@company.com",
"conversationId": "8f2e4a1b-6c3d-4e5f-9a7b-2d1c8e6f4a3b",
"model": "claude-4.5-sonnet",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 5,
"isTokenBasedCall": true,
"isChargeable": true,
"isHeadless": false,
"tokenUsage": {
"inputTokens": 126,
"outputTokens": 450,
"cacheWriteTokens": 6112,
"cacheReadTokens": 11964,
"totalCents": 20.18232
},
"chargedCents": 21.36232,
"cursorTokenFee": 1.18
},
{
"timestamp": "1750979173824",
"userEmail": "developer@company.com",
"conversationId": "8f2e4a1b-6c3d-4e5f-9a7b-2d1c8e6f4a3b",
"model": "claude-4.5-sonnet",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 10,
"isTokenBasedCall": true,
"isChargeable": true,
"isHeadless": false,
"tokenUsage": {
"inputTokens": 5805,
"outputTokens": 311,
"cacheWriteTokens": 11964,
"cacheReadTokens": 0,
"totalCents": 40.167,
"discountPercentOff": 10
},
"chargedCents": 37.33,
"cursorTokenFee": 1.18
},
{
"timestamp": "1750978339901",
"userEmail": "admin@company.com",
"model": "claude-4-sonnet-thinking",
"kind": "Included in Business",
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isChargeable": false,
"isHeadless": false,
"chargedCents": 8
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
服务账户使用示例:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"serviceAccountId": "sa_abc123",
"page": 1,
"pageSize": 10
}'
服务账户响应:
{
"totalUsageEventsCount": 1,
"pagination": {
"numPages": 1,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": false,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"userEmail": "agent-runner@company.com",
"serviceAccountId": "sa_abc123",
"serviceAccountName": "Nightly CI Agent",
"conversationId": "3b9d7c2e-1f4a-4b8c-a6d5-e9f0a2b4c6d8",
"model": "claude-4.5-sonnet",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 5,
"isTokenBasedCall": true,
"isChargeable": true,
"isHeadless": true,
"tokenUsage": {
"inputTokens": 126,
"outputTokens": 450,
"cacheWriteTokens": 6112,
"cacheReadTokens": 11964,
"totalCents": 20.18232
},
"chargedCents": 21.36232,
"cursorTokenFee": 1.18
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
自动化使用示例:
使用自动化 UUID 获取其使用事件。自动化归因适用于以用户或服务账户身份运行的自动化。
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"automationId": "7fc64f90-6d7a-4a5d-91b1-bd1f529a85dd",
"page": 1,
"pageSize": 100
}'
每个匹配的事件都包含其 automationId 和 cloudAgentId。对所有事件的 chargedCents 求和,即可计算该自动化的总费用。
自托管代理支出示例:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"hostingType": "SELF_HOSTED",
"page": 1,
"pageSize": 10
}'
设置用户支出上限¶
/teams/user-spend-limit
为团队中的单个成员设置支出上限。这样可以控制每个用户在团队内 AI 使用产生的费用。每个团队速率限制为每分钟 250 次请求。参见 速率限制。
参数¶
userEmail string 必填
团队成员的邮箱地址
spendLimitDollars number | null 必填
以美元计的支出上限 (仅允许整数,不含小数) 。设置为 null 可移除该上限。
- 可用性:仅限 Enterprise 版本
- 用户必须已经是你团队的成员
- 仅接受整数值 (不允许小数金额)
- 设置
spendLimitDollars为 0 会将上限设为 $0 - 设置
spendLimitDollars为null会完全清除/移除该上限
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
成功响应:
{
"outcome": "success",
"message": "Spend limit set to $100 for user developer@company.com"
}
错误响应:
{
"outcome": "error",
"message": "Invalid email format"
}
移除团队成员¶
/teams/remove-member
通过 API 从团队中移除成员。适用于自动化离职流程或与 HR 系统集成。每个团队的请求频率限制为每分钟 50 次。参见 速率限制。
参数¶
userId string
编码的用户 ID (例如:user_PDSPmvukpYgZEDXsoNirw3CFhy) 。当未提供 email 时必填。
email string
团队成员的邮箱地址。当未提供 userId 时必填。
- 可用性:仅限企业版
- 仅提供
userId或email其中之一,不要同时提供 - 移除后团队中至少需要保留一名付费成员
- 移除后团队中至少需要保留一名管理员 (owner 或 free-owner)
curl -X POST https://api.cursor.com/teams/remove-member \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"email": "developer@company.com"
}'
响应:
{
"success": true,
"userId": "user_PDSPmvukpYgZEDXsoNirw3CFhy",
"hasBillingCycleUsage": true
}
通过 user ID 移除:
curl -X POST https://api.cursor.com/teams/remove-member \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": "user_PDSPmvukpYgZEDXsoNirw3CFhy"
}'
错误响应:
{
"error": "User is not a member of this team"
}
{
"error": "Either userId or email must be provided"
}
{
"error": "Only one of userId or email should be provided, not both"
}
获取团队仓库屏蔽列表¶
/settings/repo-blocklists/repos
获取为团队配置的所有仓库屏蔽列表。添加仓库并使用模式,防止文件或目录被索引或用作上下文。
模式示例¶
常见的屏蔽列表模式:
*- 屏蔽整个仓库*.env- 屏蔽所有 .env 文件config/*- 屏蔽 config 目录中的所有文件**/*.secret- 屏蔽任何子目录中的所有 .secret 文件src/api/keys.ts- 屏蔽特定文件
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u YOUR_API_KEY:
响应:
{
"repos": [
{
"id": "repo_123",
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"id": "repo_456",
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}
新增或更新代码仓库屏蔽列表¶
/settings/repo-blocklists/repos/upsert
替换指定代码仓库现有的屏蔽列表。此端点只会覆盖所提供代码仓库的匹配模式,其他仓库不会受到影响。
参数¶
repos array 必填
代码仓库屏蔽列表对象数组。每个代码仓库对象必须包含:
urlstring - 要加入屏蔽列表的代码仓库 URLpatternsstring[] - 要屏蔽的文件模式数组 (支持 glob 模式)
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"repos": [
{
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}'
响应:
{
"repos": [
{
"id": "repo_123",
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"id": "repo_456",
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}
删除代码仓库屏蔽列表¶
/settings/repo-blocklists/repos/:repoId
从屏蔽列表中移除指定代码仓库。删除成功时返回 204 No Content。
参数¶
repoId string 必填
要删除的代码仓库屏蔽列表 ID
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_API_KEY:
响应:
204 No Content
计费分组¶
计费分组 允许 Enterprise 管理员按用户分组了解和管理支出。此功能适用于报表、内部费用分摊和预算管理。
成员在同一时间只能属于一个计费分组。未分配到任何分组的成员会被放入预留的 Unassigned 分组中。
列出分组¶
/teams/groups
获取团队中所有计费分组,以及当前计费周期的支出数据。
参数¶
billingCycle string
ISO 日期字符串 (例如 2025-01-15) ,用于指定要查询的计费周期。默认为当前周期。
curl -X GET "https://api.cursor.com/teams/groups?billingCycle=2025-01-15" \
-u YOUR_API_KEY:
响应:
{
"groups": [
{
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 12,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-20T14:22:00.000Z",
"spendCents": 245000,
"currentMembers": [
{
"userId": "user_abc123",
"name": "Alex Developer",
"email": "alex@company.com",
"joinedAt": "2024-01-15T10:30:00.000Z",
"leftAt": null,
"spendCents": 12500
}
],
"formerMembers": [],
"dailySpend": [
{ "date": "2025-01-15", "spendCents": 8500 },
{ "date": "2025-01-16", "spendCents": 9200 }
]
},
{
"id": "group_kljUvI0ASZORvSEXf9hV0ydcso",
"name": "Design",
"type": "BILLING",
"directoryGroupId": "dir_group_abc123xyz",
"memberCount": 5,
"createdAt": "2024-01-16T09:00:00.000Z",
"updatedAt": "2024-01-16T09:00:00.000Z",
"spendCents": 87500,
"currentMembers": [],
"formerMembers": [],
"dailySpend": []
}
],
"unassignedGroup": {
"id": "group_unassigned",
"name": "Unassigned",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 3,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z",
"spendCents": 15000,
"currentMembers": [],
"formerMembers": [],
"dailySpend": []
},
"billingCycle": {
"cycleStart": "2025-01-01T00:00:00.000Z",
"cycleEnd": "2025-02-01T00:00:00.000Z"
}
}
获取分组¶
/teams/groups/:groupId
获取单个计费分组,以及其成员和当前计费周期的消费数据。
参数¶
groupId string 必填
编码后的分组 ID (例如 group_PDSPmvukpYgZEDXsoNirw3CFhy)
billingCycle string
ISO 日期字符串 (例如 2025-01-15) ,用于指定要查询的计费周期。默认为当前周期。
curl -X GET "https://api.cursor.com/teams/groups/group_PDSPmvukpYgZEDXsoNirw3CFhy?billingCycle=2025-01-15" \
-u YOUR_API_KEY:
响应:
{
"group": {
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 3,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-20T14:22:00.000Z",
"spendCents": 125000,
"currentMembers": [
{
"userId": "user_abc123",
"name": "Alex Developer",
"email": "alex@company.com",
"joinedAt": "2024-01-15T10:30:00.000Z",
"leftAt": null,
"spendCents": 75000,
"dailySpend": [
{ "date": "2025-01-15", "spendCents": 5000 },
{ "date": "2025-01-16", "spendCents": 7500 }
]
},
{
"userId": "user_def456",
"name": "Sam Engineer",
"email": "sam@company.com",
"joinedAt": "2024-01-16T09:15:00.000Z",
"leftAt": null,
"spendCents": 50000,
"dailySpend": [
{ "date": "2025-01-15", "spendCents": 3500 },
{ "date": "2025-01-16", "spendCents": 4200 }
]
}
],
"formerMembers": [
{
"userId": "user_xyz789",
"name": "Former Member",
"email": "former@company.com",
"joinedAt": "2024-01-10T08:00:00.000Z",
"leftAt": "2024-01-14T17:00:00.000Z",
"spendCents": 0
}
],
"dailySpend": [
{ "date": "2025-01-15", "spendCents": 8500 },
{ "date": "2025-01-16", "spendCents": 11700 }
]
},
"billingCycle": {
"cycleStart": "2025-01-01T00:00:00.000Z",
"cycleEnd": "2025-02-01T00:00:00.000Z"
}
}
创建分组¶
/teams/groups
创建一个新的计费分组。每个团队每分钟最多 20 个请求。
参数¶
name string 必填
分组名称
type string
分组类型。目前仅支持 BILLING。默认值:BILLING
curl -X POST https://api.cursor.com/teams/groups \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"name": "Engineering"
}'
响应:
{
"group": {
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 0,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z",
"members": []
}
}
更新分组¶
/teams/groups/:groupId
更新计费分组的名称或目录分组关联。每个团队每分钟最多 20 个请求。
每次请求只能更新一个字段。若需要同时更新名称和目录关联,请分别发起请求。
参数¶
groupId string 必填
编码后的分组 ID
name string
分组的新名称
directoryGroupId string | null
要同步的目录分组 ID,或设为 null 以取消目录同步
curl -X PATCH https://api.cursor.com/teams/groups/group_PDSPmvukpYgZEDXsoNirw3CFhy \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"name": "Platform Engineering"
}'
响应:
{
"group": {
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Platform Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 3,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-25T16:45:00.000Z",
"members": [
{
"userId": "user_abc123",
"name": "Alex Developer",
"email": "alex@company.com",
"joinedAt": "2024-01-15T10:30:00.000Z"
}
]
}
}
删除分组¶
/teams/groups/:groupId
删除一个计费分组。成功时返回 204 No Content。每个团队每分钟最多 20 个请求。
删除计费分组是破坏性操作;数据无法恢复。被删除分组的所有历史用量都会被追溯性地重新分配到 Unassigned 分组。
参数¶
groupId string 必填
要删除的编码后的分组 ID
curl -X DELETE https://api.cursor.com/teams/groups/group_PDSPmvukpYgZEDXsoNirw3CFhy \
-u YOUR_API_KEY:
响应:
204 No Content
向分组添加成员¶
/teams/groups/:groupId/members
向计费分组添加团队成员。用户必须已是你团队的成员,且当前未分配到其他分组。每个团队每分钟最多 20 个请求。
与 SCIM 同步的计费分组无法通过 API 修改。所有此类分组的成员分配都必须通过 SCIM 进行管理。
参数¶
groupId string 必填
编码后的分组 ID
userIds string[] 必填
要添加的编码后用户 ID 数组 (例如 ["user_abc123", "user_def456"])
curl -X POST https://api.cursor.com/teams/groups/group_PDSPmvukpYgZEDXsoNirw3CFhy/members \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userIds": ["user_abc123", "user_def456"]
}'
响应:
{
"group": {
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 2,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-25T16:50:00.000Z",
"members": [
{
"userId": "user_abc123",
"name": "Alex Developer",
"email": "alex@company.com",
"joinedAt": "2024-01-25T16:50:00.000Z"
},
{
"userId": "user_def456",
"name": "Sam Engineer",
"email": "sam@company.com",
"joinedAt": "2024-01-25T16:50:00.000Z"
}
]
}
}
从分组中移除成员¶
/teams/groups/:groupId/members
从计费分组中移除团队成员。被移除的成员会移动到 Unassigned 分组。每个团队每分钟最多 20 个请求。
与 SCIM 同步的计费分组无法通过 API 修改。对于与 SCIM 同步的分组,所有成员变更都必须通过 SCIM 进行管理。
参数¶
groupId string 必填
编码后的分组 ID
userIds string[] 必填
待移除的编码后用户 ID 数组
curl -X DELETE https://api.cursor.com/teams/groups/group_PDSPmvukpYgZEDXsoNirw3CFhy/members \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userIds": ["user_def456"]
}'
响应:
{
"group": {
"id": "group_PDSPmvukpYgZEDXsoNirw3CFhy",
"name": "Engineering",
"type": "BILLING",
"directoryGroupId": null,
"memberCount": 1,
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-25T17:00:00.000Z",
"members": [
{
"userId": "user_abc123",
"name": "Alex Developer",
"email": "alex@company.com",
"joinedAt": "2024-01-25T16:50:00.000Z"
}
]
}
}
模型访问¶
模型访问路由目前处于预览阶段,可能会发生变化。在正式发布前,路径、响应字段和错误行为均可能调整。
读取和更新团队的模型访问策略:自定义策略是否已启用、新提供商和模型的默认值、按提供商和每个模型设置的开关,以及每个模型的设置,例如 Fast 和推理工作量。
启用未设置参数的模型时,将保留目录默认值。当这些默认值 (例如 Fast) 不符合团队策略时,请使用每个模型的设置。
这些路由返回团队基线配置。组织群组仍可为部分成员扩大访问权限;群组允许列表不在此 API 的管理范围内。个人 API 密钥 (BYOK) 控制仍需在仪表盘中设置。
如需读取组织范围的设置,或对关联团队进行批量切换,请参阅组织 API 模型访问路由。
- 适用范围:已启用模型访问控制的团队
- 身份验证:团队 API 密钥 (Basic auth)。读取需要
models:read。写入需要models:*。具有admin:*权限范围的密钥两者均可使用。通用read:*密钥无法调用这些路由。 - 提供商和模型 ID:路径段使用目录 ID,例如
anthropic和claude-opus-4-6,而非显示名称。GET 响应中包含显示名称。 - 先配置策略:当
state为unrestricted(或legacy) 时,对提供商和模型的读取和写入会返回 409。对不受限团队首次执行带默认值的PUT /teams/model-access/configuration会启用策略,并以当前目录初始化设置 (与在“模型”页面首次保存的效果相同) 。后续带默认值的配置 PUT 仅更新默认值,不会更改现有开关。 - 恢复为不受限状态:使用
{ "state": "unrestricted" }执行PUT /teams/model-access/configuration会清除自定义策略,使state再次变为unrestricted。 - 速率限制:每分钟 20 个请求。写入会以
team_settings事件的形式出现在团队审计日志中。请参阅速率限制和最佳实践。
获取模型访问配置¶
/teams/model-access/configuration
返回团队是否设置了自定义模型访问策略,以及新发现的提供商和模型的默认值。
响应字段¶
teamId number
由 API 密钥确定的整数团队 ID。
state string
取值为 unrestricted、custom 或 legacy。
newProviderDefault string | null
当 state 为 custom 时,取值为 enabled 或 disabled;否则为 null。
newModelDefault string | null
当 state 为 custom 时,取值为 enabled 或 disabled;否则为 null。
curl -X GET https://api.cursor.com/teams/model-access/configuration \
-u YOUR_API_KEY:
响应:
{
"teamId": 7,
"state": "unrestricted",
"newProviderDefault": null,
"newModelDefault": null
}
更新模型访问配置¶
/teams/model-access/configuration
创建自定义策略、更新默认值,或将团队恢复为不受限状态。
发送以下任一内容:
{ "state": "unrestricted" }:清除自定义策略 (以及旧版允许/阻止列表) ,将state设为unrestricted{ "newProviderDefault", "newModelDefault" }:创建或更新自定义策略 (state: "custom"的向后兼容简写)
对于不受限团队,首次发送默认值 PUT 请求会创建自定义策略并初始化目录条目。后续默认值 PUT 请求仅更新默认值,保留现有开关设置。
请求体¶
state string
可选。使用 unrestricted 清除策略。发送默认值时请省略。
newProviderDefault string
enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时请省略。
newModelDefault string
enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时请省略。
curl -X PUT https://api.cursor.com/teams/model-access/configuration \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"newProviderDefault": "disabled",
"newModelDefault": "enabled"
}'
响应:
{
"teamId": 7,
"state": "custom",
"newProviderDefault": "disabled",
"newModelDefault": "enabled"
}
将团队恢复为不受限状态:
curl -X PUT https://api.cursor.com/teams/model-access/configuration \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{ "state": "unrestricted" }'
响应:
{
"teamId": 7,
"state": "unrestricted",
"newProviderDefault": null,
"newModelDefault": null
}
列出模型访问提供商¶
/teams/model-access/providers
列出目录中的提供商和模型,包括最终解析的启用状态及每个模型的 parameters。如果团队没有自定义策略,则返回 409。
每个模型都包含由目录定义的 parameters 数组。参数 ID 和支持的值来自模型目录 (例如 fast、reasoning、effort、context) 。在写入前,可通过此 GET 请求了解模型支持哪些参数。
模型 parameters 字段¶
id string
参数 ID (例如 fast 或 reasoning) 。
displayName string
易于理解的显示标签。
supportedValues string[]
目录允许该模型使用此参数的所有值。
allowedValues string[]
团队策略当前允许的值。
configuredDefaultValue string | null
管理员固定的默认值;未设置时为 null。
catalogDefaultValue string | null
该模型中此参数的目录默认值。
curl -X GET https://api.cursor.com/teams/model-access/providers \
-u YOUR_API_KEY:
响应:
{
"teamId": 7,
"state": "custom",
"providers": [
{
"id": "anthropic",
"displayName": "Anthropic",
"enabled": true,
"models": [
{
"id": "claude-opus-4-6",
"displayName": "Opus 4.6",
"enabled": true,
"parameters": [
{
"id": "fast",
"displayName": "Fast",
"supportedValues": ["false", "true"],
"allowedValues": ["false", "true"],
"configuredDefaultValue": null,
"catalogDefaultValue": "true"
}
]
}
]
},
{
"id": "openai",
"displayName": "OpenAI",
"enabled": true,
"models": [
{
"id": "gpt-5.4",
"displayName": "GPT-5.4",
"enabled": true,
"parameters": [
{
"id": "reasoning",
"displayName": "Reasoning",
"supportedValues": ["low", "medium", "high", "xhigh", "max"],
"allowedValues": ["low", "medium", "high"],
"configuredDefaultValue": "high",
"catalogDefaultValue": "medium"
}
]
}
]
}
]
}
更新模型访问提供商¶
/teams/model-access/providers/:provider
启用或禁用提供商。如果团队仍为 unrestricted 或 legacy,则返回 409。
参数¶
provider string 必填
目录中的提供商 ID (例如 openai 或 anthropic) 。
请求体¶
enabled boolean 必填
curl -X PUT https://api.cursor.com/teams/model-access/providers/openai \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{"enabled": false}'
列出提供商的模型¶
/teams/model-access/providers/:provider/models
列出某个提供商的模型及其最终解析的启用状态和每个模型的 parameters。参数字段与提供商响应一致。如果团队没有自定义策略,则返回 409。
参数¶
provider string 必填
目录中的提供商 ID (例如 anthropic) 。
curl -X GET https://api.cursor.com/teams/model-access/providers/anthropic/models \
-u YOUR_API_KEY:
更新模型访问模型¶
/teams/model-access/providers/:provider/models/:model
启用或禁用单个模型,并可选择设置每个模型的参数限制和默认值。团队仍为 unrestricted 或 legacy 时,返回 409。
参数¶
provider string 必填
目录中的提供商 ID (例如 anthropic) 。
model string 必填
模型目录中的模型 ID (例如 claude-opus-4-6) 。
请求体¶
enabled boolean 必填
parameters object
可选的从参数 ID 到设置的映射。未提供的参数和字段将保持不变。
allowedValuesstring[] | null: 限制成员可选择的值。传入null可清除限制。defaultValuestring | null: 团队的默认值。设置限制时,必须包含在allowedValues中。传入null可恢复目录默认值。
未知的参数 ID 或值、空的 allowedValues 数组、不在 allowedValues 中的默认值,以及解析后没有有效模型变体的设置均返回 400。
在模型上禁用 Fast:
curl -X PUT https://api.cursor.com/teams/model-access/providers/anthropic/models/claude-opus-4-6 \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"parameters": {
"fast": { "allowedValues": ["false"] }
}
}'
设置允许的推理级别和默认值:
curl -X PUT https://api.cursor.com/teams/model-access/providers/openai/models/gpt-5.4 \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"parameters": {
"reasoning": {
"allowedValues": ["low", "medium", "high"],
"defaultValue": "high"
}
}
}'
清除限制并恢复目录默认值:
curl -X PUT https://api.cursor.com/teams/model-access/providers/openai/models/gpt-5.4 \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"parameters": {
"reasoning": {
"allowedValues": null,
"defaultValue": null
}
}
}'
响应:
{
"id": "gpt-5.4",
"displayName": "GPT-5.4",
"enabled": true,
"provider": "openai",
"parameters": [
{
"id": "reasoning",
"displayName": "Reasoning",
"supportedValues": ["low", "medium", "high", "xhigh", "max"],
"allowedValues": ["low", "medium", "high", "xhigh", "max"],
"configuredDefaultValue": null,
"catalogDefaultValue": "medium"
}
]
}
错误¶
错误响应体使用:
{ "code": "error", "message": "…" }
| 状态 | 发生情况 |
|---|---|
401 |
Key 无效,或缺少 models:read / models:* (或 admin:*) 权限 |
403 |
该团队无法使用模型访问控制 |
409 |
当 state 为 unrestricted 或 legacy 时读取或写入 提供商 或模型 |
400 |
提供商、模型、参数 ID 或参数值未知;响应体无效;allowedValues 为空;默认值不在 allowedValues 范围内;会解析为无有效模型变体的设置;或会阻止 Smart Auto 所需的模型 |