Skip to main content
When an issuer or acquirer refuses a payment, Therius returns a declined status on the synchronous response and fires a payment.refused webhook. Both carry a refusalCode object that tells you why the payment failed and what to do next.

The refusalCode object

Only reasonCode and recoveryAction are safe to build logic on. originalReasonCode / originalReason are passthrough diagnostics and their format is not stable across providers.

recoveryAction

Therius classifies every refusal into one of four recovery actions so your checkout can respond without hard-coding a decision for all 60+ codes.

retry

The decline may clear on a second attempt — a malformed or mistimed message, a system malfunction, or a generic issuer response (including “Do not honor”). Retrying the same card once is reasonable. Always cap retries at a small fixed number — do not loop.

switch_method

Retrying this card will not help (insufficient funds, expired card, restricted card), but a different payment method might succeed. Prompt the shopper to try another card or an alternative method.

terminal

A hard block — pickup/lost/stolen card, closed account, suspected fraud, or a revocation order. Do not offer a retry or an alternate method. Show a neutral failure message and stop.

update_data

Retrying as is will fail until something the shopper entered is corrected, such as a tax ID, a Pix key, a bank account or a name. Ask the shopper to fix the data, then submit again. Used by alternative payment methods.
An unrecognized or missing reasonCode is reported as switch_method — the safe default, since blindly retrying an unclassified decline risks card-scheme excessive-attempt penalties.
Card networks monitor repeated authorization attempts on a declined card (Visa VAMP, Mastercard excessive-attempts). Never retry a terminal decline, and never retry any decline more than a small, fixed number of times.

Automatic re-routing

Most soft declines are retried by Therius before you ever see them — smart routing cascades the payment to the next connection in the route. The decline you receive on the response is therefore the outcome after Therius has already exhausted the alternatives in that route. Hard declines (terminal above, plus a few others such as incorrect PIN and CVV failures) are returned immediately and are never re-routed, because retrying them on another acquirer would only add scheme violations.

Subscriptions and dunning

For subscription renewals, Therius applies the same classification internally: a terminal decline stops the dunning sequence immediately (the subscription goes to suspended and fires subscription.suspended), rather than wasting the remaining retry attempts on a card the issuer will never approve.

Refusal code reference

The normalized reasonCode values Therius can return, with their meaning and default recoveryAction. }

Alternative payment method codes

Refusals for alternative payment methods carry an APM_* reasonCode. The prefix is reserved: an APM_* value is never a card code. An alternative method refusal that Therius cannot classify is reported as APM_DECLINED, and a technical failure as APM_TECHNICAL_ERROR. The provider’s own code stays available in originalReasonCode.

Expired and canceled payments

When an alternative method payment ends as expired or canceled because the payer did not pay or walked away, the payment carries APM_EXPIRED or APM_PAYER_CANCELED, and GET /payment/inquiry returns a refusalCode for it with recoveryAction: retry. A cancel you request through the API carries no reason.

Automatic re-routing for alternative methods

Smart routing moves an alternative method payment to the next route step only when the refusal belongs to the connection: the method is not enabled, a merchant limit, the country or bank is not supported, a configuration problem, or the provider is unavailable. Refusals caused by the payer or the payer’s data, such as insufficient funds or an invalid document, are returned to you directly, because another provider would get the same answer.
Build exhaustive handling on recoveryAction, not on individual codes, and handle all four values. New APM_* codes can be added over time; an unknown code is still accompanied by a valid recoveryAction.