curl --request GET \
--url https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "01K2Z3AB4X5Y6Z7A8BCDEFGHJK",
"externalReference": "bill_20260814_001",
"paymentReference": "SKWV-BIL-01K2Z3AB4X5Y6Z7A8BCDEFGHJK",
"providerTransactionId": "CP-88213471",
"status": "confirmed",
"subCategory": "utility",
"amount": "5000.00",
"charge": "100.00",
"commission": "0.00",
"totalDebit": "5100.00",
"currency": "NGN",
"group": {
"name": "Electricity",
"slug": "DISCO"
},
"biller": {
"name": "Example Disco",
"slug": "EXAMPLE_DISCO"
},
"package": {
"name": "Prepaid",
"slug": "EXAMPLE_DISCO_PREPAID"
},
"customerReferenceLast4": "7788",
"customerName": "ADA OKAFOR",
"customerAddress": "14 Marina Road",
"vendStatus": "SUCCESSFUL",
"providerStatusCode": "00",
"tokenData": {
"token": "1234-5678-9012-3456-7890",
"units": "31.4"
},
"failureReason": null,
"createdAt": "2026-08-14T09:15:00.000Z",
"updatedAt": "2026-08-14T09:15:06.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 a bill payment
One bill payment, including its token where the biller issued one.
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/bill-payments/{paymentId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"id": "01K2Z3AB4X5Y6Z7A8BCDEFGHJK",
"externalReference": "bill_20260814_001",
"paymentReference": "SKWV-BIL-01K2Z3AB4X5Y6Z7A8BCDEFGHJK",
"providerTransactionId": "CP-88213471",
"status": "confirmed",
"subCategory": "utility",
"amount": "5000.00",
"charge": "100.00",
"commission": "0.00",
"totalDebit": "5100.00",
"currency": "NGN",
"group": {
"name": "Electricity",
"slug": "DISCO"
},
"biller": {
"name": "Example Disco",
"slug": "EXAMPLE_DISCO"
},
"package": {
"name": "Prepaid",
"slug": "EXAMPLE_DISCO_PREPAID"
},
"customerReferenceLast4": "7788",
"customerName": "ADA OKAFOR",
"customerAddress": "14 Marina Road",
"vendStatus": "SUCCESSFUL",
"providerStatusCode": "00",
"tokenData": {
"token": "1234-5678-9012-3456-7890",
"units": "31.4"
},
"failureReason": null,
"createdAt": "2026-08-14T09:15:00.000Z",
"updatedAt": "2026-08-14T09:15:06.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 26 characters. |
404 | resource_not_found | No such bill payment 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. |
Authorizations
A secret API key, sent as Authorization: Bearer sk_test_… in sandbox or Bearer sk_live_… in live.
Path Parameters
Bill payment 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"
Sakawave’s own reference for the payment.
confirmed is the success state, not completed.
submitted, pending, confirmed, failed What kind of bill this was: airtime, data, utility, cable_tv, betting, and so on.
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"
Bill payments are NGN only.
NGN Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The last four characters of the meter, account, or phone number paid.
The biller’s own delivery status, upper-cased.
The credential the biller issued, where there is one — a prepaid electricity token, for instance. Shape varies by biller.
"2026-08-14T09:00:00.000Z"
"2026-08-14T09:00:00.000Z"