Skip to main content

Receive a deposit

  1. 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.)

  2. 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.

  3. Wait for the address.received webhook. 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..."
    }
    }
  4. 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. :::