curl --request GET \
--url https://sandbox-api.sakawave.example/v1/transfers/{transferId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/transfers/{transferId}', 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/{transferId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"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",
"sourceAccount": {
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"name": "Ada NGN wallet",
"tag": "AA0271849366"
},
"providerReference": null
}{
"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 a transfer
One transfer, with its source account and the provider reference where one exists. This is the authority on a transfer’s state — prefer it over a webhook payload when the two disagree.
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/transfers/{transferId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/transfers/{transferId}', 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/{transferId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"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",
"sourceAccount": {
"id": "01K2Z3AB4D5E6F7G8H9JKMNPQR",
"name": "Ada NGN wallet",
"tag": "AA0271849366"
},
"providerReference": null
}{
"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. |
404 | transfer_not_found | No such transfer for this business. |
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.
Path Parameters
Transfer 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"
own_account, sakawave_tag, external A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED, USDC NGN, USD, GBP, EUR, GHS, ZAR, UGX, CAD, MXN, AED, AUD, SGD, HKD, KES, TZS, BRL, CNY, XAF, PHP, USDC source, destination A decimal display amount returned by transfer APIs. Preserve it as a string.
^-?\d+(?:\.\d+)?$"25000.00"
A decimal display amount returned by transfer APIs. Preserve it as a string.
^-?\d+(?:\.\d+)?$"25000.00"
A decimal display amount returned by transfer APIs. Preserve it as a string.
^-?\d+(?:\.\d+)?$"25000.00"
A decimal display amount returned by transfer APIs. Preserve it as a string.
^-?\d+(?:\.\d+)?$"25000.00"
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Show child attributes
Show child attributes
awaiting_approval, submitting, pending, completed, failed, reversed, rejected A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
A 26-character ULID.
26^[0-7][0-9A-HJKMNP-TV-Z]{25}$"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
"2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"
Show child attributes
Show child attributes