--- title: "Funds transfers" description: "Transfer funds internally to balance accounts." url: "https://docs.adyen.com/issuing/add-manage-funds/funds-transfers" source_url: "https://docs.adyen.com/issuing/add-manage-funds/funds-transfers.md" canonical: "https://docs.adyen.com/issuing/add-manage-funds/funds-transfers" last_modified: "2020-09-11T17:20:00+02:00" language: "en" --- # Funds transfers Transfer funds internally to balance accounts. [View source](/issuing/add-manage-funds/funds-transfers.md) Your Adyen-issued cards are always linked to a balance account that holds its funds. You can use the funds from the balance account to make business-related payments with the linked cards. To make sure that the balance account has enough funds to cover your business-related payments, you can make transfers to top up the account. You can do one of the following: * [Transfer funds from your verified external bank account (transfer instrument)](#transfer-from-your-transfer-instrument) * [Transfer funds internally](#transfer-funds-internally) ## Transfer from your transfer instrument To transfer funds to your balance account from your verified external bank account (transfer instrument): 1. Make sure you have created a [transfer instrument](/issuing/onboard-users/onboarding-steps?onboarding_type=custom\&location=nl\&legal_entity=organization#create-transfer-instrument) for your balance account. 2. Make a bank transfer of the required amount from your transfer instrument to Adyen's bank account. For details about Adyen's bank account, reach out to your Adyen contact. After Adyen receives the funds from your bank transfer, we settle these funds to the linked balance account. For detailed guidance on the full bank transfer funding process, including preparation steps and webhooks, see [Transfer funds from an external bank account](/issuing/add-manage-funds/external-bank-transfer). ## Transfer funds internally You can transfer funds internally between balance accounts, as long as the balance accounts belong to the same balance platform. The funds can be pushed or pulled from one balance account to the other: * When you **push** funds to the target balance account, that account is credited. * When you **pull** funds from the target balance account, that account is debited. ### Funding from your liable balance account Your liable balance account is the main balance account that belongs to your company. You can transfer funds internally from your liable balance account to your other balance accounts, to ensure that they have enough funds to make business-related payments. To do this, you must first deposit funds into your liable balance account using an [external bank transfer](/issuing/add-manage-funds/external-bank-transfer). Then, you must make a push transfer from your liable balance account to the balance account to which you want to add funds. ### Make an internal funds transfer Before you can transfer funds internally, reach out to your Adyen contact to: * Add a role for your [API credential](/issuing/integration-checklist#verify-your-test-credentials), which you will use for the [Transfers API](https://docs.adyen.com/api-explorer/transfers/latest/overview). * Enable transfers for the source balance account. You can now make an internal transfer by following these steps: 1. To move funds between balance accounts, make a POST [/transfers](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers) request. In the body of the request, specify the following fields: | Parameter | 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-") | An object containing the currency and value 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: the balance account that initiates the transfer request. | | [counterparty.balanceAccountId](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-counterparty-balanceAccountId) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the target balance account: the balance account that receives the transfer. The funds are credited to this 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 **internal**. | | [description](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-description) | | Your description of the transfer. You can use this to identify the transfer in the webhooks that you receive. | | [reference](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-reference) | | Your unique reference for the transfer. You can use this to identify the transfer in the webhooks that you receive. | | [referenceForBeneficiary](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-referenceForBeneficiary) | | Text to inform the recipient about the push or pull transfer. This reference is also included in all webhooks. Supported characters: a-z, A-Z, 0-9. | The following example shows how to push **EUR 100.00** from your liable balance account to your user's balance account. **Push funds to another balance account** #### 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": { "currency": "EUR", "value": 10000 }, "balanceAccountId": "BA00000000000000000000001", "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "category" : "internal", "referenceForBeneficiary": "Your-reference-sent-to-the-counterparty", "description": "YOUR_DESCRIPTION_OF_THE_TRANSFER", "reference": "YOUR_UNIQUE_REFERENCE_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(10000L); CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3() .balanceAccountId("BA00000000000000000000002"); TransferInfo transferInfo = new TransferInfo() .balanceAccountId("BA00000000000000000000001") .reference("YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER") .amount(amount) .referenceForBeneficiary("Your-reference-sent-to-the-counterparty") .counterparty(counterpartyInfoV3) .description("YOUR_DESCRIPTION_OF_THE_TRANSFER") .category(TransferInfo.CategoryEnum.INTERNAL); // 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(10000); $counterpartyInfoV3 = new CounterpartyInfoV3(); $counterpartyInfoV3 ->setBalanceAccountId("BA00000000000000000000002"); $transferInfo = new TransferInfo(); $transferInfo ->setBalanceAccountId("BA00000000000000000000001") ->setReference("YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER") ->setAmount($amount) ->setReferenceForBeneficiary("Your-reference-sent-to-the-counterparty") ->setCounterparty($counterpartyInfoV3) ->setDescription("YOUR_DESCRIPTION_OF_THE_TRANSFER") ->setCategory("internal"); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new TransfersApi($client); $response = $service->transferFunds($transferInfo, $requestOptions); ``` #### C\# ```cs // Adyen .net API Library v28.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 = 10000 }; CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3 { BalanceAccountId = "BA00000000000000000000002" }; TransferInfo transferInfo = new TransferInfo { BalanceAccountId = "BA00000000000000000000001", Reference = "YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER", Amount = amount, ReferenceForBeneficiary = "Your-reference-sent-to-the-counterparty", Counterparty = counterpartyInfoV3, Description = "YOUR_DESCRIPTION_OF_THE_TRANSFER", Category = TransferInfo.CategoryEnum.Internal }; // 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: { currency: "EUR", value: 10000 }, balanceAccountId: "BA00000000000000000000001", counterparty: { balanceAccountId: "BA00000000000000000000002" }, category: "internal", referenceForBeneficiary: "Your-reference-sent-to-the-counterparty", description: "YOUR_DESCRIPTION_OF_THE_TRANSFER", reference: "YOUR_UNIQUE_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 v17.0.0 import ( "context" "github.com/adyen/adyen-go-api-library/v17/src/common" "github.com/adyen/adyen-go-api-library/v17/src/adyen" "github.com/adyen/adyen-go-api-library/v17/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: 10000, } counterpartyInfoV3 := transfers.CounterpartyInfoV3{ BalanceAccountId: common.PtrString("BA00000000000000000000002"), } transferInfo := transfers.TransferInfo{ BalanceAccountId: common.PtrString("BA00000000000000000000001"), Reference: common.PtrString("YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER"), Amount: amount, ReferenceForBeneficiary: common.PtrString("Your-reference-sent-to-the-counterparty"), Counterparty: counterpartyInfoV3, Description: common.PtrString("YOUR_DESCRIPTION_OF_THE_TRANSFER"), Category: "internal", } // 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": { "currency": "EUR", "value": 10000 }, "balanceAccountId": "BA00000000000000000000001", "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "category": "internal", "referenceForBeneficiary": "Your-reference-sent-to-the-counterparty", "description": "YOUR_DESCRIPTION_OF_THE_TRANSFER", "reference": "YOUR_UNIQUE_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.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 => { :currency => 'EUR', :value => 10000 }, :balanceAccountId => 'BA00000000000000000000001', :counterparty => { :balanceAccountId => 'BA00000000000000000000002' }, :category => 'internal', :referenceForBeneficiary => 'Your-reference-sent-to-the-counterparty', :description => 'YOUR_DESCRIPTION_OF_THE_TRANSFER', :reference => 'YOUR_UNIQUE_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 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: 10000 }; const counterpartyInfoV3: Types.transfers.CounterpartyInfoV3 = { balanceAccountId: "BA00000000000000000000002" }; const transferInfo: Types.transfers.TransferInfo = { balanceAccountId: "BA00000000000000000000001", reference: "YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER", amount: amount, referenceForBeneficiary: "Your-reference-sent-to-the-counterparty", counterparty: counterpartyInfoV3, description: "YOUR_DESCRIPTION_OF_THE_TRANSFER", category: Types.transfers.TransferInfo.CategoryEnum.Internal }; // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` 2. In the response, note the following: * `id`: the unique ID of the transfer. * `status`: the result of the transfer. * `reason`: an explanation of the status.\ For example, the reason for a **refused** status can be **notEnoughBalance**. **Response** ```json { "creationDate": "2023-08-08T13:52:08+02:00", "id": "48NJIB9TWQJ6L7U7", "accountHolder": { "description": "Your account holder description", "id": "AH00000000000000000000001", "reference": "Your account holder reference" }, "amount": { "currency": "EUR", "value": 10000 }, "balanceAccount": { "description": "Your balance account description", "id": "BA00000000000000000000001", "reference": "Your balance account reference" }, "category" : "internal", "categoryData": { "type": "internal" }, "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "description": "YOUR_DESCRIPTION_OF_THE_TRANSFER", "direction": "outgoing", "reason": "pending", "reference": "YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER", "referenceForBeneficiary": "Your-reference-sent-to-the-counterparty", "status": "received", "type": "internalTransfer" } ``` 3. To know if the transfer has been completed, keep track of [webhooks](/issuing/webhook-types/fund-transfers-webhooks). You can also make a GET [/balanceAccounts/{id}](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)) request.