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.
cst_ ID, and wait for the customer’s cryptoCustody endorsement to become active before you create wallets. If your project requires KYB, complete it first; see Onboard a business.
Step 2: Create the Omnibus wallets
Create a custodial wallet for the business customer for each asset and network you accept. Each wallet holds one asset on one network and has its own onchainaddress.
wlt_ ID and address; you need the address in Step 4. If the response is 202, poll the operation in the Location header until it completes, then read the wallet. address is left out until the wallet has one.
Step 3: Create a wallet for each user
Onboard each user as their own customer, then create their custodial wallets the same way as Step 2. See Customer onboarding for the full flow. Give each user their wallet’saddress to deposit to. Every deposit is recorded against that user’s wallet before it is swept.
Step 4: Register the Omnibus account for each user
The Omnibus wallets belong to a different customer, so a user’s wallet cannot send to them bywlt_ ID. Register each Omnibus wallet as an external account under the user instead. Repeat this step once for each user.
1
Register your company as a counterparty
Create a counterparty under the user’s customer record 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.Step 5: Sweep deposits into the Omnibus account
Choose how sweeps run. OMS does not sweep on a schedule: you either trigger each sweep or route deposits through a deposit address that forwards them.Trigger sweeps yourself
Create a quote with the user’s wallet as thesource and the Omnibus external account as the destination:
POST /transactions:
transaction.statusChanged and create a sweep when a deposit to a user’s wallet reaches completed.
Sweep automatically with deposit addresses
Create a deposit address for each user whosedestination is the Omnibus external account, and give users the deposit address instead of their wallet address. Every deposit is then forwarded to the Omnibus account as it lands, with no quote step.
Send funds between users
A transfer from one user’s wallet to another’s follows the same pattern as a sweep. Register the recipient’s walletaddress as a walletExternal external account under the sender, owned by a counterparty that represents the recipient, then quote from the sender’s wallet to that ext_ ID.
Transfers between wallets owned by the same customer, such as moving funds between two Omnibus wallets, skip registration: reference the destination directly as walletCrypto with its wlt_ ID.
Reconcile balances
- Track movements with transaction events. Subscribe to
transaction.statusChangedand match events wheredata.resource.source.idordata.resource.destination.idis the wallet you are reconciling, or list them withGET /transactions?walletId=wlt_.... OMS does not emit separate balance events. - Treat reported balances as spendable.
balances[]onGET /wallets/{walletId}never includes 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