--- title: "Manage bank account details" description: "Learn how to securely process the details of third-party bank accounts." url: "https://docs.adyen.com/payouts/payout-service/pay-out-to-bank-accounts/manage-bank-details" source_url: "https://docs.adyen.com/payouts/payout-service/pay-out-to-bank-accounts/manage-bank-details.md" canonical: "https://docs.adyen.com/payouts/payout-service/pay-out-to-bank-accounts/manage-bank-details" last_modified: "2023-11-30T12:07:00+01:00" language: "en" --- # Manage bank account details Learn how to securely process the details of third-party bank accounts. [View source](/payouts/payout-service/pay-out-to-bank-accounts/manage-bank-details.md) This page explains how to manage bank account details for third-party payouts. It covers how to securely [store bank account details](#store-bank-account-details), allowing you to process bank account transfers efficiently. ## Tokenization for payouts Adyen's [tokenization](/online-payments/tokenization) service lets you process payouts to your counterparties using tokenized bank account details. A token is a unique reference for a third party's bank account details, which helps you minimize security risks, simplify data management, and streamline recurring payouts to known recipients. ## Requirements Before you begin, take into account the following requirements, limitations, and preparations. | Requirement | Description | | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | An Adyen [payout service integration](/payouts/payout-service/integration-checklist/) and our [Checkout API](https://docs.adyen.com/api-explorer/Checkout/latest/overview) for tokenization. | | **[API credentials](/development-resources/api-credentials)** | Your company (**ws\@Company.\[YourCompanyAccount]**) has the following [role](/development-resources/api-credentials/roles) to use with the [Checkout API](https://docs.adyen.com/api-explorer/Checkout/latest/overview): - **Checkout encrypted cardholder data** | | **[Webhooks](/development-resources/webhooks)** | Your server must be able to receive and accept webhooks. | | **Limitations** | Take the following limitations into account:- You cannot use local account details for cross-border transfers. When tokenizing bank details for cross-border payouts, you must use a format that supports them, such as [NumberAndBicAccountIdentification](https://docs.adyen.com/api-explorer/transfers/latest/post/transfers#request-counterparty-bankAccount-accountIdentification-NumberAndBicAccountIdentification). - The tokenization service does not validate bank accounts when creating a token. Invalid details may lead to failed payouts later. | | | | | **Setup steps** | Reach out to your Adyen contact to enable the feature on your account. | ## Supported countries/regions Adyen currently supports payouts to tokenized local bank account details in the following regions: | Europe | | | ------ | - | IBANs (SEPA Direct Debit)\ UK Local (BACS) | North America | | | ------------- | - | US Local (ACH) ## Store bank account details To tokenize and store bank account details: 1. Make a POST [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request, specifying the following parameters: | Request parameter | Required | Description | | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | [amount.currency](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-amount-currency) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to the [currency](/development-resources/currency-codes/#currency-codes) that is applicable to the bank account. | | [amount.value](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-amount-value) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **0** (zero) to combine with a zero-auth payment. | | [paymentMethod](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-paymentMethod) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to one of the following:- **sepadirectdebit**: SEPA Direct Debit - **ukLocal**: UK Local - **usLocal**: US Local | | [billingAddress](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-billingAddress) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | An object that contains the address details of the bank account. | | [enablePayOut](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-enablePayOut) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **true**. | | [merchantAccount](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-merchantAccount) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The identifier of your merchant account. | | [recurringProcessingModel](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-recurringProcessingModel) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **Subscription**. | | [reference](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-reference) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique reference to identify the payment request. | | [returnUrl](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-returnUrl) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The return URL to redirect the bank account holder after the payment process. | | [shopperReference](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-shopperReference) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique reference to identify the bank account holder. | | [storePaymentMethod](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-storePaymentMethod) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Set to **true**. | The following code sample shows a zero-auth payment request that creates a token for bank account details. **Tokenization request with raw data** #### curl ```bash curl https://checkout-test.adyen.com/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "amount": { "value": 0, "currency": "EUR" }, "paymentMethod": { "type": "sepadirectdebit", "iban": "The IBAN of the bank account", "ownerName": "The owner of the bank account" }, "billingAddress": { "houseNumberOrName": "1", "street": "Admiralenstraat", "city": "Amsterdam", "country": "NL", "postalCode": "1000AA" }, "enablePayOut": true, "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "reference": "A reference for the payment request", "returnUrl": "https://your-company.example.com/...", "recurringProcessingModel": "Subscription", "shopperReference": "A reference for the bank account holder", "storePaymentMethod": true }' ``` #### Java ```java // Adyen Java API Library v39.4.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.checkout.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.model.RequestOptions; import com.adyen.service.checkout.*; // For the LIVE environment, also include your liveEndpointUrlPrefix. Client client = new Client("ADYEN_API_KEY", Environment.TEST); // Create the request object(s) Amount amount = new Amount() .currency("EUR") .value(0L); SepaDirectDebitDetails sepaDirectDebitDetails = new SepaDirectDebitDetails() .ownerName("The owner of the bank account") .iban("The IBAN of the bank account") .type(SepaDirectDebitDetails.TypeEnum.SEPADIRECTDEBIT); BillingAddress billingAddress = new BillingAddress() .country("NL") .city("Amsterdam") .houseNumberOrName("1") .street("Admiralenstraat") .postalCode("1000AA"); PaymentRequest paymentRequest = new PaymentRequest() .reference("A reference for the payment request") .enablePayOut(true) .amount(amount) .storePaymentMethod(true) .merchantAccount("YOUR_MERCHANT_ACCOUNT") .recurringProcessingModel(PaymentRequest.RecurringProcessingModelEnum.SUBSCRIPTION) .paymentMethod(new CheckoutPaymentMethod(sepaDirectDebitDetails)) .billingAddress(billingAddress) .returnUrl("https://your-company.example.com/...") .shopperReference("A reference for the bank account holder"); // Send the request PaymentsApi service = new PaymentsApi(client); PaymentResponse response = service.payments(paymentRequest, new RequestOptions().idempotencyKey("UUID")); ``` #### PHP ```php setXApiKey("ADYEN_API_KEY"); // For the LIVE environment, also include your liveEndpointUrlPrefix. $client->setEnvironment(Environment::TEST); // Create the request object(s) $amount = new Amount(); $amount ->setCurrency("EUR") ->setValue(0); $checkoutPaymentMethod = new CheckoutPaymentMethod(); $checkoutPaymentMethod ->setOwnerName("The owner of the bank account") ->setIban("The IBAN of the bank account") ->setType("sepadirectdebit"); $billingAddress = new BillingAddress(); $billingAddress ->setCountry("NL") ->setCity("Amsterdam") ->setHouseNumberOrName("1") ->setStreet("Admiralenstraat") ->setPostalCode("1000AA"); $paymentRequest = new PaymentRequest(); $paymentRequest ->setReference("A reference for the payment request") ->setEnablePayOut(true) ->setAmount($amount) ->setStorePaymentMethod(true) ->setMerchantAccount("YOUR_MERCHANT_ACCOUNT") ->setRecurringProcessingModel("Subscription") ->setPaymentMethod($checkoutPaymentMethod) ->setBillingAddress($billingAddress) ->setReturnUrl("https://your-company.example.com/...") ->setShopperReference("A reference for the bank account holder"); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new PaymentsApi($client); $response = $service->payments($paymentRequest, $requestOptions); ``` #### C\# ```cs // Adyen .net API Library v32.1.2 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Checkout; using Adyen.Service.Checkout; // For the LIVE environment, also include your liveEndpointUrlPrefix. var config = new Config() { XApiKey = "ADYEN_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Amount amount = new Amount { Currency = "EUR", Value = 0 }; SepaDirectDebitDetails sepaDirectDebitDetails = new SepaDirectDebitDetails { OwnerName = "The owner of the bank account", Iban = "The IBAN of the bank account", Type = SepaDirectDebitDetails.TypeEnum.Sepadirectdebit }; BillingAddress billingAddress = new BillingAddress { Country = "NL", City = "Amsterdam", HouseNumberOrName = "1", Street = "Admiralenstraat", PostalCode = "1000AA" }; PaymentRequest paymentRequest = new PaymentRequest { Reference = "A reference for the payment request", EnablePayOut = true, Amount = amount, StorePaymentMethod = true, MerchantAccount = "YOUR_MERCHANT_ACCOUNT", RecurringProcessingModel = PaymentRequest.RecurringProcessingModelEnum.Subscription, PaymentMethod = new CheckoutPaymentMethod(sepaDirectDebitDetails), BillingAddress = billingAddress, ReturnUrl = "https://your-company.example.com/...", ShopperReference = "A reference for the bank account holder" }; // Send the request var service = new PaymentsService(client); var response = service.Payments(paymentRequest, requestOptions: new RequestOptions { IdempotencyKey = "UUID"}); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v29.1.0 const { Client, CheckoutAPI } = require('@adyen/api-library'); // For the LIVE environment, also include your liveEndpointUrlPrefix. const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const paymentRequest = { amount: { value: 0, currency: "EUR" }, paymentMethod: { type: "sepadirectdebit", iban: "The IBAN of the bank account", ownerName: "The owner of the bank account" }, billingAddress: { houseNumberOrName: "1", street: "Admiralenstraat", city: "Amsterdam", country: "NL", postalCode: "1000AA" }, enablePayOut: true, merchantAccount: "YOUR_MERCHANT_ACCOUNT", reference: "A reference for the payment request", returnUrl: "https://your-company.example.com/...", recurringProcessingModel: "Subscription", shopperReference: "A reference for the bank account holder", storePaymentMethod: true } // Send the request const checkoutAPI = new CheckoutAPI(client); const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" }); ``` #### Go ```go // Adyen Go API Library v21.0.0 import ( "context" "github.com/adyen/adyen-go-api-library/v21/src/common" "github.com/adyen/adyen-go-api-library/v21/src/adyen" "github.com/adyen/adyen-go-api-library/v21/src/checkout" ) // For the LIVE environment, also include your liveEndpointUrlPrefix. client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) amount := checkout.Amount{ Currency: "EUR", Value: 0, } sepaDirectDebitDetails := checkout.SepaDirectDebitDetails{ OwnerName: "The owner of the bank account", Iban: "The IBAN of the bank account", Type: common.PtrString("sepadirectdebit"), } billingAddress := checkout.BillingAddress{ Country: "NL", City: "Amsterdam", HouseNumberOrName: "1", Street: "Admiralenstraat", PostalCode: "1000AA", } paymentRequest := checkout.PaymentRequest{ Reference: "A reference for the payment request", EnablePayOut: common.PtrBool(true), Amount: amount, StorePaymentMethod: common.PtrBool(true), MerchantAccount: "YOUR_MERCHANT_ACCOUNT", RecurringProcessingModel: common.PtrString("Subscription"), PaymentMethod: checkout.SepaDirectDebitDetailsAsCheckoutPaymentMethod(&sepaDirectDebitDetails), BillingAddress: &billingAddress, ReturnUrl: "https://your-company.example.com/...", ShopperReference: common.PtrString("A reference for the bank account holder"), } // Send the request service := client.Checkout() req := service.PaymentsApi.PaymentsInput().IdempotencyKey("UUID").PaymentRequest(paymentRequest) res, httpRes, err := service.PaymentsApi.Payments(context.Background(), req) ``` #### Python ```py # Adyen Python API Library v13.6.0 import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_API_KEY" # For the LIVE environment, also include your liveEndpointUrlPrefix. adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "amount": { "value": 0, "currency": "EUR" }, "paymentMethod": { "type": "sepadirectdebit", "iban": "The IBAN of the bank account", "ownerName": "The owner of the bank account" }, "billingAddress": { "houseNumberOrName": "1", "street": "Admiralenstraat", "city": "Amsterdam", "country": "NL", "postalCode": "1000AA" }, "enablePayOut": True, "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "reference": "A reference for the payment request", "returnUrl": "https://your-company.example.com/...", "recurringProcessingModel": "Subscription", "shopperReference": "A reference for the bank account holder", "storePaymentMethod": True } # Send the request result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID") ``` #### Ruby ```rb # Adyen Ruby API Library v10.4.0 require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_API_KEY' # For the LIVE environment, also include your liveEndpointUrlPrefix. adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { :amount => { :value => 0, :currency => 'EUR' }, :paymentMethod => { :type => 'sepadirectdebit', :iban => 'The IBAN of the bank account', :ownerName => 'The owner of the bank account' }, :billingAddress => { :houseNumberOrName => '1', :street => 'Admiralenstraat', :city => 'Amsterdam', :country => 'NL', :postalCode => '1000AA' }, :enablePayOut => true, :merchantAccount => 'YOUR_MERCHANT_ACCOUNT', :reference => 'A reference for the payment request', :returnUrl => 'https://your-company.example.com/...', :recurringProcessingModel => 'Subscription', :shopperReference => 'A reference for the bank account holder', :storePaymentMethod => true } # Send the request result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' }) ``` #### NodeJS (TypeScript) ```ts // Adyen Node API Library v29.1.0 import { Client, CheckoutAPI, Types } from "@adyen/api-library"; // For the LIVE environment, also include your liveEndpointUrlPrefix. const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const amount: Types.checkout.Amount = { currency: "EUR", value: 0 }; const sepaDirectDebitDetails: Types.checkout.SepaDirectDebitDetails = { ownerName: "The owner of the bank account", iban: "The IBAN of the bank account", type: Types.checkout.SepaDirectDebitDetails.TypeEnum.Sepadirectdebit }; const billingAddress: Types.checkout.BillingAddress = { country: "NL", city: "Amsterdam", houseNumberOrName: "1", street: "Admiralenstraat", postalCode: "1000AA" }; const paymentRequest: Types.checkout.PaymentRequest = { reference: "A reference for the payment request", enablePayOut: true, amount: amount, storePaymentMethod: true, merchantAccount: "YOUR_MERCHANT_ACCOUNT", recurringProcessingModel: Types.checkout.PaymentRequest.RecurringProcessingModelEnum.Subscription, paymentMethod: sepaDirectDebitDetails, billingAddress: billingAddress, returnUrl: "https://your-company.example.com/...", shopperReference: "A reference for the bank account holder" }; // Send the request const checkoutAPI = new CheckoutAPI(client); const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" }); ``` The token is created after a successful payment authorization. This ensures that the payment details are linked to an active, chargeable account. 2. Find the token in the `storedPaymentMethodId` parameter. You can locate it in either of these places: * In the successful authorization response, under `additionalData.tokenization.storedPaymentMethodId`. * In the [recurring.token.created](https://docs.adyen.com/api-explorer/Tokenization-webhooks/latest/post/recurring.token.created) webhook. The following code sample shows an authorized payment response that includes the token. **Tokenization response with raw bank account data** ```bash curl https://checkout-test.adyen.com/checkout/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "additionalData": { "sepadirectdebit.sequenceType": "First", "recurring.recurringDetailReference": "W7RFRMFXHP447NV5", "recurringProcessingModel": "Subscription", "recurring.shopperReference": "Your unique reference for the bank account holder", "sepadirectdebit.dateOfSignature": "2025-08-25", "tokenization.store.operationType": "created", "sepadirectdebit.mandateId": "GWWSVJKG5DB89PV5", "tokenization.shopperReference": "Your unique reference for the bank account holder", "tokenization.storedPaymentMethodId": "W7RFRMFXHP447NV5" }, "pspReference": "GWWSVJKG5DB89PV5", "resultCode": "Authorised", "amount": { "currency": "EUR", "value": 0 }, "merchantReference": "Your unique reference for the payment request", "paymentMethod": { "type": "sepadirectdebit" } }' ``` 3. In your system, store the following parameters together, so that the token is associated with the bank account holder: * `additionalData.tokenization.shopperReference` * `additionalData.tokenization.storedPaymentMethodId` You must provide these values when making a bank account payout request. ## Next steps [Make a bank account payout request](/payouts/payout-service/pay-out-to-bank-accounts/bank-payout-request) [Pay out your funds to a third-party bank account using the Transfers API.](/payouts/payout-service/pay-out-to-bank-accounts/bank-payout-request)