Read an agent's ownership
GET/api/public/v1/agents/{agent_id}/ownership
Owner (or service + accountable ref), function, the stored resolution evidence as signals, and the owner's directory freshness — served verbatim from stored state. Never re-runs the ladder and makes no directory call. A not-yet-resolved agent returns owner_kind: null with every signal outcome not_evaluated — bar a shared-key provideracct, which is ignored.
curl --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/ownership' \ -H "Authorization: Bearer $OPENLATCH_API_KEY"import jsonimport osimport urllib.request
request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/ownership', 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/agents/<agent_id>/ownership' \ -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/agents/<agent_id>/ownership' -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: agents:read
Path parameters
Section titled “Path parameters”| Parameter | Type | Description |
|---|---|---|
agent_id | string | Required. |
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 |
|---|---|---|
capture_capable | boolean | |
function | string or null | |
function_confidence | number or null | |
function_source | string or null | |
owner | object or null | |
owner.display_name | string or null | |
owner.email | string or null | |
owner.org_unit | object or null | |
owner.person_id | string | Required. |
owner.privilege | object or null | |
owner.status | string | Required. |
owner.title | string or null | |
owner_kind | string or null | |
owner_resolved_at | string (date-time) or null | |
owner_source | string or null | |
provider | object or null | |
provider.display_name | string | Required. |
provider.id | string | Required. |
provider.kind | string | Required. |
provider.last_synced_at | string (date-time) or null | |
provider.stale | boolean | |
service | object or null | |
service.accountable_org_unit | object or null | |
service.accountable_person | object or null | |
service.label | string or null | |
signals | array of object | |
signals[].kind | string | Required. |
signals[].outcome | string | Required. |
signals[].value | string or null | |
unattributed_reason | string or null | |
unattributed_since | string (date-time) or null |
Example response
Section titled “Example response”{ "capture_capable": true, "function": "string", "function_confidence": 0.25, "function_source": "string", "owner": { "display_name": "release-bot", "email": "ada@example.com", "org_unit": { "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "name": "release-bot", "path": "Engineering / Platform" }, "person_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "privilege": { "capabilities": {}, "evaluated_at": "2026-01-15T14:32:05Z", "grant_count": 0, "grant_counts": {}, "tier": "string" }, "status": "string", "title": "string" }, "owner_kind": "string", "owner_resolved_at": "2026-01-15T14:32:05Z", "owner_source": "string", "provider": { "display_name": "release-bot", "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "kind": "string", "last_synced_at": "2026-01-15T14:32:05Z", "stale": false }, "service": { "accountable_org_unit": { "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "name": "release-bot", "path": "Engineering / Platform" }, "accountable_person": { "display_name": "release-bot", "email": "ada@example.com", "org_unit": {}, "person_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "privilege": {}, "status": "string", "title": "string" }, "label": "string" }, "signals": [ { "kind": "string", "outcome": "string", "value": "string" } ], "unattributed_reason": "Never push to main without a review.", "unattributed_since": "2026-01-15T14:32:05Z"}