Wallet Get

Read the addresses and balances of a user's wallet across every supported network.

POST /api/wallet/get

Returns the API key user's wallet — addresses per network and the latest known balance for each asset. Use it to power dashboards, deposit screens, and pre-flight checks before a transfer or payout.

Balances are read from Hodle's synced view — the same numbers the wallet UI shows. To force a fresh on-chain read, pass sync: true.

Request

The API key identifies the owner. Pass walletId to read a specific wallet created by the API, and subAccountId when it belongs to a customer. Without walletId, addresses and balances use the existing per-network selection. The same fields are accepted as query parameters on GET /api/wallet.

curl --request POST \
  --url https://api.hodle.com.br/api/wallet/get \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{ "sync": false }'
const res = await fetch('https://api.hodle.com.br/api/wallet/get', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.HODLE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sync: false }),
})
const data = await res.json()
import os, requests

res = requests.post(
    "https://api.hodle.com.br/api/wallet/get",
    headers={
        "Authorization": f"Bearer {os.environ['HODLE_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={"sync": False},
)
data = res.json()

Parameters

FieldTypeRequiredDescription
walletIdstringNoWallet ID returned as data.id by /api/wallet/create. Must belong to the selected owner/subaccount; unknown, removed or foreign IDs return 404.
subAccountIdstringNoOwned subaccount containing the wallet. Omit for the API key owner’s own wallet.
syncbooleanNoIf true, fetches a fresh balance from each chain before returning. Default false.

A read with walletId also returns data.walletId. See Wallet Keys for creating a protected wallet and selecting it in operations.

Response

200 OK
{
  "success": true,
  "data": {
    "subAccountId": "5b9f1a83b6b7c2b001f3c9e21",
    "addresses": {
      "polygon": "0x4b1f...c9a2",
      "base":    "0x4b1f...c9a2",
      "tron":    "TQHvP...kZ8",
      "solana":  "9xQeW...VFin",
      "spark":   "spark1pgss92n427yh3ghz5dq0j93ph3p9lrmhy7enrus02uusmd6ktlx23t88en8f8j",
      "sparkLightning": "you@hodle.com.br"
    },
    "balances": [
      { "network": "polygon", "asset": "USDT",  "amount": "182.45" },
      { "network": "polygon", "asset": "USDC",  "amount": "0.00"   },
      { "network": "polygon", "asset": "BRLA",  "amount": "2.02"   },
      { "network": "base",    "asset": "USDC",  "amount": "0.00"   },
      { "network": "base",    "asset": "BRLA",  "amount": "0.00"   },
      { "network": "tron",    "asset": "USDT",  "amount": "0.00"   },
      { "network": "solana",  "asset": "USDT",  "amount": "0.00"   },
      { "network": "solana",  "asset": "USDC",  "amount": "12.34"  },
      { "network": "solana",  "asset": "BRS",   "amount": "0.00"   },
      { "network": "spark",   "asset": "USDB",  "amount": "0.00"   }
    ],
    "syncedAt": "2026-05-09T22:14:00.000Z"
  }
}
FieldTypeDescription
addressesobjectReceive addresses per network. EVM networks share the same smart-account address. spark is the bech32m Spark address (spark1…); sparkLightning is the same wallet's Lightning address.
balancesarrayOne row per (network, asset) the user has ever held.
syncedAtstringISO timestamp of the last successful chain read.

Networks and assets

NetworkAsset(s)Notes
polygonUSDT, USDC, BRLA (ERC-20)Smart account, gas sponsored.
baseUSDC, BRLASmart account, gas sponsored.
tronUSDT (TRC-20)Energy + bandwidth covered by Hodle.
solanaUSDT, USDC, BRS (SPL)Network fee paid by Hodle's master wallet. BRS requires the NORA_RAIL flag. Rows appear only once the wallet has a Solana address.
sparkUSDB, BTC, DEPIXSelf-custodial Spark wallet. addresses.spark (a spark1… address) receives DePix and BTC — see Deposit Asset; addresses.sparkLightning drives the Lightning ↔ PIX flow. Both keys are omitted until the wallet has registered a Spark identity, which happens the first time its owner unlocks it.

Errors

401 — missing or invalid API key
{ "success": false, "error": "Unauthorized" }
404 — wallet not yet provisioned
{ "success": false, "error": "Wallet not found" }

If the user has just been created and you have not called POST /api/wallet/create yet, this endpoint returns 404.