Cloud Agents API
Cloud Agents API v1 目前处于公开测试阶段。API 可能会在正式发布前发生变化。
Cloud Agents API 可让你以编程方式启动和管理处理你的仓库的云端代理。
- Cloud Agents API 同时接受 Basic 和 Bearer 身份验证。在 Cursor Dashboard → API Keys 中生成用户 API 密钥,或使用 服务账户 API 密钥。
- 有关身份验证方法、速率限制和最佳实践的详细信息,请参阅 API 概览。
- 查看完整的 OpenAPI 规范,了解详细的架构和示例。
- Webhooks 即将推出。旧版 v0 API 仍支持该功能——请参阅 Webhooks。
此 API 将工作拆分为持久化智能体和按提示词划分的各次运行,取代了更扁平的 v0 接口。旧版 v0 参考 仍可用。
端点
创建代理
/v1/agents创建一个云端代理并立即将其初始运行加入队列。响应同时返回持久化的 agent 和初始 run。
请求体
prompt 对象 (必填)
prompt.text string (必填)
prompt.images 数组 (可选)
data (base64 编码的字节,且必须包含 mimeType) 或 url (Cursor 可获取的 http 或 https URL) 之一。最多 5 张图像,每张不超过 15 MB。支持的 MIME 类型:image/png、image/jpeg、image/gif、image/webp。model 对象 (可选)
model.id string (若提供 model 则必填)
GET /v1/models 返回的明确模型 ID (例如 claude-4-sonnet-thinking) 。model.params 数组 (可选)
id 和 value。仅使用所选模型支持的参数 —— 调用 GET /v1/models 可查询有效的 id/params 组合。name 字符串 (可选)
env 对象 (可选)
cloud 环境,或路由到您自行托管的 pool 或 machine。在选择命名的 Cursor 托管环境时,不可与显式指定的 repos 一起使用。env.type 字符串 (如果提供 env 则必填)
cloud 使用 Cursor 托管的虚拟机;pool 和 machine 路由到您自己的 worker。env.name 字符串 (可选)
env.type: "pool",此处为用量池名称 (省略时默认为 default) 。未知的用量池名称会返回 400,而不会一直排队等待。repos 数组 (可选)
repos[0].url 字符串 (必填)
https://github.com/your-org/your-repo) 。每个仓库条目均为必填项,包��在提供 prUrl 时。repos[0].startingRef 字符串 (可选)
prUrl 时会被忽略。repos[0].prUrl 字符串 (可选)
startingRef 将被忽略。同一 repos 条目中仍须设置 url。workOnCurrentBranch 布尔值 (可选,默认:false)
false (默认) 时,Cursor 会将提交推送到基于 repos[0].startingRef 自动生成的新分支 (cursor/...) (如果设置了 prUrl,则基于 PR 的基准引用) 。当值为 true 时,Cursor 会直接推送到该起始引用——对于非 PR 创建,即您在 startingRef 中传入的分支;对于使用 prUrl 创建,即该 PR 的 head 分支。代理推送的分支会显示在代理的 git.branches[] 中。autoCreatePR 布尔值 (可选)
skipReviewerRequest 布尔值 (可选)
autoCreatePR 为 true 时适用。envVars 对象 (可选)
CURSOR_ 开头) ,值最长 4096 字节。不能与客户端提供的 agentId 一起使用。envVars 正在逐步推出。如果您的账户尚未启用该功能,创建时会静默忽略该字段而不会导致请求失败——在生产环境中依赖它之前,请在代理首次运行时通过检查代理的 shell 验证这些值是否存在。mcpServers 数组 (可选)
headers 或 OAuth auth;stdio 服务器在云端 VM 内运行,可接收 env。服务器名称必须唯一。mcpServers[0].name string (必填)
mcpServers[0].type string (可选)
http、sse 或 stdio。对于带有 url 的远程服务器,默认为 http;对于带有 command 的服务器,默认为 stdio。mcpServers[0].url string (远程 MCP 必填)
mcpServers[0].command 字符串 (stdio MCP 必填)
args 和 env 传入参数和运行时机密。customSubagents 数组 (可选)
name、description 和 prompt,可选包含 model (模型 ID 字符串、ModelSelection 对象或 "inherit") 。名称必须唯一,且不能与内置名称冲突 (如 explore、debug、shell、computerUse 等) 。mode 字符串 (可选,默认值:agent)
agentId string (可选)
bc-<uuid>。适用于幂等创建流程——对相同的 agentId 重复发送 POST 请求将返回 409 agent_id_conflict,而不会创建重复项。不能与 envVars 一起使用;如果需要会话密钥,请省略 agentId,让服务器生成一个。curl --request POST \ --url https://api.cursor.com/v1/agents \ -u YOUR_API_KEY: \ --header 'Content-Type: application/json' \ --data '{ "prompt": { "text": "Add a README with setup instructions" }, "model": { "id": "composer-2", "params": [ { "id": "fast", "value": "true" } ] }, "repos": [ { "url": "https://github.com/your-org/your-repo", "startingRef": "main" } ], "mcpServers": [ { "name": "linear", "type": "http", "url": "https://mcp.linear.app/sse", "headers": { "Authorization": "Bearer YOUR_LINEAR_API_KEY" } }, { "name": "github", "type": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "YOUR_GITHUB_TOKEN" } } ], "autoCreatePR": true }'自托管用量池 (包括无仓库模式) :
curl --request POST \ --url https://api.cursor.com/v1/agents \ -u YOUR_API_KEY: \ --header 'Content-Type: application/json' \ --data '{ "prompt": { "text": "Clone the payments service and add a health check" }, "env": { "type": "pool", "name": "sandbox" } }'响应:
{ "agent": { "id": "bc-00000000-0000-0000-0000-000000000001", "name": "Add README with setup instructions", "status": "ACTIVE", "env": { "type": "cloud" }, "repos": [ { "url": "https://github.com/your-org/your-repo", "startingRef": "main" } ], "workOnCurrentBranch": false, "autoCreatePR": true, "url": "https://cursor.com/agents/bc-00000000-0000-0000-0000-000000000001", "createdAt": "2026-04-13T18:30:00.000Z", "updatedAt": "2026-04-13T18:30:00.000Z", "latestRunId": "run-00000000-0000-0000-0000-000000000001" }, "run": { "id": "run-00000000-0000-0000-0000-000000000001", "agentId": "bc-00000000-0000-0000-0000-000000000001", "status": "CREATING", "createdAt": "2026-04-13T18:30:00.000Z", "updatedAt": "2026-04-13T18:30:00.000Z" }}列出agents
/v1/agents列出已认证用户的agents,按最新优先排序。
查询参数
limit number (可选)
cursor string (可选)
nextCursor 返回的分页游标。prUrl string (可选)
includeArchived boolean (可选,默认值:true)
列表项仅包含持久标识字段。调用 GET /v1/agents/{id} 获取完整记录 (repos、workOnCurrentBranch、autoCreatePR 等) 。
当没有更多页面时,响应中会省略 nextCursor——不会将其作为 null 返回。请将其缺失视为“没有更多结果”。
curl --request GET \ --url 'https://api.cursor.com/v1/agents?limit=20' \ -u YOUR_API_KEY:响应:
{ "items": [ { "id": "bc-00000000-0000-0000-0000-000000000001", "name": "Add README with setup instructions", "status": "ACTIVE", "env": { "type": "cloud" }, "url": "https://cursor.com/agents/bc-00000000-0000-0000-0000-000000000001", "createdAt": "2026-04-13T18:30:00.000Z", "updatedAt": "2026-04-13T18:45:00.000Z", "latestRunId": "run-00000000-0000-0000-0000-000000000001" } ], "nextCursor": "bc-00000000-0000-0000-0000-000000000002"}获取智能体
/v1/agents/{id}获取智能体的持久元数据。执行状态存储在运行中——获取 latestRunId,然后调用获取某次运行以读取运行状态。
路径参数
id string
bc-00000000-0000-0000-0000-000000000001) 。响应字段
status string
curl --request GET \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001 \ -u YOUR_API_KEY:响应:
{ "id": "bc-00000000-0000-0000-0000-000000000001", "name": "添加包含设置说明的 README", "status": "ACTIVE", "env": { "type": "cloud" }, "repos": [ { "url": "https://github.com/your-org/your-repo", "startingRef": "main" } ], "workOnCurrentBranch": false, "autoCreatePR": true, "url": "https://cursor.com/agents/bc-00000000-0000-0000-0000-000000000001", "createdAt": "2026-04-13T18:30:00.000Z", "updatedAt": "2026-04-13T18:30:00.000Z", "latestRunId": "run-00000000-0000-0000-0000-000000000001"}创建运行
/v1/agents/{id}/runs向现有的活动智能体发送后续提示词。新运行会沿用该智能体当前的对话和工作区状态。
每个智能体同一时间只能有一个活动运行。如果在另一个运行处于 CREATING 或 RUNNING 状态时调用此接口,会返回 409 agent_busy。请等待现有运行结束,或将其取消。
路径参数
id string
bc-00000000-0000-0000-0000-000000000001) 。请求体
prompt object (必填)
prompt.text string (必填)
prompt.images array (可选)
data (base64 编码的字节,且必须提供 mimeType) 或 url。最多 5 张图像,每张最大 15 MB。支持的 MIME 类型:image/png、image/jpeg、image/gif、image/webp。mcpServers array (可选)
mode string (可选)
agent 或 plan。省略则保留对话在先前运行中的当前模式。curl --request POST \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs \ -u YOUR_API_KEY: \ --header 'Content-Type: application/json' \ --data '{ "prompt": { "text": "Also add troubleshooting steps" }, "mcpServers": [ { "name": "docs", "type": "http", "url": "https://example.com/mcp" } ] }'响应:
{ "run": { "id": "run-00000000-0000-0000-0000-000000000002", "agentId": "bc-00000000-0000-0000-0000-000000000001", "status": "CREATING", "createdAt": "2026-04-13T18:50:00.000Z", "updatedAt": "2026-04-13T18:50:00.000Z" }}列出运行
/v1/agents/{id}/runs列出某个智能体的运行,按最新优先排序。
路径参数
id string
查询参数
limit number (optional)
cursor string (optional)
nextCursor 返回的分页游标。curl --request GET \ --url 'https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs?limit=20' \ -u YOUR_API_KEY:响应:
{ "items": [ { "id": "run-00000000-0000-0000-0000-000000000002", "agentId": "bc-00000000-0000-0000-0000-000000000001", "status": "RUNNING", "createdAt": "2026-04-13T18:50:00.000Z", "updatedAt": "2026-04-13T18:51:00.000Z", "git": { "branches": [ { "repoUrl": "github.com/your-org/your-repo", "branch": "cursor/add-readme-a1b2" } ] } } ]}获取某次运行
/v1/agents/{id}/runs/{runId}获取特定运行的状态、时间戳,以及 (对于已结束的运行) 最终结果、持续时间和已推送的分支。
路径参数
id string
runId string
run-00000000-0000-0000-0000-000000000001) 。响应字段
基础运行字段 (id、agentId、status、createdAt、updatedAt) 始终存在。以下字段会在数据可用后立即填充:
durationMs integer (terminal runs)
FINISHED、ERROR、CANCELLED 或 EXPIRED 后计算得出。result string (terminal runs)
git object (when a branch has been pushed)
git.branches[] 包含 { repoUrl, branch?, prUrl? } 条目——每个条目对应智能体已推送的一个分支 (堆叠式智能体会生成多个) 。git 快照。使用智能体的 latestRunId 或 SSE 流将工作归因到特定运行。repoUrl 返回时不包含 scheme (例如 github.com/your-org/your-repo) ——这与请求中的 repos[].url 不同,后者会保留 https:// 前缀。curl --request GET \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs/run-00000000-0000-0000-0000-000000000001 \ -u YOUR_API_KEY:响应:
{ "id": "run-00000000-0000-0000-0000-000000000001", "agentId": "bc-00000000-0000-0000-0000-000000000001", "status": "FINISHED", "createdAt": "2026-04-13T18:30:00.000Z", "updatedAt": "2026-04-13T18:45:00.000Z", "durationMs": 12357, "result": "Added README.md with installation instructions and usage examples.", "git": { "branches": [ { "repoUrl": "github.com/your-org/your-repo", "branch": "cursor/add-readme-a1b2", "prUrl": "https://github.com/your-org/your-repo/pull/123" } ] }}流式传输某次运行
/v1/agents/{id}/runs/{runId}/stream流式传输某次运行的服务器发送事件 (SSE) 。该流仅针对所请求的运行,不会重放之前运行的事件。
事件类型
status— 运行状态更新。负载:{ runId, status }。assistant— 助手文本增量。负载:{ text }。thinking— 思考文本增量。负载:{ text }。tool_call— 工具调用状态更新。负载:{ callId, name, status, args?, result?, truncated? }。interaction_update— 与上述简化事件一同发出的可选增强事件。负载与 TypeScript SDK 使用的InteractionUpdate结构一致,子类型包括text-delta、tool-call-started/tool-call-completed、step-started/step-completed和turn-ended。如果你只需要纯文本和工具调用,请处理这些简化事件并忽略interaction_update。如果你想要完整的 SDK 结构流,请处理interaction_update并忽略这些简化事件。heartbeat— 保活事件。负载:{}。result— 运行终态。负载:{ runId, status, text?, durationMs?, git? }。text是助手的最终回复,durationMs是以毫秒为单位的实际运行时长,git与Run.git保持一致 (是智能体当前已推送的分支,而不只是此次运行的分支) 。error— 流错误。负载:{ code, message }。done— 流结束。负载:{}。
工具调用负载
tool_call 事件会在工具特定输入和输出之外,使用一个稳定的封装层:
type JsonValue = | string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };interface ToolCallEventData { callId: string; name: string; status: "running" | "completed"; args?: JsonValue; result?: JsonValue; truncated?: { args?: true; result?: true; };}callId 用于标识同一次工具调用在多次更新中的记录。name 是公开的工具名称,例如 read_file、run_terminal_cmd 或 mcp。args 和 result 是工具特定的 JSON 值。如果 args 或 result 过大而无法包含在流中,Cursor 会省略对应字段,并设置匹配的 truncated 标记。
恢复流
大多数事件都包含一行 id——一个你不应解析的不透明字符串 (当前格式看起来像 1713033006000-0,但应将其视为不透明值) 。开头的 status 事件没有 id——它是一个粘性框架事件,会在每次重新连接时再次发送到最前面。
要在断开连接后恢复,请在重新连接时将 Last-Event-ID 设为最近收到的事件 id。该事件 id 必须属于所请求的运行;否则请求会返回 400 invalid_last_event_id。成功恢复后,在恢复区间开始前,预计会先收到另一个 status 事件。
保留期
流响应包含 X-Cursor-Stream-Retention-Seconds 响应头。保留窗口过后,此端点可能返回 410 stream_expired。这表示你应改为通过 获取某次运行 读取终态,而不是重试该流。
curl --request GET \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs/run-00000000-0000-0000-0000-000000000001/stream \ -u YOUR_API_KEY: \ --header 'Accept: text/event-stream'示例流:
event: statusdata: {"runId":"run-00000000-0000-0000-0000-000000000001","status":"RUNNING"}id: 1713033000000-0event: assistantdata: {"text":"I'll update the README now."}id: 1713033005000-0event: tool_calldata: {"callId":"call-1","name":"read_file","status":"running","args":{"path":"README.md"}}id: 1713033006000-0event: tool_calldata: {"callId":"call-1","name":"read_file","status":"completed","args":{"path":"README.md"},"result":{"success":{"content":"# Project","totalLines":1,"fileSize":9,"path":"README.md"}}}id: 1713033010000-0event: resultdata: {"runId":"run-00000000-0000-0000-0000-000000000001","status":"FINISHED","text":"Added README.md with installation instructions.","durationMs":12357,"git":{"branches":[{"repoUrl":"github.com/your-org/your-repo","branch":"cursor/add-readme-a1b2"}]}}id: 1713033010000-0event: donedata: {}取消运行
/v1/agents/{id}/runs/{runId}/cancel取消某个智能体当前正在进行的运行。取消后即为最终状态——该运行会变为 CANCELLED,且无法恢复。若要继续对话,请在同一个智能体上创建新的运行。
如果取消的运行已处于最终状态,或从未处于活动状态,则会返回 409 run_not_cancellable。
路径参数
id string
runId string
curl --request POST \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs/run-00000000-0000-0000-0000-000000000001/cancel \ -u YOUR_API_KEY:响应:
{ "id": "run-00000000-0000-0000-0000-000000000001"}获取智能体用量
/v1/agents/{id}/usage获取某个智能体的 token 用量,并按每次运行分别统计。响应会汇总该智能体上所有运行的用量,并列出每次运行各自的用量。Token 用量与团队 usage events 接口报告的 tokenUsage 一致。
Path Parameters
id string
bc-00000000-0000-0000-0000-000000000001) 。Query Parameters
runId string (optional)
run-00000000-0000-0000-0000-000000000001) 。省略时,将返回该智能体上所有运行的用量。未知的 runId 会返回 404 run_not_found。Response Fields
totalUsage object
usage object 相同的字段。runs array
runId 时则只有一条) 。每个 object ���含:idstring - 运行标识符 (例如run-00000000-0000-0000-0000-000000000001) 。usageUuidstring (optional) - 该次运行的内部用量标识符。如果该次运行尚未记录任何用量,则会省略。usageobject - 此次运行的 token 用量:inputTokensnumber - 消耗的输入 tokens。outputTokensnumber - 生成的输出 tokens。cacheWriteTokensnumber - 写入缓存的 tokens。cacheReadTokensnumber - 从缓存读取的 tokens。totalTokensnumber - 上述四项 token 计数之和。
没有任何已记录 token 用量的运行,会在所有字段中返回 0。尚未产生用量的运行仍会显示在 runs 中,以便你持续跟踪。
# 智能体的所有运行记录curl --request GET \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/usage \ -u YOUR_API_KEY:# 单次运行curl --request GET \ --url 'https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/usage?runId=run-00000000-0000-0000-0000-000000000001' \ -u YOUR_API_KEY:响应:
{ "totalUsage": { "inputTokens": 12480, "outputTokens": 3110, "cacheWriteTokens": 18200, "cacheReadTokens": 42600, "totalTokens": 76390 }, "runs": [ { "id": "run-00000000-0000-0000-0000-000000000002", "usageUuid": "00000000-0000-0000-0000-000000000002", "usage": { "inputTokens": 6320, "outputTokens": 1450, "cacheWriteTokens": 7100, "cacheReadTokens": 21300, "totalTokens": 36170 } }, { "id": "run-00000000-0000-0000-0000-000000000001", "usageUuid": "00000000-0000-0000-0000-000000000001", "usage": { "inputTokens": 6160, "outputTokens": 1660, "cacheWriteTokens": 11100, "cacheReadTokens": 21300, "totalTokens": 40220 } } ]}产物
产物归属于特定智能体,因为工作区会在多次运行之间持续保留。
列出产物
/v1/agents/{id}/artifacts列出智能体生成的产物。每个产物的 path 都是相对于工作区 artifacts/ 目录的路径。
将此处返回的 path 值直接传给 下载产物。v1 路径是相对路径;不接受 v0 的绝对路径 (/opt/cursor/artifacts/...) 。
路径参数
id string
curl --request GET \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/artifacts \ -u YOUR_API_KEY:响应:
{ "items": [ { "path": "artifacts/screenshot.png", "sizeBytes": 12345, "updatedAt": "2026-04-13T18:45:00.000Z" } ]}下载产物
/v1/agents/{id}/artifacts/download获取某个特定产物的临时预签名 S3 URL,有效期为 15 分钟。
路径参数
id string
查询参数
path string
curl --request GET \ --url 'https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/artifacts/download?path=artifacts/screenshot.png' \ -u YOUR_API_KEY:响应:
{ "url": "https://cloud-agent-artifacts.s3.us-east-1.amazonaws.com/...", "expiresAt": "2026-04-13T19:00:00.000Z"}智能体生命周期
归档智能体
/v1/agents/{id}/archive归档智能体。已归档的智能体仍可读取,但在取消归档前无法接受新的运行。适用于可撤销的“软删除”流程。
归档操作是幂等的——对已归档的智能体再次归档会返回 200,且不会有任何变化。调用前无需检查当前状态。
路径参数
id string
curl --request POST \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/archive \ -u YOUR_API_KEY:响应:
{ "id": "bc-00000000-0000-0000-0000-000000000001"}取消归档智能体
/v1/agents/{id}/unarchive取消归档智能体,使其能够再次接受新的运行。
取消归档操作是幂等的——对已处于活动状态的智能体调用该操作会返回 200,且不会有任何变化。
路径参数
id string
curl --request POST \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/unarchive \ -u YOUR_API_KEY:响应:
{ "id": "bc-00000000-0000-0000-0000-000000000001"}curl --request DELETE \ --url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001 \ -u YOUR_API_KEY:响应:
{ "id": "bc-00000000-0000-0000-0000-000000000001"}Worker Token
创建用户级 Worker Token
/v1/sub-tokens为 Worker 创建一个有效期为 1 小时的用户级 token,使其能够以活跃团队成员身份运行。
需要提供一个智能体作用域的团队服务账户 API 密钥。用户级 token 不能用于签发其他用户级 token。
返回的 token 会在 1 小时后过期,且无法自行刷新。需要为正在运行的 Worker 刷新时,请使用服务账户 API 密钥重新签发一个新 token。
请求体
请准确指定以下其中一项来标识目标用户:
forUserEmail string (可选)
forUserId integer (可选)
按电子邮件:
curl --request POST \ --url https://api.cursor.com/v1/sub-tokens \ --header "Authorization: Bearer $CURSOR_SERVICE_ACCOUNT_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "forUserEmail": "alice@company.com" }'按用户 ID:
curl --request POST \ --url https://api.cursor.com/v1/sub-tokens \ --header "Authorization: Bearer $CURSOR_SERVICE_ACCOUNT_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "forUserId": 42 }'响应:
{ "accessToken": "eyJ...", "expiresAt": "2026-04-24T19:00:00.000Z", "userId": 42, "teamId": 456}worker 和用量池
监控 worker 利用率,并为您的用量池实现自动伸缩。持久用量池会在最后一个 worker 断开连接后保持注册,因此您可以缩减至零,并在出现待处理请求时恢复容量。
端点路径沿用较早的 private-workers 名称;它们指的是同一批worker。
使用该用量池的服务账户 API 密钥,通过 Basic 认证或 Bearer token 进行认证。其他类型的 API 密钥将被拒绝。
列出 worker
/v0/private-workers列出已认证服务账户所属团队的用量池 worker,按连接时间倒序排列。
查询参数
status string (可选,默认值:all)
all、in_use 或 idle。scope string (可选,默认值:all)
all、team_pool 或 personal。limit integer (可选,默认值:50)
pageToken string (可选)
nextPageToken。响应字段
workers array
workerIdstring — 唯一的 worker 标识符。自动生成的 ID 为 UUID;使用CURSOR_AGENT_WORKER_ID启动的 worker 则报告该自定义 ID。isInUseboolean — worker 当前是否已分配智能体。repoOwner,repoNamestring — worker 注册 git remote 时的主代码仓库元数据。任意仓库 worker 的值为空字符串。repoUrlstring (可选) — 主代码仓库 URL。任意仓库 worker 不返回该字段。workspaceRootPathstring — worker 上的主工作区路径。connectedAtMsinteger — 以 Unix 毫秒表示的连接时间。userIdinteger — 所属用户 ID。使用服务账户密钥认证的 worker 为0。teamIdinteger (可选) — 团队用量池 worker 的团队 ID。serviceAccountIdstring (可选) — 对该 worker 进行认证的服务账户。activeBcIdstring (可选) — 使用中时,当前在 worker 上运行的智能体 ID。namestring (可选) — worker 显示名称 (--name,默认值为机器主机名) 。
totalCount integer
nextPageToken string (可选)
pageToken 的分页游标。没有更多页面时不返回。curl --request GET \ --url "https://api.cursor.com/v0/private-workers?status=idle&scope=team_pool&limit=50" \ -u "$CURSOR_API_KEY:"响应:
{ "workers": [ { "workerId": "a8574fe8-248e-424a-a078-7584a2b93724", "repoOwner": "acme", "repoName": "payments-service", "repoUrl": "https://github.com/acme/payments-service", "workspaceRootPath": "/home/agent/payments-service", "connectedAtMs": 1737306880000, "userId": 0, "teamId": 456, "serviceAccountId": "sa_abc123", "isInUse": false, "name": "gpu-worker-1" } ], "totalCount": 1}curl --request GET \ --url "https://api.cursor.com/v0/private-workers/summary" \ -u "$CURSOR_API_KEY:"伸缩检查示例:
const summary = await response.json();const team = summary.teamSummary;if (team && team.totalConnected > 0) { const utilization = team.inUse / team.totalConnected; if (utilization >= 0.9) { // 扩容:预配额外的 worker }}按 ID 获取 worker
/v0/private-workers/{id}根据 ID 获取单个用量池 worker。
路径参数
id string
pw_123) 。curl --request GET \ --url "https://api.cursor.com/v0/private-workers/pw_123" \ -u "$CURSOR_API_KEY:"列出用量池
/v0/private-workers/pools列出已认证服务账户所属团队的持久用量池。即使最后一个 worker 断开连接,用量池仍会保持注册状态,因此您可以监控缩容至零的机群,并决定何时预配容量。
查询参数
scope string (可选)
all、team_pool 或 personal。includeStale boolean (可选,默认值:false)
true 时,包含因长期未活动而标记为过期的用量池。响应字段
pools array
scopestring — 用量池的归属范围 (user或team) 。ownerIdinteger — 该范围对应的所属用户或团队 ID。poolNamestring — 用量池名称 (例如default或gpu) 。connectedWorkerCountinteger — 当前连接到此用量池的 worker 数量。inUseWorkerCountinteger — 当前已分配智能体的已连接 worker 数量。空闲容量为connectedWorkerCount - inUseWorkerCount。firstSeenAtMs,lastSeenAtMsinteger — 首次和最后一次发现的时间,以 Unix 毫秒表示。isStaleboolean — 用量池是否因长期未活动而标记为过期。repoOwner,repoName,repoUrlstring (可选) — 用量池关联仓库时的仓库元数据。对于适用于任意仓库的用量池,这些字段会被省略。workerReadyTimeoutSecondsinteger — 已认领请求在认领过期前等待此用量池的离线 worker 重新连接的秒数。0表示离线 worker 的后续请求会立即从用量池重新获取。
curl --request GET \ --url "https://api.cursor.com/v0/private-workers/pools?scope=team_pool&includeStale=false" \ -u "$CURSOR_API_KEY:"响应:
{ "pools": [ { "scope": "team", "ownerId": 456, "poolName": "gpu", "repoOwner": "acme", "repoName": "payments-service", "repoUrl": "https://github.com/acme/payments-service", "connectedWorkerCount": 2, "inUseWorkerCount": 1, "firstSeenAtMs": 1737000000000, "lastSeenAtMs": 1737306880000, "isStale": false, "workerReadyTimeoutSeconds": 900 }, { "scope": "team", "ownerId": 456, "poolName": "sandbox", "connectedWorkerCount": 0, "inUseWorkerCount": 0, "firstSeenAtMs": 1737100000000, "lastSeenAtMs": 1737200000000, "isStale": false, "workerReadyTimeoutSeconds": 0 } ]}sandbox 条目是适用于任意仓库的用量池:仓库字段会被省略,即使没有已连接的 worker,该用量池仍可供选择。
注册用量池
/v0/private-workers/pools注册持久用量池,无需启动 worker。可在任何 worker 连接前让用量池可供选择,例如控制器按需预配容量时。使用 --pool 启动 worker 会自动注册该用量池;仅需预先创建用量池时才需要调用此端点。
请求体
scope string (必填)
user 或 team。poolName string (必填)
gpu) 。repoOwner, repoName string (可选)
repoUrl string (可选)
repoOwner 和 repoName。workerReadyTimeoutSeconds integer (可选,默认值:0)
0 时,离线 worker 的后续请求会立即从用量池重新获取 worker。必须为非负整数。响应字段
registered boolean
curl --request POST \ --url "https://api.cursor.com/v0/private-workers/pools" \ -u "$CURSOR_API_KEY:" \ --header 'Content-Type: application/json' \ --data '{ "scope": "team", "poolName": "payments-pool", "repoOwner": "acme", "repoName": "payments-service", "repoUrl": "https://github.com/acme/payments-service" }'响应:
{ "registered": true}注销用量池
/v0/private-workers/pools注销 (软删除) 持久用量池,使其不再显示在用量池选择器或列出用量池中。当前连接到该用量池的 worker 不受影响。团队用量池需要团队管理员权限;用户用量池需要其所有者权限。
查询参数
scope string (必填)
user 或 team。pool_name string (必填)
repo_owner string (可选)
repo_name string (可选)
repo_owner 和 repo_name;对于适用于任意仓库的用量池,请同时省略两者。curl --request DELETE \ --url "https://api.cursor.com/v0/private-workers/pools?scope=team&pool_name=sandbox" \ -u "$CURSOR_API_KEY:"响应:
{ "deregistered": true}列出待处理用量池请求
/v0/private-workers/pending-requests列出尚未分配给 worker 的用量池请求。当用户正在等待可用的用量池 worker 时,可使用此端点扩展容量;也可在启动临时 worker 前,结合认领待处理请求使用。
对于配置了 workerReadyTimeoutSeconds 的��量池,列表中还会显示已认领但离线的条目:即在重新连接窗口开启期间,所认领的 worker 处于离线状态的请求。这些条目会携带 claimedWorkerId 和 wakeTimeoutMs,以便 controller 能够唤醒该机器。
此端点需要服务账户 API 密钥。它返回该密钥所属团队的请求,不包含我的机器 (My Machines) 请求。如果该密钥的范围限定为特定仓库,请传入 repository;该仓库必须在密钥的允许范围内。
响应包含 streamCursor。将其传递给监视待处理用量池请求,即可在此快照之后实时跟踪队列变化。
查询参数
limit number (可选)
pageToken string (可选)
repository 和 pool 筛选条件绑定。repository 字符串 (可选)
pool 字符串 (可选)
pool 标签进行精确的区分大小写匹配。省略则列出团队中所有用量池的请求。响应字段
requests array
idstring — 待处理请求 / 智能体 ID (作为id传递给认领或释放认领) 。userIdinteger — 创建该请求的 Cursor 用户 ID。userEmailstring (可选) — 发起请求的用户的电子邮件 (如有)。可据此选择与用户关联的容量,无需额外查询。serviceAccountIdstring (可选) — 与该请求关联的服务账户 (如有)。repoOwner,repoName,repoUrlstring (可选) — 请求以仓库为目标时的仓库元数据。任意仓库用量池请求中会省略。labelsarray — 请求标签,以{ key, value }键值对形式表示 (设置后会包含repo=和pool=)。createdAtMsinteger — 请求创建时间,以 Unix 毫秒为单位。claimedWorkerIdstring (可选) — 出现在已认领但离线的条目中:该请求已由此 worker 认领,但该 worker 当前离线。使用此 ID (CURSOR_AGENT_WORKER_ID) 启动 worker,以便在其机器上恢复智能体。wakeTimeoutMsinteger (可选) — 已认领但离线的条目在重新连接窗口内剩余的毫秒数。窗口到期后,认领将失效,该请求会作为未认领条目重新发布。
nextPageToken string (可选)
streamCursor string
streamCursor;完成分页后,从该位置开始监视。它会在生成它的列表返回后五分钟过期。curl --request GET \ --url "https://api.cursor.com/v0/private-workers/pending-requests?limit=50&repository=https%3A%2F%2Fgithub.com%2Facme%2Fpayments-service" \ -u "$CURSOR_API_KEY:"响应:
{ "requests": [ { "id": "bc-00000000-0000-0000-0000-000000000002", "userId": 321, "userEmail": "owner@acme.example", "serviceAccountId": "sa_abc123", "repoOwner": "acme", "repoName": "payments-service", "repoUrl": "https://github.com/acme/payments-service", "labels": [ { "key": "repo", "value": "acme/payments-service" }, { "key": "pool", "value": "gpu" }, { "key": "env", "value": "production" } ], "createdAtMs": 1737306880000 } ], "nextPageToken": "eyJjcmVhdGVkQXRNcyI6MTczNzMwNjg4MDAwMH0=", "streamCursor": "djQuZXhhbXBsZS1vcGFxdWUtY3Vyc29y"}如果原始代码仓库 URL 包含 userinfo,repoUrl 会省略其中的嵌入式凭据。
监控待处理用量池请求
/v0/private-workers/pending-requests/stream通过 Server-Sent Events (SSE) 流式传输待处理请求的生命周期事件,使控制器无需轮询即可响应队列更改。
此端点需要服务账户 API 密钥。控制器采用先列出后监控的方式:调用列出待处理用量池请求构建队列视图,保留响应中的 streamCursor,然后从该确切位置开始监控。列出和监控必须使用相同的 repository 和 pool 筛选条件;游标与生成它的筛选条件绑定。
查询参数
cursor string (必填)
streamCursor,或最后一个已处理事件的 SSE id:。重新连接时,原生 EventSource 会将该 id 作为 Last-Event-ID 标头重新发送,其优先级高于查询参数。repository 字符串 (可选)
pool 字符串 (可选)
pool 标签进行精确且区分大小写的匹配。必须与生成游标的列表所用筛选条件一致。省略此参数可监控团队中的所有用量池。事件
监控会重放游标之后保留的状态转换,然后持续接收实时事件。每个事件的 SSE id: 都是连接中断后恢复时使用的游标。
created事件 — 请求进入队列,包括已被认领但处于离线状态、重连窗口已过且认领已失效的请求。负载:与列出待处理用量池请求相同的请求对象。claimed事件 — worker 已认领该请求,或离线 worker 重新连接后恢复处理其已认领的请求。负载:{ id }。claimed_offline事件 — 已认领该请求的 worker 离线后收到后续消息。负载:与列出待处理用量池请求相同的请求对象,包括claimedWorkerId和wakeTimeoutMs。在窗口到期前唤醒机器,否则认领将过期,并通过新的created事件重新发布该请求。expired事件 — 请求未被认领便离开队列。负载:{ id }。heartbeat事件 — 不含状态变化的游标检查点,在空闲流中约每 20 秒发送一次。负载:{}。心跳会推进空闲监控的恢复位置,但不会延长游标的生命周期。
游标生命周期
监控链中的每个游标都会在生成它的列表请求五分钟后过期。心跳和重新连接都不会延长其生命周期。当游标过期,或保留事件窗口不再覆盖该游标时,端点会返回 HTTP 410 Gone 和 {"code": "cursor_expired"}:重新列出,并从新的 streamCursor 开始监控。这是常规情况,并非错误路径。应按带抖动的五分钟定时器主动重新列出,而不是等到 410,以免一组控制器同时发起列表调用。
投递保证
投递为尽力而为,列表是事实依据。每次状态转换提交后都会发布事件,并进行重试,但极少数故障可能导致事件丢失,且丢失的事件不会重新投递。在两次重新列出之间,应将事件视为低延迟提示:以幂等方式应用它们 (upsert created 和 claimed_offline 请求,按 id 移除 claimed 和 expired 请求) ,并由下一次列表修正任何偏差。对于从未见过的请求,claimed 事件无需执行任何操作。无论本地视图如何,认领操作在服务器端始终保持原子性。
不要持久化游标。一个服务账户最多可保持四个并发流;每个控制器使用一个流,并在本地扇出。
curl --request GET --no-buffer \ --url "https://api.cursor.com/v0/private-workers/pending-requests/stream?cursor=$STREAM_CURSOR" \ --header 'Accept: text/event-stream' \ -u "$CURSOR_API_KEY:"流示例:
: connected
event: heartbeat
id: djQuY3Vyc29yLWNoZWNrcG9pbnQ
data: {}
event: created
id: djQuY3Vyc29yLWFmdGVyLWNyZWF0ZWQ
data: {"id":"bc-00000000-0000-0000-0000-000000000002","userId":321,"userEmail":"owner@acme.example","repoOwner":"acme","repoName":"payments-service","repoUrl":"https://github.com/acme/payments-service","labels":[{"key":"pool","value":"gpu"}],"createdAtMs":1737306880000}
event: claimed
id: djQuY3Vyc29yLWFmdGVyLWNsYWltZWQ
data: {"id":"bc-00000000-0000-0000-0000-000000000002"}
控制器循环:
- 列出所有待处理请求,并用结果更新本地视图。保留响应中的
streamCursor。 - 使用
?cursor=<streamCursor>建立 watch 连接,并将事件应用到本地视图。记录已处理的最新事件id:。 - 断开连接后,使用最新事件 ID 作为
?cursor=重新连接;或者使用原生EventSource,它会自动将其作为Last-Event-ID重新发送。 - 收到 HTTP
410 Gone时,返回步骤 1,重新列出请求。
认领待处理请求
/v0/private-workers/claim在指定 worker 启动前,为其预留一个待处理用量池请求。控制器通过此操作在多个副本之间以原子方式分配工作:读取待处理请求,认领其中一个,再使用与认领信息匹配的稳定 worker ID 启动 worker。
已存在有效认领时,第二次认领会被拒绝。请先释放认领,再认领新的 workerId。
此端点需要服务账户 API 密钥。
请求体
id string (必填)
id 值相同。workerId string (必填)
CURSOR_AGENT_WORKER_ID (或隐藏的 --worker-id 标志) 使用相同 ID 启动 worker,以便 bridge 注册已认领的身份。curl --request POST \ --url "https://api.cursor.com/v0/private-workers/claim" \ -u "$CURSOR_API_KEY:" \ --header 'Content-Type: application/json' \ --data '{ "id": "bc-00000000-0000-0000-0000-000000000002", "workerId": "pw_123" }'响应:
{ "id": "bc-00000000-0000-0000-0000-000000000002", "workerId": "pw_123"}成功认领后,使用预留的 ID 启动 worker:
export CURSOR_API_KEY="your-service-account-api-key"export CURSOR_AGENT_WORKER_ID="pw_123"agent worker --pool gpu --worker-dir /workspace start释放认领
/v0/private-workers/claims/{id}/release解除将智能体绑定到自托管 worker 的长期认领。释放后,Cursor 不再优先为该智能体选择该机器。
认领是一种路由建议,并非实时进程状态。释放不会检查 worker 是否已连接。等待中的后续请求会在下一个调度点返回用量池队列。已连接的 worker 会不受影响地完成当前轮次。释放后,其他 worker 可立即认领同一智能体。
如果存在有效认领,第二次认领待处理请求将被拒绝。请先释放,再认领新的 workerId。
--idle-release-timeout (环境变量 CURSOR_WORKER_IDLE_RELEASE_TIMEOUT) 会使 worker CLI 在空闲后退出。此端点仅解除路由认领。
此端点需要服务账户 API 密钥。
路径参数
id string
id 相同。无需请求体。curl --request POST \ --url "https://api.cursor.com/v0/private-workers/claims/bc-00000000-0000-0000-0000-000000000002/release" \ -u "$CURSOR_API_KEY:"响应:
{ "id": "bc-00000000-0000-0000-0000-000000000002", "workerId": "pw_123"}HTTP 404 表示不存在有效认领:可能已释放、过期或被接管。请勿重试 404。
元数据端点
API 密钥信息
/v1/me获取当前用于身份验证的 API 密钥信息。
响应字段
apiKeyName string
createdAt string
userId integer (用户级密钥)
userEmail string (用户级密钥)
userFirstName, userLastName string (用户级密钥)
curl --request GET \ --url https://api.cursor.com/v1/me \ -u YOUR_API_KEY:响应 (用户级密钥) :
{ "apiKeyName": "Production API Key", "userId": 42, "createdAt": "2026-04-13T18:30:00.000Z", "userEmail": "developer@example.com", "userFirstName": "Alex", "userLastName": "Rivera"}响应 (服务账户密钥) :
{ "apiKeyName": "Production Service Account", "createdAt": "2026-04-13T18:30:00.000Z"}列出模型
/v1/models返回可在 Create An Agent 的 model.id 字段中传入的推荐模型,以及每个模型支持的参数和变体。模型参数采用与 TypeScript SDK ModelSelection 中 model.params 相同的结构。
如需使用已配置的默认模型,请在请求体中完全省略 model。Cursor 会依次解析你的用户默认模型、团队默认模型,最后回退到系统默认值。
响应字段
items 中的每一项描述一个模型:
id string
model.id 传入。displayName string
description string (optional)
aliases array (optional)
composer-latest) 。parameters array (optional)
id、可选的 displayName,以及一个 values 数组,数组中是允许使用的 { value, displayName? } 条目。可用这些值填充创建请求中的 model.params。variants array (optional)
id + params 组合。每个条目都包含一个 params 数组 (可为空) 、一个 displayName、一个可选的 description,以及一个可选的 isDefault 标记。curl --request GET \ --url https://api.cursor.com/v1/models \ -u YOUR_API_KEY:响应:
{ "items": [ { "id": "composer-2", "displayName": "Composer 2", "aliases": ["composer-latest", "composer"], "parameters": [ { "id": "fast", "displayName": "Fast", "values": [ { "value": "false" }, { "value": "true", "displayName": "Fast" } ] } ], "variants": [ { "params": [{ "id": "fast", "value": "true" }], "displayName": "Composer 2", "isDefault": true }, { "params": [{ "id": "fast", "value": "false" }], "displayName": "Composer 2" } ] }, { "id": "claude-4.6-sonnet-thinking", "displayName": "Claude 4.6 Sonnet (Thinking)", "variants": [ { "params": [], "displayName": "Claude 4.6 Sonnet (Thinking)", "isDefault": true } ] } ]}列出 GitHub 仓库
/v1/repositories列出已通过身份验证的用户可通过 Cursor 的 GitHub App 安装访问的 GitHub 仓库。
此端点的速率限制非常严格。
请将请求频率限制为 每用户每分钟 1 次,以及 每用户每小时 30 次。
对于可访问大量仓库的用户,此请求可能需要几十秒才能返回响应。
请确保在无法获取此信息时也能妥善处理。
curl --request GET \ --url https://api.cursor.com/v1/repositories \ -u YOUR_API_KEY:响应:
{ "items": [ { "url": "https://github.com/your-org/your-repo" } ]}