curl --request POST \
--url https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalReference": "card_freeze_20260814_001"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({externalReference: 'card_freeze_20260814_001'})
};
fetch('https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze"
payload = { "externalReference": "card_freeze_20260814_001" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"label": "Ada travel card",
"type": "virtual",
"brand": "mastercard",
"currency": "USD",
"status": "frozen",
"maskedPan": "•••• •••• •••• 4242",
"expiryMonth": 8,
"expiryYear": 2028,
"holder": {
"type": "customer",
"id": "01K2Z3AB4C5D6E7F8G9HJKMNPQ",
"name": "Ada Okafor"
},
"balance": "5000",
"balanceFormatted": "50.00",
"spendingControls": {
"transactionAmountLimit": "2000",
"dailyAmountLimit": "5000",
"dailyTransactionCount": 10
},
"operations": [
{
"id": "01K2Z3AB4R5S6T7V8WXYZABCDE",
"cardId": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"type": "issuance",
"status": "completed",
"sourceCurrency": "NGN",
"destinationCurrency": "USD",
"sourceAmount": "8000000",
"destinationAmount": "5000",
"failureCode": null,
"failureReason": null,
"completedAt": "2026-08-14T09:12:00.000Z",
"createdAt": "2026-08-14T09:11:40.000Z",
"updatedAt": "2026-08-14T09:12:00.000Z"
}
],
"createdAt": "2026-08-14T09:11:40.000Z",
"updatedAt": "2026-08-14T09:12:00.000Z"
}{
"statusCode": 400,
"message": "Must be a valid identifier.",
"code": "validation_failed",
"errors": [
{
"message": "Must be a valid identifier.",
"field": "accountId",
"code": "custom",
"path": [
"accountId"
]
}
]
}{
"statusCode": 401,
"code": "INVALID_API_KEY",
"message": "Invalid or inactive API credentials."
}{
"statusCode": 404,
"code": "resource_not_found",
"message": "Resource not found."
}{
"statusCode": 409,
"code": "resource_conflict",
"message": "The request conflicts with the current resource state."
}{
"statusCode": 429,
"message": "Too many API requests. Try again later.",
"code": "api_key_rate_limit_exceeded",
"retryAfterSeconds": 17
}{
"statusCode": 500,
"code": "internal_server_error",
"message": "An unexpected error occurred."
}{
"statusCode": 503,
"code": "provider_unavailable",
"message": "We could not issue an account number just now. Try again shortly."
}Freeze a card
Stops the card authorising payments. Funding and withdrawal still work while frozen, and the card can be unfrozen.
curl --request POST \
--url https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalReference": "card_freeze_20260814_001"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({externalReference: 'card_freeze_20260814_001'})
};
fetch('https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/cards/{cardId}/freeze"
payload = { "externalReference": "card_freeze_20260814_001" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"label": "Ada travel card",
"type": "virtual",
"brand": "mastercard",
"currency": "USD",
"status": "frozen",
"maskedPan": "•••• •••• •••• 4242",
"expiryMonth": 8,
"expiryYear": 2028,
"holder": {
"type": "customer",
"id": "01K2Z3AB4C5D6E7F8G9HJKMNPQ",
"name": "Ada Okafor"
},
"balance": "5000",
"balanceFormatted": "50.00",
"spendingControls": {
"transactionAmountLimit": "2000",
"dailyAmountLimit": "5000",
"dailyTransactionCount": 10
},
"operations": [
{
"id": "01K2Z3AB4R5S6T7V8WXYZABCDE",
"cardId": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"type": "issuance",
"status": "completed",
"sourceCurrency": "NGN",
"destinationCurrency": "USD",
"sourceAmount": "8000000",
"destinationAmount": "5000",
"failureCode": null,
"failureReason": null,
"completedAt": "2026-08-14T09:12:00.000Z",
"createdAt": "2026-08-14T09:11:40.000Z",
"updatedAt": "2026-08-14T09:12:00.000Z"
}
],
"createdAt": "2026-08-14T09:11:40.000Z",
"updatedAt": "2026-08-14T09:12:00.000Z"
}{
"statusCode": 400,
"message": "Must be a valid identifier.",
"code": "validation_failed",
"errors": [
{
"message": "Must be a valid identifier.",
"field": "accountId",
"code": "custom",
"path": [
"accountId"
]
}
]
}{
"statusCode": 401,
"code": "INVALID_API_KEY",
"message": "Invalid or inactive API credentials."
}{
"statusCode": 404,
"code": "resource_not_found",
"message": "Resource not found."
}{
"statusCode": 409,
"code": "resource_conflict",
"message": "The request conflicts with the current resource state."
}{
"statusCode": 429,
"message": "Too many API requests. Try again later.",
"code": "api_key_rate_limit_exceeded",
"retryAfterSeconds": 17
}{
"statusCode": 500,
"code": "internal_server_error",
"message": "An unexpected error occurred."
}{
"statusCode": 503,
"code": "provider_unavailable",
"message": "We could not issue an account number just now. Try again shortly."
}Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | A field failed validation. |
409 | card_terminal | The card is used, terminating, terminated, failed, or marked fraud. |
503 | card_provider_unavailable | The card provider could not be reached. |
401 | INVALID_API_KEY | The key is missing, invalid, inactive, expired, from the other environment, or blocked by its IP allowlist. |
404 | card_not_found | No such card for this business. |
429 | api_key_rate_limit_exceeded | The per-minute limit for this key was exceeded. |
Authorizations
A secret API key, sent as Authorization: Bearer sk_test_… in sandbox or Bearer sk_live_… in live.
Path Parameters
Card ULID. A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Body
1 - 120Response
Successful response.
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Your own name for the card.
80virtual, disposable mastercard Cards are USD only.
USD creating, active, frozen, funding_failed, terminating, used, terminated, failed, fraud The masked number. The full PAN is only available from the credentials endpoint.
1 <= x <= 12Show child attributes
Show child attributes
An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
The same figure rendered for display. Never use it in a calculation.
Per-card limits, in USD minor units. Not available on a disposable card.
Show child attributes
Show child attributes
Issuance, funding, withdrawal, and termination operations for this card. Empty on a list response.
Show child attributes
Show child attributes
"2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"