Adyen-for-platform icon

Webhooks

Find out which webhooks Adyen sends for internal funds transfers.

Payment webhooks

For information on which payment webhooks Adyen sends for internal transfer-related events, see Payment webhooks (deprecated).

When you initiate an internal transfer between balance accounts in your platform, Adyen sends two kinds of webhooks:

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:

Internal funds transfer

You can identify transfer webhooks triggered by internal funds transfers by the following values:

Parameter Description Value
category The category of the transfer. internal
direction The direction of the transfer request. outgoing for the source balance account
incoming for the target balance account
type The type of internal transfer. internalTransfer

For an internal sweep or on-demand transfer, you receive webhooks for the following events:

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
Expand view
Copy link to code block
Copy code
Copy code
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"
}'

Expand the sections below to see the webhooks you would receive for the example transfer request.

When a scheduled or on-demand internal transfer is triggered, we send balancePlatform.transfer.created webhooks with status received, to inform your server that funds will be transferred between balance accounts in your platform.

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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}

When the scheduled or on-demand internal push transfer is authorized, we send balancePlatform.transfer.updated webhooks with status authorised, to inform your server that the funds have been reserved on the source and target balance accounts.

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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}

When the scheduled or on-demand internal push transfer is booked, we send 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.

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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}

Returned internal transfer

If needed, you can return the funds to the source balance account.

The following is an example for an internal return request.

Return request
Expand view
Copy link to code block
Copy code
Copy code
{
"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.

When a return is initiated, we send a 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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}

When the return is authorized, we send a 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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}

When the return is processed, we send you two balancePlatform.transfer.updated webhooks, one for each of the balance accounts involved.

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
Expand view
Copy link to code block
Copy code
Copy code
{
"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"
}