How it works
For every position a wallet has traded, we pull two pieces of data directly from the blockchain:- Realized P&L per position from the PNL subgraph. This tracks every way tokens can be acquired or disposed of: orderbook trades, USDC splits into Yes/No token pairs, pair merges back to USDC, partial sells, and market resolutions. This is the same accounting Polymarket uses internally.
- First trade timestamp from the orderbook subgraph. This tells us when each position was opened.
(current_price - avg_entry_price) * shares_held. This gets included so the curve reflects the wallet’s current standing, not just closed trades.
$1 Normalized curve
Whennormalize=1 is set, each position is scaled so the entry cost equals exactly $1.
If someone put $500 into a market and made $50, their raw P&L is +$50. The normalized P&L is $50 * (1 / $500) = $0.10. For every dollar risked on that market, they made 10 cents.
The scale factor for each position is 1 / total_bought, where total_bought is the total number of shares ever acquired for that position regardless of acquisition method.
Sum all the normalized P&Ls across all positions and you get the normalized equity curve. This answers the question: “If I copy every trade this wallet makes but only risk $1 per position, what are my expected returns?”
A wallet with 2,000 positions and a normalized final PnL of +$12 means each $1 bet returned about $0.006 on average. Across thousands of positions, that indicates a consistent edge.
Accuracy
Realized P&L on closed positions is exact. We use the same blockchain source (PNL subgraph) that Polymarket uses internally, so there is zero deviation on any resolved or closed position. The only variance is on currently open positions, where we mark-to-market using live prices from Polymarket’s Gamma API. Because our price fetch happens at a slightly different moment than any comparison snapshot, open position values can differ by 1-3%. Once a position closes, its P&L becomes exact.Polymarket wallet address (e.g.,
0xB4Ab48b451101a779bf8C644318Bb17fe652571d).Time window. Positions opened before the start of the window are excluded. One of:
7d, 30d, 90d, 1y, all.Set to
1 to include the $1-normalized equity curve alongside the raw curve.Response fields
| Field | Description |
|---|---|
positions_count | Total positions included in the curve |
open_count | Positions still open (mark-to-market with current prices) |
raw.final_pnl | Final cumulative P&L in USD |
raw.curve[].t | Unix timestamp (when the position was first entered) |
raw.curve[].pnl | Cumulative P&L at that point in USD |
normalized.bet_size | Always 1 (each position scaled to $1 risk) |
normalized.final_pnl | Final cumulative normalized P&L |
normalized.curve[].pnl | Cumulative normalized P&L at that point |
The curve is downsampled to 500 points maximum for large wallets. First and last points are always preserved.

