Skip to main content
Returns a time-ordered equity curve showing cumulative profit and loss for every position a wallet has ever taken on Polymarket. Optionally returns a $1-normalized curve that shows what your returns would look like if you copied every trade with exactly $1 of risk per position.

How it works

For every position a wallet has traded, we pull two pieces of data directly from the blockchain:
  1. 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.
  2. First trade timestamp from the orderbook subgraph. This tells us when each position was opened.
We line up every position chronologically by entry date. For each one, we add its profit or loss to a running total. That running total over time is the equity curve. For positions that are still open, we fetch the current market price and compute unrealized P&L: (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

When normalize=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.
wallet
string
required
Polymarket wallet address (e.g., 0xB4Ab48b451101a779bf8C644318Bb17fe652571d).
period
string
default:"30d"
Time window. Positions opened before the start of the window are excluded. One of: 7d, 30d, 90d, 1y, all.
normalize
string
default:"0"
Set to 1 to include the $1-normalized equity curve alongside the raw curve.
{
  "wallet": "0xb4ab48b451101a779bf8c644318bb17fe652571d",
  "period": "all",
  "source": "onchain",
  "positions_count": 278,
  "open_count": 83,
  "raw": {
    "points": 278,
    "final_pnl": -376.89,
    "curve": [
      { "t": 1774555427, "pnl": 10.56 },
      { "t": 1774555441, "pnl": -6.62 },
      { "t": 1774612800, "pnl": -12.30 }
    ]
  },
  "normalized": {
    "bet_size": 1,
    "positions": 278,
    "points": 278,
    "final_pnl": -2.5217,
    "curve": [
      { "t": 1774555427, "pnl": 0.0722 },
      { "t": 1774555441, "pnl": -0.0181 },
      { "t": 1774612800, "pnl": -0.0340 }
    ]
  }
}

Response fields

FieldDescription
positions_countTotal positions included in the curve
open_countPositions still open (mark-to-market with current prices)
raw.final_pnlFinal cumulative P&L in USD
raw.curve[].tUnix timestamp (when the position was first entered)
raw.curve[].pnlCumulative P&L at that point in USD
normalized.bet_sizeAlways 1 (each position scaled to $1 risk)
normalized.final_pnlFinal cumulative normalized P&L
normalized.curve[].pnlCumulative normalized P&L at that point
The curve is downsampled to 500 points maximum for large wallets. First and last points are always preserved.