Transaction & Payout Statuses
Transaction & Payout Statuses
Both APIs represent the lifecycle of a transaction with a status field. Knowing these values up front is essential for building reliable polling logic and webhook handlers.
Payments API Statuses
Used for transactions created via Generate Transaction and retrieved via Get Transactions:
A transaction is only marked cancelled for one of three reasons: the payment gateway canceled it, it failed outright, or it expired before the customer completed payment.
The Disbursement API’s Wallet endpoints (Get Wallets filter, Get Wallet Transactions filter) also reference this same three-value set (completed, pending, cancelled) when filtering wallet-level activity.
Disbursement API Statuses
Used for payouts created via Process Disbursement and retrieved via Get Transactions (Disbursement):
The Disbursement API uses the same three status values as the Payments API (pending, cancelled, completed) — there is no separate failed or success value. See Webhooks & Redirects for how these appear in webhook payloads.
Why This Matters
Generate TransactionandProcess Disbursementboth return apendingstatus immediately upon submission — neither call is synchronous with the actual payment/payout completing. You must check the final status afterward.- The two ways to learn the final status, in order of preference:
- Listen for a webhook on the
callback_webhook_urlyou supplied, which fires once the final status is known (see Webhooks & Redirects). This should be your primary mechanism. - Look up the single transaction via
Get Transactionsfiltered by yourreference_no, as a fallback — not for routine polling or listing (see Looking Up Transactions).
- Listen for a webhook on the
- For the Payments API, a successful payment also triggers a browser redirect to
success_redirect_url(orfailure_redirect_urlon failure/cancellation).
Looking Up a Transaction’s Status
Listing/pagination via Get Transactions is discouraged and being phased out — see Looking Up Transactions for details. Avoid unfiltered or broad-range polling, especially as your transaction volume grows; it’s expensive to serve and is exactly the pattern the platform is moving away from.
The recommended approach is:
- Rely on webhooks first — your
callback_webhook_urlfires once the final status is known, so you shouldn’t need to poll for routine tracking (see Webhooks & Redirects). - When you do need to check a status directly, filter by
reference_noonly — look up the one transaction you care about rather than listing/paging through many:
A dedicated single-transaction inquiry endpoint keyed only on reference_no is planned to replace Get Transactions for this use case — see Looking Up Transactions for the full migration guidance.