Setup
Configure your webhook endpoint using the Set Webhook endpoint. You’ll receive awebhookSecret (prefixed whsec_) that you’ll use to verify webhook signatures.
Events
KYC Events
Transaction Events
Wallet Events
Card Events
Payload Format
All webhooks are delivered asPOST requests with a JSON body.
KYC Webhook
Approved
Denied
Needs Verification
Transaction Webhooks
Successful debit (USD merchant)cross-border FX fee webhook.
FX Fee (follows the debit)
The FX fee transaction ID is the original transaction ID with
_fx appended. Use this to correlate the fee with its parent transaction.The reversal transaction ID is the original transaction ID with
_rev appended. Use this to correlate the reversal with the original debit. If the original transaction had an FX fee, only the debit is reversed — the FX fee is not refunded.Crypto Deposit Webhook
Sent when a stablecoin transfer to your deposit address is confirmed and credited to your wallet balance.Your wallet balance is credited automatically when the deposit is confirmed on-chain. You can check your updated balance via the Get Balance endpoint.
Card Withdrawal Wallet Credit Webhook
Sent when a card withdrawal (POST /partner/card/withdraw) or full card liquidation (DELETE /partner/card/terminate/:serviceCardId) credits funds back to your partner wallet. Use data.reference to match the credit to the originating user transaction on your side.
Withdrawal
Liquidation
This event also fires for partner card liquidations when the terminated card has a positive balance. Use the
source field to distinguish liquidations from regular withdrawals.Crypto Withdrawal Webhook
Sent when a withdrawal request reaches a terminal state. Thedata.status field tells you which:
completed— USDC was sent on-chain. IncludestxHashandexplorerUrl.cancelled— You cancelled the request via Cancel Withdrawal. Wallet was refunded.rejected— An admin rejected the request. Wallet was refunded.reasonmay be present.
Completed
Cancelled
Rejected
Pre-terminal transitions (
pending → approved) do not fire webhooks. You only receive a webhook when the withdrawal reaches a terminal state.Card Crypto Deposit Webhook
Sent when a stablecoin transfer to a crypto card’s deposit address is confirmed and credited to the card’s balance.Supported networks
Deposit addresses are EVM addresses, so the same address receives on every EVM chain. Only the chain/token pairs below are credited — anything else that arrives has to be recovered manually, so check this list before sending.
Staging uses the corresponding testnets:
base-sepolia (84532), polygon-amoy (80002) and
optimism-sepolia (11155420), which carry usdc only.
Every deposit-address endpoint also returns a supportedNetworks array with the same information, so
clients can read it at runtime rather than hardcoding this table.
Polygon has two USDC contracts and both are credited, but they are tracked separately because each
reports the symbol
USDC on-chain:The
token field in the webhook tells you which one arrived, so match on it rather than assuming
usdc. Bridged USDC.e exists on Polygon mainnet only — there is no equivalent on Amoy.Signature Verification
Every webhook includes anX-Webhook-Signature header containing an HMAC-SHA256 hex digest. Always verify this signature before processing the webhook.
Retry Policy
If your endpoint doesn’t respond with a2xx status code, the webhook is automatically retried with exponential backoff:
After all retry attempts are exhausted, the webhook is marked as permanently failed. All webhook deliveries — including every retry attempt — are logged with status codes and response bodies for debugging.
Retries are processed automatically every 30 seconds. If your endpoint comes back online within the retry window, pending webhooks will be delivered on the next retry cycle without any manual intervention.