Wallet & Deposits
Read the prepaid balance, fund it with BSC-USD to a permanent deposit address, and audit the deposit history.
Your workspace wallet is the prepaid balance every order spends from. This page covers reading the balance, funding it with on-chain BSC-USD, and auditing the deposit history. Reads require wallet.read; requesting the deposit address requires the dedicated wallet.deposit-address.write scope.
Read the balance
GET /api/v1/wallet/balance?currency=USD
{
"availableBalance": 425.00,
"reservedBalance": 75.00,
"currency": "USD",
"asOfUtc": "2026-09-05T12:00:00Z"
}availableBalance— spendable right now (new orders draw from this).reservedBalance— held by in-flight orders; released on failure/cancellation, captured on fulfillment.
Alert your operations well before available funds reach your hourly burn rate — an order admitted without sufficient funds is rejected, not queued.
Fund with BSC-USD
Funding is on-chain: your workspace gets a permanent, dedicated deposit address for BSC-USD (the BEP-20 stable token on BNB Smart Chain, chain id 56). Anything confirmed at that address is credited to your wallet automatically — no deposit "intents", no amounts to pre-declare.
Request (or fetch) the address
PUT /api/v1/wallet/deposit-addresses/bsc-usd (scope: wallet.deposit-address.write)
GET /api/v1/wallet/deposit-addresses/bsc-usd (scope: wallet.read)
PUT is idempotent: the first call starts allocation and returns 202 Accepted; every later call returns 200 OK with the same account ("replayed": true). GET returns 404 until a PUT has been made.
{
"id": "0198db4d-f20c-765e-a89a-2b1b0b9a4f74",
"chainId": 56,
"assetCode": "USDT",
"tokenAddress": "0x55d398326f99059fF775485246999027B3197955",
"tokenDecimals": 18,
"requiredConfirmations": 15,
"ledgerCurrency": "USD",
"status": "Active",
"depositAddress": "0x1111111111111111111111111111111111111111",
"cumulativeConfirmedRaw": "12500000000000000000",
"pendingRawRemainder": "500000000000000000",
"requestedAtUtc": "2026-09-05T11:59:00Z",
"activatedAtUtc": "2026-09-05T12:00:00Z",
"replayed": true
}Reading the response correctly:
depositAddressisnulluntilstatusisActive. Allocation is asynchronous (usually under a minute) — pollGETuntil the address appears, and never display a non-Active account to your treasury team.- Verify the token, not just the address. Send only the token at
tokenAddresson chainchainId. Any other asset or network sent to the address cannot be credited. - Raw amounts are strings in the token's smallest unit (
tokenDecimals, here 18) so no precision is lost.cumulativeConfirmedRawis everything ever confirmed;pendingRawRemainderis dust below the ledger's credit granularity that carries over. - The address is permanent and reusable — print it into your treasury runbook once; deposits any time simply appear.
How crediting works
- Your transfer is observed on-chain (
status: Observed). - It matures for
requiredConfirmationsblocks (Confirming). - It is credited to your wallet at 1 token unit = 1
ledgerCurrencyunit (Credited), and awallet.creditedwebhook fires with the new available balance.
Audit the deposit history
GET /api/v1/wallet/deposits?limit=50
GET /api/v1/wallet/deposits?afterObservedAtUtc=2026-09-05T12:00:00Z&afterId=0198db4d-f2d9-7f8d-867d-329b081134a3&limit=50
Keyset-paginated, oldest-first: pass back the previous response's nextObservedAtUtc + nextId together (both or neither; limit 1–100) to continue.
{
"items": [
{
"id": "0198db4d-f2d9-7f8d-867d-329b081134a3",
"depositAccountId": "0198db4d-f20c-765e-a89a-2b1b0b9a4f74",
"transactionHash": "0x2222…",
"logIndex": 1,
"blockNumber": 42000000,
"amountRaw": "12500000000000000000",
"ledgerAmount": 12.50,
"ledgerCurrency": "USD",
"status": "Credited",
"confirmationCount": 15,
"observedAtUtc": "2026-09-05T12:00:00Z",
"confirmedAtUtc": "2026-09-05T12:01:00Z",
"creditedAtUtc": "2026-09-05T12:02:00Z"
}
],
"nextObservedAtUtc": null,
"nextId": null
}ledgerAmount is null until the deposit is credited. Each row is uniquely identified by transactionHash + logIndex, so reconciling against your own chain records is exact.
Treasury reconciliation loop
A robust daily loop:
- Walk
GET /wallet/depositsfrom your last stored cursor; match each row to your outgoing transfers bytransactionHash. - Compare
GET /wallet/balancewith your ledger (deposits − captured orders − withdrawals). - Investigate any deposit stuck in
Observed/Confirmingfar beyond the confirmation window with support, quoting the depositidandtransactionHash.
Updated about 2 hours ago