List an agent's promotions
const url = 'https://example.com/v1/agents/example/promotions?limit=25&scopeKind=tenant';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://example.com/v1/agents/example/promotions?limit=25&scopeKind=tenant' \ --header 'Authorization: Bearer <token>'The history of live-version changes (promotions, rollbacks, unpins), newest first. scopeKind (tenant, org, project, segment) with scopeId and segment narrows it to one scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”AgentId — dotted namespace (acme.drafting).
Query Parameters
Section titled “Query Parameters”1..100. Default 25.
Where the previous page ended: its nextCursor, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise 400 bad-input, and the list starts again without it. Absent → first page.
Only one scope: tenant, org or project (with scopeId), or segment (with scopeId and segment).
Required IF scopeKind is org or project. MUST be absent if scopeKind=tenant (tenant is implicit from the session). Malformed combinations return 400 scope-invalid.
One step of the segment path, key:value; repeat it in order, coarse to fine.
Responses
Section titled “Responses”Page of promotions.
object
One change of a scope’s live version, kept for good: what was live before, what is after, who asked and why.
object
The agent’s default for the whole tenant.
object
An org’s projects.
object
One project.
object
A segment path within a project: it covers every run whose path starts with it.
object
object
Lowercase, like an identifier: company, contact-role.
The scope’s own pin before; null when it had none.
The scope’s own pin after; null after an unpin.
object
The comparison the change was judged on.
A promote row’s state: it changes once, from pending-approval to its final state. Absent on rollback and unpin rows, and on promotions made before gates (promoted).
One of a gate’s checks, as the promotion records it.
object
Stable: comparison.required, comparison.status, comparison.freshness, comparison.suite, sameContents, baselineIsLive, scopeCovered, evidence.<metric>.minCases|minWeight|baselineMinCases|baselineMinWeight, metric.<metric>.k|minCandidate|maxDrop, replay.maxDiverged|maxErrors|maxRefusedWrites|maxStopped, classWeights.restrictedOnly.
A plain sentence: what was found against what the policy asks.
The approval a pending-approval promotion waits on (kept once decided).
When a pending-approval promotion reached its final state.
Example
{ "data": [ { "scope": { "kind": "tenant" }, "action": "promote", "requestedBy": { "kind": "user" }, "status": "promoted" } ]}Malformed scope or cursor.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}