Marketplace icon

Top up on demand

Make payment requests to top up balance accounts on demand.

You can submit requests to manually top-up your users' balance accounts when needed. In this case, you create a one-off payment funded by your user, that increases the balance in their balance account.

Requirements

Requirement Description
Integration type Adyen for Platforms
API credential roles Make sure that you have the credentials for the Checkout API.
Webhooks Ensure that your server can receive and accept standard webhooks.
Subscribe to the following webhooks:
Capabilities Make sure your user has the right capabilities to fund the top-up.

To top up using your user's verified transfer transfer instrument (bank account), they need the following capabilities:
  • receiveFromPlatformPayments
  • receiveFromTransferInstrument

To top up using other payment methods, your user needs the following capability:
  • receiveFromPlatformPayments
Limitations To top-up using your user's verified transfer instrument (bank account), your user must have a bank account in the SEPA zone, the UK, or the US.
Setup steps Before you begin:

Fund the top-up

Top-ups of your users' balance account are usually funded by your users themselves.

Your users can fund the top-up of their balance accounts in the following ways:

Option 1: Using their verified transfer instrument (bank account)

  • The following capabilities must be allowed for your user, and have a valid verificationStatus:

    • receiveFromPlatformPayments
    • receiveFromTransferInstrument
  • Your user must have a bank account in the SEPA zone, the UK, or the US. You cannot fund a top-up with bank accounts from other regions.

Option 2: Using any other payment method

Make sure that following capability is allowed for your user, and has a valid verificationStatus: receiveFromPlatformPayments

Differentiate the top-up

When you process a payment to top up a balance account, you can include instructions to define the top-up and differentiate it from regular payments. This allows you to:

  • Reconcile top-ups separately from other payments using our reports.
  • For users based in the US, exclude top-ups from tax filings. Top-ups do not count towards your user's revenue, and are not included in the 1099-K tax forms.

When you provide instructions to define the top-up, you can also specify where to book the top-up amount and the transaction fees it incurs.

(Conditional) Stay compliant with regulations

When you initiate a top-up from your user's verified transfer instrument (bank account), you must ensure that you stay compliant with the direct debit regulations in your user's region. If your user's bank account is in the SEPA zone or the UK, you must do the following:

SEPA Direct Debit

To initiate top-ups from bank accounts in the SEPA zone using SEPA Direct Debit, your users must first accept a mandate that authorizes you to debit their accounts. We recommend that you use the following text for the mandate:

By providing your payment details and confirming this payment, you authorize (A) {Name of your marketplace} and Adyen, our payment service provider, to send instructions to your bank to debit your account and (B) your bank to debit your account by the payment instruction. As part of your rights, you're entitled to a refund from your bank under the terms and conditions of your agreement with your bank. You must claim a refund within 8 weeks from the date your account was debited. You can request a statement from your bank explaining your rights.

Your users only need to accept this mandate once. You can either add the recommended text to their service agreement document with your marketplace, or send it to them in an email.

BACS Direct Debit

For each top-up you initiate from bank accounts in the UK using BACS Direct Debit, your users must confirm the following:

  • They authorize you to debit their bank account to cover negative balances on their balance account.
  • The bank account is in their name.
  • They are the only signatory required to authorize the direct debit on this account.

We recommend that you use the following text for the confirmations:

  • I agree that {name of your marketplace} can deduct funds from my bank account to cover negative balances on my balance account.

  • I confirm that the bank account is in my name and that I am the only signatory required to authorize the direct debit on this bank account.

You must also send an advance notice to your users by email for each top-up you initiate. According to scheme rules, your users may file a chargeback when they do not receive a notification at least 10 days before a charge. The notice must contain the following:

  • The total amount to be debited from your user’s account.
  • The direct debit due date (day, month, and year). This is 2 business days after the top-up is initiated.
  • The recurringDetailReference of the payment.
  • The name of your marketplace.
  • Your contact phone number and email address.

We recommend that you use the following text for the notice:

Subject: ADVANCE NOTICE OF DIRECT DEBIT COLLECTION

We will debit your bank account on or shortly after {Settlement date (dd/mm/yy)}. This payment will appear on your bank statement as ADYEN RE {Your marketplace name}, with recurring detail reference {Your recurringDetailReference}.

