Approach 1: Use Onboard’s ledger
Use Onboard’s ledger directly to manage a stablecoin-backed virtual account per customer.1
Create a sub-account per customer
POST /ledger/subaccounts,
using your internal customer identifier as the subAccountIdRef.2
Handle deposits
Generate a crypto deposit address for the sub-account with
POST /ledger/subaccounts/{subAccountIdRef}/funding-address,
then listen for transaction_activity.crypto_deposit.* webhooks to notify
your customer when funds arrive.3
Handle withdrawals
Initiate withdrawals directly from the sub-account with
POST /ledger/crypto-transfer,
and listen for transaction_activity.crypto_withdrawal.* webhooks.4
Onramp and offramp per customer
For onramp, generate a virtual account number
or a one-off cash deposit
per sub-account. For offramp, initiate a
cash payout directly
from the sub-account.
Approach 2: Use your own ledger
If you already run your own USD/account ledger and only want Onboard’s stablecoin rail for receiving deposits per customer, this approach fits best.1
Create a sub-account per customer
Same as Approach 1 —
POST /ledger/subaccounts
with your internal customer identifier.2
Handle deposits
Generate a deposit address, listen for
transaction_activity.crypto_deposit.*, and on a successful deposit:
debit the Onboard sub-account (transfer to your main account), then credit
the customer’s balance in your own ledger.3
Handle withdrawals
Debit or hold the customer’s balance in your own system for the withdrawal
amount plus fees, initiate the withdrawal from your Onboard main account,
and listen for
transaction_activity.crypto_withdrawal.* (or poll
GET /ledger/crypto-transfer/{transferReference})
before releasing the hold.