Receive a deposit
-
Create or reuse a vault and activate the asset:
POST /v1/accounts{ "label": "user-9182", "vaultType": "web3", "firstAssetCanonical": "USDT_ETHEREUM", "externalRef": "usr_9182" }(Or
POST /v1/accounts/{id}/assets/{asset}on an existing vault.) -
Generate a deposit address and give it to the payer:
POST /v1/accounts/{id}/addresses{ "assetCanonical": "USDT_ETHEREUM" }→ { "address": "0x9a8b...c3d4", "memo": null, ... }Include the
memo/tag if present — on memo-based chains, funds sent without it may be unattributable. -
Wait for the
address.receivedwebhook. It fires once, on confirmation:{"type": "address.received","data": {"destination_account_id": "8f1c...","destination_address": "0x9a8b...c3d4","asset_canonical": "USDT_ETHEREUM","amount": "125.50","tx_hash": "0x6f4a..."}} -
Read the updated balance (live from custody):
GET /v1/accounts/{id}/balances/USDT_ETHEREUM
:::tip Reconciliation backstop
Inbound deposits also show up in GET /v1/transfers as external transfers with
srcAccountId: null and metadata.direction: "inbound" — poll that as a
backstop for missed webhooks. See Reconciliation.
:::