curl --request GET \
--url https://sandbox-api.sakawave.example/v1/currencies \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/currencies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/currencies"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)[
{
"code": "NGN",
"name": "Nigerian Naira",
"symbol": "₦",
"minorUnits": 2,
"accountIssuanceEnabled": true,
"transferEnabled": true,
"fxEnabled": true,
"ownTransferEnabled": true,
"tagTransferEnabled": true,
"externalTransferEnabled": true,
"isActive": true,
"updatedAt": "2026-08-14T08:00: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": 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 currencies
Every active currency and the six switches that decide what it can be used for, sorted by code. Filter by a capability to ask a narrower question: “what can I open an account in?” rather than “what exists?”.
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/currencies \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/currencies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/currencies"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)[
{
"code": "NGN",
"name": "Nigerian Naira",
"symbol": "₦",
"minorUnits": 2,
"accountIssuanceEnabled": true,
"transferEnabled": true,
"fxEnabled": true,
"ownTransferEnabled": true,
"tagTransferEnabled": true,
"externalTransferEnabled": true,
"isActive": true,
"updatedAt": "2026-08-14T08:00: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": 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."
}The capability model
A currency is not simply on or off. Six switches govern it independently, and a transfer reads several of them at once.| Capability | Checked against |
|---|---|
account_issuance | The currency of an account you are opening. |
transfer | The source currency of any transfer. |
own_transfer | The destination currency, when paying your own account. |
tag_transfer | The destination currency, when paying a Sakawave tag. |
external_transfer | The destination currency, when paying an external destination. |
fx | Both currencies, whenever they differ. An active FX corridor for the pair is required too. |
transfer on the source, external_transfer on the destination, and fx on both — then the corridor itself.
A capability that is off answers 409 currency_capability_unavailable at the point of use. Reading this endpoint first turns that into a decision you make rather than an error you handle.
isActive is always true here: an inactive currency is not returned at all. Use updatedAt as a cache key.Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | capability is not one of the six values. |
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
Return only currencies with this capability enabled.
account_issuance, transfer, fx, own_transfer, tag_transfer, external_transfer Response
Successful response.
ISO 4217 code for a fiat currency, or the asset code for crypto.
3 - 10808Decimal places. 2 for most currencies, 0 for UGX, 8 for crypto assets.
x >= 0An account may be opened in this currency.
Required on the source currency of any transfer.
Required on both currencies when a transfer converts.
Required on the destination currency for a transfer to your own account.
Required on the destination currency for a transfer to a Sakawave tag.
Required on the destination currency for a payout to an external destination.
Always true in this response: inactive currencies are not returned.
"2026-08-14T09:00:00.000Z"