FAILED: a decline (data.status: "DECLINED") is the acquirer’s 00 approval code’s counterpart in a defined set of decline codes. Every other non-00 code — including gateway- or host-level errors — maps to FAILED instead, which carries a different meaning (it isn’t a card decline, and isn’t a guarantee that no funds moved). See Payment lifecycle for the full mapping.
How declines appear
- Payments API (purchase, authorize, standalone refund):
201withdata.status: "DECLINED"and a verbatimdata.response_codefrom the acquirer. - Hosted checkout: the checkout session’s
statusbecomesfailed; the shopper is returned to your rawcancel_url— see Verify the payment result. - Webhooks:
authorization.declined,payment.declined, orrefund.declined— see Webhook event types.
status — never on response_code (that’s the verbatim host/acquirer code; useful for support tickets, not for your app logic).
PENDING means the outcome isn’t known yet — most often after a processor timeout. Don’t assume success or failure. Recover it one of two ways:
- Wait for a webhook (
payment.*,authorization.*,refund.*— see Webhook event types). - Call
GET /v1/transactions/{id}/statusfor a live inquiry against the acquirer.
id yet — a client-side timeout before the first response arrived — replay the same request with the same request_id and body. The replay returns the stored transaction and its id, whatever status it’s reached. Never re-submit with a new idempotency key just because the first attempt is slow — that risks a second charge for the same order.
Branch on status, never response_code
response_code is the verbatim acquirer/host response code. It’s useful to
hand to support when investigating a specific transaction — never use it to
drive your own application logic. RadiumOne doesn’t currently expose a
normalized decline classification, a shopper-safe customer_message, or a
retry_allowed flag on declines . Treat every
DECLINED result the same way in code: it’s final for this attempt.
Shopper messaging
Don’t show the acquirer’s rawresponse_code, or any other RadiumOne-internal
detail, to the shopper. Use a generic message — for example, “Your payment
couldn’t be completed. Try a different card or payment method.” — and let
your own support tooling look up response_code later if you need to
investigate.
Retry guidance
- A decline is final for this attempt. Don’t retry the same
request_idhoping for a different outcome — a replay returns the identical decline. - A genuinely new attempt — the shopper enters a different card, or
changes something and tries again — is a new payment: mint a new
request_idfor it. - Never treat a timeout, a
5xx, or aPENDINGresult as a decline. Those aren’t declines at all. Retry with the samerequest_id(oroperation_id), or poll status, per Timeouts and retries. Minting a new key after a timeout risks a duplicate charge; minting one after a genuine decline is correct.
Publishable decline codes
RadiumOne hasn’t finalized which acquirer response codes are safe to publish as a lookup table . Until that’s settled, this page documents behavior and handling guidance only — build your branching logic onstatus, not on a hardcoded response-code table.
Test your integration
Use the decline test cards in Test your integration to exercise this path in sandbox.Next steps
Problem format and retries
HTTP status guide and retry rules for actual errors, plus links to the full URN catalog.
Charge or authorize a payment
See the full decline response shape.
Handle declined payments
The step-by-step scenario walkthrough.