Name of your user: {Your user's legal entity name}
Direct debit amount due: {Top-up amount}

Please check the details provided. If you have any queries about this notification, or would like to cancel or make changes, please contact {Your company name and telephone number}.

You have the right to cancel your direct debit at any time. Bacs Direct Debits are covered by the Direct Debit Guarantee.

Make a top-up request

To top up a balance account, make a POST /payments request for the amount you want to top up.

You cannot initiate a top-up using a /sessions request.

The following tabs show you how to initiate a top-up using your user's transfer instrument or another payment method.

In your payment request, specify the following fields:

Parameter Required Description
amount.currency -white_check_mark-
Required for currency conversion.
The currency of the top-up.
amount.value -white_check_mark- The value of the top-up.
merchantAccount -white_check_mark- Your merchant account name.
reference -white_check_mark- Your unique reference for this payment.
returnUrl -white_check_mark- URL to where the shopper should be taken back to after a redirection. The URL can contain a maximum of 1024 characters and should include the protocol: http:// or https://. You can also include your own additional query parameters, for example, shopper ID or order reference number.
paymentMethod.type -white_check_mark- The type of payment method. Possible values:
  • ach: for payments from verified bank accounts in the US, made in USD.
  • sepadirectdebit: for payments from verified bank accounts in the SEPA zone, made in EUR.
  • directdebit_GB: for payments from verified bank accounts in the UK, made in GBP.
paymentMethod.transferInstrumentId -white_check_mark- The unique identifier of your user's verified transfer instrument (bank account).
splits An array containing instructions for each split of the total payment amount. You can define instructions for the top-up here.

If you do not include a splits array, the funds are booked to your liable account, and classified as a regular payment.

Splits array

To define the top-up and differentiate it from regular payments, include the following objects in your splits array:

In each object within the array, specify:

Parameter Required Description
splits.type -white_check_mark- Defines the top-up and the transaction fees.
splits.account The balance account that is credited or debited.
  • Top-up amount: the unique identifier of the balance account you want to top up.
  • Transaction fees: the unique identifier of the balance account to which you want to book the fees.
splits.amount.value -white_check_mark-
Required for the top-up object
The amount of the top-up. You do not need to specify this field for the transaction fees object, because they are not known at the time of payment.

Here is an example of a POST /payments request to top up your user's balance account with EUR 100.00 using their transfer instrument with ID SE00000000000000000000001. In this example, your user is based in the SEPA zone.

Top-up request using a bank account from the SEPA zone
Expand view
Copy link to code block
Copy code
Copy code
curl https://checkout-test.adyen.com/checkout/v71/payments \
-H 'x-api-key: ADYEN_API_KEY' \
-H 'content-type: application/json' \
-X POST \
-d '{
"paymentMethod": {
"type": "sepadirectdebit",
"transferInstrumentId": "SE00000000000000000000001"
},
"amount": {
"value": 10000,
"currency": "EUR"
},
"reference": "YOUR_ORDER_NUMBER",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"returnUrl": "https://your-company.com/...",
"splits": [
{
"amount": {
"value": 10000
},
"type": "TopUp",
"account": "BA00000000000000000000001",
"reference": "Your reference for the top-up.",
"description": "Your description for the top-up."
},
{
"type": "PaymentFee",
"account": "BA00000000000000000000001",
"reference": "Your reference for the transaction fees.",
"description": "Your description for the transaction fees."
}
]
}'

After you make the request, you receive the following response:

Response
Expand view
Copy link to code block
Copy code
Copy code
{
"additionalData": {
"sepadirectdebit.dateOfSignature": "2024-05-02",
"sepadirectdebit.mandateId": "FJM726V375BV9D82",
"sepadirectdebit.sequenceType": "Recurring"
},
"pspReference": "QFQTPCQ8HXSKGK82",
"resultCode": "Authorised",
"amount": {
"currency": "EUR",
"value": 10000
},
"merchantReference": "YOUR_ORDER_NUMBER",
"paymentMethod": {
"type": "sepadirectdebit"
}
}

Get updates when a top-up is triggered

Use top-up webhooks to track incoming payment requests related to on-demand top-ups. These webhooks provide the status of the incoming payment request, from the time when Adyen received the request and the payment was authorised, up to when the funds were added to the balance account. These webhooks also inform you if the payment failed.