API

CardHolderLimit

A cardholder's spending limits.

Operations

Every route this entity exposes. Each route links to its own reference on this page.

Method Route SDK operation Returns
GET /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits list Cardholder spend limits
DELETE /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits remove Spend limits removed. No response body
PATCH /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits update Updated cardholder spend limits. See Retrieve cardholder limits

Examples

One example per SDK, generated from the API model. The argument names are the parameters and fields of this entity, and the values are placeholders. The examples are not compiled or executed.

Golang

Construct client as shown in the Golang setup, then call the operations:

card_holder_limits, err := client.CardHolderLimit(nil).List(map[string]any{"card_holder_profile_id": 1, "profile_id": 1}, nil)
if err != nil {
    panic(err)
}
fmt.Println(card_holder_limits)
updated, err := client.CardHolderLimit(nil).Update(map[string]any{"card_holder_profile_id": 1, "profile_id": 1}, nil)
if err != nil {
    panic(err)
}
fmt.Println(updated)
removed, err := client.CardHolderLimit(nil).Remove(map[string]any{"card_holder_profile_id": 1, "profile_id": 1}, nil)
if err != nil {
    panic(err)
}
fmt.Println(removed)

Lua

Construct client as shown in the Lua setup, then call the operations:

local card_holder_limits, err = client:CardHolderLimit():list({ card_holder_profile_id = 1, profile_id = 1 })
local updated, err = client:CardHolderLimit():update({ card_holder_profile_id = 1, profile_id = 1 })
local removed, err = client:CardHolderLimit():remove({ card_holder_profile_id = 1, profile_id = 1 })

PHP

Construct client as shown in the PHP setup, then call the operations:

$card_holder_limits = $client->CardHolderLimit()->list(["card_holder_profile_id" => 1, "profile_id" => 1]);
$updated = $client->CardHolderLimit()->update(["card_holder_profile_id" => 1, "profile_id" => 1]);
$client->CardHolderLimit()->remove(["card_holder_profile_id" => 1, "profile_id" => 1]);

Python

Construct client as shown in the Python setup, then call the operations:

card_holder_limits = client.CardHolderLimit().list({"card_holder_profile_id": 1, "profile_id": 1})
updated = client.CardHolderLimit().update({"card_holder_profile_id": 1, "profile_id": 1})
client.CardHolderLimit().remove({"card_holder_profile_id": 1, "profile_id": 1})

Ruby

Construct client as shown in the Ruby setup, then call the operations:

card_holder_limits = client.CardHolderLimit.list({ "card_holder_profile_id" => 1, "profile_id" => 1 })
updated = client.CardHolderLimit.update({ "card_holder_profile_id" => 1, "profile_id" => 1 })
client.CardHolderLimit.remove({ "card_holder_profile_id" => 1, "profile_id" => 1 })

TypeScript

Construct client as shown in the TypeScript setup, then call the operations:

const card_holder_limits = await client.CardHolderLimit().list({ card_holder_profile_id: 1, profile_id: 1 })
const updated = await client.CardHolderLimit().update({ card_holder_profile_id: 1, profile_id: 1 })
await client.CardHolderLimit().remove({ card_holder_profile_id: 1, profile_id: 1 })

Fields

Field Type Required Description
aggregateWindow object Yes The limits to set, per aggregation window.
spendLimits array No Spend limits configured for this cardholder.
type string Yes The category of spending the limit applies to.

list

GET /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits

Operation ID: spendLimitsCardHolderGet.

Authentication: bearer token (UserToken).

Parameters

Parameter In Type Required Description
businessProfileId path integer (int64) Yes The business profile ID.
cardHolderProfileId path integer (int64) Yes The personal profile ID of the cardholder.
X-External-Correlation-Id header string (uuid) No Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more.

Responses

200: Cardholder spend limits

application/json

