Governance API
Everything on the governance screens is available through the platform API, and some governance features are API-only today. This page lists the governance endpoints. Paths are relative to the agents API; see Platform API for base URLs and authentication. Every request is scoped to the project your credential belongs to.
Role requirements are the project roles described in the overview. Organisation Owners and Admins pass every Admin check.
API-only features
Human oversight records
Every time a person approves or rejects a tool call — or a call times out, has no one to ask, or is approved by a fail-open — an oversight record is kept: the decision, its reason, the agent and function, who decided and when, the risk level and data classification at that moment, the chat session, and a short digest of the arguments (never the arguments themselves).
| Method and path | Role | Notes |
|---|---|---|
GET /oversight | Viewer | Most recent first. Query: days (default 90, up to 3650), decision (approved, rejected, timed_out), limit (default 500, up to 5000). |
GET /oversight/summary | Viewer | Counts by decision and reason, plus how many decisions involved High or Critical risk. Query: days. |
Reason values are human_decision, autonomous_no_human, timed_out, no_channel and fail_open.
Attestations
An attestation is a person formally affirming a fixed statement about specific content — for example, signing off an impact assessment. The platform stores a hash of the content you were shown (not the content itself), so if the content later changes, verification fails. A new attestation for the same subject supersedes the old one; attestations are never edited. Attestations are hash-chained per organisation. Where your login token shows you authenticated within the last five minutes, the attestation records a verified step-up; otherwise it records that step-up couldn't be verified.
| Method and path | Role | Notes |
|---|---|---|
GET /attestations/statement/{subject_type} | Viewer | The exact statement for a subject type. |
POST /attestations | Editor | Body: subject_type, subject_id, content (what the signer was shown), affirmed: true. Refused unless affirmed is true. |
GET /attestations | Viewer | Query: subject_type, subject_id, active_only. |
POST /attestations/{id}/verify | Viewer | Body: content. Checks the attestation still covers the content as it stands now. |
GET /attestations/verify-chain | Viewer | Recomputes the organisation's attestation chain. |
| Subject type | Statement |
|---|---|
impact_assessment | I have reviewed this AI system impact assessment in full, I am satisfied the identified harms and mitigations are accurate, and I accept the residual risk it records. |
ai_system | I have reviewed this AI system's intended use, declared misuse and risk classification, and I approve it for the lifecycle state requested. |
risk_acceptance | I accept this risk at its current level on behalf of the organisation, having considered the treatment options available. |
policy | I approve this document as the organisation's policy, effective from the date of this attestation. |
conformance_run | This conformance run attempted to bypass each listed control over the real API surface and recorded what it found, failures and coverage gaps included; the case list is complete and unedited. |
Control Library controls bound to attestations read Operating when attestations exist for their subject type and the chain verifies.
Model governance
What is known about each model the platform can route to — hosting region, data retention, whether it trains on customer data (yes, no, opt-out-applied, unknown) and lifecycle status (current, deprecated, retired, unknown) — and which models your usage has actually reached. This feeds the Models & Subprocessors section of the assurance pack.
| Method and path | Role | Notes |
|---|---|---|
GET /model-governance | Viewer | Every routable model. Query: unassessed_only. |
GET /model-governance/usage | Viewer | Models your usage reached. Query: days (default 90). |
GET /model-governance/summary | Viewer | Rollup. |
PUT /model-governance/{provider}/{model_name} | Admin | Record an assessment: hosting_region, data_retention, trains_on_customer_data, lifecycle_status, evidence_source, notes. |
Alert rules
The Alerts page can only install the default rules. Creating, changing and deleting rules — including adding a webhook — is done through the API.
| Method and path | Role | Notes |
|---|---|---|
GET /governance-alerts/rules | Viewer | |
POST /governance-alerts/rules | Admin | Body: name, description, shape, severity, enabled, config, channel, webhook_url. |
PATCH /governance-alerts/rules/{rule_id} | Admin | Any of the above. |
DELETE /governance-alerts/rules/{rule_id} | Admin | |
POST /governance-alerts/rules/seed | Admin | Installs the default rules. Safe to repeat. |
POST /governance-alerts/sweep | Admin | Evaluates recent decisions and absence rules now instead of waiting for the scheduler. |
Rule fields:
| Field | Values |
|---|---|
shape | categorical, threshold, first_seen, absence |
severity | critical, warning (default), info |
channel | none (default) or webhook. A webhook rule needs webhook_url. |
config for categorical | reason_codes and/or signal_kinds (at least one) |
config for threshold | reason_codes, count (2 or more), window_minutes (1 or more) |
config for absence | hours (1 or more, default 24) |
config for first_seen | Optional filters; empty matches any reason code |
Signal kinds are decision, containment, surface_change, chain_verification, absence and topology_finding. Reason codes must be ones the platform emits — see Reason codes. A rule naming an unknown code is refused, because a rule that can never fire looks exactly like nothing going wrong.
Bulk risk registry operations
| Method and path | Role | Notes |
|---|---|---|
POST /risk-registry/backfill | Admin | Proposes a classification for every unclassified object in the project. Fills empty fields only and leaves everything unreviewed. With recompute=true, also raises unreviewed objects whose level is below what their capabilities derive to, and lists reviewed ones that are understated (never changing them). dry_run defaults to true. |
POST /risk-registry/clear-pins | Admin | Removes Approval Override pins so objects fall back to the risk appetite. Filters: kind, pinned_mode, created_before, ids (comma-separated). Touches nothing but the pin. dry_run defaults to true. |
Other API-only settings
| Method and path | Role | Notes |
|---|---|---|
PUT /workflows/{workflow_id}/risk-appetite | Admin | A workflow's own risk appetite, used for its runs. Not clamped. null clears it. GET is Viewer. |
PUT /project-settings with allow_user_loosen | Admin | Whether users in this project may loosen their personal appetite beyond the baseline. |
PATCH /ai-systems/{id}/impact-assessments/{assessment_id} | Editor | Edit a draft impact assessment. |
Endpoints behind the governance screens
| Area | Endpoints |
|---|---|
| Risk registry | GET /risk-registry (query: risk_level, data_classification, compliance_tag, kind, unreviewed_only), GET /risk-registry/summary. Any project member. Also available as risk registry tools on the platform MCP server. |
| Risk appetite | GET/PUT /project-settings (PUT is Admin), GET/PUT /my-risk-appetite |
| AI systems | GET/POST /ai-systems (query: lifecycle_state, include_retired), GET/PATCH /ai-systems/{id}, GET /ai-systems/{id}/card, POST/DELETE /ai-systems/{id}/constituents (body: agent_ids, team_ids), POST /ai-systems/{id}/lifecycle (body: to_state, note) |
| Impact assessments | GET/POST /ai-systems/{id}/impact-assessments, POST /ai-systems/{id}/impact-assessments/{assessment_id}/approve |
| Policy decisions | GET /policy/decisions, GET /policy/decisions/search (cursor: before_id), GET /policy/divergence-report (query: days) |
| Conformance | GET /assurance/conformance-runs (query: days, limit), GET /assurance/conformance-runs/{run_id}, POST /assurance/conformance-runs (Editor; used by the conformance suite to report a run) |
| Alerts | GET /governance-alerts (query: status, severity, shape, subject_kind, subject_id, limit), GET /governance-alerts/{id}, POST /governance-alerts/{id}/acknowledge, POST /governance-alerts/{id}/resolve (Editor) |
| Control Library | GET /control-library/frameworks, GET /control-library/frameworks/{framework_id}/controls, GET /control-library/frameworks/{framework_id}/coverage, GET /control-library/controls/{id}, GET /control-library/for/{entity_kind}/{entity_id}, POST /control-library/seed (Admin), bindings under /control-library/controls/{id}/bindings and /control-library/bindings/{id} (Admin), profiles under /control-library/profiles (Admin) |
| Assurance pack | GET /assurance-pack (full pack), GET /assurance-pack/summary, GET /assurance-pack/export (JSON file). Query: as_at, since. Admin only. |