Custodial webhook events
Customer deposits, withdrawals, swaps, and gas-wallet alerts.
These events fire for Default (custodial) wallet activity. Payloads are a
flat JSON object with an eventType field matching the Svix event type.
Configure endpoints under Dashboard → Custodial → Webhooks. See Webhooks for setup and Webhook events for signature verification.
Event catalog
Test events
Send a sample of any event above from Dashboard → Webhooks → Send test event.
Test payloads have the same shape as real ones, contain placeholder data
(customerId: "test_customer", zeroed ids and hashes), and never touch balances.
They carry a test flag, so your handler can skip them:
- Flat payloads (every
CUSTOMER_*event andcustomer_swap.failed) get"isTest": true. gas_wallet.low_balance(a{ type, data }envelope) gets"is_test": trueat the top level.
Real events never include the flag, so a missing flag means the event is real.
To exercise the real flagged-deposit flow end to end on staging (CUSTOMER_DEPOSIT
with isFlagged: true, then CUSTOMER_DEPOSIT_APPROVED / _REJECTED /
_REDIRECTED), open a test customer under Dashboard → Custodial → Customers and turn on
Require approval for every deposit. Every deposit to that customer is then
held under Flagged Deposits for you to approve, reject or redirect, with
flagReason.entityType set to MANUAL_REVIEW.
CUSTOMER_DEPOSIT
amount is atomic token units. riskOfFunds is a Scorechain severity string
(for example HIGH_RISK, VERY_LOW_RISK) or NOT_ANALYZED when no scan ran.
When this deposit is the destination leg of a customer
swap, swap is non-null instead of null:
If you pay a deposit bonus on CUSTOMER_DEPOSIT, check swap first — swap
arrivals are funded from the customer’s existing balance, not new outside money.
CUSTOMER_DEPOSIT_APPROVED
Emitted when a flagged deposit is approved. No on-chain transfer — there is no
txHash or destinationAddress.
flagReason fields are nullable when the deposit was flagged before analysis
was stored or the provider returned no entity. id matches the original
CUSTOMER_DEPOSIT.
CUSTOMER_DEPOSIT_REJECTED
Emitted after the return transaction confirms on-chain.
CUSTOMER_DEPOSIT_REDIRECTED
Same shape as rejected; destinationAddress is the operator-chosen address.
Emitted after the transfer confirms on-chain. txHash may be omitted until
broadcast completes.
CUSTOMER_WITHDRAW
CUSTOMER_WITHDRAW_AWAITING_APPROVAL
Approve the withdrawal in the dashboard (or via API) before it broadcasts. See Withdrawals & approvals.
CUSTOMER_FAILED_TO_WITHDRAW
txHash is omitted when no broadcast occurred. This payload does not include
uiAmount or usdAmount.
customer_swap.failed
Svix eventType is customer_swap.failed (not CUSTOMER_SWAP_FAILED). The
JSON body repeats that value in eventType.
refundedAmount is atomic source-mint units, or null when nothing had been
recognized at send time — poll GET /customer-swap/{swapId} to confirm a
refund landed.
gas_wallet.low_balance
This event uses a type / data wrapper instead of top-level eventType.