@0xinsider/mcp 2.0.0 → 2.1.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.
Files changed (41) hide show
  1. package/README.md +12 -4
  2. package/dist/catalog.generated.d.ts +4 -0
  3. package/dist/catalog.generated.d.ts.map +1 -1
  4. package/dist/catalog.generated.js +5 -0
  5. package/dist/catalog.generated.js.map +1 -1
  6. package/dist/client.d.ts +3 -0
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js.map +1 -1
  9. package/dist/constants.d.ts +1 -1
  10. package/dist/constants.js +1 -1
  11. package/dist/product-cli/client.d.ts +9 -0
  12. package/dist/product-cli/client.d.ts.map +1 -0
  13. package/dist/product-cli/client.js +78 -0
  14. package/dist/product-cli/client.js.map +1 -0
  15. package/dist/product-cli/index.d.ts.map +1 -1
  16. package/dist/product-cli/index.js +4 -22
  17. package/dist/product-cli/index.js.map +1 -1
  18. package/dist/product-cli/oauth.d.ts +1 -1
  19. package/dist/product-cli/oauth.d.ts.map +1 -1
  20. package/dist/product-cli/oauth.js +4 -3
  21. package/dist/product-cli/oauth.js.map +1 -1
  22. package/dist/product-cli/storage.d.ts +1 -1
  23. package/dist/product-cli/storage.d.ts.map +1 -1
  24. package/dist/product-cli/storage.js +17 -8
  25. package/dist/product-cli/storage.js.map +1 -1
  26. package/dist/sdk/client.d.ts +18 -1
  27. package/dist/sdk/client.d.ts.map +1 -1
  28. package/dist/sdk/client.js +20 -0
  29. package/dist/sdk/client.js.map +1 -1
  30. package/dist/sdk/index.d.ts +1 -1
  31. package/dist/sdk/index.d.ts.map +1 -1
  32. package/dist/sdk/schema.d.ts +223 -6
  33. package/dist/sdk/schema.d.ts.map +1 -1
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +2 -1
  36. package/dist/server.js.map +1 -1
  37. package/dist/tools/read-parity.d.ts +1 -0
  38. package/dist/tools/read-parity.d.ts.map +1 -1
  39. package/dist/tools/read-parity.js +33 -0
  40. package/dist/tools/read-parity.js.map +1 -1
  41. package/package.json +1 -1
@@ -128,6 +128,37 @@ export type Candle = {
128
128
  /** Close price in provider [0, 1] units (last observed point in the bucket). */
129
129
  c: number;
130
130
  };
