Numbers your users can check against their statement.

Balances and P&L your users can check against their broker statement without finding a discrepancy.

Your problem

The parts you keep working around.

01

A user whose holding just split sees an unchanged raw balance and assumes your app is broken.

02

Performance computed from price alone understates returns on any instrument that pays a dividend.

03

Showing a raw ERC-20 amount to someone who thinks in shares is a support ticket waiting to happen.

The proof

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"}
Aggregated per address

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.8M57.7%$373.1M84,171
0x1cc6…e6e7+$1.6M58.4%$371.2M80,281
0x5001…e11b+$1.4M70.0%$208.4M37,961
0xcc9e…845c+$584,84757.6%$229.7M53,889
0x8626…57c5+$560,77967.4%$84.8M73,173
0x4f86…6de2+$471,77853.8%$106.5M71,010
0xe69b…d3f8+$439,82266.3%$55.0M54,893
0x5eee…55bd$562,59051.0%$202.4M65,747
0x6745…e58b$1.2M51.1%$335.1M18,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.

Integration sketch

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 docs
import { 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,});
Where to start

The plan that fits.

Build

$50/moRecommended

Everything the incumbents charge for, plus tracing.

Build covers balances, positions, P&L and the tape. Most consumer apps never need Scale.

Compare both plans

Ship performance numbers that hold up.

Build covers balances, positions, P&L and the tape. Most consumer apps never need more.