Skip to main content
These are the API changelog entries from October 25 to 26, 2026, newest first. The newest changes are on the API changelog.
Old V1 field spellings and webhook event names are removed on February 1, 2027
The renamed V1 response fields and webhook event types now have a sunset date: 2027-02-01T00:00:00Z. Until then every old spelling is still sent beside its new name with the same value. From that date the old spellings are no longer sent or accepted.Before this change, the old spellings had no end date. The OpenAPI document, the TypeScript SDK’s types and the MCP tool descriptions now mark each one deprecated and name the date.The OpenAPI document also drops pnl.last_7d and pnl.last_30d from the trader schema. The API has not sent either field since they were deprecated, so no response changes.Backward compatible until 2027-02-01. Breaking from that date for clients that read an old field spelling, send sort=whales, or subscribe a webhook endpoint to an old event type.What to change: Read the new field names, send sort=large_trades, and register webhook endpoints under the new event types before 2027-02-01. A client that already reads the new names needs no change.
Pick of the Day ledger permalinks point at each pick's stable page
Every entry’s permalink on GET /api/v1/pick-of-the-day/ledger and GET /api/v1/pick-of-the-day/ledger/{pick_id} is now the pick’s stable page, https://0xinsider.com/pick-of-the-day/picks/{pick_id}.Before this change it was the dated address, https://0xinsider.com/pick-of-the-day/{date}/{rank}. That address now answers 308 Permanent Redirect to the same stable page, and 404 when no published pick holds the slot.Backward compatible. Every permalink you stored still opens its pick, through the redirect.What to change: Nothing. If you parse the date or rank out of permalink, read pick_date and pick_rank on the entry instead.
Grade drawdown and smoothness, and streak_tier, read sports and esports days
The drawdown and equity smoothness inside grade and score are now measured on the wallet’s sports and esports realized P&L by day, the series GET /api/v1/trader/{address}/pnl returns. streak_tier now compares the wallet’s sports and esports realized P&L over the last 7 days with other wallets.Before this change, both read the day-to-day differences of Polymarket’s P&L curve for the whole wallet, which covers every market.
  • Forecasting edge and the Sortino ratio inside the grade still read every market the wallet trades.
  • streak_tier is returned by GET /api/v1/trader/{address}, POST /api/v1/traders/batch, GET /api/v1/leaderboard, GET /api/v1/leaderboard/trending and the MCP tools built on them. grade changes wherever it is returned, including large trades, positions and their min_grade filters.
  • A wallet’s grade and score change at its next grading pass after the release. On a copy of production from October 26, 1,359 of 162,394 graded wallets (0.8%) changed letter, 408 of them to or from S, A or B; the number of wallets at each letter moved by 7 at most.
  • A wallet whose sports and esports days 0xinsider has not computed yet keeps the previous drawdown and smoothness; while any wallet waits, streak_tier keeps the previous basis for every wallet.
Backward compatible. Field names, types, allowed values and presence rules are unchanged; what the values measure changes.What to change: Nothing. If you store grades or streak tiers, expect a one-time change for some wallets.
Trending wallets' daily P&L series covers sports and esports markets only
GET /api/v1/leaderboard/trending and the get_trending_wallets MCP tool now return each wallet’s daily_pnl_series as its sports and esports realized P&L by day: the same day series GET /api/v1/trader/{address}/pnl serves, cut to the window.Before this change, daily_pnl_series was the day-to-day differences of Polymarket’s P&L curve for the whole wallet, which covers every market, and a day without a curve point was left out.
  • The series has one point for each UTC day of the window, oldest first, with pnl_usd 0 on a day with no sports or esports realized P&L.
  • daily_pnl_series_status is new and always present: ready, or pending while 0xinsider has not computed the wallet’s sports and esports days or does not have the wallet. A pending series is empty, which never means zero.
  • trending_pnl_usd, rank and the order are unchanged: they stay Polymarket’s leaderboard figure across every market, so the series does not add up to trending_pnl_usd.
  • The TypeScript SDK’s types and the MCP tool’s output schema add daily_pnl_series_status.
