What you’ll need
- A treasury wallet with the payout asset attached and funded.
- Owner or admin access to the console to set policies and create the service key.
- The list of destination addresses you pay, if you intend to whitelist them.
Components to configure
Steps
1
Set the policy in the console
Under Account Settings → Security & Approvals, enable Only allow whitelisted addresses and add your destinations to the Address Book; set Per transaction and Per day limits under Spend limit; and enable Require approval to withdraw with a Require above amount threshold and the approval group that must sign off. Set On balance drift to the behaviour you want if the on-chain balance disagrees with the ledger.
2
Create the service key
In Developer, create an API key with scopes
withdrawals:create and withdrawals:read, restrict it to the treasury wallet, allowlist your backend’s IP range and set an expiry. Store the secret in your secrets manager; it is shown once.3
Request each payout with an idempotency key
POST /api/v1/wallets/{wallet_id}/request-withdrawal with asset_id, amount and recipient_address, and an X-Idempotency-Key equal to your payout’s own identifier. A retry after a timeout returns the original result instead of paying twice. Rejections come back immediately with a reason: destination not whitelisted, limit exceeded, withdrawals frozen (423).4
Drive your state machine from events
Subscribe to
withdrawal.created, withdrawal.pending_approval, withdrawal.submitted, withdrawal.confirmed, withdrawal.completed, withdrawal.failed and withdrawal.cancelled. Treat confirmed as settled. Reconcile with GET /api/v1/withdrawals/{withdrawal_id}, which carries the transaction hash and block once broadcast.5
Rehearse the emergency stop
Confirm that an owner can reach Security & Approvals → Emergency → Freeze withdrawals quickly, and that your backend handles the
423 that follows without retrying in a loop. Unfreeze is a deliberate, audited action.Considerations
- Amounts are strings in the asset’s units; never send floating-point numbers.
- A payout that needs approval stays
pendinguntil an approver acts in the console. Design for that latency: hold the customer-facing status at “processing” rather than failing. - Daily limits reset on the platform’s day boundary; size them to your real volume plus headroom, not to the maximum you could imagine paying.
- Stablecoin payouts on EVM networks are token transfers from the same wallet and address as the native asset.
Related
- Define treasury policies: the full set of limits and destination rules.
- Build programmable approval policies: designing the approval tier.
- Transactions & signing: every state a withdrawal passes through.

