Skip to main content
GET
Equity Curve
Returns a time-ordered equity curve showing cumulative profit and loss across every position a wallet has ever taken on Polymarket. By default, the curve is built from realized P&L only — the locked-in result from every closed position, every partial sell, every market resolution, every redemption. This makes the curve fully deterministic: the same query returns the same numbers regardless of when you call it. It’s also fast, typically returning in under a second. When normalize=1 is set, the response also includes a $1-normalized equity curve. Each position is scaled so its entry cost equals exactly $1, then summed. This shows what your returns would look like if you copied every trade with $1 of risk per position — the standard format for evaluating a wallet’s edge across thousands of trades.

Simple example

Response (truncated for clarity — curve arrays contain up to 500 points each):

Query parameters

string
required
Polymarket wallet address.
string
default:"30d"
Time window. Positions whose first activity falls before the start of the window are excluded. One of: 7d, 30d, 90d, 1y, all.
string
default:"0"
Set to 1 to include the $1-normalized equity curve alongside the raw curve.
string
Start date. Accepts YYYY-MM-DD (treated as UTC midnight) or a unix timestamp in seconds. Drops positions whose first activity is before this date.
string
End date. Same format as from. Drops positions whose first activity is after this date.
integer
Keep only the most recent N markets the wallet has touched. A “market” is a unique outcome group; binary markets count as one. Useful for quickly evaluating a wallet’s recent performance without scanning their full history.
string
default:"0"
Set to 1 to mark currently-open positions to current market price and include the unrealized P&L in the curve. Off by default. See Realized vs unrealized below before turning this on.

Realized vs unrealized

The default response is realized-only. Every closed position contributes its locked-in P&L. Open positions contribute whatever they’ve already realized through partial sells (often zero if the wallet hasn’t sold any shares of that position yet). This is the right default for backtesting and for evaluating a wallet’s edge over time. It’s deterministic — the same query returns the same numbers regardless of when you call it — and it returns in under a second even for whales. If you want a current-portfolio snapshot that marks open positions to the latest market price, pass include_unrealized=1. The curve’s final point will reflect what the wallet would have if it closed all open positions right now. Tradeoffs:
  • Slower. Open positions need a current price each, fetched live.
  • Non-deterministic. Two queries five minutes apart return slightly different numbers as prices move.
  • Worth it when you specifically want a “what’s my position worth right now” view rather than a backtest signal.

Filtering examples

Last 30 days:
Specific date range — backtest the wallet’s behavior in early April 2026:
Recent 50 markets only — fast scan of the wallet’s most recent activity:
Composed filters — fast realized-only curve over the last 100 markets in a specific window:

Response fields

Performance

Responses are cached for 5 minutes per unique parameter combination. The cache key separates every filter, so two callers using different filters won’t collide.

Rate limit

This endpoint is rate-limited at 1 request per 10 seconds per API key. It’s a heavy endpoint — caching results client-side is recommended.

$1 normalization math

For every position in the included set:
  1. Take the position’s P&L (realized only by default; realized + unrealized when opted in).
  2. Divide by total_bought for that position. total_bought is the total number of shares ever acquired across every acquisition method.
  3. Add the result to the running normalized cumulative.
If a wallet put $500 into a market and made $50 realized, the normalized contribution is $50 / $500 = $0.10. For every dollar risked on that market, they made 10 cents. Sum across all positions and you get the normalized final P&L. A wallet with 2,000 positions and a normalized final P&L of +12.0 means each $1 risked returned about $0.006 on average. Across thousands of positions, that indicates a real and consistent edge.

Notes on coverage

  • NegRisk-split positions. When a wallet acquires tokens via a USDC split into a Yes/No pair (rather than a CLOB trade), there is no on-chain trade event for that token. We use sibling-token timestamps and redemption timestamps as fallbacks where available, but in rare cases a split-derived position with no sibling activity and no redemption record can fall back to “now” on the curve. This affects shape, not totals — final_pnl remains correct.
  • Curve downsampling. Both the raw and normalized curves are downsampled to a maximum of 500 points. The first and last points are always preserved.

Authorizations

x-api-key
string
header
required

Path Parameters

wallet
string
required

Polymarket wallet address

Query Parameters

period
enum<string>
default:30d

Time window. Positions whose first activity falls before the start of the window are excluded.

Available options:
7d,
30d,
90d,
1y,
all
normalize
enum<string>
default:0

Set to 1 to include the $1-normalized equity curve alongside the raw curve.

Available options:
0,
1
from
string

Start date. YYYY-MM-DD (treated as UTC midnight) or unix seconds.

to
string

End date. Same format as from.

max_markets
integer

Keep only the most recent N markets the wallet has touched.

Required range: x >= 1
include_unrealized
enum<string>
default:0

Set to 1 to mark open positions to current market price and include unrealized P&L. Off by default. Slower and non-deterministic.

Available options:
0,
1

Response

Equity curve

The response is of type object.