Envelope
Source:services/brain/src/outbox/merchant-webhook.delivery.ts.
id(always): Event id, a TypeIDevt_+ 26 characters. Deduplication key, identical on every retry and re-drive.livemode(always): Boolean. Taken fromdata.transaction.livemode,truewhen that is absent.type(always): Event type, for exampletransaction.updated.api_version(always): Payload version, for example2026-10-31. Fixed per event by itscreated_at, so retries and re-drives never change it.created_at(always): ISO 8601 UTC time the event was recorded, stable across retries.created(some events): Alias ofcreated_at, present only onrefund.succeededandrefund.failed.data(always): Event-specific object.
evt_ prefix. Deduplicate by the signed body’s id; the
OrsunPay-Event-Id header is an unsigned convenience copy.
Versioning
Every event carriesapi_version. It is fixed per event (by created_at), so a retry or a
re-drive sends exactly the same body. New fields and new event types can appear without a new
version; ignore what you do not know. Removing or changing a field always gets a new version,
announced in this changelog first.
Before the first version, events were delivered with a UUID
id and no api_version. A
re-drive of such an older event now sends the evt_ form of the same id and 2026-10-31.
Wallet receipts and the cabinet journal accept both id forms.
transaction.updated
A sale or payout changed state.
Source: services/brain/src/transaction/transaction.events.ts.
data contents:
transaction: the serialized transaction; money fields are decimal strings.paymentData: provider-specific object,{}when there is none. May contain additional fields.
test.ping
A synthetic delivery the merchant triggers to test its receiver. It is not redeliverable and is excluded from endpoint-health failure counts.
Source: services/brain/src/outbox/outbox.service.ts.
data contents:
merchantId: the merchant UUID the ping was sent for.test: alwaystrue.
refund.succeeded
A refund completed successfully.
Source: services/brain/src/outbox/refund-webhook.delivery.ts.
Payload source: services/brain/src/outbox/refund-webhook.snapshot.ts.
data contents:
refund:id,transactionId,amount,currency,status,reason,provider,providerRefundId,errorCode.transaction:id,livemode,orderId,amount,refundedAmount,refundState(none,partialorfull).
refund.failed
A refund failed.
Source: services/brain/src/outbox/refund-webhook.delivery.ts.
Payload source: services/brain/src/outbox/refund-webhook.snapshot.ts.
data contents:
- Same shape as
refund.succeeded;refund.errorCodedescribes the failure.
cashier.wallet.effect_requested
Cashier only: the operator wallet must apply a credit or capture for a cashier operation. Apply it idempotently by walletEffect.effectId and confirm with a wallet receipt that echoes this event id (both the evt_ id and a pre-H4 UUID are accepted).
Source: services/brain/src/cashier/wallet/effects.repository.ts.
data contents:
transaction:livemode, andidonce the cashier operation has a payment transaction.walletEffect:protocol(1),effectId(=financialKey),kind(credit,captureorrelease),operationRevision,operation(scope, player, operation, order and optional transaction ids,amount,currency,direction,simulation), optionalreservationandsettlement.