--- title: "Testing result codes and refusal reasons" description: "Test getting result codes and refusal reasons with your integration and troubleshoot issues before going live." url: "https://docs.adyen.com/development-resources/testing/result-codes" source_url: "https://docs.adyen.com/development-resources/testing/result-codes.md" canonical: "https://docs.adyen.com/development-resources/testing/result-codes" last_modified: "2026-05-13T17:03:13+02:00" language: "en" --- # Testing result codes and refusal reasons Test getting result codes and refusal reasons with your integration and troubleshoot issues before going live. ##### Test your in-person payments integration See [Simulating declined payments](/point-of-sale/testing-pos-payments/test-card-v3/#testing-declines) to learn about triggering refusal reasons with an in-person payments integration. You can test how your integration can handle different responses to make sure your integration can handle failure scenarios. In such scenarios, you receive a result code and a refusal reason that tells you why a payment request did not succeed. You can trigger specific refusal reasons in your payment requests to test how your integration handles failure scenarios. ## Benefits of testing refusal reasons This page describes how to trigger specific refusal reasons in your payment requests and test unhappy scenarios. There are several benefits to making sure your integration can handle unhappy flows, for example: * Presenting your shoppers with specific error messages per refusal reason. * Ensuring that you have a retry logic to handle refused payments. * Building your order management system logic to make sure unhappy scenarios are handled correctly. ## Trigger a refusal reason in a payment request To get a specific result code and refusal reason in the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) response, you need to include a specific value either in the `holderName` or `RequestedTestAcquirerResponseCode` field. You can find the values to use in the [Values for testing refusal reasons](#values-for-testing-result-reasons) table. 1. In the table, select the refusal reason that you want to trigger. 2. Make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request, setting either of the following fields to the value corresponding to the refusal reason you want to trigger: * `paymentMethod.holderName` Some card-related payment methods, for example Alipay, redirect you to a simulator where you can select the payment result. In this case, the value provided as the cardholder name will be ignored. * `additionalData.RequestedTestAcquirerResponseCode` For example, to test getting `resultCode`: **Refused** with `refusalReason`: **ExpiredCard**, make one of the following requests. ### Tab: Request using holder name **Test request using holder name** ```json curl https://checkout-test.adyen.com/v72/payments \ -H'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "amount": { "currency": "USD", "value": 1000 }, "reference": "YOUR_REFERENCE", "paymentMethod": { "type": "scheme", "number": "4111111111111111", "expiryMonth": "03", "expiryYear": "2030", "holderName": "CARD_EXPIRED", "cvc": "737" }, "returnUrl": "https://your-company.example.com/...", "merchantAccount": "YOUR_MERCHANT_ACCOUNT" }' ``` ### Tab: Request using acquirer response code **Test request using acquirer response code** ```json curl https://checkout-test.adyen.com/v72/payments \ -H'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "amount": { "currency": "USD", "value": 1000 }, "reference": "YOUR_REFERENCE", "paymentMethod": { "type": "scheme", "number": "4111111111111111", "expiryMonth": "03", "expiryYear": "2030", "holderName": "John Smith", "cvc": "737" }, "returnUrl": "https://your-company.example.com/...", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "additionalData": { "RequestedTestAcquirerResponseCode":6 } }' ``` 3. Make sure that the response contains the `resultCode` and `refusalReason` you triggered, and that your integration handles the response as expected. **Response with refusal reason** ```json { "pspReference": "851563882585825A", "refusalReason": "Expired Card", "resultCode": "Refused", "refusalReasonCode": "6" } ``` ## Values for testing refusal reasons The following table provides the values you need to specify in your [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) to trigger specific refusal reasons in the response: * The **refusalReason** and **resultCode** columns indicate the responses you can trigger. * The **holderName** column provides the value to use if you want to trigger the response using the `paymentMethod.holderName` field. * The **RequestedTestAcquirerResponseCode** column provides the value to use if you want to trigger the response using the `additionalData.RequestedTestAcquirerResponseCode` field. | **refusalReason** | **resultCode** | `holderName` | `RequestedTestAcquirerResponseCode` | | ------------------------------------------------------------ | -------------- | ------------------------------------------ | ----------------------------------- | | Unknown | Error | UNKNOWN | 0 | | - | Authorised | APPROVED | 1 | | Refused | Refused | DECLINED | 2 | | Referral | Refused | REFERRAL | 3 | | Acquirer Error | Error | ERROR | 4 | | Blocked Card | Refused | BLOCK\_CARD | 5 | | Expired Card | Refused | CARD\_EXPIRED | 6 | | Invalid Amount | Refused | INVALID\_AMOUNT | 7 | | Invalid Card Number | Refused | INVALID\_CARD\_NUMBER | 8 | | Issuer Unavailable | Refused | ISSUER\_UNAVAILABLE | 9 | | Not supported | Refused | NOT\_SUPPORTED | 10 | | 3D Not Authenticated | Refused | NOT\_3D\_AUTHENTICATED | 11 | | Not enough balance | Refused | NOT\_ENOUGH\_BALANCE | 12 | | - | Received | PENDING | 13 | | Acquirer Fraud | Refused | ACQUIRER\_FRAUD | 14 | | Cancelled | Refused | CANCELLED | 15 | | Shopper Cancelled | Refused | SHOPPER\_CANCELLED | 16 | | Invalid Pin | Refused | INVALID\_PIN | 17 | | Pin tries exceeded | Refused | PIN\_TRIES\_EXCEEDED | 18 | | Pin validation not possible | Refused | PIN\_VALIDATION\_NOT\_POSSIBLE | 19 | | FRAUD | Refused | FRAUD | 20 | | Not Submitted | Refused | NOT\_SUBMITTED | 21 | | FRAUD-CANCELLED | Cancelled | FRAUD\_CANCELLED | 22 | | Transaction Not Permitted | Refused | TRANSACTION\_NOT\_PERMITTED | 23 | | CVC Declined | Refused | CVC\_DECLINED | 24 | | Restricted Card | Refused | RESTRICTED\_CARD | 25 | | Revocation Of Auth | Refused | REVOCATION\_OF\_AUTH | 26 | | Declined Non Generic | Refused | DECLINED\_NON\_GENERIC | 27 | | Withdrawal amount exceeded | Refused | WITHDRAWAL\_AMOUNT\_EXCEEDED | 28 | | Withdrawal count exceeded | Refused | WITHDRAWAL\_COUNT\_EXCEEDED | 29 | | Issuer Suspected Fraud | Refused | ISSUER\_SUSPECTED\_FRAUD | 31 | | AVS Declined | Refused | AVS\_DECLINED | 32 | | Card requires online pin | Refused | PIN\_REQUIRED | 33 | | No checking account available on Card | Refused | NO\_CHECKING\_ACCOUNT\_AVAILABLE\_ON\_CARD | 34 | | No savings account available on Card | Refused | NO\_SAVINGS\_ACCOUNT\_AVAILABLE\_ON\_CARD | 35 | | Mobile PIN required | Refused | MOBILE\_PIN\_REQUIRED | 36 | | Contactless fallback | Refused | CONTACTLESS\_FALLBACK | 37 | | Authentication required | Refused | AUTHENTICATION\_REQUIRED | 38 | | RReq not received from DS | Refused | RREQ\_NOT\_RECEIVED | 39 | | Current AID is in Penalty Box. | Refused | BAN\_CURRENT\_AID | 40 | | CVM Required Restart Payment | Refused | CVM\_REQUIRED\_RESTART\_PAYMENT | 41 | | 3DS Authentication Error | Refused | THREED\_SECURE\_AUTHENTICATION\_ERROR | 42 | | Online PIN required | Refused | ONLINE\_PIN\_REQUIRED | 43 | | Try another interface | Refused | TRY\_ANOTHER\_INTERFACE | 44 | | Chip downgrade mode | Refused | CHIP\_DOWNGRADE\_MODE | 45 | | Transaction blocked by Adyen to prevent excessive retry fees | Refused | ERPS\_BLOCK | 46 | ## See also * [Refusal reasons](/development-resources/refusal-reasons/) * [Result codes](/online-payments/build-your-integration/payment-result-codes/) * [Response handling](/development-resources/overview-response-handling/)