---
title: "Approve or decline a proposal that runs a call"
method: POST
path: "/api/v1/approvals/{id}/decision"
tags: ["Desk"]
---

# Approve or decline a proposal that runs a call

`POST /api/v1/approvals/{id}/decision`

## Request

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

For a card with `runsCall`: a change asked for by mail, or a reply waiting to be sent. Approving runs the call the card holds as you, through the endpoint the screen would use, so its checks are that endpoint’s; declining runs nothing. Only a person signed in decides one: a token is refused.

## Path parameters

- `id` string, required

## Request body

- object
  - `approve` boolean, required: True carries the proposal out; false declines it and nothing runs.
  - `edited` string: Your own wording of a message preview, sent in place of the draft.
  - `note` string: Why, kept on the card.
  - `cancel` boolean: Only with approve false: the card is cancelled because its subject went away, rather than declined.

## Response `200`

The card as decided, and what the call answered.

- object
  - `ok` unknown, required
  - `data` object, required
    - `approval` object, required
      - `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.
    - `ran` object, nullable, required: What the endpoint said when the call ran. Null where it was declined or already decided.
      - `ok` boolean, required
      - `status` number, required
      - `message` string, nullable, required
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `403`: Not a person signed in.
- `404`: No such card on this team.
- `422`: The card runs no call, or the call is no longer one this API takes.

---

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