Skip to main content

Quick start

The shortest path from zero to a verified delivery:
  1. Create an endpoint. POST /v0/webhooks with a public URL — save the secret from the response, you’ll need it to verify signatures.
  2. Verify the signature on incoming requests with HMAC-SHA256(secret, raw_body) against the X-Superbank-Signature header (jump to Verifying signatures).
  3. Return 200 quickly, then process asynchronously. Anything 2xx counts; anything else triggers a retry.

The basics

Supported events

Envelope and headers

Every delivery uses the same JSON envelope. Field names are snake_case; the data object varies by event type. The full payload for each event is in Event payload reference at the bottom.

Verifying signatures

Compute sha256=HMAC-SHA256(secret, request_body) over the raw request body and compare it to the X-Superbank-Signature header using a constant-time comparison. Verify before parsing — see Common pitfalls.

Reliability

Retry policy

If your endpoint returns a non-2xx response or times out (30 seconds), Superbank retries with exponential backoff: After 10 failed attempts, the delivery is marked as permanently failed.

Common pitfalls

  • Verify before parse. Run signature verification on the raw bytes before JSON.parse. Frameworks that auto-parse JSON (Express default, NestJS body parser) will silently re-serialize the body and your HMAC will never match — use express.raw / request.data / equivalent to hold onto the original bytes. - Return 200 fast, process async. Heavy work on the request thread blows past the 30-second timeout and triggers retries. Acknowledge, then enqueue. - Expect at-least-once delivery. Retries are real — the same event can land twice. Make handlers idempotent on the event id (or on data.id + status transition). - Don’t filter by source IP. Egress IPs change without notice; rely on the signature.

Testing

Test deliveries

Test deliveries land at your endpoint with two markers your handler should expect:
  • data.test: true — every test payload sets a top-level test: true inside data. Branch on it if you want to short-circuit business logic for test events.
  • Sentinel resource IDs — IDs use the prefix 00000000-0000-0000-0000-..., with the last digit identifying the resource type (...001 settlement request, ...002 outbound payment, etc.). Allow-list these prefixes if your handler validates IDs against your database.
Headers and signature are computed exactly as in production, so a handler that verifies signatures accepts test deliveries without any code branch.

From your local machine with ngrok

ngrok creates a public tunnel to your localhost so sandbox deliveries land directly on your dev box.

From a browser with webhook.site

webhook.site gives you an instant public URL to inspect deliveries without writing any handler code — useful for eyeballing payloads before you write parsing logic.
Save the secret from the response, then trigger a sandbox event (e.g., POST /v0/settlement-requests) and watch the delivery land in the webhook.site browser tab.

Event payload reference

The data object differs per event. Expand the relevant section for a worked example. All examples carry production-shape fields; sandbox and production payloads have identical shape.
settlement_request.created
settlement_request.updated

Next steps

Looking for the end-to-end on-ramping flow? See Real-Time On-Ramping — the section Detecting Completion shows where webhook events fit into the settlement lifecycle.