curl --request GET \
--url https://sandbox-api.sakawave.example/v1/accounts \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/accounts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"items": [
{
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"name": "Ada NGN wallet",
"type": "operational",
"category": "fiat",
"status": "active",
"currency": "NGN",
"balance": "2500000",
"balanceFormatted": "25000.00",
"tag": "AA0271849366",
"canDebit": true,
"canCredit": true,
"isWalletAccount": true,
"transferReady": true,
"customerId": "01K2Z3AB4C5D6E7F8G9HJKMNPQ",
"metadata": {
"cohort": "sandbox-tutorial"
},
"closedAt": null,
"closureReason": null,
"createdAt": "2026-08-14T09:02:00.000Z",
"updatedAt": "2026-08-14T09:02:00.000Z"
}
],
"pagination": {
"page": 1,
"pageSize": 25,
"total": 1,
"pageCount": 1,
"hasNext": false,
"hasPrevious": false
}
}{
"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": 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."
}List accounts
Returns your accounts and your customers’ wallet accounts, newest first. Internal platform balances, such as card settlement accounts, are never included. Closed accounts are.
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/accounts \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/accounts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"items": [
{
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"name": "Ada NGN wallet",
"type": "operational",
"category": "fiat",
"status": "active",
"currency": "NGN",
"balance": "2500000",
"balanceFormatted": "25000.00",
"tag": "AA0271849366",
"canDebit": true,
"canCredit": true,
"isWalletAccount": true,
"transferReady": true,
"customerId": "01K2Z3AB4C5D6E7F8G9HJKMNPQ",
"metadata": {
"cohort": "sandbox-tutorial"
},
"closedAt": null,
"closureReason": null,
"createdAt": "2026-08-14T09:02:00.000Z",
"updatedAt": "2026-08-14T09:02:00.000Z"
}
],
"pagination": {
"page": 1,
"pageSize": 25,
"total": 1,
"pageCount": 1,
"hasNext": false,
"hasPrevious": false
}
}{
"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": 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."
}Filtering
Filters are written asfield=value, or field:operator=value. balance is compared in minor units, which is how it is stored — filtering NGN by naira is wrong by a factor of a hundred.
GET /v1/accounts?status=active¤cy:in=NGN,USDC&balance:gt=0&sort=-balance
GET /v1/accounts?customerId:isnull=true # your business accounts
GET /v1/accounts?isWalletAccount=true # your customers’ wallets
Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | An unknown filter or sort key, an unsupported operator, or a page size above 100. |
401 | INVALID_API_KEY | The key is missing, invalid, inactive, expired, from the other environment, or blocked by its IP allowlist. |
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.
Query Parameters
One-based page number.
x >= 1Records per page. A larger value is rejected rather than capped.
1 <= x <= 100Case-insensitive term matched against name and tag. Maximum 100 characters.
100Up to three comma-separated keys from name, balance, currency, status, and createdAt. Prefix a key with - for descending order.
Exact match on your label.
Substring of your label.
Exact match on the public transfer handle.
^[A-Z]{2}\d{10}$Substring of the transfer handle.
Filter by account type.
operational, savings, settlement, collection, fee, revenue, suspense Everything except this type.
Comma-separated account types.
Filter by asset category.
fiat, crypto Comma-separated categories.
Filter by status.
active, inactive, frozen, closed Everything except this status.
Comma-separated statuses.
Filter by asset code.
NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED, BTC, ETH, USDT, USDC Comma-separated asset codes.
Exact balance, in minor units. An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
Balance above this value, in minor units. An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
Balance at or above this value, in minor units. An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
Balance below this value, in minor units. An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
Balance at or below this value, in minor units. An integer number of the asset’s smallest unit. Use this value for arithmetic.
^-?\d+$"2500000"
True for customer wallets, false for your own accounts.
Wallets belonging to one customer. A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Comma-separated customer identifiers. At most 50.
true returns only your own accounts; false returns only customer wallets.
Opened after this ISO 8601 timestamp.
Opened at or after this ISO 8601 timestamp.
Opened before this ISO 8601 timestamp.
Opened at or before this ISO 8601 timestamp.