List learning proposals
GET/api/public/v1/learning-proposals beta
Newest first. zone_id scopes to that zone and every zone below it (absent: every zone). state (default open) and kind repeat, their values ORed. limit defaults to 50 and caps at 100, so the first page holds every open proposal; cursor is the previous page's next_cursor.
curl --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/learning-proposals' \ -H "Authorization: Bearer $OPENLATCH_API_KEY"import jsonimport osimport urllib.request
request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/learning-proposals', 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/learning-proposals' \ -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/learning-proposals' -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: proposals:read
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
zone_id | string (uuid) or null | |
state | array of string — one of open, accepted, dismissed, superseded, expired or null | |
kind | array of string — one of monitor_to_enforce, dictionary_value, decisive_declaration, regression_case or null | |
cursor | string or null | |
limit | integer |
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 - 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 —
FEATURE_STATE_UNAVAILABLE,SERVICE_UNAVAILABLE
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
data | object | Required. |
data.next_cursor | string or null | |
data.proposals | array of object | Required. |
data.proposals[].case | object or null | |
data.proposals[].changed | object or null | |
data.proposals[].decided_at | object or null | |
data.proposals[].decided_by | object or null | |
data.proposals[].direction | string — one of tightens, neutral, widens | Required. |
data.proposals[].evidence | object or null | |
data.proposals[].expires_at | string (date-time) | Required. |
data.proposals[].input_digest | string | Required. |
data.proposals[].intent_policy | object or null | |
data.proposals[].kind | string — one of monitor_to_enforce, dictionary_value, decisive_declaration, regression_case | Required. |
data.proposals[].opened_at | string (date-time) | Required. |
data.proposals[].policy | object or null | |
data.proposals[].public_id | string | Required. |
data.proposals[].result | object or null | |
data.proposals[].state | string — one of open, accepted, dismissed, superseded, expired | Required. |
data.proposals[].table_name | object or null | |
data.proposals[].value | object or null | |
data.proposals[].zone | object or null |
Example response
Section titled “Example response”{ "data": { "next_cursor": "string", "proposals": [ { "case": { "action_line": "string", "kind": "string", "outcome_today": "string" }, "changed": { "sample": [ {} ], "to_allow": 0, "to_ask": 0, "to_block": 0 }, "decided_at": "2026-01-15T14:32:05Z", "decided_by": { "kind": "user", "name": "release-bot" }, "direction": "tightens", "evidence": { "action": "string" }, "expires_at": "2026-01-15T14:32:05Z", "input_digest": "string", "intent_policy": { "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "sentence": "string" }, "kind": "monitor_to_enforce", "opened_at": "2026-01-15T14:32:05Z", "policy": { "name": "release-bot", "public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "version": 3 }, "public_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "result": {}, "state": "open", "table_name": "release-bot", "value": "string", "zone": { "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "name": "release-bot" } } ] }}