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'.
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.