curl --request GET \
--url https://sandbox-api.sakawave.example/v1/accounts/{accountId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/accounts/{accountId}', 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/{accountId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"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",
"details": [
{
"account": {
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"currency": "NGN",
"name": "Collections"
},
"beneficiary": {
"name": "Ada Okafor",
"address": null
},
"details": {
"id": "01K2Z3AB4P5Q6R7S8TVWXYZABC",
"type": "bank_account",
"domestic": {
"accountNumber": "0123456789",
"routingNumber": null,
"sortCode": null,
"bankName": "Example Bank",
"bankAddress": null
},
"international": null,
"wallet": null,
"paymentRails": [],
"providerBacked": true,
"createdAt": "2026-08-14T09:03: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."
}Get an account
Returns one account together with every funding and payout detail issued for it. This is the only read that includes details; the list endpoint does not.
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/accounts/{accountId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/accounts/{accountId}', 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/{accountId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"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",
"details": [
{
"account": {
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"currency": "NGN",
"name": "Collections"
},
"beneficiary": {
"name": "Ada Okafor",
"address": null
},
"details": {
"id": "01K2Z3AB4P5Q6R7S8TVWXYZABC",
"type": "bank_account",
"domestic": {
"accountNumber": "0123456789",
"routingNumber": null,
"sortCode": null,
"bankName": "Example Bank",
"bankAddress": null
},
"international": null,
"wallet": null,
"paymentRails": [],
"providerBacked": true,
"createdAt": "2026-08-14T09:03: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."
}Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | The identifier is not a ULID. |
401 | INVALID_API_KEY | The key is missing, invalid, inactive, expired, from the other environment, or blocked by its IP allowlist. |
404 | account_not_found | No such account for this business. Internal platform balances are never visible, and a closed account still is. |
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
Account ULID. A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Response
Successful response.
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Your own label for the account. Not shown to anyone paying into it.
What the account is for. operational and savings behave identically; the rest are platform-managed.
operational, savings, settlement, collection, fee, revenue, suspense Follows from the currency; it is never chosen.
fiat, crypto Only active can move money. frozen is a compliance or provider hold. closed is terminal.
active, inactive, frozen, closed NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED, BTC, ETH, USDT, USDC 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.
The account’s public transfer handle: two letters and ten digits, the last a check digit. Platform-minted and unique across Sakawave, so another business can pay this account by tag.
^[A-Z]{2}\d{10}$Whether money may leave. Held separately from status: an account can be stopped in one direction only.
Whether money may arrive.
True when the account belongs to one of your customers rather than to your business.
True once the account is bound to a payment provider. A freshly opened account is false until its first detail is issued, and cannot yet send or receive externally.
The owning customer, when this is a wallet account.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Whatever you stored at creation, returned unchanged. Sakawave never reads it.
"2026-08-14T09:00:00.000Z"
client_request, no_longer_needed, duplicate, compliance "2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"
Show child attributes
Show child attributes