---
id: hold
title: Holds and the hold block
summary: What "Authorised, pending merchant confirmation" means and every field of the hold block.
faces: ["public", "agent"]
section: front-end
group: Accept a payment
order: 26
---
# Holds

When ripper cannot verify the amount a page asked for, it does not charge: it reserves the amount
and asks you to confirm. The shopper reads "Authorised, pending merchant confirmation — we've
reserved £42.00 on your card; Acme Coffee will confirm your order within 5 days and only then will
the money leave your account." `collect()` resolves `status: 'authorised'`.

```js run id=hold-authorised outcome=authorised
const result = await ripper.collect({ amount: 4200, currency: 'GBP' });
if (result.status === 'authorised') {
  // confirm or decline the hold in the console or in chat, before the deadline
}
```

The merchant reads (`GET /v1/payments/{id}`, the webhook body, the session read) carry `hold`:

| field | values |
|---|---|
| `status` | `pending_review`, `escalated`, `captured`, `voided` |
| `reason` | `no_price_list`, `mismatch` |
| `detail` | `amount_mismatch`, `unknown_item`, `currency_mismatch`, `overflow`, or null |
| `deadline` | ISO 8601 — an undecided hold is voided automatically after it |
| `decided_by` / `decided_at` | `policy`, `agent`, `merchant`, or `sweep` when the deadline passed; null until decided |
| `operation_refusal` | `{ kind, sequence, reason, decline_code, at }` or null — a capture or void the gateway refused; merchant-facing, the shopper render ignores it |

Webhooks: `payment.captured` (an immediate sale AND a later capture of a held payment),
`payment.held`, `payment.voided`, `payment.declined`, `payment.failed`.
