Skip to main content
When a transaction has status: DECLINED, the response carries a declineReason object that explains why.
Only message is written for the cardholder. code is for your integration.
  • code is a machine-readable identifier for your backend logic, monitoring, and support tooling. Branch on it to route the cardholder to a top-up screen, prompt for a PIN re-entry, surface a “card blocked” support flow, alert your on-call team, and so on. Do not show the code, or a label derived from it, to end users: some codes describe your own systems rather than anything the cardholder did.
  • message is plain English copy safe to show the cardholder as it is. You can also write your own copy keyed off code when you want fuller control over the experience.
This page groups every code that can appear in declineReason.code by what your integration or the cardholder can do about it. For lifecycle context (when a decline is recorded, what webhook fires) see Decline at authorization.

Cardholder can self-resolve

The cardholder can take an action and retry.

Network-mandated limits

The transaction exceeded a limit enforced by the platform. Trying a smaller amount or waiting for the limit window to reset usually resolves it.

Merchant or transaction restriction

The card cannot be used for this particular transaction. The cardholder should use a different payment method or merchant; retrying the same flow will not help.

Spending policy controls

The transaction was blocked by a spend policy you configured. The declined transaction also carries a policy reference naming the exact policy responsible, so you can tell which rule fired. Retrying the same transaction will not help until the limit window resets or the policy is changed.

Requires support or program action

The card or account is in a state that the cardholder cannot resolve themselves - your team needs to act, or the cardholder needs to contact support.

Security

Your authorization endpoint

External authorization projects only. Reap fails closed: when your authorization endpoint does not return a valid decision, Reap declines the transaction. These codes tell you the decline came from your endpoint, so you can investigate on your side without contacting Reap support. The decline carries the same transactionId and eventId Reap sent your endpoint, so you can find the request in your own logs. See Reconciliation. The cardholder message for both codes is a generic “couldn’t be completed” message that does not mention your systems.

Catch-all

If you need the underlying reason for a specific transaction that came back as INTERNAL_ERROR, contact Reap support with the transaction ID.