Get wallet token balances on Robinhood Chain (balances API)
Get every token balance of a Robinhood Chain wallet (USDG, tokenized stocks, ETH) in USD in one call, one token's balances across wallets, and batch prices.
Call GET /v1/robinhood/wallet/{address}?min_value_usd=1 (Starter plan, 5 credits). It returns the ETH balance (native_balance, native_value_usd) and up to 200 holdings[], most valuable first, each with token.address, balance in whole tokens, value_usd, value_eth and price_confidence, read on-chain at meta.balances_block. For one token's balances across all wallets use /token/{address}/holders (Free plan); to revalue balances you already have, GET /v1/robinhood/prices?tokens=... (anonymous, up to 100 tokens).
A wallet’s token balances are how much of each ERC-20 it holds right now, plus its native ETH. The Crius balances API answers that for any Robinhood Chain address in one call: it finds every token the wallet has ever received, reads the balances on-chain at one block, prices them in USD from on-chain pools and returns them most valuable first. You don’t need a token list or one balanceOf call per token. This page is about balances; for the same call’s profit and loss numbers, see wallet holdings and PnL.
Get a wallet’s balances in one call
A trader holding $49,722 of USDG and five tokenized stocks
What does 0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7 hold on Robinhood Chain, and what is it worth? Hide anything under $1.
curl "https://api.crius.sh/v1/robinhood/wallet/0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7?min_value_usd=1" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/wallet/0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7?min_value_usd=1", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/wallet/0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7?min_value_usd=1", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 143 lines (arrays trimmed)
{ "data": { "account_type": "eoa", "address": "0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7", "delegate": null, "holdings": [ { "balance": 49721.880472, "pnl": null, "price_confidence": "high", "token": { "address": "0x5fc5360d0400a0fd4f2af552add042d716f1d168", "logo": null, "symbol": "USDG" }, "value_eth": 21.0906, "value_usd": 49721.9 }, { "balance": 18.405208788009058717, "pnl": null, "price_confidence": "high", "token": { "address": "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", "logo": null, "symbol": "NVDA" }, "value_eth": 1.67342, "value_usd": 3945.15 }, { "balance": 4.10654992139340626, "pnl": null, "price_confidence": "high", "token": { "address": "0xd5f3879160bc7c32ebb4dc785f8a4f505888de68", "logo": null, "symbol": "QQQ" }, "value_eth": 1.25568, "value_usd": 2960.33 }, { "balance": 8.496965059200292092, "pnl": null, "price_confidence": "high", "token": { "address": "0xb0992820e760d836549ba69bc7598b4af75dee03", "logo": null, "symbol": "ORCL" }, "value_eth": 0.509659, "value_usd": 1201.54 }, { "balance": 6.004187798458070634, "pnl": null, "price_confidence": "high", "token": { "address": "0x5e81213613b6b86eab4c6c50d718d34359459786", "logo": null, "symbol": "TTWO" }, "value_eth": 0.504464, "value_usd": 1189.29 }, { "balance": 1.117684815247203549, "pnl": { "avg_entry_usd": 126.473, "realized_usd": 147.475, "unrealized_usd": 721.987 }, "price_confidence": "high", "token": { "address": "0x117cc2133c37b721f49de2a7a74833232b3b4c0c", "logo": null, "symbol": "SPY" }, "value_eth": 0.366205, "value_usd": 863.344 } ], "holdings_truncated": false, "holdings_value_usd": 70914, "is_contract": false, "label": null, "native_balance": 17.143712569865815681, "native_value_usd": 40417, "pnl": { "avg_hold_time_s": 20739, "best_trade": { "logo": "https://api.crius.sh/v1/robinhood/logo/0x448168b7c3736fb55c552dce72d5f1f5b30d77cb.png?size=128", "pnl_usd": 2326.69, "symbol": "Suited", "token": "0x448168b7c3736fb55c552dce72d5f1f5b30d77cb" }, "gas_scope": "all transactions sent by the wallet in the window", "gas_spent_usd": 147.202, "realized_usd": 73090.6, "tokens_traded": 2067, "tokens_with_known_cost": 2052, "total_usd": 75466.3, "trades": 15076, "unrealized_usd": 2375.68, "volume_usd": 2801387, "win_rate_pct": 42.3002, "window": "30d", "worst_trade": { "logo": "https://api.crius.sh/v1/robinhood/logo/0x90e8fa19ae1a01431da01c6f80b3bc5cebb19438.png?size=128", "pnl_usd": -428.531, "symbol": "TMF", "token": "0x90e8fa19ae1a01431da01c6f80b3bc5cebb19438" } }, "profile": { "first_seen_block": 91379092, "first_seen_ts": 1792286196200, "fresh": false, "funded_by": { "address": "0x07ae8551be970cb1cca11dd7a11f47ae82e70e67", "amount_eth": 20.297518745318700439, "block": 54422474, "label": null, "ts": 1788540817400 }, "history": "complete", "tags": [], "tx_count": 170001, "wallet_age_days": 10.9215 } }, "meta": { "balances_block": 100452982, "block": 100452982, "block_age_ms": 993, "block_ts": 1793229813000, "chain": "robinhood", "finalized_block": 100442370, "lag_ms": 53, "safe_block": 100446224 }}What this tells you
native_balance: 17.143712569865815681ETH, worthnative_value_usd: 40417. ETH is never inholdings[]: add it yourself for a total.- The largest holding is USDG (
0x5fc5360d0400a0fd4f2af552add042d716f1d168, the real one):balance: 49721.880472,value_usd: 49721.9. Itsvalue_eth: 21.0906is the same value expressed in ETH. - Then five tokenized stocks, each with
price_confidence: "high": 18.405208788009058717 NVDA ($3,945.15), 4.10654992139340626 QQQ ($2,960.33), 8.496965059200292092 ORCL ($1,201.54), 6.004187798458070634 TTWO ($1,189.29) and 1.117684815247203549 SPY ($863.344). Balances keep full precision, so fractional stock tokens are exact. holdings_value_usd: 70914totals every holding worth $1 or more. The six rows shown add up to about $59,882, so the rest is in smaller holdings further down the list. Withnative_value_usd, the wallet is worth about $111,331.holdings_truncated: false: every token the wallet touched was priced.meta.balances_block: 100452982: the ETH and token balances were all read at that block, so they are consistent with each other.
A wallet whose only tokens are lookalikes
CHARGE's creator (0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca) shows two USDG balances. Are they real?
curl "https://api.crius.sh/v1/robinhood/wallet/0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/wallet/0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/wallet/0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 84 lines (arrays trimmed)
{ "data": { "account_type": "smart_account", "address": "0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca", "delegate": "0x63c0c19a282a1b52b07dd5a65b58948a07dae32b", "holdings": [ { "balance": 25, "pnl": null, "price_confidence": "low", "token": { "address": "0xfaaf8ffa8a29ceb6c85aff8d3961f65ae1bfc775", "logo": null, "symbol": "USDG" }, "value_eth": 0.00000500064, "value_usd": 0.0117789 }, { "balance": 25, "pnl": null, "price_confidence": "low", "token": { "address": "0x06993ae1230d3755b54f25022028daa66772bc3d", "logo": null, "symbol": "USDG" }, "value_eth": 0.00000500061, "value_usd": 0.0117789 } ], "holdings_truncated": false, "holdings_value_usd": 0.0235578, "is_contract": false, "label": null, "native_balance": 0.71473787532832551, "native_value_usd": 1683.56, "pnl": { "avg_hold_time_s": null, "best_trade": null, "gas_scope": "all transactions sent by the wallet in the window", "gas_spent_usd": 0.198772, "realized_usd": 0, "tokens_traded": 0, "tokens_with_known_cost": 0, "total_usd": 0, "trades": 0, "unrealized_usd": 0, "volume_usd": 0, "win_rate_pct": null, "window": "30d", "worst_trade": null }, "profile": { "first_seen_block": 91351250, "first_seen_ts": 1792283372000, "fresh": false, "funded_by": { "address": "0xd782268f600403843484b70710daee6846fc0db8", "amount_eth": 0.008148386337868892, "block": 87601233, "label": "bridge:Relay solver", "ts": 1791903516300 }, "history": "complete", "tags": [ "dev", "smart_account" ], "tx_count": 14, "wallet_age_days": 10.8994 } }, "meta": { "balances_block": 100406864, "block": 100406864, "block_age_ms": 1301, "block_ts": 1793225084000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 59, "safe_block": 100401329 }}What this tells you
- Both holdings say
symbol: "USDG"withbalance: 25, but their addresses are0xfaaf8ffa8a29ceb6c85aff8d3961f65ae1bfc775and0x06993ae1230d3755b54f25022028daa66772bc3d, not USDG’s0x5fc5360d0400a0fd4f2af552add042d716f1d168. - Each is valued at
value_usd: 0.0117789withprice_confidence: "low": 25 “dollars” worth about one cent. This request has nomin_value_usd, so they show up; withmin_value_usd=1they would be hidden. - The real value is the ETH:
native_balance: 0.71473787532832551,native_value_usd: 1683.56, againstholdings_value_usd: 0.0235578.
Value balances you already have
Balances change only when the wallet moves tokens; prices change every block. If you already store a wallet’s balances (from an earlier /wallet call or your own indexer), refresh their value with batch prices instead of calling /wallet again. It’s on the anonymous plan and takes up to 100 tokens per call.
Prices for the six holdings above, in one call
What are USDG, NVDA, QQQ, ORCL, TTWO and SPY worth right now, so I can revalue the wallet's balances?
curl "https://api.crius.sh/v1/robinhood/prices?tokens=0x5fc5360d0400a0fd4f2af552add042d716f1d168,0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec,0xd5f3879160bc7c32ebb4dc785f8a4f505888de68,0xb0992820e760d836549ba69bc7598b4af75dee03,0x5e81213613b6b86eab4c6c50d718d34359459786,0x117cc2133c37b721f49de2a7a74833232b3b4c0c"const res = await fetch("https://api.crius.sh/v1/robinhood/prices?tokens=0x5fc5360d0400a0fd4f2af552add042d716f1d168,0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec,0xd5f3879160bc7c32ebb4dc785f8a4f505888de68,0xb0992820e760d836549ba69bc7598b4af75dee03,0x5e81213613b6b86eab4c6c50d718d34359459786,0x117cc2133c37b721f49de2a7a74833232b3b4c0c");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/prices?tokens=0x5fc5360d0400a0fd4f2af552add042d716f1d168,0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec,0xd5f3879160bc7c32ebb4dc785f8a4f505888de68,0xb0992820e760d836549ba69bc7598b4af75dee03,0x5e81213613b6b86eab4c6c50d718d34359459786,0x117cc2133c37b721f49de2a7a74833232b3b4c0c",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 74 lines (arrays trimmed)
{ "data": { "0x117cc2133c37b721f49de2a7a74833232b3b4c0c": { "change_24h_pct": 0.732612, "confidence": "high", "eth": 0.327526, "liquidity_usd": 3065474, "logo": null, "source_pool": "0xfe2a80bb5618fd14984b92ca6d45bf5ba67443ddb1435e28b2e48df2fc1526cd", "symbol": "SPY", "usd": 772.439 }, "0x5e81213613b6b86eab4c6c50d718d34359459786": { "change_24h_pct": -2.69804, "confidence": "high", "eth": 0.0839878, "liquidity_usd": 71756.6, "logo": null, "source_pool": "0xc9dad63b6fb9afe1fe888ebc7b023c587c58b9498f5bd17166226c0995dbc4eb", "symbol": "TTWO", "usd": 198.077 }, "0x5fc5360d0400a0fd4f2af552add042d716f1d168": { "change_24h_pct": null, "confidence": "high", "eth": 0.000424015, "liquidity_usd": 10302570, "logo": null, "source_pool": "0xbac3aa3b91584a53a579b3c999a56756e954e59247e497bad1d25a4334bde551", "symbol": "USDG", "usd": 1 }, "0xb0992820e760d836549ba69bc7598b4af75dee03": { "change_24h_pct": 8.82982, "confidence": "high", "eth": 0.0599593, "liquidity_usd": 222938, "logo": null, "source_pool": "0xc2ce4784e1e72cf0221b51b30c8aaadf6c0b12863cf03ab3687854fb7b1d850a", "symbol": "ORCL", "usd": 141.408 }, "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec": { "change_24h_pct": -1.46967, "confidence": "high", "eth": 0.0908873, "liquidity_usd": 1420235, "logo": null, "source_pool": "0xd4eb21209c4d6093f80b5b84f5c45cc093ea14a3", "symbol": "NVDA", "usd": 214.349 }, "0xd5f3879160bc7c32ebb4dc785f8a4f505888de68": { "change_24h_pct": 0.126576, "confidence": "high", "eth": 0.305663, "liquidity_usd": 1425197, "logo": null, "source_pool": "0x8493982435e4273028008cd181c84c0d6a548f96792fdb5acddcbb6a8c82d305", "symbol": "QQQ", "usd": 720.879 } }, "meta": { "block": 100454103, "block_age_ms": 745, "block_ts": 1793229926000, "chain": "robinhood", "finalized_block": 100442370, "lag_ms": 45, "missing": [], "safe_block": 100446224 }}What this tells you
datais keyed by token address:usd: 214.349for NVDA,720.879for QQQ,141.408for ORCL,198.077for TTWO,772.439for SPY and1for USDG, all withconfidence: "high".- Balance ×
usdgives the value: 1.117684815247203549 SPY × 772.439 = $863.34, the same as the wallet call’svalue_usd: 863.344(this capture is about two minutes later, atmeta.block100454103). change_24h_pctlets you show a daily move per holding: ORCL is up 8.82982%, TTWO down 2.69804%. USDG’s isnull.meta.missing: []: every requested token had a price. Unknown addresses would be listed there instead of indata.
Balances of one token across wallets
The /wallet call answers “what does this wallet hold”. The opposite question, “who holds this token, and how much”, is the holders endpoint: GET /v1/robinhood/token/{address}/holders ranks up to 500 wallets by balance. In the captured holders sample for Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8, request ?limit=5&exclude=infra), the largest real holder 0x1860e8b874ed7742ae5459af731687ecb576c9fd has balance: 28729479.389247917189540117 CHARGE, pct: 2.87295 of supply, worth value_usd: 111.806. Use it when you track one token (an airdrop list, a holder leaderboard) and /wallet when you track one address.
| Question | Call | Plan, credits |
|---|---|---|
| Every token one wallet holds, with USD value | GET /wallet/{address}?min_value_usd=1 | Starter, 5 |
| Current prices for balances you already know | GET /prices?tokens=... or POST /prices | Anonymous, 1 |
| Every wallet holding one token, by balance | GET /token/{address}/holders?limit=500 | Free, 2 |
| One token's holders at a past block or time | GET /token/{address}/holders/snapshot?at=... | Free, 5 |
What the balance fields mean
| Field | Meaning |
|---|---|
native_balance, native_value_usd | ETH balance in ETH, and its USD value. Not part of holdings[] or holdings_value_usd. |
holdings[].token | address, symbol and logo. Identify tokens by address: symbols are not unique. |
holdings[].balance | Balance in whole tokens (the token's decimals already applied), as an exact decimal. |
holdings[].value_usd, value_eth | Balance × the token's current price, in USD and in ETH. |
holdings[].price_confidence | high, medium, low or none: how far to trust value_usd. See token prices. |
holdings_value_usd | Total value_usd of the holdings that pass min_value_usd. |
holdings_truncated | true when the address touched too many tokens to price them all (pool and router contracts). |
meta.balances_block | The block every balance was read at. |
holdings[] is sorted by value_usd, highest first, and holds at most 200 rows. min_value_usd drops every row worth less than the threshold, and that includes tokens with no price at all, so leave it out if you need unpriced tokens too.
Use it in your app
-
Get a Starter key.
/wallet/{address}needs the Starter plan and costs 5 credits per call; send the key in thex-api-keyheader. See Plans & limits. -
Load balances once per wallet. Call
/wallet/{address}?min_value_usd=1when the user opens a portfolio, and storeholdings[].token.addressandbalance. -
Refresh value cheaply. Every few seconds, send the stored addresses to
/prices(up to 100 per call) and multiply. Call/walletagain only when the wallet sends or receives tokens. -
Show trust, not only numbers. Grey out holdings with
price_confidencelowornone, and never treat a token as USDG or a stock because of its symbol.
// Wallet balances with a total, then a cheap revaluation from batch prices.const wallet = "0x2a4d34cd09a36f59ae3bedc0880cd5da929321d7";const headers = { "x-api-key": process.env.CRIUS_API_KEY };
const { data, meta } = await (await fetch( `https://api.crius.sh/v1/robinhood/wallet/${wallet}?min_value_usd=1`, { headers })).json();console.log(`block ${meta.balances_block}: ${data.native_balance} ETH ($${data.native_value_usd})`);for (const h of data.holdings) { console.log(h.token.symbol, h.token.address, h.balance, `$${h.value_usd}`, h.price_confidence);}console.log(`total $${data.native_value_usd + data.holdings_value_usd}`);
// Later: revalue the same balances without another /wallet call.const tokens = data.holdings.map((h) => h.token.address).join(",");const prices = (await (await fetch(`https://api.crius.sh/v1/robinhood/prices?tokens=${tokens}`)).json()).data;const now = data.holdings.reduce((sum, h) => sum + Number(h.balance) * (prices[h.token.address]?.usd ?? 0), 0);console.log(`token holdings now $${now.toFixed(2)}`);Frequently asked questions
Is there a Robinhood Chain balances API?
Yes. GET https://api.crius.sh/v1/robinhood/wallet/{address} returns a wallet's ETH balance and every token it holds with a balance and USD value, in one call, without you having to know which tokens to ask for. It needs a Starter key (5 credits per call). Crius finds the tokens from the wallet's transfer history and reads the balances on-chain at one block.
How do I get all token balances of a wallet on Robinhood Chain?
Call /wallet/{address}?min_value_usd=1. holdings[] lists up to 200 tokens with a balance, most valuable first: token.address, token.symbol, balance (decimals already applied), value_usd and price_confidence. The ETH balance is separate, in native_balance. holdings_value_usd is the total of the token holdings.
Are the balances read from the chain?
Yes. The most valuable holdings are checked against each token's own balanceOf, and the ETH balance is read with eth_getBalance, both at the block in meta.balances_block. Tokens whose balanceOf returns 0 are left out, even if their Transfer events say otherwise.
How do I get the balance of one token for many wallets?
Turn the question around: GET /v1/robinhood/token/{address}/holders?limit=500 lists the token's holders ranked by balance, with balance, pct of supply and value_usd for each (Free plan, 2 credits). For a past block or time, use the holder snapshot.
Does the balances call include tokenized stocks and USDG?
Yes. Tokenized stocks (NVDA, QQQ, SPY and others) and USDG are ERC-20 tokens on Robinhood Chain, so they appear in holdings[] like any other token, valued from their on-chain pools. Real USDG is 0x5fc5360d0400a0fd4f2af552add042d716f1d168: match by address, because anyone can deploy a token called USDG.
Related
Get your free Crius API key
Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.
- Robinhood Chain (4663) only, from our own archive nodes
- REST + WebSocket
- Pay on-chain or by card