Webhooks
A webhook is how Boundless tells your application that a payment reached a final state, without you having to poll. For in-store payments this is the moment the customer finished at the terminal.
Setting up
Register an HTTPS endpoint in the Boundless dashboard, or over the API
(POST /api/webhooks/configs — see the API reference).
Either way you receive a signing secret; treat it like a password. You can send yourself a
TEST event at any time to prove the wiring end to end.
Boundless will POST each event to your endpoint. Your endpoint should:
- Verify the signature (below) before trusting the payload.
- Return
2xxquickly. Do the real work asynchronously — acknowledge first, process after. - Be idempotent. An event may be delivered more than once; deduplicate on the delivery's
eventId, and apply each payment outcome once.
What a delivery looks like
POST <your endpoint>
Content-Type: application/json
X-Webhook-Signature: <Base64 HMAC-SHA256 of the raw body>
X-Webhook-Event-Type: PAYMENT_CAPTURED
X-Webhook-Event-Id: <delivery id>
{
"eventId": "evt_1a2b3c4d5e6f7a8b",
"eventType": "PAYMENT_CAPTURED",
"merchantExternalId": "your-merchant-id",
"timestamp": "2026-08-14T06:20:11Z",
"data": {
"pspReference": "BNDL7K2P9QW1ABCD",
"merchantReference": "order-4821",
"amount": "100.00",
"currency": "SGD",
"status": "CAPTURED",
"cardSummary": "****4242",
"cardBrand": "VISA",
"paymentMethod": "CARD"
}
}
merchantReference is the reference you set when creating the payment — your key for matching
the event back to the bill. Payloads never contain full card numbers; card data appears only as a
masked summary.