@0xinsider/sdk 0.43.0 → 0.44.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.
package/dist/schema.d.ts CHANGED
@@ -670,10 +670,12 @@ export type EdgeHunterObservation = {
670
670
  directional_confidence: number | null;
671
671
  /** Recorded side ordering score; higher values sort first. */
672
672
  directional_rank_score: number;
673
- /** 1-based rank within this observation cohort and snapshot. */
673
+ /** 1-based rank within this observation cohort and snapshot: directional_rank_score descending, then conviction_score descending, then category and condition_id. Admission decides which markets a response holds, not their rank, so under admission=most_held_48h or most_held_48h_by_type rank does not follow indexed_graded_holders. */
674
674
  rank: number;
675
675
  /** Required nullable frozen metadata context. Null only during the legacy-generation transition; selected reads require sidecar readiness and fail closed with 503 instead. */
676
676
  market_context: EdgeHunterMarketContext | null;
677
+ /** S, A and B graded wallets in the 0xinsider index holding either outcome of the market, as the stored market universe last counted them. Every most-held place ranks by this count: admission=most_held_48h and most_held_48h_by_type, the default selection's most_held places and in_play slots. It can be larger or smaller than graded_holders, which counts the piled side of the provider's holder page. Null only on a row of a generation computed before this field existed. */
678
+ indexed_graded_holders: number | null;
677
679
  };
678
680
  /** Measured coverage of the frozen canonical observation generation and this requested page. For sports and esports reads, the first four counts remain global through category, cohort and all selectors; with admission=most_held_48h they count that selection's generation, where every wider_holder candidate it did not take is capacity_limited. They are neither a census of all provider markets nor a count of successfully evaluated holders. Selected and returned counts describe the requested projection. An unmappable legacy category synthesizes a zero-work empty generation with all six counts zero and no degradation reasons; it does not read the all-sports cache. */
679
681
  export type EdgeHunterObservationCoverage = {
@@ -1407,6 +1409,7 @@ export type GameMarket = {
1407
1409
  status: "observed" | "not_posed" | "unavailable";
1408
1410
  was_disputed: boolean | null;
1409
1411
  winning_outcome_index: number | null;
1412
+ oracle_updated_at: string | null;
1410
1413
  };
1411
1414
  };
1412
1415
  /** One market's liquidity as Polymarket reports it (Gamma liquidityNum), verbatim. Polymarket documents it only as reported market liquidity, with no unit. It describes the market's resting order book, not traded volume. */
