---
title: "What the AI is waiting for a decision on"
method: GET
path: "/api/v1/approvals"
tags: ["Desk"]
---

# What the AI is waiting for a decision on

`GET /api/v1/approvals`

## Request

- Base URL: `http://localhost:5180`
- URL: `http://localhost:5180/api/v1/approvals`
- Auth: API key in cookie `better-auth.session_token`

Each request carries the rationale behind it, a preview of exactly what will happen, and `onExpiry`, which says what becomes of it if the owner never answers.

## Query parameters

- `status` 'pending' | 'approved' | 'rejected' | 'edited_and_approved' | 'expired' | 'auto_executed' | 'cancelled'

## Response `200`

Approval requests, newest first.

- object
  - `ok` unknown, required
  - `data` object, required
    - `approvals` object[], required: Newest request first.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `workflowRunId` string: Stable record id, e.g. `lse_012`.
      - `workflowId` string: Stable record id, e.g. `lse_012`.
      - `title` string, required
      - `description` string, required: Plain English: what will happen if this is approved.
      - `category` 'rent_collection' | 'arrears' | 'lease_lifecycle' | 'maintenance' | 'compliance' | 'move_in_out' | 'communication' | 'vacancy' | 'finance' | 'short_stay' | 'reporting', required
      - `requestedAt` string, required: ISO 8601 timestamp.
      - `expiresAt` string: When the fallback in `onExpiry` takes over.
      - `onExpiry` 'execute' | 'cancel' | 'hold', required: What happens if the owner never answers.
      - `urgency` 'high' | 'medium' | 'low', required
      - `subject` object, required
        - `kind` string, required: Which kind of record this points at, for example `lease`, `unit` or `invoice`.
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `label` string, required: How the record reads to a person, so a trail can be followed without a second lookup.
      - `preview` object: Exactly what the AI proposes to do, shown before it happens rather than reported after.
        - `kind` 'message' | 'document' | 'payment' | 'work_order' | 'price_change' | 'other', required
        - `content` string, required
        - `editable` boolean, required
        - `recipient` string
        - `amount` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `rationale` string, required: Why the AI recommends this.
      - `alternatives` object[]
        - `label` string, required
        - `description` string, required
      - `status` 'pending' | 'approved' | 'rejected' | 'edited_and_approved' | 'expired' | 'auto_executed' | 'cancelled', required
      - `decidedAt` string: ISO 8601 timestamp.
      - `decidedBy` object
        - `kind` 'owner' | 'ai' | 'tenant' | 'contractor' | 'system' | 'channel', required: `ai` is Dardaris acting on the owner’s behalf. Everything it touches is marked.
        - `id` string: Stable record id, e.g. `lse_012`.
        - `name` string, required
      - `decisionNote` string
      - `runsCall` boolean: True where approving runs a call the server holds: decide it at POST /approvals/{id}/decision.
    - `pending` number, required: How many are still waiting on the owner, whatever `status` filtered to.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `400`: `status` was not one of the documented states.

---

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