--- title: "Transfer funds internally" description: "Initiate internal direct debits between your users' balance accounts." url: "https://docs.adyen.com/business-accounts/transfer-funds-internally" source_url: "https://docs.adyen.com/business-accounts/transfer-funds-internally.md" canonical: "https://docs.adyen.com/business-accounts/transfer-funds-internally" last_modified: "2026-05-26T13:48:55+02:00" language: "en" --- # Transfer funds internally Initiate internal direct debits between your users' balance accounts. [View source](/business-accounts/transfer-funds-internally.md) An **internal direct debit** moves funds between balance accounts within your balance platform. For example, to collect monthly or subscription fees from your users without triggering strong customer authentication (SCA) or payment fees, you can initiate an internal debit, where your liable balance account sends a debit request to your user's balance account. As a balance platform, you can also initiate internal direct debits between the balance accounts of two different users. ## Before you begin * Make sure that your server can [receive and accept webhooks](/development-resources/webhooks), and that you subscribed to the **Transfer webhooks** in your [Customer Area](https://ca-test.adyen.com/). * Ask our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) to enable transfers for the balance account that debits funds. * Make sure that your account holders have the following [capabilities](/business-accounts/verification-overview/capabilities): * The account holder of the balance account that initiates the direct debit must have the **sendToBalanceAccount** capability. * The account holder of the balance account that received the request must have the **receiveFromBalanceAccount** capability. ## Initiate an internal direct debit To initiate an internal direct debit, make a POST [/transfers](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers) request. In the body of the request, include 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 direct debit. | | [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 debit request. | | [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**. | | [type](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-type) | | Set to **internalDirectDebit** to debit the funds from the counterparty balance account. | | [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 pull **USDĀ 25** from your user's balance account to your liable balance account. **Initiate internal direct debit** #### 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": "USD", "value": 2500 }, "balanceAccountId": "BA00000000000000000LIABLE", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "category" : "internal", "type": "internalDirectDebit", "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("USD") .value(2500L); CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3() .balanceAccountId("BA00000000000000000000001"); TransferInfo transferInfo = new TransferInfo() .balanceAccountId("BA00000000000000000LIABLE") .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) .type(TransferInfo.TypeEnum.INTERNALDIRECTDEBIT); // 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("USD") ->setValue(2500); $counterpartyInfoV3 = new CounterpartyInfoV3(); $counterpartyInfoV3 ->setBalanceAccountId("BA00000000000000000000001"); $transferInfo = new TransferInfo(); $transferInfo ->setBalanceAccountId("BA00000000000000000LIABLE") ->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") ->setType("internalDirectDebit"); $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 = "USD", Value = 2500 }; CounterpartyInfoV3 counterpartyInfoV3 = new CounterpartyInfoV3 { BalanceAccountId = "BA00000000000000000000001" }; TransferInfo transferInfo = new TransferInfo { BalanceAccountId = "BA00000000000000000LIABLE", 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, Type = TransferInfo.TypeEnum.InternalDirectDebit }; // 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: "USD", value: 2500 }, balanceAccountId: "BA00000000000000000LIABLE", counterparty: { balanceAccountId: "BA00000000000000000000001" }, category: "internal", type: "internalDirectDebit", 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: "USD", Value: 2500, } counterpartyInfoV3 := transfers.CounterpartyInfoV3{ BalanceAccountId: common.PtrString("BA00000000000000000000001"), } transferInfo := transfers.TransferInfo{ BalanceAccountId: common.PtrString("BA00000000000000000LIABLE"), 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", Type: common.PtrString("internalDirectDebit"), } // 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": "USD", "value": 2500 }, "balanceAccountId": "BA00000000000000000LIABLE", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "category": "internal", "type": "internalDirectDebit", "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 => 'USD', :value => 2500 }, :balanceAccountId => 'BA00000000000000000LIABLE', :counterparty => { :balanceAccountId => 'BA00000000000000000000001' }, :category => 'internal', :type => 'internalDirectDebit', :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: "USD", value: 2500 }; const counterpartyInfoV3: Types.transfers.CounterpartyInfoV3 = { balanceAccountId: "BA00000000000000000000001" }; const transferInfo: Types.transfers.TransferInfo = { balanceAccountId: "BA00000000000000000LIABLE", 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, type: Types.transfers.TransferInfo.TypeEnum.InternalDirectDebit }; // Send the request const transfersAPI = new TransfersAPI(client); const response = transfersAPI.TransfersApi.transferFunds(transferInfo, { idempotencyKey: "UUID" }); ``` 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. Check this field if the status is not **authorised**.\ For example, the reason for a **refused** status can be **notEnoughBalance**. **Internal direct debit initiated** ```json { "creationDate": "2024-08-08T13:52:08+02:00", "id": "48NJIB9TWQJ6L7U7", "accountHolder": { "description": "Your description for your liable account holder", "id": "AH00000000000000000LIABLE", "reference": "Your reference for your liable account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA00000000000000000LIABLE", "reference": "Your reference for your liable balance account" }, "category" : "internal", "categoryData": { "type": "internalDirectDebit" }, "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "description": "YOUR_DESCRIPTION_OF_THE_TRANSFER", "direction": "outgoing", "reason": "approved", "reference": "YOUR_UNIQUE_REFERENCE_FOR_THE_TRANSFER", "referenceForBeneficiary": "Your-reference-sent-to-the-counterparty", "status": "authorised", "type": "internalDirectDebit" } ``` ## Get status updates For every internal transfer request, Adyen sends multiple webhooks to your server: a series of webhooks for the balance account where the transfer is an outgoing request, and a series of webhooks for the balance account where the transfer is an incoming request. Using these webhooks, you can track the status of the transfer: **received**, then **authorised**, and finally **booked**. The webhooks also inform you if the transfer failed. You can also [view the transfer details in your Customer Area](/business-accounts/view-transfers-details). Each transfer of funds between balance accounts appears in the Customer Area as two transfer entries: one for the balance account that is credited, and one for the balance account that is debited. When you initiate an internal direct debit is triggered between balance accounts in your balance platform, Adyen sends two kinds of webhooks: * [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created), that informs your server that funds will be transferred between the balance accounts. * [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated), that informs your server of changes in the status of the fund transfer. For each event you receive two sets of webhooks: * Webhooks for the source balance account, where you initiate the direct debit an outgoing request. * Webhooks for the target balance account, that received the direct debit as an incoming request. You can identify transfer webhooks triggered by internal direct debit requests by 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. | **internal** | | [direction](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created#request-data-direction) | The direction of the transfer request. | **outgoing** for the source balance account **incoming** for the target balance account | | [type](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created#request-data-type) | The type of internal transfer. | **internalDirectDebit** | For an internal direct debit, you receive webhooks for the following events: * The transfer is [initiated](#internal-direct-debit-initiated). * The transfer is [authorized](#internal-direct-debit-authorized). This indicates that the funds are reserved. * The transfer is [booked](#internal-direct-debit-booked). Expand the sections below to see the webhooks you would receive for the [example direct debit request above](#initiate-an-internal-direct-debit). ** #### 1. Internal direct debit initiated When you initiate an internal direct debit, we send you a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook with `status` **received**, to inform your server that funds will be transferred between balance accounts in your balance platform. ### Tab: Source balance account For the source balance account, the webhook indicates that funds will be credited to that account: * `direction`: **outgoing** * `balances.received`: a positive amount **Outgoing transfer request received** ```json { "data": { "id": "4VXNYX62NIZEZH8S", "type": "internalDirectDebit", "accountHolder": { "description": "Your description of your liable account holder", "id": "AH00000000000000000LIABLE", "reference": "Your reference your liable account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description of your liable balance account", "id": "BA00000000000000000LIABLE" }, "balances": [ { "currency": "USD", "received": 2500 } ], "balancePlatform": "YOUR_BALANCE_PLATFORM", "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "id": "MOCJ00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": 2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request", "sequenceNumber": 1, "status": "received" }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ### Tab: Target balance account For the target balance account, the webhook indicates that funds will be debited from that account: * `direction`: **incoming** * `balances.received`: a negative amount **Incoming transfer request received** ```json { "data": { "id": "3K6U5F62NIZJSIVI", "type": "internalDirectDebit", "accountHolder": { "description": "Your description for the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for the target balance account", "id": "BA00000000000000000000001" }, "balances": [ { "currency": "USD", "received": -2500 } ], "balancePlatform": "YOUR_BALANCE_PLATFORM", "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000LIABLE" }, "creationDate": "2024-08-28T13:30:05+02:00", "direction": "incoming", "description": "Your description of the transfer", "events": [ { "id": "KESG00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": -2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request", "status": "received", "sequenceNumber": 1 }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ** #### 2. Internal direct debit authorized When the scheduled or on-demand internal pull transfer is authorized, Adyen sends [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhooks with `status` **authorised**, to inform your server that the funds have been reserved on the source and target balance accounts. ### Tab: Source balance account For the source balance account, the webhook indicates that the transfer amount has been reserved to be credited: * `direction`: **outgoing** * `balances.reserved`: a positive amount **Outgoing transfer authorized** ```json { "data": { "id": "4VXNYX62NIZEZH8S", "type": "internalDirectDebit", "accountHolder": { "description": "Your description for your liable account holder", "id": "AH00000000000000000LIABLE", "reference": "Your reference for the account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA00000000000000000LIABLE" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "USD", "received": 0, "reserved": 2500 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "id": "MOCJ00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": 2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "MOCJ00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "USD", "received": -2500, "reserved": 2500, } ], "bookingDate": "2024-08-28T13:30:18+02:00" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request", "sequenceNumber": 2, "status": "authorised" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ### Tab: Target balance account For the target balance account, the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook indicates that the transfer amount has been reserved to be debited: * `direction`: **incoming** * `balances.reserved`: a negative amount **Incoming transfer authorized** ```json { "data": { "id": "3K6U5F62NIZJSIVI", "type": "internalDirectDebit", "accountHolder": { "description": "Your description for the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for the target balance account", "id": "BA00000000000000000000001" }, "balanceAccountId": "BA00000000000000000000001", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "USD", "received": 0, "reserved": -2500 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000LIABLE" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "incoming", "events": [ { "id": "KESG00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": -2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "KESG00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "USD", "received": 2500, "reserved": -2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request", "sequenceNumber": 2, "status": "authorised" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** #### 3. Internal direct debit booked When the scheduled or on-demand internal pull transfer is booked, Adyen sends [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhooks with `status` **booked**, to inform your server that the funds have been pulled from the target balance account to the source balance account. ### Tab: Source balance account For the source balance account, the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook indicates that the transfer amount has been credited: * `direction`: **outgoing** * `balances.balance`: a positive amount **Outgoing transfer booked** ```json { "data": { "id": "4VXNYX62NIZEZH8S", "type": "internalDirectDebit", "accountHolder": { "description": "Your description for your liable account holder", "id": "AH00000000000000000LIABLE", "reference": "Your reference for your liable account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA00000000000000000LIABLE" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 2500, "currency": "USD", "received": 0, "reserved": 0 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "id": "MOCJ00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": 2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "MOCJ00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "USD", "received": -2500, "reserved": 2500, } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "MOCJ00000000000000000000000003", "type": "accounting", "status": "booked", "mutations": [ { "balance": 2500, "currency": "USD", "received": 0, "reserved": -2500, } ], "bookingDate": "2024-08-28T13:30:18+02:00", "transactionId": "EVJN4294X224223D5KKNV5MBWJ53HFUSD" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request", "sequenceNumber": 3, "status": "booked", }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ### Tab: Target balance account For the target balance account, the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook indicates that the transfer amount has been debited: * `direction`: **incoming** * `balances.balance`: a negative amount **Incoming transfer booked** ```json { "data": { "id": "3K6U5F62NIZJSIVI", "type": "internalDirectDebit", "accountHolder": { "description": "Your description for the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "USD", "value": 2500 }, "balanceAccount": { "description": "Your description for the target balance account", "id": "BA00000000000000000000001" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -2500, "currency": "USD", "received": 0, "reserved": 0 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000LIABLE" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "incoming", "events": [ { "id": "KESG00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "USD", "received": -2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "KESG00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "USD", "received": 2500, "reserved": -2500 } ], "bookingDate": "2024-08-28T13:30:18+02:00" }, { "id": "KESG00000000000000000000000003", "type": "accounting", "status": "booked", "mutations": [ { "balance": -2500, "currency": "USD", "received": 0, "reserved": 2500 } ], "valueDate": "2024-08-28T13:30:18+02:00", "bookingDate": "2024-08-28T13:30:18+02:00", "transactionId": "EVJN42CL8224223D5KKNTXP54453VSUSD" } ], "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your-reference-for-the-recipient-of-the-transfer-request" "sequenceNumber": 3, "status": "booked" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ```