@0xinsider/mcp 3.12.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1001,6 +1001,7 @@ export type EventReplayMeta = {
1001
1001
  condition_id?: string;
1002
1002
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
1003
1003
  min_size?: number;
1004
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
1004
1005
  };
1005
1006
  /** The expansions applied to every event on this page; empty when none. */
1006
1007
  expand: "trade"[];
@@ -1812,7 +1813,7 @@ export type LargeTradeInsertedV2Data = {
1812
1813
  trader_id: number;
1813
1814
  /** Address of the wallet that made the trade. */
1814
1815
  wallet: string;
1815
- /** The wallet's grade when the event was published; `null` when it has none. */
1816
+ /** The wallet's grade when the event was published; `null` when it has none. A backfilled trade publishes hours after it filled, so this can differ from `grade_at_trade`. `min_grade` filters on this field; `min_grade_at_trade` filters on `grade_at_trade`. */
1816
1817
  grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
1817
1818
  /** USD notional of the trade; decimal string. */
1818
1819
  size_usd: string;
@@ -1826,20 +1827,26 @@ export type LargeTradeInsertedV2Data = {
1826
1827
  /** When the trade filled on Polymarket. The envelope's `created_at` is this instant. */
1827
1828
  traded_at: string;
1828
1829
  platform: "polymarket";
1830
+ /** The grade the wallet held when the trade filled, the same fact as `trader.grade_at_trade` on `GET /api/v1/large-trades`; `null` unless `grade_at_trade_status` is `graded`. `min_grade_at_trade` filters on it. */
1831
+ grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F" | null;
1832
+ /** `graded` when `grade_at_trade` holds the grade at the fill; `ungraded` when the wallet had no grade then; `unknown` when it cannot be known, for a trade before 2026-09-19 23:00 UTC or while a grade change is unconfirmed. Only `graded` trades match `min_grade_at_trade`. An event published before these fields shipped (November 2026), or a redelivery of one, carries neither. */
1833
+ grade_at_trade_status?: "graded" | "ungraded" | "unknown";
1829
1834
  };
1830
1835
  /** `large_trades_inserted` data (Pro and Max): new large trades were ingested. It carries a count and no trade; subscribe to `large_trade_inserted_v2` for the trade itself. The deprecated spelling `whale_trades_inserted` delivers the same object until its sunset on 2027-02-01 (#29352). */
1831
1836
  export type LargeTradesInsertedData = {
1832
1837
  /** Large trades the producing batch admitted. */
1833
1838
  count: number;
1834
1839
  };
1835
- /** All present fields narrow large_trade_inserted_v2 delivery. Grade is observed at publication; ungraded trades do not match min_grade. An empty object matches every large trade. */
1840
+ /** All present fields narrow large_trade_inserted_v2 delivery. min_grade reads the payload's grade, observed at publication; min_grade_at_trade reads its grade_at_trade, the grade when the trade filled. Send one of the two, not both (400). An empty object matches every large trade. */
1836
1841
  export type LargeTradeSubscriptionFilters = {
1837
1842
  /** Raw provider condition ID or mkt_-prefixed market ID. */
1838
1843
  condition_id?: string;
1839
1844
  /** Polymarket wallet address; matching is case-insensitive. */
1840
1845
  wallet?: string;
1841
- /** S is best; ungraded trades do not match. */
1846
+ /** S is best; ungraded trades do not match. Reads the wallet's grade when the trade was published, which for a backfilled trade can be hours after the fill. */
1842
1847
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
1848
+ /** S is best. Reads grade_at_trade, the grade the trader held when the trade filled; only a trade whose grade_at_trade_status is graded matches. The same basis as min_grade_at_trade on GET /api/v1/large-trades and GET /api/v1/stream. */
1849
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
1843
1850
  /** Positive USD notional as an exact decimal string. */
1844
1851
  min_size_usd?: string;
1845
1852
  };
@@ -1886,17 +1893,28 @@ export type LeaderboardEntry = {
1886
1893
  /** When the wallet last traded: its most recent recorded trade, as of the leaderboard row's last refresh, which re-reads it hourly, so a new trade can take about an hour to show. It agrees with the activity filter: every wallet listed under activity=inactive last traded more than 30 days ago. Since 2026-11-02 (#32322); before, it carried the time 0xinsider last synced the wallet, usually within the past week whether or not the wallet traded. Omitted when the wallet has no recorded trade. */
1887
1894
  last_active?: string;
1888
1895
  };
1896
+ /** Every league with a skill leaderboard, by sport: the league values GET /api/v1/leaderboard/sports/{sport} accepts. */
1889
1897
  export type LeaderboardLeagues = {
1898
+ /** Grouped by sport, then most ranked wallets first. */
1890
1899
  leagues: {
1900
+ /** The canonical sport, for example Soccer or Esports. */
1891
1901
  category: string;
1902
+ /** The league's display name. */
1892
1903
  name: string;
1904
+ /** Wallets the league board's edge sort ranks with no hold; at least min_ranked. */
1893
1905
  ranked_traders: number;
1906
+ /** The league slug, the board route's league parameter. */
1894
1907
  slug: string;
1908
+ /** The sport slug, the board route's {sport}. */
1895
1909
  sport: string;
1910
+ /** Wallets with at least min_resolved settled markets in the league and a trade in the last 180 days: the field the league board ranks. */
1896
1911
  total_traders: number;
1897
1912
  }[];
1913
+ /** Wallets a league board's edge sort must rank, with no hold, for the league to be listed. */
1898
1914
  min_ranked: number;
1915
+ /** Settled markets of $20 or more a wallet needs in a league to be on its board. */
1899
1916
  min_resolved: number;
1917
+ /** When the league ranking last ran. It runs about once a day. */
1900
1918
  refreshed_at: string;
1901
1919
  };
1902
1920
  /** Edge over the price paid (#32270): how often the side a wallet bought won, minus the average price it paid, over its settled sports and esports markets of $20 or more at a known entry price. Probabilities throughout: edge 0.12 is 12 percentage points. A wallet buying at 99 cents that wins every market has an edge of about 0.01. A market bought on both sides counts by its shares: the winning side's share of the shares bought is its hit, the cost over those shares its price. */
@@ -3004,6 +3022,8 @@ export type PickOfTheDayLedgerOpenedEntry = {
3004
3022
  supersedes_pick_id: string | null;
3005
3023
  /** Explicit proof provenance: 1 retains historic eight-field canonical JSON; 2 binds stable pick_id and version without pick_rank. */
3006
3024
  commitment_version: 1 | 2;
3025
+ /** How the pick was chosen: auto by the selection algorithm, manual by an operator (102 published picks from 2026-06-23 to 2026-10-15; none since). Outside the hashed payload, so it moves no commitment. */
3026
+ selected_by: "auto" | "manual";
3007
3027
  };
3008
3028
  /** An unresolved published pick. Carries only date, rank, hash, algorithm, seal instant and permalink. Kickoff and game identity are withheld; seal time remains public commitment provenance. */
3009
3029
  export type PickOfTheDayLedgerSealedEntry = {
@@ -3036,6 +3056,8 @@ export type PickOfTheDayLedgerSealedEntry = {
3036
3056
  supersedes_pick_id: string | null;
3037
3057
  /** Explicit proof provenance: 1 retains historic eight-field canonical JSON; 2 binds stable pick_id and version without pick_rank. */
3038
3058
  commitment_version: 1 | 2;
3059
+ /** How the pick was chosen: auto by the selection algorithm, manual by an operator (102 published picks from 2026-06-23 to 2026-10-15; none since). Outside the hashed payload, so it moves no commitment. */
3060
+ selected_by: "auto" | "manual";
3039
3061
  };
3040
3062
  /** A pick without a commitment, retained so the record cannot omit unprovable entries. Unresolved entries omit game identity; once resolved, matchup, category and payload become public. Existing opened canonical payload bytes and hashes are unchanged. */
3041
3063
  export type PickOfTheDayLedgerUncommittedEntry = {
@@ -3074,6 +3096,8 @@ export type PickOfTheDayLedgerUncommittedEntry = {
3074
3096
  * @deprecated
3075
3097
  */
3076
3098
  supersedes_pick_id: string | null;
3099
+ /** How the pick was chosen: auto by the selection algorithm, manual by an operator (102 published picks from 2026-06-23 to 2026-10-15; none since). Outside the hashed payload, so it moves no commitment. */
3100
+ selected_by: "auto" | "manual";
3077
3101
  };
3078
3102
  /** A successful current-day entitlement response when only unauthorized ranks have published. It carries an empty pick set, identity-free locked ranks and an upgrade message. Selection IDs, game identity, prices and unauthorized clocks are absent. Any scheduled or proof-pending rows are entitled rows. */
3079
3103
  export type PickOfTheDayNoEntitledPicks = {
@@ -3498,6 +3522,37 @@ export type PickOfTheDayStats = {
3498
3522
  pick_id: string;
3499
3523
  pick_rank: number;
3500
3524
  }[];
3525
+ selections: {
3526
+ canonical_category?: string;
3527
+ clv_avg_display?: string;
3528
+ clv_avg_pct?: number;
3529
+ clv_avg_pp?: number;
3530
+ clv_avg_pp_display?: string;
3531
+ clv_measured: number;
3532
+ edge_display?: string;
3533
+ edge_pp?: number;
3534
+ key: string;
3535
+ label: string;
3536
+ losses: number;
3537
+ net_profit_display?: string;
3538
+ net_profit_usd?: number;
3539
+ pending: number;
3540
+ picks: number;
3541
+ priced_decided: number;
3542
+ priced_in_display?: string;
3543
+ priced_in_pct?: number;
3544
+ roi_display?: string;
3545
+ roi_pct?: number;
3546
+ settled: number;
3547
+ small_sample: boolean;
3548
+ staked_usd: number;
3549
+ unit_score?: number;
3550
+ unit_score_display?: string;
3551
+ void: number;
3552
+ win_rate_display?: string;
3553
+ win_rate_pct?: number;
3554
+ wins: number;
3555
+ }[];
3501
3556
  };
3502
3557
  /** The stats with `view=summary` or `sections`: only the named sections, listed in `sections`. `view=summary` names every section except `series`, `days`, `categories`, `months` and `voids`. */
3503
3558
  export type PickOfTheDayStatsSections = {
@@ -3938,6 +3993,37 @@ export type PickOfTheDayStatsSections = {
3938
3993
  pick_id: string;
3939
3994
  pick_rank: number;
3940
3995
  }[];
3996
+ selections?: {
3997
+ canonical_category?: string;
3998
+ clv_avg_display?: string;
3999
+ clv_avg_pct?: number;
4000
+ clv_avg_pp?: number;
4001
+ clv_avg_pp_display?: string;
4002
+ clv_measured: number;
4003
+ edge_display?: string;
4004
+ edge_pp?: number;
4005
+ key: string;
4006
+ label: string;
4007
+ losses: number;
4008
+ net_profit_display?: string;
4009
+ net_profit_usd?: number;
4010
+ pending: number;
4011
+ picks: number;
4012
+ priced_decided: number;
4013
+ priced_in_display?: string;
4014
+ priced_in_pct?: number;
4015
+ roi_display?: string;
4016
+ roi_pct?: number;
4017
+ settled: number;
4018
+ small_sample: boolean;
4019
+ staked_usd: number;
4020
+ unit_score?: number;
4021
+ unit_score_display?: string;
4022
+ void: number;
4023
+ win_rate_display?: string;
4024
+ win_rate_pct?: number;
4025
+ wins: number;
4026
+ }[];
3941
4027
  };
3942
4028
  /** A settled uncommitted pick's market, side and price. The same eight fields as PickOfTheDayCommitmentPayload, in the same key order, so a settled pick's side and price sit under payload whatever the entry's state. It is NOT a commitment: no hash was taken over it before the game, and it proves nothing about when the pick was made. */
3943
4029
  export type PickOfTheDayUncommittedPayload = {
@@ -4525,48 +4611,88 @@ export type SnapshotState = {
4525
4611
  /** When this body's source read started, the clock finality is judged on. null for a body stored before that clock was recorded. */
4526
4612
  source_read_started_at: string | null;
4527
4613
  };
4614
+ /** One sport's skill leaderboard, or one league's. Every figure on a row is the wallet's record in this sport or league, except grade, the wallet's all-time grade, and volume (see volume_scope). */
4528
4615
  export type SportLeaderboard = {
4616
+ /** The latest time any wallet's record on this board was recomputed. The sport ranking reruns hourly, a league ranking about once a day. null when the board has no rows. */
4529
4617
  as_of: string | null;
4618
+ /** The canonical sport the slug resolved to, for example Soccer or Basketball. null when no wallet has a record under it; rows is then empty. */
4530
4619
  category: string | null;
4620
+ /** The mean edge over every wallet in the field whose price_edge.status is ranked, held ones included: the value each row's edge_skill is pulled toward. null when no wallet's edge is ranked. */
4531
4621
  edge_average: number | null;
4622
+ /** The league this board ranks; null on a sport board. */
4532
4623
  league: {
4624
+ /** The league's display name. */
4533
4625
  name: string;
4626
+ /** Wallets the league board's edge sort ranks with no hold. */
4534
4627
  ranked_traders: number;
4628
+ /** The league's slug under its sport, for example premier-league or cs2. */
4535
4629
  slug: string;
4536
4630
  } | null;
4631
+ /** The requested limit after clamping to 1..100 (default 20). rows holds fewer when the board has fewer wallets. */
4537
4632
  limit: number;
4633
+ /** Settled markets of $20 or more a wallet needs in the sport or league to be on the board. */
4538
4634
  min_resolved: number;
4635
+ /** The head of the board, in sort order. Every figure is the wallet's record in this sport or league, except grade (all-time) and volume (see volume_scope). */
4539
4636
  rows: ({
4637
+ /** Lowercase proxy wallet. */
4540
4638
  address: string;
4639
+ /** What the wallet paid, USD, for the settled markets pnl counts. null when any of them has no stored cost, never a partial sum. */
4541
4640
  cost: number | null;
4641
+ /** Why sort=edge sets aside an edge whose status is ranked. category_loss: the wallet's realized P&L in this sport or league is zero or below. record_incomplete: the wallet's stored sports and esports P&L runs more than 5% of its cost ahead of Polymarket's own figure, so settled losing markets are likely missing from its record. A held row keeps its price_edge and edge_skill and sorts after the ranked rows on sort=edge. null when nothing holds the edge, and always null unless price_edge.status is ranked. */
4542
4642
  edge_hold: "category_loss" | "record_incomplete" | null;
4643
+ /** price_edge.edge pulled toward edge_average by the share of the record that is noise: a short record moves most of the way to the average, a long one keeps nearly all of its own edge. The value sort=edge orders by when edge_hold is null. null unless price_edge.status is ranked. */
4543
4644
  edge_skill: number | null;
4645
+ /** The wallet's all-time grade, S to F, the one every route serves. It is led by realized profit across all of the wallet's sports and esports markets, not this sport's or league's, so a wallet can lead a board on in-sport P&L and still grade F. Every letter is listed: the board ranks the in-sport record and does not filter on the grade. null when the wallet has no grade. */
4544
4646
  grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
4647
+ /** trd_0x..., the id the trader routes accept. */
4545
4648
  id: string;
4649
+ /** The wallet's last trade on a settled market of $20 or more in this sport or league. */
4546
4650
  last_category_trade_at: string | null;
4651
+ /** Markets n_resolved counts that settled at a realized loss. A market that broke even counts in neither wins nor losses. */
4547
4652
  losses: number;
4653
+ /** The wallet's settled markets of $20 or more in this sport or league; at least min_resolved. */
4548
4654
  n_resolved: number;
4655
+ /** Provider platform. Always polymarket. */
4549
4656
  platform: "polymarket";
4657
+ /** Realized P&L, USD, across the markets n_resolved counts: this sport or league only, not the wallet's whole record. The value sort=pnl orders by. */
4550
4658
  pnl: number | null;
4659
+ /** Edge over the price paid in this sport or league: how often the side the wallet bought won, minus the average price it paid. Probabilities throughout: edge 0.03 is 3 percentage points. A market bought on both sides counts by its shares. null when the wallet has no priced settled market here. */
4551
4660
  price_edge: {
4661
+ /** Mean entry price paid, 0-1. */
4552
4662
  avg_price: number;
4663
+ /** hit_rate minus avg_price, full precision, before any shrink. edge_skill is the shrunk value. */
4553
4664
  edge: number;
4665
+ /** The low end of edge's 95% range: edge minus 1.96 times the square root of avg_price * (1 - avg_price) / markets. Not a sort key: sort=edge orders by edge_skill. */
4554
4666
  edge_lower: number;
4667
+ /** Share of those markets whose bought side won, 0-1. A market bought on both sides adds the winning side's share of the shares bought. */
4555
4668
  hit_rate: number;
4669
+ /** Settled markets of $20 or more in this sport or league at a known entry price that the edge is measured over. */
4556
4670
  markets: number;
4671
+ /** Whether the edge ranks. ranked: at least 30 such markets, and the share of the decided ones that made money at settlement within 10 points of the win rate here. too_few_markets: fewer than 30. sample_mismatch: that share is more than 10 points away, so these markets do not describe the wallet's record. Only a ranked edge with a null edge_hold orders on sort=edge. */
4557
4672
  status: "ranked" | "too_few_markets" | "sample_mismatch";
4558
4673
  } | null;
4674
+ /** 1-based position on this board under sort. A page of limit rows is the head of the board. */
4559
4675
  rank: number;
4676
+ /** pnl / cost, a fraction: 0.12 is 12%. null when cost is null. */
4560
4677
  roi: number | null;
4678
+ /** The wallet's Polymarket username; null when it has none. */
4561
4679
  username: string | null;
4680
+ /** USD, measured as volume_scope says. On a sport board: the wallet's volume across all its sports and esports markets, the profile's Volume traded, not this sport's alone. null on every league board row: no per-league volume is stored. */
4562
4681
  volume: number | null;
4682
+ /** wins / (wins + losses) in this sport or league, 0-1: 0.6 is 60%. null when no market was decided. */
4563
4683
  win_rate: number | null;
4684
+ /** The lower bound of the 95% Wilson interval on win_rate, 0-1: the value sort=win_rate orders by, so a short perfect record does not outrank a long strong one. null with win_rate. */
4564
4685
  win_rate_wilson_lb: number | null;
4686
+ /** Markets n_resolved counts that settled at a realized profit. */
4565
4687
  wins: number;
4566
4688
  })[];
4689
+ /** The order rows are in. edge: by edge_skill, with every wallet whose edge is not ranked, or is held, after the ranked ones. pnl: by realized P&L in the sport or league. win_rate: by the Wilson lower bound of the win rate. */
4567
4690
  sort: "edge" | "pnl" | "win_rate";
4691
+ /** The board's sport slug, for example soccer, basketball or esports. An alias in the path, such as nba or cs2, reads as its sport's slug. */
4568
4692
  sport: string;
4693
+ /** Wallets with at least min_resolved settled markets in the sport or league and a trade, in any market, in the last 180 days: the field rows is the head of. */
4569
4694
  total_traders: number;
4695
+ /** What each row's volume measures. sports_and_esports: the wallet's volume across all its sports and esports markets, not this sport's or league's alone. */
4570
4696
  volume_scope: "sports_and_esports";
4571
4697
  };
4572
4698
  export type SuspiciousTrade = {
@@ -6421,8 +6547,10 @@ export interface OperationQuery {
6421
6547
  trader?: string;
6422
6548
  /** Only trades on this market: the raw provider condition_id or its mkt_-prefixed id. Bound to the cursor. */
6423
6549
  condition_id?: string;
6424
- /** Only trades by wallets at this grade or better (S best), read from the wallet's newest ranking at request time; a wallet with no grade never passes. Bound to the cursor. */
6550
+ /** Only trades by wallets at this grade or better (S best), read from the wallet's newest ranking at request time; a wallet with no grade never passes. For the grade the wallet held when the trade filled, send min_grade_at_trade instead. Bound to the cursor. */
6425
6551
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
6552
+ /** Only trades whose grade_at_trade, the grade the wallet held when the trade filled, is at this grade or better (S best). Only a trade whose grade at the fill is graded passes, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/large-trades, GET /api/v1/stream and webhook trade_filters. Bound to the cursor: switching between min_grade and min_grade_at_trade is a filter change and answers cursor_expired. Sending it with min_grade, or an invalid grade, returns HTTP 400. */
6553
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6426
6554
  /** Only trades of at least this USD amount. Decimal and scientific query spellings normalize exactly to cents, rounding half away from zero; maximum 1e15 USD. Pass the dataset continuation decimal string unchanged to preserve the bound. Bound to the cursor. */
6427
6555
  min_size?: number | string;
6428
6556
  /** Backward-compatible alias for expand. Repeatable: trade. */
@@ -6491,7 +6619,7 @@ export interface OperationQuery {
6491
6619
  date?: string;
6492
6620
  /** full (default) is the whole recorded set: every pick with its holders, lead backer, sports context, thesis and entry_authorization, and the top-level copy of the first pick. summary returns pick_date, pick_count, the disclaimer once, and each entitled pick's identity, side, price, result, return and grade (pick_id, publication_order, is_free_selection, matchup, category, display_category, event_slug, polymarket_url, token_id, pick_outcome_label, outcome, backed_price, stake_usd, return_usd, unit_score, top_grade, holder_count, clv_status, clv_pct, release_at, game_started, game_ended), with the same scheduled_picks, proof_pending_picks and locked_picks. The locked-only state=none body is the same in both views. Any other value returns 400 bad_request with error.param=view. */
6493
6621
  view?: "full" | "summary";
6494
- /** One entitled published pick of the day, by its stable decimal-string pick_id. The body is the usual set holding that pick alone, without scheduled_picks, proof_pending_picks or locked_picks. Pair it with date for a past day's pick. A pick_id that is not among the day's entitled published picks returns 404 not_found with error.param=pick_id; one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
6622
+ /** One entitled published pick of the day, by its stable decimal-string pick_id. The body carries that pick once, as picks[0], beside state, pick_date and pick_count=1. It leaves out the top-level copy of the first pick that a set read without pick_id repeats, and scheduled_picks, proof_pending_picks and locked_picks. Pair it with date for a past day's pick. A pick_id that is not among the day's entitled published picks returns 404 not_found with error.param=pick_id; one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
6495
6623
  pick_id?: string;
6496
6624
  };
6497
6625
  getPickOfTheDayArchive: {
@@ -6507,10 +6635,10 @@ export interface OperationQuery {
6507
6635
  getPickOfTheDayStats: {
6508
6636
  /** full (default) is every section. summary returns view, sections and every section except the five that grow with the record: series, days, categories, months and voids. In summary and sections bodies hit_rate carries no series; series is its own top-level section. Ignored when sections is sent. Any other value returns 400 bad_request with error.param=view. */
6509
6637
  view?: "full" | "summary";
6510
- /** Exactly the sections to return, in the body's order whatever the request order. Repeatable and comma-separated: hit_rate, series, market_expectations, outcome_stats, days, categories, sports, tiers, months, price_bands, market_types, total_sides, streaks, records, voids. The body names them in sections and carries view=sections. An unrecognized name returns 400 bad_request with error.param=sections rather than being ignored. */
6511
- sections?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6638
+ /** Exactly the sections to return, in the body's order whatever the request order. Repeatable and comma-separated: hit_rate, series, market_expectations, outcome_stats, days, categories, sports, tiers, selections, months, price_bands, market_types, total_sides, streaks, records, voids. The body names them in sections and carries view=sections. An unrecognized name returns 400 bad_request with error.param=sections rather than being ignored. */
6639
+ sections?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "selections" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6512
6640
  /** Backward-compatible bracket alias for sections, for clients that emit array keys. Repeatable and comma-separated, with the same names. */
6513
- "sections[]"?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6641
+ "sections[]"?: ("hit_rate" | "series" | "market_expectations" | "outcome_stats" | "days" | "categories" | "sports" | "tiers" | "selections" | "months" | "price_bands" | "market_types" | "total_sides" | "streaks" | "records" | "voids")[];
6514
6642
  };
6515
6643
  getPlatforms: Record<string, never>;
6516
6644
  getPositionTimeline: {
@@ -6558,8 +6686,10 @@ export interface OperationQuery {
6558
6686
  event?: string;
6559
6687
  /** Optional per-connection subscribe-time filter. Raw provider condition_id or mkt_-prefixed market id (normalized the same way the other v1 market endpoints normalize). A frame passes only when it carries a matching condition_id field; frames that carry no condition_id (e.g. whale-pulse events) are EXCLUDED while this is set. An empty value after normalization returns HTTP 400. Combines with event and min_grade as a logical AND; an absent param adds no constraint. */
6560
6688
  condition_id?: string;
6561
- /** Optional per-connection subscribe-time filter. A frame passes only when it carries a grade field whose grade is better-or-equal to this minimum (S is best). Frames without a grade (every frame except wallet_grade_changed and LargeTradeInsertedV2) are excluded. An invalid grade returns HTTP 400. Combines with the other filters as a logical AND. */
6689
+ /** Optional per-connection subscribe-time filter. A frame passes only when it carries a grade field whose grade is better-or-equal to this minimum (S is best). On a LargeTradeInsertedV2 frame that field is grade, the wallet's grade when the trade was published: seconds after the fill for a live trade, hours after it for a backfilled one, so it is not always the grade the trade filled under. For that, send min_grade_at_trade instead. Frames without a grade (every frame except wallet_grade_changed and LargeTradeInsertedV2) are excluded. An invalid grade returns HTTP 400. Combines with the other filters as a logical AND. */
6562
6690
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
6691
+ /** Filter LargeTradeInsertedV2 frames to trades whose grade_at_trade, the grade the trader held when the trade filled, is at or above this minimum (S is best). Only a frame whose grade_at_trade_status is graded can match. The same basis as min_grade_at_trade on GET /api/v1/large-trades and on webhook trade_filters. Other event types are excluded when set. Sending it with min_grade, or an invalid grade, returns HTTP 400. */
6692
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6563
6693
  /** Filter LargeTradeInsertedV2 frames to this Polymarket wallet. Other event types have no wallet and are excluded when set. Applied to live and retained Redis frames after privacy checks. */
6564
6694
  wallet?: string;
6565
6695
  /** Filter LargeTradeInsertedV2 frames to trades at or above this USD notional. Positive decimal with at most six places; other event types are excluded when set. */
@@ -6732,8 +6862,10 @@ export interface OperationQuery {
6732
6862
  trader?: string;
6733
6863
  /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6734
6864
  category?: string;
6735
- /** Minimum trader grade as of today (trader.grade), not at trade time. On a historical window it selects wallets by a grade they may have earned after the trade; for a point-in-time rule filter on trader.grade_at_trade instead. A means S or A, B means S, A or B. */
6865
+ /** Minimum trader grade as of today (trader.grade), not at trade time. On a historical window it selects wallets by a grade they may have earned after the trade; for a point-in-time rule send min_grade_at_trade instead, which filters on trader.grade_at_trade. A means S or A, B means S, A or B. */
6736
6866
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
6867
+ /** Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/large-trades, GET /api/v1/stream and webhook trade_filters, so a history read and a stream with the same floor agree. Applies to both sorts and beside condition_id, event_slug, trader and from/to. Sending it with min_grade is 400. A means S or A, B means S, A or B. */
6868
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6737
6869
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
6738
6870
  suspicious_only?: boolean;
6739
6871
  /** Filter by whale_alerts.platform. all is equivalent to omitted. */
@@ -6758,8 +6890,10 @@ export interface OperationQuery {
6758
6890
  min_size?: number;
6759
6891
  /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6760
6892
  category?: string;
6761
- /** Minimum trader grade. */
6893
+ /** Minimum trader grade now (trader.grade), the wallet's grade when this page is read, not when the trade filled. A wallet re-graded after a trade enters or leaves the result, so a catch-up read can disagree with GET /api/v1/stream and webhooks. For the grade at the fill, send min_grade_at_trade instead. A means S or A, B means S, A or B. */
6762
6894
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
6895
+ /** Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/stream and on webhook trade_filters, so a client that catches up here and then streams gets one answer. Applies to every path: recent, since, sort=market_volume_share, condition_id and event_slug. Sending it with min_grade is 400. A means S or A, B means S, A or B. */
6896
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6763
6897
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
6764
6898
  suspicious_only?: boolean;
6765
6899
  /** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */
@@ -6911,6 +7045,8 @@ export interface OperationQuery {
6911
7045
  category?: string;
6912
7046
  /** Minimum trader grade. */
6913
7047
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
7048
+ /** Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/large-trades, GET /api/v1/stream and webhook trade_filters, so a history read and a stream with the same floor agree. Applies to both sorts and beside condition_id, event_slug, trader and from/to. Sending it with min_grade is 400. A means S or A, B means S, A or B. */
7049
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6914
7050
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
6915
7051
  suspicious_only?: boolean;
6916
7052
  /** Filter by whale_alerts.platform. all is equivalent to omitted. */
@@ -6935,8 +7071,10 @@ export interface OperationQuery {
6935
7071
  min_size?: number;
6936
7072
  /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657). */
6937
7073
  category?: string;
6938
- /** Minimum trader grade as of today (trader.grade). A means S or A, B means S, A or B. */
7074
+ /** Minimum trader grade now (trader.grade), the wallet's grade when this page is read, not when the trade filled. A wallet re-graded after a trade enters or leaves the result, so a catch-up read can disagree with GET /api/v1/stream and webhooks. For the grade at the fill, send min_grade_at_trade instead. A means S or A, B means S, A or B. */
6939
7075
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
7076
+ /** Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/stream and on webhook trade_filters, so a client that catches up here and then streams gets one answer. Applies to every path: recent, since, sort=market_volume_share, condition_id and event_slug. Sending it with min_grade is 400. A means S or A, B means S, A or B. */
7077
+ min_grade_at_trade?: "S" | "A" | "B" | "C" | "D" | "F";
6940
7078
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
6941
7079
  suspicious_only?: boolean;
6942
7080
  /** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */