Gateway API
Bill Payment API
Pay utilities and subscriptions with PARTNER_PAY_BILL_PAYMENT.
Development / sandbox: use -sandbox endpoints
On https://dev-api.rukapay.net (dev), do not call the production paths. Use the full sandbox URLs below — same request body, simulated responses, no real money movement.
- Validate beneficiary:
https://dev-api.rukapay.net/api/v1/gateway/validate-beneficiary-sandbox - Process transfer:
https://dev-api.rukapay.net/api/v1/gateway/process-transfer-sandbox
Overview
Bill payments use billerCode (e.g. NWSC, UMEME) and customer accountNumber. Aliases biller_code and account_number are accepted on validate-beneficiary.
Example request
Authenticate with your secret API key. All requests are made over HTTPS to the RukaPay API base URL.
curl -X POST https://api.rukapay.net/api/v1/gateway/process-transfer \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transactionMode": "PARTNER_PAY_BILL_PAYMENT",
"amount": 85000,
"currency": "UGX",
"billerCode": "NWSC",
"accountNumber": "04151234567",
"narration": "Water bill",
"partnerReference": "BILL-NWSC-001"
}'https://api.rukapay.net/api/v1/gateway/process-transferRequest body
transactionModeRequiredMode code e.g. PARTNER_SEND_MNO, PARTNER_COLLECT_MNO.
amountRequiredAmount in UGX (minimum 100).
currencyRequiredCurrency code. Default UGX.
narrationRequiredTransfer description shown in records.
partnerReferenceRequiredUnique partner reference for idempotency and tracking.
walletTypeESCROW or COMMISSION. Default ESCROW.
phoneNumberUganda MSISDN 256XXXXXXXXX (MNO send/collect/airtime).
mnoProviderMTN or AIRTEL. Aliases: network.
accountNumberBank or bill account number.
bankCodeBank code e.g. STANBIC (bank send).
accountNameAccount holder name (bank send).
recipientNameRecipient name (MNO send).
billerCodeBiller code e.g. NWSC, UMEME (bill payment).
callbackUrlWebhook URL. Required for PARTNER_COLLECT_MNO.
metadataCustom data returned in partner callback.
Request example
{
"transactionMode": "PARTNER_PAY_BILL_PAYMENT",
"amount": 50000,
"currency": "UGX",
"narration": "Payment description",
"partnerReference": "PARTNER-REF-123456",
"billerCode": "NWSC",
"accountNumber": "04151234567"
}Response example
{
"success": true,
"message": "Transfer processed successfully",
"transaction": {
"transactionId": "cm5abc123xyz",
"reference": "RKP-20260521-001",
"amount": 50000,
"fee": 1000,
"totalCharged": 51000,
"status": "SUCCESS",
"recipient": {
"name": "John Doe",
"account": "256700000000",
"provider": "MTN"
},
"createdAt": "2026-05-21T10:30:00.000Z"
},
"walletBalance": {
"walletId": "wal_partner_escrow",
"walletType": "ESCROW",
"balanceBefore": 1000000,
"balanceAfter": 949000,
"currency": "UGX"
}
}Status codes
OK
Bill payment processed or pending.
https://api.rukapay.net/api/v1/gateway/validate-beneficiaryRequest body
transactionModeRequiredPARTNER_PAY_BILL_PAYMENT
billerCodeRequirede.g. NWSC, UMEME
accountNumberRequiredCustomer account or meter number.
Request example
{
"transactionMode": "PARTNER_PAY_BILL_PAYMENT",
"amount": 50000,
"currency": "UGX",
"narration": "Payment description",
"partnerReference": "PARTNER-REF-123456",
"billerCode": "NWSC",
"accountNumber": "04151234567"
}Response example
{
"success": true,
"beneficiary": { "name": "Jane Customer", "accountNumber": "04151234567", "provider": "NWSC", "isValid": true }
}Status codes
OK
Account validated.
https://api.rukapay.net/api/v1/gateway/transactions/{transactionIdOrReference}/statusPath parameters
transactionIdOrReferenceRequiredTransaction ID or your partnerReference.
Response example
{
"success": true,
"message": "Transaction found",
"transaction": {
"id": "cm5abc123xyz",
"partnerReference": "PARTNER-REF-123456",
"mnoId": "MTN-FIN-987654",
"mnoTransactionId": "MTN-FIN-987654",
"amount": 50000,
"fee": 1000,
"totalAmount": 51000,
"currency": "UGX",
"status": "SUCCESS",
"destinationType": "MNO",
"destination": { "phoneNumber": "256700000000", "provider": "MTN" },
"createdAt": "2026-05-21T10:30:00.000Z",
"completedAt": "2026-05-21T10:30:45.000Z"
}
}Status codes
OK
Transaction found.
Not Found
TRANSACTION_NOT_FOUND.