--- title: "Create and manage transfer limits for balance accounts" description: "Set a limit on outgoing transfers from your users' balance accounts." url: "https://docs.adyen.com/business-accounts/use-transfer-limits/balance-accounts" source_url: "https://docs.adyen.com/business-accounts/use-transfer-limits/balance-accounts.md" canonical: "https://docs.adyen.com/business-accounts/use-transfer-limits/balance-accounts" last_modified: "2026-05-24T12:54:31+02:00" language: "en" --- # Create and manage transfer limits for balance accounts Set a limit on outgoing transfers from your users' balance accounts. [View source](/business-accounts/use-transfer-limits/balance-accounts.md) Transfer limits create conditional logic that automatically approves or declines a transfer based on its amount. When a transfer limit is configured for a balance account in your platform, it regulates the amount of funds that can be transferred externally from that balance account. To set transfer limits at the balance account level, the balance account must be linked to a payment instrument with `type` **bankAccount** (Adyen business account). ## Requirements Before you begin, make sure that you complete the following requirements: | Requirement | Description | | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | Adyen for Platforms integration with business accounts. | | **[API credential roles](/development-resources/api-credentials/roles/)** | Make sure that you have access to the [Configuration API](https://docs.adyen.com/api-explorer/balanceplatform/latest/overview) with the following role:- **Balance platform base role** | | **[Webhooks](/development-resources/webhooks)** | Subscribe to the following webhook(s):- [**Transfer webhooks**](/payouts/payout-service/pay-out-to-bank-accounts/payout-webhooks/) - [**Transaction webhooks**](/payouts/payout-service/transfer-transactions/transaction-webhooks/) | | **Limitations** | Transfer limits are not supported for [internal transfers](/business-accounts/transfer-funds-internally), or [incoming external transfers](/business-accounts/receive-funds). | | **Setup steps** | Before you begin, make sure that:- You are familiar with [how transfer limits work](/business-accounts/use-transfer-limits). - Your user has an [Adyen business account](/business-accounts/create-business-accounts) linked to their balance account. - You have [installed the Authentication SDK](/business-accounts/install-auth-sdk/), and [registered your users' devices for SCA](/business-accounts/register-sca-devices/). | ## Strong Customer Authentication (SCA) for transfer limits In certain regions, you are required by law to enable your users to configure transfer limits for their outgoing transfers. When creating or updating a transfer limit, your user must complete Strong Customer Authentication (SCA). [Strong Customer Authentication (SCA)](/business-accounts/implement-sca/) uses multi-factor authentication to verify your user's identity. When creating a transfer limit for your user's balance account, your user is required by law to authenticate their identity using their registered SCA device. You do not need to perform SCA when creating a transfer limit at the balance platform level. When configuring transfer limits, there are two ways to authenticate your users' identities using SCA: 1. **SCA on initiation, for each transfer limit your user creates**\ When you send a request to create a transfer limit, you must include SCA details in the request header. Your user is immediately prompted to authenticate their identity using their registered SCA device. 2. **SCA on approval, for one or more pending transfer limits**\ You send one or more requests to create transfer limits for your user without including SCA details in the request headers. These transfer limits end up in a pending state, because your user has not yet authenticated their identity. Then, you make a new request to approve all pending transfer limits, with SCA details in the request header. Your user is then prompted to authenticate their identity for all the pending transfer limit requests using their registered SCA device. ### Exemptions to SCA In some cases, your user's identity does not need to be authenticated when creating a transfer limit because of an SCA exemption. When you or your user has an SCA exemption, you must specify this in your request, along with the type of exemption that applies for that transfer limit. There are five types of SCA exemptions: * **lowerLimit**: this exemption applies when the transfer limit created by your user is lower than the transfer limit that already exists for that balance account. Because the new transfer limit has a lower risk than the previous transfer limit, there is no need for SCA. * **notRegulated**: this exemption applies when you want to use transfer limits in countries, regions, or industries where it is not mandated by law to use SCA. * **setByPlatform**: this exemption applies when *you* set a transfer limit for one of your user's balance accounts or for your entire balance platform. Because *you* are configuring the transfer limit for your users, there is no need to verify their identity using SCA. * **initialLimit**: this exemption applies when there is no transfer limit configured on the balance account, and no default transfer limit configured on the balance platform. Because having a transfer limit has a lower risk than having no transfer limit, there is no need for SCA. * **alreadyPerformed**: this exemption applies when you are already confident about your user's identity and do not need to verify this using SCA. For example, if your user already performed SCA when logging into your app, they do not need to verify their identity again when setting a transfer limit. ## How it works The flow to create a transfer limit depends on whether you trigger SCA on initiation for each request, on approval for one or more requests, or if you are exempt from SCA. ### Tab: SCA triggered on initiation 1. You create a transfer limit by making a POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) request. In your request, you must consider the scope and type of the transfer, and include SCA details in the header. You must also specify the time period in which the transfer limit is valid. 2. Your user is prompted to authenticate their identity using their registered SCA device. 3. After a successful authentication, the transfer limit is created with a **scheduled** status. 4. On the start date of the transfer limit, the status of the transfer limit becomes **active**. 5. While it is **active**, the transfer limit regulates the amount of funds being transferred externally from the balance account. 6. On the end date of the transfer limit, the status of the transfer limit becomes **inactive**. ### Tab: SCA triggered on approval 1. You create one or more transfer limits by making POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) requests. In your requests, you must consider the scope and type of the transfer. You must also specify the time period in which the transfer limit is valid. Do not include the SCA parameter in the header. 2. The transfer limits are created with a **pendingSCA** status. 3. To allow your user to authenticate their identity for all pending requests at once, make a POST [/balanceAccounts/{id}/transferLimits/approve](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve) request. Include SCA details in the header and transfer limit IDs of the transfer limits in the body. 4. Your user is prompted to authenticate their identity using their registered SCA device. 5. After a successful authentication, the transfer limit reaches a **scheduled** status. 6. On the start date of the transfer limit, the status of the transfer limit becomes **active**. 7. While it is **active**, the transfer limit regulates the amount of funds being transferred externally from the balance account. 8. On the end date of the transfer limit, the status of the transfer limit becomes **inactive**. ### Tab: Exemption from SCA 1. You create a transfer limit by making a POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) request. In your request, you must consider the scope and type of the transfer, and specify the reason for your exemption from SCA. You must also specify the time period in which the transfer limit is valid. 2. The transfer limit is created with a **scheduled** status. 3. On the start date of the transfer limit, the status of the transfer limit becomes **active**. 4. While it is **active**, the transfer limit regulates the amount of funds being transferred externally from the balance account. 5. On the end date of the transfer limit, the status of the transfer limit becomes **inactive**. ## Create transfer limits Before you create a transfer limit, you must determine: * The limit conditions (scope and transfer type), which define to which transfers the limit applies. * The start and end date, which define the time period in which the limit is active. * Whether to perform SCA on initiation or approval. Depending on how you decide to perform SCA, follow the steps in the tabs below: ### Tab: SCA on initiation When creating new transfer limits, you can choose to perform SCA immediately for each transfer limit request that you create. To do this: ** #### 1. Check SCA eligibility Before creating a transfer limit, you must check for SCA eligibility and initiate the process to authenticate your users. The following tabs explain how to check for SCA eligibility and initiate authentication using Kotlin, Swift, or JavaScript. ** #### 2. Make a request to create a transfer limit 1. Make a POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) request. Include the following parameters: | Parameter | Type | Required | Description | | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | [WWW-Authenticate](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#header-WWW_Authenticate) | Header | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | `SCA realm`: **TransferLimit**. `auth-param1`: Base64-encoded value of **sdkOutput** you get when you [checked SCA eligibility](#1-check-sca-eligibility). | | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-id) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | | [amount.value](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-value) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The value, in minor units, for the transfer limit. This is the maximum amount allowed per transfer or per day based on the `scope` of the limit. | | | [amount.currency](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-currency) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The currency in which you want to set the limit. | | | [startsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-startsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes active. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify a start date, or set this to **null**, we default to the date and time of the request. If you specify a date in the future, we will schedule a transfer limit. You cannot schedule more than one limit in the future. | | | [endsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-endsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes inactive. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify an end date, the limit stays active until you override it with a new limit. | | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scope) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | | [reference](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-reference) | Body | | Your reference for the transfer limit. | | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-transferType) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | | | [scaInformation.scaOnApproval](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scaInformation-scaOnApproval) | Body | | Indicates whether to initiate Strong Customer Authentication (SCA) later, during approval, or immediately after you submit this request. Set this to **false** (default). | | Here is an example request to create a transfer limit. **Create a transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -H 'WWW-Authenticate: SCA realm="TransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."' \ -X POST \ -d '{ "amount": { "value": 10000 "currency: "EUR" }, "startsAt": "2025-08-14T00:00:00+01:00", "endsAt": "2026-08-14T00:00:00+01:00", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "transferType": "all", "scaInformation: { "scaOnApproval": false } } ``` 2. Verify that the response header contains the following fields: * `status`: **401** * `auth-param1`: Base64-encoded blob of data. You will need `auth-param1` when you [authenticate your user](#2-authenticate-your-user). **Response header** ```json "WWW-Authenticate: SCA realm="TransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."" ``` ** #### 3. Authenticate your user After [creating a transfer limit request](#2-make-a-request-to-create-a-transfer-limit), you have 10 minutes to complete the authentication process and [finalize the transfer limit](#4-finalize-the-transfer-limit). To authenticate your user with the Authentication SDK: 1. Trigger the SDK to start user authentication and pass the `auth-param1` value from [the previous step](#2-make-a-request-to-create-a-transfer-limit) as `sdkInput`. 2. Pass `sdkOutput` to your server. ** #### 4. Finalize the transfer limit To finalize the transfer limit: 1. Make a POST `/balanceAccounts/{id}/transferLimits` request. Include the following parameters: The values of the body parameters must match the ones previously submitted to the `/balanceAccounts/{id}/transferLimits` endpoint [when creating a transfer limit request](#2-make-a-request-to-create-a-transfer-limit). | Parameter | Type | Required | Description | | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | [WWW-Authenticate](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#header-WWW_Authenticate) | Header | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | `SCA realm`: **TransferLimit**. `auth-param1`: Base64-encoded value of **sdkOutput** you get when you [authenticated your user](#3-authenticate-your-user). | | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-id) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | | [amount.value](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-value) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The value, in minor units, for the transfer limit. This is the maximum amount allowed per transfer or per day based on the `scope` of the limit. | | | [amount.currency](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-currency) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The currency in which you want to set the limit. | | | [startsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-startsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes active. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify a start date, or set this to **null**, we default to the date and time of the request. If you specify a date in the future, we will schedule a transfer limit. You cannot schedule more than one limit in the future. | | | [endsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-endsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes inactive. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify an end date, the limit stays active until you override it with a new limit. | | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scope) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | | [reference](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-reference) | Body | | Your reference for the transfer limit. | | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-transferType) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | | | [scaInformation.scaOnApproval](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scaInformation-scaOnApproval) | Body | | Indicates whether to initiate Strong Customer Authentication (SCA) later, during approval, or immediately after you submit this request. Set this to **false** (default). | | Here is an example request to finalize the transfer limit. **Finalize the transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -H 'WWW-Authenticate: SCA realm="TransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."' \ -X POST \ -d '{ "amount": { "value": 10000 "currency: "EUR" }, "startsAt": "2025-08-14T00:00:00+01:00", "endsAt": "2026-08-14T00:00:00+01:00", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "transferType": "all", "scaInformation: { "scaOnApproval": false } } ``` 2. Verify that your response contains a `HTTP 200 - Success` response code. Take note of the transfer limit `id` and `limitStatus` that is returned in the response. The `limitStatus` must be either **active** or **scheduled** depending on the start date of the limit. **Response** ```json [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "scaInformation": { "status": "performed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "all" } ] ``` ### Tab: SCA on approval When creating one or more new transfer limits, you can choose to perform SCA on approval. This way, you user only needs to authenticate one time to approve all pending requests. To do this: ** #### 1. Check SCA eligibility Before creating a transfer limit, you must check for SCA eligibility and initiate the process to authenticate your users. The following tabs explain how to check for SCA eligibility and initiate authentication using Kotlin, Swift, or JavaScript. ** #### 2. Make a request to create a transfer limit 1. Make a POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) request. Include the following parameters: | Parameter | Type | Required | Description | | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-id) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | | [amount.value](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-value) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The value, in minor units, for the transfer limit. This is the maximum amount allowed per transfer or per day based on the `scope` of the limit. | | | [amount.currency](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-currency) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The currency in which you want to set the limit. | | | [startsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-startsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes active. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify a start date, or set this to **null**, we default to the date and time of the request. If you specify a date in the future, we will schedule a transfer limit. You cannot schedule more than one limit in the future. | | | [endsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-endsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes inactive. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify an end date, the limit stays active until you override it with a new limit. | | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scope) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | | [reference](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-reference) | Body | | Your reference for the transfer limit. | | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-transferType) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | | | [scaInformation.scaOnApproval](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scaInformation-scaOnApproval) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Indicates whether to initiate Strong Customer Authentication (SCA) later, during approval, or immediately after you submit this request. Set this to **true**. If you do not specify this parameter, we default to **false**, which means that your user needs to perform SCA for each transfer limit request. | | Here is an example request to create a transfer limit. **Create a transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "amount": { "value": 10000 "currency: "EUR" }, "startsAt": "2025-08-14T00:00:00+01:00", "endsAt": "2026-08-14T00:00:00+01:00", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "transferType": "all", "scaInformation: { "scaOnApproval": true } } ``` 2. Verify that your response has a `HTTP 200- Success` response code. Take note of the transfer limit `id` and `limitStatus` that is returned in the response. The `limitStatus` must be **pendingSCA**. **Response** ```json [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "scaInformation": { "status": "pending" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "pendingSCA", "transferType": "all" } ] ``` ** #### 3. Make a request to approve pending requests 1. Make a POST [/balanceAccounts/{id}/transferLimits/approve](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve) request so that your user can authenticate the pending requests using SCA. Specify the following parameters: | Parameter | Type | Required | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#path-WWW_Authenticate) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | [WWW\_Authenticate](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#header-WWW_Authenticate) | Header | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | `SCA realm`: **ApproveTransferLimit**. `auth-param1`: Base64-encoded value of **sdkOutput** you get when you [checked for SCA eligibility](#1-check-sca-eligibility). | | [transferLimitIds](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#request-transferLimitIds) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | A list that includes the `id` of all the pending transfer limits you want to approve. | **Initiate SCA to approve pending transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -H 'WWW-Authenticate: SCA realm="ApproveTransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."' \ -X POST \ -d '{ "transferLimitIds": ["TL00000000000000000000001", "TL00000000000000000000002"] } ``` 2. Verify that the response header contains the following fields: * `status`: **401** * `auth-param1`: Base64-encoded blob of data. You will need `auth-param1` when you [authenticate your user](#authenticate-user). **Response header** ```json "WWW-Authenticate: SCA realm="ApproveTransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."" ``` 3. Pass `auth-param1` to the SDK as `sdkInput`. ** #### 4. Authenticate your user After [creating a transfer limit approval request](#2-make-a-request-to-create-a-transfer-limit), you have 10 minutes to complete the authentication process and [finalize the transfer limit](#4-finalize-the-transfer-limit). To authenticate your user with the Authentication SDK: 1. Trigger the SDK to start user authentication and pass the `auth-param1` value from [the previous step](#3-make-a-request-to-approve-pending-requests) as `sdkInput`. 2. Pass `sdkOutput` to your server. ** #### 5. Finalize the transfer limit To finalize the transfer limit: 1. Make a POST [/balanceAccounts/{id}/transferLimits/approve](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve) request. Include the following parameters: The values of the body parameters must match the ones previously submitted to the `/balanceAccounts/{id}/transferLimits/approve` endpoint [when creating a transfer limit approval request](#3-make-a-request-to-approve-pending-requests). | Parameter | Type | Required | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#path-WWW_Authenticate) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | [WWW\_Authenticate](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#header-WWW_Authenticate) | Header | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | `SCA realm`: **ApproveTransferLimit**. `auth-param1`: Base64-encoded value of **sdkOutput** you get when you [initiate the SCA authentication process](/business-accounts/sca-for-funds-transfers/#initiate-authentication). | | [transferLimitIds](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits/approve#request-transferLimitIds) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | A list that includes the `id` of all the pending transfer limits you want to approve. | **Finalize pending transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -H 'WWW-Authenticate: SCA realm="ApproveTransferLimit" auth-param1="eyJjaGFsbGVuZ2UiOiJiVlV6ZW5wek0waFNl..."' \ -X POST \ -d '{ "transferLimitIds": ["TL00000000000000000000001", "TL00000000000000000000002"] } ``` 2. Verify that your response contains a `HTTP 200 - Success` response code. Take note of the `limitStatus` that is returned in the response. The `limitStatus` must be either **active** or **scheduled** depending on the start date of the limit. **Response** ```json [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "scaInformation": { "status": "performed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "all" } ] ``` ### Tab: Exemption from SCA To create a new transfer limit when your user has an exemption from SCA: 1. Make a POST [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits) request. Include the following parameters: | Parameter | Type | Required | Description | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-id) | Path | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the balance account for which you want to set a transfer limit. | | | [amount.value](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-value) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The value, in minor units, for the transfer limit. This is the maximum amount allowed per transfer or per day based on the `scope` of the limit. | | | [amount.currency](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-amount-currency) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The currency in which you want to set the limit. | | | [startsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-startsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes active. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify a start date, or set this to **null**, we default to the date and time of the request. If you specify a date in the future, we will schedule a transfer limit. You cannot schedule more than one limit in the future. | | | [endsAt](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-endsAt) | Body | | The date and time, in [ISO date and time format](https://en.wikipedia.org/wiki/ISO_8601), when the transfer limit becomes inactive. Format: **YYYY-MM-DDThh:mm:ss.sssTZD** If you do not specify an end date, the limit stays active until you override it with a new limit. | | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scope) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | | [reference](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-reference) | Body | | Your reference for the transfer limit. | | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-transferType) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | | | [scaInformation.exemption](https://docs.adyen.com/api-explorer/balanceplatform/latest/post/balanceAccounts/\(id\)/transferLimits#request-scaInformation-exemption) | Body | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The type of exemption for Strong Customer Authentication (SCA). Possible values:- **lowerLimit**: the newly created limit is lower than the existing limit. - **notRegulated**: the limit is created in a country, region, or industry where it is not mandated by law to use SCA. - **setByPlatform**: you set a limit for one of your user's balance accounts. - **initialLimit**: there are no existing transfer limits set on the balance account or balance platform. - **alreadyPerformed**: you are confident about your user's identity and do not need to verify this using SCA. | | | | | | | | Here is an example request to create a transfer limit. **Create a transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "amount": { "value": 10000 "currency: "EUR" }, "startsAt": "2025-08-14T00:00:00+01:00", "endsAt": "2026-08-14T00:00:00+01:00", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "transferType": "all", "scaInformation: { "exemption": "initialLimit" } } ``` 2. Take note of the `id` and `status` that is returned in the response. The `status` must be either **active** or **scheduled** depending on the start date of the limit. **Response** ```json [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "scaInformation": { "exemption": "initialLimit", "status": "notPerformed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "all" } ] ``` ## View transfer limits After you configure transfer limits for your users' balance accounts, you can make GET requests to view the details of these limits. ### View all transfer limits To view all transfer limits configured at the balance account level: 1. Make a GET [/balanceAccounts/{id}/transferLimits](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits) request. To filter out transfer limits based on their characteristics, include any of the following query parameters in your request: | Parameter | Required | Description | | ----------------------------------------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits#request-scope) | | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits#request-transferType) | | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | | [status](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits#query-status) | | The status of the transfer limit. Possible values:- **active**: the limit is currently active. - **inactive**: the limit is currently inactive - **pendingSCA**: the limit is pending until your user performs SCA. - **scheduled**: the limit is scheduled to become active at a future date. | For example, you want to view all transfer limits configured on your balance account that meet the following requirements: * `scope`: **perDay** * `transferType`: **instant** * `status`: **active** **Filter transfer limits on a balance account** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X GET \ -d scope=perDay \ -d transferType=instant \ -d status=active ``` 2. Take note of the array in the response that returns all all the transfer limits on your balance platform that meet the queried requirements. **Response** ```json { "transferLimits": [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perDay", "reference": "Your reference for the transfer limit", "scaInformation": { "exemption": "initialLimit", "status": "notPerformed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "instant" }, { "amount": { "value": 20000, "currency": "EUR" }, "id": "TRLI00000000000000000000000002", "endsAt": "2026-08-13T23:00:00Z", "scope": "perDay", "reference": "Your reference for the transfer limit", "scaInformation": { "exemption": "initialLimit", "status": "notPerformed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "instant" } ] } ``` ### View all current limits You can set transfer limits at the balance account level, and at the balance platform level. Transfer limits that you set for your balance account override transfer limits that are set for your balance platform when they concern the same combination of `scope` and `transferType`. If you do not set a transfer limit at the balance platform level for a particular combination of `scope` and `transferType`, then the balance platform limit applies to the balance account instead. At any given moment, the following limits apply to a balance account: * All the limits configured at balance account level * The limits configured at balance platform level that are not overridden by limits at balance account level To view all transfer limits that apply to your user's balance account at any given moment: 1. Make a GET [/balanceAccounts/{id}/transferLimits/current](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/current) request. If needed, you can use any of the following query parameters to filter out transfer limits based on their characteristics: | Parameter | Required | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [scope](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/current#query-scope) | | The scope on which the transfer limit applies. Possible values:- **perTransaction**: you set a maximum amount for each transfer made from the balance account. - **perDay**: you set a maximum total amount for all transfers made from the balance account in a day. | | [transferType](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/current#query-transferType) | | The type of transfer to which the limit applies. Possible values:- **instant**: the limit applies to transfers with an **instant** priority. - **all**: the limit applies to all transfers, regardless of priority. | Here is an example request to view all current transfer limits that apply to **instant** transfers on balance account **BA00000000000000000000001** with a **perDay** scope. **View all active transfer limits on the balance account** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X GET \ -d scope=perDay \ -d transferType=instant ``` 2. Take note of the array in the response that returns all active transfer limits on the balance account with a **perDay** scope. **Response** ```json { "transferLimits": [ { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perDay", "reference": "Your reference for the transfer limit", "scaInformation": { "exemption": "initialLimit", "status": "notPerformed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "instant" } ] } ``` ### View a specific transfer limit To view a specific transfer limit: 1. Make a GET [/balanceAccounts/{id}/transferLimits/{transferLimitId}](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)) request. Specify the following parameters in the path: | Parameter | Required | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)#path-id) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of your balance account. | | [transferLimitId](https://docs.adyen.com/api-explorer/balanceplatform/latest/get/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)#path-transferLimitId) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the transfer limit you want to view. | Here is an example request to view a specific transfer limit: **View specific transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits/{transferLimitId} \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X GET ``` 2. Take note of the response, which returns the details of the transfer limit. **Response** ```json { "amount": { "value": 10000, "currency": "EUR" }, "id": "TRLI00000000000000000000000001", "endsAt": "2026-08-13T23:00:00Z", "scope": "perTransaction", "reference": "Your reference for the transfer limit", "scaInformation": { "exemption": "initialLimit", "status": "notPerformed" }, "startsAt": "2025-08-13T23:00:00Z", "limitStatus": "active", "transferType": "all" } ``` ## Delete a transfer limit You can only delete **pending** or **scheduled** transfer limits. After a transfer limit becomes **active**, it cannot be deleted. If you no longer want to apply an **active** limit to your balance account, you must override it by creating a new transfer limit. To delete a **pending** or **scheduled** transfer limit, make a DELETE [/balanceAccounts/{id}/transferLimits/{transferLimitId}](https://docs.adyen.com/api-explorer/balanceplatform/latest/delete/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)) request. Specify the following parameters in the path: | Parameter | Required | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | | [id](https://docs.adyen.com/api-explorer/balanceplatform/latest/delete/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)#path-id) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of your balance account. | | [transferLimitId](https://docs.adyen.com/api-explorer/balanceplatform/latest/delete/balanceAccounts/\(id\)/transferLimits/\(transferLimitId\)#path-transferLimitId) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the transfer limit you want to delete. | Here is an example request to delete a specific transfer limit: **Delete specific transfer limit** ```bash curl https://balanceplatform-api-test.adyen.com/bcl/v2/balanceAccounts/BA00000000000000000000001/transferLimits/{transferLimitId} \ -H 'x-api-key: ADYEN_BALANCE_PLATFORM_API_KEY' \ -H 'content-type: application/json' \ -X DELETE ``` If the transfer limit is successfully deleted, you receive a `HTTP 204 - No Content` response.