Skip to main content
Ideal for: Reacting to payments automatically — marking orders paid, crediting wallets, releasing goods — without polling for a result.
Webhooks or verification? Webhooks push each outcome to you as it happens; verifying a payment lets you ask on demand. Most integrations use both — see the comparison.
Taking payments on a POS terminal? In-store transactions use a separate webhook system with its own headers, event names and payload format — see in-store webhooks. This page covers online payments.
Webhook Events enable real-time communication between SeerBit and your application. When specific activities occur within the payment ecosystem such as transactions, refunds, wallet movements, disputes, or virtual account events, SeerBit sends a structured notification to your configured webhook endpoint.
Webhooks use a standardized acknowledgment protocol designed to ensure reliable delivery, traceability, and idempotent handling.

1. Overview

A webhook is an HTTP callback: a POST request sent to your server when an event happens. When your webhook URL is configured in SeerBit, the platform automatically notifies your system whenever a subscribed event occurs.
When your endpoint receives a webhook request:
  1. Your server must respond with a 2xx status code
  2. Your server must return a JSON acknowledgment object
  3. SeerBit considers the event delivered upon receiving a valid acknowledgment
  4. Your server processes the event
If the acknowledgment is missing, invalid, or delayed, SeerBit retries delivery.

2. Setting up your webhook

Expose an endpoint

SeerBit delivers events as HTTP POST callbacks, so you need a server that:
  1. Exposes an endpoint able to receive JSON requests over HTTPS.
  2. Is reachable from the public internet. Depending on your network and security requirements, you may also need to add SeerBit’s IP addresses to your firewall allowlist — ask your account team for the current list.

Subscribe to notifications

  1. Log in to your SeerBit dashboard.
  2. Navigate to Account Settings > Webhook.
  3. Enter your notification URL.
  4. Click Subscribe.
Configure the URL separately in test and live mode — a test-mode subscription does not carry over when you go live.

3. Delivery Architecture

  • Event Triggered
    A payment, refund, settlement, dispute, or wallet event occurs.
  • Webhook Preparaion
    SeerBit constructs the event payload and generates an acknowledgment reference, sent as the X-Expected-Ack-Reference header.
  • Delivery Attempt
    A POST request is sent to your Webhook URL over HTTPS.
  • Merchant Processing
    Your server receives the request and process the event.
  • Acknowledgment Response
    Your server returns:
  • Confirmation
    SeerBit mark the Webhook as delivered.
  • Retry (if acknowledgment fails)
    Multiple retries occur at increasing intervals.
This handshake ensures that events are not lost and can be processed reliably and idempotently.

4. Webhook Request Format

HTTP Method - POST
Content-Type - application/json
Body - A JSON object containing event metadata and associated data specific to the event type. If payload encryption is enabled for your business, the body is instead a Base64 string — see Decrypting payloads.

5. Acknowledgment Response (Required)

To confirm receipt of a webhook event, your server must return:
  • Any 2xx status code (200 OK is typical)
  • A JSON Object
  • Within 5 seconds
Acknowledgement JSON Structure
Field Definitions
SeerBit requires this acknowledgment to validate that your system has successfully accepted the event.

6. Retry Logic

A delivery counts as failed when your server:
  • Is unreachable, or the connection fails
  • Times out (exceeds 5 seconds)
  • Returns a status code outside the 2xx range
  • Returns a 2xx without a valid acknowledgment — ackReference is missing, or doesn’t match the X-Expected-Ack-Reference sent with that delivery
SeerBit decides whether to retry based on the type of failure, so not every failed delivery is retried. Treat retries as a safety net, not a guarantee: if a webhook you’re expecting hasn’t arrived, verify the payment rather than waiting for it.

Retry schedule

Retries use exponential backoff. The first retry comes about 30 seconds after the failed attempt, and the wait grows with each attempt, up to a maximum of 1 hour between attempts. A delivery is retried up to 5 times by default. If all attempts fail, the webhook is marked as undelivered.

