What the workspace's achievement rules counted in the session
The session's achievements in force, oldest first, and its latest judgment. Only the platform's judge writes achievements: when the session's evidence appears or changes (a pull request opened, merged or closed, a review submitted, a checkpoint whose out/ files differ from its parent's) a judgment is queued in the same transaction, one queued per session, and the judge takes it once two minutes have passed since the last such change. It pairs each rule in use with the session's evidence of its type's evidence_kind. An always rule counts every pair at no cost; one rule family counts a piece of evidence of a session once (evidence_id: the outcome id, the out/ path, or null for the conversation). title and link are the pull request or review as owner/repo#number and its URL, the file's path and the session's console path, or the session's title and console path. payload is set only for the built-in types (pull_request, code_review, document). review_state is auto for pull request and review evidence, counted at once, and needs_review for out/ files and the conversation, counted once a person confirms them; confirmed and rejected are a person's decision (POST /v1/achievements/{id}/review), which a later judgment never changes. rule_title, rule_version and type_key name the rule version that counted it and its type. threshold is the workspace threshold its judgment held a luna rule's probability against, kept with that judgment; null when that judgment asked the judge nothing. rejudged_after_merge is true for pull request evidence counted by a judgment made after the pull request merged, in a session with a judgment made before the merge.
judgment_count is the session's finished judgments and judge_cost_usd what their judge calls cost, apart from the session's own cost.
judgment is null before the session's first. Its trigger is evidence, turns (every every_n_turns turns, with a rule of conversation evidence in use), idle (the session's run ended idle, paused or closed, with on_idle on) or manual; evidence_change is pr_merged for an evidence judgment when one of the session's pull requests merged after the judgment before it was made and by the time this one was, and null otherwise. Its status is queued, running, succeeded (with error_code: judge_refused when the judge refused a pair, which then is no achievement and is not asked again), failed, deferred (the workspace's judgment calls spent daily_budget_usd for the UTC day; taken again after the next UTC midnight, or two minutes after a new trigger, when always rules count the new evidence and luna pairs wait again) or skipped (error_code: judge_unavailable: a luna rule had evidence and the workspace's connection does not reach a judge; session_limit: the session's other judgments that called the judge reached max_per_session). A try that fails is queued again 1, 5 and 30 minutes later, then ends failed, with the error_code of its last failure: judge_timeout (no answer within 10 seconds), judge_http_error (an error status, or the judge was not reached), judge_bad_response (an answer of another shape); error_code: outputs_unavailable says the checkpoint's out/ list could not be read, and the achievements that need no out/ list are written all the same. Reading changes nothing.
Scope: sessions:read (API key or cookie session).
AuthorizationBearer <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
id*stringThe session's id.
^([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)$uuidThe achievements, oldest first, and the latest judgment.
application/json- response
items*array<>judgment*|nulljudgment_count*integer0 <= value <= 9007199254740991judge_cost_usd*number0 <= valuecurl -X GET 'https://example.com/v1/sessions/497f6eca-6276-4993-bfeb-53cbbbba6f08/achievements'{ "items": [ { "id": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e", "session_id": "0f8b6a52-3d1e-4c7a-9b2f-5e6d7c8a9b01", "agent_id": null, "agent_release_id": null, "rule_id": "7d3a4e5f-6b7c-4d8e-8f9a-1b2c3d4e5f60", "rule_family_id": "8e4b5f6a-7c8d-4e9f-9a0b-2c3d4e5f6a71", "type_id": "9f5c6a7b-8d9e-4f0a-8b1c-3d4e5f6a7b82", "title": "acme/sample-app#12", "link": "https://github.com/acme/sample-app/pull/12", "evidence_kind": "github_pull_request", "evidence_id": "6c1f5b0e-2d7a-4e8b-9f3c-1a2b3c4d5e6f", "payload": { "repository": "acme/sample-app", "number": 12, "url": "https://github.com/acme/sample-app/pull/12", "state": "open", "merged_at": null, "additions": 42, "deletions": 7 }, "judge": "always", "rule_title": "Merged pull request", "rule_version": 2, "type_key": "pull_request", "probability": null, "threshold": null, "rejudged_after_merge": false, "judgment_id": "1c2d3e4f-5a6b-4c7d-9e8f-0a1b2c3d4e5f", "review_state": "auto", "reviewed_by": null, "reviewed_at": null, "review_note": null, "created_at": "2026-10-30T09:42:10.000Z" } ], "judgment": { "id": "1c2d3e4f-5a6b-4c7d-9e8f-0a1b2c3d4e5f", "trigger": "evidence", "status": "succeeded", "error_code": null, "evidence_change": null, "created_at": "2026-10-30T09:40:03.000Z", "finished_at": "2026-10-30T09:42:10.000Z" }, "judgment_count": 1, "judge_cost_usd": 0}