Skip to main content

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 pathRoleNotes
GET /oversightViewerMost recent first. Query: days (default 90, up to 3650), decision (approved, rejected, timed_out), limit (default 500, up to 5000).
GET /oversight/summaryViewerCounts 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 pathRoleNotes
GET /attestations/statement/{subject_type}ViewerThe exact statement for a subject type.
POST /attestationsEditorBody: subject_type, subject_id, content (what the signer was shown), affirmed: true. Refused unless affirmed is true.
GET /attestationsViewerQuery: subject_type, subject_id, active_only.
POST /attestations/{id}/verifyViewerBody: content. Checks the attestation still covers the content as it stands now.
GET /attestations/verify-chainViewerRecomputes the organisation's attestation chain.
Subject typeStatement
impact_assessmentI 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_systemI have reviewed this AI system's intended use, declared misuse and risk classification, and I approve it for the lifecycle state requested.
risk_acceptanceI accept this risk at its current level on behalf of the organisation, having considered the treatment options available.
policyI approve this document as the organisation's policy, effective from the date of this attestation.
conformance_runThis 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 pathRoleNotes
GET /model-governanceViewerEvery routable model. Query: unassessed_only.
GET /model-governance/usageViewerModels your usage reached. Query: days (default 90).
GET /model-governance/summaryViewerRollup.
PUT /model-governance/{provider}/{model_name}AdminRecord 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 pathRoleNotes
GET /governance-alerts/rulesViewer
POST /governance-alerts/rulesAdminBody: name, description, shape, severity, enabled, config, channel, webhook_url.
PATCH /governance-alerts/rules/{rule_id}AdminAny of the above.
DELETE /governance-alerts/rules/{rule_id}Admin
POST /governance-alerts/rules/seedAdminInstalls the default rules. Safe to repeat.
POST /governance-alerts/sweepAdminEvaluates recent decisions and absence rules now instead of waiting for the scheduler.

Rule fields:

FieldValues
shapecategorical, threshold, first_seen, absence
severitycritical, warning (default), info
channelnone (default) or webhook. A webhook rule needs webhook_url.
config for categoricalreason_codes and/or signal_kinds (at least one)
config for thresholdreason_codes, count (2 or more), window_minutes (1 or more)
config for absencehours (1 or more, default 24)
config for first_seenOptional 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 pathRoleNotes
POST /risk-registry/backfillAdminProposes 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-pinsAdminRemoves 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 pathRoleNotes
PUT /workflows/{workflow_id}/risk-appetiteAdminA workflow's own risk appetite, used for its runs. Not clamped. null clears it. GET is Viewer.
PUT /project-settings with allow_user_loosenAdminWhether users in this project may loosen their personal appetite beyond the baseline.
PATCH /ai-systems/{id}/impact-assessments/{assessment_id}EditorEdit a draft impact assessment.

Endpoints behind the governance screens​

AreaEndpoints
Risk registryGET /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 appetiteGET/PUT /project-settings (PUT is Admin), GET/PUT /my-risk-appetite
AI systemsGET/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 assessmentsGET/POST /ai-systems/{id}/impact-assessments, POST /ai-systems/{id}/impact-assessments/{assessment_id}/approve
Policy decisionsGET /policy/decisions, GET /policy/decisions/search (cursor: before_id), GET /policy/divergence-report (query: days)
ConformanceGET /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)
AlertsGET /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 LibraryGET /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 packGET /assurance-pack (full pack), GET /assurance-pack/summary, GET /assurance-pack/export (JSON file). Query: as_at, since. Admin only.