The order is not optional
You cannot pay a bill without an enquiry, and an enquiry expires after ten minutes. That is the shape of the service: identify the product, confirm the customer, then pay.Catalog
Three levels, each paged, all read-only.ids are Sakawave ULIDs, and they are the only addresses this API accepts — in a path and in an enquiry body alike. A slug will not resolve, and neither will the upstream provider’s own id, which is what id returned before. Which provider fulfils a product is internal routing that never appears here, so a provider change leaves your stored ids intact.
The catalog and payment lists use their own page shape —
totalPages instead of pageCount, and no hasNext or hasPrevious. This is the only part of the API that does.Enquiry
An enquiry asks the biller who a customer reference belongs to, and what paying them will cost.- The name the biller holds. Show it before taking money — it is the only check that the meter or account number was typed correctly.
- The price.
chargeandcommissionare yours;totalDebitis what leaves the account.
customer is whatever the biller returned, filtered to a safe subset, and its shape varies by biller. Read defensively.
Payment
A failed bill payment refunds itself. You do not claim the money back; Sakawave posts a reversal against the same account.
Amounts are decimals here
This service uses decimal strings —"5000.00" — not the minor units the rest of the API uses.
One API, two conventions. Convert at the boundary of this service and nowhere else.
Events
Next
Introduction
Why the enquiry exists, and what it protects.
Get started
Catalog, enquiry, payment, token.
Setup and configuration
Limits, idempotency, and reconciliation.
Airtime, data, and utilities
How the product families differ.