List transfers
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/transfers \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/transfers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/transfers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"items": [
{
"id": "01K2Z3AB4J5K6M7N8PQRSTVWXY",
"externalReference": "payout_20260814_001",
"transferReference": "SKWV-TRF-01K2Z3AB4J5K6M7N8PQRSTVWXY",
"destinationType": "own_account",
"sourceAccountId": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"destinationId": "01K2Z3AB4F5G6H7J8KMNPQRSTV",
"sourceCurrency": "NGN",
"destinationCurrency": "NGN",
"amountSide": "source",
"sourceAmount": "25000.00",
"destinationAmount": "25000.00",
"fee": "50.00",
"totalDebit": "25050.00",
"routeId": null,
"scheme": "internal",
"fxQuoteId": null,
"destination": {
"displayName": "Treasury NGN",
"institutionName": null,
"accountNumberLast4": null
},
"status": "completed",
"narration": "Sandbox tutorial transfer",
"failureCode": null,
"failureReason": null,
"initiatedByUserId": null,
"initiatedByApiKeyId": "01K2Z3AB4N5P6Q7R8STVWXYZAB",
"approvedByUserId": null,
"approvedAt": null,
"completedAt": "2026-08-14T09:08:00.000Z",
"createdAt": "2026-08-14T09:07:58.000Z",
"updatedAt": "2026-08-14T09:08:00.000Z"
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"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."
}Transfers
List transfers
Transfers belonging to your business, newest first. Each item carries a snapshot of where the money went, so a deleted recipient does not erase the history.
GET
/
v1
/
transfers
List transfers
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/transfers \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/transfers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/transfers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"items": [
{
"id": "01K2Z3AB4J5K6M7N8PQRSTVWXY",
"externalReference": "payout_20260814_001",
"transferReference": "SKWV-TRF-01K2Z3AB4J5K6M7N8PQRSTVWXY",
"destinationType": "own_account",
"sourceAccountId": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"destinationId": "01K2Z3AB4F5G6H7J8KMNPQRSTV",
"sourceCurrency": "NGN",
"destinationCurrency": "NGN",
"amountSide": "source",
"sourceAmount": "25000.00",
"destinationAmount": "25000.00",
"fee": "50.00",
"totalDebit": "25050.00",
"routeId": null,
"scheme": "internal",
"fxQuoteId": null,
"destination": {
"displayName": "Treasury NGN",
"institutionName": null,
"accountNumberLast4": null
},
"status": "completed",
"narration": "Sandbox tutorial transfer",
"failureCode": null,
"failureReason": null,
"initiatedByUserId": null,
"initiatedByApiKeyId": "01K2Z3AB4N5P6Q7R8STVWXYZAB",
"approvedByUserId": null,
"approvedAt": null,
"completedAt": "2026-08-14T09:08:00.000Z",
"createdAt": "2026-08-14T09:07:58.000Z",
"updatedAt": "2026-08-14T09:08:00.000Z"
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"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."
}This list does not use the shared filter grammar. The parameters are fixed — no
:operator suffixes — one sort key only, and the page size defaults to 20 rather than 25.-createdAt with a pinned upper bound, or read the transactions ledger, which is the record of what actually moved.
Error codes
| Status | code | Cause |
|---|---|---|
400 | validation_failed | An unknown parameter, an unsupported sort key, 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. Transfers, quotes, destinations, and recipients share one 120-per-minute allowance. |
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.
Required range:
x >= 1Records per page.
Required range:
1 <= x <= 100Case-insensitive term, 1 to 100 characters.
Required string length:
1 - 100One key only. Prefix with - for descending order.
Available options:
createdAt, -createdAt, totalDebit, -totalDebit, status, -status Filter by transfer status.
Available options:
awaiting_approval, submitting, pending, completed, failed, reversed, rejected Filter by destination type.
Available options:
own_account, sakawave_tag, external Filter by source currency.
Available options:
NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED Filter by destination currency.
Available options:
NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED, AUD, SGD, HKD, KES, TZS, BRL, CNY, XAF, PHP, USDC