Webhook Configuration#
Webhooks allow your application to receive real-time payment notifications whenever a transaction status changes.
Follow the steps below to configure your webhook endpoint.Click the profile icon/menu located at the top-right corner of the dashboard.
Step 2 — Open API Keys & Webhook#
From the dropdown menu, select:
Step 3 — Update Webhook URL#
Input your webhook endpoint URL in the webhook field and click:
Webhook Security#
Every webhook request sent from Dart includes a signature header for verification.You must validate this signature to ensure the webhook request genuinely originated from Dart.
How Signature Verification Works#
The webhook signature is generated using:
Verify Webhook Signature#
Step 1 — Receive the Raw Payload#
{
"eventType": "BANK_TRANSFER",
"merchantReference": "REF-Dart-8253282343276",
"amountCredited": "100",
"amountExpected": "200",
"accountNumber": "9021093453",
"accountName": "TEXTNG COMMUNICATIONS",
"bankName": "Wema",
"currency": "NGN",
"narration": null,
"status": "SUCCESS",
"createdAt": "2026-05-17T11:59:07.568Z",
"paidAt": "2026-05-20T19:42:21.491Z"
}
Step 2 — Hash the Payload Using SHA256#
Generate a SHA256 HMAC hash using:
Node.js Example#
Important Verification Notes#
Always use the raw request payload for hashing.
Do not modify or reformat the payload before verification.
Reject webhook requests with invalid signatures.
Webhook Response Requirement#
Your webhook endpoint must return a successful HTTP 200 OK response after processing the webhook event.Failure to return a 200 response may result in webhook retries.
Webhook Event Types#
Currently supported webhook events include:| Event Type | Description |
|---|
| BANK_TRANSFER | Dynamic virtual account payment |
| CARD | Card payment transaction |
Webhook Status Types#
Currently supported webhook events include:| Status Type | Description |
|---|
| PENDING | Transaction is Pending |
| PROCESSING | Transaction is processing |
| SUCCESS | Transaction is Successful |
| FAILED | Transaction failed |
| EXPIRED | Transaction Expired |
Sample Webhook Payloads#
Dynamic Bank Transfer Transaction#
{
"eventType": "BANK_TRANSFER",
"accountType": "DYNAMIC",
"merchantReference": "REF-Dart-8253282343276",
"amountCredited": "100",
"amountPaid": "100",
"amountExpected": "200",
"accountNumber": "9021093453",
"accountName": "TEXTNG COMMUNICATIONS",
"bankName": "Wema",
"currency": "NGN",
"narration": null,
"status": "SUCCESS",
"createdAt": "2026-05-17T11:59:07.568Z",
"paidAt": "2026-05-20T19:42:21.491Z"
}
Static Bank Transfer Transaction#
{
"eventType": "BANK_TRANSFER",
"accountType": "STATIC",
"merchantReference": "Ref-Dart-8999000284",
"amountCredited": "1000",
"amountPaid": "100",
"amountExpected": "1000",
"accountNumber": "9021199331",
"accountName": "TEST JESSE ",
"bankName": "Wema",
"sourceAccountName": "Jesse Coders",
"currency": "NGN",
"narration": "ACCTBT0A1003F0-3E59-4373-8C6F-9B630F321A95--090405260521102846337725581622",
"status": "SUCCESS",
"createdAt": "2026-05-22T18:46:01.968Z",
"paidAt": "2026-05-22T18:46:01.968Z"
}
Card Transaction#
{
"eventType": "CARD",
"merchantReference": "Ref-Dart-637272345382",
"paymentAdviceRef": "3b5e216e-2a5d-4f60-89e3-595061efd3b2",
"amountCredited": 500,
"amountExpected": 500,
"card": {
"cardNumber": "445653******1096",
"senderName": "Digital Dart",
"cardName": "Naira.com",
"currency": "NGN"
},
"narration": "test payment",
"status": "SUCCESS",
"createdAt": "2026-05-20T19:42:21.491Z",
"paidAt": "2026-05-20T19:42:21.491Z"
}
Payout Successful Transaction#
{
"eventType": "PAYOUT_BANK_TRANSFER",
"merchantReference": "Ref-Dart-892892",
"amountCredited": "200",
"fee": "50",
"destinationAccountNumber": "7063581203",
"sessionId"."090110260604101724271222665379"
"currency": "NGN",
"status": "SUCCESS",
"createdAt": "2026-05-25T07:50:42.400Z",
"paidAt": "2026-05-25T07:50:42.400Z"
}
Payout Failed Transaction#
{
"eventType": "PAYOUT_BANK_TRANSFER",
"merchantReference": "Ref-Dart-892892",
"amountCredited": "200",
"destinationAccountNumber": "7063581203",
"currency": "NGN",
"status": "FAILED",
"createdAt": "2026-05-25T07:50:42.400Z"
}
Recommended Best Practices#
Use HTTPS webhook URLs only.
Store your API Gateway Secret securely.
Validate every webhook signature.
Implement idempotency handling to avoid duplicate processing.
Log webhook requests for troubleshooting and auditing.
Modified at 2026-06-04 09:36:00