Skip to main content
We deliver POST requests with a JSON body to your callback URL.

Top-level structure

{
  "status": "SUCCESS",
  "code": "102",
  "description": "Payment completed successfully",
  "results": {
    "result_code": "0",
    "result_description": "The service request is processed successfully.",
    "amount": 100,
    "total_charges": 10,
    "total_amount": 100,
    "account": "254708374149",
    "transaction_reference": "295877",
    "payment_uuid": "413283551145761444",
    "external_reference": "3C1HH10ZU8",
    "time_processed": "2026-01-07T09:48:08.8485958",
    "validation_hash": "16b70a72ab3abddd1a2ed3db533317be9785fa553beafb563d205cec5a693b6c",
    "metadata": {}
  }
}
Fields
  • status (string): High-level outcome — e.g., CREATED, PENDING, SUCCESS, FAILED, ESCALATED, EXPIRED, REFUNDED, REVERSED.
  • code (string): Machine code corresponding to status (e.g., 102 for SUCCESS).
  • description (string): Human-friendly explanation.
  • results (object): Detailed result set:
    • result_code, result_description: Processor/rail outcome.
    • Monetary fields: amount, total_charges, total_amount.
    • Ids: transaction_reference (your client reference), payment_uuid (Waftpay reference), external_reference (network/MNO reference if present).
    • msisdn (if applicable), time_processed (ISO-8601 UTC), metadata (optional).
    • validation_hash: Integrity string (see Verify Signature).
Note: client_reference in other pages refers to this same transaction_reference field.

Status codes

statuscode
CREATED100
PENDING101
SUCCESS102
FAILED103
ESCALATED104
EXPIRED105
REFUNDED106
REVERSED107
These codes map to the payment lifecycle and are consistent across webhook events.