What you’ll need
- A backend service that owns the user-to-wallet mapping and calls the Wallet API.
- An API key for that service with
wallets:create,wallets:read,assets:attach,balances:read,withdrawals:createandwithdrawals:read. - Policies appropriate to user-initiated transfers (limits, whitelists, approval above a threshold).
Components to configure
Steps
1
Create the wallet when the user is onboarded
POST /api/v1/wallets with name set to your user identifier and an X-Idempotency-Key derived from it. Store wallet_id against the user. Show the user a “setting up” state until wallet.created arrives; key generation takes seconds.2
Attach assets and show the deposit address
Attach the assets your product supports and display the address from the attach response or
GET /api/v1/wallets/{wallet_id}/deposit-address. On EVM networks one address serves every supported token.3
Reflect deposits in the app
Subscribe to
deposit.detected and balance.updated; update the user’s balance from the event’s wallet_id. Read the authoritative balance from GET /api/v1/wallets/{wallet_id}/balance/{asset_id}.4
Send on the user's behalf
When the user initiates a transfer in your app, your backend calls
POST /api/v1/wallets/{wallet_id}/request-withdrawal with an idempotency key tied to the user’s action. Policies apply exactly as they do for a treasury withdrawal: destination rules, limits, and approval above a threshold. Surface a rejection reason to the user and a pending state while an approval is outstanding.5
Track completion
Drive the user-facing status from
withdrawal.submitted, withdrawal.confirmed and withdrawal.failed, and show the transaction hash once available.Considerations
- These are organisation-managed wallets: your workspace, your policies, your backend’s key. The user does not hold a key share and cannot transact outside your product. If your regulatory position requires the user to control the key, this solution does not apply.
- Limits and whitelists are configured at workspace level and apply to all wallets; design tiers of users as separate workspaces if they need different rules.
- Keep the wallet-creating service and the withdrawal-requesting service on separate keys where your architecture allows, so a compromise of one does not grant the other’s capability.

