--- title: "Initiate on-demand payouts" description: "Initiate an on-demand payout to your verified bank account." url: "https://docs.adyen.com/payouts/payout-service/getting-paid/on-demand-payouts" source_url: "https://docs.adyen.com/payouts/payout-service/getting-paid/on-demand-payouts.md" canonical: "https://docs.adyen.com/payouts/payout-service/getting-paid/on-demand-payouts" last_modified: "2020-09-11T17:20:00+02:00" language: "en" --- # Initiate on-demand payouts Initiate an on-demand payout to your verified bank account. [View source](/payouts/payout-service/getting-paid/on-demand-payouts.md) On-demand payouts let you trigger payments to transfer instruments, such as your [payout account](/payouts/payout-service/getting-paid#payout-account), outside a regular schedule. You can use this feature to manage funds based on regional bank transfer cut-off times and make sure that account holders receive funds when they need them. ## Requirements Before you begin, take into account the following requirements, limitations, and preparations. | Requirement | Description | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | This feature is supported with an Adyen [balance platform integration](/payouts/payout-service/account-structure-resources#balance-platform). | | **[Customer Area roles](/account/user-roles)** | To manage sweep configurations in the Customer Area, make sure that your user account has the following roles: - **Configure scheduled payouts** - **Initiate payouts to transfer instruments** | | **[Webhooks](/development-resources/webhooks)** | Configure your server to receive and accept webhooks. | | **Limitations** | Regional bank transfer cutoff times affect when funds reach the account holder. Consider these times before you trigger an on-demand payout. | | **Setup steps** | Before you begin, contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) to configure a [default transfer description](/payouts/payout-service/getting-paid#transfer-statement-description) for your balance platform. Before submitting a transfer request, we recommend that you [calculate the available transfer routes](/payouts/payout-service/getting-paid/transfer-routes). This enables you to pay out funds faster and minimize the risk of payout failures. | ## 1. Make a transfer request To set up on-demand payouts, use your [Customer Area](https://ca-test.adyen.com/) or make a POST [/transfers](https://docs.adyen.com/api-explorer/#/transfers/latest/post/transfers) request. The following tabs explain both methods. ### Tab: Customer Area In your Customer Area, initiate the payout as follows: 1. Go to **Transactions** > **Transfers**. 2. In the **Balance platform** dropdown, select the balance platform. You can view transfers from one balance platform at a time. 3. Select **Transfer funds**. 4. In the **Source balance account** field, enter the ID of the [balance account](/payouts/payout-service/account-structure-resources) where the funds will be debited. 5. In the **Counterparty Type** field, select **transferInstrument**. 6. Select the **Counterparty transfer instrument ID**. This is where the funds will be credited. 7. Select the currency and enter the amount to be transferred. 8. Select the [priority](/payouts/payout-service/getting-paid#payout-priority) of your transfer. 9. Optional. Enter the following information: * **Reference**: your reference for the transfer, used internally within your platform. If you do not provide this, Adyen generates a unique reference. Maximum 80 characters. * **Description**: a description of the transfer that is sent to the recipient of the transfer request. See the [transfer description character limits](#description-limit). * **Reference for beneficiary**: a reference that is sent to the recipient of the transfer request. It is also sent in all the webhooks related to the transfer. Supported characters: `[a-z][A-Z][0-9]`. Maximum 35 characters when transferring to an IBAN, 15 characters otherwise. 10. Select **Transfer funds** > **Yes, Transfer**. The payout request is now created. On the **Transactions** > **Transfers** tab you can confirm if the transfer has been booked. ** ### Example — Pay out to a bank account You want to make a single payout of EUR 150 to your [transfer instrument](/payouts/payout-service/account-structure-resources) and you want to receive the funds instantly. The following table shows the details you need to enter to initiate the transfer: | Field | Details | | ---------------------------------------- | -------------------------------------- | | **Source balance account** | **BA00000000000000000000001** | | **Counterparty Type** | **transferInstrument** | | **Counterparty transfer instrument ID** | **SE00000000000000000000001** | | **Amount** | **EUR** **150** | | **Priority** | **Instant** | | **Reference (optional)** | Your internal reference for the payout | | **Description (optional)** | Your description of the payout | | **Reference for beneficiary (optional)** | Your reference for the counterparty | ### Tab: API 1. To send an on-demand payout, make a POST [/transfers](https://docs.adyen.com/api-explorer/#/transfers/latest/post/transfers) request, specifying: | Parameter name | Required | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [amount](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-amount) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The amount of the transfer. | | [balanceAccountId](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-balanceAccountId) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the source balance account. | | [category](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-category) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **bank**. | | [counterparty.transferInstrumentId](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-counterparty-transferInstrumentId) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the [transfer instrument](https://docs.adyen.com/api-explorer/legalentity/latest/post/transferInstruments) to which the payout must be sent. This resource must be linked to the account holder's [legal entity](https://docs.adyen.com/api-explorer/legalentity/latest/post/legalEntities). | | [priority](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-priority) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The [priority of the payout](/payouts/payout-service/getting-paid#payout-priority), which affects the transfer speed and the fees you have to pay. | | [description](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-description) | | Your description for the transfer request, which is used by most recipient banks as the [transfer statement description](/payouts/payout-service/getting-paid/transfer-statement). Check the character limit based on the country/region of the counterparty bank account and the priority. | | [reference](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-reference) | | Your reference for the transfer. This is only used within your platform and not sent to the recipient. If you do not provide this in the request, Adyen generates a unique reference. | | [referenceForBeneficiary](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-referenceForBeneficiary) | | Your reference for the transfer, which is also sent to the recipient. This reference is also sent in all webhooks related to the transfer, so you can use it to track statuses. | **Request for an on-demand payout** #### 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":60000, "currency":"EUR" }, "balanceAccountId":"BA00000000000000000000001", "category":"bank", "counterparty":{ "transferInstrumentId":"SE00000000000000000000001" }, "priority":"fast", "reference":"YOUR_INTERNAL_REFERENCE", "referenceForBeneficiary":"Your-reference-for-the-beneficiary", "description":"YOUR_DESCRIPTION_FOR_THE_TRANSFER" }' ``` #### Java ```java // Adyen Java API Library v33.0.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) Amount amount = new Amount() .currency("EUR") .value(60000L); CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3() .transferInstrumentId("SE00000000000000000000001"); TransferInfo transferInfo = new TransferInfo() .balanceAccountId("BA00000000000000000000001") .reference("YOUR_INTERNAL_REFERENCE") .amount(amount) .referenceForBeneficiary("Your-reference-for-the-beneficiary") .counterparty(counterpartyInfoV3) .description("YOUR_DESCRIPTION_FOR_THE_TRANSFER") .category(TransferInfo.CategoryEnum.BANK) .priority(TransferInfo.PriorityEnum.FAST); // 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) $amount = new Amount(); $amount ->setCurrency("EUR") ->setValue(60000); $counterpartyInfoV3 = new CounterpartyInfoV3(); $counterpartyInfoV3 ->setTransferInstrumentId("SE00000000000000000000001"); $transferInfo = new TransferInfo(); $transferInfo ->setBalanceAccountId("BA00000000000000000000001") ->setReference("YOUR_INTERNAL_REFERENCE") ->setAmount($amount) ->setReferenceForBeneficiary("Your-reference-for-the-beneficiary") ->setCounterparty($counterpartyInfoV3) ->setDescription("YOUR_DESCRIPTION_FOR_THE_TRANSFER") ->setCategory("bank") ->setPriority("fast"); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new TransfersApi($client); $response = $service->transferFunds($transferInfo, $requestOptions); ``` #### C\# ```cs // Adyen .net API Library v27.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) Amount amount = new Amount { Currency = "EUR", Value = 60000 }; CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3 { TransferInstrumentId = "SE00000000000000000000001" }; TransferInfo transferInfo = new TransferInfo { BalanceAccountId = "BA00000000000000000000001", Reference = "YOUR_INTERNAL_REFERENCE", Amount = amount, ReferenceForBeneficiary = "Your-reference-for-the-beneficiary", Counterparty = counterpartyInfoV3, Description = "YOUR_DESCRIPTION_FOR_THE_TRANSFER", Category = TransferInfo.CategoryEnum.Bank, Priority = TransferInfo.PriorityEnum.Fast }; // 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 v23.3.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: 60000, currency: "EUR" }, balanceAccountId: "BA00000000000000000000001", category: "bank", counterparty: { transferInstrumentId: "SE00000000000000000000001" }, priority: "fast", reference: "YOUR_INTERNAL_REFERENCE", referenceForBeneficiary: "Your-reference-for-the-beneficiary", description: "YOUR_DESCRIPTION_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 v16.3.0 import ( "context" "github.com/adyen/adyen-go-api-library/v16/src/common" "github.com/adyen/adyen-go-api-library/v16/src/adyen" "github.com/adyen/adyen-go-api-library/v16/src/transfers" ) client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_BALANCE_PLATFORM_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) amount := transfers.Amount{ Currency: "EUR", Value: 60000, } counterpartyInfoV3 := transfers.CounterpartyInfoV3{ TransferInstrumentId: common.PtrString("SE00000000000000000000001"), } transferInfo := transfers.TransferInfo{ BalanceAccountId: common.PtrString("BA00000000000000000000001"), Reference: common.PtrString("YOUR_INTERNAL_REFERENCE"), Amount: amount, ReferenceForBeneficiary: common.PtrString("Your-reference-for-the-beneficiary"), Counterparty: counterpartyInfoV3, Description: common.PtrString("YOUR_DESCRIPTION_FOR_THE_TRANSFER"), Category: "bank", Priority: common.PtrString("fast"), } // 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": 60000, "currency": "EUR" }, "balanceAccountId": "BA00000000000000000000001", "category": "bank", "counterparty": { "transferInstrumentId": "SE00000000000000000000001" }, "priority": "fast", "reference": "YOUR_INTERNAL_REFERENCE", "referenceForBeneficiary": "Your-reference-for-the-beneficiary", "description": "YOUR_DESCRIPTION_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.1 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 => 60000, :currency => 'EUR' }, :balanceAccountId => 'BA00000000000000000000001', :category => 'bank', :counterparty => { :transferInstrumentId => 'SE00000000000000000000001' }, :priority => 'fast', :reference => 'YOUR_INTERNAL_REFERENCE', :referenceForBeneficiary => 'Your-reference-for-the-beneficiary', :description => 'YOUR_DESCRIPTION_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 v23.3.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 amount: Types.transfers.Amount = { currency: "EUR", value: 60000 }; const counterpartyInfoV3: Types.transfers.CounterpartyInfoV3 = { transferInstrumentId: "SE00000000000000000000001" }; const transferInfo: Types.transfers.TransferInfo = { balanceAccountId: "BA00000000000000000000001", reference: "YOUR_INTERNAL_REFERENCE", amount: amount, referenceForBeneficiary: "Your-reference-for-the-beneficiary", counterparty: counterpartyInfoV3, description: "YOUR_DESCRIPTION_FOR_THE_TRANSFER", category: Types.transfers.TransferInfo.CategoryEnum.Bank, priority: Types.transfers.TransferInfo.PriorityEnum.Fast }; // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` 2. If the transfer request is successful, you receive an **HTTP 2XX** response containing an `id` of the transfer request. ** ### Trigger additional reviews To better control money movement in your platform, you can trigger additional reviews for payouts. Additional reviews require a member of your team to verify a payout before Adyen processes it. 1. You can trigger an additional review by including the [review](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-review) object in the POST [/transfers](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers) request. In the object, specify the following parameter: | Parameter name | Required | Description | | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | [review.numberOfApprovalsRequired](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-review-numberOfApprovalsRequired) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Specifies the number of approvals required to process the payout. Possible values: **1**. Currently, it is possible to request only one additional review per payout. | | The following code sample shows how to include the `review` object. **Trigger an additional review** #### curl ```bash curl https://balanceplatform-api-test.adyen.com/btl/v4/transfers \ -H 'x-api-key: YOUR_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "amount": { "value": 60000, "currency": "EUR" }, "balanceAccountId": "BA00000000000000000000001", "category": "bank", "counterparty": { "transferInstrumentId": "SE00000000000000000000001" }, "description": "Your-description-for-the-transfer", "priority": "fast", "reference": "YOUR_INTERNAL_REFERENCE", "referenceForBeneficiary": "Your-reference-for-the-beneficiary", "review": { "numberOfApprovalsRequired": 1 } }' ``` #### Java ```java // Adyen Java API Library v29.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("YOUR_BALANCE_PLATFORM_API_KEY", Environment.TEST); // Create the request object(s) Amount amount = new Amount() .currency("EUR") .value(60000L); TransferRequestReview transferRequestReview = new TransferRequestReview() .numberOfApprovalsRequired(1); CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3() .transferInstrumentId("SE00000000000000000000001"); TransferInfo transferInfo = new TransferInfo() .balanceAccountId("BA00000000000000000000001") .reference("YOUR_INTERNAL_REFERENCE") .amount(amount) .referenceForBeneficiary("Your-reference-for-the-beneficiary") .review(transferRequestReview) .counterparty(counterpartyInfoV3) .description("Your-description-for-the-transfer") .category(TransferInfo.CategoryEnum.BANK) .priority(TransferInfo.PriorityEnum.FAST); // Send the request TransfersApi service = new TransfersApi(client); Transfer response = service.transferFunds(transferInfo, new RequestOptions().idempotencyKey("UUID")); ``` #### PHP ```php // Adyen PHP API Library v21.1.0 use Adyen\Client; use Adyen\Environment; use Adyen\Model\Transfers\Amount; use Adyen\Model\Transfers\TransferRequestReview; use Adyen\Model\Transfers\CounterpartyInfoV3; use Adyen\Model\Transfers\TransferInfo; use Adyen\Service\Transfers\TransfersApi; $client = new Client(); $client->setXApiKey("YOUR_BALANCE_PLATFORM_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $amount = new Amount(); $amount ->setCurrency("EUR") ->setValue(60000); $transferRequestReview = new TransferRequestReview(); $transferRequestReview ->setNumberOfApprovalsRequired(1); $counterpartyInfoV3 = new CounterpartyInfoV3(); $counterpartyInfoV3 ->setTransferInstrumentId("SE00000000000000000000001"); $transferInfo = new TransferInfo(); $transferInfo ->setBalanceAccountId("BA00000000000000000000001") ->setReference("YOUR_INTERNAL_REFERENCE") ->setAmount($amount) ->setReferenceForBeneficiary("Your-reference-for-the-beneficiary") ->setReview($transferRequestReview) ->setCounterparty($counterpartyInfoV3) ->setDescription("Your-description-for-the-transfer") ->setCategory("bank") ->setPriority("fast"); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new TransfersApi($client); $response = $service->transferFunds($transferInfo, $requestOptions); ``` #### C\# ```cs // Adyen .net API Library v22.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 = "YOUR_BALANCE_PLATFORM_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Amount amount = new Amount { Currency = "EUR", Value = 60000 }; TransferRequestReview transferRequestReview = new TransferRequestReview { NumberOfApprovalsRequired = 1 }; CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3 { TransferInstrumentId = "SE00000000000000000000001" }; TransferInfo transferInfo = new TransferInfo { BalanceAccountId = "BA00000000000000000000001", Reference = "YOUR_INTERNAL_REFERENCE", Amount = amount, ReferenceForBeneficiary = "Your-reference-for-the-beneficiary", Review = transferRequestReview, Counterparty = counterpartyInfoV3, Description = "Your-description-for-the-transfer", Category = TransferInfo.CategoryEnum.Bank, Priority = TransferInfo.PriorityEnum.Fast }; // 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 v21.0.0 // Require the parts of the module you want to use const { Client, TransfersAPI } = require('@adyen/api-library'); // Initialize the client object const client = new Client({apiKey: "YOUR_BALANCE_PLATFORM_API_KEY", environment: "TEST"}); // Create the request object(s) const transferInfo = { amount: { value: 60000, currency: "EUR" }, balanceAccountId: "BA00000000000000000000001", category: "bank", counterparty: { transferInstrumentId: "SE00000000000000000000001" }, description: "Your-description-for-the-transfer", priority: "fast", reference: "YOUR_INTERNAL_REFERENCE", referenceForBeneficiary: "Your-reference-for-the-beneficiary", review: { numberOfApprovalsRequired: 1 } } // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` #### Go ```go // Adyen Go API Library v14.0.0 import ( "context" "github.com/adyen/adyen-go-api-library/v9/src/common" "github.com/adyen/adyen-go-api-library/v9/src/adyen" "github.com/adyen/adyen-go-api-library/v9/src/transfers" ) client := adyen.NewClient(&common.Config{ ApiKey: "YOUR_BALANCE_PLATFORM_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) amount := transfers.Amount{ Currency: "EUR", Value: 60000, } transferRequestReview := transfers.TransferRequestReview{ NumberOfApprovalsRequired: common.PtrInt32(1), } counterpartyInfoV3 := transfers.CounterpartyInfoV3{ TransferInstrumentId: common.PtrString("SE00000000000000000000001"), } transferInfo := transfers.TransferInfo{ BalanceAccountId: common.PtrString("BA00000000000000000000001"), Reference: common.PtrString("YOUR_INTERNAL_REFERENCE"), Amount: amount, ReferenceForBeneficiary: common.PtrString("Your-reference-for-the-beneficiary"), Review: &transferRequestReview, Counterparty: counterpartyInfoV3, Description: common.PtrString("Your-description-for-the-transfer"), Category: "bank", Priority: common.PtrString("fast"), } // 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 v12.8.0 import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "YOUR_BALANCE_PLATFORM_API_KEY" adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "amount": { "value": 60000, "currency": "EUR" }, "balanceAccountId": "BA00000000000000000000001", "category": "bank", "counterparty": { "transferInstrumentId": "SE00000000000000000000001" }, "description": "Your-description-for-the-transfer", "priority": "fast", "reference": "YOUR_INTERNAL_REFERENCE", "referenceForBeneficiary": "Your-reference-for-the-beneficiary", "review": { "numberOfApprovalsRequired": 1 } } # Send the request result = adyen.transfers.transfers_api.transfer_funds(request=json_request, idempotency_key="UUID") ``` #### Ruby ```rb # Adyen Ruby API Library v9.9.0 require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'YOUR_BALANCE_PLATFORM_API_KEY' adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { :amount => { :value => 60000, :currency => 'EUR' }, :balanceAccountId => 'BA00000000000000000000001', :category => 'bank', :counterparty => { :transferInstrumentId => 'SE00000000000000000000001' }, :description => 'Your-description-for-the-transfer', :priority => 'fast', :reference => 'YOUR_INTERNAL_REFERENCE', :referenceForBeneficiary => 'Your-reference-for-the-beneficiary', :review => { :numberOfApprovalsRequired => 1 } } # Send the request result = adyen.transfers.transfers_api.transfer_funds(request_body, headers: { 'Idempotency-Key' => 'UUID' }) ``` #### NodeJS (TypeScript) ```ts // Adyen Node API Library v21.0.0 // Require the parts of the module you want to use import { Client, TransfersAPI, Types } from "@adyen/api-library"; // Initialize the client object const client = new Client({apiKey: "YOUR_BALANCE_PLATFORM_API_KEY", environment: "TEST"}); // Create the request object(s) const amount: Types.transfers.Amount = { currency: "EUR", value: 60000 }; const transferRequestReview: Types.transfers.TransferRequestReview = { numberOfApprovalsRequired: 1 }; const counterpartyInfoV3: Types.transfers.CounterpartyInfoV3 = { transferInstrumentId: "SE00000000000000000000001" }; const transferInfo: Types.transfers.TransferInfo = { balanceAccountId: "BA00000000000000000000001", reference: "YOUR_INTERNAL_REFERENCE", amount: amount, referenceForBeneficiary: "Your-reference-for-the-beneficiary", review: transferRequestReview, counterparty: counterpartyInfoV3, description: "Your-description-for-the-transfer", category: Types.transfers.TransferInfo.CategoryEnum.Bank, priority: Types.transfers.TransferInfo.PriorityEnum.Fast }; // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` 2. If the payout request is successful, you receive an **HTTP 2XX** response containing payout details, including the following parameters: | Parameter name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------- | | [review.numberOfApprovalsRequired](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#responses-202-review-numberOfApprovalsRequired) | Shows the number of approvals required to process the payout. | After triggering the review, a member of your team must [approve](/platforms/approve-cancel-transfers) the payout before Adyen continues processing it. ## 2. Track the status of the transfer You can view the status of funds transfers initiated by a payout in your [Customer Area](https://ca-test.adyen.com/), or track them by listening to webhooks. To track the status of funds transfers initiated by a payout: 1. Listen to the following webhooks: * [Transfer webhooks](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/overview): * [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook events notify you that funds will be deducted from a balance accounts. * [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook events notify of every status change of the funds transfer. * [Transaction webhooks](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/overview): Adyen sends a [balancePlatform.transaction.created](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/post/balancePlatform.transaction.created) webhook event to inform your server that funds have been deducted from a balance account. 2. Acknowledge the webhooks. 3. In the payload of the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook, note that: * The `event` array includes all previous transfer events. * The `sequenceNumber` defines the number of webhooks sent for the transfer, including the current one. For more details and examples, see [Payout webhooks](/payouts/payout-service/getting-paid/payout-webhooks). ## Troubleshooting The following example shows a common issue that you can encounter when attempting to make a transfer. ** ### Transfers to counterparty bank account is blocked. **POST /transfers response** ```json { "type": "https:\/\/docs.adyen.com\/errors\/unprocessable-entity", "errorCode": "1063_101", "title": "Transfers to counterparty is blocked.", "detail": "Transfer to counterparty bank account is blocked. One or more returns have been received before for transfer to this account due to [ORIGINAL_REASON_CODE]", "requestId": "92a70ca44359d45977c6f9176176aab0", "status": 422 } ``` This error indicates that your bank [returned](/platforms/payout-webhooks#payout-transfer-returned) a previous payout attempt. Some return codes indicate a temporary issue, and can be retried. Others indicate a permanent issue and result in this error message. ### Solution To avoid this error: 1. [Listen to transfer webhooks](/payouts/payout-service/getting-paid/payout-webhooks). These webhooks tell you when your bank returns a payout. 2. [Read the return reason](/payouts/payout-service/getting-paid/payout-webhooks#return-reason-codes). If the reason indicates a final status, do not retry the transfer. Only retry payouts that have return reason codes that are recommended to be retried. 3. Make sure that your bank account details are updated. To fix this error: 1. Reach out to your Adyen contact to update your bank account details. 2. Retry the payout by [making a new transfer request](#one-off-payouts). ## See also * [View transfer details](/payouts/payout-service/view-transfers-details) * [Payout webhooks](/payouts/payout-service/getting-paid/payout-webhooks)