- Hold company funds. Keep treasury, fee revenue, and operating float in wallets your company owns.
- Separate funds by purpose. Give settlement, payouts, and fees their own wallets and addresses, and move funds between them as needed.
- Receive funds from your customers. Move funds from your end users’ wallets into a wallet your company controls, for example to consolidate deposits before settlement.
Step 1: Create the business customer
Create one customer withtype: business to represent your company. A business requires companyLegalName and email, and follows your project’s KYB policy. Request the cryptoCustody endorsement so the customer can hold custodial wallets.
cst_ ID, and wait for the cryptoCustody endorsement to become active before you create wallets. See Customer onboarding for endorsements and verification.
Step 2: Create the wallets
Create a custodial wallet for each asset, network, and purpose you need. Each wallet holds one asset on one chain and has its own onchainaddress.
wlt_ ID and address. To fund a wallet from outside OMS, send USDC or USDT to its address.
Move funds between your own wallets
Funds leave a custodial wallet through a quote and a transaction. When the source and destination wallets belong to the same customer, reference the destination directly by itswlt_ ID.
POST /transactions:
completed.
Move funds from a customer’s wallet to the omnibus account
A wallet owned by a different customer cannot be referenced by itswlt_ ID. Register the omnibus wallet as an external account under the sending customer instead, then quote to it. OMS still settles the transfer as an internal ledger movement because both wallets are custodial wallets in your project.
Repeat the registration once for each customer that sends to the omnibus account.
1
Register your company as a counterparty
Create a counterparty under the sending customer that represents your company:
2
Register the omnibus wallet as an external account
Register the omnibus wallet’s Store the returned
address as a walletExternal external account owned by that counterparty:ext_ ID and wait for the account to become active. An EVM address registered once is valid across every EVM chain.3
Quote and confirm the transfer
Use the customer’s wallet as the
source and the omnibus external account as the destination, then confirm with POST /transactions:transaction.statusChanged and create a transfer when a deposit to the customer’s wallet reaches completed. To forward every deposit without a quote, point a deposit address at the omnibus external account.
Reconcile balances
- Track movements with transaction events. Subscribe to
transaction.statusChangedand match events where thesourceordestinationis thewlt_ID of the wallet you are reconciling. OMS does not emit separate balance events. - Treat reported balances as spendable. Balances returned by
GET /wallets/{walletId}/balanceand the customer wallet endpoints never include pending funds. - Wait for
completed. A transaction changes a wallet’s balance only when it reachescompleted.
Related
- Customer onboarding: create customers and custodial wallets
- External accounts: register external wallets and counterparty-owned accounts
- Deposit addresses guide: forward inbound deposits automatically
- Receiving webhooks: verify and apply
transaction.statusChangeddeliveries