Declines and Retries
When a charge you initiate is declined, your system decides whether it may try again. Card schemes monitor retry behaviour, so route on the category of the response code first and the individual code second.
Decline categories
| Category | Retry | Meaning | Action |
|---|---|---|---|
| Soft decline | Yes, with increasing intervals | A temporary failure — insufficient funds, a processing timeout, or the issuer briefly unavailable | Schedule reattempts with increasing gaps, within scheme limits |
| Step-up | No | The issuer requires your customer to authenticate | Do not retry without your customer. Send a payment link so they can authorise the payment |
| Hard decline | Never | A permanent failure — lost or stolen card, closed account, expired card, or recurring charges blocked | Delete the stored token and ask your customer for a new payment method |
Scheme retry limitsCard schemes monitor retry patterns. Retrying a hard decline, or exceeding 15 attempts in 30 days, can lead to scheme non-compliance fines and lower approval rates.
Response codes
The Message column shows the scheme response description. For every code across N-Genius Online, see Error Codes — Details & Description.
| Code | Message | Cause | Category | Action |
|---|---|---|---|---|
00 | Successful approval/completion | The charge was approved | Success | Fulfil the order and send your customer an itemised receipt |
51 | Insufficient funds | Not enough funds in the account | Soft decline | Retry with increasing intervals — for example day 1, day 3, day 5 |
91 | Issuer or switch inoperative | The issuer or network is temporarily unavailable | Soft decline | Retry after a short interval, between 15 minutes and 2 hours |
05 | Do not honor | A generic decline from the issuer | Soft decline or step-up | Retry once after 24 hours. If it fails again, ask your customer to approve the payment themselves |
1A / 65 | Activity count / Velocity limit exceeded | Your customer's daily or monthly transaction limit has been reached | Soft decline | Retry after 24 to 48 hours |
82 | Strong Customer Authentication Required | The issuer requires 3-D Secure authentication | Step-up | Do not retry. Send your customer a payment link |
14 | Invalid card number / Account Not Found | The card number or account does not exist | Hard decline | Delete the token and ask your customer to update their payment method |
54 | Expired card | The card has expired | Hard decline | Stop charging and ask your customer for their renewed card details |
41 / 43 | Lost / Stolen card (Pick up) | The card has been reported lost or stolen | Hard decline | Delete the token immediately and flag the account in your risk monitoring |
57 | Transaction not permitted to issuer | Your customer or the issuer has blocked recurring charges on this card | Hard decline | Ask your customer for a different card |
Example responses
Soft decline — insufficient funds (51)
{
"_id": "urn:payment:f47ac10b-58cc-4372-a567-0e02b2c3d479",
"reference": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"state": "FAILED",
"amount": {
"currencyCode": "AED",
"value": 4500
},
"authResponse": {
"success": false,
"resultCode": "51",
"resultMessage": "Insufficient funds",
"recommendation": "RETRY_LATER",
"rrn": "418412259981"
},
"updateDateTime": "2026-09-07T11:18:22.000Z"
}Step-up — authentication required (82)
{
"_id": "urn:payment:88b23f1a-641e-42c2-843b-28fec8a21102",
"reference": "88b23f1a-641e-42c2-843b-28fec8a21102",
"state": "DECLINED",
"amount": {
"currencyCode": "AED",
"value": 12000
},
"authResponse": {
"success": false,
"resultCode": "82",
"resultMessage": "Strong Customer Authentication (SCA) / 3DS Required",
"actionRequired": "STEP_UP_TO_CIT"
},
"_links": {
"customerCheckout": {
"href": "https://merchant.example.com/pay/authenticate?orderId=88b23f1a-641e-42c2-843b-28fec8a21102"
}
}
}Hard decline — lost card (41)
{
"_id": "urn:payment:d1234567-89ab-cdef-0123-456789abcdef",
"reference": "d1234567-89ab-cdef-0123-456789abcdef",
"state": "FAILED",
"authResponse": {
"success": false,
"resultCode": "41",
"resultMessage": "Lost card - Pick up",
"recommendation": "DO_NOT_RETRY_CARD_REVOKED"
},
"errors": [
{
"code": "CARD_REVOKED",
"message": "Card has been reported lost/stolen. Do not initiate further retries on this token."
}
]
}Handling a response
Route on the category, not on individual codes scattered through your logic. The helper functions are yours to implement.
# Categories follow the response code table on this page.
# [QUERY 1, QUERY 2] Confirm the categories of 82 and 1A before relying on them.
SOFT_DECLINE = {"51", "91", "05", "1A", "65"}
STEP_UP = {"82"}
HARD_DECLINE = {"14", "41", "43", "54", "57"}
# [QUERY 7] Confirm the scheme retry limits.
MAX_ATTEMPTS = 15
RETRY_WINDOW_DAYS = 30
def handle_mit_response(payment, attempt_count, days_since_first_attempt):
auth = payment.get("authResponse", {})
code = auth.get("resultCode")
if code == "00":
mark_order_as_paid(payment["reference"])
send_receipt(payment)
return "PAID"
if code in SOFT_DECLINE:
if attempt_count < MAX_ATTEMPTS and days_since_first_attempt <= RETRY_WINDOW_DAYS:
schedule_retry(payment["reference"], backoff_hours(attempt_count))
return "RETRY_SCHEDULED"
request_new_payment_method(payment["reference"])
return "RETRIES_EXHAUSTED"
if code in STEP_UP:
link = payment.get("_links", {}).get("customerCheckout", {}).get("href")
send_payment_link(link)
return "CUSTOMER_ACTION_REQUIRED"
if code in HARD_DECLINE:
# Hard-decline responses may not include savedCard,
# so revoke the token you stored against this customer.
revoke_stored_token(payment["reference"])
request_new_payment_method(payment["reference"])
return "CARD_REVOKED"
log_unhandled_code(code, auth)
return "UNHANDLED"