131
+ /** Model-wide readiness, read in the same database snapshot as category_records. Individual category rows retain their own status. */
132
+ export type CategorySkillModelReadiness = {
133
+ status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
134
+ model_version: string;
135
+ taxonomy_version: string;
136
+ observation_started_at: string;
137
+ as_of: string;
138
+ source_last_success_at: string | null;
139
+ };
140
+ /** Forward-only category evidence from observed Polymarket taker fills. Status is category eligibility, not a global letter grade or a guarantee of positive edge. Scores are probability differences. Unknown and degraded rows withhold scores. Coverage is partial; observation counts are not lifetime market counts. */
141
+ export type CategorySkillV2 = {
142
+ status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
143
+ model_version: string;
144
+ taxonomy_version: string | null;
145
+ platform: "polymarket";
146
+ scope: "observed_goldsky_primary_taker_fill";
147
+ source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
148
+ canonical_category: string;
149
+ as_of: string;
150
+ source_last_success_at: string | null;
151
+ observation_started_at: string;
152
+ latest_observation_at: string | null;
153
+ independent_event_count: number;
154
+ resolved_condition_count: number;
155
+ unresolved_observation_count: number;
156
+ edge_mean: number | null;
157
+ edge_sd: number | null;
158
+ edge_se: number | null;
159
+ edge_lower_95: number | null;
160
+ brier_event_avg: number | null;
161
+ };
131
162
  export type ContentSearchResult = {
132
163
  /** Backend-owned stable editorial content identifier. */
133
164
  content_id: string;
@@ -191,6 +222,8 @@ export type CounterpartyParticipant = {
191
222
  resolution_source?: string | null;
192
223
  display_name?: string | null;
193
224
  grade?: string | null;
225
+ /** Latest nonfuture recorded wallet-wide trade time for the tracked trader supplying this participant's grade. Omitted when unavailable; not the receipt time or the owner EOA's activity. Trader context is read with the response and is not frozen by execution membership snapshots. */
226
+ last_traded_at?: string;
194
227
  /** 0xinsider profile path segment for this participant, present only when the execution wallet has a tracked trader: `@<username>` when that username resolves to the trader alone, otherwise the trader's lowercase wallet. Percent-encode the part after `@` and append to `https://0xinsider.com/profile/`. */
195
228
  profile_segment?: string | null;
196
229
  maker_fill_count: number;
@@ -363,12 +396,19 @@ export type ExportSourceRange = {
363
396
  latest_market_activity_at?: string | null;
364
397
  };
365
398
  export type ExportVolumeReconciliation = {
399
+ /** Verified full-history both-sides USD cash volume. Null without coverage; the local activity numerator may cover only a subset of history. */
366
400
  provider_lifetime_volume?: number | null;
367
401
  exported_activity_volume: number;
368
402
  exported_market_cost_basis: number;
369
403
  provider_activity_volume_gap?: number | null;
370
404
  activity_volume_coverage?: number | null;
371
405
  };
406
+ /** Current category evidence, independent of the global grade. Pick of the Day stamps only the served display roster; frozen entry snapshots remain unchanged. */
407
+ export type HolderCategoryEvidence = {
408
+ status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
409
+ canonical_category?: string;
410
+ skill?: CategorySkillV2;
411
+ };
372
412
  export type LargeExportPolicy = {
373
413
  mode: "v1_async_export";
374
414
  current_internal_route: string;
@@ -396,10 +436,35 @@ export type LargePosition = {
396
436
  id: string;
397
437
  /** Provider discriminator. Always polymarket. */
398
438
  platform: "polymarket";
399
- /** Aggregate provider currentValue for this position leg in USD. */
439
+ /** Provider currentValue in USD for the outcome named by outcome_label / token_id, and for that outcome only. Null means the provider supplied no value for this leg, not a zero position. combined_value_usd carries the wallet's whole-market total. */
400
440
  total_size_usd?: number | null;
401
- /** Provider per-position unrealized P&L (trader_markets.unrealized_pnl_num, from Polymarket cashPnl). */
441
+ /** Provider unrealized mark-to-market P&L (Polymarket cashPnl) for that same one outcome. Null means unavailable, not break-even. */
402
442
  position_unrealized_pnl?: number | null;
443
+ /** The wallet's currentValue across every outcome it holds in this market. Equals total_size_usd unless is_two_sided is true, and is the value the feed ranked this row by. */
444
+ combined_value_usd?: number | null;
445
+ /** The wallet's unrealized P&L across every outcome it holds in this market. Equals position_unrealized_pnl unless is_two_sided is true. */
446
+ combined_unrealized_pnl?: number | null;
447
+ /** Whether the wallet holds shares on both outcomes of this market. */
448
+ is_two_sided: boolean;
449
+ /** Every outcome the wallet holds, primary first. holdings[0] restates the top-level per-outcome fields; a further entry is a leg those fields do not describe. No amount here is a share-proportional slice of a both-sides total. */
450
+ holdings: ({
451
+ /** 0 = Yes, 1 = No. */
452
+ outcome_index: number;
453
+ /** The market's label for this outcome. */
454
+ outcome_label?: string | null;
455
+ /** Polymarket CLOB token id for this outcome; null for an unsynced market. */
456
+ token_id: string | null;
457
+ /** Shares held on this outcome. */
458
+ share_count: number;
459
+ /** Provider average entry price for this outcome. */
460
+ avg_entry_price?: number | null;
461
+ /** Provider mark price for this outcome. */
462
+ current_price?: number | null;
463
+ /** Provider currentValue for this outcome. Null means unavailable, not zero. */
464
+ value_usd?: number | null;
465
+ /** Provider unrealized P&L for this outcome. Null means unavailable, not break-even. */
466
+ unrealized_pnl?: number | null;
467
+ })[];
403
468
  /** Live share count for this position. */
404
469
  share_count: number;
405
470
  /** Volume-weighted entry price. */
@@ -412,7 +477,7 @@ export type LargePosition = {
412
477
  token_id?: string | null;
413
478
  /** Legs collapsed into this representative row for one (wallet, event, outcome side) group. 1 means standalone. */
414
479
  event_leg_count: number;
415
- /** Aggregate provider currentValue across collapsed sibling legs; equals total_size_usd when event_leg_count = 1. */
480
+ /** Sum of the collapsed sibling legs' own holding values for this (wallet, event) group; equals total_size_usd when event_leg_count = 1, and null when any member's value is unknown. */
416
481
  event_total_value_usd?: number | null;
417
482
  first_seen_at: string;
418
483
  last_updated_at: string;
@@ -447,8 +512,9 @@ export type LeaderboardEntry = {
447
512
  score?: number | null;
448
513
  /** All-time P&L in USD (total_pnl), including unrealized open positions. Kept for back-compat; prefer realized_pnl for the banked figure. */
449
514
  pnl?: number | null;
450
- /** All-time banked realized P&L in USD (total_pnl - open_pnl), excluding unrealized open positions. Matches the realized-P&L-dominant grade/board. */
515
+ /** Native realized P&L plus credited maker and taker rebates in USD, with fees already included. The exact numeric value is truncated toward zero to cents before JSON conversion. Wallets without a native snapshot retain their historical stored realized P&L. Omitted when the native snapshot has no net realized value. */
451
516
  realized_pnl?: number | null;
517
+ /** Full-history both-sides USD cash volume from a verified Polymarket user-volume observation. Omitted without coverage. */
452
518
  volume?: number | null;
453
519
  markets_traded?: number | null;
454
520
  win_rate?: number | null;
@@ -631,8 +697,26 @@ export type PickHolder = {
631
697
  shares: number;
632
698
  /** This wallet's win rate in the pick's canonical category bucket (the pick's `category` field, e.g. Basketball -- label the rate with it, never with the narrower `display_category` league): the share of the wallet's resolved markets in that category whose realized P&L closed positive, as a 0..1 fraction. Present only with `category_win_rate_status` = `measured`, on `display_holders` entries, and only when the wallet clears the resolved-market floor; recomputed at serve time from the current category read model, not frozen with the pick. Absent on `holders` entries, legacy rows, and payloads predating the field. */
633
699
  category_win_rate?: number | null;
700
+ /** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every resolved Polymarket market the wallet traded in the pick's canonical category, at any position size; the counts are rebuilt daily. Present only with `category_win_rate_status` = `measured`; absent otherwise and on payloads predating the field. */
701
+ category_win_record?: {
702
+ /** Resolved markets in the category that this wallet closed with a profit. */
703
+ wins: number;
704
+ /** Resolved markets in the category that this wallet closed with a profit or a loss. A market resolved at zero realized P&L is in neither count. */
705
+ decided: number;
706
+ };
634
707
  /** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the resolved-market floor of 5 in the category), or `unavailable` (the annotation read failed; retry later). Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample. */
635
708
  category_win_rate_status?: "measured" | "not_enough_data" | "unavailable";
709
+ /** Days since this wallet's first trade. 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. */
710
+ wallet_age_days?: number | null;
711
+ /** 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. */
712
+ is_new_wallet?: boolean;
713
+ /** Distinct markets this wallet has traded. 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. */
714
+ markets_traded?: number | null;
715
+ /** True when the wallet has traded 10,000 or more distinct markets, the breadth floor 0xinsider uses to mark automated wallets. It is a breadth rule, not proof of automation. 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. */
716
+ is_bot?: boolean;
717
+ /** 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. */
718
+ x_username?: string | null;
719
+ category_evidence?: HolderCategoryEvidence;
636
720
  };
637
721
  export type PickOfTheDay = {
638
722
  /** Always 'full' for an authenticated Pro key. */
@@ -861,6 +945,25 @@ export type PickOfTheDayArchiveEntry = {
861
945
  /** Backend-formatted signed unit score, present exactly when unit_score is present. */
862
946
  unit_score_display?: string;
863
947
  };
948
+ /** The frozen identity of the pick, exactly as the hash was taken over it. Served byte for byte as it was hashed -- keys sorted by UTF-8 byte value, no insignificant whitespace -- so a verifier concatenates and hashes with nothing to reconstruct. Property order below is the wire order. The outcome is deliberately NOT part of it: surviving a corrected outcome unchanged is the case the commitment exists for. Worked example: {"backed_price":"0.545000","condition_id":"0xabc","kickoff":"2026-09-20T23:05:00Z","pick_date":"2026-09-20","pick_outcome_index":1,"pick_outcome_label":"Lakers","pick_rank":1,"platform":"polymarket"} with the nonce 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f hashes to 44d18fa5e2aa3a2bf3c971dcc9317c8ccbdfd5480a4773b6d8ffd5fbeeea84dc. */
949
+ export type PickOfTheDayCommitmentPayload = {
950
+ /** Frozen pre-game price of the backed side, 0..1, as the plain decimal text of the stored NUMERIC at full stored precision, trailing zeros included. A string, never a number: a float round-trip would change the bytes and break the hash. Deliberately not normalized -- 0.545000 stays "0.545000". */
951
+ backed_price: string;
952
+ /** Provider condition id of the backed market. */
953
+ condition_id: string;
954
+ /** Frozen provider kickoff, whole seconds, UTC, literal Z. Fixed precision, never a shortest-lossless rendering. */
955
+ kickoff: string;
956
+ /** ET product day (YYYY-MM-DD). */
957
+ pick_date: string;
958
+ /** Index of the backed outcome within the market. */
959
+ pick_outcome_index: 0 | 1;
960
+ /** Frozen display label of the backed outcome. */
961
+ pick_outcome_label: string;
962
+ /** 1-based daily slot. */
963
+ pick_rank: number;
964
+ /** Provider platform. */
965
+ platform: string;
966
+ };
864
967
  export type PickOfTheDayHitRate = {
865
968
  /** Number of decided picks that won. */
866
969
  wins: number;
@@ -934,6 +1037,109 @@ export type PickOfTheDayHitRate = {
934
1037
  hit_rate_pct: number;
935
1038
  }[];
936
1039
  };
1040
+ /** The commitment ledger: every published pick, ascending, in the state its commitment is actually in. The counts are derived from entries in the same pass that builds it. */
1041
+ export type PickOfTheDayLedger = {
1042
+ /** One entry per published (pick_date, pick_rank), ascending by pick_date then pick_rank. */
1043
+ entries: PickOfTheDayLedgerEntry[];
1044
+ /** Number of entries, all states included. */
1045
+ entry_count: number;
1046
+ /** Entries committed to and not yet settled. */
1047
+ sealed_count: number;
1048
+ /** Entries committed to and verifiable now. */
1049
+ opened_count: number;
1050
+ /** Entries carrying no commitment, so provable by nothing: the honest size of the unprovable part of the record. It only stops growing; no pick is ever retro-sealed. */
1051
+ uncommitted_count: number;
1052
+ };
1053
+ /** One ledger entry. Read `state` to know which shape you have; the three are disjoint. */
1054
+ export type PickOfTheDayLedgerEntry = PickOfTheDayLedgerSealedEntry | PickOfTheDayLedgerOpenedEntry | PickOfTheDayLedgerUncommittedEntry;
1055
+ /** A settled pick whose commitment is open: the nonce plus the exact payload the hash was taken over. Concatenate the payload bytes as received with the decoded nonce and sha256 them to reproduce commitment_hash. */
1056
+ export type PickOfTheDayLedgerOpenedEntry = {
1057
+ state: "opened";
1058
+ /** ET product day the pick belongs to (YYYY-MM-DD). */
1059
+ pick_date: string;
1060
+ /** 1-based daily slot within the product day. */
1061
+ pick_rank: number;
1062
+ /** sha256(canonical_json(payload) || nonce), lowercase hex, no 0x prefix. Publishable the moment the pick releases: without the nonce it is not invertible. */
1063
+ commitment_hash: string;
1064
+ /** The 32-byte nonce the hash was taken over, lowercase hex, no 0x prefix. Secret while the pick is live: a pick payload is low entropy, so a published nonce on a live pick would hand out the backed side. */
1065
+ commitment_nonce: string;
1066
+ /** The construction the hash was taken with, stated in the response so a verifier never has to guess the serialization. */
1067
+ commitment_algo: "sha256(canonical_json(payload)||nonce)";
1068
+ /** When the hash was frozen. Always strictly before kickoff: a pick that reaches kickoff unsealed stays unsealed forever, because a seal written after the game started would be a backdated proof. */
1069
+ sealed_at: string;
1070
+ /** When outcome was LAST written to a settled value, or null when that instant is unknown. It moves with a corrected market re-mapping an already-settled pick, while commitment_hash stays untouched -- which is how a mirror that keeps history sees a correction. */
1071
+ resolved_at: string | null;
1072
+ /** The frozen provider kickoff in the canonical payload form: whole seconds, UTC, literal Z. This exact string reappears inside payload.kickoff when the pick opens. */
1073
+ kickoff: string;
1074
+ payload: PickOfTheDayCommitmentPayload;
1075
+ /** How the pick settled. Never pending: a pending pick is a sealed entry. */
1076
+ outcome: "win" | "loss" | "void";
1077
+ /** Frozen matchup, for a reader. */
1078
+ matchup: string;
1079
+ /** Frozen canonical sport bucket used for selection calibration (Basketball, MMA), not the exact public league identity; the archive owns that. */
1080
+ category: string;
1081
+ /** The pick's public page. */
1082
+ permalink: string;
1083
+ };
1084
+ /** A published pick that has not settled. Carries the commitment and nothing that states a side or a price: no nonce, no payload, no outcome. Publishable the instant the pick releases. */
1085
+ export type PickOfTheDayLedgerSealedEntry = {
1086
+ state: "sealed";
1087
+ /** ET product day the pick belongs to (YYYY-MM-DD). */
1088
+ pick_date: string;
1089
+ /** 1-based daily slot within the product day. */
1090
+ pick_rank: number;
1091
+ /** sha256(canonical_json(payload) || nonce), lowercase hex, no 0x prefix. Publishable the moment the pick releases: without the nonce it is not invertible. */
1092
+ commitment_hash: string;
1093
+ /** The construction the hash was taken with, stated in the response so a verifier never has to guess the serialization. */
1094
+ commitment_algo: "sha256(canonical_json(payload)||nonce)";
1095
+ /** When the hash was frozen. Always strictly before kickoff: a pick that reaches kickoff unsealed stays unsealed forever, because a seal written after the game started would be a backdated proof. */
1096
+ sealed_at: string;
1097
+ /** The frozen provider kickoff in the canonical payload form: whole seconds, UTC, literal Z. This exact string reappears inside payload.kickoff when the pick opens. */
1098
+ kickoff: string;
1099
+ /** The pick's public page. */
1100
+ permalink: string;
1101
+ };
1102
+ /** A published pick with no commitment: it predates the scheme, or it reached kickoff unsealed. Nothing here is evidence of WHEN the pick was made. It is emitted rather than skipped, because a ledger with holes where the unprovable picks were would silently flatter the record. Once the pick settles, payload names its market, side and price, so the outcome can still be checked against the market's own resolution. */
1103
+ export type PickOfTheDayLedgerUncommittedEntry = {
1104
+ state: "uncommitted";
1105
+ /** ET product day the pick belongs to (YYYY-MM-DD). */
1106
+ pick_date: string;
1107
+ /** 1-based daily slot within the product day. */
1108
+ pick_rank: number;
1109
+ /** Always true: this pick has no commitment and never will. */
1110
+ pre_commitment: true;
1111
+ /** How the pick settled, or pending. */
1112
+ outcome: "pending" | "win" | "loss" | "void";
1113
+ /** Frozen matchup, for a reader. */
1114
+ matchup: string;
1115
+ /** Frozen canonical sport bucket used for selection calibration (Basketball, MMA), not the exact public league identity; the archive owns that. */
1116
+ category: string;
1117
+ /** When outcome was LAST written to a settled value, or null when that instant is unknown. It moves with a corrected market re-mapping an already-settled pick, while commitment_hash stays untouched -- which is how a mirror that keeps history sees a correction. */
1118
+ resolved_at: string | null;
1119
+ /** The pick's market, side and price once it has settled; null while it is pending, and null for a settled pick whose stored row lacks one of these columns. Not hashed: nothing was committed over these values, which is what pre_commitment: true says. */
1120
+ payload: PickOfTheDayUncommittedPayload | null;
1121
+ /** The pick's public page. */
1122
+ permalink: string;
1123
+ };
1124
+ /** 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. */
1125
+ export type PickOfTheDayUncommittedPayload = {
1126
+ /** Frozen pre-game price of the backed side, 0..1, as the plain decimal text of the stored NUMERIC at full stored precision, trailing zeros included -- rendered exactly as the commitment payload renders it. */
1127
+ backed_price: string;
1128
+ /** Provider condition id of the backed market. */
1129
+ condition_id: string;
1130
+ /** Frozen provider kickoff, UTC, literal Z; null when no kickoff was frozen. Whole seconds render exactly as the commitment payload does; a sub-second instant keeps its fraction rather than being truncated, since nothing here is hashed. */
1131
+ kickoff: string | null;
1132
+ /** ET product day (YYYY-MM-DD). */
1133
+ pick_date: string;
1134
+ /** Index of the backed outcome within the market. */
1135
+ pick_outcome_index: 0 | 1;
1136
+ /** Frozen display label of the backed outcome. */
1137
+ pick_outcome_label: string;
1138
+ /** 1-based daily slot. */
1139
+ pick_rank: number;
1140
+ /** Provider platform. */
1141
+ platform: string;
1142
+ };
937
1143
  /** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Team logos and league logo are provider-owned (Polymarket /teams crests for clubs, country flags for national teams and tennis players); no local derivation. */
938
1144
  export type PickSportsContext = {
939
1145
  /** League or competition display name (e.g. "Premier League"). */
@@ -1485,7 +1691,7 @@ export type Trader = {
1485
1691
  rank?: number | null;
1486
1692
  pnl: {
1487
1693
  total?: number | null;
1488
- /** For pnl.realized, expand=trust marks a matching native accounting snapshot as computed: native Polymarket realized P&L plus credited maker and taker rebates, with fees already included. Without a matching native accounting snapshot, pnl.realized is omitted and its trust metadata is unavailable. Raw total P&L is never substituted for realized P&L. */
1694
+ /** For pnl.realized, expand=trust marks a matching native accounting snapshot as computed: native Polymarket realized P&L plus credited maker and taker rebates, with fees already included. The exact numeric value is truncated toward zero to cents before conversion to a JSON number. Without a matching native accounting snapshot, pnl.realized is omitted and its trust metadata is unavailable. Raw total P&L is never substituted for realized P&L. */
1489
1695
  realized?: number | null;
1490
1696
  unrealized?: number | null;
1491
1697
  /** DEPRECATED, always null. The local pnl_7d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native weekly window from GET /api/trader/{address}/profile-summary instead. */
@@ -1497,6 +1703,7 @@ export type Trader = {
1497
1703
  markets_traded?: number | null;
1498
1704
  win_rate?: number | null;
1499
1705
  daily_win_rate?: number | null;
1706
+ /** Full-history both-sides USD cash volume from Polymarket user-volume. Omitted without a verified observation; never leaderboard shares. Volume freshness is unknown in this DTO and does not use synced_at. */
1500
1707
  total_volume?: number | null;
1501
1708
  };
1502
1709
  strategy?: {
@@ -1533,6 +1740,9 @@ export type Trader = {
1533
1740
  sync_status?: string | null;
1534
1741
  /** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
1535
1742
  trust?: TraderTrust;
1743
+ /** Current evidence for observed and known categories (expand=categories or expand[]=categories). Omitted unless expanded. Includes insufficient, stale, unknown and degraded rows; absence of a category is not proof of skill. The global grade is unchanged. */
1744
+ category_records?: CategorySkillV2[];
1745
+ category_skill_model?: CategorySkillModelReadiness;
1536
1746
  };
1537
1747
  export type TraderContext = {
1538
1748
  trader: Trader;
@@ -1698,6 +1908,8 @@ export type TraderTrust = {
1698
1908
  last_active: TrustMetadata;
1699
1909
  synced_at: TrustMetadata;
1700
1910
  sync_status: TrustMetadata;
1911
+ category_records: TrustMetadata;
1912
+ category_skill_model: TrustMetadata;
1701
1913
  };
1702
1914
  export type TrendingWallet = {
1703
1915
  /** Prefixed trader ID (`trd_...`). */
@@ -1712,7 +1924,10 @@ export type TrendingWallet = {
1712
1924
  platform: "polymarket";
1713
1925
  /** Polymarket weekly/monthly P&L for the wallet in USD, taken from Polymarket's canonical leaderboard (data-api.polymarket.com/v1/leaderboard?timePeriod=week|month&orderBy=PNL). This is the ranking axis and the rows are returned in Polymarket's by-PNL order; it is the provider's number, not a locally summed realized-leaf total. */
1714
1926
  trending_pnl_usd: number;
1715
- window_volume_usd: number;
1927
+ /** Both-sides cash volume over the window in USD, from Polymarket GET /v2/user-volume (volume_usdc). Omitted when Polymarket served no volume for the wallet: an absent observation, never zero. Polymarket tracks volume in whole UTC days, so this window is the whole-day span covering the requested one, which is not the exact span trending_pnl_usd was scored over. */
1928
+ window_volume_usd?: number;
1929
+ /** Both-sides traded volume over the window in SHARES, from the Polymarket leaderboard row, whose own schema states the figure is never USD. Omitted when the row carried none. */
1930
+ window_volume_shares?: number;
1716
1931
  window_markets_traded: number;
1717
1932
  /** Distinct in-window UTC trade days from our trades (0 if the winner is not in our DB). */
1718
1933
  window_trade_days: number;
@@ -1969,6 +2184,7 @@ export interface OperationData {
1969
2184
  getMonthlyReportSnapshot: ReportSnapshot;
1970
2185
  getPickOfTheDay: PickOfTheDay;
1971
2186
  getPickOfTheDayArchive: PickOfTheDayArchive;
2187
+ getPickOfTheDayLedger: PickOfTheDayLedger;
1972
2188
  getPlatforms: Platforms;
1973
2189
  getPositionTimeline: PositionTimelineEvent[];
1974
2190
  getPositionTimelineById: PositionTimelineEvent[];
@@ -2106,6 +2322,7 @@ export interface OperationQuery {
2106
2322
  };
2107
2323
  getPickOfTheDay: Record<string, never>;
2108
2324
  getPickOfTheDayArchive: Record<string, never>;
2325
+ getPickOfTheDayLedger: Record<string, never>;
2109
2326
  getPlatforms: Record<string, never>;
2110
2327
  getPositionTimeline: {
2111
2328
  /** Market condition_id. One timeline per (trader, market). */