Anysphere Agents API
The Agents API from Anysphere — 11 operation(s) for agents.
The Agents API from Anysphere — 11 operation(s) for agents.
openapi: 3.0.3
info:
title: Cursor Cloud Agents API
description: 'Programmatically create and manage Cursor Cloud Agents that work
autonomously on your repositories. v1 separates a durable agent
from one or more runs: each prompt submission creates a run on the
agent. Streaming and cancellation are scoped to the active run.
'
version: 1.0.0
contact:
email: background-agent-feedback@cursor.com
servers:
- url: https://api.cursor.com
description: Production server
security:
- basicAuth: []
- bearerAuth: []
tags:
- name: Agents
paths:
/v1/agents:
post:
summary: Create an agent
description: 'Create a Cloud Agent and immediately enqueue its initial run.
The response contains both the durable `agent` and the initial
`run`.
'
operationId: createAgent
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAgentRequest'
responses:
'201':
description: Agent created and initial run enqueued.
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAgentResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
get:
summary: List agents
description: List agents for the authenticated user, newest first.
operationId: listAgents
parameters:
- name: limit
in: query
required: false
description: Number of agents to return.
schema:
type: integer
minimum: 1
maximum: 100
default: 20
- name: cursor
in: query
required: false
description: Pagination cursor from the previous response.
schema:
type: string
minLength: 1
- name: prUrl
in: query
required: false
description: Filter agents by GitHub pull request URL.
schema:
type: string
format: uri
- name: includeArchived
in: query
required: false
description: Whether to include archived agents.
schema:
type: boolean
default: true
responses:
'200':
description: Agents retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/ListAgentsResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}:
get:
summary: Get an agent
description: Retrieve durable metadata for an agent. Execution status lives on runs.
operationId: getAgent
parameters:
- $ref: '#/components/parameters/AgentId'
responses:
'200':
description: Agent retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Agent'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
delete:
summary: Delete an agent permanently
description: Permanently delete an agent. This action is irreversible. Use POST /v1/agents/{id}/archive for reversible removal.
operationId: deleteAgent
parameters:
- $ref: '#/components/parameters/AgentId'
responses:
'200':
description: Agent deleted successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/IdResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/runs:
post:
summary: Create a run
description: 'Send a follow-up prompt to an existing active agent. The new
run uses the agent''s current conversation and workspace state.
Only one run can be active per agent at a time.
'
operationId: createRun
parameters:
- $ref: '#/components/parameters/AgentId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRunRequest'
responses:
'201':
description: Run created and enqueued.
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRunResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
get:
summary: List runs
description: List runs for an agent, newest first.
operationId: listRuns
parameters:
- $ref: '#/components/parameters/AgentId'
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
- name: cursor
in: query
required: false
description: Pagination cursor from the previous response.
schema:
type: string
minLength: 1
responses:
'200':
description: Runs retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/ListRunsResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/runs/{runId}:
get:
summary: Get a run
description: Retrieve status and timestamps for a specific run.
operationId: getRun
parameters:
- $ref: '#/components/parameters/AgentId'
- $ref: '#/components/parameters/RunId'
responses:
'200':
description: Run retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Run'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/runs/{runId}/stream:
get:
summary: Stream a run
description: "Stream Server-Sent Events for one run. Event types are\n`status`, `assistant`, `thinking`, `tool_call`,\n`interaction_update`, `heartbeat`, `result`, `error`, and\n`done`.\n\n- `status` carries `{ runId, status }`. It has no `id` line\n and is replayed at the top of every reconnect.\n- `result` carries `{ runId, status, text?, durationMs?,\n git? }`; `text` is the final assistant reply, `durationMs`\n the wall-clock duration, and `git` mirrors `Run.git`.\n- `interaction_update` carries the richer SDK-shape update\n used by the TypeScript SDK and is emitted alongside the\n simplified events that share the same event id. Use this if\n you want the full SDK stream; otherwise handle the simplified\n events and ignore it.\n\nReconnect with the `Last-Event-ID` header to resume after a\ndisconnect; the event ID must belong to the requested run\notherwise the endpoint returns `400 invalid_last_event_id`.\nResponses include the `X-Cursor-Stream-Retention-Seconds`\nheader; after the retention window the endpoint may return\n`410 stream_expired`. `tool_call` event data uses the\n`RunStreamToolCallData` schema.\n"
operationId: streamRun
parameters:
- $ref: '#/components/parameters/AgentId'
- $ref: '#/components/parameters/RunId'
- name: Last-Event-ID
in: header
required: false
description: Resume from a previously received event ID for this run.
schema:
type: string
responses:
'200':
description: SSE stream of run events.
headers:
X-Cursor-Stream-Retention-Seconds:
description: Server-side stream retention window in seconds.
schema:
type: integer
content:
text/event-stream:
schema:
type: string
examples:
toolCall:
summary: Tool call events
value: 'id: 1713033005000-0
event: tool_call
data: {"callId":"call-1","name":"read_file","status":"running","args":{"path":"README.md"}}
id: 1713033006000-0
event: tool_call
data: {"callId":"call-1","name":"read_file","status":"completed","args":{"path":"README.md"},"result":{"success":{"content":"# Project","totalLines":1,"fileSize":9,"path":"README.md"}}}
'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/runs/{runId}/cancel:
post:
summary: Cancel a run
description: 'Cancel the active run for an agent. Cancellation is terminal —
the run transitions to `CANCELLED`. Cancelling a run that is
already terminal or was never active returns
`409 run_not_cancellable`. To continue the conversation,
create a new run on the same agent.
'
operationId: cancelRun
parameters:
- $ref: '#/components/parameters/AgentId'
- $ref: '#/components/parameters/RunId'
responses:
'200':
description: Run cancelled successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/IdResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/usage:
get:
summary: Get agent usage
description: 'Retrieve token usage for an agent, broken down per run.
`totalUsage` sums input, output, and cache token counts across
every run on the agent, and `runs` lists the same breakdown for
each run. Token usage mirrors the `tokenUsage` shape on the team
usage events endpoint.
This endpoint is in early access. When it isn''t enabled for the
account it returns `403 feature_unavailable`. An unknown `runId`
returns `404 run_not_found`.
'
operationId: getAgentUsage
parameters:
- $ref: '#/components/parameters/AgentId'
- name: runId
in: query
required: false
description: Scope usage to a single run. Omit to return usage for every run on the agent.
schema:
type: string
example: run-00000000-0000-0000-0000-000000000001
responses:
'200':
description: Usage retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/AgentUsageResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/archive:
post:
summary: Archive an agent
description: Archive an agent. Archived agents remain readable but cannot accept new runs until unarchived.
operationId: archiveAgent
parameters:
- $ref: '#/components/parameters/AgentId'
responses:
'200':
description: Agent archived successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/IdResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/unarchive:
post:
summary: Unarchive an agent
description: Unarchive an agent so it can accept new runs again.
operationId: unarchiveAgent
parameters:
- $ref: '#/components/parameters/AgentId'
responses:
'200':
description: Agent unarchived successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/IdResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/artifacts:
get:
summary: List artifacts
description: 'List artifacts produced by an agent. Each artifact''s `path` is
relative to the workspace''s `artifacts/` directory. Pass that
`path` to GET /v1/agents/{id}/artifacts/download to obtain a
presigned download URL.
'
operationId: listArtifacts
parameters:
- $ref: '#/components/parameters/AgentId'
responses:
'200':
description: Artifacts retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/ListArtifactsResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
/v1/agents/{id}/artifacts/download:
get:
summary: Download an artifact
description: 'Retrieve a temporary 15-minute presigned S3 URL for an
artifact. The `path` query parameter must be a relative path
under `artifacts/` returned by GET /v1/agents/{id}/artifacts.
'
operationId: downloadArtifact
parameters:
- $ref: '#/components/parameters/AgentId'
- name: path
in: query
required: true
description: Relative artifact path under `artifacts/`.
schema:
type: string
minLength: 1
example: artifacts/screenshot.png
responses:
'200':
description: Presigned URL retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/DownloadArtifactResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Agents
components:
responses:
Forbidden:
description: Authenticated but insufficient permissions, plan required, or feature unavailable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Gone:
description: Stream retention window has elapsed (`stream_expired`).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Rate limit exceeded. Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Agent or run not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
InternalError:
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Conflict:
description: Resource state conflict (`agent_busy`, `agent_archived`, `agent_id_conflict`, or `run_not_cancellable`).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Invalid or missing API key.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Validation error or malformed request body.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Artifact:
type: object
required:
- path
- sizeBytes
- updatedAt
properties:
path:
type: string
minLength: 1
description: Artifact path relative to the workspace's `artifacts/` directory.
example: artifacts/screenshot.png
sizeBytes:
type: integer
minimum: 0
description: File size in bytes.
example: 12345
updatedAt:
type: string
format: date-time
description: Last modified timestamp.
RunGitBranch:
type: object
required:
- repoUrl
properties:
repoUrl:
type: string
minLength: 1
description: Repository URL the agent pushed to. Returned without the scheme (for example, `github.com/your-org/your-repo`).
example: github.com/your-org/your-repo
branch:
type: string
minLength: 1
description: Branch name the agent pushed.
example: cursor/add-readme-a1b2
prUrl:
type: string
format: uri
description: Pull request URL, when Cursor opened a PR.
example: https://github.com/your-org/your-repo/pull/123
ListRunsResponse:
type: object
required:
- items
properties:
items:
type: array
description: Runs for this agent, newest first.
items:
$ref: '#/components/schemas/Run'
nextCursor:
type: string
minLength: 1
description: Cursor for fetching the next page of results. Omitted (not `null`) when there are no more pages.
Agent:
allOf:
- $ref: '#/components/schemas/AgentSummary'
- type: object
properties:
repos:
type: array
description: Repository configuration. Empty for no-repo agents.
items:
$ref: '#/components/schemas/RepoConfig'
workOnCurrentBranch:
type: boolean
description: When `false` (the default), Cursor pushes commits to a new auto-generated branch. When `true`, commits land on the existing head branch.
example: false
autoCreatePR:
type: boolean
description: Whether Cursor opens a pull request when the run completes.
example: true
skipReviewerRequest:
type: boolean
description: Whether to skip requesting the user as a reviewer when Cursor opens a PR.
customSubagents:
type: array
description: Custom subagents defined at create time. Omitted when none were provided.
items:
$ref: '#/components/schemas/CustomSubagent'
DownloadArtifactResponse:
type: object
required:
- url
- expiresAt
properties:
url:
type: string
format: uri
description: Temporary 15-minute presigned S3 URL for downloading the artifact.
example: https://cloud-agent-artifacts.s3.us-east-1.amazonaws.com/...
expiresAt:
type: string
format: date-time
description: When the presigned URL expires.
McpServer:
oneOf:
- $ref: '#/components/schemas/StdioMcpServer'
- $ref: '#/components/schemas/RemoteMcpServer'
Image:
type: object
description: 'An image input. Provide exactly one of `data` or `url`. When
`data` is provided, `mimeType` is required. When `url` is
provided, Cursor fetches the image and `mimeType` must be
omitted.
'
properties:
data:
type: string
minLength: 1
description: Base64 encoded image bytes (max 15 MB). Mutually exclusive with `url`.
example: iVBORw0KGgoAAAANSUhEUgAA...
url:
type: string
format: uri
description: HTTP or HTTPS URL Cursor fetches. Mutually exclusive with `data`.
example: https://example.com/screenshot.png
mimeType:
type: string
minLength: 1
description: MIME type of the image bytes. Required when `data` is provided; must be omitted when `url` is provided. Supported types are `image/png`, `image/jpeg`, `image/gif`, and `image/webp`.
example: image/png
dimension:
$ref: '#/components/schemas/ImageDimension'
oneOf:
- required:
- data
- mimeType
not:
required:
- url
- required:
- url
not:
anyOf:
- required:
- data
- required:
- mimeType
Run:
type: object
required:
- id
- agentId
- status
- createdAt
- updatedAt
properties:
id:
type: string
description: Unique run identifier.
example: run-00000000-0000-0000-0000-000000000001
agentId:
type: string
description: ID of the agent this run belongs to.
example: bc-00000000-0000-0000-0000-000000000001
status:
type: string
enum:
- CREATING
- RUNNING
- FINISHED
- ERROR
- CANCELLED
- EXPIRED
description: Current run status.
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
durationMs:
type: integer
minimum: 0
description: Wall-clock duration of the run in milliseconds. Populated once the run reaches a terminal status (`FINISHED`, `ERROR`, `CANCELLED`, `EXPIRED`).
example: 12357
result:
type: string
minLength: 1
description: Final assistant reply text. Populated once the run terminates.
example: Added README.md with installation instructions.
git:
allOf:
- $ref: '#/components/schemas/RunGit'
description: The agent's pushed branches and PRs. Populated once the agent has pushed at least one branch. Per-agent state, not per-run.
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: 'Machine-readable error code. Possible values include
`unauthorized`, `api_key_not_found`, `plan_required`,
`role_forbidden`, `feature_unavailable`,
`integration_not_connected`, `validation_error`,
`missing_body`, `invalid_model`, `invalid_branch_name`,
`repository_required`, `repository_access`,
`pr_resolution_failed`, `artifact_not_found`,
`service_account_required`, `agent_not_found`,
`run_not_found`, `agent_busy`, `agent_archived`,
`agent_id_conflict`, `run_not_cancellable`,
`rate_limit_exceeded`, `usage_limit_exceeded`,
`stream_expired`, `stream_unavailable`,
`invalid_last_event_id`, `client_cancelled`,
`not_implemented`, `upstream_error`, and
`internal_error`.
'
message:
type: string
description: Human-readable error message.
helpUrl:
type: string
format: uri
description: Optional follow-up link. Populated for codes like `integration_not_connected`.
provider:
type: string
minLength: 1
description: Optional provider identifier. Populated for codes like `integration_not_connected`.
AgentMode:
type: string
enum:
- agent
- plan
description: 'Conversation mode. `plan` explores and drafts a plan before coding; `agent` implements changes directly. On follow-up runs, omit to keep the conversation''s current mode; set explicitly to switch modes for that run.
'
RunGit:
type: object
description: 'The agent''s current pushed branches and pull requests. This is
per-agent state — every run on the same agent returns the same
`git` snapshot rather than only that run''s contributions. Use
the agent''s `latestRunId` or the SSE stream to attribute work
to a specific run.
'
required:
- branches
properties:
branches:
type: array
description: Branches the agent has pushed. Stacked agents return one entry per branch.
items:
$ref: '#/components/schemas/RunGitBranch'
AgentUsageResponse:
type: object
required:
- totalUsage
- runs
properties:
totalUsage:
allOf:
- $ref: '#/components/schemas/UsageTokenUsage'
description: Token usage summed across the returned runs.
runs:
type: array
description: Per-run usage, one entry per run (or a single entry when `runId` is set).
items:
$ref: '#/components/schemas/RunUsage'
UsageTokenUsage:
type: object
required:
- inputTokens
- outputTokens
- cacheWriteTokens
- cacheReadTokens
- totalTokens
properties:
inputTokens:
type: integer
minimum: 0
description: Input tokens consumed.
example: 6320
outputTokens:
type: integer
minimum: 0
description: Output tokens generated.
example: 1450
cacheWriteTokens:
type: integer
minimum: 0
description: Tokens written to cache.
example: 7100
cacheReadTokens:
type: integer
minimum: 0
description: Tokens read from cache.
example: 21300
totalTokens:
type: integer
minimum: 0
description: Sum of the four token counts above.
example: 36170
AgentEnv:
type: object
required:
- type
properties:
type:
type: string
enum:
- cloud
- pool
- machine
description: Execution environment type. `cloud` uses Cursor-hosted VMs; `pool` and `machine` route to self-hosted workers.
example: cloud
name:
type: string
minLength: 1
description: Named Cursor-hosted environment, self-hosted pool, or self-hosted machine name.
example: Release workspace
ListAgentsResponse:
type: object
required:
- items
properties:
items:
type: array
description: Agents, newest first.
items:
$ref: '#/components/schemas/AgentSummary'
nextCursor:
type: string
minLength: 1
description: Cursor for fetching the next page of results. Omitted (not `null`) when there are no more pages.
example: bc-00000000-0000-0000-0000-000000000002
ImageDimension:
type: object
required:
- width
- height
properties:
width:
type: integer
minimum: 1
description: Width in pixels
height:
type: integer
minimum: 1
description: Height in pixels
RunUsage:
type: object
required:
- id
- usage
properties:
id:
type: string
minLength: 1
description: Run identifier.
example: run-00000000-0000-0000-0000-000000000001
usageUuid:
type: string
minLength: 1
description: Internal usage identifier for the run. Omitted when the run has no recorded usage yet.
example: 00000000-0000-0000-0000-000000000001
usage:
allOf:
- $ref: '#/components/schemas/UsageTokenUsage'
description: Token usage for this run. Runs without recorded usage report zeros across all fields.
ModelRef:
type: object
required:
- id
properties:
id:
type: string
minLength: 1
description: Explicit model ID returned by GET /v1/models. Omit `model` from the request to use the configured default.
example: composer-2
params:
type: array
description: Per-model parameters such as reasoning effort or max mode. Use only parameters supported by the selected model.
items:
type: object
required:
- id
- value
properties:
id:
type: string
minLength: 1
example: thinking
value:
type: string
minLength: 1
example: high
McpAuth:
type: object
additionalProperties: false
required:
- CLIENT_ID
properties:
CLIENT_ID:
type: string
mi
# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/anysphere/refs/heads/main/openapi/anysphere-agents-api-openapi.yml