Skip to main content
Use this guide to build a reliable payout flow with Waftpay. Payouts are asynchronous: you receive an acceptance response first, then a final outcome via webhook.

Quick flow

Authenticate -> Sign -> Send payout -> Receive acceptance -> Receive webhook -> Reconcile (optional status check).

Prerequisites


Endpoint

Required headers
Idempotency: reuse the same transaction.reference for retries of the same logical payout.

Request body (example)

Notes
  • amount is in major units (e.g., 1000 = 1000 KES).
  • timestamp must be ISO 8601 UTC (ends with Z).
  • transaction.service_code is assigned by Waftpay; confirm entitlement before go-live.

Acceptance response (immediate)


Webhook (final outcome)

We POST to your callback_url when the payout completes. See Webhook payload.

Status checks (optional)

If a webhook is delayed or missing, query status using Check payout status or Status checks.

Common issues

  • Signature mismatch: ensure the string-to-sign matches the payload exactly. See Signature generation.
  • Wrong token: use a payout-scoped Bearer token.
  • Duplicate references: reuse transaction.reference only for safe retries.