Initiate Bill Payment
Starts a bill payment from walletId (a PERSONAL or BUSINESS wallet). The body takes one of two shapes:
- Biller from the catalogue:
billProviderId+accountNumber. The biller’s payment method decides the route:CHOICE_BILLbillers are paid through Choice’s bill payment service (categoryUTILITY_BILL, withdueAmount/dueDatefrom Choice), andMPESA_PAYBILLbillers go out as an M-Pesa Paybill payment to the biller’s business number.category/shortCode/referenceNumbermust be absent. - Manual M-Pesa Paybill/Till: no
billProviderId;categoryisMPESA_PAYBILL(requiresreferenceNumber) orMPESA_TILL, andshortCodeis the paybill/till number.
description is only passed to M-Pesa payments. dueAmount/dueDate are null for M-Pesa payments. Next step: Confirm Bill Payment with the returned transactionId.
Headers
Authorization
X-Device-Id
Required on non-GET requests to non-public paths (DeviceSignatureFilter), skipped for GET/whitelisted/multipart requests and in the local profile.
X-Signature
Base64 ECDSA signature over sha256(body) + timestamp + requestId, signed with the device's registered private key.
X-Timestamp
Unix epoch seconds; must be within 5 minutes of server time.
X-Request-Id
Unique per request - reused values are rejected as replays.
Idempotency-Key
Request
This endpoint expects an object.
walletId
amount
billProviderId
accountNumber
Response
200 OK (Catalogue Biller, Choice Bill Payment)
code
message
data
Errors
400
Bad Request Error
