Read the tenant's recent policy decisions
const url = 'https://example.com/v1/policy/decisions?limit=20&offset=0&action=allow';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/policy/decisions?limit=20&offset=0&action=allow' \ --header 'Authorization: Bearer <token>'Returns the calling tenant’s most-recent policy decisions (allow, warn, and deny), newest first — the audit-capture read side (spec 0009). Each row carries the action, the matched rule position, the coarse reason, and the agent/tool it applied to; a request body is never recorded (invariant #3). Tenant-scoped: a tenant only ever sees its own decisions.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Maximum decisions to return, newest first. Clamped to [1, 100]; defaults to 20.
Matching decisions to skip, newest first. With total, this is what makes denials older than one page reachable at all — a denied call creates no invocation, so this feed is the only record of it.
RFC 3339 inclusive lower bound on created_at.
RFC 3339 inclusive upper bound on created_at.
Filter by decision action. Unlike GET /v1/invocations, deny is accepted and is the most useful value: this is the store that has denials.
Filter to one agent’s decisions.
Responses
Section titled “Responses”The tenant’s recent policy decisions.
The GET /v1/policy/decisions response — recent decisions, newest first.
object
One recorded policy decision (spec 0009 audit capture). reason is the coarse, rule-position explanation — never call content (invariant #3).
object
The pdec_<uuidv7> decision ID (opaque).
The agent the decision applied to.
The agent’s protocol (e.g. mcp, http).
The parsed MCP tool the decision applied to; null for protocol=http calls.
The 1-based position of the rule that produced the action, or empty when it came from default/on_error.
A coarse explanation of the action.
The Treeship artifact signed for this decision, or null. A denial has no invocation to carry evidence, so this is the only place the proof of a refusal is reachable.
The effective limit applied to this response.
The offset applied to this response.
Decisions matching the filter before limit/offset. Without it a caller cannot tell “no more rows” from “the page ended exactly here”, and cannot count a window’s denials without walking every page.
Example
{ "data": [ { "action": "allow" } ]}An invalid since, until, or action value, or since after until.
The uniform error body for all 4xx responses that carry one.
object
A coarse, caller-safe message. Never contains internal state (invariant
Examplegenerated
{ "error": "example"}Missing or invalid bearer token, or the token’s tenant/user claims are absent. No body.
An unexpected server-side error. No body (internal detail is never returned to callers, invariant