Read one ratified policy
GET/api/public/v1/policies/{public_id}
Returns the same layer-aware row used by the zone list, plus live atoms and their generated cases, provenance, append-only history, named seven-day activity counters and versions — every ratified version of this AIP, newest first, and attachments[] — every Autonomy Zone it is attached to — plus home_zone, retired_at and retired_by. A draft answers 404. A deleted policy answers 200 read-only (read_only: true, attachments: []) and ignores zone_id; its home_zone is the zone it was last in while that zone is live, else null. For a live one, zone_id must name a zone whose path holds an attachment of it; without it the policy is read from its strictest attachment. version=n reads that ratified version read-only (read_only: true unless it is the one in force): its atoms and their cases. A version that was never ratified — the open draft included — answers 404. agent_id adds activity_agent_14d: the events this policy evaluated and the anomalies it raised on that agent over 14 days (404 AGENT_NOT_FOUND for an agent outside the organization).
curl --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/policies/<policy_public_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY"import jsonimport osimport urllib.request
request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/policies/<policy_public_id>', method='GET', headers={ 'Authorization': 'Bearer ' + os.environ['OPENLATCH_API_KEY'], },)with urllib.request.urlopen(request) as response: text = response.read().decode() print(json.dumps(json.loads(text), indent=2) if text else response.status)#!/usr/bin/env bashset -euo pipefail
curl -sS --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/policies/<policy_public_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY" | jq .$headers = @{ Authorization = "Bearer $env:OPENLATCH_API_KEY"}Invoke-RestMethod -Method GET -Uri 'https://app.openlatch.ai/api/public/v1/policies/<policy_public_id>' -Headers $headers | ConvertTo-Json -Depth 20Authorization
Section titled “Authorization”| Role in the organization | This endpoint |
|---|---|
owner | Allowed |
admin | Allowed |
editor | Allowed |
viewer | Allowed |
A key carries the role its owner holds in the organization. See Authentication.
API key scope: policies:read
Path parameters
Section titled “Path parameters”| Parameter | Type | Description |
|---|---|---|
public_id | string | Required. |
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
zone_id | string (uuid) or null | |
version | integer or null | |
agent_id | string or null |
Response
Section titled “Response”- 200 OK — the call succeeded.
- 401 Unauthorized —
UNAUTHORIZED - 402 Payment Required —
license_expired - 403 Forbidden —
FEATURE_DISABLED,FORBIDDEN,INSUFFICIENT_SCOPE - 404 Not Found —
AGENT_NOT_FOUND,NOT_FOUND - 422 Unprocessable Content —
INVALID_ID,VALIDATION_ERROR - 429 Too Many Requests —
TOO_MANY_REQUESTS - 500 Internal Server Error —
INTERNAL_SERVER_ERROR,tenant_isolation_violation - 503 Service Unavailable —
ENGINE_UNAVAILABLE,FEATURE_STATE_UNAVAILABLE,SERVICE_UNAVAILABLE
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
data | object | Required. A ratified policy with its intents, provenance, history and activity. |
data.activity_7d | object | Required. Named counts of the policy's durable decision evidence from the last seven days. |
data.activity_7d.anomalies_raised | integer | |
data.activity_7d.events_evaluated | integer | |
data.activity_agent_14d | object or null | Events evaluated and anomalies raised by this policy on the agent named by agent_id, over 14 days. Null when the read was not scoped to an agent. |
data.activity_agent_14d.anomalies_raised | integer | |
data.activity_agent_14d.events_evaluated | integer | |
data.anomalies_7d | integer | |
data.ask_behaviour_override | string or null | This AIP's own Ask behaviour, or null to follow the zone. |
data.ask_mode_override | string or null | This AIP's own ASK delivery mode, or null to follow the zone. |
data.attached_here | boolean | |
data.attachment_mode | string — one of disabled, monitor, enforce or null | |
data.attachments | array of object | Every Autonomy Zone the AIP is attached to, the viewed one first. |
data.attachments[].attached_at | string (date-time) | Required. |
data.attachments[].mode | string — one of disabled, monitor, enforce | Required. |
data.attachments[].unit_id | string | Required. |
data.attachments[].zone_id | string | Required. |
data.attachments[].zone_label | string | Required. |
data.coverage | object | Required. D-66 — installs counted from stamped negotiation, never from mode + recent poll. |
data.coverage.compatibility_unavailable_installs | integer | Required. |
data.coverage.enforced_installs | integer | Required. |
data.dimensions | array of string | Required. |
data.display_title | string | The AIP's name: its title, else its generated_title, else its statement. |
data.dropped_deferred_rules | array of object | The deferred rules of the version in force that no bundle serves, because their trigger is too broad: each with its intent policy and that intent policy's ratified sentence. Describes the version in force whatever version is viewed; empty when none. |
data.dropped_deferred_rules[].intent_policy_id | string | Required. |
data.dropped_deferred_rules[].rule_key | string | Required. |
data.dropped_deferred_rules[].sentence | string | Required. |
data.effective_ask_behaviour | string | The Ask behaviour its Asks follow at the layer being viewed. |
data.effective_ask_mode | string | The mode its ASKs follow at the layer being viewed: platform, agent or both. |
data.effective_layer | object or null | |
data.effective_layer.inherited | boolean | Required. |
data.effective_layer.label | string | Required. |
data.effective_layer.unit_id | string | Required. |
data.effective_layer.zone_id | string | Required. |
data.effective_mode | string — one of disabled, monitor, enforce or null | |
data.generated_title | string or null | The title generated when the AIP was first drafted; null when none. |
data.history | array of object | Required. |
data.history[].actor_kind | string | Required. |
data.history[].actor_user_id | object or null | Required. |
data.history[].at | string (date-time) | Required. |
data.history[].change | string | Required. |
data.history[].evidence_ref | object or null | Required. |
data.history[].from_value | object or null | Required. |
data.history[].to_value | object or null | Required. |
data.home_zone | object or null | Required. The Autonomy Zone the AIP is in (ratified), or was last in while that zone is still live (deleted); null otherwise. |
data.home_zone.org_unit_id | string | Required. |
data.home_zone.zone_id | string | Required. |
data.id | string | Required. |
data.intent_policies | array of object | The ratified intent policies of the version viewed. |
data.intent_policies[].aip_id | string | Required. |
data.intent_policies[].aip_public_id | string | Required. |
data.intent_policies[].aip_version | integer | Required. |
data.intent_policies[].ask_behaviour | string | Required. |
data.intent_policies[].ask_mode | string | Required. |
data.intent_policies[].capability | object or null | |
data.intent_policies[].citation | object or null | Required. The framework preset rule this intent policy came from, edited when its sentence differs; null for anything not drawn from a framework preset. |
data.intent_policies[].decisive | object or null | Set when the owner let this intent policy's declarations decide (Spec AZ2-6). |
data.intent_policies[].dimension | string — one of quality, economics, security, safety, compliance | Required. |
data.intent_policies[].exceptions | array of object | |
data.intent_policies[].fallback | object or null | An Optimize intent policy's fallback: how an action already steered twice is settled. |
data.intent_policies[].id | string | Required. |
data.intent_policies[].language | string | Required. |
data.intent_policies[].learned_cases | array of object | Regression cases accepted from learning proposals (Spec AZ2-6). |
data.intent_policies[].measurement | object or null | A measure intent policy's seven-day measurement counts; null otherwise. |
data.intent_policies[].messages | object | Required. |
data.intent_policies[].mode | string | Required. |
data.intent_policies[].request_rule | object or null | A measure intent policy's request rule; null otherwise. |
data.intent_policies[].rules | array of object | Required. |
data.intent_policies[].sentence | string | Required. |
data.intent_policies[].status | string — one of draft, ratified, dropped | Required. |
data.intent_policies[].steer | object or null | The better path an Optimize intent policy steers the agent to; null otherwise. |
data.intents | object | Required. How many of the policy's atoms are actually enforceable. |
data.intents.enforceable | integer | Required. |
data.intents.monitor_only | integer | Required. |
data.intents.total | integer | Required. |
data.layer | object | Required. The layer a policy row is labelled with: the zone being viewed when it holds the AIP, else the zone whose
attachment sets its mode there. `inherited` is true when the viewed zone holds no attachment of it. |
data.layer.inherited | boolean | Required. |
data.layer.label | string | Required. |
data.layer.unit_id | string | Required. |
data.layer.zone_id | string | Required. |
data.limits | object or null | |
data.limits.cannot_prompt | integer | Required. Agents whose binding cannot prompt: their ASKs take the fallback verdict. |
data.limits.in_scope | integer | Required. Agents whose effective zone is in the subtree. |
data.limits.shell_only | integer | Required. Agents whose refusals reach shell tools only (Cline today). |
data.mode | string | Required. Deprecated: attachment_mode at zone_id, else effective_mode. |
data.open_edit_draft | object or null | The AIP's open draft version and who holds it; null when none is open. |
data.open_edit_draft.held_by | object | Required. |
data.open_edit_draft.public_id | string | Required. |
data.open_edit_draft.version | integer | Required. |
data.preset | object or null | |
data.preset.application_id | string | Required. |
data.preset.preset_id | string | Required. |
data.preset.preset_name | string | Required. |
data.preset.preset_policy_key | string | Required. |
data.preset.preset_version | integer | Required. |
data.provenance | object | Required. Where a ratified policy came from and who ratified it, when known. |
data.provenance.copied_from | object or null | The AIP this one was copied from and its version then; null when not a copy. |
data.provenance.preset | object or null | |
data.provenance.ratified_at | string (date-time) or null | Required. |
data.provenance.ratified_by | string or null | Required. |
data.provenance.ratified_by_kind | string or null | Required. |
data.provenance.rationale | string or null | Required. |
data.provenance.source_id | string or null | Required. |
data.provenance.source_kind | string | Required. |
data.provenance.source_name | string or null | Required. |
data.public_id | string | Required. |
data.read_only | boolean | |
data.retired_at | string (date-time) or null | Required. When the AIP was deleted; null while it is in force. |
data.retired_by | object or null | Required. Who deleted it; null while it is in force. |
data.retired_by.kind | string — one of user, api_key, system, migration | Required. |
data.retired_by.name | object or null | |
data.statement | string | Required. |
data.status | string | Required. |
data.title | string or null | The owner's name for the AIP; null falls back. |
data.version | integer | Required. |
data.versions | array of object | |
data.versions[].change | string | Required. |
data.versions[].ratified_at | string (date-time) | Required. |
data.versions[].ratified_by_kind | string | Required. |
data.versions[].version | integer | Required. |
data.viewing_version | integer | Required. |
Example response
Section titled “Example response”{ "data": { "activity_7d": { "anomalies_raised": 0, "events_evaluated": 0 }, "activity_agent_14d": { "anomalies_raised": 0, "events_evaluated": 0 }, "anomalies_7d": 0, "ask_behaviour_override": "string", "ask_mode_override": "string", "attached_here": false, "attachment_mode": "disabled", "attachments": [ { "attached_at": "2026-01-15T14:32:05Z", "mode": "disabled", "unit_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "zone_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "zone_label": "string" } ], "coverage": { "compatibility_unavailable_installs": 3, "enforced_installs": 3 }, "dimensions": [ "string" ], "display_title": "", "dropped_deferred_rules": [ { "intent_policy_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "rule_key": "string", "sentence": "string" } ], "effective_ask_behaviour": "pass_and_review", "effective_ask_mode": "both", "effective_layer": { "inherited": false, "label": "string", "unit_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "zone_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10" }, "effective_mode": "disabled", "generated_title": "string", "history": [ { "actor_kind": "string", "actor_user_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "at": "2026-01-15T14:32:05Z", "change": "string", "evidence_ref": "string", "from_value": "string", "to_value": "string" } ], "home_zone": { "org_unit_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "zone_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10" }, "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "intent_policies": [ { "aip_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "aip_public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "aip_version": 3, "ask_behaviour": "string", "ask_mode": "string", "capability": "string", "citation": { "edited": false, "entries": [ {} ], "items": [ {} ], "license_url": "https://app.openlatch.ai/", "preset_key": "string", "preset_title": "string", "rule_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "source_commit": "string", "source_date": "string", "source_sentence": "string", "version": 1 }, "decisive": { "by": {}, "proposal_public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "since": "2026-01-15T14:32:05Z", "unit_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10" }, "dimension": "quality", "exceptions": [ {} ], "fallback": "Ask", "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "language": "string", "learned_cases": [ { "action": "string", "action_line": "string", "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "kind": "string", "outcome": "string", "reviewed_at": "2026-01-15T14:32:05Z" } ], "measurement": { "guarded": 3, "incapable": 3, "shadowed": 3, "unchanged": 3, "window_days": 3, "would_change": 3 }, "messages": { "declare": "", "held": "", "notice": "" }, "mode": "string", "request_rule": { "lever": "effort_clamp", "params": {} }, "rules": [ "string" ], "sentence": "string", "status": "draft", "steer": "string" } ], "intents": { "enforceable": 3, "monitor_only": 3, "total": 3 }, "layer": { "inherited": false, "label": "string", "unit_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "zone_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10" }, "limits": { "cannot_prompt": 3, "in_scope": 3, "shell_only": 3 }, "mode": "string", "open_edit_draft": { "held_by": { "name": "release-bot" }, "public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "version": 3 }, "preset": { "application_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "preset_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "preset_name": "release-bot", "preset_policy_key": "string", "preset_version": 3 }, "provenance": { "copied_from": { "public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "version": 3 }, "preset": { "application_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "preset_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "preset_name": "release-bot", "preset_policy_key": "string", "preset_version": 3 }, "ratified_at": "2026-01-15T14:32:05Z", "ratified_by": "string", "ratified_by_kind": "string", "rationale": "string", "source_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "source_kind": "string", "source_name": "release-bot" }, "public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "read_only": false, "retired_at": "2026-01-15T14:32:05Z", "retired_by": { "kind": "user", "name": "release-bot" }, "statement": "string", "status": "string", "title": "string", "version": 3, "versions": [ { "change": "string", "ratified_at": "2026-01-15T14:32:05Z", "ratified_by_kind": "string", "version": 3 } ], "viewing_version": 3 }}