레퍼런스HTTP APILimits & receipts

Current outcome of an accepted command

GET
/v1/receipts/{id}

Reads the current outcome of a command by the receipt_id its response returned: accepted while it is in progress, then succeeded, failed (with error) or unknown (nobody can say; error explains). Poll until it leaves accepted. result depends on operation:

  • create_session, append_message: the acceptance response exactly as first returned, never rewritten. The turn's outcome is read from GET /v1/sessions/{session_id}/turns/{turn_id} using target_ref.
  • interrupt: {turn_id, terminal, no_op} once settled.
  • pause, resume: {resulting_admission_state, checkpoint_revision, queued_turn_count}.
  • close: {resulting_admission_state, checkpoint_revision, cancelled_turn_count}; checkpoint_revision is null only for a session that never ran a turn.
  • terminate: {execution_gone, checkpoint_revision, unconfirmed_turn_id, external_effects_reverted}.
  • recovery_decision: {resulting_admission_state, checkpoint_revision, resumable}.
  • answer: null; only status and error change.
  • request_push, resolve_push, push: {push_request_id, action, verdict, refusal, repository_id, checkpoint_revision, git_commit, target_branch}; verdict is allow or refuse, a refused attempt is failed with the reason in refusal and error, and fields the attempt never read are null. actor names who made it. Receipts written before the rename say decide_push, decision, already_decided and PUSH_REQUEST_DECIDED instead.
  • open_pull_request, update_pull_request, comment_pull_request: {push_request_id, verdict, refusal, repository_id, number, url, head, base, created}, and for a comment also {comment_id, comment_url, marker}, and for an open or update whose body came from structured fields also template ({commit, path?, blob_sha?, skipped?}: the default branch's commit read, the template used or the reason one was passed over; never its text); created is false when the call answered an open pull request, edited the marked comment, or (always, for update_pull_request) changed the title or body of the pull request with the built-in github MCP server's update_pull_request.
  • close_pull_request, reopen_pull_request: the same fields plus {state, changed}, written when the session's agent closes or reopens the pull request of its push request with the built-in github MCP server's tools of those names; state is the pull request's state after the call and changed is false when it was already in that state. A merged pull request is refused with pull_request_merged (PULL_REQUEST_MERGED).
  • merge_pull_request: the same fields as close_pull_request plus {merged, changed, head_sha, merge_commit_sha, method}, written when the session's agent squash-merges the pull request of its push request with the built-in github MCP server's merge_pull_request; method is squash, or null when the pull request was already merged on the pushed commit (changed false). A refusal is failed with reason_code merge_off (the workspace has not allowed merging; GITHUB_REFUSED) before GitHub is called, or merge_blocked (PULL_REQUEST_MERGE_BLOCKED), head_moved or pull_request_closed (PULL_REQUEST_CLOSED). A receipt refused with merge_off names no connection, App or role.
  • attach_repository: {session_id, attempt_id, agent_id, agent_release_id, repository_id, branch, commit, failure, reason_code}, written when the session's agent attaches a repository with the built-in github MCP server's attach_repository. It is accepted until the worker reports the fetch, then succeeded with commit or failed with failure (fetch_timeout, fetch_too_large, fetch_failed). A refused call is failed at once with reason_code repository_not_allowed (not on the release's list, not allowed for the profile, or the agent's GitHub off; error.code GITHUB_REFUSED), allowed_in_newer_release (off the session's release but allowed by the agent's active release: the session keeps the release it started with, and a new session can attach it; GITHUB_REFUSED) or attempt_ended (STALE_EPOCH). agent_release_id is the release whose list allowed it.
  • set_slack_secret, delete_slack_secret: {purpose, last4}; the value itself is never in a receipt.
  • set_github_app, delete_github_app: {app_id}; the private key is never in a receipt.

Any credential of the same owner can read a receipt, except that a receipt about a session needs that session to be visible to the caller, and one that changed an agent's settings (target_ref.resource an agent or one of its Slack bindings, other than a refused create_session) is read only by those who read the agent's settings: its workspace's owners and admins, its admins, the live members of its managing team, and their personal keys; anyone else gets 403. A receipt that names an agent or a release of one (agent_id, agent_ids, release_id, agent_release_id, or the agent as target_ref or actor.agent_id) is shown only with those ids to a reader who may use that agent (GET /v1/usable-agents); for anyone else a private agent's ids are left out (a list loses them, a single field is null) and a receipt whose target is that agent or one of its releases answers 404, as a receipt that does not exist does. It changes nothing.

Scope: sessions:read (API key or cookie session).

Authorization

headerAuthorizationBearer <token>

For servers and scripts: an API key sent as an HTTP bearer token, Bearer <key>. It holds exactly the scopes it was issued with; a key issued before scopes existed holds none. It never needs the CSRF header, and it cannot manage agents, members, teams or API keys. Issue one in the web console under Settings → API keys; each operation names the scope it needs.

Scope: sessions:read

Path Parameters

id*string

The receipt's id.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid

Response Body

The receipt as it stands now.

application/json
  1. response
id*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
operation*string
Value in"create_session""append_message""answer""interrupt""pause""close""terminate""resume""recovery_decision""change_profile""revoke_execution""issue_password_reset""reset_password""recover_owner""takeover""link_account""unlink_account""invite_member""accept_invite""revoke_invite""change_member_role""disable_member""enable_member""disable_user""enable_user""create_agent""update_agent""create_agent_release""activate_agent""create_api_key""revoke_api_key""create_team""rename_team""delete_team""add_team_member""remove_team_member""set_team_member_role""set_agent_managing_team""set_agent_usage""set_agent_caller_limits""set_agent_access_settings""add_agent_admin""remove_agent_admin""bind_credential""unbind_credential""link_agent_identity""revoke_agent_identity""set_surface_binding""request_surface_binding""resolve_surface_binding""share_session""request_push""resolve_push""decide_push""push""open_pull_request""update_pull_request""comment_pull_request""close_pull_request""reopen_pull_request""merge_pull_request""call_mcp""set_slack_secret""delete_slack_secret""set_github_app""delete_github_app""mint_github_token""set_github_ceiling""set_github_pull_request_settings""set_agent_pull_request_settings""add_repository""set_repository_branch""remove_repository""import_repository""import_connection""import_mcp_server""create_connection""create_mcp_server""set_settings_credential""set_connection_auto_mode""disable_connection""enable_connection""disable_mcp_server""set_mcp_server_workspaces""resolve_repository""set_agent_github""set_agent_mcp""set_repository_github_app""review_pull_request""dispatch_workflow""rerun_workflow""attach_repository""set_github_packages_token""delete_github_packages_token""set_github_packages_allowlist""fetch_github_package""create_workspace_profile""retire_workspace_profile""create_installation_profile""retire_installation_profile""block_installation_profile""unblock_installation_profile""create_achievement_category""update_achievement_category""archive_achievement_category""create_achievement_type""update_achievement_type""archive_achievement_type""create_achievement_rule""update_achievement_rule""disable_achievement_rule""enable_achievement_rule""set_achievement_judge""rejudge_session""review_achievement""set_env_variable""delete_env_variable""set_env_variable_grants""resolve_session_env""reject_session_env""resolve_session_engine_settings""set_workspace_engine_settings""set_agent_engine_settings""register_extension""approve_extension""attach_extension""detach_extension"
target_ref*||
actor?
status*string
Value in"accepted""succeeded""failed""unknown"
result*|

For create_session and append_message: the acceptance response exactly as first returned, never rewritten; its receipt_status and status are acceptance-time values. The current outcome is this receipt's status and error; the turn's result is read from GET /v1/sessions/{session_id}/turns/{turn_id} using target_ref. For interrupt: {turn_id, terminal, no_op} once settled, where no_op: true means the turn reached terminal on its own and the interrupt did nothing.

error*|null
created_at*string
Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
Formatdate-time
updated_at*string
Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
Formatdate-time
Example Request
curl -X GET 'https://example.com/v1/receipts/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
{  "id": "c4a1e9d2-7b3f-4e8a-a6c5-1d2e3f4a5b6c",  "operation": "pause",  "target_ref": {    "session_id": "0f8b6a52-3d1e-4c7a-9b2f-5e6d7c8a9b01",    "turn_id": null,    "request_id": null  },  "status": "succeeded",  "result": {    "resulting_admission_state": "paused",    "checkpoint_revision": 3,    "queued_turn_count": 1  },  "error": null,  "created_at": "2026-10-11T08:20:00Z",  "updated_at": "2026-10-11T08:20:09Z"}