7. Event Types

Every payload carries an eventType, an eventDate and a unique eventId. Switch on eventType to route the event:
Two events share eventType: "transaction". A standard payment and a virtual account credit both use it, so eventType alone will not tell them apart — a virtual account event carries creditAccountNumber and creditAccountName, which a standard transaction does not. Branch on the payload shape, not the type alone.
Below are the supported webhook events, including the exact sample payloads as used in production today.

7.1 Refund Event

The refund event notification body is structured thus:

7.2 Dispute Event

The dispute event notification body is structured thus:

7.3 Transaction Event

The transaction event notification body is structured thus

7.4 Wallet Transaction Event

The wallet transaction event notification body is structured thus

7.5 Recurrent Transaction Event

The recurrent transaction event notification body is structured thus

7.6 Recurring Debit Transaction Event

The recurrent debit transaction event notification body is structured thus

7.7 Virtual Account Transaction Event

The virtual account transaction event notification body is structured thus

8. Sample Implementations

Below are full sample implementations demonstrating how to handle webhook acknowledgments.

9. Security Considerations

Every delivery is signed. Verify the signature before acting on a webhook, and layer the practices below on top of it.

Verifying signatures

Each delivery carries an X-Webhook-Signature header in the form sha256=<signature> — an HMAC-SHA256 of the request body. To verify it:
  1. Read the raw request body, before any JSON parsing — re-serialised JSON won’t reproduce the same bytes.
  2. Compute an HMAC-SHA256 of the raw body using your webhook signing secret.
  3. Compare your result with the value after sha256=, using a constant-time comparison.
  4. Reject the request if they don’t match.

Decrypting payloads

If your SeerBit account team has enabled payload encryption for your business, the body is encrypted with AES-256-GCM and delivered as a Base64 string, and X-Webhook-Encrypted is set to true. Check that header, and decrypt the body before parsing it.
Steps to decrypt
  1. Base64-decode the webhook payload body.
  2. Take the first 12 bytes as the IV (initialization vector).
  3. Take the last 16 bytes as the GCM authentication tag.
  4. Derive the AES key as SHA-256(secretKey).
  5. Decrypt the remaining bytes (the ciphertext) using AES-256-GCM with the derived key, IV, and tag.
Decryption fails if the payload has been altered or the wrong key is used — reject the request rather than falling back to the raw body.
The following practices are strongly recommended:

Inbound Request Validation

  • Enforce HTTPS
  • Reject requests not coming from approved IP ranges (if applicable)
  • Validate Content-Type = application/json
  • Validate the structure of the payload

Idempotency

Your webhook consumer must ensure duplicate events are not processed twice.
Recommended approaches
  • Use eventId field as a unique identifier
  • Store processed event IDs in a database
  • Check before applying business logic

Logging

Log:
  • Full payload
  • Ack reference
  • Processing time
  • Errors and decisions

10. Testing Webhooks

To test locally
Use tools like:
  • ngrok
  • cloudflared tunnel
  • localtunnel
This exposes your local server to receive webhook events.
Replay event
Your internal systems should allow replay during testing, especially for integration and QA teams.

11. Troubleshooting

Webhook not arriving
  • Check that your URL is reachable publicly
  • Check SSL certificates
  • Verify URL configuration in SeerBit dashboard
  • Confirm firewall/NAT rules
Webhook arrives but no retries
Your server may be returning a 2xx status with an incorrect acknowledgment body. The response must contain ackReference — echoing the exact value from the X-Expected-Ack-Reference header of that delivery — and status: "processed". A reference you generated yourself will not match, and the delivery is treated as unacknowledged.
Event processed twice
Implement idempotency based on the eventId field.
400 or parsing errors
Ensure your endpoint expects JSON and does not require authentication unless pre-agreed. If the body is a Base64 string rather than JSON, encryption is enabled for your business — decrypt it first.