@@ -2205,7 +2208,7 @@ export type MarketHolder = {
2205
2208
  /** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (under the floor of 5 decided markets in the category), or `unavailable` (the market has no canonical category, or the read failed; retry later). Never `untracked`: this route lists S, A and B wallets only, all on file. Always present on this route. */
2206
2209
  category_win_rate_status: "measured" | "not_enough_data" | "unavailable" | "untracked";
2207
2210
  category_evidence?: HolderCategoryEvidence;
2208
- /** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
2211
+ /** Whole UTC calendar days since this wallet's first trade: the number of UTC dates from the first trade's date to today, so a first trade at 23:00 UTC reads 1 an hour later. Every wallet's age changes at 00:00 UTC, once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
2209
2212
  wallet_age_days?: number | null;
2210
2213
  /** True when the wallet's first trade was under 30 days ago. */
2211
2214
  is_new_wallet?: boolean;
@@ -2344,7 +2347,7 @@ export type MarketSearchResult = {
2344
2347
  status: "active" | "closed";
2345
2348
  event_slug?: string;
2346
2349
  };
2347
- /** `market_settled` data, also the MarketSettled frame on GET /api/v1/stream: a sports or esports game market settled, sent once per settled state the first time 0xinsider records it. A market can settle in two states, a resolved UMA question row without payouts and then the condition row with them; each is its own event with its own settlement_id. */
2350
+ /** `market_settled` data, also the MarketSettled frame on GET /api/v1/stream: a sports or esports game market settled, sent once per settled state the first time 0xinsider records it. A market can settle in more than one state: a resolved UMA question row with no winner yet, the same row with the winner ConditionalTokens paid on chain, and the condition row with the provider's payouts; each is its own event with its own settlement_id, except a state naming the winner an earlier event named, which is not sent. */
2348
2351
  export type MarketSettledData = {
2349
2352
  /** Polymarket condition ID of the market, lowercase. */
2350
2353
  condition_id: string;
@@ -2354,7 +2357,7 @@ export type MarketSettledData = {
2354
2357
  event_slug: string | null;
2355
2358
  /** Polymarket game ID for the event as a string, the game_id of GET /api/v1/games, or null when the market stores none. */
2356
2359
  game_id: string | null;
2357
- /** The event slug league prefix (nba in nba-lal-gsw-2026-11-01), lowercase, read after a polyv2 copy prefix; null when the slug has none. */
2360
+ /** The event slug league prefix (nba in nba-lal-gsw-2026-11-01), lowercase, read after a polyv2 copy prefix. A PGA Tour golf slug starts with the year, so its markets are pga, from their series. null when neither names a league. */
2358
2361
  league: string | null;
2359
2362
  /** Polymarket sportsMarketType of the market (moneyline, spreads, totals, a prop type) verbatim, or null when the market stores none. */
2360
2363
  sports_market_type: string | null;
@@ -2362,7 +2365,7 @@ export type MarketSettledData = {
2362
2365
  outcomes: string[];
2363
2366
  /** Set on a Polymarket polyv2 copy of a game whose original event has a moneyline market: the original event slug, which GET /api/v1/games serves. Such a copy reaches a webhook only when its settlement_filters name its condition ID or its own event slug. */
2364
2367
  copy_of_event_slug: string | null;
2365
- /** The settled state, the block GET /api/v1/games/{event_slug}/markets serves as settlement: status observed, oracle_status resolved, settled true. payouts is null on a resolved UMA question row and set on the condition row that follows, which is sent as its own event. observed_at is when 0xinsider first saw this state. */
2368
+ /** The settled state, the block GET /api/v1/games/{event_slug}/markets serves as settlement: status observed, oracle_status resolved, settled true. payouts is null on a resolved UMA question row, whose result and winning_outcome_index come from the payout ConditionalTokens reported on chain (null in an event sent before it paid), and set on the condition row that follows, sent as its own event unless it names a winner already sent. observed_at is when 0xinsider first saw this state. */
2366
2369
  settlement: {
2367
2370
  expected_settlement_time: string | null;
2368
2371
  observed_at: string | null;
@@ -2376,6 +2379,7 @@ export type MarketSettledData = {
2376
2379
  status: "observed" | "not_posed" | "unavailable";
2377
2380
  was_disputed: boolean | null;
2378
2381
  winning_outcome_index: number | null;
2382
+ oracle_updated_at: string | null;
2379
2383
  };
2380
2384
  };
2381
2385
  export type MarketSnapshot = {
@@ -2461,6 +2465,7 @@ export type MarketSnapshot = {
2461
2465
  status: "observed" | "not_posed" | "unavailable";
2462
2466
  was_disputed: boolean | null;
2463
2467
  winning_outcome_index: number | null;
2468
+ oracle_updated_at: string | null;
2464
2469
  };
2465
2470
  };
2466
2471
  export type MarketSnapshotFreshness = {
@@ -2536,7 +2541,7 @@ export type MarketTopHolder = {
2536
2541
  category_win_rate_game?: string;
2537
2542
  /** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (the wallet is on file and under the floor of 5 decided markets in the category), `untracked` (0xinsider has no record of the wallet, so nothing was measured; `grade`, `in_scope_realized_pnl` and `in_scope_volume` are null too), or `unavailable` (a read failed; retry later). Absent when the market has no canonical category. */
2538
2543
  category_win_rate_status?: "measured" | "not_enough_data" | "unavailable" | "untracked";
2539
- /** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
2544
+ /** Whole UTC calendar days since this wallet's first trade: the number of UTC dates from the first trade's date to today, so a first trade at 23:00 UTC reads 1 an hour later. Every wallet's age changes at 00:00 UTC, once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
2540
2545
  wallet_age_days?: number | null;
2541
2546
  /** True when the wallet's first trade was under 30 days ago. */
2542
2547
  is_new_wallet?: boolean;
@@ -2577,6 +2582,33 @@ export type MarketTopHoldersTotals = {
2577
2582
  /** The most holders the sample keeps per outcome (100). */
2578
2583
  sample_cap: number;
2579
2584
  };
2585
+ /** One taker fill of 100 USD or more on a market, from the exchange's on-chain fill events. */
2586
+ export type MarketTrade = {
2587
+ /** {transaction_hash}:{log_index}: one fill event, listed once. Deduplicate on it across reads. */
2588
+ id: string;
2589
+ /** The fill's block time, to the second. */
2590
+ traded_at: string;
2591
+ /** The taker's side: BUY took outcome shares, SELL gave them. */
2592
+ side: "BUY" | "SELL";
2593
+ /** The traded outcome's label; null when the market names none. */
2594
+ outcome: string | null;
2595
+ /** 0 for the first (Yes) outcome token, 1 for the second (No). */
2596
+ outcome_index: number;
2597
+ /** The traded outcome token's id (decimal string); null when the market holds none for that outcome. */
2598
+ token_id: string | null;
2599
+ /** Fill price per share, 0 to 1. */
2600
+ price: number;
2601
+ /** Outcome shares filled. */
2602
+ shares: number;
2603
+ /** USDC notional of the fill. */
2604
+ size_usd: number;
2605
+ /** The taker's wallet, lowercase. */
2606
+ taker: string;
2607
+ /** The fill's transaction, lowercase 0x hex. */
2608
+ transaction_hash: string;
2609
+ /** The fill event's log index in its transaction. */
2610
+ log_index: number;
2611
+ };
2580
2612
  /** One market's net buyers and net sellers over a 24h or 7d window, as the market page's wallets in/out panel shows a Pro viewer. */
2581
2613
  export type MarketWalletsInOut = {
2582
2614
  /** The market's raw provider condition id. */
@@ -2652,7 +2684,7 @@ export type PickHolder = {
2652
2684
  name: string | null;
2653
2685
  /** All-time trader grade (S, A, B, C, D, F). */
2654
2686
  grade: string | null;
2655
- /** The wallet's most recent recorded trade time, stamped at serve time from its current trader record rather than frozen with the pick. Always sent; null when no trade time is recorded. */
2687
+ /** The UTC day of the wallet's most recent recorded trade, served as that day's 00:00:00Z, stamped at serve time from its current trader record rather than frozen with the pick. It changes at most once a day per wallet, so the pick's ETag holds between polls. Always sent; null when no trade time is recorded. */
2656
2688
  last_traded_at: string | null;
2657
2689
  /** 0xinsider profile path segment this wallet links to: `@<username>` when that username resolves to this wallet alone, otherwise the lowercase wallet. Percent-encode the part after `@` and append to `https://0xinsider.com/profile/`. Stamped at serve time; absent on a body cached before the field shipped. */
2658
2690
  profile_segment?: string;
@@ -2676,7 +2708,7 @@ export type PickHolder = {
2676
2708
  category_win_rate_game?: string;
2677
2709
  /** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the settled-market floor of 5 in the category), or `unavailable` (the annotation read failed; retry later). Never `untracked`: every recorded holder is a graded wallet 0xinsider has on file. Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample. */
2678
2710
  category_win_rate_status?: "measured" | "not_enough_data" | "unavailable" | "untracked";
2679
- /** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request, and the pick's ETag holds between requests. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
2711
+ /** Whole UTC calendar days since this wallet's first trade: the number of UTC dates from the first trade's date to today, so a first trade at 23:00 UTC reads 1 an hour later. Every wallet's age changes at 00:00 UTC, once a day, not on every request, and the pick's ETag holds between requests. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
2680
2712
  wallet_age_days?: number | null;
2681
2713
  /** True when the wallet's first trade was under 30 days ago. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
2682
2714
  is_new_wallet?: boolean;
@@ -2686,6 +2718,32 @@ export type PickHolder = {
2686
2718
  is_bot?: boolean;
2687
2719
  /** The wallet's X handle from its Polymarket profile, normalized to 1-15 characters of [A-Za-z0-9_] with no `@`. Link it as `https://x.com/<handle>`. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
2688
2720
  x_username?: string | null;
2721
+ /** The wallet's edge over the price it paid in the pick's canonical category (`category`): how often the side it bought won, minus the average price it paid, over its settled markets there of $20 or more at a known entry price. The rule the site's sport leaderboards use for their Edge column, and the figure the pick card prints on the sport's line. Not `category_win_rate` minus `category_avg_price`: the edge counts its own sample. Present only with `category_win_rate_status` = `measured`, when the edge ranks (30 or more such markets, and the share of the decided ones that made money at settlement within 10 points of the win rate) and the wallet's realized P&L over them is above zero; otherwise `category_price_edge_hold` says why. Beside `category_win_rate_game` it is still the whole category's edge; the game's or league's is `category_scope_price_edge`. Recomputed at serve time from the daily record rebuild, not frozen with the pick. Absent otherwise and on payloads predating the field. */
2722
+ category_price_edge?: PickHolderPriceEdge;
2723
+ /** The same edge over the markets of the game or league `category_win_rate_game` names alone: the edge the pick card prints beside a game or league win rate (for example `-17.1 pp` in the Premier League). Present only beside `category_win_rate_game`, under the same rule over that game's or league's markets and the wallet's realized P&L there; otherwise, beside a game or league rate, `category_scope_price_edge_hold` says why. Never the whole category's edge in its place. Recomputed at serve time, not frozen with the pick. Absent otherwise and on payloads predating the field. */
2724
+ category_scope_price_edge?: PickHolderPriceEdge;
2725
+ /** Why there is no `category_price_edge` for a wallet with a measured rate, with the rule's figures when it has them. Present only with `category_win_rate_status` = `measured`, and never beside `category_price_edge`. Absent otherwise and on payloads predating the field. */
2726
+ category_price_edge_hold?: PickHolderPriceEdgeHold;
2727
+ /** Why there is no `category_scope_price_edge` beside a game or league rate, with the rule's figures when it has them. Present only beside `category_win_rate_game`, and never beside `category_scope_price_edge`. Absent otherwise and on payloads predating the field. */
2728
+ category_scope_price_edge_hold?: PickHolderPriceEdgeHold;
2729
+ };
2730
+ /** Edge over the price paid in one category, game or league: how often the side a wallet bought won, minus the average price it paid, over its settled markets there of $20 or more at a known entry price. Probabilities throughout: edge -0.171 is -17.1 percentage points. 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. Figures from the daily record rebuild. */
2731
+ export type PickHolderPriceEdge = {
2732
+ /** Settled markets of $20 or more at a known entry price that the edge is measured over. */
2733
+ markets: number;
2734
+ /** Share of those markets whose bought side won, 0-1. */
2735
+ hit_rate: number;
2736
+ /** Mean entry price paid over the same markets, 0-1. Its sample is these markets, so it can differ from `category_avg_price` and `category_scope_avg_price`. */
2737
+ avg_price: number;
2738
+ /** hit_rate minus avg_price, full precision. */
2739
+ edge: number;
2740
+ };
2741
+ /** An edge the holder row does not show, and why. */
2742
+ export type PickHolderPriceEdgeHold = {
2743
+ /** category_loss: the edge ranks, and the wallet's realized P&L over the same markets is zero or below. too_few_markets: fewer than 30 counted markets. sample_mismatch: the share of the decided markets that made money at settlement is more than 10 points from the win rate over the same markets, so these markets do not describe the wallet's record. no_markets: no settled market of $20 or more at a known entry price. */
2744
+ hold: "category_loss" | "too_few_markets" | "sample_mismatch" | "no_markets";
2745
+ /** The rule's figures, as a shown edge carries them. Omitted for no_markets, and for too_few_markets when the wallet has fewer than 5 such markets. */
2746
+ record?: PickHolderPriceEdge;
2689
2747
  };
2690
2748
  /** Recorded lead wallet facts on a full response when available. Position and category history are frozen at publication; they are not live balances or pick win probabilities. */
2691
2749
  export type PickLeadBacker = {
@@ -2748,7 +2806,7 @@ export type PickOfTheDay = {
2748
2806
  is_locked?: boolean;
2749
2807
  /** True once the backed game's kickoff has passed (kickoff <= now). When true the snapshotted pre-game price is no longer actionable. Absent for a legacy pick with no stored kickoff (treat as not-started). */
2750
2808
  game_started?: boolean;
2751
- /** Whether the backed game is over according to the cached live scoreboard, read at serve time. Tells a finished game from one still in play before `outcome` settles. Omitted when the pick has no event slug or no scoreboard is cached for it; absence is unknown, never false. */
2809
+ /** Whether the backed game is over, from the game's scoreboard. Once the game is recorded as finished it stays true, on later reads and on past days. A pick settled `win` or `loss` reads true unless the live scoreboard shows the game still in play. Tells a finished game from one still in play before `outcome` settles. Omitted when the game's state is unknown; absence is unknown, never false. */
2752
2810
  game_ended?: boolean;
2753
2811
  /** Settlement outcome of the backed side; 'pending' until the market resolves. */
2754
2812
  outcome?: "pending" | "win" | "loss" | "void";
@@ -4527,7 +4585,7 @@ export type ReportPayload = {
4527
4585
  grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
4528
4586
  count: number | null;
4529
4587
  })[] | null;
4530
- /** Which markets the report counts. sports_and_esports for a period that ends on or after 2026-10-21: totals, categories, top trades and the grade cohort cover sports and esports markets only. all_markets for an earlier period, whose stored report keeps every Polymarket market it published. */
4588
+ /** Which markets the report counts. sports_and_esports: totals, categories, top trades and the grade cohort cover sports and esports markets only. Every period that ends on or after 2026-10-21 and every custom from/to range says so, as does an earlier stored period first built after 2026-10-24. all_markets: an earlier stored period built before then, which keeps every Polymarket market it published. A custom range can therefore count fewer trades than the stored report of the same dates. */
4531
4589
  market_scope: "all_markets" | "sports_and_esports";
4532
4590
  };
4533
4591
  export type ReportReconciliation = {
@@ -4676,9 +4734,9 @@ export type ScoreCell = {
4676
4734
  };
4677
4735
  /** Shape the provider score string was parsed into. `two_side` is one aggregate per side (basketball `105-98`), `multi_set` is per-set columns (tennis `6-7(5-7), 6-0, 1-0`), `esports_series` is a maps/sets/format triplet (`000-000|2-0|Bo3`). Omitted when the score could not be parsed. */
4678
4736
  export type ScoreFormat = "two_side" | "multi_set" | "esports_series";
4679
- /** Settings for market_settled; every set field must match. Optional: subscribing without it stores {"sports_market_types": ["moneyline"]}, each game's winner market, and sending it without the event is refused (400). A PATCH without it keeps the stored settings while the event stays subscribed; removing the event clears them. Stored as the API normalized it: trimmed and deduplicated, leagues, market types and condition IDs lowercased, and sports_market_types filled in when omitted. */
4737
+ /** Settings for market_settled; every set field must match. Optional: subscribing without it stores {"sports_market_types": ["moneyline"]}, every market Polymarket labels moneyline, and sending it without the event is refused (400). That label is each head-to-head game's winner market, but in golf and other field events Polymarket labels every player market moneyline (winner, make the cut, round leader), so one tournament can send hundreds of states. Narrow it with leagues, which no market outside the list matches, including one whose league is null (a golf event slug that starts with a year, such as 2026-world-wide-technology-championship), or with condition_ids. A PATCH without it keeps the stored settings while the event stays subscribed; removing the event clears them. Stored as the API normalized it: trimmed and deduplicated, leagues, market types and condition IDs lowercased, and sports_market_types filled in when omitted. */
4680
4738
  export type SettlementSubscriptionFilters = {
4681
- /** Event slug league prefixes such as nba or epl, matched case-insensitively; any one matches. A polyv2 copy's league is read after its polyv2 prefix. */
4739
+ /** Event slug league prefixes such as nba or epl, matched case-insensitively; any one matches. A polyv2 copy's league is read after its polyv2 prefix. PGA Tour golf, whose event slugs start with the year, is pga. */
4682
4740
  leagues?: string[];
4683
4741
  /** Polymarket sportsMarketType values such as moneyline, spreads, totals or a prop type, matched case-insensitively; any one matches, and * matches every type. Omitted, it is ["moneyline"], or ["*"] when condition_ids names the markets. */
4684
4742
  sports_market_types?: string[];
@@ -6615,6 +6673,7 @@ export interface OperationData {
6615
6673
  status: "observed" | "not_posed" | "unavailable";
6616
6674
  was_disputed: boolean | null;
6617
6675
  winning_outcome_index: number | null;
6676
+ oracle_updated_at: string | null;
6618
6677
  };
6619
6678
  trading_terms?: {
6620
6679
  fee_schedule: {
@@ -6649,6 +6708,7 @@ export interface OperationData {
6649
6708
  listLargeTrades: LargeTrade[];
6650
6709
  listLeaderboard: LeaderboardEntry[];
6651
6710
  listLeaderboardLeagues: LeaderboardLeagues;
6711
+ listMarketTrades: MarketTrade[];
6652
6712
  listPositions: Position[];
6653
6713
  listProps: ({
6654
6714
  competitors: string[];
@@ -6689,6 +6749,7 @@ export interface OperationData {
6689
6749
  player_unavailable_reason: "missing_provider_title" | null;
6690
6750
  resolved_at: string | null;
6691
6751
  })[];
6752
+ listSettledMarkets: MarketSettledData[];
6692
6753
  listSharpMoneyFlows: SmartMoneyFlowMarket[];
6693
6754
  listSmartMoneyFlows: SmartMoneyFlowMarket[];
6694
6755
  listSuspiciousTrades: SuspiciousTrade[];
@@ -6869,7 +6930,7 @@ export interface OperationQuery {
6869
6930
  category?: string;
6870
6931
  /** Required for view=observations; wider_holder, in_play or emerging_pile. Rejected for board and signals. wider_holder covers pregame markets that view=signals does not list at its widest selection (horizon_hours=48, min_grade=B, no selector), so until kickoff a market is read in one view or the other. A market view=signals lists leaves wider_holder as primary_slate_candidate, and is a wider_holder candidate again in the first refresh after view=signals stops listing it; signals_as_of names the view=signals snapshot each refresh read. Each refresh evaluates at most 8 markets per sport and cohort, wider_holder by soonest kickoff (most graded holders first among equal kickoffs) and in_play by most graded holders, so a market among a sport's 8 soonest stays evaluated until its game starts. wider_holder also evaluates up to 8 more markets per sport that kick off within 24 hours, most graded holders first, so the most-held markets appear up to a day before kickoff. Each of these keeps its place in later refreshes until its game starts while its holder page still shows a card or could not be read, so a more-held market waits for a free place instead of displacing it. Each row's admitted_by names its place, most_held or soonest_kickoff. The rest count in coverage.capacity_limited_markets. Emerging pile is a wider-holder projection with sharp_pct in [0.75,0.85), complete holder scans and future kickoff, not an independent population or arrival history. */
6871
6932
  cohort?: "wider_holder" | "in_play" | "emerging_pile";
6872
- /** Opt-in admission rule for view=observations with cohort=wider_holder; rejected for every other view and cohort. most_held_48h returns the most-held selection instead of the default one: per sport, up to 8 wider_holder markets kicking off within 48 hours, most graded holders first, then most volume, then soonest kickoff, at most 4 per event. It is recomputed every refresh and keeps no place, so a more-held market displaces a less-held one; markets view=signals lists stay excluded. Every row carries admitted_by most_held_48h, including a market the default selection also evaluates, and the response echoes admission. funnel, coverage, degraded and degradation_reasons describe this selection: a wider_holder candidate it did not take counts as capacity_limited. Its markets that no default place covers are read after every default market, at most once per 10 minutes, so a row can rest on a holder page up to 15 minutes old (holder_snapshot_at). most_held_48h_by_type requires market_types and runs the same rule within each named type: per sport and market_context.market_type, up to 8 markets (4 per event), most graded holders first, then volume, then soonest kickoff, so a type whose markets hold fewer wallets than team-win markets still gets its own places. Its rows carry admitted_by most_held_48h_by_type and it has no departures. Its markets no other selection read are read after every default and most_held_48h market, at most once per 10 minutes. A market type not asked for in the last 30 minutes answers 503 read_model_warming with Retry-After 45 s while the next refresh computes it. Omit for the default selection. Cursors and ETags bind it. */
6933
+ /** Opt-in admission rule for view=observations with cohort=wider_holder; rejected for every other view and cohort. most_held_48h returns the most-held selection instead of the default one: per sport, up to 8 wider_holder markets kicking off within 48 hours, most indexed_graded_holders first, then most volume, then soonest kickoff, at most 4 per event. indexed_graded_holders, on every row, counts the S, A and B wallets in the 0xinsider index holding either outcome; graded_holders counts the piled side of the provider's holder page and can be larger or smaller, so check the selection against indexed_graded_holders. rank orders the admitted rows by directional_rank_score, as in the default selection, not by either count. It is recomputed every refresh and keeps no place, so a more-held market displaces a less-held one; markets view=signals lists stay excluded. Every row carries admitted_by most_held_48h, including a market the default selection also evaluates, and the response echoes admission. funnel, coverage, degraded and degradation_reasons describe this selection: a wider_holder candidate it did not take counts as capacity_limited, and one it skips counts as provider_excluded. It skips every market of a game the provider marks postponed, cancelled, suspended or final, its exact-score, half-time and other side events included, and a market of the game's main event at a Yes price of 0.02 or lower, or 0.98 or higher. Its markets that no default place covers are read at most once per 10 minutes, one with no holder page to serve right after every default market with none, so a row can rest on a holder page up to 15 minutes old, or up to 30 minutes for a market more than an hour before kickoff that has not traded since that page (holder_snapshot_at). most_held_48h_by_type requires market_types and runs the same rule within each named type: per sport and market_context.market_type, up to 8 markets (4 per event), most indexed_graded_holders first, then volume, then soonest kickoff, so a type whose markets hold fewer wallets than team-win markets still gets its own places. Its rows carry admitted_by most_held_48h_by_type and it has no departures. Its markets no other selection read take turns with the most_held_48h ones in that same order, at most once per 10 minutes. A market type not asked for in the last 30 minutes answers 503 read_model_warming with Retry-After 45 s while the next refresh computes it. Omit for the default selection. Cursors and ETags bind it. */
6873
6934
  admission?: "most_held_48h" | "most_held_48h_by_type";
6874
6935
  /** Board and signals: S, A or B, default B. Requires a piled-side holder at the selected grade floor or better, without removing other holders. Rejected for observations. */
6875
6936
  min_grade?: "S" | "A" | "B";
@@ -7297,6 +7358,16 @@ export interface OperationQuery {
7297
7358
  activity?: "all" | "active" | "inactive";
7298
7359
  };
7299
7360
  listLeaderboardLeagues: Record<string, never>;
7361
+ listMarketTrades: {
7362
+ /** Inclusive RFC 3339 lower bound on traded_at. Omitted or earlier than coverage.recorded_from: the walk runs to the start of the record (coverage.recorded_from). With cursor, it must match the cursor's. */
7363
+ from?: string;
7364
+ /** Exclusive RFC 3339 upper bound on traded_at. A first page ends at the earlier of to and coverage.complete_through. With cursor, it must match the cursor's. */
7365
+ to?: string;
7366
+ /** Page size. Out-of-range values are clamped to 1..500. */
7367
+ limit?: number;
7368
+ /** Opaque mtr_v1_ cursor from next_cursor. It continues the walk before the last fill of the previous page and keeps the market, from and to it was issued for: another market, or a from or to that differs from the cursor's, answers 400 with error.reason cursor_expired. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
7369
+ cursor?: string;
7370
+ };
7300
7371
  listPositions: {
7301
7372
  /** Maximum number of current positions to return. Out-of-range values are clamped to 1..100. */
7302
7373
  limit?: number;
@@ -7347,6 +7418,18 @@ export interface OperationQuery {
7347
7418
  /** Backward-compatible alias for expand. Repeatable: quotes. */
7348
7419
  "expand[]"?: "quotes"[];
7349
7420
  };
7421
+ listSettledMarkets: {
7422
+ /** RFC 3339 time, required without cursor. Rows whose settlement.observed_at is at or after it. With cursor, the cursor's position replaces it. */
7423
+ since?: string;
7424
+ /** Comma-separated provider market types to keep, case-insensitive: moneyline, spreads, totals, a prop type; at most 64. Omitted: moneyline, or with cursor the cursor's filter. * keeps every type, including markets with no stored type. */
7425
+ sports_market_type?: string;
7426
+ /** Comma-separated leagues to keep, as the rows' league reports them (nba, epl, or pga for PGA Tour golf); at most 32, each starting with a letter and holding no hyphen. Omitted: every league, or with cursor the cursor's filter. */
7427
+ league?: string;
7428
+ /** Page size. Out-of-range values are clamped to 1..100. */
7429
+ limit?: number;
7430
+ /** Opaque stl_v1_ cursor from next_cursor. It replaces since and keeps the filters it was issued for: a sports_market_type or league sent with it must match them, or the read answers 400 with error.reason cursor_expired. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
7431
+ cursor?: string;
7432
+ };
7350
7433
  listSharpMoneyFlows: {
7351
7434
  /** Lookback window for grade-filtered whale flow aggregation. */
7352
7435
  timeframe?: "1h" | "4h" | "24h" | "7d";
@@ -7735,8 +7818,13 @@ export interface OperationPath {
7735
7818
  listLargeTrades: Record<string, never>;
7736
7819
  listLeaderboard: Record<string, never>;
7737
7820
  listLeaderboardLeagues: Record<string, never>;
7821
+ listMarketTrades: {
7822
+ /** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or /api/v1/markets/explore, or the mkt_-prefixed market.id emitted by V1 responses. */
7823
+ condition_id: string;
7824
+ };
7738
7825
  listPositions: Record<string, never>;
7739
7826
  listProps: Record<string, never>;
7827
+ listSettledMarkets: Record<string, never>;
7740
7828
  listSharpMoneyFlows: Record<string, never>;
7741
7829
  listSmartMoneyFlows: Record<string, never>;
7742
7830
  listSuspiciousTrades: Record<string, never>;
@@ -7901,8 +7989,10 @@ export interface OperationBody {
7901
7989
  listLargeTrades: never;
7902
7990
  listLeaderboard: never;
7903
7991
  listLeaderboardLeagues: never;
7992
+ listMarketTrades: never;
7904
7993
  listPositions: never;
7905
7994
  listProps: never;
7995
+ listSettledMarkets: never;
7906
7996
  listSharpMoneyFlows: never;
7907
7997
  listSmartMoneyFlows: never;
7908
7998
  listSuspiciousTrades: never;
@@ -8367,6 +8457,29 @@ export interface OperationResponse {
8367
8457
  data: OperationData["listLeaderboardLeagues"];
8368
8458
  meta: ResponseMeta;
8369
8459
  };
8460
+ listMarketTrades: {
8461
+ object: "list";
8462
+ /** Newest first by traded_at, then transaction_hash, then log_index. */
8463
+ data: OperationData["listMarketTrades"];
8464
+ /** True when older fills in the window remain: send next_cursor for them. */
8465
+ has_more: boolean;
8466
+ /** Opaque mtr_v1_ cursor for the next page; null when has_more is false. */
8467
+ next_cursor: string | null;
8468
+ /** The market's raw condition_id, lowercase. */
8469
+ condition_id: string;
8470
+ /** What the record holds. A window outside it reads empty because it is outside the record, not because nothing traded. */
8471
+ coverage: {
8472
+ /** A fill smaller than this, in USD, is not stored: 100. */
8473
+ min_size_usd: number;
8474
+ /** Where the record starts: the later of when recording began and 00:00 UTC on the day retention_days before today. No fill before this instant is served. */
8475
+ recorded_from: string;
8476
+ /** Every fill at or before this instant is in the record, and a first page serves none after it. It trails now by a few minutes. */
8477
+ complete_through: string;
8478
+ /** A stored fill is served at least this many days, then deleted. */
8479
+ retention_days: number;
8480
+ };
8481
+ meta: ResponseMeta;
8482
+ };
8370
8483
  listPositions: {
8371
8484
  object: "list";
8372
8485
  data: OperationData["listPositions"];
@@ -8397,6 +8510,14 @@ export interface OperationResponse {
8397
8510
  rows_without_book: number | null;
8398
8511
  };
8399
8512
  };
8513
+ listSettledMarkets: {
8514
+ complete_through: string;
8515
+ data: OperationData["listSettledMarkets"];
8516
+ has_more: boolean;
8517
+ meta: ResponseMeta;
8518
+ next_cursor: string;
8519
+ object: string;
8520
+ };
8400
8521
  listSharpMoneyFlows: {
8401
8522
  object: "list";
8402
8523
  data: OperationData["listSharpMoneyFlows"];