---
title: "List activity feed entries"
method: GET
path: "/v1/projects/{project_id}/activity"
tags: ["Activity"]
---

# List activity feed entries

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

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/activity`
- 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 activity entries for a project, newest first, filterable by kind, severity, agent, generation and orchestration run — every filter composable with the rest. Paginated with an opaque cursor rather than offset/limit — pass the previous page's `next_cursor` to fetch the next one; a `null` `next_cursor` means there is no more data.

## Query parameters

- `kind` 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired' | 'share_cap_exceeded' | 'share_resumed' | 'share_revoked' | 'share_suspended' | 'tool_resolution_failed' | 'usage_quantity_invalid'
- `severity` 'info' | 'warning' | 'critical'
- `agent_id` string
- `generation_id` string
- `orchestration_run_id` string
- `cursor` string
- `limit` integer

## Response `200`

Page of activity entries

- object
  - `data` ActivityEntry[], required
    - `id` string
    - `project_id` string
    - `kind` 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired' | 'share_cap_exceeded' | 'share_resumed' | 'share_revoked' | 'share_suspended' | 'tool_resolution_failed' | 'usage_quantity_invalid': How the entry was produced. `tool_resolution_failed` means a tool binding contributed no tool to the turn — its source could not be reached or refused the listing, or the listing was read and left nothing to attach — so the turn ran without it. The generation itself completes, carrying no error, so this is the only signal that it answered with fewer tools than it was configured to have. `share_suspended`, `share_resumed` and `share_revoked` land in a consumer project when the publisher of a share it accepted suspends, resumes or revokes it; `ref_id` is the share and `detail` names the resource and the publisher project. `share_cap_exceeded` lands in the consumer project when a call through a share it accepted is refused by the share's `cap`. `usage_quantity_invalid` lands in the project a tool call is metered in when a resource price row's `quantity` reads no finite number >= 0; `ref_id` is the tool.
    - `severity` 'info' | 'warning' | 'critical'
    - `summary` string: One-line, human-readable description
    - `detail` object, nullable: Kind-specific structured context (tool, args digest, node id, guardrail policy version)
    - `orchestration_run_id` string, nullable: Originating orchestration run, if any
    - `agent_id` string, nullable: Associated agent, if any
    - `generation_id` string, nullable: The agent generation the entry was produced during, if any. Filter on it with the `generation_id` query parameter to read everything one turn did.
    - `ref_id` string, nullable: Producer-specific reference (the approval, exception, or trigger firing id the entry came from, or the executed tool's id)
    - `created_at` string, date-time
  - `next_cursor` string, nullable, required: Pass as `cursor` to fetch the next page; `null` when this is the last page

## Other responses

- `400`: Malformed cursor
- `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)
