Card Limits
Set and manage daily, monthly, and per-transaction spending limits on payment cards.
Before You Start
Read the following guides before proceeding:
| Guide | Why |
|---|---|
| Getting Started | Platform overview and setup |
| Api Basics | Required headers and request configuration |
| Authentication | How to obtain access tokens |
| Onboarding | User and wallet registration |
| KYC | KYC verification requirements |
Overview
Card limits control how much can be spent using a card. Four independent limits exist:
- Daily — maximum spend per calendar day
- Monthly — maximum spend per calendar month
- Per-transaction — maximum amount of a single transaction
- Lifetime — cumulative maximum over the life of the card
Daily, monthly, and per-transaction limits are settable through the API. The lifetime limit is read-only — it is returned when reading a card but cannot be set through the partner API.
All limits share the same value semantics: a positive number is a hard cap, -1 means no limit, and 0 blocks all spending.
When Limits Reset
Resets happen at fixed calendar boundaries in UTC, not on rolling windows:
- Daily usage resets at 00:00 UTC every day.
- Monthly usage resets at 00:00 UTC on the 1st of each month.
- Lifetime usage never resets — it accumulates for the life of the card.
- Per-transaction has no usage counter; each transaction is checked against the limit individually.
Get Current Limits
Card limits are returned as part of the card response when retrieving card details.
GET /api/v1/cards/{cardId}
The response includes a limit object:
{
"id": "64120850-73a1-4df5-a074-d463258c9deb",
"status": "Active",
"limit": {
"daily_limit": 1000.00,
"daily_usage": 250.00,
"monthly_limit": -1,
"monthly_usage": 500.00,
"lifetime_limit": -1,
"lifetime_usage": 1500.00,
"currency": "EUR"
}
}| Field | Description |
|---|---|
daily_limit | Maximum daily spend. -1 means no limit. |
daily_usage | Amount already spent today |
monthly_limit | Maximum monthly spend. -1 means no limit. |
monthly_usage | Amount already spent this month |
lifetime_limit | Maximum lifetime spend. -1 means no limit. |
lifetime_usage | Total amount spent on this card |
currency | Limit currency (EUR) |
The transaction_limit is not included in this response; it is returned in the limit webhook.
Set Limits
Update one or more limits for a card.
PUT /api/v1/cards/{cardId}/limit
Request
Send only the limits you want to change. Omitted fields keep their current value. Set a field to -1 to disable that limit.
{
"daily_limit": 1000.00,
"monthly_limit": 20000.00,
"transaction_limit": 500.00
}| Field | Type | Required | Description |
|---|---|---|---|
daily_limit | number | No | Maximum spend per calendar day. -1 disables. |
monthly_limit | number | No | Maximum spend per calendar month. -1 disables. |
transaction_limit | number | No | Maximum amount of a single transaction. -1 disables. |
limit | number | No | Obsolete alias for daily_limit. Use daily_limit instead. |
The lifetime_limit cannot be set through this endpoint. Including it is accepted (200 OK) but ignored, and the value stays unchanged. Limits are also not settable at card issuance — a new card starts with all limits at -1.
Code Examples
await fetch(`${baseUrl}/api/v1/cards/${cardId}/limit`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${accessToken}`,
'X-User-Wallet': userEoaAddress,
'X-Chain-Id': chainId,
'Content-Type': 'application/json'
},
body: JSON.stringify({
daily_limit: 1000.00,
monthly_limit: 20000.00,
transaction_limit: 500.00
})
});requests.put(
f"{base_url}/api/v1/cards/{card_id}/limit",
headers={
"Authorization": f"Bearer {access_token}",
"X-User-Wallet": user_eoa_address,
"X-Chain-Id": chain_id,
"Content-Type": "application/json"
},
json={
"daily_limit": 1000.00,
"monthly_limit": 20000.00,
"transaction_limit": 500.00
}
)body, _ := json.Marshal(map[string]float64{
"daily_limit": 1000.00,
"monthly_limit": 20000.00,
"transaction_limit": 500.00,
})
req, _ := http.NewRequest("PUT", baseURL+"/api/v1/cards/"+cardID+"/limit", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+accessToken)
req.Header.Set("X-User-Wallet", userEoaAddress)
req.Header.Set("X-Chain-Id", chainId)
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)Response
Empty response on success (200 OK).
Disable a Limit
Set any limit to -1 to remove it. Other limits are unaffected. For example, to remove only the daily limit:
{
"daily_limit": -1
}Limit Webhooks
When card limits are updated, Wirex sends a webhook notification.
Endpoint: POST {your_webhook_base_url}/v2/webhooks/card-limits
{
"card_id": "64120850-73a1-4df5-a074-d463258c9deb",
"transaction_limit": -1,
"daily_limit": 1000.00,
"daily_usage": 250.00,
"monthly_limit": -1,
"monthly_usage": 500.00,
"lifetime_limit": -1,
"lifetime_usage": 1500.00
}| Field | Description |
|---|---|
card_id | Card UUID |
transaction_limit | Per-transaction limit (-1 = no limit) |
daily_limit | Daily spending limit (-1 = no limit) |
daily_usage | Amount spent today |
monthly_limit | Monthly spending limit (-1 = no limit) |
monthly_usage | Amount spent this month |
lifetime_limit | Lifetime spending limit (-1 = no limit) |
lifetime_usage | Total amount spent |
Error Handling
Validation Errors
| Error Reason | Error Details | Description |
|---|---|---|
ErrorMissingField | card_id: missing | Card ID not provided |
ErrorInvalidField | card_id: invalid_uuid | Card ID is not a valid UUID |
Card Status Errors
| Error Reason | Error Details | Description |
|---|---|---|
ErrorInvalidStatus | card_status: not_active | Card must be active to change limits |
ErrorNotFound | Card not found | Card does not exist or user doesn't own it |
Error Response Format
{
"error_reason": "ErrorInvalidStatus",
"error_description": "Card is not active",
"error_category": {
"category": "CategoryValidationFailure",
"http_status_code": 400
},
"error_details": [
{ "key": "field", "details": "card_status" },
{ "key": "issue", "details": "not_active" }
]
}Updated 2 days ago

