List card transactions
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/cards/{cardId}/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/cards/{cardId}/transactions', 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}/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)[
{
"id": "01K2Z3AB4T5V6W7X8YZABCDEFG",
"cardId": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"status": "completed",
"direction": "debit",
"amount": "1250",
"amountFormatted": "12.50",
"currency": "USD",
"merchantName": "EXAMPLE HOSTING",
"merchantCountry": "US",
"narration": "Monthly plan",
"createdAt": "2026-08-14T11:04: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": 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."
}Cards
List card transactions
Payments made with the card, newest first. Sakawave refreshes from the provider on each call, so this reflects authorisations the ledger has not yet seen.
GET
/
v1
/
cards
/
{cardId}
/
transactions
List card transactions
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/cards/{cardId}/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/cards/{cardId}/transactions', 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}/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)[
{
"id": "01K2Z3AB4T5V6W7X8YZABCDEFG",
"cardId": "01K2Z3AB4S5T6V7W8XYZABCDEF",
"status": "completed",
"direction": "debit",
"amount": "1250",
"amountFormatted": "12.50",
"currency": "USD",
"merchantName": "EXAMPLE HOSTING",
"merchantCountry": "US",
"narration": "Monthly plan",
"createdAt": "2026-08-14T11:04: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": 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."
}This endpoint is not paginated and takes no filters. It returns every payment recorded for the card.
createdAt is when the provider recorded the payment. A refund arrives as a credit, and a reversed authorisation appears as reversed rather than disappearing.
For the ledger view of the same money, read transactions — card activity posts there as card.transaction.* events too.
Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | The identifier is not a ULID. |
503 | card_provider_unavailable | The provider could not be reached for a refresh. |
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.
Required string length:
26Pattern:
^[0-7][0-9A-HJKMNP-TV-Z]{25}$Example:
"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Response
Successful response.
A 26-character ULID.
Required string length:
26Pattern:
^[0-7][0-9A-HJKMNP-TV-Z]{25}$Example:
"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
A 26-character ULID.
Required string length:
26Pattern:
^[0-7][0-9A-HJKMNP-TV-Z]{25}$Example:
"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Available options:
pending, completed, failed, reversed, refunded A refund arrives as a credit.
Available options:
debit, credit An integer number of the asset’s smallest unit. Use this value for arithmetic.
Pattern:
^-?\d+$Example:
"2500000"
Maximum string length:
10Maximum string length:
200Required string length:
2Maximum string length:
500Example:
"2026-08-14T09:00:00.000Z"