Breaking for clients that read daily_pnl_series as the wallet’s P&L across every Polymarket market, or an empty series as a wallet with no P&L. Field names and parameters are unchanged; daily_pnl_series_status is added.What to change: Read the series as sports and esports P&L. Treat daily_pnl_series_status: "pending" as not computed yet and request the list again later.
Trader daily P&L covers sports and esports markets only
GET /api/v1/trader/{address}/pnl and the get_trader_pnl MCP tool now return the wallet’s sports and esports realized P&L by day. A day’s daily_change is the realized P&L of the wallet’s sports and esports markets dated to it: a settled market on its resolution day, else its last trade day, and an open market’s realized part on its last trade day. The days add up to the Sports P&L that GET /api/v1/trader/{address} returns as pnl.in_scope.realized_pnl, with the new realized.undated_pnl added.Before this change, daily_change, cumulative_profit and total_pnl were the day-to-day differences of Polymarket’s P&L curve for the whole wallet, which covers every market and cannot be split per market. markets_traded counted every market the wallet’s stored fills touched that day.
  • series_status is always present: ready, or pending while 0xinsider has not computed the wallet’s sports and esports series yet. A pending response has empty sections, default stats, and null for realized and freshness_at. Its empty sections never mean zero.
  • realized is always present, null while pending: basis, realized_pnl, dated_pnl and undated_pnl, at full precision. dated_pnl is the sum of every day’s daily_change, and undated_pnl = realized_pnl - dated_pnl. realized_pnl starts from Polymarket’s figures and the days from 0xinsider’s per-market record, so undated_pnl holds the wallet’s rebate share, corrections, markets with no trade date, and the difference between Polymarket’s figure and the per-market record, which on some wallets is most of it.
  • cumulative_profit and total_pnl are the running sum of daily_change. stats, monthly, year_totals and drawdown derive from the new series.
  • entries has one point for each UTC day with realized P&L or sports and esports volume. A day with volume and nothing realized has daily_change 0.
  • markets_traded is absent on a day whose stored fills include a market outside sports and esports. total_volume is absent on a day with realized P&L and no stored sports or esports fill.
  • monthly[].markets_traded, until now always an integer, is null for a month with such a day, where a sum would undercount.
  • freshness_at is when the wallet’s sports and esports record was last computed, where it was when the wallet-wide series was last rebuilt.
  • The TypeScript SDK’s types and the MCP tool’s output schema add both fields.
Breaking for clients that read the series as the wallet’s P&L across every Polymarket market, read an empty series as a wallet with no P&L, or require an integer in monthly[].markets_traded. Field names and parameters are unchanged; series_status and realized are added.What to change: Read the series as sports and esports P&L. Treat series_status: "pending" as not computed yet and retry later, and accept null in monthly[].markets_traded. To match pnl.in_scope.realized_pnl, add realized.undated_pnl to the last cumulative_profit.
Polymarket links carry the via=0xinsider partner tag before the referral tag
polymarket_url on GET /api/v1/pick-of-the-day and on each combo leg’s market from GET /api/v1/combos/fills and GET /api/v1/combos/{condition_id} now ends in ?via=0xinsider&r=0xinsidercom instead of ?r=0xinsidercom. via=0xinsider is 0xinsider’s tag in Polymarket’s partner program; r=0xinsidercom is the Polymarket referral tag it already carried. The path is unchanged. The MCP tools that return these fields change the same way.A response cached before the change keeps the old query string until it expires.Backward compatible. The field keeps its name, type and presence rules; only its query string changes.What to change: Nothing if you open or display the URL as returned. If you compare polymarket_url with a URL you build, or strip its query string to find the page, expect the two parameters in this order.
A trader's daily markets_traded no longer counts unstored markets outside sports and esports
entries[].markets_traded on GET /api/v1/trader/{address}/pnl counts the markets of the fills 0xinsider stores for the wallet that day. Since late October 2026 0xinsider does not store a fill in a market outside sports and esports, and the day’s count no longer adds such a market either.Before this change, from October 25, 2026, a day on which the wallet traded a market outside sports and esports still counted that market, although none of its fills was stored. Each wallet’s stored days are rebuilt without those markets at its next full daily rebuild, at the latest within a week.
  • Fills in markets outside sports and esports that 0xinsider stored before October 2026 still count until they are removed.
  • daily_change, cumulative_profit and total_pnl still follow Polymarket’s P&L for the whole wallet, and total_volume is unchanged.
