Equity Curve
Time-ordered equity curve for any Polymarket wallet, with optional dollar-normalized copy-trade analysis.
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. WhenDocumentation Index
Fetch the complete documentation index at: https://docs.polynode.dev/llms.txt
Use this file to discover all available pages before exploring further.
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
curve arrays contain up to 500 points each):
Query parameters
7d, 30d, 90d, 1y, all.1 to include the $1-normalized equity curve alongside the raw curve.YYYY-MM-DD (treated as UTC midnight) or a unix timestamp in seconds. Drops positions whose first activity is before this date.from. Drops positions whose first activity is after this date.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, passinclude_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:Response fields
| Field | Type | Description |
|---|---|---|
wallet | string | The lowercased wallet address. |
period | string | The period filter that was applied (7d, 30d, 90d, 1y, or all). |
source | string | Always "onchain". |
positions_count | integer | Total positions included in the curve after all filters. |
markets_count | integer | Distinct markets (unique outcome groups). For binary markets, two positions (Yes + No) on the same market count as one market. |
open_count | integer | Positions that still hold a non-zero balance. |
applied_filters | object | Echoes back exactly which filters were applied — useful for debugging. |
partial | boolean | true if the request hit the 10-second server-side timeout. The response will still contain whatever was computed; the error field will be set. |
raw.points | integer | Number of points in the raw curve (downsampled to a max of 500). |
raw.final_pnl | number | Final cumulative P&L across the included positions, in USD. |
raw.curve[].t | integer | Unix timestamp (seconds) when the position was first opened. |
raw.curve[].pnl | number | Cumulative P&L at that point, in USD. |
normalized.bet_size | number | Always 1. Each position is scaled to $1 of risk. |
normalized.positions | integer | Total positions in the normalized curve. |
normalized.points | integer | Number of points (downsampled to a max of 500). |
normalized.final_pnl | number | Final cumulative $1-normalized P&L. |
normalized.curve[].pnl | number | Cumulative $1-normalized P&L at that point. |
Performance
| Query shape | Typical first-hit latency | Cached |
|---|---|---|
| Default (any wallet) | 50ms – 2s | <50ms |
include_unrealized=1, large open-position count | 1s – 8s | <50ms |
Composed filters (from + max_markets) | <1s | <50ms |
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:- Take the position’s P&L (realized only by default; realized + unrealized when opted in).
- Divide by
total_boughtfor that position.total_boughtis the total number of shares ever acquired across every acquisition method. - Add the result to the running normalized cumulative.
$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_pnlremains 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
Path Parameters
Polymarket wallet address
Query Parameters
Time window. Positions whose first activity falls before the start of the window are excluded.
7d, 30d, 90d, 1y, all Set to 1 to include the $1-normalized equity curve alongside the raw curve.
0, 1 Start date. YYYY-MM-DD (treated as UTC midnight) or unix seconds.
End date. Same format as from.
Keep only the most recent N markets the wallet has touched.
x >= 1Set to 1 to mark open positions to current market price and include unrealized P&L. Off by default. Slower and non-deterministic.
0, 1 Response
Equity curve
The response is of type object.

