Numbers your users can check against their statement.
Balances and P&L your users can check against their broker statement without finding a discrepancy.
The parts you keep working around.
A user whose holding just split sees an unchanged raw balance and assumes your app is broken.
Performance computed from price alone understates returns on any instrument that pays a dividend.
Showing a raw ERC-20 amount to someone who thinks in shares is a support ticket waiting to happen.
How the platform answers, point by point.
Balances that look wrong after a split
balance_ui alongside balance_raw on every response, with the multiplier that produced it
Understated returns
Total return including reinvested dividends, reported separately from price return
Raw amounts in the UI
SDKs return UI-adjusted balances by default; the raw number requires an explicit call
Balances that behave the way people expect.
A holding that just split shows more shares, not an unchanged raw integer. The multiplier is applied before the number reaches your UI.
{ "tape_sequence": "88214417", "token_symbol": "AAPL", "venue": "VENUE_UNISWAP", "kind": "TRADE_KIND_SPOT_SWAP", "side": "SIDE_BUY", "price": "231.4400", "price_per_share": "231.4400", "multiplier": "1.000000", "size_tokens": "18.25", "size_usd": "4223.78", "session": "SESSION_REGULAR", "underlying_market_open": true, "premium_bps_at_print": "14.2", "block_number": 4512889, "confirmation_state": "CONFIRMATION_STATE_INCLUDED"}A custom wallet-PnL request can roll captured fills up per address into agreed realized PnL, win rate, volume, and trade-count fields after source coverage and calculation rules are confirmed.
| 0x5dd8…9faf | +$1.8M | 57.7% | $373.1M | 84,171 |
| 0x1cc6…e6e7 | +$1.6M | 58.4% | $371.2M | 80,281 |
| 0x5001…e11b | +$1.4M | 70.0% | $208.4M | 37,961 |
| 0xcc9e…845c | +$584,847 | 57.6% | $229.7M | 53,889 |
| 0x8626…57c5 | +$560,779 | 67.4% | $84.8M | 73,173 |
| 0x4f86…6de2 | +$471,778 | 53.8% | $106.5M | 71,010 |
| 0xe69b…d3f8 | +$439,822 | 66.3% | $55.0M | 54,893 |
| 0x5eee…55bd | −$562,590 | 51.0% | $202.4M | 65,747 |
| 0x6745…e58b | −$1.2M | 51.1% | $335.1M | 18,859 |
Sample rows in the wallet-PnL dataset format. Positions are valued with the multiplier as of each block, so returns survive splits and dividends.
Correct by default, wrong on purpose only.
The SDK returns UI-adjusted balances from the obvious call; the raw amount takes an explicit one. A historical query without as_of does not compile.
Read the docsimport { RobinhoodRPC } from "@robinhoodrpc/sdk"; const client = new RobinhoodRPC({ apiKey: process.env.RHRPC_KEY! }); // Multiplier applied. This is the number to put in the UI.const balance = await client.balance(address, "AAPL"); // The raw ERC-20 amount requires asking for it explicitly.const raw = await client.balanceRaw(address, "AAPL"); // A historical query without asOf is a compile error, so the// classic "current multiplier on a past balance" bug cannot ship.const then = await client.balance(address, "AAPL", { asOfBlock: 4_200_000,});The plan that fits.
Build
$50/moRecommendedEverything the incumbents charge for, plus tracing.
Build covers balances, positions, P&L and the tape. Most consumer apps never need Scale.
Compare both plansShip performance numbers that hold up.
Build covers balances, positions, P&L and the tape. Most consumer apps never need more.