Backward compatible in shape: no field is added, removed, or retyped. markets_traded can be lower on days from October 25, 2026 for wallets that also trade markets outside sports and esports.What to change: Nothing. If you stored markets_traded for those days, read them again after a week.
The sports and esports P&L shares rebates out by trading volume
On basis polymarket_sports_esports_v1, pnl.in_scope.realized_pnl on GET /api/v1/trader/{address} and POST /api/v1/traders/batch, and in_scope.realized_pnl on GET /api/v1/leaderboard, now add the sports and esports share of the wallet’s maker and taker rebates by trading volume: the wallet’s Polymarket volume in sports and esports over its Polymarket volume overall, capped at 1. The grade ranks the same figure.Before this change the rebates were shared out by cost. 0xinsider no longer stores a wallet’s markets outside sports and esports, so on wallets that keep trading other markets the cost share kept growing toward 1 and credited sports with rebates earned elsewhere. Rebates accrue with volume.
  • While Polymarket reports no overall volume for the wallet, the cost share still applies.
  • sports_esports_split_v1 is unchanged: it still shares fees, refunds and rebates out by cost.
  • The other in_scope fields, the other pnl fields, and basis are unchanged. The TypeScript SDK’s description changes the same way.
Backward compatible in shape: no field is added, removed, or retyped. The value of realized_pnl changes for wallets on polymarket_sports_esports_v1 that earned rebates.What to change: Nothing. If you stored realized_pnl figures, compare new ones only with figures read after this change.
Pick of the Day increases the public daily capacity from 20 to 25
GET /api/v1/pick-of-the-day, its dated reads, the archive, and MCP get_pick_of_the_day now support up to 25 active recommendations per date in America/New_York. Max opens all available published recommendations; Pro keeps its allowance of 5, including the designated free selection.Before this change, the public daily capacity and Max allowance were 20. After withdrawals or release declines, later additions can now use compatibility pick_rank values through 30, while the date still has at most 25 active recommendations.
  • In the OpenAPI document and the Pick of the Day MCP tool’s output schema, pick_count now has a maximum of 25 and every pick_rank (in picks, scheduled_picks, locked_picks, proof_pending_picks and the archive) a maximum of 30.
  • The public ledger’s publication_order runs from 1 to 30. The 0xinsider/picks verifier accepts it.
  • Withdrawal gaps do not change existing pick IDs, order, or proof bytes. Use pick_id for identity and publication_order for presentation. A date can have fewer than 25 recommendations.
  • potd-trader v0.4.5 accepts up to 25 daily recommendations and ranks through 30 for Polymarket and Kalshi. Its default spending limits are unchanged.
Breaking for clients that enforce the old pick-count or rank bounds. The response fields and types are unchanged.What to change: Remove assumptions that a public date has at most 20 active recommendations or that pick_rank cannot exceed 25. Stop older potd-trader watchers and upgrade to v0.4.5: older releases stop buying at 20 Max picks and refuse a slate with a rank above 25.
The export's risk_summary.kelly_fraction counts sports and esports markets only
In the dataset export file from POST /api/v1/trader/{address}/export, risk_summary.kelly_fraction is now the Kelly fraction of the wallet’s resolved sports and esports markets: the markets the file’s markets section lists. export_metadata.scope_note says so.Before this change it counted every resolved market the wallet traded. 0xinsider no longer stores a wallet’s markets outside sports and esports, so that figure would have kept changing as those markets dropped out.
  • It is null when the wallet has fewer than 5 resolved sports and esports markets, or no win or no loss among them. On a sample of 1,000 wallets that trade both kinds of market, 197 of 939 values became null, and 116 changed sign.
  • The other risk_summary fields, risk_metrics, and quant_metrics still cover every market of the wallet.
  • A file written before this change keeps its old value and its old scope_note.
