Overview
Webhooks allow you to receive real-time HTTP notifications whenever a transaction status changes. Instead of polling our API for updates, we push the data directly to your server as soon as an event occurs. When a transaction is processed (paid, failed, or cancelled), we send aPOST request to the webhook URL you registered with us, containing the full transaction details.
Webhook notifications are sent for terminal transaction statuses: PAID, FAILED, and CANCELLED.
How It Works
Register your webhook URL
Set up your webhook callback URL in the dashboard. This is the HTTPS endpoint where we will send event notifications as they occur.
A transaction status changes
When a payout transaction reaches a terminal status (PAID, FAILED, or CANCELLED), we build a webhook event with the full transaction details.
We send a POST request
Each event is sent individually as a JSON payload via HTTP POST to your registered webhook URL.
Event Structure
Each webhook notification is a JSON object with the following fields:Required Fields
| Field | Type | Description |
|---|---|---|
eventType | String | Type of event. Currently TRANSACTION_STATUS. |
Reference | String | Unique transaction reference (PCN). Encrypted if encryption is enabled. |
Status | String | Transaction status: PAID, FAILED, or CANCELLED. |
msgNote | String | Human-readable description of the event. |
msgCode | String | Status code from the processing provider. |
Transaction Details
| Field | Type | Description |
|---|---|---|
transactionId | String | Internal transaction identifier. |
amountSent | Number | Amount sent by the sender. |
amountReceived | Number | Amount to be received by the beneficiary. |
totalAmount | Number | Total charged amount (sending amount + commission + VAT). |
transactionDate | String | ISO 8601 timestamp of when the transaction was created. |
sendingCurrencyCode | String | Currency of the sending amount (e.g., GBP). |
receivingCurrencyCode | String | Currency of the receiving amount (e.g., NGN). |
bankName | String | Destination bank name. |
deliveryMethod | String | How the funds are delivered (e.g., ACCOUNTPAYMENT, CASHPICKUP, MOBILE_MONEY). |
beneficiaryAccountNumber | String | Beneficiary’s bank account number. |
beneficiaryAccountHoldersName | String | Name on the beneficiary’s bank account. |
beneficiaryFullName | String | Full name of the beneficiary. |
beneficiaryEmail | String | Beneficiary’s email address. |
beneficiaryAddress | String | Beneficiary’s address. |
sortCode | String | Bank sort code (where applicable). |
bankCode | String | Bank code. |
countryTo | String | Destination country name. |
transactionType | String | Transaction type (e.g., ACCOUNTPAYMENT, CASHPICKUP). |
paymentType | String | Payment method used (e.g., CARD). |
accountType | String | Beneficiary account type (e.g., SAVINGS_ACCOUNT). |
customer | String | Sender’s customer ID. |
compliant | Boolean | Whether the transaction passed compliance checks. |
complianceCheck | String | Compliance check result. |
sanctionFlagColor | String | Sanction screening flag colour. |
Example Webhook Payload
Successful Transaction (PAID)
Failed Transaction
Cancelled Transaction
Status Values
| Status | Description |
|---|---|
PAID | Transaction successfully paid out. |
FAILED | Transaction failed to process. |
CANCELLED | Transaction was cancelled. |
Common msgCode Values
| Code | Description | Details |
|---|---|---|
00 | Success | Transaction completed. |
0000 | Pending | Transaction is being processed. |
0030 | Insufficient Funds | Not enough balance. |
0031 | Invalid Account | Account not found. |
0099 | Unknown Error | Generic processing error. |
Retry Strategy
Your server must respond with a200 HTTP status code to acknowledge receipt of the webhook. If your server returns any other status code (e.g., 4xx, 5xx) or the request times out, the webhook delivery is considered failed and will be retried.
Handling Webhooks
Respond quickly
Return a
200 status code as fast as possible. Do any heavy processing asynchronously after acknowledging the webhook.Be idempotent
The same event may be delivered more than once. Use the
Reference field to deduplicate and avoid processing the same transaction twice.Verify the source
See Webhook Security for how to verify that requests are genuinely from our system.
Handle all statuses
Your endpoint should handle
PAID, FAILED, and CANCELLED statuses gracefully.