Property Type Required Description
spendLimits array of object No Spend limits configured for this cardholder. These limits apply to the cardholder's combined spending across all cards belonging to them, rather than to an individual card or the entire business profile. Empty when no cardholder limits are configured. Currently contains at most one entry, representing the PURCHASE limit type.
spendLimits[].aggregateWindow object No The limits per aggregation window. A window is null when no limit is configured for it.
spendLimits[].aggregateWindow.daily object,null No
spendLimits[].aggregateWindow.daily.resetAt string (date-time) No When the usage resets. This is the end of the current day in the business profile's timezone, expressed as a UTC timestamp. A profile with no timezone configured defaults to UTC. For example, a Singapore profile's daily window ends at 23:59:59.999+08:00, serialised as 2023-07-31T15:59:59.999Z.
spendLimits[].aggregateWindow.daily.usage object No The total authorised amount during the daily window, across all cards belonging to the cardholder.
spendLimits[].aggregateWindow.daily.usage.amount number No
spendLimits[].aggregateWindow.daily.usage.currency string No
spendLimits[].aggregateWindow.daily.value object No Daily limit.
spendLimits[].aggregateWindow.daily.value.amount number No
spendLimits[].aggregateWindow.daily.value.currency string No
spendLimits[].aggregateWindow.monthly object,null No
spendLimits[].aggregateWindow.monthly.resetAt string (date-time) No When the usage resets. This is the end of the current month in the business profile's timezone, expressed as a UTC timestamp. A profile with no timezone configured defaults to UTC. For example, a Singapore profile's daily window ends at 23:59:59.999+08:00, serialised as 2023-07-31T15:59:59.999Z.
spendLimits[].aggregateWindow.monthly.usage object No The total authorised amount during the monthly window, across all cards belonging to the cardholder.
spendLimits[].aggregateWindow.monthly.usage.amount number No
spendLimits[].aggregateWindow.monthly.usage.currency string No
spendLimits[].aggregateWindow.monthly.value object No Monthly limit.
spendLimits[].aggregateWindow.monthly.value.amount number No
spendLimits[].aggregateWindow.monthly.value.currency string No
spendLimits[].type enum: PURCHASE No The category of spending the limit applies to.
403: The client lacks the CARDS_API_VIEW_SPENDING_LIMITS permission on the business profile, or the cardholder profile is not accessible to it

application/json

Property Type Required Description
code string Yes The error code.
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "code": "unauthorized",
  "detail": "Operation is unauthorized",
  "status": 403,
  "type": "/errors/types/access"
}
422: A path parameter references a profile of the wrong type. businessProfileId must reference a business profile and cardHolderProfileId must reference a personal profile

application/json

Property Type Required Description
errors array of object Yes The individual validation errors.
errors[].code string Yes The validation error code.
errors[].detail string Yes A description of the validation error.
errors[].ref string Yes The parameter or field that caused the error.
instance string Yes The API path associated with the error.
status integer Yes The HTTP status code.
title string Yes A short summary of the error.
type string Yes A URI identifying the error type.

Example response:

{
  "errors": [
    {
      "code": "invalid_value",
      "detail": "businessProfileId must reference a business profile",
      "ref": "businessProfileId"
    }
  ],
  "instance": "/v4/spend/profiles/12345/card-holder-profiles/67890/spend-limits",
  "status": 422,
  "title": "Validation error",
  "type": "/errors/types/validation"
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header

application/json

The response is object.

500: An unexpected error occurred

application/json

Property Type Required Description
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "detail": "An unexpected error occurred",
  "status": 500,
  "type": "/errors/types/server"
}

remove

DELETE /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits

Operation ID: spendLimitsCardHolderDelete.

Authentication: bearer token (UserToken).

Parameters

Parameter In Type Required Description
businessProfileId path integer (int64) Yes The business profile ID.
cardHolderProfileId path integer (int64) Yes The personal profile ID of the cardholder.
X-External-Correlation-Id header string (uuid) No Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more.

Responses

204: Spend limits removed. No response body
403: The client lacks the CARDS_API_MANAGE_SPENDING_LIMITS permission on the business profile, or the cardholder profile is not accessible to it

application/json

Property Type Required Description
code string Yes The error code.
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "code": "unauthorized",
  "detail": "Operation is unauthorized",
  "status": 403,
  "type": "/errors/types/access"
}
422: A path parameter references a profile of the wrong type. businessProfileId must reference a business profile and cardHolderProfileId must reference a personal profile

application/json

Property Type Required Description
errors array of object Yes The individual validation errors.
errors[].code string Yes The validation error code.
errors[].detail string Yes A description of the validation error.
errors[].ref string Yes The parameter or field that caused the error.
instance string Yes The API path associated with the error.
status integer Yes The HTTP status code.
title string Yes A short summary of the error.
type string Yes A URI identifying the error type.

Example response:

{
  "errors": [
    {
      "code": "invalid_value",
      "detail": "businessProfileId must reference a business profile",
      "ref": "businessProfileId"
    }
  ],
  "instance": "/v4/spend/profiles/12345/card-holder-profiles/67890/spend-limits",
  "status": 422,
  "title": "Validation error",
  "type": "/errors/types/validation"
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header

application/json

The response is object.

500: An unexpected error occurred

application/json

Property Type Required Description
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "detail": "An unexpected error occurred",
  "status": 500,
  "type": "/errors/types/server"
}

update

PATCH /spend/profiles/{businessProfileId}/card-holder-profiles/{cardHolderProfileId}/spend-limits

Operation ID: spendLimitsCardHolderUpdate.

Authentication: bearer token (UserToken).

Parameters

Parameter In Type Required Description
businessProfileId path integer (int64) Yes The business profile ID.
cardHolderProfileId path integer (int64) Yes The personal profile ID of the cardholder.
X-External-Correlation-Id header string (uuid) No Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more.

Request body

application/json

