AI Objectives

Declared "keep this true" goals for your account. You state an objective — for example, keep p95 latency under 300 ms on an endpoint, or keep the error rate under 1% — and a reconciler evaluates it on a rolling window. When an objective is breached it either records the breach (observe), raises an Iris nudge that pre-seeds the assistant to diagnose and fix it (nudge), or — once autonomy is enabled for an actionable type — applies a dry-run-clean fix automatically (auto). Recovered objectives clear themselves.

Objectives are distinct from SLO targets (which drive the SLI display): objectives are multi-type, can be scoped to a single endpoint, and are actionable.

Account scope + permissions: objectives belong to your active account and require the traffic-inspector permission (read to list, write to change). Endpoint-scoped latency/error objectives need traffic capture enabled on that endpoint, otherwise they read back as insufficient data and never false-breach.

Objective types

latency_p95
p95 request latency (ms) over the window. Diagnose-only (origin fix) — auto not allowed.
error_rate
Percent of requests that errored (4xx/5xx excluding firewall/rate-limit blocks). Diagnose-only.
usage_cap
Percent of the account's data cap consumed. Diagnose-only.
cert_freshness
Minimum days until a certificate expires. Auto-eligible.
auto_block_score
Standing "block above reputation score" posture. Auto-eligible.
availability
Availability percentage.

List Objectives

GET/v1/account/objectives

Returns the account's declared objectives under an objectives array.

Create an Objective

POST/v1/account/objectives

Declares a new objective. The tuple (type, scope, endpoint) is unique per account — a duplicate returns 409.

Request body

objective_type string Req
One of the types above.
scope string
account (default) or endpoint.
endpoint_id int
Required when scope=endpoint.
comparator string Req
The desired relation: lt | lte | gt | gte (e.g. keep latency lt 300).
target_value float Req
The threshold, e.g. 300 (ms), 1.0 (%), 7 (days).
target_unit string
Display unit: ms | pct | days | score.
window_seconds int
Evaluation window. Defaults to 3600.
min_samples int
Minimum requests before the window is judged (no false breach on thin data). Defaults to 50.
autonomy_link string Req
observe | nudge | auto. auto is rejected for diagnose-only types and requires the ai_autonomy entitlement.
enabled bool
Whether the reconciler evaluates it.

Update / Delete an Objective

PUT/v1/account/objectives/{uuid}
DELETE/v1/account/objectives/{uuid}

PUT tunes an objective's parameters (its type, scope and endpoint are immutable — they form the unique target). DELETE removes it. Both return 404 for an unknown UUID.

Errors

400 Bad Request
Invalid type/comparator/autonomy_link, auto on a diagnose-only type, or a missing endpoint_id for an endpoint scope.
403 Forbidden
Missing traffic-inspector permission, or auto without the ai_autonomy entitlement.
404 / 409
404 unknown objective (PUT/DELETE); 409 an objective already exists for that (type, scope, endpoint).
Request — create
curl -X POST "https://api.ngris.com/v1/account/objectives" \ -H "X-API-KEY: <your_api_key>" \ -H "Content-Type: application/json" \ -d '{ "scope": "endpoint", "endpoint_id": 42, "objective_type": "latency_p95", "comparator": "lt", "target_value": 300, "target_unit": "ms", "window_seconds": 3600, "autonomy_link": "nudge", "enabled": true }'
Response — create (201 Created)
{ "uuid": "9d1c…", "account_id": 1, "scope": "endpoint", "endpoint_id": 42, "objective_type": "latency_p95", "comparator": "lt", "target_value": 300, "target_unit": "ms", "window_seconds": 3600, "min_samples": 50, "autonomy_link": "nudge", "enabled": true, "last_state": "unknown" }
Request — list
curl -X GET "https://api.ngris.com/v1/account/objectives" \ -H "X-API-KEY: <your_api_key>"
Request — delete
curl -X DELETE "https://api.ngris.com/v1/account/objectives/9d1c…" \ -H "X-API-KEY: <your_api_key>"
On this page
AI Objectives
Iris