Retire an autonomy zone
DELETE/api/public/v1/zones/{zone_id}
The layer goes; the org unit stays. By default its ratified policies are deleted, each with its history and audit event (an AIP's zone is fixed for its life, so none is left in no zone; retired_policies counts them) — they are NOT moved to the parent, because that would widen them from this unit's agents to every agent under the parent, a policy change nobody approved. move_policies=true is the admin's opt-in: the policies move to the nearest surviving zone above, keeping their public_id and versions; a move that would create a same-layer Optimize conflict there answers 409 SAME_LAYER_CONFLICT, one that would loosen a layer above 409 LOOSENS_LAYER, and nothing is applied. Agents assigned to it by hand are re-pointed to the nearest surviving zone above and stay assigned by hand; automatic agents re-resolve on their own. The default flag clears with the zone. dry_run=true answers the impact and writes nothing. The root answers 409 ROOT_ZONE.
curl --fail-with-body -X DELETE 'https://app.openlatch.ai/api/public/v1/zones/<zone_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY"import jsonimport osimport urllib.request
request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/zones/<zone_id>', method='DELETE', 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 DELETE 'https://app.openlatch.ai/api/public/v1/zones/<zone_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY" | jq .$headers = @{ Authorization = "Bearer $env:OPENLATCH_API_KEY"}Invoke-RestMethod -Method DELETE -Uri 'https://app.openlatch.ai/api/public/v1/zones/<zone_id>' -Headers $headers | ConvertTo-Json -Depth 20Authorization
Section titled “Authorization”| Role in the organization | This endpoint |
|---|---|
owner | Allowed |
admin | Allowed |
editor | Not allowed |
viewer | Not allowed |
A key carries the role its owner holds in the organization. See Authentication.
API key scope: zones:write
Path parameters
Section titled “Path parameters”| Parameter | Type | Description |
|---|---|---|
zone_id | string (uuid) | Required. |
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
move_policies | boolean | Move the zone's policies to the nearest zone above instead of deleting them. |
dry_run | boolean | Answer the impact and change nothing. |
Header parameters
Section titled “Header parameters”| Parameter | Type | Description |
|---|---|---|
Idempotency-Key | string or null | Optional. Makes the request safe to retry: the same key and the same request, within 24 hours, returns the stored response with Idempotent-Replayed: true and runs once. |
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 —
NOT_FOUND,ZONE_NOT_FOUND - 409 Conflict —
IDEMPOTENCY_IN_PROGRESS,LOOSENS_LAYER,ROOT_ZONE,SAME_LAYER_CONFLICT - 422 Unprocessable Content —
IDEMPOTENCY_KEY_REUSED,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,PROOF_UNAVAILABLE,SERVICE_UNAVAILABLE
Example response
Section titled “Example response”{ "detached_policies": 0, "fallback_zone_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "moved_agents": 3, "moved_policies": 0, "repointed_by_hand": 0, "retired_policies": 3, "stricter_on_target": 0, "unattached_after": 0}