--- title: "Webhooks for internal transfers" description: "Find out which webhooks Adyen sends for internal funds transfers." url: "https://docs.adyen.com/payouts/payout-service/internal-fund-transfers/internal-transfer-webhooks" source_url: "https://docs.adyen.com/payouts/payout-service/internal-fund-transfers/internal-transfer-webhooks.md" canonical: "https://docs.adyen.com/payouts/payout-service/internal-fund-transfers/internal-transfer-webhooks" last_modified: "2026-05-24T12:54:31+02:00" language: "en" --- # Webhooks for internal transfers Find out which webhooks Adyen sends for internal funds transfers. [View source](/payouts/payout-service/internal-fund-transfers/internal-transfer-webhooks.md) When you initiate an internal transfer between balance accounts in your platform, Adyen sends two kinds of webhooks: * [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created), which 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), which informs your server of changes in the status of the transfer. For each event you receive two sets webhooks: * Webhooks for the source balance account where you initiate the transfer as an outgoing request. * Webhooks for the target balance account, where you receive the transfer as an incoming request. To keep track of events related to internal transfers in your platform, make sure that: * Your server can [receive and accept webhooks](/development-resources/webhooks/configure-and-manage). * You subscribed to the **Transfer webhooks** in your [test Customer Area](https://ca-test.adyen.com/). ## Internal funds transfer You can identify transfer webhooks triggered by internal funds transfers 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. | **internalTransfer** | For an internal sweep or on-demand transfer, you receive webhooks for the following events: * The transfer is [initiated](#internal-push-transfer-initiated). * The transfer is [authorized](#internal-push-transfer-authorized). This indicates that the funds are reserved. * The transfer is [booked](#internal-push-transfer-booked). You receive these webhooks for each of the balance accounts involved in the transfer. The following is an example for an internal transfer request: **Internal 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": { "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" }); ``` Expand the sections below to see the webhooks you would receive for the example transfer request. ** #### 1. Internal transfer initiated When a scheduled or on-demand internal transfer is triggered, we send [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhooks with `status` **received**, to inform your server that funds will be transferred between balance accounts in your platform. ### Tab: Source balance account For the source balance account, the webhook indicates that funds will be debited from that account: * `direction`: **outgoing** * `balances.received`: a negative amount **Outgoing transfer request received** ```json { "data": { "id": "1WIZQB5XXY7MHOXH", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the source balance account", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the source balance account", "id": "BA00000000000000000000001" }, "balanceAccountId": "BA00000000000000000000001", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": -1000 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00" "id": "NPDK00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -1000 } ], "status": "received", "type": "accounting" } ], "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 credited to that account: * `direction`: **incoming** * `balances.received`: a positive amount **Incoming transfer request received** ```json { "data": { "id": "2WT1N05XXY7P9XH9", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the target balance account", "id": "BA00000000000000000000002" }, "balanceAccountId": "BA00000000000000000000002", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 1000 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "incoming", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 1000 } ], "status": "received", "type": "accounting", } ], "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" } ``` ** #### 2. Internal transfer authorized When the scheduled or on-demand internal push transfer is authorized, we send [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 debited: * `direction`: **outgoing** * `balances.reserved`: a negative amount **Outgoing transfer authorized** ```json { "data": { "id": "1WIZQB5XXY7MHOXH", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the source balance account", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the source balance account", "id": "BA00000000000000000000001" }, "balanceAccountId": "BA00000000000000000000001", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": -1000 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00" "id": "NPDK00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -1000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2024-08-28T13:30:18+02:00" "id": "NPDK00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "status": "authorised", "type": "accounting" } ], "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 webhook indicates that the transfer amount has been reserved to be credited: * `direction`: **incoming** * `balances.reserved`: a positive amount **Incoming transfer authorized** ```json { "data": { "id": "2WT1N05XXY7P9XH9", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the target balance account", "id": "BA00000000000000000000002" }, "balanceAccountId": "BA00000000000000000000002", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": 1000 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "incoming", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 1000 } ], "status": "received", "type": "accounting", }, { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": -1000, "reserved": 1000 } ], "status": "authorised", "type": "accounting", } ], "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 transfer booked When the scheduled or on-demand internal push transfer is booked, we send [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 pushed from the source balance account to the target balance account. ### Tab: Source balance account For the source balance account, the webhook indicates that the transfer amount has been debited, and where the funds were sent to: * `direction`: **outgoing** * `balances.balance`: a negative amount * `counterparty.balanceAccountId`: the ID of the balance account that received the funds **Outgoing transfer booked** ```json { "data": { "id": "1WIZQB5XXY7MHOXH", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the source balance account", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the source balance account", "id": "BA00000000000000000000001" }, "balanceAccountId": "BA00000000000000000000001", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -1000 "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "outgoing", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "NPDK00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -1000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "NPDK00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "NPDK00000000000000000000000003", "mutations": [ { "balance": -1000 "currency": "EUR", "received": 0, "reserved": 1000 } ], "status": "booked", "transactionId": "EVJN42CL8224223D5KKJWCXFXQ3QGLEUR", "type": "accounting", "valuDate": "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": 3, "status": "booked", "transactionId": "EVJN42CL8224223D5KKJWCXFXQ3QGLEUR" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ### Tab: Target balance account For the target balance account, the webhook indicates that the transfer amount has been credited, and where the funds came from: * `direction`: **incoming** * `balances.balance`: a positive amount * `counterparty.balanceAccountId`: the ID of the balance account that sent the funds **Incoming transfer booked** ```json { "data": { "id": "2WT1N05XXY7P9XH9", "type": "internalTransfer", "accountHolder": { "description": "Your description of the account holder of the target balance account", "id": "AH00000000000000000000002", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 1000 }, "balanceAccount": { "description": "Your description of the target balance account", "id": "BA00000000000000000000002" }, "balanceAccountId": "BA00000000000000000000002", "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "internal", "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-08-28T13:30:05+02:00", "description": "Your description of the transfer", "direction": "incoming", "events": [ { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": 1000 } ], "status": "received", "type": "accounting", }, { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": -1000, "reserved": 1000 } ], "status": "authorised", "type": "accounting", }, { "bookingDate": "2024-08-28T13:30:18+02:00", "id": "JDRF00000000000000000000000003", "mutations": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": -1000 } ], "status": "booked", "transactionId": "FWKP42CL8224223D5KKJWD6FXS3VQCEUR", "type": "accounting", "valueDate": "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": 3, "status": "booked", "transactionId": "FWKP42CL8224223D5KKJWD6FXS3VQCEUR" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ## Returned internal transfer If needed, you can [return the funds](/payouts/payout-service/internal-fund-transfers/return-transfers) to the source balance account. The following is an example for an internal return request. **Return request** ```json { "amount": { "value": 1000, "currency": "EUR" }, "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } ``` Expand the sections below to see the webhooks you would receive for the example return request. The webhooks show that the return is handled as a modification of the original transfer. ** #### 1. Return initiated When a return is initiated, we send a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook to inform your server that funds will be returned to the source balance account. The webhook has all the details of the original incoming transfer, and an additional `event` that includes the `modification` details: * `type` **return** * `status`: **received** * `direction`: **outgoing** * `reference`: the reference from the return request This shows that the incoming funds in the original transfer are now outgoing. **Return request received** ```json { "data": { "id": "1WT1N05XXY7P9XGB", "type": "internalTransfer", "amount": { "value": 1000, "currency": "EUR" }, "events": [ { "id": "EVJN00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "EUR", "received": 1000 } ], "bookingDate": "2024-09-11T11:50:54+02:00" }, { "id": "EVJN00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "EUR", "received": -1000, "reserved": 1000 } ], "bookingDate": "2024-09-11T11:50:55+02:00" }, { "id": "EVJN00000000000000000000000003", "type": "accounting", "status": "booked", "mutations": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": -1000 } ], "valueDate": "2024-09-11T11:50:40+02:00", "bookingDate": "2024-09-11T11:50:55+02:00", "transactionId": "EVJN4227C224222D5JLWTLKDJT4XMTEUR" }, { "id": "EVJN00000000000000000000000004", "type": "accounting", "mutations": [ { "currency": "EUR", "received": -1000 } ], "bookingDate": "2024-09-11T11:53:22+02:00", "modification": { "id": "1WT1N05XXY7P9XGB", "type": "return", "status": "received", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } } ], "reason": "approved", "status": "booked", "balances": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "internal", "direction": "incoming", "reference": "Your reference for the transfer", "description": "Your description of the transfer", "categoryData": { "type": "internal" }, "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-09-11T11:50:40+02:00", "accountHolder": { "id": "AH00000000000000000000002", "reference": "Your reference for the account holder", "description": "Your description of the account holder" }, "balanceAccount": { "id": "BA00000000000000000000002", "description": "Your description of the balance account" }, "sequenceNumber": 4, "balancePlatform": "YOUR_BALANCE_PLATFORM", "referenceForBeneficiary": "Your reference for the recipient of the transfer request" }, "type": "balancePlatform.transfer.updated", "environment": "test" } ``` ** #### 2. Return authorized When the return is authorized, we send a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook to inform your server that the return amount has been reserved. The webhook has all the details of the previous incoming transfer, and an additional `event` with the details of the `modification`: * `type` **return** * `status`: **authorised** * `direction`: **outgoing** * `reference`: the reference from the return request **Return authorized** ```json { "data": { "id": "1WT1N05XXY7P9XGB", "type": "internalTransfer", "amount": { "value": 1000, "currency": "EUR" }, "events": [ { "id": "EVJN00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "EUR", "received": 1000 } ], "bookingDate": "2024-09-11T11:50:54+02:00" }, { "id": "EVJN00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "EUR", "received": -1000, "reserved": 1000 } ], "bookingDate": "2024-09-11T11:50:55+02:00" }, { "id": "EVJN00000000000000000000000003", "type": "accounting", "status": "booked", "mutations": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": -1000 } ], "valueDate": "2024-09-11T11:50:40+02:00", "bookingDate": "2024-09-11T11:50:55+02:00", "transactionId": "EVJN4227C224222D5JLWTLKDJT4XMTEUR" }, { "id": "EVJN00000000000000000000000004", "type": "accounting", "mutations": [ { "currency": "EUR", "received": -1000 } ], "bookingDate": "2024-09-11T11:53:22+02:00", "modification": { "id": "1WT1N05XXY7P9XGB", "type": "return", "status": "received", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } }, { "id": "EVJN00000000000000000000000005", "type": "accounting", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "bookingDate": "2024-09-11T11:53:37+02:00", "modification": { "id": "1WT1N05XXY7P9XGB", "type": "return", "status": "authorised", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } } ], "reason": "approved", "status": "booked", "balances": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": -1000 } ], "category": "internal", "direction": "incoming", "reference": "Your reference for the transfer", "description": "Your description of the transfer", "categoryData": { "type": "internal" }, "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-09-11T11:50:40+02:00", "accountHolder": { "id": "AH00000000000000000000002", "reference": "Your reference for the account holder", "description": "Your description of the account holder" }, "balanceAccount": { "id": "BA00000000000000000000002", "description": "Your description of the balance account" }, "sequenceNumber": 5, "balancePlatform": "YOUR_BALANCE_PLATFORM", "referenceForBeneficiary": "Your reference for the recipient of the transfer request" }, "type": "balancePlatform.transfer.updated", "environment": "test" } ``` ** #### 3. Return booked When the return is processed, we send you two [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhooks, one for each of the balance accounts involved. ### Tab: Source balance account The webhook has all the details of the original incoming transfer, and an additional `event` with the details of the `modification`: * `type` **return** * `status`: **booked** * `direction`: **outgoing** * `reference`: the reference from the return request The `balances` are now all **0**. **Return booked** ```json { "data": { "id": "1WT1N05XXY7P9XGB", "type": "internalTransfer", "amount": { "value": 1000, "currency": "EUR" }, "events": [ { "id": "EVJN00000000000000000000000001", "type": "accounting", "status": "received", "mutations": [ { "currency": "EUR", "received": 1000 } ], "bookingDate": "2024-09-11T11:50:54+02:00" }, { "id": "EVJN00000000000000000000000002", "type": "accounting", "status": "authorised", "mutations": [ { "currency": "EUR", "received": -1000, "reserved": 1000 } ], "bookingDate": "2024-09-11T11:50:55+02:00" }, { "id": "EVJN00000000000000000000000003", "type": "accounting", "status": "booked", "mutations": [ { "balance": 1000, "currency": "EUR", "received": 0, "reserved": -1000 } ], "valueDate": "2024-09-11T11:50:40+02:00", "bookingDate": "2024-09-11T11:50:55+02:00", "transactionId": "EVJN4227C224222D5JLWTLKDJT4XMTEUR" }, { "id": "EVJN00000000000000000000000004", "type": "accounting", "mutations": [ { "currency": "EUR", "received": -1000 } ], "bookingDate": "2024-09-11T11:53:22+02:00", "modification": { "id": "1WT1N05XXY7P9XGB", "type": "return", "status": "received", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } }, { "id": "EVJN00000000000000000000000005", "type": "accounting", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "bookingDate": "2024-09-11T11:53:37+02:00", "modification": { "id": "1WT1N05XXY7P9XGB", "type": "return", "status": "authorised", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" } }, { "id": "EVJN00000000000000000000000006", "type": "accounting", "mutations": [ { "balance": -1000, "currency": "EUR", "received": 0, "reserved": 1000 } ], "valueDate": "2024-09-11T11:53:38+02:00", "bookingDate": "2024-09-11T11:53:38+02:00", "modification": { "id": "1WIZQB5XXY7MHOXH", "type": "return", "status": "booked", "direction": "outgoing", "reference": "YOUR_REFERENCE_FOR_THE_RETURN" }, "transactionId": "EVJN4227C224222D5JLWTSDF2K4FTFEUR" } ], "reason": "approved", "status": "booked", "balances": [ { "balance": 0, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "internal", "direction": "incoming", "reference": "Your reference for the transfer", "description": "Your description of the transfer", "categoryData": { "type": "internal" }, "counterparty": { "balanceAccountId": "BA00000000000000000000001" }, "creationDate": "2024-09-11T11:50:40+02:00", "accountHolder": { "id": "AH00000000000000000000002", "reference": "Your reference for the account holder", "description": "Your description of the account holder" }, "balanceAccount": { "id": "BA00000000000000000000002", "description": "Your description of the balance account" }, "sequenceNumber": 6, "balancePlatform": "YOUR_BALANCE_PLATFORM", "referenceForBeneficiary": "Your reference for the recipient of the transfer request" }, "type": "balancePlatform.transfer.updated", "environment": "test" } ``` ### Tab: Target balance account When the returned funds are credited to the balance account that sent the original funds transfer request, we send you a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook. The webhook has all the details of the previous outgoing transfer, and an additional `event` with the details of the `modification`: * `type` **return** * `status`: **booked** * `direction`: **incoming** * `reference`: the reference from the return request. **Return booked** ```json { "data": { "id": "1WIZQB5XXY7MHOXH", "type": "internalTransfer", "amount": { "value": 1000, "currency": "EUR" }, "events": [ { "bookingDate": "2024-09-20T13:19:40+02:00", "id": "GXLP00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -1000 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2024-09-20T13:19:40+02:00", "id": "GXLP00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 1000, "reserved": -1000 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2024-09-20T13:19:40+02:00", "id": "GXLP00000000000000000000000003", "mutations": [ { "balance": -1000, "currency": "EUR", "received": 0, "reserved": 1000 } ], "status": "booked", "transactionId": "EVJN4227222422375JN7J8643N4HTGEUR", "type": "accounting", "valueDate": "2024-09-20T13:19:35+02:00" }, { "bookingDate": "2024-09-20T13:21:02+02:00", "id": "GXLP00000000000000000000000004", "modification": { "direction": "incoming", "status": "booked", "type": "return" }, "mutations": [ { "balance": 1000, "currency": "EUR", "received": 0 } ], "transactionId": "EVJN4227C22422375JN7JC49X36C4ZEUR", "type": "accounting", "valueDate": "2024-09-20T13:20:52+02:00" } ], "balanceAccount": { "description": "Your description of the balance account", "id": "BA00000000000000000000001" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": 0, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "internal", "categoryData": { "type": "internal" }, "counterparty": { "balanceAccountId": "BA00000000000000000000002" }, "creationDate": "2024-09-20T13:19:35+02:00", "accountHolder": { "description": "Your description of the account holder", "id": "AH00000000000000000000001" }, "description": "Your description of the transfer", "direction": "outgoing", "reason": "approved", "reference": "Your reference for the transfer", "referenceForBeneficiary": "Your reference for the recipient of the transfer request", "sequenceNumber": 4, "status": "booked" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ```