> ## Documentation Index
> Fetch the complete documentation index at: https://agents.concierca.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Approvals

> Human-in-the-loop approval list and resolve.

**Human-in-the-loop (HITL) approvals** are the platform's safety gate: risky agent actions (sending messages, spending money, triggering runs) park as a pending approval until a human decides — via Telegram buttons, the in-app approvals inbox, or these tools.

***

## `approval_list`

List HITL approvals in this workspace. Default: pending. Shows what is waiting for a human decision.

| Name     | Type   | Required | Description                                                              |
| -------- | ------ | -------- | ------------------------------------------------------------------------ |
| `status` | string | no       | `pending` (default) \| `approved` \| `rejected` \| `discussion` \| `all` |
| `limit`  | number | no       | Max rows                                                                 |

**Returns:** `{ approvals: [...], count }`. Each row: `id, question, action_type, status, requested_by_agent_id, requested_by_user_id, requested_at, resolved_at, telegram_chat_id`.

**Permissions:** read; workspace-scoped.

```json theme={null}
{ "method": "tools/call", "params": { "name": "approval_list", "arguments": { "status": "pending" } } }
```

## `approval_resolve`

Approve or reject a pending approval from outside. **Caution: this is the human gate — only call it when the human user explicitly decided.** Approving executes the approved action deterministically (the same machinery as a Telegram tap).

| Name       | Type   | Required | Description           |
| ---------- | ------ | -------- | --------------------- |
| `id`       | string | yes      | Approval uuid         |
| `decision` | string | yes      | `approve` \| `reject` |

**Returns:** `{ ok:true, status:"approved"|"rejected" }`. On approve the `if_approved` action is triggered deterministically; on reject an `if_rejected` follow-up run may fire. If the decision was recorded but the execution trigger failed, a `warning` field is added. Already-resolved or race-lost → `{ error }`. Requires Company-Admin.

**Permissions:** write; human-decided only.

```json theme={null}
{ "method": "tools/call", "params": { "name": "approval_resolve", "arguments": {
  "id": "<approval-uuid>", "decision": "approve"
} } }
```
