Skip to main content

Command Palette

Search for a command to run...

API

组织 API

组织 API 允许你执行适用于与某个组织关联的各个团队的操作,例如在这些团队之间移动用户、查看跨团队的共享用量、管理组织群组,以及读取或更新模型访问。它使用 组织 API 密钥 以及与团队 Admin API相同的 HTTP 模式。

  • 组织 API 使用Basic 认证,并将你的 API 密钥作为用户名。
  • 有关创建 API 密钥、身份验证方法、速率限制和最佳实践的详细信息,请参阅 API 概览。

组织 API 密钥与团队 API 密钥

组织 API 密钥是组织作用域的凭据,团队 API 密钥是团队作用域的凭据。

调用组织级端点 (如 /organizations/team-memberships/sync、/organizations/pooled-usage 和 /organizations/groups) 时,请使用 组织 API 密钥。

调用 /teams/* 下的端点时,请使用 团队 API 密钥 (例如 /teams/members 和 /teams/spend) 。

主要区别

  • 作用域:组织 API 密钥可跨同一组织下关联的多个团队执行操作。团队 API 密钥只能在单个团队内执行操作。
  • 端点兼容性:组织端点需要组织 API 密钥。团队端点需要团队 API 密钥。
  • 密钥作用域:每个路由都要求密钥具备特定作用域。只读成员路由接受 members:read;成员和群组写入路由需要 members:*;用量路由需要 usage:*。具备 admin:* 的密钥可用于所有路由,因为 admin 包含其他作用域。
  • 授权失败:如果密钥作用域与端点作用域不匹配,请求会因身份验证或授权错误而失败 (通常为 401 或 403) 。

作用域

每个组织 API 密钥都恰好带有一个作用域。只有当密钥的作用域覆盖该路由时,该路由才能使用。更宽的作用域包含较窄作用域允许的全部权限。

作用域权限示例路由
members:read对组织成员资格的只读访问权限。GET /organizations/members
members:*对成员和群组的读写权限。包含 members:read 允许的全部权限。GET /organizations/members, POST /organizations/team-memberships/sync, 所有 /organizations/groups 路由
usage:*对共享用量和报表的读取权限。POST /organizations/pooled-usage, POST /organizations/filtered-usage-events, POST /organizations/daily-usage-data, POST /organizations/spend
models:read对模型访问配置和提供商清单的只读访问权限。GET /organizations/teams/model-access/configuration, GET /organizations/teams/{teamId}/model-access/configuration, GET /organizations/teams/{teamId}/model-access/providers
models:*对模型访问的读写权限。包含 models:read 允许的全部权限。所有模型访问路由,包括批量切换提供商/模型和批量配置
admin:*对所有组织路由的完全访问权限。以上所有路由

请根据需要选择权限范围最小的作用域。对于只列出成员、但绝不修改成员关系的只读集成,请使用 members:read。对于无需授予完整管理员权限的模型访问自动化,请使用 models:read 或 models:*。在仪表盘中创建组织 API 密钥时,你可以选择这些作用域。

如何传递组织 API 密钥?

方式与其他 Cherri Code API 密钥相同:使用 Basic 认证,将该密钥作为用户名,密码留空。

curl -X POST https://api.cursor.com/organizations/team-memberships/sync \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "users": [      { "userId": 12345, "destinationTeamId": 7 }    ]  }'

成员

读取组织成员信息,并在与你的组织关联的团队之间移动成员。

列出组织成员

GET/organizations/members

获取与你的 API 密钥关联的组织成员,以及每位成员的组织角色和其在关联团队中的分配信息。结果支持分页。

查询参数

page number

页码 (从 1 开始) 。默认值为第 1 页。

pageSize number

每页成员数量。上限为 200;超过 200 的值会被截断为 200。

响应字段

members array

组织成员对象数组,每个对象包含:
  • userId number - 成员的唯一数字标识符,对应团队 GET /teams/members 端点返回的 id
  • email string - 成员的电子邮件地址
  • name string - 成员的显示名称
  • organizationRole string - 组织级角色,可以是 admin 或 member。这与各团队分配中的 teamRole 不同:用户可以在组织中是 admin,同时在某个特定团队中担任 member,反之亦然。
  • teams array - 成员在组织关联团队中的分配情况。每个对象包含:
    • teamId number - 该成员所属的某个关联团队的整数 ID
    • teamRole string - 该团队中的角色 (例如 member、owner)

pagination object

分页元数据:page、pageSize、totalCount、totalPages、hasNextPage 和 hasPreviousPage。
curl -X GET "https://api.cursor.com/organizations/members?page=1&pageSize=50" \  -u YOUR_ORGANIZATION_API_KEY:

响应:

{  "members": [    {      "userId": 12345,      "email": "[email protected]",      "name": "Alex",      "organizationRole": "member",      "teams": [        { "teamId": 7, "teamRole": "member" },        { "teamId": 8, "teamRole": "owner" }      ]    },    {      "userId": 12346,      "email": "[email protected]",      "name": "Sam",      "organizationRole": "admin",      "teams": [        { "teamId": 7, "teamRole": "owner" }      ]    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 2,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

同步组织团队成员资格

POST/organizations/team-memberships/sync

设置组织内一个或多个用户所属的团队。此操作与 CSV 导入 API 的批量模式一致:发送一个用户数组,每个用户对应返回一行结果。

每个条目必须且只能使用 teamIds 或 destinationTeamId 之一:

  • teamIds 是用户应所属团队 ID 的完整集合。该端点会将用户的成员关系精确调整为与该集合一致:把用户尚未加入的已列出团队添加进去,并移除所有未列出的团队。若要在迁移期间为用户新增一个团队的同时保留其当前团队,请同时列出这两个团队 (例如 [oldTeamId, newTeamId]) 。
  • destinationTeamId 会将用户加入单个团队。用户会被加入指定团队,并从其他所有团队中移除。设置 destinationTeamId: NNN 在功能上等同于 teamIds: [NNN]。

请求体

organizationId string 必填

公开组织 ID (例如 org_abc123) 。必须与用于调用该端点的组织 API 密钥所属的组织相匹配。

users array 必填

非空条目列表 (每次请求最多 500 条) 。每个元素都是一个包含用户 ID 并且仅有一个团队字段 (teamIds 或 destinationTeamId) 的对象:
  • userId number | string:要同步的用户 ID。支持整数 ID (例如 12345) 或 string ID (例如 "user_abc123") 。
  • teamIds number[]:同步后,用户应所属的全部与组织关联的团队 ID 集合。成员关系会被精确调整为与该集合完全一致。任何未列出的团队都会被移除。若要保留用户当前所在的团队,请将这些团队也包含在内 (例如 [7, 8]) 。每个条目最多 100 个团队。
  • destinationTeamId number:用于同步到单个团队的字段。将 destinationTeamId: NNN 设为与发送 teamIds: [NNN] 等效。该用户的团队将被精确设为这一个团队。必须是关联到该组织的团队。
每条记录只能提供 teamIds 或 destinationTeamId 中的一个。

成功响应 (HTTP 200)

results array

每条同步请求对应一个条目,按顺序排列。每个对象包含 userId、该条目解析后的 teamIds,以及 status: "success" 或 status: "error" (该行失败时包含 errorMessage) 。携带 destinationTeamId 的条目也会回显 destinationTeamId (即 teamIds 中的第一个团队) 。

successCount number

status: "success" 的行数。

errorCount number

status: "error" 的行数。
curl -X POST https://api.cursor.com/organizations/team-memberships/sync \  -u YOUR_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "users": [      { "userId": 12345, "teamIds": [7, 8] },      { "userId": "user_abc123", "destinationTeamId": 8 }    ]  }'

第一条记录将用户 12345 精确关联到团队 7 和 8 (将用户加入尚未加入的团队,并移除任何其他已关联的团队) 。第二条记录使用 destinationTeamId,其效果等同于发送 teamIds: [8]。

响应:

{  "results": [    {      "userId": 12345,      "teamIds": [7, 8],      "status": "success"    },    {      "userId": "user_abc123",      "teamIds": [8],      "destinationTeamId": 8,      "status": "success"    }  ],  "successCount": 2,  "errorCount": 0}

错误响应:

大多数 API 错误会使用 HTTP 401、403 或 400,并返回如下结构的 JSON 响应体:

{  "code": "error",  "message": "…"}

404:未找到组织 (此路由的消息字段名不同):

{  "error": "Organization not found"}

401:组织 API 密钥无效 (密钥错误或缺失):

{  "code": "error",  "message": "Invalid Organization API Key"}

401:缺少所需权限范围 (密钥有效,但未包含 members:* 或 admin:*):

{  "code": "error",  "message": "Organization API key missing required scope: members:*"}

403:组织与该 API 密钥不匹配 (响应体中的 organizationId 与该 API 密钥所属的组织不一致):

{  "code": "error",  "message": "Not authorized"}

400:无效的请求体 (示例;每个失败的请求仅适用其中一种情况):

{  "code": "error",  "message": "Request body is required"}
{  "code": "error",  "message": "organizationId is required"}
{  "code": "error",  "message": "users must be a non-empty array"}
{  "code": "error",  "message": "users must not contain more than 500 moves"}

按行失败 (HTTP 200) :单条记录的验证错误或业务规则错误会在 results 中返回,并带有 status: "error" 和 errorMessage。下面的示例使用 destinationTeamId,因此这些行会回显 destinationTeamId;使用 teamIds 发送的条目则会回显 teamIds。如果 userId / destinationTeamId 的类型无效,则该行中的对应无效字段会使用 0:

{  "results": [    {      "userId": 0,      "destinationTeamId": 7,      "status": "error",      "errorMessage": "Invalid userId"    }  ],  "successCount": 0,  "errorCount": 1}
{  "results": [    {      "userId": 12345,      "destinationTeamId": 0,      "status": "error",      "errorMessage": "Invalid destinationTeamId"    }  ],  "successCount": 0,  "errorCount": 1}
{  "results": [    {      "userId": 0,      "destinationTeamId": 0,      "status": "error",      "errorMessage": "Invalid userId. Invalid destinationTeamId"    }  ],  "successCount": 0,  "errorCount": 1}

逐行失败 (HTTP 200) :当输入类型正确但无法应用更改时,由同步逻辑返回:

{  "results": [    {      "userId": 12345,      "destinationTeamId": 999,      "status": "error",      "errorMessage": "Team is not linked to this organization"    }  ],  "successCount": 0,  "errorCount": 1}
{  "results": [    {      "userId": 12345,      "destinationTeamId": 7,      "status": "error",      "errorMessage": "User is not a member of this organization"    }  ],  "successCount": 0,  "errorCount": 1}
{  "results": [    {      "userId": 12345,      "destinationTeamId": 7,      "status": "error",      "errorMessage": "User not found"    }  ],  "successCount": 0,  "errorCount": 1}

用量

查看你的组织中所有关联团队的用量情况。这些端点会汇总组织用量池内所有团队的数据,因此你无需为每个团队分别使用 团队 API 密钥。若只需统计单个团队,请改用团队 Admin API 的用量端点。

获取共享用量

POST/organizations/pooled-usage

获取组织的共享用量:包括用量池的支出上限、整个组织的总用量,以及按团队划分的明细。这些数据用于仪表盘中的共享用量部分。所有金额字段均以美分为单位。

请求体

organizationId string 必填

公开的组织 ID (例如 org_abc123) 。必须与用于调用该端点的组织 API 密钥所属组织一致。

响应字段

pool object

当前合同期内用量池层级的汇总数据:
  • limitCents number - 组织的共享用量支出上限,以美分为单位
  • usedCents number - 目前已使用的共享总用量,以美分为单位
  • remainingCents number - 剩余共享预算 (limitCents 减去 usedCents) ,以美分为单位
  • contractStartDate string | null - 标记当前合同期开始时间的 ISO 8601 时间戳;如果未设置合同日期,则为 null
  • contractEndDate string | null - 标记当前合同期结束时间的 ISO 8601 时间戳;如果未设置合同日期,则为 null

teams array

按团队划分的用量明细。所有 usedCents 之和等于 pool.usedCents。每个对象包含:
  • teamId number - 关联到该组织的团队整数 ID
  • usedCents number - 该团队在当前合同期内消耗的用量,以美分为单位
  • budgetLimitCents number | undefined - 该团队的预算上限,以美分为单位。仅当该团队已配置预算时才会返回。
curl -X POST https://api.cursor.com/organizations/pooled-usage \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123"  }'

响应:

{  "pool": {    "limitCents": 5000000,    "usedCents": 1862340,    "remainingCents": 3137660,    "contractStartDate": "2026-01-01T00:00:00.000Z",    "contractEndDate": "2026-12-31T23:59:59.999Z"  },  "teams": [    {      "teamId": 7,      "usedCents": 1440100,      "budgetLimitCents": 2000000    },    {      "teamId": 8,      "usedCents": 422240    }  ]}

获取使用事件

POST/organizations/filtered-usage-events

检索与贵组织关联的各团队的详细使用事件。这是团队端点 /teams/filtered-usage-events 的组织范围对应版本:它返回相同的事件结构,每个事件均标注其所属的 teamId。

请求体

organizationId string 必填

组织公开 ID (例如 org_abc123) 。必须与用于调用该端点的 Organization API 密钥所属的组织一致。

teamIds number[]

可选的一组整数型团队 ID,用于包含指定团队。每个 ID 必须属于该组织。若省略,则包含该组织池中的所有团队。

startDate number

起始日期 (以纪元毫秒为单位) 。此边界为闭合 (包含端点) 。

endDate number

结束日期 (以纪元毫秒为单位) 。此边界为闭合 (包含端点) 。

userId number

按特定用户 ID 筛选。

email string

按用户电子邮件地址筛选。

serviceAccountId string

按服务账号 ID 筛选。

page number

页码 (从 1 开始) 。默认值:1

pageSize number

每页返回的结果数量。默认值:10

响应字段

usageEvents 中的每个对象包含与团队 endpoint 相同的字段,并额外附带一个所属团队标签:

  • teamId number - 拥有此事件的团队 ID (整数)
  • timestamp string - 事件时间戳,以纪元毫秒为单位 (string 形式)
  • userEmail string - 发起该请求的用户电子邮件地址
  • serviceAccountId string | undefined - 发起请求的服务账户 ID。对于人工用户事件,此字段会省略。
  • serviceAccountName string | undefined - 发起该请求的服务账户的显示名称。对于人工用户事件,此字段将省略。
  • model string - 该请求使用的 AI 模型
  • kind string - 计费类型 (例如:Usage-based、Included in Business)
  • maxMode boolean - 请求是否使用了 Max Mode
  • requestsCosts number - 以请求单位计的成本
  • isTokenBasedCall boolean - 该请求是否按 token 使用量计费
  • isChargeable 布尔值 - 该事件是否会产生费用
  • isHeadless 布尔值 - 该请求是否在未连接客户端的情况下发起 (例如,后台代理)
  • tokenUsage object | undefined - 使用量详情 (当 isTokenBasedCall 为 true 时提供) :
    • inputTokens number - 消耗的输入 token
    • outputTokens number - 生成的输出 token
    • cacheWriteTokens number - 写入缓存的 token
    • cacheReadTokens number - 从缓存读取的 token
    • totalCents number - 模型总成本 (以美分计)
    • discountPercentOff number | undefined - 应用的折扣百分比 (如有)
  • chargedCents number - 此事件收取的总金额 (单位:美分) 。对于适用 Cherri Code Token 费率的第三方模型请求,此字段同时包含模型成本和 Cherri Code Token 费率。
  • cursorTokenFee number | undefined - 以美分计的 Cherri Code Token 费率。仅当该费率适用于第三方模型请求时才会提供 (包括 Auto 将请求路由到第三方模型时) 。
# 组织用量池中所有团队的事件curl -X POST https://api.cursor.com/organizations/filtered-usage-events \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "startDate": 1748411762359,    "endDate": 1751003762359,    "page": 1,    "pageSize": 25  }'# 特定团队的事件curl -X POST https://api.cursor.com/organizations/filtered-usage-events \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "teamIds": [7, 8],    "startDate": 1748411762359,    "endDate": 1751003762359,    "page": 1,    "pageSize": 25  }'

响应:

{  "totalUsageEventsCount": 113,  "pagination": {    "numPages": 12,    "currentPage": 1,    "pageSize": 10,    "hasNextPage": true,    "hasPreviousPage": false  },  "usageEvents": [    {      "teamId": 7,      "timestamp": "1750979225854",      "userEmail": "[email protected]",      "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    },    {      "teamId": 8,      "timestamp": "1750978339901",      "userEmail": "[email protected]",      "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  }}

获取每日用量数据

POST/organizations/daily-usage-data

获取与您组织关联的所有团队中每位成员的每日使用指标。这是团队 /teams/daily-usage-data 端点的组织级对应接口,每行数据都标注了所属的 teamId。结果按用户分页,并返回在所请求日期范围内具有成员身份的所有成员的数据;使用 page 和 pageSize 进行翻页。

请求体

organizationId string 必填

组织的公开 ID (例如 org_abc123) 。必须与用于调用此端点的组织 API 密钥所属的组织相匹配。

startDate number

起始日期 (Unix 毫秒时间戳) 。默认为 7 天前。

endDate number

结束日期 (epoch 毫秒时间戳) 。默认为当前时间。

teamIds number[]

需要统计的组织关联团队。若省略,则包含该组织池中的所有团队。每次请求最多 100 个团队。

page number

页码 (从 1 开始) 。默认值:1

pageSize number

每页用户数量 (1-1000) 。默认值:1000

userEmail string

按电子邮件筛选一个或多个用户。接受单个电子邮件或以逗号分隔的列表。userEmails 可作为别名。

响应字段

data 数组中的每个对象包含与团队每日用量端点相同的字段,并额外包含一个 teamId。关键字段:

  • userId string - 带有 user_ 前缀的已编码用户 ID (例如 user_abc123)
  • teamId number - 该行所属的组织关联团队 ID
  • day string - 该记录对应的日期 (ISO 日期,例如 2024-03-18)
  • date 数字 - 以纪元毫秒表示的日期
  • email string - 用户的电子邮件地址
  • isActive 布尔值 - 用户当天是否活跃
  • totalLinesAdded number - 新增代码总行数
  • totalLinesDeleted number - 已删除的代码总行数
  • acceptedLinesAdded 数字 - 已接受的 AI 建议新增行数
  • acceptedLinesDeleted number - 已接受的 AI 建议中删除的行数
  • totalApplies number - AI 代码应用次数总数
  • totalAccepts 数值 - 已接受的 AI 建议总数
  • totalRejects number - 被拒绝的 AI 建议总数
  • totalTabsShown number - 向用户显示的 Tab 补全总数
  • totalTabsAccepted 数字 - 用户已接受的 Tab 补全总数
  • composerRequests 数值 - 发起的 Composer 请求数量
  • chatRequests number - 发起的聊天请求数
  • agentRequests number - 发起的 Agent 模式请求数
  • cmdkUsages number - Cmd+K Inline edit 的使用次数
  • subscriptionIncludedReqs number - 订阅方案包含的请求数
  • apiKeyReqs number - 通过 API 密钥发起的请求数
  • usageBasedReqs number - 按用量计费 (超额) 请求数
  • bugbotUsages number - Bugbot 的用量
  • mostUsedModel string | null - 当天最常用的 AI 模型
  • applyMostUsedExtension string | null - apply 操作中最常见的文件扩展名
  • tabMostUsedExtension string | null - Tab 补全中最常见的文件扩展名
  • clientVersion string | null - 使用的 Cherri Code 客户端版本

响应还包含一个 pagination 对象 (page、pageSize、totalUsers、totalPages、hasNextPage、hasPreviousPage) 和一个 period 对象 (startDate、endDate) 。

curl -X POST https://api.cursor.com/organizations/daily-usage-data \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "startDate": 1710720000000,    "endDate": 1710892800000,    "page": 1,    "pageSize": 1000  }'

响应:

{  "data": [    {      "userId": "user_abc123",      "teamId": 101,      "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": "[email protected]"    }  ],  "period": {    "startDate": 1710720000000,    "endDate": 1710892800000  },  "pagination": {    "page": 1,    "pageSize": 1000,    "totalUsers": 150,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

获取支出数据

POST/organizations/spend

获取你的组织关联的各团队中按成员统计的支出数据。这是团队 /teams/spend 端点在组织范围内的对应版本,并会用所属的 teamId 标记每位成员。与团队端点不同,支出基于与 /organizations/pooled-usage 相同的已包含支出定义,按组织合同窗口统计 (而非各团队各自的计费周期) ,因此这些数字可与用量池对齐。

请求体

organizationId string 必填

公开组织 ID (例如 org_abc123) 。必须与调用该端点时所用的 Organization API 密钥对应的组织一致。

teamIds number[]

要纳入报告的组织关联团队。省略时,将包含组织用量池中的所有团队。每次请求最多 100 个团队。

sortBy string

排序字段:email、name、spendCents。默认值:email

sortDirection string

排序方向:asc、desc。默认值:asc

page number

页码 (从 1 开始) 。默认值:1

pageSize number

每页结果数 (1-1000) 。默认值:100

响应字段

teamMemberSpend 中的每个对象都包含:

  • userId string - 带 user_ 前缀的编码用户 ID (例如 user_abc123)
  • teamId number - 该成员所属的组织关联团队 ID
  • name string - 用户的显示名称
  • email string - 用户的电子邮件地址
  • role string - 该成员在团队中的角色 (例如 member、owner)
  • spendCents number - 在组织合同窗口内归属于该成员的已包含用量池支出,单位为美分

响应还包括 totalMembers (number) 、totalPages (number) ,以及描述组织合同窗口的 period 对象 (startDate、endDate,以 epoch 毫秒表示) 。

curl -X POST https://api.cursor.com/organizations/spend \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "sortBy": "spendCents",    "sortDirection": "desc",    "page": 1,    "pageSize": 25  }'

响应:

{  "teamMemberSpend": [    {      "userId": "user_abc123",      "teamId": 101,      "name": "Alex",      "email": "[email protected]",      "role": "member",      "spendCents": 2450    },    {      "userId": "user_def456",      "teamId": 202,      "name": "Sam",      "email": "[email protected]",      "role": "owner",      "spendCents": 1875    }  ],  "totalMembers": 15,  "totalPages": 1,  "period": {    "startDate": 1735689600000,    "endDate": 1767225600000  }}

模型访问

读取和更新组织关联团队的模型访问策略。这些路由与团队模型访问 API 对应,但仅适用于关联团队。

使用列表接口和按团队查询的 GET 接口来发现配置偏差。通过配置 PUT 接口以及提供商/模型开关 (包括每个模型的 parameters) 来对齐团队配置。没有组织级别的复制端点或策略指纹。

数值型 teamId 可通过 GET /organizations/members 等路由获取。

列出模型访问配置

GET/organizations/teams/model-access/configuration

列出关联团队的模型访问配置。可用于发现不受限策略与自定义策略之间的偏差。若要发现开关状态偏差,请 GET 每个团队的提供商并进行比较。

如果关联团队未启用模型访问控制,该行仍会返回 HTTP 200,并包含 errorMessage 而非 state / 默认值。该团队的按团队 GET 和写入路由会返回 403。

查询参数

page number

页码 (从 1 开始) 。

pageSize number

每页结果数。

teamIds string

可选,以逗号分隔的团队 ID,例如 7,8,9。
curl -X GET "https://api.cursor.com/organizations/teams/model-access/configuration?page=1&pageSize=50" \  -u YOUR_ORGANIZATION_API_KEY:

响应:

{  "teams": [    {      "teamId": 7,      "teamName": "Platform",      "state": "custom",      "newProviderDefault": "disabled",      "newModelDefault": "enabled"    },    {      "teamId": 8,      "teamName": "Mobile",      "state": "custom",      "newProviderDefault": "disabled",      "newModelDefault": "enabled"    },    {      "teamId": 9,      "teamName": "Data",      "state": "unrestricted",      "newProviderDefault": null,      "newModelDefault": null    },    {      "teamId": 10,      "teamName": "Research",      "errorMessage": "Model access control is not available for this team"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 4,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

获取团队模型访问配置

GET/organizations/teams/:teamId/model-access/configuration

获取一个关联团队的配置。

参数

teamId number 必填

关联到该组织的团队的整数 ID。
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY:

更新团队模型访问配置

PUT/organizations/teams/:teamId/model-access/configuration

为一个关联团队创建或更新配置,或将该团队设为不受限制。请求体和初始化行为与团队路由相同。

参数

teamId number 必填

关联到组织的团队的整数 ID。

请求体

state string

可选。使用 unrestricted 清除策略。发送默认值时省略此字段。

newProviderDefault string

enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时省略此字段。

newModelDefault string

enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时省略此字段。
curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "newProviderDefault": "disabled",    "newModelDefault": "enabled"  }'

将一个关联团队设为不受限制:

curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{ "state": "unrestricted" }'

批量更新模型访问配置

PUT/organizations/teams/model-access/configuration

为多个关联团队创建或更新配置,或将其恢复为不受限状态。每个请求最多可包含 100 个 teamIds。

HTTP 200 表示该批次已处理完毕,并不代表每一项都成功。请检查 errorCount 和每个 results[].status。成功的团队会保留新配置。此操作对每个团队均具备幂等性,因此仅重试失败的 teamId。4xx 或 5xx 响应会拒绝整个请求且不应用任何更改。

请求体

teamIds number[] 必填

要更新的关联团队 ID。每个请求最多 100 个。

state string

可选。使用 unrestricted 清除各团队的策略。发送默认值时省略此项。

newProviderDefault string

enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时省略。

newModelDefault string

enabled 或 disabled。创建或更新自定义策略时必填;当 state 为 unrestricted 时省略。

为多个团队设置自定义策略的默认值:

curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "teamIds": [7, 8, 9],    "newProviderDefault": "disabled",    "newModelDefault": "enabled"  }'

将多个团队恢复为不受限状态:

curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "teamIds": [7, 8, 9],    "state": "unrestricted"  }'

响应:

{  "results": [    { "teamId": 7, "status": "success" },    { "teamId": 8, "status": "success" },    {      "teamId": 9,      "status": "error",      "errorMessage": "Team is not linked to this organization"    }  ],  "successCount": 2,  "errorCount": 1}

获取团队模型访问提供商

GET/organizations/teams/:teamId/model-access/providers

列出一个关联团队的提供商和模型,包括各模型的 parameters (结构与团队提供商路由相同) 。如果团队没有自定义策略,则返回 409。

参数

teamId number 必填

关联到组织的团队整数 ID。
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/providers \  -u YOUR_ORGANIZATION_API_KEY:

更新团队模型访问提供商

PUT/organizations/teams/:teamId/model-access/providers/:provider

为一个关联团队启用或禁用提供商。如果团队没有自定义策略,则返回 409。

参数

teamId number 必填

关联到组织的团队整数 ID。

provider string 必填

目录中的提供商 ID (例如 openai) 。

请求体

enabled boolean 必填

curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/openai \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{"enabled": false}'

更新团队模型访问模型

PUT/organizations/teams/:teamId/model-access/providers/:provider/models/:model

为一个关联团队启用或禁用模型,并可选择设置每个模型的 parameters (请求体与团队模型路由相同) 。当团队没有自定义策略时,返回 409。

参数

teamId number 必填

关联到组织的团队整数 ID。

provider string 必填

目录中的提供商 ID (例如 anthropic) 。

model string 必填

目录中的模型 ID (例如 claude-opus-4-6) 。

请求体

enabled boolean 必填

parameters object

参数 ID 到 { allowedValues, defaultValue } 的可选映射。省略的字段保持不变。allowedValues: null 会清除限制。defaultValue: null 会恢复目录默认值。请参阅团队更新模型访问模型文档。

在一个关联团队中禁用 Fast:

curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/anthropic/models/claude-opus-4-6 \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "enabled": true,    "parameters": {      "fast": { "allowedValues": ["false"] }    }  }'

设置默认推理 effort:

curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/openai/models/gpt-5.4 \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "enabled": true,    "parameters": {      "reasoning": {        "allowedValues": ["low", "medium", "high"],        "defaultValue": "high"      }    }  }'

批量更新模型访问提供商

PUT/organizations/teams/model-access/providers/:provider

在多个关联团队中启用或禁用提供商。每个请求最多可包含 100 个 teamIds。

HTTP 200 表示批处理已完成,并不代表每一行都成功。请检查 errorCount 和每个 results[].status。成功的行不会回滚。该操作对每个团队都是幂等的,因此仅重试失败的 teamId。4xx 或 5xx 响应会拒绝整个请求,且不会应用任何更改。

参数

provider string 必填

目录中的提供商 ID (例如 openai) 。

请求体

enabled boolean 必填

teamIds number[] 必填

要更新的关联团队 ID。每个请求最多 100 个。
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "teamIds": [7, 8, 9],    "enabled": false  }'

响应:

{  "results": [    { "teamId": 7, "status": "success" },    { "teamId": 8, "status": "success" },    {      "teamId": 9,      "status": "error",      "errorMessage": "团队没有模型访问策略。请使用 PUT /teams/model-access/configuration 创建一个,或在团队设置 → 模型中启用模型访问。"    }  ],  "successCount": 2,  "errorCount": 1}

在此示例中,HTTP 状态仍为 200,因为批处理已完成。团队 7 和 8 的提供商仍处于禁用状态;仅在创建团队 9 的配置后重试该团队。

批量更新模型访问配置中的模型

PUT/organizations/teams/model-access/providers/:provider/models/:model

为多个关联团队启用或禁用模型,也可选择使用与单团队模型 PUT 相同的 parameters 映射。每个请求最多可包含 100 个 teamIds。

HTTP 200 表示批处理已完成,并不表示每一行都成功。请检查 errorCount 和每个 results[].status。成功的行不会回滚。该操作对每个团队都是幂等的,因此仅重试失败的 teamId。4xx 或 5xx 响应会拒绝整个请求,且不会应用任何更改。

参数

provider string 必填

目录中的提供商 ID (例如 anthropic) 。

model string 必填

目录中的模型 ID (例如 claude-opus-4-6) 。

请求体

enabled boolean 必填

teamIds number[] 必填

要更新的关联团队 ID。每个请求最多 100 个。

parameters object

可选。与单团队模型 PUT 使用相同的映射。allowedValues: null 会清除限制。defaultValue: null 会恢复目录默认值。

在关联团队中禁用 Fast:

curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/anthropic/models/claude-opus-4-6 \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "teamIds": [7, 8, 9],    "enabled": true,    "parameters": {      "fast": { "allowedValues": ["false"] }    }  }'

将关联团队的默认推理强度固定为:

curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai/models/gpt-5.4 \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "teamIds": [7, 8, 9],    "enabled": true,    "parameters": {      "reasoning": {        "allowedValues": ["low", "medium", "high"],        "defaultValue": "high"      }    }  }'

响应:

{  "results": [    { "teamId": 7, "status": "success" },    { "teamId": 8, "status": "success" },    {      "teamId": 9,      "status": "error",      "errorMessage": "团队未配置模型访问策略。请使用 PUT /teams/model-access/configuration 创建配置,或在团队设置 → 模型中启用模型访问。"    }  ],  "successCount": 2,  "errorCount": 1}

错误

错误响应体格式如下:

{ "code": "error", "message": "…" }
状态情况
401Key 无效,或缺少 models:read / models:* (或 admin:*) 权限
403该团队不支持模型访问控制 (单团队路由)
404该团队未关联到组织 (单团队路由)
409该团队的 state 为 unrestricted 或 legacy 时读取提供商或模型,或对单个团队执行写入操作
400提供商、模型、参数 ID 或参数值未知;响应体无效;allowedValues 为空;默认值不在 allowedValues 内;设置无法解析为有效的模型变体;或会阻止 Smart Auto 所需模型

批量组织路由 (带 teamIds 的 PUT .../providers/:provider、PUT .../providers/:provider/models/:model 和 PUT .../configuration) 会在批处理完成后返回 HTTP 200,即使某些行失败也是如此。errorCount 非零仍表示 HTTP 响应成功。未关联的团队以及缺少配置等公开错误会显示为 status: "error" 行。成功的行不会回滚。每个团队的操作都是幂等的,因此仅重试失败的 teamId。任何 4xx 或 5xx 响应均表示整个请求被拒绝,且未应用任何更改。当关联团队无法加载配置时,列表路由也会返回 HTTP 200 和一个包含 errorMessage 的行。

组织群组

组织群组可将关联到同一组织的多个团队成员统一组织起来。有关仪表盘设置和群组级控制,请参阅组织群组。团队目录组使用 Team Admin API 的 /teams/directory-groups 以及 team_group_… 形式的 id。这些路由不接受组织群组的 id (g_) 或 publicId (grp_) 值。

群组路由共用以下错误响应:

状态场景
400群组 ID、分页值或请求体格式有误
401API 密钥无效,或密钥缺少 members:* (或 admin:*) 权限范围
404该组织中不存在此群组
429超出速率限制。响应中包含 Retry-After: 60 请求头

列出组织群组

GET/organizations/groups

获取与你的 API 密钥关联的组织下的组织群组。传入 name 可按确切名称查找某一个群组。

查询参数

page number

页码。默认为 1。

pageSize number

每页的群组数量。默认为 50。上限为 200;超过 200 的值会被截断为 200。

name string

某个群组的确切名称,需经 URL 编码 (例如 Platform%20Engineering) 。群组名称在组织内唯一,因此响应为常规的列表负载,其中包含一个群组或没有群组。名称无匹配时返回 200 及空的 groups 数组,而不是 404。省略 name 或传入空值即可列出所有群组。

响应字段

groups 中的每个对象包含:

  • id string - 带有 g_ 前缀的组织群组 ID
  • publicId string - 带有 grp_ 前缀的公开群组 ID
  • name string - 群组名称
  • memberCount number - 群组中的成员数量
  • monthlySpendingLimitDollars number | null - 每位群组成员的支出限额 (以整美元计) 。null 表示该群组没有限额。
  • createdAt string - ISO 8601 格式的创建时间
  • updatedAt string - ISO 8601 格式的最后更新时间

pagination object

分页元数据:page、pageSize、totalCount、totalPages、hasNextPage 和 hasPreviousPage。
curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \  -u YOUR_ORGANIZATION_API_KEY:

按名称查找单个群组:

curl -X GET "https://api.cursor.com/organizations/groups?name=Engineering" \  -u YOUR_ORGANIZATION_API_KEY:

响应:

{  "groups": [    {      "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",      "publicId": "grp_01k2ja2000e0080000000000n2",      "name": "Engineering",      "memberCount": 12,      "monthlySpendingLimitDollars": 500,      "createdAt": "2026-01-15T10:30:00.000Z",      "updatedAt": "2026-01-20T14:22:00.000Z"    },    {      "id": "g_kljUvI0ASZORvSEXf9hV0ydcso",      "publicId": "grp_01k2jb4000e0080000000000p7",      "name": "Design",      "memberCount": 8,      "monthlySpendingLimitDollars": null,      "createdAt": "2026-01-16T09:00:00.000Z",      "updatedAt": "2026-01-16T09:00:00.000Z"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 2,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

响应 (按名称查找) :

{  "groups": [    {      "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",      "publicId": "grp_01k2ja2000e0080000000000n2",      "name": "Engineering",      "memberCount": 12,      "monthlySpendingLimitDollars": 500,      "createdAt": "2026-01-15T10:30:00.000Z",      "updatedAt": "2026-01-20T14:22:00.000Z"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 1,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

获取组织群组

GET/organizations/groups/:groupId

获取单个组织群组。

参数

groupId string 必填

带有 g_ 前缀的组织群组 ID。

响应字段

group 对象包含 id、publicId、name、memberCount、monthlySpendingLimitDollars、createdAt 和 updatedAt。这些字段与 列出组织群组 的响应一致。

curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY:

响应:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Engineering",    "memberCount": 12,    "monthlySpendingLimitDollars": 500,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-20T14:22:00.000Z"  }}

创建组织群组

POST/organizations/groups

创建成员由手动管理的组织群组。如需创建 SCIM 同步的群组,请改为在 仪表盘 中从你的身份提供商同步。

请求体

name string 必填

群组名称。在组织的活跃群组中必须唯一。Cherri Code 会移除首尾空白字符。

响应字段

返回 201 Created 以及新建的 group 对象。该对象包含 id、publicId、name、memberCount、monthlySpendingLimitDollars、createdAt 和 updatedAt。

错误

  • 400 - 群组名称缺失、为空,或已被另一个活跃群组使用。
curl -X POST https://api.cursor.com/organizations/groups \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "name": "Engineering"  }'

响应:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Engineering",    "memberCount": 0,    "monthlySpendingLimitDollars": null,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-15T10:30:00.000Z"  }}

更新组织群组

PATCH/organizations/groups/:groupId

更新群组的名称或支出限额。支持部分更新:至少需提供一个字段,未提供的字段保持原值不变。

参数

groupId string 必填

带 g_ 前缀的组织群组 ID。

请求体

name string

新的群组名称。在组织的活跃群组中必须唯一。Cherri Code 会移除首尾空白字符。

monthlySpendingLimitDollars number

每位群组成员的支出限额,以整数美元计,取值范围为 0 到 2147483647。

clearMonthlySpendingLimitDollars boolean

设为 true 可移除群组支出限额。请勿在同一请求中同时包含 monthlySpendingLimitDollars。

响应字段

返回更新后的 group 对象,包含 id、publicId、name、memberCount、monthlySpendingLimitDollars、createdAt 和 updatedAt。

错误

  • 400 - 请求未包含任何更新字段、包含无效值、使用了另一个活跃群组的名称,或在同一请求中同时设置和清除支出限额。
curl -X PATCH https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "name": "Platform Engineering",    "monthlySpendingLimitDollars": 500  }'

响应:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Platform Engineering",    "memberCount": 12,    "monthlySpendingLimitDollars": 500,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-20T14:22:00.000Z"  }}

删除组织群组

DELETE/organizations/groups/:groupId

删除一个组织群组。该群组必须为空:删除前请先移除所有成员。

参数

groupId string 必填

带 g_ 前缀的组织群组 ID。

响应

删除群组后返回 204 No Content。

错误

  • 400 - 该群组仍有成员,或该群组存在启用中的 SCIM 映射。
curl -X DELETE https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY:

响应: 204 No Content

列出组织群组成员

GET/organizations/groups/:groupId/members

获取组织群组中的成员。

参数

groupId string 必填

带有 g_ 前缀的组织群组 ID。

查询参数

page number

页码。默认值为 1。

pageSize number

每页的成员数。默认值为 50。上限为 200;超过 200 的值会被截断为 200。

响应字段

members 中的每个对象包含:

  • userId string - 带有 user_ 前缀的公开用户 ID
  • name string - 成员的显示名称
  • email string - 成员的电子邮件地址
  • joinedAt string - 成员被添加到群组的时间,采用 ISO 8601 格式

pagination object

分页元数据:page、pageSize、totalCount、totalPages、hasNextPage 和 hasPreviousPage。
curl -X GET "https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members?page=1&pageSize=50" \  -u YOUR_ORGANIZATION_API_KEY:

响应:

{  "members": [    {      "userId": "user_abc123",      "name": "Alex Developer",      "email": "[email protected]",      "joinedAt": "2026-01-15T10:30:00.000Z"    },    {      "userId": "user_def456",      "name": "Sam Engineer",      "email": "[email protected]",      "joinedAt": "2026-01-16T09:15:00.000Z"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 2,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

添加组织群组成员

POST/organizations/groups/:groupId/members/bulk-add

向手动管理的组织群组中添加成员。

参数

groupId string 必填

带 g_ 前缀的组织群组 ID。

请求体

userIds string[] 必填

带 user_ 前缀的公开用户 ID 数组。单次请求最多可包含 100 个用户。

响应字段

addedCount number

本次请求新建的成员关系数量。Cherri Code 会忽略组织外的用户以及已在该群组中的用户,这些用户不计入此总数。
curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-add \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "userIds": ["user_abc123", "user_def456"]  }'

响应:

{  "addedCount": 2}

移除组织群组成员

POST/organizations/groups/:groupId/members/bulk-remove

从手动管理的组织群组中移除成员。

参数

groupId string 必填

带 g_ 前缀的组织群组 ID。

请求体

userIds string[] 必填

带 user_ 前缀的公开用户 ID 数组。单次请求最多可包含 100 个用户。

响应字段

removedCount number

本次请求移除的成员关系数量。Cherri Code 会忽略不在该群组中的用户,这些用户不计入此总数。
curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-remove \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "userIds": ["user_def456"]  }'

响应:

{  "removedCount": 1}