---
title: "Get a case"
method: GET
path: "/v1/projects/{project_id}/playbook-cases/{case_id}"
tags: ["Playbooks"]
---

# Get a case

`GET /v1/projects/{project_id}/playbook-cases/{case_id}`

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/playbook-cases/{case_id}`
- 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 a case with every node's state, computed from its entries on each read and never stored.

## Path parameters

- `case_id` string, required

## Response `200`

The case

- PlaybookCase
  - `id` string
  - `project_id` string
  - `playbook_id` string
  - `playbook_version` integer: The version the case was created on and is evaluated against
  - `subject` string
  - `revision` integer: The case's revision counter; every entry takes the next value
  - `automation_status` 'idle' | 'running' | 'waiting' | 'paused': `paused` while a pause of the case or of its project stands, else `running` while an execution is queued or runs its executor, else `waiting` while every execution in flight waits on a workflow task or orchestration run it started, else `idle`
  - `pause_requested_at` string, date-time, nullable: When the case was paused; null while it runs
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `nodes` PlaybookCaseNode[]: Every node of the case's version, in definition order
    - `id` string
    - `state` 'blocked' | 'ready' | 'running' | 'waiting' | 'done' | 'stale' | 'failed' | 'rejected': `blocked` while a required input is unset or reads a node that is not `done`; `ready` when it can run; `running` while its execution is queued or runs its executor; `waiting` while it waits on the workflow task or orchestration run it started, named by `run`; `done` when its output is current; `stale` when an input changed after its output was produced; `failed` when its execution failed on its current inputs; `rejected` when a person rejected its current inputs.
    - `missing` string[]: Required inputs that are unset or refused by their schema
    - `blocked_by` string[]: Nodes it reads that must be `done` first
    - `run` PlaybookNodeRun
      - `type` 'task' | 'orchestration_run', required
      - `id` string, required: The task's or orchestration run's ID
      - `state` string, nullable: A task's workflow state; absent for a run, null once the task no longer exists
      - `automation_status` string, nullable: A task's automation status: `failed` when its state's dispatch failed and no `on_failure` routes it, so the task waits on a person to move it. Absent for a run.
      - `status` string, nullable: A run's status, such as `awaiting_input`; absent for a task, null once the run no longer exists
    - `inputs` object[]
      - `name` string
      - `value` unknown
      - `revision` integer, nullable: The revision of the entry the value comes from
    - `output` object, nullable
      - `value` unknown
      - `revision` integer

## Other responses

- `401`: Unauthorized
- `404`: Case not found

---

[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)
