Skip to main content

Error Codes

This guide documents the most common ePay API error codes, what they mean, and how to respond to them.

Response format​

Most API errors follow this structure:

{
"success": false,
"errorCode": "SOME_ERROR_CODE",
"message": "Human readable message"
}

Common error codes​

error_codedescription
SCA_EXPIRED3DS / SCA authentication session expired
INSUFFICIENT_FUNDSAccount lacks sufficient funds or credit
REJECTED_BY_SCA3DS / SCA authentication failed or declined by issuer
DO_NOT_HONORGeneric decline from issuer—no specific reason
EXPIREDOperation expired before completion
SCA_CANCELLED_BY_USERUser canceled 3DS / SCA authentication process
REJECTED_BY_MERCHANTMerchant intentionally declined the payment
CARD_EXPIREDCard expired—use updated card details
CANCELLED_BY_USERCustomer canceled the payment
CARD_LOST_OR_STOLENCard reported lost or stolen—must not retry
ACQUIRER_DECLINEDAcquirer declined authorization
CARD_RESTRICTEDCard restricted—transaction type not allowed
SUSPECTED_FRAUDDeclined due to suspected fraudulent activity
ACQUIRER_DOWNAcquirer network temporarily unavailable
AMOUNT_LIMIT_EXCEEDEDAmount exceeds card or issuer transaction limit
INVALID_CARD_NUMBERCard number invalid or not recognized
CARD_BLOCKEDCard blocked—contact issuer
CARD_CLOSEDCard account closed by issuer
DECLINED_BY_ISSUER_OR_SCHEMEIssuer or card network declined transaction
SCA_REQUIRED3DS / SCA authentication required before authorization
MISSING_ACQUIRER_AGREEMENTMerchant–acquirer contract not configured
INVALID_CVCSecurity code (CVC/CVV) incorrect
ACQUIRER_TIMEOUTAcquirer did not respond within time limit
AGE_VERIFICATION_NOT_COMPLETEDRequired age verification was not completed
ISSUER_DOWNIssuer system unavailable—try again later
INVALID_AGREEMENTInvalid or missing merchant setup agreement
SYSTEM_ERRORMessage or processing format error
REJECTED_UNKNOWNTransaction rejected for unspecified reason
MANUAL_ABORTEDTransaction manually stopped
TIMEOUT_ABORTEDProcess aborted due to timeout
PRE_AUTH_FAILEDPre‑authorization attempt unsuccessful
CARD_PIN_ISSUEWrong or unverifiable PIN
DUPLICATE_TRANSACTIONSame transaction already processed
TIMEOUTOperation timed out before issuer response
ACQUIRER_ERRORError or malformed response from acquirer
OPERATION_NOT_SUPPORTEDOperation type not supported by system/card
REJECTED_BY_ISSUERTransaction declined directly by issuer
UNSUPPORTED_SCHEMECard scheme not supported for this merchant
SECURITY_VIOLATIONSecurity or data integrity check failed
INVALID_3DS_AGREEMENTInvalid or missing 3DS / SCA configuration
RULE_VIOLATIONBlocked by scheme or issuer transaction rules
TECHNICAL_FAILURETechnical failure during authorization process
INCONSISTENT_TRANSACTION_DATATransaction data inconsistent or corrupted
WITHDRAWAL_LIMITWithdrawal count or value limit exceeded
VALIDATION_ERRORRequest parameters failed validation checks
TERMINAL_NOT_FOUNDTerminal or POS device not recognized
FAILED_REQUESTTransaction request could not be processed
PIN_TIMEOUTPIN entry not completed within time allowed
TRY_AGAINTemporary issue—please retry shortly
SERVER_ERRORUnexpected server or integration error

External status codes in webhooks​

In the notification webhook, the transaction object may also contain externalStatusCodes.

This object exposes any known raw or near-raw status codes returned by the underlying payment systems, such as the acquirer, the card network, the terminal, or the SCA flow.

This is useful if you want to handle specific rejection reasons differently than the normalized errorCode returned by ePay.

How it relates to errorCode​

  • transaction.errorCode is ePay's interpreted and normalized error code.
  • transaction.externalStatusCodes contains the more specific underlying status codes when they are known.
  • If you only need a stable cross-provider integration, handle errorCode.
  • If you need provider-specific behavior, inspect externalStatusCodes as an additional input.

Example​

{
"transaction": {
"state": "FAILED",
"errorCode": "DO_NOT_HONOR",
"externalStatusCodes": {
"acquirer": "05",
"network": "05",
"sca": "N07"
}
}
}

In this example, ePay has interpreted the failure as DO_NOT_HONOR, while the webhook still gives you access to the more specific underlying values through externalStatusCodes.

Available fields​

  • acquirer: The status code returned by the processing acquirer.
  • network: The status code returned by the card scheme network.
  • terminal: The status code returned by the terminal provider for in-person terminal payments.
  • sca: A unified status code representing the outcome of the SCA flow, such as 3DS.

externalStatusCodes is nullable, and individual keys are only present when the value is known to ePay.

How to use this guide​

  • Check the HTTP status code first.
  • Use errorCode for programmatic handling.
  • Use message for logging and debugging, not control flow.