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:
- Your server must respond with a
2xxstatus code - Your server must return a JSON acknowledgment object
- SeerBit considers the event delivered upon receiving a valid acknowledgment
- Your server processes the event
2. Setting up your webhook
Expose an endpoint
SeerBit delivers events as HTTP POST callbacks, so you need a server that:- Exposes an endpoint able to receive JSON requests over HTTPS.
- 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
- Log in to your SeerBit dashboard.
- Navigate to Account Settings > Webhook.
- Enter your notification URL.
- Click Subscribe.
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 theX-Expected-Ack-Referenceheader. -
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.
4. Webhook Request Format
HTTP Method - POSTContent-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
2xxstatus code (200 OKis 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
2xxrange - Returns a
2xxwithout a valid acknowledgment —ackReferenceis missing, or doesn’t match theX-Expected-Ack-Referencesent with that delivery
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 aneventType, an eventDate and a unique eventId. Switch on eventType to route the event:
Two events shareBelow are the supported webhook events, including the exact sample payloads as used in production today.eventType: "transaction". A standard payment and a virtual account credit both use it, soeventTypealone will not tell them apart — a virtual account event carriescreditAccountNumberandcreditAccountName, which a standard transaction does not. Branch on the payload shape, not the type alone.
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 thus7.4 Wallet Transaction Event
The wallet transaction event notification body is structured thus7.5 Recurrent Transaction Event
The recurrent transaction event notification body is structured thus7.6 Recurring Debit Transaction Event
The recurrent debit transaction event notification body is structured thus7.7 Virtual Account Transaction Event
The virtual account transaction event notification body is structured thus8. 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 anX-Webhook-Signature header in the form sha256=<signature> — an HMAC-SHA256 of the request body. To verify it:
- Read the raw request body, before any JSON parsing — re-serialised JSON won’t reproduce the same bytes.
- Compute an HMAC-SHA256 of the raw body using your webhook signing secret.
- Compare your result with the value after
sha256=, using a constant-time comparison. - 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, andX-Webhook-Encrypted is set to true. Check that header, and decrypt the body before parsing it.
Steps to decrypt
- Base64-decode the webhook payload body.
- Take the first 12 bytes as the IV (initialization vector).
- Take the last 16 bytes as the GCM authentication tag.
- Derive the AES key as
SHA-256(secretKey). - Decrypt the remaining bytes (the ciphertext) using AES-256-GCM with the derived key, IV, and tag.
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
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 a2xx 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.