POST with a JSON body to your order webhook URL (configured for your merchant account) when an order created by POST /v1/stable/order/submit-order changes status. Webhook name: notifyTransactionStatus; eventType is always STABLE_ORDER_UPDATED.webhook status | query-detail orderStatus | sent when |
|---|---|---|
init | INIT | Order created by submit-order. Only sent if the initial notification is enabled for your merchant account (ask BPN to enable it). |
success | SUCCESS | Fiat paid out to targetAccountId. |
fail | FAIL | Order failed. Read failCode / failReason with query-detail. |
refunded | REFUNDED | Refund completed: the stablecoin was returned to userRefundCryptoAddress (e.g. the receiving bank / mobile money operator returned the payout after success). |
status is lowercase in the webhook; query-detail returns uppercase orderStatus. Compare case-insensitively.PROCESSING or REFUNDING.refunded webhook can arrive after a success webhook for the same referenceId: if the receiving bank / mobile money operator returns the payout, the order moves SUCCESS → REFUNDING → REFUNDED. Reverse the payout in your ledger when you receive refunded.GET /v1/stable/order/query-detail?orderId={referenceId} and treat that response as the source of truth before updating your ledger.| field | type | notes |
|---|---|---|
eventId | string (UUID) | Unique per event. Retries of the same event reuse the same eventId. |
eventType | string | STABLE_ORDER_UPDATED |
referenceId | string | BPN orderId returned by submit-order (not your merchantOrderId). |
status | string | init / success / fail / refunded (lowercase) |
timestamp | integer (int64) | Event time, Unix epoch milliseconds. |
| header | notes |
|---|---|
API-KEY | your API key |
API-TIMESTAMP | time the request was signed, Unix epoch milliseconds (regenerated on every retry) |
API-SIGNATURE | lowercase hex HMAC-SHA256(rawBody + "&" + API-TIMESTAMP) keyed with your API secret |
API-TIMESTAMP is more than 5 minutes off your server time.2xx to acknowledge. The response body is ignored.2xx response or a network error is retried with the same body and eventId: by default up to 5 times, after 1 min, 5 min, 15 min, 30 min and 60 min, and only within 24 hours of the first attempt.eventId. Events can arrive late or out of order, so always confirm the current status with query-detail.