---
title: "List exception items"
method: GET
path: "/v1/projects/{project_id}/exceptions"
tags: ["Exceptions"]
---

# List exception items

`GET /v1/projects/{project_id}/exceptions`

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/exceptions`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.naturali.ai/authorize`, token URL `https://api.naturali.ai/token`, scopes: `mcp:access`)

Returns exception items for a project, filterable by status, severity, and kind.

## Query parameters

- `status` string[]
- `severity` 'info' | 'warning' | 'critical'
- `kind` 'run_failed' | 'guardrail_tripwire' | 'approval_expired' | 'quota_unpriced' | 'event_trigger_loop' | 'chain_limit' | 'manual'
- `limit` integer
- `offset` integer

## Response `200`

List of exception items

- object
  - `data` ExceptionItem[], required
    - `id` string
    - `project_id` string
    - `status` 'open' | 'acknowledged' | 'resolved'
    - `severity` 'info' | 'warning' | 'critical'
    - `kind` 'run_failed' | 'guardrail_tripwire' | 'approval_expired' | 'quota_unpriced' | 'event_trigger_loop' | 'chain_limit' | 'manual': How the exception was filed
    - `title` string: Human-readable one-line summary
    - `detail` object, nullable: Structured context (tool, args digest, error message, guardrail version)
    - `occurrence_count` integer: How many times this exact failure has been observed while open
    - `last_seen_at` string, date-time: Timestamp of the most recent occurrence
    - `orchestration_run_id` string, nullable: Originating orchestration run
    - `node_id` string, nullable: Originating node id within the run's graph
    - `agent_id` string, nullable: Associated agent
    - `guardrail_version` string, nullable: `<guardrailId>@<version>` for a guardrail_tripwire exception
    - `acknowledged_by_principal_type` 'user' | 'api_key' | 'agent' | 'automation' | 'approval' | 'system': What kind of principal acted. `user` and `api_key` are authenticated callers, and the id is the user's (`user_…`) or the key's own (`key_…`), so a record names which key acted rather than its owner. `agent` is an agent writing under its own identity (`agent_…`). `automation` is the task engine acting on a dispatch outcome and `approval` an approval resolution; neither carries an id. `system` is the platform itself, with an id naming the mechanism (`retention_sweep`, `zero_retention`).
    - `acknowledged_by_principal_id` string, nullable: Public id of that principal: the user (`user_…`), or for API key auth the key itself (`key_…`), so the record names which key acted.
    - `resolved_by_principal_type` 'user' | 'api_key' | 'agent' | 'automation' | 'approval' | 'system': What kind of principal acted. `user` and `api_key` are authenticated callers, and the id is the user's (`user_…`) or the key's own (`key_…`), so a record names which key acted rather than its owner. `agent` is an agent writing under its own identity (`agent_…`). `automation` is the task engine acting on a dispatch outcome and `approval` an approval resolution; neither carries an id. `system` is the platform itself, with an id naming the mechanism (`retention_sweep`, `zero_retention`).
    - `resolved_by_principal_id` string, nullable: Public id of that principal: the user (`user_…`), or for API key auth the key itself (`key_…`), so the record names which key acted.
    - `resolution_note` string, nullable: Optional note recorded at resolution
    - `created_at` string, date-time
    - `updated_at` string, date-time
  - `total` integer, required
  - `limit` integer, required
  - `offset` integer, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `500`: Internal server error

---

[API](https://skmtc.dev/naturali/apis/naturali-ai-api.md) · [All operations](https://skmtc.dev/naturali/apis/naturali-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/naturali/apis/naturali-ai-api/revisions/e4905b78f422?raw)