Backward compatible in shape: no field is added, removed, or retyped. The value changes for wallets that trade outside sports and esports.What to change: Nothing, unless you compare kelly_fraction across files. Compare it only between files whose scope_note names risk_summary.kelly_fraction.
The sports and esports P&L starts from Polymarket's own sports and esports figures, with a new basis value
pnl.in_scope.realized_pnl on GET /api/v1/trader/{address} and POST /api/v1/traders/batch, and in_scope.realized_pnl on GET /api/v1/leaderboard, now start from the realized P&L Polymarket itself reports for the wallet in its sports and esports categories. 0xinsider adds the wallet’s maker and taker rebates, which those figures leave out, shared out by cost, and the sports and esports part of any published pnl.correction. The grade ranks the same figure.Before this change the figure split Polymarket’s realized P&L for the whole wallet by market, and shared fees, refunds and rebates out by cost. On wallets that trade both sports and other markets, that split could credit sports with P&L earned elsewhere: on October 26, 2026, one graded wallet’s split figure was $3,487,183 where Polymarket's sports and esports figures summed to $136,339.
  • basis tells the two rules apart. polymarket_sports_esports_v1 is the new rule. sports_esports_split_v1 is the earlier split, which a wallet keeps until both of its category figures are confirmed.
  • A wallet that Polymarket does not list in a category counts 0 there once that has been confirmed.
  • markets, markets_resolved, win_rate, markets_out_of_scope and as_of are unchanged. Every other pnl field still covers all of the wallet’s Polymarket markets.
  • The MCP tools that return these objects and the TypeScript SDK’s descriptions change the same way.
Backward compatible in shape: no field is added or removed, and basis was always a string. The value of realized_pnl changes for many wallets that trade outside sports and esports.What to change: If you check basis against sports_esports_split_v1, accept polymarket_sports_esports_v1 too. Compare realized_pnl figures only within one basis.
A wallet needs a sports or esports market to have a grade
GET /api/v1/trader/{address} and every response that carries a wallet’s grade now omit grade and score for a wallet that holds no sports or esports market. Grades are also ranked only against wallets that hold at least one.Before this change, about 31,300 such wallets held a grade (mostly C and D), ranked on sports and esports profit of exactly $0. Ranking them pushed every other wallet’s position up or down.
  • About 31,300 wallets lose their grade. None of them was S, A, or B.
  • About 20,500 of the 165,000 wallets still ranked move one band. Most move up from D to C or F to D. About 1,700 move down: S to A, A to B, or B to C.
  • The leaderboard, which lists S, A, and B, shrinks from about 11,450 wallets to about 9,950.
  • A wallet that makes its first sports or esports trade can be graded again from the next hourly ranking.
Breaking for clients that expect every tracked wallet to have a grade, or that store band counts.What to change: Treat a missing grade as “no sports or esports record”, as you already treat an ungraded wallet. Refresh any stored grades after October 25, 2026.
A trader's daily total_volume counts sports and esports markets only, on every day
GET /api/v1/trader/{address}/pnl now returns entries[].total_volume as the cash the wallet traded that day in sports and esports markets, on every day. GET /api/v1/trader/{address}/export and the export file sum the same figure into exported_activity_volume.Before this change, total_volume was the cash traded across every market, and it was absent on every day from October 23, 2026, because 0xinsider no longer stores every fill outside sports and esports.
  • markets_traded still counts every market the wallet traded that day.
  • provider_activity_volume_gap and activity_volume_coverage are always null. provider_lifetime_volume covers every market, so a difference or ratio of the two measures nothing.
  • A wallet whose stored history 0xinsider has not rebuilt yet keeps the earlier figure, absent from October 23, 2026, until its rebuild. One wallet’s entries never mix the two.
  • stats.total_volume on GET /api/v1/trader/{address} is unchanged: Polymarket’s full-history volume across every market.
  • The MCP tools that return these objects and the TypeScript SDK’s descriptions change the same way.
Breaking for clients that read entries[].total_volume or exported_activity_volume as volume across every market. Both keep their names and types.What to change: Read both as sports and esports volume. Stop reading provider_activity_volume_gap and activity_volume_coverage, and compare exported_activity_volume with stats.total_volume only as two different measures.