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

# approve_statements

> Approve, as yourself, the validation-workflow stage awaiting you on up to 50 statements. One row per statement says what happened to it.

Approve, as yourself, the validation-workflow stage awaiting you on statements.

The usual chain: call
[`list_statements`](https://docs.qobra.co/mcp_documentation/tools/list_statements) with
`approver_id` set to your own id to find what awaits you, then call this tool
with those ids, at most 50 per call. Approving takes no write permission: you
approve as yourself, on the statements you can see where you are one of the
stage's approvers.

Each statement sent gets one row:

* `approved`: your approval is recorded on one stage.
* `skipped`, with the reason in `reason`: you are not one of its approvers,
  your stage waits on an earlier mandatory stage, your stages are already
  complete, it is already paid, no validation is requested on it, or it changed
  while the call ran.
* `failed` on Qobra's side, in which case the approval may be recorded.
  `reason` says what to do.

One call approves one stage per statement. When another stage still awaits you
on a statement, its row's `warning` says so, and another call approves it. To
approve a specific stage, pass its `stage_position` with a single statement id.

An approval cannot be undone. A stage completed by your approval moves the
workflow on, and Qobra notifies the approvers whose turn comes, as in the web
app. There is no rejection: an approval is the only decision a stage takes.
Once no mandatory stage awaits approval, pay the statement with
[`update_statements_status`](https://docs.qobra.co/mcp_documentation/tools/update_statements_status).

The whole call is refused before anything is approved when one id names no
statement you can see.

Available only where the Qobra write tools beta is enabled and the validation
workflow is switched on. Every approval in the live environment is
recorded in the audit trail as the `Qobra MCP` agent.

## Parameters

> [accordion] Body
>
> **statement\_ids** `string[]` *required*
>
> Ids of the statements to approve — list\_statements with `approver_id` set to
> your own id lists those awaiting you. At most 50 per call.
>
> **stage\_position** `integer`
>
> The 1-based position of one stage to approve, as get\_statement shows it
> under validation\_workflow, with a single statement id. Omit it to approve
> the stage awaiting you on each statement: your mandatory one first, else
> your first optional one.

## Example

```json theme={null}
{
  "statement_ids": ["66a0b1c2d3e4f50012345678", "66a0b1c2d3e4f50012345679"]
}
```

## Response

> [accordion] Body
>
> **statements** `object[]`
>
> One row per statement, in the order first sent: an id sent twice is approved
> and reported once.
>
> **object properties**
>
> **id** `string`
>
> **resource\_url** `string`
>
> Deep link to open this statement in the Qobra web app.
>
> **user** `object`
>
> **object properties**
>
> **id** `string`
>
> **email** `string`
>
> **name** `string`
>
> **period** `string`
>
> **outcome** `string`
>
> approved: your approval is recorded on one stage. skipped: nothing was
> approved, `reason` says why. failed: an error on our side interrupted
> it, so the approval may be recorded; `reason` says what to do. One of:
> `approved`, `skipped`, `failed`.
>
> **reason** `string`
>
> Why the statement was skipped or failed; null otherwise.
>
> **warning** `string`
>
> On an approved statement, another of its stages still awaiting your
> approval; null when nothing is left for you on it.
>
> **payment\_status** `string`
>
> After the call. What the statement's payment is waiting on:
>
> * blocked\_by\_error: a calculation error blocks locking and payment until
>   it is fixed.
> * awaiting\_lock: still open, its amounts can change; a statement is
>   locked before it can be paid.
> * awaiting\_approval: locked, but a mandatory stage of its validation
>   workflow is still waiting on an approver (see
>   `validation_workflow.blocking_stage`).
> * awaiting\_payroll: locked and nothing blocks it, not yet sent to
>   payroll.
> * paid: sent to payroll. One of: `blocked_by_error`, `awaiting_lock`,
>   `awaiting_approval`, `awaiting_payroll`, `paid`.
>
> **awaited\_approvers** `object[]`
>
> After the call, the approvers whose turn it is. Empty when nothing
> awaits an approval.
>
> **object properties**
>
> **user** `object`
>
> **object properties**
>
> **id** `string`
>
> **email** `string`
>
> **name** `string`
>
> **last\_reminded\_at** `string`
>
> When they were last reminded to approve; null if never.
