@0xinsider/mcp 2.4.0 → 2.6.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.
@@ -251,6 +251,28 @@ export type CreateWebhookRequest = {
251
251
  url: string;
252
252
  event_types: WebhookEventType[];
253
253
  };
254
+ /** Compact data age and coverage for a response body, always present on the operations that publish it. Read status and as_of to decide whether to use the body at all, and field_groups to see which part is weak. Everything here comes from stored observation clocks, so a cached body reports the same ages a freshly computed one does: meta.cached and meta.cache_age_s stay the only transport-time facts and neither makes this block newer. The per-field audit object is still available through expand=trust; this is the default summary of the same question. */
255
+ export type DataQuality = {
256
+ /** fresh when every group is fresh, unavailable when every group is unavailable, and partial in every other case. */
257
+ status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
258
+ /** The oldest as_of among the groups that carry one: the age of the weakest clock this body rests on. Omitted when no group carries a clock. */
259
+ as_of?: string;
260
+ /** One entry per field group. Entries may be added in later releases, so match on group rather than on position or length. */
261
+ field_groups: DataQualityGroup[];
262
+ };
263
+ /** One group of response fields that share a writer and therefore share a clock. */
264
+ export type DataQualityGroup = {
265
+ /** Stable snake_case group name. Names are additive across releases, so match on the ones you know and ignore the rest. */
266
+ group: string;
267
+ /** The table and column that write this group, named so the verdict can be audited (for example trader_rankings.computed_at). */
268
+ owner: string;
269
+ /** fresh: served, and as_of carries this group's real observation or computation clock. partial: some of the group's fields are served and some are missing. unknown: served, and this read has no clock for it, so no age may be inferred. untracked: 0xinsider does not track this group for this subject, by design. unavailable: the group could not be served. New values may be added; treat one you do not recognize as unknown. fresh means the group is tracked and clocked, not that it is inside any particular tolerance: compare as_of against your own. */
270
+ status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
271
+ /** When this group's values were observed or computed. Omitted whenever the read cannot measure it, and never filled with the serialization time, the cache time, or another group's clock. */
272
+ as_of?: string;
273
+ /** Why the status is not fresh. Omitted when it is. */
274
+ reason?: string;
275
+ };
254
276
  export type EventReplayEvent = {
255
277
  /** Opaque event identity: the ef_-encoded whale_alerts.id, stable across cursor formats. Deduplicate on this, never on cursor or sequence. */
256
278
  id: string;
@@ -331,6 +353,17 @@ export type EventReplaySource = {
331
353
  owner: "whale_alerts";
332
354
  provider_fetch_at_request_time: false;
333
355
  };
356
+ /** A lossless decimal atom rendered from the canonical NUMERIC or provider value. The value is a decimal string and must be parsed with a decimal library; it is never a display string and must not be converted through a binary float. `scale` is the source decimal scale. The field is omitted when its source is unavailable. */
357
+ export type ExactDecimal = {
358
+ /** Plain decimal text at full source precision, including a minus sign for negative values and trailing zeros when the source scale carries them. Parse as an arbitrary-precision decimal. */
359
+ value: string;
360
+ /** Unit of the value, such as `USD`, `USD/share`, or `shares`. */
361
+ unit: string;
362
+ /** Number of digits after the decimal point in `value`'s source atom. */
363
+ scale: number;
364
+ /** Backend-owned source or derivation basis. Treat it as provenance, not as a display label. */
365
+ basis: string;
366
+ };
334
367
  export type ExploreEntry = ExploreGroup | ExploreStandalone;
335
368
  export type ExploreFacets = {
336
369
  categories: ExploreFacetValue[];
@@ -420,6 +453,12 @@ export type ExploreMarket = {
420
453
  whale_signal: number | null;
421
454
  liquidity_signal: number | null;
422
455
  recency_signal: number | null;
456
+ /** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value. */
457
+ sharp_money_signal: number | null;
458
+ /**
459
+ * Deprecated spelling of sharp_money_signal; emitted beside it with the same value and never removed.
460
+ * @deprecated
461
+ */
423
462
  smart_money_signal: number | null;
424
463
  price_move_signal: number | null;
425
464
  missing_price_penalty: number;
@@ -586,7 +625,7 @@ export type HolderCategoryEvidence = {
586
625
  export type LargeExportPolicy = {
587
626
  mode: "v1_async_export";
588
627
  current_internal_route: string;
589
- /** Programmatic API-key-gated export routes (submit/status/download) and supported formats (json, ndjson, csv). */
628
+ /** Programmatic API-key-gated export routes (submit/status/download/cancel) and supported formats (json, ndjson, csv). */
590
629
  v1_async: {
591
630
  /** POST route template to submit an export job. fresh=true asks for a snapshot read after the submit instead of reusing a finished one. */
592
631
  submit_route?: string;
@@ -594,10 +633,12 @@ export type LargeExportPolicy = {
594
633
  status_route?: string;
595
634
  /** GET route template that 302-redirects to the file. */
596
635
  download_route?: string;
636
+ /** POST route template to cancel a queued or running job. */
637
+ cancel_route?: string;
597
638
  /** Supported ?format= values. */
598
639
  formats?: ("json" | "ndjson" | "csv")[];
599
640
  /** Possible job status values. */
600
- status_values?: ("queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired")[];
641
+ status_values?: ("queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled")[];
601
642
  /** How long a finished export is retained before expiry. */
602
643
  retention?: string;
603
644
  };
@@ -687,9 +728,19 @@ export type LargeTrade = {
687
728
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
688
729
  token_id: string | null;
689
730
  price: number;
690
- /** Current 0.0–1.0 normalized signal score, computed at request time from the trader's win rate today and the trade's age now. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_signal_score for that. */
731
+ /** Current 0.0–1.0 review score, computed at request time from the trade's size, the trader's win rate today, a bonus when a trader with a win rate above 55% trades at a price below 30¢, and the trade's age now. A higher score means read this trade first; it does not measure edge or predict an outcome. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_review_score for that. Canonical since #16311; signal_score carries the same value. */
732
+ review_score: number;
733
+ /**
734
+ * Current 0.0–1.0 review score, computed at request time from the trader's win rate today and the trade's age now. Deprecated (#16311): `review_score` is the canonical spelling and carries the same value; this key stays on the wire.
735
+ * @deprecated
736
+ */
691
737
  signal_score: number;
692
- /** 0.0–1.0 signal score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. */
738
+ /** 0.0–1.0 review score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. Canonical since #16311; recorded_signal_score carries the same value. */
739
+ recorded_review_score: number | null;
740
+ /**
741
+ * 0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire.
742
+ * @deprecated
743
+ */
693
744
  recorded_signal_score: number | null;
694
745
  /** Persisted live suspicion score from the scorer. Null when the row has no persisted score. */
695
746
  suspicion_score: number | null;
@@ -895,7 +946,10 @@ export type MarketIntel = {
895
946
  /** Age of the oldest stored position snapshot behind top_positions: the minimum wallet sync clock over the positions this body publishes. The roster is a stored read rather than a live one, and graded wallets sit on different sync tiers, so this names how current the whole roster is; the response is no fresher than this timestamp. Null when the roster is empty or no published position carries a sync clock. It does not date net_flow_usd, the volumes or the trade counts, which come from large-trade event times. */
896
947
  oldest_snapshot_as_of: string | null;
897
948
  };
898
- /** Deprecated alias of sharp_money; byte-identical and retained for backward compatibility. */
949
+ /**
950
+ * Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
951
+ * @deprecated
952
+ */
899
953
  smart_money: {
900
954
  net_flow_usd: number;
901
955
  direction: "YES" | "NO";
@@ -1098,15 +1152,25 @@ export type PickOfTheDay = {
1098
1152
  position?: string;
1099
1153
  /** One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
1100
1154
  side_summary?: string;
1101
- /** Public V1 compatibility count of S/A smart-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
1155
+ /** Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. Canonical key since #16308; smart_wallet_count is its deprecated spelling, emitted beside it with the same value. */
1156
+ sharp_wallet_count?: number;
1157
+ /**
1158
+ * Deprecated spelling of sharp_wallet_count, emitted beside it with the same value and never removed. Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof.
1159
+ * @deprecated
1160
+ */
1102
1161
  smart_wallet_count?: number;
1103
- /** Best public V1-compatible S/A smart-money grade on the backed side. The first-party/internal current policy can select B, but a current B-only grade is omitted by the stable V1 adapter. Historical rows retain their frozen policy's grade. A current-day published pick with pending legacy proof, unknown-future proof, or structurally invalid current-policy proof returns 503 before this success schema is served. Resolved legacy proof remains readable on both current-day and archive/history responses. */
1162
+ /** Best public V1-compatible S/A sharp-money grade on the backed side. The first-party/internal current policy can select B, but a current B-only grade is omitted by the stable V1 adapter. Historical rows retain their frozen policy's grade. A current-day published pick with pending legacy proof, unknown-future proof, or structurally invalid current-policy proof returns 503 before this success schema is served. Resolved legacy proof remains readable on both current-day and archive/history responses. */
1104
1163
  top_grade?: string;
1105
1164
  /** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: category win-rate edge as a fraction (the backed-side cohort's win rate in this category minus the non-market-maker category baseline, e.g. 0.09 = +9 points), paired with category_edge_sample. */
1106
1165
  category_edge_pct?: number;
1107
1166
  /** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: pooled count of resolved markets behind category_edge_pct (the headline's n). */
1108
1167
  category_edge_sample?: number;
1109
- /** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. */
1168
+ /** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. Canonical key since #16308; smart_usd is its deprecated spelling, emitted beside it with the same value. */
1169
+ sharp_usd?: number;
1170
+ /**
1171
+ * Deprecated spelling of sharp_usd, emitted beside it with the same value and never removed. Recency-weighted graded-flow magnitude in USD; omitted when <= 0.
1172
+ * @deprecated
1173
+ */
1110
1174
  smart_usd?: number;
1111
1175
  /** Frozen pre-game probability (0..1) for the backed side, written once at publication. It is the Polymarket CLOB order book midpoint at release, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price. */
1112
1176
  backed_price?: number;
@@ -1190,15 +1254,15 @@ export type PickOfTheDay = {
1190
1254
  lane_probability_source?: "p";
1191
1255
  };
1192
1256
  trust?: PickTrust;
1193
- /** Public V1 S/A compatibility count on the backed side (equals the adapted smart_wallet_count). The first-party/internal current policy counts S/A/B. Historical rows retain their frozen policy's count. */
1257
+ /** Public V1 S/A compatibility count on the backed side (equals the adapted sharp_wallet_count). The first-party/internal current policy counts S/A/B. Historical rows retain their frozen policy's count. */
1194
1258
  traders?: number;
1195
- /** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted smart_usd which decays. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. */
1259
+ /** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted sharp_usd which decays. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. */
1196
1260
  backed_sharp_usd?: number;
1197
1261
  /** Bounded S/A compatibility projection of the frozen sharp-money holders on the backed side. Current full payloads expose the complete S/A/B roster in display_holders; historical rows can retain their earlier frozen shape. */
1198
1262
  holders?: PickHolder[];
1199
1263
  /** Full-only complete provider-confirmed S/A/B holder roster for the current Pick of the Day backing policy. Omitted for teaser, no-pick, and historical rows whose frozen holder proof predates this policy. Each entry may additionally carry `category_win_rate` / `category_win_rate_status`: the wallet's win rate in the pick's canonical `category`, stamped at serve time from the current category read model (the same annotation the sports sharp-money chips carry). The bounded `holders` compatibility projection never carries these fields. */
1200
1264
  display_holders?: PickHolder[];
1201
- /** Exact S/A smart-money proof count on the backed side. The current display_holders roster can be longer because it also carries B-grade smart-money holders. */
1265
+ /** Exact S/A sharp-money proof count on the backed side. The current display_holders roster can be longer because it also carries B-grade sharp-money holders. */
1202
1266
  holder_count?: number;
1203
1267
  /** Optional editorial note attached to the pick. */
1204
1268
  editorial_note?: string;
@@ -1263,7 +1327,7 @@ export type PickOfTheDayArchiveEntry = {
1263
1327
  image_url?: string;
1264
1328
  /** The backed side's outcome label. Omitted for a still-pending pick when the request is not from an authenticated Pro key. */
1265
1329
  pick_outcome_label?: string;
1266
- /** Best public V1-compatible S/A smart-money grade on the backed side; a current B-only grade is omitted by the stable V1 adapter, while historical rows retain their frozen policy's grade. Omitted when no smart-money wallet backs the pick, when a pending legacy proof has not yet upgraded, or when the stored holder policy is unknown-future or structurally invalid. Resolved legacy history remains supported. */
1330
+ /** Best public V1-compatible S/A sharp-money grade on the backed side; a current B-only grade is omitted by the stable V1 adapter, while historical rows retain their frozen policy's grade. Omitted when no sharp-money wallet backs the pick, when a pending legacy proof has not yet upgraded, or when the stored holder policy is unknown-future or structurally invalid. Resolved legacy history remains supported. */
1267
1331
  top_grade?: string;
1268
1332
  /** Settlement outcome of the backed side; 'pending' until the market resolves. */
1269
1333
  outcome: "pending" | "win" | "loss" | "void";
@@ -1591,6 +1655,8 @@ export type Position = {
1591
1655
  cash_pnl?: number;
1592
1656
  /** Closed-leg P&L rolled up (Polymarket `realizedPnl`). */
1593
1657
  realized_pnl?: number;
1658
+ /** Additive lossless source atoms for the display-safe position fields. Parse every `value` with decimal-safe arithmetic; never recover exact values from the numeric twins. */
1659
+ exact?: PositionExact;
1594
1660
  /** Max updated_at across mirror legs for this pair. */
1595
1661
  last_reconciled_at?: string;
1596
1662
  /** Backend-computed staleness bucket derived from last_reconciled_at. */
@@ -1623,6 +1689,17 @@ export type Position = {
1623
1689
  end_date?: string;
1624
1690
  };
1625
1691
  };
1692
+ /** Lossless position atoms from `wallet_positions`. `shares` and `current_value_usd` are required when this object is present; other source values are omitted when the mirror has no verified value. */
1693
+ export type PositionExact = {
1694
+ shares: ExactDecimal;
1695
+ cost_basis_usd?: ExactDecimal;
1696
+ /** Exact derived price: `wallet_positions.cost_basis_usd / wallet_positions.shares`. */
1697
+ avg_price?: ExactDecimal;
1698
+ current_value_usd: ExactDecimal;
1699
+ initial_value_usd?: ExactDecimal;
1700
+ cash_pnl?: ExactDecimal;
1701
+ realized_pnl?: ExactDecimal;
1702
+ };
1626
1703
  export type PositionTimelineEvent = {
1627
1704
  /** Prefixed ID (pe_...). */
1628
1705
  id: string;
@@ -1679,7 +1756,10 @@ export type PreGameSide = {
1679
1756
  side_share: number | null;
1680
1757
  /** Polymarket condition id. */
1681
1758
  condition_id: string;
1682
- /** UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. Deprecated (#16310): `ranked_at` is the canonical spelling and carries the same value; this key stays on the wire. */
1759
+ /**
1760
+ * UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. Deprecated (#16310): `ranked_at` is the canonical spelling and carries the same value; this key stays on the wire.
1761
+ * @deprecated
1762
+ */
1683
1763
  signal_created_at: string;
1684
1764
  /** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
1685
1765
  token_id: string | null;
@@ -1691,7 +1771,10 @@ export type PreGameSide = {
1691
1771
  event_slug: string | null;
1692
1772
  /** Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started. */
1693
1773
  game_start_time: string | null;
1694
- /** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire. */
1774
+ /**
1775
+ * Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
1776
+ * @deprecated
1777
+ */
1695
1778
  piled_side: string | null;
1696
1779
  /** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
1697
1780
  piled_outcome_index: number;
@@ -1709,13 +1792,19 @@ export type PreGameSide = {
1709
1792
  graded_holders: number;
1710
1793
  /** Best grade present on the piled side; null when none. */
1711
1794
  top_grade: "S" | "A" | "B" | null;
1712
- /** Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire. */
1795
+ /**
1796
+ * Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
1797
+ * @deprecated
1798
+ */
1713
1799
  smart_score: number | null;
1714
1800
  /** Market volume (USD). */
1715
1801
  volume: number | null;
1716
1802
  /** Aggregate recent flow direction on the market; null when unavailable. */
1717
1803
  net_side: "BUY" | "SELL" | null;
1718
- /** Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire. */
1804
+ /**
1805
+ * Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
1806
+ * @deprecated
1807
+ */
1719
1808
  conviction_score: number;
1720
1809
  /** Piled-side graded holders read one-way: their fresh open legs across the signal game's markets (cross-market within the one game; moneyline+spread family only) all back the same team, or, when the market's holder scan was complete, Polymarket's currentValue shows no opposite leg on this market worth 10% of the backed leg and no fresh leg opposes it. Null when the directional read was not computed (no groupable game, no holder-level data on this ranking path, or the enrichment read failed) or classified nobody. */
1721
1810
  one_way_holder_count: number | null;
@@ -1789,7 +1878,10 @@ export type PreGameSideObservation = {
1789
1878
  cohort: "wider_holder" | "in_play" | "emerging_pile";
1790
1879
  /** Always true. This row must not be routed to an order executor. */
1791
1880
  observation_only: true;
1792
- /** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire. */
1881
+ /**
1882
+ * Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
1883
+ * @deprecated
1884
+ */
1793
1885
  piled_side: string | null;
1794
1886
  /** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
1795
1887
  piled_outcome_index: 0 | 1;
@@ -1805,11 +1897,17 @@ export type PreGameSideObservation = {
1805
1897
  /** Piled-side S/A/B holder count. */
1806
1898
  graded_holders: number;
1807
1899
  top_grade: "S" | "A" | "B";
1808
- /** Canonical signed holder-pile score. Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire. */
1900
+ /**
1901
+ * Canonical signed holder-pile score. Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
1902
+ * @deprecated
1903
+ */
1809
1904
  smart_score: number;
1810
1905
  /** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
1811
1906
  volume: number;
1812
- /** Grade-weighted holder-pile score before directional enrichment. Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire. */
1907
+ /**
1908
+ * Grade-weighted holder-pile score before directional enrichment. Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
1909
+ * @deprecated
1910
+ */
1813
1911
  conviction_score: number;
1814
1912
  /** Whether the provider holder page came from the shared cache or a live provider read. */
1815
1913
  provider_read_source: "cached" | "live";
@@ -1967,9 +2065,9 @@ export type ResponseMeta = {
1967
2065
  ranking_generation?: number;
1968
2066
  /** Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order. */
1969
2067
  ranking_as_of?: string;
1970
- /** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a smart-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
2068
+ /** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a sharp-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
1971
2069
  directional_source?: "live" | "degraded";
1972
- /** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a smart-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
2070
+ /** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a sharp-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
1973
2071
  ranking_source?: "live" | "db_only";
1974
2072
  /** Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage. */
1975
2073
  category_skill_source?: "live" | "partial" | "degraded" | "unavailable";
@@ -2032,7 +2130,10 @@ export type SmartMoneyFlowMarket = {
2032
2130
  buy_volume_usd: number;
2033
2131
  sell_volume_usd: number;
2034
2132
  };
2035
- /** Deprecated alias of sharp_money; byte-identical and retained for backward compatibility. */
2133
+ /**
2134
+ * Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
2135
+ * @deprecated
2136
+ */
2036
2137
  smart_money: {
2037
2138
  net_flow_usd: number;
2038
2139
  direction: "YES" | "NO";
@@ -2114,6 +2215,10 @@ export type Trader = {
2114
2215
  /** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
2115
2216
  streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
2116
2217
  score?: number;
2218
+ /** Capital-normalized forecasting score: the cohort percentile (0-100) of the EB-shrunk calibration edge. Omitted when the forecasting signal is unavailable; never replaced with zero. */
2219
+ forecast_score?: number;
2220
+ /** Share of forecast_score supported by the trader's own resolved-market record rather than the cohort prior: n / (n + 30). Omitted when forecast_score is unavailable. */
2221
+ forecast_evidence?: number;
2117
2222
  rank?: number;
2118
2223
  pnl: {
2119
2224
  total?: number;
@@ -2124,13 +2229,17 @@ export type Trader = {
2124
2229
  last_7d?: number;
2125
2230
  /** DEPRECATED, never sent. The local pnl_30d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native monthly window from GET /api/trader/{address}/profile-summary instead. */
2126
2231
  last_30d?: number;
2232
+ /** Additive lossless counterpart. Omitted when the trusted native realized-P&L source is unavailable; existing numeric fields keep their display-safe v1 semantics. */
2233
+ exact?: TraderPnlExact;
2127
2234
  };
2128
2235
  stats: {
2129
2236
  markets_traded?: number;
2130
2237
  win_rate?: number;
2131
2238
  daily_win_rate?: number;
2132
- /** 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. */
2239
+ /** Full-history both-sides USD cash volume from Polymarket user-volume. Omitted without a verified observation; never leaderboard shares. Its observation time is published as the volume group in data_quality and as trust.total_volume.freshness.as_of, both trader_usd_volume.observed_at; synced_at is a different clock and is never a substitute for it. */
2133
2240
  total_volume?: number;
2241
+ /** Additive lossless counterpart to `total_volume`. Omitted when the verified provider observation is unavailable. */
2242
+ exact?: TraderStatsExact;
2134
2243
  };
2135
2244
  strategy?: {
2136
2245
  strategy_type?: string;
@@ -2164,6 +2273,8 @@ export type Trader = {
2164
2273
  synced_at?: string;
2165
2274
  /** synced, unknown, or pending. */
2166
2275
  sync_status?: string;
2276
+ /** Data age and coverage for this trader body. Always present. Its five groups are sync (traders.last_synced, covering pnl.total, pnl.realized, stats.markets_traded, stats.win_rate, stats.daily_win_rate, last_active, synced_at and sync_status), ranking (trader_rankings.computed_at, covering grade, score, streak_tier, forecast_score and forecast_evidence), leaderboard_rank (traders.leaderboard_rank, which stores no write timestamp, so its status is unknown rather than dated by another clock), volume (trader_usd_volume.observed_at, covering stats.total_volume) and positions (trader_markets, covering pnl.unrealized, whose own write times this read does not carry). For an unknown wallet every group is unavailable. */
2277
+ data_quality: DataQuality;
2167
2278
  /** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
2168
2279
  trust?: TraderTrust;
2169
2280
  /** 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. */
@@ -2248,22 +2359,56 @@ export type TraderEsportsGameRecord = {
2248
2359
  /** The same rule as the parent record: measured when decided cleared min_decided_for_win_rate, not_enough_data when the counts are real but the sample is under the floor. A chip on a market in this game shows this row's rate when it is measured and the Esports bucket's otherwise. */
2249
2360
  status: "measured" | "not_enough_data";
2250
2361
  };
2362
+ export type TraderExportArtifactManifest = {
2363
+ /** Version of the artifact manifest contract. */
2364
+ manifest_version: string;
2365
+ /** Serialization used for the decompressed content. */
2366
+ format: "json" | "ndjson" | "csv";
2367
+ /** Stable schema identifier for the selected serialization. */
2368
+ schema_version: "trader-export-json-v1" | "trader-export-ndjson-v1" | "trader-export-csv-v1";
2369
+ /** Sections represented by the artifact. JSON and NDJSON carry the full envelope and trades; CSV carries trade rows only. */
2370
+ coverage: "full_envelope_and_trades" | "trades_only";
2371
+ generation: TraderExportGeneration;
2372
+ /** Number of trade rows written. */
2373
+ row_count: number;
2374
+ /** Exact byte count of the decompressed content stream clients receive. */
2375
+ content_size_bytes: number;
2376
+ /** Lowercase SHA-256 of the decompressed content bytes. */
2377
+ content_sha256: string;
2378
+ /** Exact byte count of the gzip-compressed bytes stored by the object provider. */
2379
+ compressed_size_bytes: number;
2380
+ /** Lowercase SHA-256 of the stored gzip bytes; the multipart ETag is not used as this checksum. */
2381
+ compressed_sha256: string;
2382
+ };
2383
+ export type TraderExportCategoryWatermark = {
2384
+ source: string;
2385
+ coverage: string;
2386
+ publication_fence: string | null;
2387
+ data_as_of: string | null;
2388
+ };
2389
+ export type TraderExportGeneration = {
2390
+ /** Opaque generation identity selected for the coherent read snapshot. */
2391
+ id: string;
2392
+ selected_at: string;
2393
+ consistency: "repeatable_read";
2394
+ source_watermarks: TraderExportSourceWatermarks;
2395
+ };
2251
2396
  export type TraderExportJob = {
2252
2397
  object: "trader_export_job";
2253
2398
  data: {
2254
2399
  job_id: number;
2255
- /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
2256
- status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
2400
+ /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
2401
+ status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
2257
2402
  format: "json" | "ndjson" | "csv";
2258
2403
  total_trades: number | null;
2259
2404
  processed_trades: number | null;
2260
2405
  file_size: number | null;
2261
2406
  error: string | null;
2262
- /** True when status never changes again (ready, failed, expired). Stop polling. */
2407
+ /** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
2263
2408
  terminal: boolean;
2264
2409
  /** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
2265
2410
  next_action: "poll" | "download" | "resubmit";
2266
- /** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
2411
+ /** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
2267
2412
  poll_after_s?: number;
2268
2413
  created_at: string;
2269
2414
  /** When the worker last claimed the job; null while queued. */
@@ -2277,22 +2422,42 @@ export type TraderExportJob = {
2277
2422
  expired_at: string | null;
2278
2423
  /** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
2279
2424
  data_as_of: string | null;
2425
+ /** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
2426
+ cancel_requested_at: string | null;
2427
+ /** When the job reached cancelled; null until then. */
2428
+ cancelled_at: string | null;
2280
2429
  /** Worker claims so far. */
2281
2430
  attempt: number;
2282
2431
  /** The job fails when attempt reaches this. */
2283
2432
  max_attempts: number;
2284
2433
  /** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
2285
2434
  artifact?: {
2435
+ /** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
2436
+ artifact_id: string;
2286
2437
  /** The storage ETag of the object. */
2287
2438
  etag: string | null;
2288
2439
  /** Bytes on the wire (gzip); file_size is the decompressed size. */
2289
2440
  compressed_size_bytes: number | null;
2290
2441
  content_type: "application/json" | "application/x-ndjson" | "text/csv";
2291
2442
  content_encoding: "gzip";
2443
+ /** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
2444
+ manifest: TraderExportArtifactManifest | null;
2292
2445
  };
2293
2446
  };
2294
2447
  meta: ResponseMeta;
2295
2448
  };
2449
+ export type TraderExportPnlWatermark = {
2450
+ source: string;
2451
+ coverage: string;
2452
+ revision: number | null;
2453
+ observed_at: string | null;
2454
+ };
2455
+ export type TraderExportPositionWatermark = {
2456
+ source: string;
2457
+ coverage: string;
2458
+ generation: number | null;
2459
+ data_as_of: string | null;
2460
+ };
2296
2461
  export type TraderExportSnapshot = {
2297
2462
  address: string;
2298
2463
  generated_at: string;
@@ -2302,6 +2467,18 @@ export type TraderExportSnapshot = {
2302
2467
  counts: ExportCounts;
2303
2468
  large_export_policy: LargeExportPolicy;
2304
2469
  };
2470
+ export type TraderExportSourceWatermarks = {
2471
+ positions: TraderExportPositionWatermark;
2472
+ pnl: TraderExportPnlWatermark;
2473
+ categories: TraderExportCategoryWatermark;
2474
+ trades: TraderExportTradeWatermark;
2475
+ };
2476
+ export type TraderExportTradeWatermark = {
2477
+ source: string;
2478
+ coverage: string;
2479
+ rows: number;
2480
+ first_activity_date: string | null;
2481
+ };
2305
2482
  /** A trader's daily P&L object. `id` is always present. The five sections -- `entries`, `stats`, `monthly`, `year_totals`, `drawdown` -- are present unless the request's `sections` parameter excluded them, so a request that sends no `sections` always carries all five. An excluded section is absent from the object, never null and never an empty array. */
2306
2483
  export type TraderPnl = {
2307
2484
  /** Prefixed trader ID (`trd_...`). */
@@ -2414,6 +2591,16 @@ export type TraderPnl = {
2414
2591
  drawdown: number;
2415
2592
  }[];
2416
2593
  };
2594
+ /** Lossless counterparts for trader P&L values. The object is omitted when no trusted native realized-P&L snapshot is available. */
2595
+ export type TraderPnlExact = {
2596
+ /** Native Polymarket realized P&L plus credited maker and taker rebates, with fees included, from the trusted matching `trader_trading_pnl.net_realized_pnl` snapshot. */
2597
+ realized: ExactDecimal;
2598
+ };
2599
+ /** Lossless counterparts for trader statistics. The object is omitted when the verified provider observation is unavailable. */
2600
+ export type TraderStatsExact = {
2601
+ /** Full-history both-sides Polymarket user-volume atom from the verified `trader_usd_volume` observation. */
2602
+ total_volume: ExactDecimal;
2603
+ };
2417
2604
  /** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
2418
2605
  export type TraderTrust = {
2419
2606
  total_pnl: TrustMetadata;
@@ -2425,6 +2612,8 @@ export type TraderTrust = {
2425
2612
  total_volume: TrustMetadata;
2426
2613
  grade: TrustMetadata;
2427
2614
  score: TrustMetadata;
2615
+ forecast_score: TrustMetadata;
2616
+ forecast_evidence: TrustMetadata;
2428
2617
  rank: TrustMetadata;
2429
2618
  streak_tier: TrustMetadata;
2430
2619
  strategy: TrustMetadata;
@@ -2591,7 +2780,7 @@ export type WebhookEndpoint = {
2591
2780
  signing_secret?: string;
2592
2781
  verification?: WebhookVerification;
2593
2782
  };
2594
- /** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. suspicious_trade_flagged and insider_radar_flag_raised are two spellings of one event: either one subscribes, and an endpoint receives deliveries under the spelling it registered. */
2783
+ /** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (large_trades_inserted, whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, sharp_money_flow_detected, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. Export lifecycle event types (export_job_ready, export_job_failed, export_job_expired, export_job_cancelled) are owner-scoped to the API-key account that created the export and contain no download URL; use the authorized export status/download routes. Some entries are two spellings of one event: large_trades_inserted and whale_trades_inserted, trader_synced and whale_trader_synced, suspicious_trade_flagged and insider_radar_flag_raised, sharp_money_flow_detected and smart_money_flow_detected. Either spelling subscribes, and an endpoint receives deliveries under the spelling it registered. */
2595
2784
  export type WebhookEventDescriptor = {
2596
2785
  id: WebhookEventType;
2597
2786
  /** One-line description of when the event fires. */
@@ -2601,7 +2790,7 @@ export type WebhookEventDescriptor = {
2601
2790
  /** active: the event has a firing producer callsite. dormant: advertised and subscribable, but does not yet enqueue any delivery. */
2602
2791
  status: "active" | "dormant";
2603
2792
  };
2604
- export type WebhookEventType = "whale_trades_inserted" | "live_sports_updated" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "suspicious_trade_flagged" | "insider_radar_flag_raised" | "smart_money_flow_detected";
2793
+ export type WebhookEventType = "large_trades_inserted" | "whale_trades_inserted" | "live_sports_updated" | "trader_synced" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "suspicious_trade_flagged" | "insider_radar_flag_raised" | "sharp_money_flow_detected" | "smart_money_flow_detected" | "export_job_ready" | "export_job_failed" | "export_job_expired" | "export_job_cancelled";
2605
2794
  export type WebhookRetryPolicy = {
2606
2795
  max_attempts: 8;
2607
2796
  terminal_status: "dead_letter";
@@ -2631,6 +2820,55 @@ export interface OperationData {
2631
2820
  activateWebhookSecret: WebhookEndpoint;
2632
2821
  batchGetMarketIntel: BatchMarketIntelItem[];
2633
2822
  batchGetTraders: BatchTraderItem[];
2823
+ cancelTraderExport: {
2824
+ job_id: number;
2825
+ /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
2826
+ status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
2827
+ format: "json" | "ndjson" | "csv";
2828
+ total_trades: number | null;
2829
+ processed_trades: number | null;
2830
+ file_size: number | null;
2831
+ error: string | null;
2832
+ /** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
2833
+ terminal: boolean;
2834
+ /** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
2835
+ next_action: "poll" | "download" | "resubmit";
2836
+ /** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
2837
+ poll_after_s?: number;
2838
+ created_at: string;
2839
+ /** When the worker last claimed the job; null while queued. */
2840
+ started_at: string | null;
2841
+ /** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
2842
+ ready_at: string | null;
2843
+ failed_at: string | null;
2844
+ /** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
2845
+ expires_at: string;
2846
+ /** When the job became expired; null until then. */
2847
+ expired_at: string | null;
2848
+ /** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
2849
+ data_as_of: string | null;
2850
+ /** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
2851
+ cancel_requested_at: string | null;
2852
+ /** When the job reached cancelled; null until then. */
2853
+ cancelled_at: string | null;
2854
+ /** Worker claims so far. */
2855
+ attempt: number;
2856
+ /** The job fails when attempt reaches this. */
2857
+ max_attempts: number;
2858
+ /** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
2859
+ artifact?: {
2860
+ /** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
2861
+ artifact_id: string;
2862
+ /** The storage ETag of the object. */
2863
+ etag: string | null;
2864
+ /** Bytes on the wire (gzip); file_size is the decompressed size. */
2865
+ compressed_size_bytes: number | null;
2866
+ content_type: "application/json" | "application/x-ndjson" | "text/csv";
2867
+ content_encoding: "gzip";
2868
+ /** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
2869
+ manifest: TraderExportArtifactManifest | null;
2870
+ };
2871
+ };
2634
2872
  createMcpJsonRpcResponse: {
2635
2873
  jsonrpc: "2.0";
2636
2874
  id: string | number | null;
@@ -2707,18 +2945,18 @@ export interface OperationData {
2707
2945
  getTraderExportSnapshot: TraderExportSnapshot;
2708
2946
  getTraderExportStatus: {
2709
2947
  job_id: number;
2710
- /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
2711
- status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
2948
+ /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
2949
+ status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
2712
2950
  format: "json" | "ndjson" | "csv";
2713
2951
  total_trades: number | null;
2714
2952
  processed_trades: number | null;
2715
2953
  file_size: number | null;
2716
2954
  error: string | null;
2717
- /** True when status never changes again (ready, failed, expired). Stop polling. */
2955
+ /** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
2718
2956
  terminal: boolean;
2719
2957
  /** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
2720
2958
  next_action: "poll" | "download" | "resubmit";
2721
- /** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
2959
+ /** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
2722
2960
  poll_after_s?: number;
2723
2961
  created_at: string;
2724
2962
  /** When the worker last claimed the job; null while queued. */
@@ -2732,18 +2970,26 @@ export interface OperationData {
2732
2970
  expired_at: string | null;
2733
2971
  /** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
2734
2972
  data_as_of: string | null;
2973
+ /** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
2974
+ cancel_requested_at: string | null;
2975
+ /** When the job reached cancelled; null until then. */
2976
+ cancelled_at: string | null;
2735
2977
  /** Worker claims so far. */
2736
2978
  attempt: number;
2737
2979
  /** The job fails when attempt reaches this. */
2738
2980
  max_attempts: number;
2739
2981
  /** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
2740
2982
  artifact?: {
2983
+ /** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
2984
+ artifact_id: string;
2741
2985
  /** The storage ETag of the object. */
2742
2986
  etag: string | null;
2743
2987
  /** Bytes on the wire (gzip); file_size is the decompressed size. */
2744
2988
  compressed_size_bytes: number | null;
2745
2989
  content_type: "application/json" | "application/x-ndjson" | "text/csv";
2746
2990
  content_encoding: "gzip";
2991
+ /** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
2992
+ manifest: TraderExportArtifactManifest | null;
2747
2993
  };
2748
2994
  };
2749
2995
  getTraderPnl: TraderPnl;
@@ -2818,18 +3064,18 @@ export interface OperationData {
2818
3064
  searchMarkets: MarketSearchResult[];
2819
3065
  submitTraderExport: {
2820
3066
  job_id: number;
2821
- /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
2822
- status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
3067
+ /** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
3068
+ status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
2823
3069
  format: "json" | "ndjson" | "csv";
2824
3070
  total_trades: number | null;
2825
3071
  processed_trades: number | null;
2826
3072
  file_size: number | null;
2827
3073
  error: string | null;
2828
- /** True when status never changes again (ready, failed, expired). Stop polling. */
3074
+ /** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
2829
3075
  terminal: boolean;
2830
3076
  /** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
2831
3077
  next_action: "poll" | "download" | "resubmit";
2832
- /** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
3078
+ /** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
2833
3079
  poll_after_s?: number;
2834
3080
  created_at: string;
2835
3081
  /** When the worker last claimed the job; null while queued. */
@@ -2843,18 +3089,26 @@ export interface OperationData {
2843
3089
  expired_at: string | null;
2844
3090
  /** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
2845
3091
  data_as_of: string | null;
3092
+ /** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
3093
+ cancel_requested_at: string | null;
3094
+ /** When the job reached cancelled; null until then. */
3095
+ cancelled_at: string | null;
2846
3096
  /** Worker claims so far. */
2847
3097
  attempt: number;
2848
3098
  /** The job fails when attempt reaches this. */
2849
3099
  max_attempts: number;
2850
3100
  /** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
2851
3101
  artifact?: {
3102
+ /** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
3103
+ artifact_id: string;
2852
3104
  /** The storage ETag of the object. */
2853
3105
  etag: string | null;
2854
3106
  /** Bytes on the wire (gzip); file_size is the decompressed size. */
2855
3107
  compressed_size_bytes: number | null;
2856
3108
  content_type: "application/json" | "application/x-ndjson" | "text/csv";
2857
3109
  content_encoding: "gzip";
3110
+ /** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
3111
+ manifest: TraderExportArtifactManifest | null;
2858
3112
  };
2859
3113
  };
2860
3114
  updateWebhook: WebhookEndpoint;
@@ -2865,6 +3119,10 @@ export interface OperationQuery {
2865
3119
  activateWebhookSecret: Record<string, never>;
2866
3120
  batchGetMarketIntel: Record<string, never>;
2867
3121
  batchGetTraders: Record<string, never>;
3122
+ cancelTraderExport: {
3123
+ /** Export job id returned by the submit route. */
3124
+ job_id: number;
3125
+ };
2868
3126
  createMcpJsonRpcResponse: Record<string, never>;
2869
3127
  createWebhook: Record<string, never>;
2870
3128
  deleteWebhook: Record<string, never>;
@@ -3083,7 +3341,7 @@ export interface OperationQuery {
3083
3341
  limit?: number;
3084
3342
  /** Pagination cursor from previous response's next_cursor. Prefix: wth_. URL-encode when replaying as a query parameter. */
3085
3343
  cursor?: string;
3086
- /** Minimum trade size in USD. The capture floor was 3,000 USD before 2026-07-06 and 10,000 USD from then (1,000 USD in earnings markets), so 10000 gives one size rule across the whole archive. */
3344
+ /** Minimum trade size in USD. The capture floor was 3,000 USD before 2026-07-06 and 10,000 USD from then (1,000 USD in earnings markets), so 10000 gives one size rule across the whole archive. From 2026-09-23 a fill must also be at least 0.1% of its market's recorded traded volume (Polymarket's own share count); rows written before that date were not re-filtered. */
3087
3345
  min_size?: number;
3088
3346
  /** Exact raw provider condition_id. Unknown markets return an empty list. */
3089
3347
  condition_id?: string;
@@ -3101,6 +3359,10 @@ export interface OperationQuery {
3101
3359
  from?: string;
3102
3360
  /** Exclusive RFC3339 upper bound on whale_alerts.traded_at. Must be after from when both are present. */
3103
3361
  to?: string;
3362
+ /** 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. */
3363
+ min_market_volume_share?: number;
3364
+ /** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads from, or the last 30 days when from is omitted, for the same reason. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
3365
+ sort?: "recent" | "market_volume_share";
3104
3366
  };
3105
3367
  listLargeTrades: {
3106
3368
  /** Maximum number of recent large trades to return. */
@@ -3115,6 +3377,10 @@ export interface OperationQuery {
3115
3377
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
3116
3378
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
3117
3379
  suspicious_only?: boolean;
3380
+ /** 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. */
3381
+ min_market_volume_share?: number;
3382
+ /** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
3383
+ sort?: "recent" | "market_volume_share";
3118
3384
  };
3119
3385
  listLeaderboard: {
3120
3386
  /** Maximum number of ranked traders to return. */
@@ -3289,6 +3555,10 @@ export interface OperationQuery {
3289
3555
  from?: string;
3290
3556
  /** Exclusive RFC3339 upper bound on whale_alerts.traded_at. Must be after from when both are present. */
3291
3557
  to?: string;
3558
+ /** 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. */
3559
+ min_market_volume_share?: number;
3560
+ /** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads from, or the last 30 days when from is omitted, for the same reason. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
3561
+ sort?: "recent" | "market_volume_share";
3292
3562
  };
3293
3563
  listWhaleTrades: {
3294
3564
  /** Maximum number of recent large trades to return. */
@@ -3303,6 +3573,10 @@ export interface OperationQuery {
3303
3573
  min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
3304
3574
  /** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
3305
3575
  suspicious_only?: boolean;
3576
+ /** 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. */
3577
+ min_market_volume_share?: number;
3578
+ /** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
3579
+ sort?: "recent" | "market_volume_share";
3306
3580
  };
3307
3581
  prepareWebhookSecret: Record<string, never>;
3308
3582
  redeliverWebhookDelivery: Record<string, never>;
@@ -3344,6 +3618,10 @@ export interface OperationPath {
3344
3618
  };
3345
3619
  batchGetMarketIntel: Record<string, never>;
3346
3620
  batchGetTraders: Record<string, never>;
3621
+ cancelTraderExport: {
3622
+ /** Trader wallet address (0x...), known trader username-style lookup, or trd_-prefixed trader ID emitted by this API. */
3623
+ address: string;
3624
+ };
3347
3625
  createMcpJsonRpcResponse: Record<string, never>;
3348
3626
  createWebhook: Record<string, never>;
3349
3627
  deleteWebhook: {
@@ -3537,6 +3815,7 @@ export interface OperationBody {
3537
3815
  /** Shared expand flags applied to every trader item. */
3538
3816
  expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
3539
3817
  };
3818
+ cancelTraderExport: never;
3540
3819
  createMcpJsonRpcResponse: {
3541
3820
  /** JSON-RPC protocol version; this server accepts 2.0. */
3542
3821
  jsonrpc: "2.0";
@@ -3640,6 +3919,7 @@ export interface OperationResponse {
3640
3919
  data: OperationData["batchGetTraders"];
3641
3920
  meta: BatchResponseMeta;
3642
3921
  };
3922
+ cancelTraderExport: TraderExportJob;
3643
3923
  createMcpJsonRpcResponse: {
3644
3924
  jsonrpc: "2.0";
3645
3925
  id: string | number | null;