Property Type Required Description
aggregateWindow object Yes The limits to set, per aggregation window. At least one of daily or monthly must be provided.
aggregateWindow.daily object No
aggregateWindow.daily.value object No The amount allowed to be spent daily.
aggregateWindow.daily.value.amount number No
aggregateWindow.daily.value.currency string No
aggregateWindow.monthly object No
aggregateWindow.monthly.value object No The amount allowed to be spent monthly.
aggregateWindow.monthly.value.amount number No
aggregateWindow.monthly.value.currency string No
type enum: PURCHASE Yes The category of spending the limit applies to.

Example request body:

{
  "aggregateWindow": {
    "daily": {
      "value": {
        "amount": 1000,
        "currency": "GBP"
      }
    },
    "monthly": {
      "value": {
        "amount": 3000,
        "currency": "GBP"
      }
    }
  },
  "type": "PURCHASE"
}

Responses

200: Updated cardholder spend limits. See Retrieve cardholder limits

application/json

Property Type Required Description
spendLimits array of object No Spend limits configured for this cardholder. These limits apply to the cardholder's combined spending across all cards belonging to them, rather than to an individual card or the entire business profile. Empty when no cardholder limits are configured. Currently contains at most one entry, representing the PURCHASE limit type.
spendLimits[].aggregateWindow object No The limits per aggregation window. A window is null when no limit is configured for it.
spendLimits[].aggregateWindow.daily object,null No
spendLimits[].aggregateWindow.daily.resetAt string (date-time) No When the usage resets. This is the end of the current day in the business profile's timezone, expressed as a UTC timestamp. A profile with no timezone configured defaults to UTC. For example, a Singapore profile's daily window ends at 23:59:59.999+08:00, serialised as 2023-07-31T15:59:59.999Z.
spendLimits[].aggregateWindow.daily.usage object No The total authorised amount during the daily window, across all cards belonging to the cardholder.
spendLimits[].aggregateWindow.daily.usage.amount number No
spendLimits[].aggregateWindow.daily.usage.currency string No
spendLimits[].aggregateWindow.daily.value object No Daily limit.
spendLimits[].aggregateWindow.daily.value.amount number No
spendLimits[].aggregateWindow.daily.value.currency string No
spendLimits[].aggregateWindow.monthly object,null No
spendLimits[].aggregateWindow.monthly.resetAt string (date-time) No When the usage resets. This is the end of the current month in the business profile's timezone, expressed as a UTC timestamp. A profile with no timezone configured defaults to UTC. For example, a Singapore profile's daily window ends at 23:59:59.999+08:00, serialised as 2023-07-31T15:59:59.999Z.
spendLimits[].aggregateWindow.monthly.usage object No The total authorised amount during the monthly window, across all cards belonging to the cardholder.
spendLimits[].aggregateWindow.monthly.usage.amount number No
spendLimits[].aggregateWindow.monthly.usage.currency string No
spendLimits[].aggregateWindow.monthly.value object No Monthly limit.
spendLimits[].aggregateWindow.monthly.value.amount number No
spendLimits[].aggregateWindow.monthly.value.currency string No
spendLimits[].type enum: PURCHASE No The category of spending the limit applies to.
400: The request could not be processed. Returned when a required field is absent (type, aggregateWindow, or a window's value), when aggregateWindow contains neither daily nor monthly, when a path parameter is not a valid integer, or when the body cannot be parsed. Field-level detail is provided in errors where available; for unparseable bodies the array is empty

application/json

Property Type Required Description
errors array of object Yes The individual validation errors.
errors[].code string Yes The validation error code.
errors[].detail string Yes A description of the validation error.
errors[].ref string Yes The parameter or field that caused the error.
instance string Yes The API path associated with the error.
status integer Yes The HTTP status code.
title string Yes A short summary of the error.
type string Yes A URI identifying the error type.
403: The client lacks the CARDS_API_MANAGE_SPENDING_LIMITS permission on the business profile, or the cardholder profile is not accessible to it

application/json

Property Type Required Description
code string Yes The error code.
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "code": "unauthorized",
  "detail": "Operation is unauthorized",
  "status": 403,
  "type": "/errors/types/access"
}
422: The request is valid JSON but cannot be processed. A 422 is deterministic and actionable: the same request will fail the same way until the offending value is changed. The errors array identifies the parameter or field that caused the error. There are three cases, shown below

application/json

Property Type Required Description
errors array of object Yes The individual validation errors.
errors[].code string Yes The validation error code.
errors[].detail string Yes A description of the validation error.
errors[].ref string Yes The parameter or field that caused the error.
instance string Yes The API path associated with the error.
status integer Yes The HTTP status code.
title string Yes A short summary of the error.
type string Yes A URI identifying the error type.
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header

application/json

The response is object.

500: An unexpected error occurred

application/json

Property Type Required Description
detail string Yes A description of the error.
status integer Yes The HTTP status code.
type string Yes The type of error.

Example response:

{
  "detail": "An unexpected error occurred",
  "status": 500,
  "type": "/errors/types/server"
}