Skip to main content
Every webhook body is the canonical PaymentOrder document — a single flat JSON object, no envelope. There are no event names, message identifiers, or delivery counters wrapping the payload: what arrives is the order itself, at the settled state that triggered the delivery. The status field tells you what happened; the direction field matches the endpoint that received it. For the semantics of each state, see Payment lifecycle.

Field reference

Absent vs null. Optional fields that are unset may be omitted entirely rather than serialized as null. Read fields defensively; do not require every key to be present.

Instrument variants

instrument.type discriminates the payment instrument:
New variants may be added as Bloobank adds payment capabilities. Switch on type and ignore variants you do not recognize — never fail a delivery because of an unknown instrument type.

Direction routing

The order’s direction selects which of your two registered endpoints receives the delivery: Both endpoints share the same webhook secret, so the same verification code serves both. The direction field in the body always matches the endpoint that received it — you never need to infer it.

Sample payload

A SUCCESS cash-in order on the Pix rail — the same document used in the worked signature example:
Pretty-printed for readability. On the wire the body is a single line with no insignificant whitespace — and the signature is computed over those exact bytes. Never re-serialize the payload before verifying; see Verifying signatures.

Consuming the payload

A robust consumer keys everything off three fields:
See Best practices for the full idempotent consumer pattern, including the out-of-order REFUNDED-after-SUCCESS case.

Next

Webhooks overview

Delivery model and the success contract.

Verifying signatures

Verify before processing.

Best practices

Idempotency and ordering.