Declines and Retries

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

CategoryRetryMeaningAction
Soft declineYes, with increasing intervalsA temporary failure — insufficient funds, a processing timeout, or the issuer briefly unavailableSchedule reattempts with increasing gaps, within scheme limits
Step-upNoThe issuer requires your customer to authenticateDo not retry without your customer. Send a payment link so they can authorise the payment
Hard declineNeverA permanent failure — lost or stolen card, closed account, expired card, or recurring charges blockedDelete the stored token and ask your customer for a new payment method
❗

Scheme retry limits

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

CodeMessageCauseCategoryAction
00Successful approval/completionThe charge was approvedSuccessFulfil the order and send your customer an itemised receipt
51Insufficient fundsNot enough funds in the accountSoft declineRetry with increasing intervals — for example day 1, day 3, day 5
91Issuer or switch inoperativeThe issuer or network is temporarily unavailableSoft declineRetry after a short interval, between 15 minutes and 2 hours
05Do not honorA generic decline from the issuerSoft decline or step-upRetry once after 24 hours. If it fails again, ask your customer to approve the payment themselves
1A / 65Activity count / Velocity limit exceededYour customer's daily or monthly transaction limit has been reachedSoft declineRetry after 24 to 48 hours
82Strong Customer Authentication RequiredThe issuer requires 3-D Secure authenticationStep-upDo not retry. Send your customer a payment link
14Invalid card number / Account Not FoundThe card number or account does not existHard declineDelete the token and ask your customer to update their payment method
54Expired cardThe card has expiredHard declineStop charging and ask your customer for their renewed card details
41 / 43Lost / Stolen card (Pick up)The card has been reported lost or stolenHard declineDelete the token immediately and flag the account in your risk monitoring
57Transaction not permitted to issuerYour customer or the issuer has blocked recurring charges on this cardHard declineAsk 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"
© Network International LLC. All Rights Reserved.