Manage payment limits
Payment limits allow you to control the maximum amount that can be sent per transaction or per day for a given currency and payment method. Limits apply to payouts only. BVNK accepts all incoming transactions regardless of the amount.
The Payment Limit Management system ensures compliance with the Instant Payments Regulation (IPR) and aligns with industry best practices for security, fraud prevention, and liquidity management.
How limits work
Limits are evaluated on every outgoing fiat payment. When a transaction is initiated, all matching limits are checked. A transaction must pass all applicable limit checks to be approved. If any limit is exceeded, whether transaction or daily, the payment is blocked.
You can set the following limit types:
- Transaction: Maximum amount allowed for a single payment.
- Daily: Maximum cumulative amount across all payments within a calendar day. The day boundary is determined by the time zone specified when creating the limit (defaults to UTC if not set).
The system operates across three hierarchical levels. The most restrictive limit always applies:
| Level | Scope | Who can manage | Configuration | Applies to |
|---|---|---|---|---|
| Level 1: Global | System-wide | BVNK (via Admin Portal) | Per banking partner + payment method + currency | Every transaction across the platform |
| Level 2: Partner | Specific partner account | Partner (Admin, workspace owners, or via API) | Per payment method + currency | The partner and all underlying customers, or the partner only, or all underlying customers only |
| Level 3: Customer | Individual customer | Partner or their customers (Admin, workspace owners, or via API) | Per payment method + currency | A single customer only |
Key rules:
- Partners and customers can modify or delete their own limits anytime. Changes take effect immediately.
- Customers can create additional limits but cannot modify or delete partner-set limits.
- Limits set by BVNK cannot be overwritten by partners.
- Limits follow a strict hierarchy: customer limits must stay below global limits. Overrides above global limits are not supported.
- Same-day rejections (e.g., insufficient funds or banking partner rejection) release the consumed limit. Rejections on the next day do not affect that day's limit.
- Returned or recalled payments do not restore daily limits; they count as separate transactions.
- Internal transfers do not count toward limits.
How daily limits are calculated
- Daily limits consider all transactions processed from 00:00 to 23:59 in the configured timezone (UTC by default).
- The daily limit is reduced immediately when a transaction is processed, regardless of its eventual success or failure. This prevents concurrent transactions from exceeding the limit.
- For payments that are triggered on one day but sit in an approval state (e.g., four-eyes approval) for multiple days, the daily limit is decreased based on the date of creation, not the date of final processing.
- When a daily limit is created for the first time, the calculation starts from the moment of creation rather than from the beginning of the day. Historical data is not recalculated.
- Once a daily limit exists, any subsequent update takes effect immediately. The system considers all transactions that have already occurred during the current day.
Limit enforcement
Limits are checked at two stages during payment processing:
- Initial check at payment creation: Validates the transaction against all applicable limits. If rejected, the payment is not created, and you receive an error message.
- Secondary check (before banking partner submission): Catches edge cases in mass payment processing. If rejected at this stage, the payment ends in
PROCESSING_FAILEDstatus, and the account balance is immediately restored.
A transaction must pass all applicable limit checks at every level to be approved.
In mass payment processing, transactions are validated individually. When a limit is reached during batch processing, affected transactions are rejected individually and may not follow the original order.
Supported currencies and payment methods
| Currency | Payment methods |
|---|---|
| EUR | SEPA, SEPA_INSTANT, SWIFT |
| GBP | FASTER_PAYMENT, SWIFT |
| USD | ACH, FEDWIRE, CRNOW, FEDNOW, RTP, SWIFT_INTERNATIONAL_WIRE |
Refer to Payment schemes for the detailed description of the payment methods.
Due to the Instant Payment Regulation (IPR), you can configure only a transaction limit or a daily limit for SEPA Instant, not both. Other payment methods allow both limit types simultaneously.
Example scenario
Consider the following limit configuration:
| Level | Payment method | Currency | Limit type | Amount |
|---|---|---|---|---|
| Global | SEPA Instant | EUR | Transaction | 50,000 |
| Partner | SEPA Instant | EUR | Daily | 20,000 |
| Customer | SEPA Instant | EUR | Transaction | 25,000 |
Transaction 1: Customer sends a 13,000 EUR SEPA Instant payment.
- Global transaction limit (50,000): 13,000 < 50,000 — Pass
- Partner daily limit (20,000): 13,000 < 20,000 — Pass
- Customer transaction limit (25,000): 13,000 < 25,000 — Pass
- Result: Approved
Transaction 2 (same day): Customer sends a 15,000 EUR SEPA Instant payment.
- Global transaction limit (50,000): 15,000 < 50,000 — Pass
- Partner daily limit (20,000): 13,000 + 15,000 = 28,000 > 20,000 — Fail
- Result: Rejected. Daily limit exceeded at partner level.
Create a limit
- Via API
- Via Portal
To create a payment limit, send the POST /governance/v1/limits request with a similar payload:
{
"level": "ACCOUNT",
"customerId": null,
"method": "SWIFT",
"limitType": "TRANSACTION",
"amount": 10000,
"currency": "USD",
"zoneOffset": "+00:00"
}
On success, you receive a 201 response with the limit identifier:
{
"id": "fa2f29ca-fa0e-421b-86b6-4eb415d2933c",
"createdAt": "2026-07-03T12:20:53.276599438Z",
"updatedAt": "2026-07-03T12:20:53.330993Z"
}
The new limit appears in the limits list and takes effect immediately.
Update a limit
You can modify a limit's amount or change its type (transaction or daily) anytime. Updates take effect immediately.
- Via API
- Via Portal
Send the PUT /governance/v1/limits/{ruleId} request with the fields you want to change. Use the id of the limit rule that you received in the response when creating a limit.
{
"method": "SWIFT",
"limitType": "TRANSACTION",
"amount": 5000
}
Upon success, you receive a 200 response containing the limit identifier and the update date.
Delete a limit
- Via API
- Via Portal
Send the DELETE /governance/v1/limits/{ruleId} request. Use the id of the limit rule that you received in the response when creating a limit.
On success, you receive a 204 No Content response and the limit is removed immediately.
Manage customer limits
As a partner, you can set limits for individual customers under your account. These limits apply only to the selected customer's payouts.
- Via API
- Via Portal
Use the same POST /governance/v1/limits endpoint with level set to CUSTOMER and the target customer's ID (customerId):
{
"level": "CUSTOMER",
"customerId": "b7c3e1a2-8f4d-4a6e-9c12-3d5f7a8b9e01",
"method": "SEPA",
"limitType": "DAILY",
"amount": 25000,
"currency": "EUR",
"zoneOffset": "+01:00"
}
To update or delete a customer's limit, use the same PUT and DELETE endpoints described above with the customer's limit ID.
Customers can also create limits for themselves via the API. They cannot modify or delete limits you have set for them.
Show all limits
- Via API
- Via Portal
Send the GET /governance/v1/limits request with optional query parameters to filter by currency, payment method, or limit type.
You can also retrieve a single limit by ID using GET /governance/v1/limits/{ruleId}.
{
"content": [
{
"id": "6660fa2c-0def-4269-8d0c-6ab5bf2611c0",
"level": "ACCOUNT",
"customerId": null,
"method": "SWIFT",
"limitType": "TRANSACTION",
"amount": 10000,
"currency": "USD",
"zoneOffset": "+00:00",
"owner": "ACCOUNT",
"createdAt": "2026-07-03T12:20:53.276599438Z",
"updatedAt": "2026-07-03T12:20:53.330993Z"
}
],
"page": 0,
"size": 20,
"totalElements": 1,
"totalPages": 1
}
The owner field indicates who created the limit:
ACCOUNT: Created by the partner.BVNK. Created by BVNK operations.
Error handling
When a payment is blocked by a limit, the API returns an error response:
{
"code": "BVNK-3001",
"status": "400",
"message": "Limit exceeded. We cannot satisfy this 200 EUR payment as the transaction you are trying to trigger is violating configured limits."
}
Review the configured limits for the account and either increase the limit or reduce the payment amount.





