Card Limits

Set and manage daily, monthly, and per-transaction spending limits on payment cards.

Before You Start

Read the following guides before proceeding:

GuideWhy
Getting StartedPlatform overview and setup
Api BasicsRequired headers and request configuration
AuthenticationHow to obtain access tokens
OnboardingUser and wallet registration
KYCKYC 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"
  }
}
FieldDescription
daily_limitMaximum daily spend. -1 means no limit.
daily_usageAmount already spent today
monthly_limitMaximum monthly spend. -1 means no limit.
monthly_usageAmount already spent this month
lifetime_limitMaximum lifetime spend. -1 means no limit.
lifetime_usageTotal amount spent on this card
currencyLimit 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
}
FieldTypeRequiredDescription
daily_limitnumberNoMaximum spend per calendar day. -1 disables.
monthly_limitnumberNoMaximum spend per calendar month. -1 disables.
transaction_limitnumberNoMaximum amount of a single transaction. -1 disables.
limitnumberNoObsolete 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
}
FieldDescription
card_idCard UUID
transaction_limitPer-transaction limit (-1 = no limit)
daily_limitDaily spending limit (-1 = no limit)
daily_usageAmount spent today
monthly_limitMonthly spending limit (-1 = no limit)
monthly_usageAmount spent this month
lifetime_limitLifetime spending limit (-1 = no limit)
lifetime_usageTotal amount spent

Error Handling

Validation Errors

Error ReasonError DetailsDescription
ErrorMissingFieldcard_id: missingCard ID not provided
ErrorInvalidFieldcard_id: invalid_uuidCard ID is not a valid UUID

Card Status Errors

Error ReasonError DetailsDescription
ErrorInvalidStatuscard_status: not_activeCard must be active to change limits
ErrorNotFoundCard not foundCard 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" }
  ]
}

Did this page help you?