--- title: "Third-party transfer webhooks" description: "Find out which webhooks Adyen sends for transfers involving third-party bank accounts." url: "https://docs.adyen.com/business-accounts/third-party-transfer-webhooks" source_url: "https://docs.adyen.com/business-accounts/third-party-transfer-webhooks.md" canonical: "https://docs.adyen.com/business-accounts/third-party-transfer-webhooks" last_modified: "2026-05-26T13:48:55+02:00" language: "en" --- # Third-party transfer webhooks Find out which webhooks Adyen sends for transfers involving third-party bank accounts. [View source](/business-accounts/third-party-transfer-webhooks.md) ##### Payment webhooks (deprecated) For information on which payment webhooks Adyen sends for bank transfer events, see [Payment webhooks (deprecated)](/business-accounts/notification-webhooks). When you receive or initiate a transfer request involving a third-party bank account, Adyen sends two kinds of webhooks for the balance account involved in the bank transfer: * [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created), which informs your server of an incoming or outgoing bank transfer request. * [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated), which informs your server of changes in the status of the bank transfer request. This page shows examples of the [Transfer webhooks](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/overview) that you receive when [receiving funds](#receiving-funds), [making payments through direct debit](#receiving-bank-direct-debits), or [making payments by sending funds](#sending-funds). ## Requirements To keep track of bank transfer-related events in your platform, ensure that: Before you begin, take into account the following requirements and preparations. | Requirement | Description | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | An Adyen [payout service integration](/payouts/payout-service/integration-checklist/). | | **[Webhooks](/development-resources/webhooks)** | To keep track of payout-related events in your balance platform, make sure that: - Your server must be able to [receive and accept webhooks](/development-resources/webhooks/configure-and-manage). - You have [subscribed](/development-resources/webhooks/configure-and-manage#configure-customer-area) to **Transfer webhooks** and **Transaction webhooks** in your [Customer Area](https://ca-test.adyen.com/). | ## Identify bank transfer webhooks You can identify transfer webhooks triggered by bank transfer events involving third-party bank accounts by looking at the following values: | Parameter | Description | Value | | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | [category](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created#request-data-category) | The category of the transfer. | **bank** | | [direction](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created#request-data-direction) | The direction of the transfer request from the perspective of the balance account. | Sending funds: **outgoing** Receiving funds or direct debit requests: **incoming** | | [type](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created#request-data-type) | The type of the transfer. | **bankTransfer** or **bankDirectDebit** | The following sections explain the events that trigger these webhooks. ## Receiving funds When receiving funds from third-party accounts, Adyen sends webhooks for the following transfer events: * [Incoming bank transfer received](#incoming-bank-transfer-received) * [Incoming bank transfer authorized](#incoming-bank-transfer-authorized) * [Incoming bank transfer booked](#incoming-bank-transfer-booked) The following sections contain webhooks that Adyen sends when your user receives a EUR 100.00 transfer from a third-party bank account to their Adyen business account. The funds sent to the Adyen business account are credited to the associated balance account. The webhooks include the following information: | Parameter | Description | | ------------------------- | --------------------------------------------------------------- | | `accountHolder` | The owner of the Adyen business account. | | `balanceAccount` | The balance account associated with the Adyen business account. | | `category` | **bank** | | `description` | The description the sender included in the transfer request. | | `reference` | The reference the sender included in the transfer request. | | `referenceForBeneficiary` | The sender's message for the beneficiary. | | `type` | **bankTransfer** | ** ### Incoming bank transfer received When a third-party bank account initiates a transfer to your user's Adyen business account, Adyen sends a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook to inform your server of the bank transfer request. **Incoming transfer received** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 10000 } ], "category": "bank", "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "The sender's description for the transfer", "direction": "incoming", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 10000 } ], "status": "received", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "2KT1M09KXYPP6XWN", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 1, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "received", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ** ### Incoming bank transfer authorized When the bank transfer request is authorized, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook to inform your server that the transfer amount has been reserved on the balance account associated with your user's Adyen business account. **Incoming transfer authorized** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": 10000 } ], "category": "bank", "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "The sender's description for the transfer", "direction": "incoming", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 10000 } ], "status": "received", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": -10000, "reserved": 10000 } ], "status": "authorised", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "2KT1M09KXYPP6XWN", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 2, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "authorised", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Incoming bank transfer booked When the funds are credited to the balance account, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with: * `direction`: **incoming** * `status`: **booked** * `counterparty`: details of your user's Adyen business account * `events.transactionId`: ID of the transaction **Incoming transfer booked** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 10000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "The sender's description for the transfer", "direction": "incoming", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 10000 } ], "status": "received", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": -10000, "reserved": 10000 } ], "status": "authorised", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": 10000, "currency": "EUR", "received": 0, "reserved": -10000 } ], "status": "booked", "transactionId": "1WT1N05XXY7P9XGB", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "2KT1M09KXYPP6XWN", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 3, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "booked", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ## Receiving direct debit requests When receiving direct debit payment requests from third-party accounts, Adyen sends webhooks for the following transfer events: * [Incoming bank direct debit request received](#incoming-bank-direct-debit-request-received) * [Incoming bank direct debit request authorized](#incoming-bank-direct-debit-request-authorized) * [Incoming bank direct debit request booked](#incoming-bank-direct-debit-request-booked) The following sections contain webhooks that Adyen sends when your user receives a direct debit request for EUR 33.60 from a third-party bank account on their Adyen business account. The funds are debited from the associated balance account. The webhooks include the following information: | Parameter | Description | | ------------------------ | ------------------------------------------------------------------ | | `accountHolder` | The owner of the Adyen business account. | | `balanceAccount` | The balance account associated with the Adyen business account. | | `category` | **bank** | | `counterparty` | Details of the third-party bank account. | | `directDebitInformation` | Details of the transaction, including the due date and mandate ID. | | `direction` | **incoming** | | `transactionRulesResult` | The outcome of the transaction rules you defined. | | `type` | **bankDirectDebit** | ** ### Incoming bank direct debit request received When a third-party bank account initiated a direct debit of your user's Adyen business account, Adyen sends a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook to inform your server of that incoming request. **Incoming direct debit received** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 3360 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": -3360 } ], "category": "bank", "categoryData": { "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2024-06-03T14:00:00+02:00", "directDebitInformation": { "dateOfSignature": "2015-01-01T01:00:00+01:00", "dueDate": "2024-06-03T02:00:00+02:00", "mandateId": "EBAClearing-MANDAT001", "sequenceType": "FRST" }, "direction": "incoming", "events": [ { "bookingDate": "2024-05-31T15:46:01+02:00", "id": "EVJN00000000000000000000002P7L", "journalId": 200000000301504480, "mutations": [ { "currency": "EUR", "received": -3360 } ], "status": "received", "type": "accounting", } ], "id": "3K7AI9634JE3RKX0", "paymentInstrument": { "id": "PI00000000000000000000001", "reference": "Your reference for the payment instrument" }, "paymentInstrumentId": "PI00000000000000000000001", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 1, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "received", "type": "bankDirectDebit" }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ** ### Incoming bank direct debit request authorized When a direct debit request from a third-party bank account is authorized, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook to inform your server that the direct debit amount has been reserved on the balance account associated with your user's Adyen business account. **Incoming direct debit authorized** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 3360 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": -3360 } ], "category": "bank", "categoryData": { "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2024-06-03T14:00:00+02:00", "directDebitInformation": { "dateOfSignature": "2015-01-01T01:00:00+01:00", "dueDate": "2024-06-03T02:00:00+02:00", "mandateId": "EBAClearing-MANDAT001", "sequenceType": "FRST" }, "direction": "incoming", "events": [ { "bookingDate": "2024-05-31T15:46:01+02:00", "id": "EVJN00000000000000000000002P7L", "journalId": 200000000301504480, "mutations": [ { "currency": "EUR", "received": -3360 } ], "status": "received", "type": "accounting", }, { "bookingDate": "2024-05-31T15:46:01+02:00", "id": "EVJN00000000000000000000005S38", "journalId": 200000000301504484, "mutations": [ { "currency": "EUR", "received": 3360, "reserved": -3360 } ], "status": "authorised", "type": "accounting", } ], "id": "3K7AI9634JE3RKX0", "paymentInstrument": { "id": "PI00000000000000000000001", "reference": "Your reference for the payment instrument" }, "paymentInstrumentId": "PI00000000000000000000001", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 2, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "authorised", "type": "bankDirectDebit" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Incoming bank direct debit request booked When the funds are debited from the balance account, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with: * `direction`: **incoming** * `status`: **booked** * `balance`: a negative amount * `events.transactionId`: ID of the transaction **Incoming direct debit booked** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 3360 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -3360, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "creationDate": "2024-06-03T14:00:00+02:00", "directDebitInformation": { "dateOfSignature": "2015-01-01T01:00:00+01:00", "dueDate": "2024-06-03T02:00:00+02:00", "mandateId": "EBAClearing-MANDAT001", "sequenceType": "FRST" }, "direction": "incoming", "events": [ { "bookingDate": "2024-05-31T15:46:01+02:00", "id": "EVJN00000000000000000000002P7L", "journalId": 200000000301504480, "mutations": [ { "currency": "EUR", "received": -3360 } ], "status": "received", "type": "accounting", }, { "bookingDate": "2024-05-31T15:46:01+02:00", "id": "EVJN00000000000000000000005S38", "journalId": 200000000301504484, "mutations": [ { "currency": "EUR", "received": 3360, "reserved": -3360 } ], "status": "authorised", "type": "accounting", }, { "bookingDate": "2024-06-03T13:11:00+02:00", "id": "EVJN00000000000000000000004MNM", "journalId": 200000000301507661, "mutations": [ { "balance": -3360, "currency": "EUR", "received": 0, "reserved": 3360 } ], "status": "booked", "transactionId": "EVJN0000000000000000000000000MEUR", "type": "accounting", "valueDate": "2024-06-03T14:00:00+02:00" } ], "id": "3K7AI9634JE3RKX0", "paymentInstrument": { "id": "PI00000000000000000000001", "reference": "Your reference for the payment instrument" }, "paymentInstrumentId": "PI00000000000000000000001", "reason": "approved", "reference": "The sender's reference for the transfer", "referenceForBeneficiary": "The sender's reference for the beneficiary", "sequenceNumber": 3, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "booked", "type": "bankDirectDebit" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ## Sending funds When transferring funds to third-party accounts, Adyen sends webhooks for the following transfer events: * [Outgoing bank transfer initiated](#outgoing-bank-transfer-initiated) * [Outgoing bank transfer authorized](#outgoing-bank-transfer-authorized) * [Outgoing bank transfer booked](#outgoing-bank-transfer-booked) * [Outgoing bank transfer pending](#outgoing-bank-transfer-pending) * [Outgoing bank transfer failed](#outgoing-bank-transfer-failed) * [Outgoing bank transfer tracking](#outgoing-bank-transfer-tracking) * [Outgoing bank transfer credited](#outgoing-bank-transfer-credited) * [Outgoing bank transfer returned](#outgoing-bank-transfer-returned) The following is a sample POST [/transfers](https://docs.adyen.com/api-explorer/#/transfers/latest/post/transfers) for a EUR 100.00 bank transfer to a third-party account. **Outgoing bank transfer request** #### curl ```bash curl https://balanceplatform-api-test.adyen.com/btl/v4/transfers \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "amount": { "value": 10000, "currency": "EUR" }, "balanceAccountId": "BA00000000000000000000001", "category": "bank", "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "description": "The description for the transfer", "priority": "regular", "referenceForBeneficiary": "The-reference-sent-to-the-beneficiary", "reference": "The reference for the transfer" }' ``` #### Java ```java // Adyen Java API Library v33.1.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.transfers.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.model.RequestOptions; import com.adyen.service.transfers.*; Client client = new Client("ADYEN_BALANCE_PLATFORM_API_KEY", Environment.TEST); // Create the request object(s) Address address3 = new Address() .country("NL") .city("Amsterdam") .line1("Simon Carmiggeltstraat 6-50"); PartyIdentification partyIdentification3 = new PartyIdentification() .address(address3) .fullName("A. Klaassen") .type(PartyIdentification.TypeEnum.UNKNOWN); IbanAccountIdentification ibanAccountIdentification = new IbanAccountIdentification() .iban("NL20ADYB2017000035") .type(IbanAccountIdentification.TypeEnum.IBAN); BankAccountV3 bankAccountV33 = new BankAccountV3() .accountHolder(partyIdentification3) .accountIdentification(new TransferInfoAccountIdentification(ibanAccountIdentification)); Amount amount = new Amount() .currency("EUR") .value(10000L); CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3() .bankAccount(bankAccountV33); TransferInfo transferInfo = new TransferInfo() .balanceAccountId("BA00000000000000000000001") .reference("The reference for the transfer") .amount(amount) .referenceForBeneficiary("The-reference-sent-to-the-beneficiary") .counterparty(counterpartyInfoV3) .description("The description for the transfer") .category(TransferInfo.CategoryEnum.BANK) .priority(TransferInfo.PriorityEnum.REGULAR); // Send the request TransfersApi service = new TransfersApi(client); Transfer response = service.transferFunds(transferInfo, new RequestOptions().idempotencyKey("UUID")); ``` #### PHP ```php setXApiKey("ADYEN_BALANCE_PLATFORM_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $address3 = new Address(); $address3 ->setCountry("NL") ->setCity("Amsterdam") ->setLine1("Simon Carmiggeltstraat 6-50"); $partyIdentification3 = new PartyIdentification(); $partyIdentification3 ->setAddress($address3) ->setFullName("A. Klaassen") ->setType("unknown"); $transferInfoAccountIdentification = new TransferInfoAccountIdentification(); $transferInfoAccountIdentification ->setIban("NL20ADYB2017000035") ->setType("iban"); $bankAccountV33 = new BankAccountV3(); $bankAccountV33 ->setAccountHolder($partyIdentification3) ->setAccountIdentification($transferInfoAccountIdentification); $amount = new Amount(); $amount ->setCurrency("EUR") ->setValue(10000); $counterpartyInfoV3 = new CounterpartyInfoV3(); $counterpartyInfoV3 ->setBankAccount($bankAccountV33); $transferInfo = new TransferInfo(); $transferInfo ->setBalanceAccountId("BA00000000000000000000001") ->setReference("The reference for the transfer") ->setAmount($amount) ->setReferenceForBeneficiary("The-reference-sent-to-the-beneficiary") ->setCounterparty($counterpartyInfoV3) ->setDescription("The description for the transfer") ->setCategory("bank") ->setPriority("regular"); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new TransfersApi($client); $response = $service->transferFunds($transferInfo, $requestOptions); ``` #### C\# ```cs // Adyen .net API Library v29.0.0 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Transfers; using Adyen.Service.Transfers; var config = new Config() { XApiKey = "ADYEN_BALANCE_PLATFORM_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Address address3 = new Address { Country = "NL", City = "Amsterdam", Line1 = "Simon Carmiggeltstraat 6-50" }; PartyIdentification partyIdentification3 = new PartyIdentification { Address = address3, FullName = "A. Klaassen", Type = PartyIdentification.TypeEnum.Unknown }; IbanAccountIdentification ibanAccountIdentification = new IbanAccountIdentification { Iban = "NL20ADYB2017000035", Type = IbanAccountIdentification.TypeEnum.Iban }; BankAccountV3 bankAccountV33 = new BankAccountV3 { AccountHolder = partyIdentification3, AccountIdentification = new TransferInfoAccountIdentification(ibanAccountIdentification) }; Amount amount = new Amount { Currency = "EUR", Value = 10000 }; CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3 { BankAccount = bankAccountV33 }; TransferInfo transferInfo = new TransferInfo { BalanceAccountId = "BA00000000000000000000001", Reference = "The reference for the transfer", Amount = amount, ReferenceForBeneficiary = "The-reference-sent-to-the-beneficiary", Counterparty = counterpartyInfoV3, Description = "The description for the transfer", Category = TransferInfo.CategoryEnum.Bank, Priority = TransferInfo.PriorityEnum.Regular }; // Send the request var service = new TransfersService(client); var response = service.TransferFunds(transferInfo, requestOptions: new RequestOptions { IdempotencyKey = "UUID"}); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v24.0.0 const { Client, TransfersAPI } = require('@adyen/api-library'); const client = new Client({ apiKey: "ADYEN_BALANCE_PLATFORM_API_KEY", environment: "TEST" }); // Create the request object(s) const transferInfo = { amount: { value: 10000, currency: "EUR" }, balanceAccountId: "BA00000000000000000000001", category: "bank", counterparty: { bankAccount: { accountHolder: { type: "unknown", fullName: "A. Klaassen", address: { city: "Amsterdam", line1: "Simon Carmiggeltstraat 6-50", country: "NL" } }, accountIdentification: { type: "iban", iban: "NL20ADYB2017000035" } } }, description: "The description for the transfer", priority: "regular", referenceForBeneficiary: "The-reference-sent-to-the-beneficiary", reference: "The reference for the transfer" } // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` #### Go ```go // Adyen Go API Library v18.0.0 import ( "context" "github.com/adyen/adyen-go-api-library/v18/src/common" "github.com/adyen/adyen-go-api-library/v18/src/adyen" "github.com/adyen/adyen-go-api-library/v18/src/transfers" ) client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_BALANCE_PLATFORM_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) address3 := transfers.Address{ Country: "NL", City: common.PtrString("Amsterdam"), Line1: common.PtrString("Simon Carmiggeltstraat 6-50"), } partyIdentification3 := transfers.PartyIdentification{ Address: &address3, FullName: common.PtrString("A. Klaassen"), Type: common.PtrString("unknown"), } ibanAccountIdentification := transfers.IbanAccountIdentification{ Iban: "NL20ADYB2017000035", Type: "iban", } bankAccountV33 := transfers.BankAccountV3{ AccountHolder: partyIdentification3, AccountIdentification: transfers.IbanAccountIdentificationAsTransferInfoAccountIdentification(&ibanAccountIdentification), } amount := transfers.Amount{ Currency: "EUR", Value: 10000, } counterpartyInfoV3 := transfers.CounterpartyInfoV3{ BankAccount: &bankAccountV33, } transferInfo := transfers.TransferInfo{ BalanceAccountId: common.PtrString("BA00000000000000000000001"), Reference: common.PtrString("The reference for the transfer"), Amount: amount, ReferenceForBeneficiary: common.PtrString("The-reference-sent-to-the-beneficiary"), Counterparty: counterpartyInfoV3, Description: common.PtrString("The description for the transfer"), Category: "bank", Priority: common.PtrString("regular"), } // Send the request service := client.Transfers() req := service.TransfersApi.TransferFundsInput().IdempotencyKey("UUID").TransferInfo(transferInfo) res, httpRes, err := service.TransfersApi.TransferFunds(context.Background(), req) ``` #### Python ```py # Adyen Python API Library v13.3.0 import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_BALANCE_PLATFORM_API_KEY" adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "amount": { "value": 10000, "currency": "EUR" }, "balanceAccountId": "BA00000000000000000000001", "category": "bank", "counterparty": { "bankAccount": { "accountHolder": { "type": "unknown", "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "line1": "Simon Carmiggeltstraat 6-50", "country": "NL" } }, "accountIdentification": { "type": "iban", "iban": "NL20ADYB2017000035" } } }, "description": "The description for the transfer", "priority": "regular", "referenceForBeneficiary": "The-reference-sent-to-the-beneficiary", "reference": "The reference for the transfer" } # Send the request result = adyen.transfers.transfers_api.transfer_funds(request=json_request, idempotency_key="UUID") ``` #### Ruby ```rb # Adyen Ruby API Library v10.1.2 require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_BALANCE_PLATFORM_API_KEY' adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { :amount => { :value => 10000, :currency => 'EUR' }, :balanceAccountId => 'BA00000000000000000000001', :category => 'bank', :counterparty => { :bankAccount => { :accountHolder => { :type => 'unknown', :fullName => 'A. Klaassen', :address => { :city => 'Amsterdam', :line1 => 'Simon Carmiggeltstraat 6-50', :country => 'NL' } }, :accountIdentification => { :type => 'iban', :iban => 'NL20ADYB2017000035' } } }, :description => 'The description for the transfer', :priority => 'regular', :referenceForBeneficiary => 'The-reference-sent-to-the-beneficiary', :reference => 'The reference for the transfer' } # Send the request result = adyen.transfers.transfers_api.transfer_funds(request_body, headers: { 'Idempotency-Key' => 'UUID' }) ``` #### NodeJS (TypeScript) ```ts // Adyen Node API Library v24.0.0 import { Client, TransfersAPI, Types } from "@adyen/api-library"; const client = new Client({ apiKey: "ADYEN_BALANCE_PLATFORM_API_KEY", environment: "TEST" }); // Create the request object(s) const address3: Types.transfers.Address = { country: "NL", city: "Amsterdam", line1: "Simon Carmiggeltstraat 6-50" }; const partyIdentification3: Types.transfers.PartyIdentification = { address: address3, fullName: "A. Klaassen", type: Types.transfers.PartyIdentification.TypeEnum.Unknown }; const ibanAccountIdentification: Types.transfers.IbanAccountIdentification = { iban: "NL20ADYB2017000035", type: Types.transfers.IbanAccountIdentification.TypeEnum.Iban }; const bankAccountV33: Types.transfers.BankAccountV3 = { accountHolder: partyIdentification3, accountIdentification: ibanAccountIdentification }; const amount: Types.transfers.Amount = { currency: "EUR", value: 10000 }; const counterpartyInfoV3: Types.transfers.CounterpartyInfoV3 = { bankAccount: bankAccountV33 }; const transferInfo: Types.transfers.TransferInfo = { balanceAccountId: "BA00000000000000000000001", reference: "The reference for the transfer", amount: amount, referenceForBeneficiary: "The-reference-sent-to-the-beneficiary", counterparty: counterpartyInfoV3, description: "The description for the transfer", category: Types.transfers.TransferInfo.CategoryEnum.Bank, priority: Types.transfers.TransferInfo.PriorityEnum.Regular }; // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` The funds sent from the Adyen business account are deducted from the associated balance account. The transfer and the changes in the status of the transfer trigger webhooks that include the following information: | Parameter | Description | | ------------------------- | ------------------------------------------------------------ | | `accountHolder` | The user that initiated the transfer. | | `balanceAccount` | The balance account of the user that initiated the transfer. | | `category` | **bank** | | `description` | The description your user included in the transfer request. | | `reference` | The reference your user included in the transfer request. | | `referenceForBeneficiary` | Your user's message for the beneficiary. | | `type` | **bankTransfer** | The following sections contain the webhooks that Adyen sends when you transfer EUR 100.00 to a third-party bank account. ** ### Outgoing bank transfer initiated When your user initiates a transfer to a Mastercard or Visa card, Adyen sends a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook to inform your server that an outgoing transfer request has been created. The webhook provides information about the transfer, such as: * The `amount` of the payout * The `reference` for the payout * The `referenceForBeneficiary` * Your user's `balanceAccount` from which the funds will be deducted * Details of the `accountHolder` linked to your user's balance account. * Details of the `counterparty` in the transfer, which is your user's transfer instrument. * The `bookingDate` when the payout was requested. * The `id` of the corresponding transfer. ** ### Outgoing bank transfer authorized When the transfer request is authorized, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event to inform your server that the transfer amount has been reserved on the account. This webhook includes the `status` **authorised**. **Transfer authorised** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": -10000 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bankTransfer" }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" } ], "id": "6JKRLZ8LOT47J7RY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 2, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "authorised", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer booked When the funds are deducted from your user's balance account, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event with: * `direction`: **outgoing** * `status`: **booked** * `counterparty`: details of the external transfer instrument. * `events.transactionId`: ID of the transaction This status is not final. The transfer may still [fail](#outgoing-bank-transfer-failed) if, for example, the transfer is rejected by the external banking system. **Transfer booked** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "fullName": "A. Klaassen" }, "accountIdentification": { "type": "iban", "iban": "NL91ABNA0417164300" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "6JKRLZ8LOT47J7RY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 3, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "booked", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer pending After the funds are deducted from your user's balance account, the transfer is automatically analyzed to ensure that it complies with Adyen's policies. If a transfer is flagged, Adyen reviews the transfer. In order to speed up the screening process and reduce the amount of manual effort needed, we recommend that you provide as much information as possible in the transfer request. For example, include all counterparty details in the [accountHolder](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-counterparty-bankAccount-accountHolder) object. In this case, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event with a `tracking` event type, specifying the following `trackingData` details: * `status`: **pending** * `type`: **internalReview** **Transfer pending** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" }, "fullName": "A. Klaassen", "type": "unknown" }, "accountIdentification": { "iban": "NL91ABNA0417164300", "type": "iban" } } }, "creationDate": "2024-04-22T12:55:18+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2024-04-22T12:55:18+02:00" }, { "id": "6JKRLZ8LOT47J7RY", "trackingData": { "status": "pending", "type": "internalReview" }, "type": "tracking", "updateDate": "2024-04-22T12:55:30+02:00" } ], "id": "34IXDC62P0FE4RHI", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 4, "status": "booked", "tracking": { "status": "pending", "type": "internalReview" }, "transactionRulesResult": { "allHardBlockRulesPassed": true, "score": 0 }, "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` After Adyen reviews the transfer details, we send a webhook to notify you of the outcome. ### Tab: Review passed If the transfer passed the review: * For transfers with `priority` **instant**, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook to confirm that the funds have been credited in the counterparty account. The webhook includes a `tracking` event with the tracking `status` **credited**. For more information, see an example of the [payout credited webhook](#payout-credited). * For transfers with any other priority, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with the `tracking` event, specifying the `estimatedArrivalTime`. This field indicates the date and time when the funds will be credited in the counterparty bank account. For more information, see an example of the [payout tracking webhook](#payout-tracking). This status is not final. The transfer may still [fail](#outgoing-bank-transfer-failed), for example if the transfer is rejected by the external banking system. ### Tab: Review failed If the transfer fails Adyen's review process, we send a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with a `tracking` event, specifying the following `trackingData`: * `reason`: **refusedForRegulatoryReasons** * `status`: **failed** * `type`: **internalReview** If this is the case, contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other). **Transfer failed review** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -1000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" }, "fullName": "A. Klaassen", "type": "unknown" }, "accountIdentification": { "iban": "NL91ABNA0417164300", "type": "iban" } } }, "creationDate": "2024-04-22T12:55:18+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2024-04-22T12:55:20+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -1000, "currency": "EUR", "received": 0, "reserved": 1000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2024-04-22T12:55:18+02:00" }, { "id": "6JKRLZ8LOT47J7RY", "trackingData": { "status": "pending", "type": "internalReview" }, "type": "tracking", "updateDate": "2024-04-22T12:55:29+02:00" }, { "id": "6JKRLZ8LOT47J7RY", "trackingData": { "reason": "refusedForRegulatoryReasons", "status": "failed", "type": "internalReview" }, "type": "tracking", "updateDate": "2024-04-22T12:57:28+02:00" } ], "id": "34IXDC62P0FE4RHI", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 5, "status": "booked", "tracking": { "reason": "refusedForRegulatoryReasons", "status": "failed", "type": "internalReview" }, "transactionRulesResult": { "allHardBlockRulesPassed": true, "score": 0 }, "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer failed The transfer can fail if it is rejected by an external banking system and any automatic retries are unsuccessful. For instant bank transfers with end-to-end confirmation from the counterparty's bank, this is the status when the counterparty's bank rejects the transfer. When a transfer fails, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with: * `status`: **failed** * The `transactionId` * The `reason` for the failure. For more information, see [Return reason codes](#return-reason-codes). **Transfer failed** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 0, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" } }, "accountIdentification": { "type": "iban", "iban": "NL91ABNA0417164300" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000004", "mutations": [ { "balance": 10000, "currency": "EUR", "received": 0 } ], "reason": "counterpartyAccountNotFound", "status": "failed", "transactionId": "EVJN42271114222B5JB8BRC76N686ZHBG", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "6JKRLZ8LOT47J7RY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 4, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "failed", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer tracking When the transfer is completed, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event with a `tracking` event type, specifying the `estimatedArrivalTime`. This is the estimated time when the funds will be credited in the counterparty bank account. The estimated time is based on the official clearing system regulations that outline credit fund availability requirements. If the beneficiary bank does not adhere to the official regulations, the actual time of arrival can deviate from the estimate. Estimated Time of Arrival is currently available for all local payouts. It is *not* available for instant or cross-border payouts. This only applies to transfers with: * `priority` **regular** * `priority` **fast** * `priority` **wire** **Estimated time of arrival** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" } }, "accountIdentification": { "type": "iban", "iban": "NL91ABNA0417164300" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "estimatedArrivalTime": "2023-03-02T07:00:00+00:00", "id": "EVJN00000000000000000000000004", "trackingData": { "estimatedArrivalTime": "2023-03-02T07:00:00+00:00", "type": "estimation" }, "type": "tracking", "updateDate": "2023-03-01T17:59:34+01:00" } ], "id": "3JTRKZ5VXL07G5UY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 4, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "booked", "tracking": { "estimatedArrivalTime": "2023-03-02T07:00:00+00:00", "type": "estimation" }, "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer credited If a transfer with `priority` **instant** is completed, then Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event to confirm that the funds have been credited. The webhook includes a `tracking` event type with the tracking `status` **credited**. **Transfer credited** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "instant", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" } }, "accountIdentification": { "type": "iban", "iban": "NL91ABNA0417164300" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "id": "EVJN00000000000000000000000004", "status": "credited", "type": "tracking", "updateDate": "2023-03-01T12:58:25+01:00" } ], "id": "3JTRKZ5VXL07G5UY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 4, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "booked", "tracking": { "status": "credited", "type": "confirmation" }, "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### Outgoing bank transfer returned If the transfer is returned by the counterparty's bank, then Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event with: * `status`: **returned** * The `transactionId` * The `reason` for not accepting the transfer. For more information, see [Reason codes](#return-reason-codes). **Transfer returned** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 0, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "bank", "categoryData": { "priority": "regular", "type": "bank" }, "counterparty": { "bankAccount": { "accountHolder": { "fullName": "A. Klaassen", "address": { "city": "Amsterdam", "country": "NL", "postalCode": "1011DJ", "stateOrProvince": "NH", "line1": "Simon Carmiggeltstraat 6-50" } }, "accountIdentification": { "type": "iban", "iban": "NL91ABNA0417164300" } } }, "creationDate": "2023-02-28T13:30:05+02:00", "description": "Your user description for the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -10000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 10000, "reserved": -10000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000003", "mutations": [ { "balance": -10000, "currency": "EUR", "received": 0, "reserved": 10000 } ], "status": "booked", "transactionId": "EVJN42272224222B5JB8BRC84N686ZEUR", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" }, { "bookingDate": "2023-02-28T13:30:18+02:00", "id": "EVJN00000000000000000000000004", "mutations": [ { "balance": 10000, "currency": "EUR", "received": 0 } ], "reason": "counterpartyAccountNotFound", "status": "returned", "transactionId": "EVJN42271114222B5JB8BRC76N686ZHBG", "type": "accounting", "valueDate": "2023-03-01T12:58:25+01:00" } ], "id": "6JKRLZ8LOT47J7RY", "paymentInstrument": { "description": "Your user IBAN linked to the payment instrument", "id": "PI32272223226J5K6KR474CVJ" }, "reason": "approved", "reference": "Your user reference for the transfer", "referenceForBeneficiary": "Your user reference for the beneficiary", "sequenceNumber": 4, "transactionRulesResult": { "allHardBlockRulesPassed": true }, "status": "returned", "type": "bankTransfer" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ### Return reason Adyen includes a `reason` in the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook event to keep you informed about why the transfer was returned. The [return reason codes](#return-reason-codes) are based on the response Adyen receives from the user's bank. Some reasons indicate temporary issues that can be resolved when you retry the transfer. Others signify a permanent problem with the user's bank account details and require new bank details before you retry. Adyen blocks subsequent transfer attempts when a reason code indicates a permanent issue. When a transfer instrument is blocked, new transfer requests made with the user's bank account fail with a 422, "[Transfers to counterparty bank account is blocked.](/platforms/custom-payouts/on-demand-payouts#transfers-to-counterparty-bank-account-is-blocked)" error. Refer to the [reason codes](#return-reason-codes) table below for a list of reason codes we recommend to retry. ### Reason codes The following table describes the reasons why a transfer may be rejected or returned by the counterparty's bank. | Reason code | Description | Remediating action | | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | `amountLimitExceeded` | The counterparty's bank or the payment system rejected this transfer because the value is too high. | Retry the transfer with a lower amount or with a different route. | | | `counterpartyBankUnavailable` | The counterparty's bank is unavailable for real-time processing. | Retry the transfer later or with a different route. | | | `counterpartyAccountNotFound` | The counterparty's bank is unable to locate the account with the provided details. | Check the bank account details provided in the transfer and retry. | | | `counterpartyAccountClosed` | The counterparty's bank reported that the account exists, but it is closed. | Check the bank account details provided in the transfer and retry. | | | `counterpartyAccountBlocked` | The counterparty's bank reported that the account is blocked or suspended. | Check the bank account details provided in the transfer and retry. | | | `counterpartyAddressRequired` | The counterparty's bank requires the account holder's address to credit this transfer to the account. | Retry the transfer with full street address. | | | `counterpartyBankTimedOut` | The counterparty's bank timed out while trying to process this request in real-time. | Retry the transfer later or with a different route. | | | `declinedByTransactionRule` | Adyen declined the transfer because it did not comply with one or more [transaction rules](/business-accounts/transaction-rules/) set by you or Adyen. | Check the transaction rules that are blocking the transfer to confirm if this outcome is expected. If this is not the expected outcome, try updating your transaction rules. | | | `refusedByCounterpartyBank` | The counterparty's bank refused the transfer without providing any further information regarding the underlying reason. | Check the bank account details provided in the transfer and/or contact the counterparty's bank. | | | `unknown` | No specific reason is known by Adyen for the failure, or the reported reason does not correspond to any of the codes above. | Check the bank account details provided in the transfer and retry. If problem persists, further manual investigation might be needed. | | ## See also * [Receive funds](/business-accounts/receive-funds) * [Send funds](/business-accounts/send-funds) * [SEPA direct debit](/business-accounts/receive-funds#receive-direct-debit) * [Transaction rules](/business-accounts/transaction-rules)