Skip to content

Payload Reference

The result_url callback is POSTed with the transaction object directly as the request body — unlike the other API responses, it is not wrapped in a {"success": ..., "data": ...} envelope. The shape is otherwise identical to the data object returned by Transaction Status Query.

Confirmed payload

{
  "status": "success",
  "status_description": "Transaction proccessed successfully",
  "transaction_type": "B2C",
  "transaction_id": "<TRANSACTION_ID>",
  "gateway_reference": null,
  "merchant_reference": "<YOUR_UNIQUE_REFERENCE>",
  "rail_reference": "<RAIL_REFERENCE>",
  "amount": 10,
  "is_paid": true,
  "charges": 0,
  "currency_code": "KES",
  "payment_method": "mpesa",
  "created_at": "2026-04-08T22:43:58.620181+03:00",
  "completed_at": null
}

Fields

Field Notes
status Transaction outcome, e.g. success; confirm the full set of possible values (processing, failed, etc.) with Hivemind Payments
status_description Human-readable description of status
transaction_type C2B, B2C, or B2B, matching the value sent to Initiate Payment
transaction_id Hivemind Payments' transaction identifier
merchant_reference The reference you supplied when calling Initiate Payment — use this to match the callback to your own record
gateway_reference / rail_reference Downstream payment-rail identifiers; either may be null depending on payment_method and how far the transaction progressed
amount, charges, currency_code Transaction amount, Hivemind Payments' charges, and currency
is_paid Boolean settlement flag — appears alongside status and may not always agree with it while a transaction is still processing
payment_method e.g. mpesa, airtel, tkash, bank, card
created_at / completed_at completed_at was null in the captured example even though status was success — don't assume it's reliably populated on completion without confirming with Hivemind Payments

This matches the Transaction Status Query response fields exactly (minus the {"success", "data"} wrapper), so the same caveats about status/is_paid/completed_at semantics apply here too.

Handling the payload

  • Match the callback to your system's record using merchant_reference.
  • Treat the callback as the source of truth for final state, but reconcile periodically against Transactions Statement in case a callback is ever missed.
  • Do not trust the payload contents without first verifying the request's authenticity — see Verifying & Testing Webhooks.