Subscribe to transfer payout failure event webhook to understand why a payout failed.
Use this event when you want to either understand the reason or guide customers to fix payout issues (for example, incorrect account details). The transfers#state-change and transfers#payout-failure events differ in purpose and most effective when used together.
transfers#state-changeprovides high-level understanding of a transfer's status.transfers#payout-failureprovides payout failure details, reason code and description, when failures occur.
| Code | Description |
|---|---|
ACCOUNT_CLOSED | The recipient details are correct, but beneficiary account is closed. |
ACCOUNT_FROZEN | The recipient details are correct, but beneficiary account is frozen. |
ACCOUNT_BLOCKED | The recipient details are correct, but beneficiary account is blocked. |
ACCOUNT_LIMIT_REACHED | The recipient details are correct, but beneficiary account has a limit that can be unblocked by the recipient. |
WRONG_ACCOUNT_NUMBER | Invalid account number. |
WRONG_CARD_NUMBER | Invalid card number. |
WRONG_ACCOUNT_DETAILS | Invalid account number and/or invalid bank code. |
WRONG_ACCOUNT_TYPE | Incorrect account type. |
WRONG_BANK_CODE | Invalid sort/BIC/routing/etc number. |
WRONG_BRANCH_CODE | Invalid branch code. |
WRONG_NAME | Account number matches, but the name is not 100% correct. |
WRONG_PHONE_NUMBER | Recipient phone number is incorrect. |
WRONG_ID_NUMBER | Invalid recipient's ID document number |
WRONG_RUT_NUMBER | Invalid recipient's RUT (Rol Unico Tributario) number. |
TAX_ID_NOT_MATCHING | Tax ID doesn't match recipient's name. |
TAX_ID_SUSPENDED | Tax ID is suspended. |
WRONG_REFERENCE | Invalid payment reference. |
WRONG_PAYMENT_PURPOSE | Invalid or not accepted payment purpose. |
ACCOUNT_DOES_NOT_EXIST | Format is correct but this account does not exist in recipient bank. |
WRONG_CURRENCY | Recipient account is in different currency. |
WRONG_CARD_TYPE | Recipient account doesn't support payments to this card type. |
CANNOT_ACCEPT_FROM_3RD_PARTY | Recipient bank can't accept the payments from 3rd party. |
CREDITING_ACCOUNT_FORBIDDEN | Terms and Conditions of Account do not permit crediting of these funds. |
DUPLICATE_ENTRY | Recipient bank informs that there has been another payment in the same amount. |
FUNDS_NOT_EXPECTED_RETURNED | Beneficiary not expecting funds/instructed return. |
MANDATE_NOT_FILLED_IN | Recipient didn't fill out the mandate form on time or the email address is incorrect. |
BUSINESS_PAYMENTS_FORBIDDEN | Payment to business accounts are not allowed. |
SENDER_REQUESTED_TO_CANCEL | Sender requested cancellation. |
REQUEST_FOR_INFORMATION_EXPIRED | Request for information expired. |
RETURN_REQUESTED_BY_RECIPIENT | Recipient requested return. |
EXTERNAL_IDENTIFIER_DETAILS_HAVE_CHANGED | External identifier details have changed. |
TECHNICAL_ISSUE (available v5.0.0 onwards) | Payment failed due to a technical issue |
TECHNICAL_ISSUE_RETRYABLE (available v5.0.0 onwards) | Payment failed due to a technical issue, Wise will retry |
REASON_NOT_SPECIFIED | Reason not specified. |
- Payout failures can occur while a transfer remains in
outgoing_payment_sent. Not every payout failure triggers a transfer state change. - A transfer may emit multiple
transfers#payout-failureevents.- Not every rejected transfer (for example
bounced_backorfunds_refunded) will have a correspondingtransfers#payout-failurewebhook.
- Not every rejected transfer (for example
- Wise may add new failure codes over time. Your system should handle unrecognised codes.
Before you can test payout failures, you must create and fund a transfer in the sandbox. Once you have a funded transfer and have the transferID, you can test payout failures using the following steps:
Use the simulation transfer state change endpoint to move the transfer through states in order:
processing → funds_converted → outgoing_payment_sent → bounced_back
This ensures the transfer is in the correct state for payout failure simulation.
Use the simulation payout failure endpoint.
You can do either of the following:
- Omit the body to get a random failure reason (for the transfer’s route/currency pair).
- Specify a particular
failure_reason_codein the body.
- Production Environmenthttps://api.wise.com/2026Q3/simulation/transfers/{transferId}/payout-failure
- Sandbox Environmenthttps://api.wise-sandbox.com/2026Q3/simulation/transfers/{transferId}/payout-failure
- Random failure reason
- Explicit failure reason
{}
After you trigger the simulation, Wise sends a transfers#payout-failure webhook to your subscribed endpoint.
- Treat
failure_reason_codeas the stable machine-readable value. - Use
failure_descriptionfor display/logging, but don’t hard-depend on the exact text. - Store/trace
transfer_id,occurred_at, and (in your logs) the requestx-trace-idto simplify support/debugging. - Be prepared for new reason codes over time (fallback messaging).