Event Overview
Event Type:PAYMENT_SUCCESSFULCategory: Payment
Description: Payment transaction was successful This webhook is triggered when a payment is marked CAPTURED (after a payment success callback or VBA transfer processor).
When the webhook is sent
- Regular payment flow: After a payment success callback is received, the payment is updated to CAPTURED and the webhook is created.
- VBA transfer flow: After a VBA transfer payment is successfully recorded, the webhook is created.
- The webhook is created only if your merchant account (or parent, for sub-merchants) has an active API credential with a non-empty webhook URL.
Delivery Details
| Attribute | Value |
|---|---|
| HTTP method | POST |
| URL | The webhook URL configured on your merchant account’s API credentials |
| Content-Type | application/json |
| Timeout | 10 seconds |
| Retries | Up to 5 delivery attempts (backoff: 1 min, 5 min, 15 min, 60 min) |
Headers
| Header | Description |
|---|---|
Content-Type | application/json |
User-Agent | Eximpe-Webhook/1.0 |
X-Webhook-Event | PAYMENT_SUCCESSFUL |
X-Webhook-Timestamp | Unix timestamp (string) at the time of the request |
X-Webhook-Signature | HMAC-SHA256 signature of the request body (JSON string with keys sorted, no extra whitespace), using your API key as the secret. Hex-encoded. |
Compute
HMAC-SHA256(encryption_key, raw_body) where raw_body is the exact UTF-8 request body as received. Compare the hex result with the X-Webhook-Signature header to ensure the webhook is from the platform and unchanged.
Payload Schema
Field Specifications
- Root Level Fields
- Data Object Fields
Always
"PAYMENT_SUCCESSFUL" for this webhook eventISO 8601 datetime when the webhook event was createdExample:
"2025-02-12T10:30:00.123456Z"Envelope version (e.g. “2.0.0”)
Unique identifier for this webhook event (UUID), useful for idempotencyExample:
"550e8400-e29b-41d4-a716-446655440000"Payment request details (payment_id, order_id, status, message, mop_type, bank_ref_num, payment_completed_at, utr, virtual_account_id, subscription_id)
What to Do When You Receive This Webhook
- Respond with HTTP 2xx (e.g.
200 OK) as soon as you have accepted the payload, so the platform marks the delivery as successful and does not retry. - Verify the signature using your API key and the raw request body (HMAC-SHA256, hex) to ensure authenticity.
- Use
data.payment_idanddata.order_idto reconcile with your system or fetch more details from the Partner API. - Note: You may subsequently receive a PAYMENT_DETAILS_MISSING webhook if verification details are missing on the order (see Payment Details Missing).