@0xinsider/mcp 3.22.0 → 3.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/product-cli/operations.js +1 -1
- package/dist/product-cli/operations.js.map +1 -1
- package/dist/sdk/client.d.ts +1 -1
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/schema.d.ts +147 -12
- package/dist/sdk/schema.d.ts.map +1 -1
- package/dist/tools/get-insider-radar.d.ts.map +1 -1
- package/dist/tools/get-insider-radar.js +2 -1
- package/dist/tools/get-insider-radar.js.map +1 -1
- package/dist/tools/get-leaderboard.js +1 -1
- package/dist/tools/get-leaderboard.js.map +1 -1
- package/dist/tools/get-positions.js +1 -1
- package/dist/tools/get-positions.js.map +1 -1
- package/dist/tools/get-suspicious-trades.d.ts +6 -2
- package/dist/tools/get-suspicious-trades.d.ts.map +1 -1
- package/dist/tools/get-suspicious-trades.js +12 -5
- package/dist/tools/get-suspicious-trades.js.map +1 -1
- package/dist/tools/get-trader.js +1 -1
- package/dist/tools/pick-of-the-day.js +1 -1
- package/package.json +1 -1
package/dist/sdk/schema.d.ts
CHANGED
|
@@ -546,6 +546,15 @@ export type EdgeHunterBoard = {
|
|
|
546
546
|
/** Ranked rows after normalized selections and grade filtering, before the view-specific limit cap. */
|
|
547
547
|
total: number;
|
|
548
548
|
rows: EdgeHunterRow[];
|
|
549
|
+
/** Markets the window and selection evaluated without a row, by reason. Every one drew a large trade from an S, A or B wallet in the last 24 hours, as every row did, so total plus the three counts is every market evaluated, and total 0 with all three 0 means no market in the window drew such a trade. Null on a snapshot cached before the counts existed. */
|
|
550
|
+
unranked: {
|
|
551
|
+
/** A side is backed, but no wallet on it is at or above min_grade. */
|
|
552
|
+
below_grade_floor: number;
|
|
553
|
+
/** No S, A or B wallet holds either side now. */
|
|
554
|
+
no_graded_holders: number;
|
|
555
|
+
/** Graded money on the two sides is too evenly split to back a side. */
|
|
556
|
+
split_holder_pile: number;
|
|
557
|
+
} | null;
|
|
549
558
|
};
|
|
550
559
|
export type EdgeHunterBoardResponse = {
|
|
551
560
|
object: "edge_hunter";
|
|
@@ -1950,6 +1959,8 @@ export type LeaderboardEntry = {
|
|
|
1950
1959
|
platform: "polymarket";
|
|
1951
1960
|
/** When the wallet last traded: its most recent recorded trade, as of the leaderboard row's last refresh, which re-reads it hourly, so a new trade can take about an hour to show. It agrees with the activity filter: every wallet listed under activity=inactive last traded more than 30 days ago. Since 2026-11-02 (#32322); before, it carried the time 0xinsider last synced the wallet, usually within the past week whether or not the wallet traded. Omitted when the wallet has no recorded trade. */
|
|
1952
1961
|
last_active?: string;
|
|
1962
|
+
/** Additive (since 2026-11-11, #34333): in_scope.win_rate_status, lifted to the row beside win_rate. measured from 5 decided markets (in_scope.markets_decided), not_enough_data below, the floor the 0xinsider leaderboard page applies before it shows a win rate. Below it win_rate is still sent; quote in_scope.markets_decided instead of win_rate as a rate. Omitted exactly when in_scope.win_rate_status is. */
|
|
1963
|
+
win_rate_status?: "measured" | "not_enough_data";
|
|
1953
1964
|
};
|
|
1954
1965
|
/** Every league with a skill leaderboard, by sport: the league values GET /api/v1/leaderboard/sports/{sport} accepts. */
|
|
1955
1966
|
export type LeaderboardLeagues = {
|
|
@@ -2868,7 +2879,7 @@ export type PickOfTheDay = {
|
|
|
2868
2879
|
unit_score?: number;
|
|
2869
2880
|
/** Backend-formatted signed unit score, present exactly when unit_score is present. */
|
|
2870
2881
|
unit_score_display?: string;
|
|
2871
|
-
/** Recorded sharp-money share as a 0..1 fraction. This is not a winning probability. Absent on every pick dated 2026-08-12 or later: from that date the recorded share includes B grade wallets, which this S and A projection does not count. Earlier picks carry it when it was recorded. */
|
|
2882
|
+
/** Recorded sharp-money share as a 0..1 fraction. This is not a winning probability. Absent on every pick dated 2026-08-12 or later: from that date the recorded share includes B grade wallets, which this S and A projection does not count. Earlier picks carry it when it was recorded. backed_side_share carries the recorded share on every pick, on the pick's own grade basis. */
|
|
2872
2883
|
sharp_pct?: number;
|
|
2873
2884
|
/** Recorded market-implied probability as a 0..1 fraction when available. */
|
|
2874
2885
|
market_pct?: number;
|
|
@@ -2895,7 +2906,7 @@ export type PickOfTheDay = {
|
|
|
2895
2906
|
};
|
|
2896
2907
|
/** Public V1 S/A wallet count on the backed side, equal to sharp_wallet_count. */
|
|
2897
2908
|
traders?: number;
|
|
2898
|
-
/** Recorded aggregate backed-side position value in USD, not a live balance or entry cost. Absent on every pick dated 2026-08-12 or later: from that date the recorded value includes B grade wallets, which this S and A projection does not count. Earlier picks carry it when it was recorded. The display_holders roster can include additional wallets; use the returned aggregate rather than summing that roster. */
|
|
2909
|
+
/** Recorded aggregate backed-side position value in USD, not a live balance or entry cost. Absent on every pick dated 2026-08-12 or later: from that date the recorded value includes B grade wallets, which this S and A projection does not count. Earlier picks carry it when it was recorded. sharp_positioned_usd carries the recorded value on every pick, on the pick's own grade basis. The display_holders roster can include additional wallets; use the returned aggregate rather than summing that roster. */
|
|
2899
2910
|
backed_sharp_usd?: number;
|
|
2900
2911
|
/** Bounded S/A holder display projection from the recorded snapshot. Historical rows retain their recorded display shape. */
|
|
2901
2912
|
holders?: PickHolder[];
|
|
@@ -2977,6 +2988,8 @@ export type PickOfTheDay = {
|
|
|
2977
2988
|
/** Tennis tour of the player: atp, wta or itf. Sent for a tennis player whether or not a headshot is on file. */
|
|
2978
2989
|
tour?: string;
|
|
2979
2990
|
};
|
|
2991
|
+
/** Which of yes_team and no_team the game lists first, the same value as sports_context.side_order: Polymarket's order for the event (the order of its title: the away team first in US leagues, the home team first in soccer). yes_first when yes_team is the first team, no_first when no_team is. A spread's Yes side is the favorite, so it is often the game's second team. Lay the teams out in this order to show every pick on one game the same way; yes_team and no_team keep their Yes and No meaning. Omitted when the order is unknown: lay out yes_team first. */
|
|
2992
|
+
side_order?: "yes_first" | "no_first";
|
|
2980
2993
|
/** The side the market's Yes outcome names; when event_matchup is true, the parent game's first side in display order. */
|
|
2981
2994
|
yes_team?: {
|
|
2982
2995
|
/** Full display name of the team or player. */
|
|
@@ -3010,6 +3023,10 @@ export type PickOfTheDay = {
|
|
|
3010
3023
|
resolved_at?: string;
|
|
3011
3024
|
/** When the backed game starts (RFC3339 UTC): the same instant the 0xinsider site shows for the pick, read from the provider's current schedule, so a rescheduled game shows its new start, else the start recorded with the pick. scheduled_picks and proof_pending_picks use the same name for a pick's start. Omitted (not null) only when neither is on record, on a legacy pick; never estimated. Additive and optional for mixed-version client compatibility. */
|
|
3012
3025
|
kickoff?: string;
|
|
3026
|
+
/** Recorded share of graded-wallet money on the backed side, as a 0..1 fraction: the Side share the pick's page shows, from the same recorded value. It counts the grades of the pick's own wallet policy: S, A and B wallets on picks dated 2026-08-12 or later, where sharp_pct is absent, and S and A wallets before that date, where it equals sharp_pct. A measure of positioning, not a winning probability. Absent when the pick recorded no share. Additive and optional. */
|
|
3027
|
+
backed_side_share?: number;
|
|
3028
|
+
/** Recorded USD value of the counted wallets' positions on the backed side: the Sharp positioned value the pick's page shows, from the same recorded value. Same grade basis as backed_side_share; on picks dated before 2026-08-12 it equals backed_sharp_usd. Not a live balance or entry cost. The display_holders roster can include additional wallets; use this value rather than summing that roster. Absent when the pick recorded no value. Additive and optional. */
|
|
3029
|
+
sharp_positioned_usd?: number;
|
|
3013
3030
|
};
|
|
3014
3031
|
export type PickOfTheDayArchive = {
|
|
3015
3032
|
/** Published Pick of the Day selections that have not been withdrawn, newest first by pick_date and then pick_rank within each product day. Withdrawn rows stay excluded after settlement. */
|
|
@@ -3338,6 +3355,8 @@ export type PickOfTheDayLedgerOpenedEntry = {
|
|
|
3338
3355
|
outcome: "win" | "loss" | "void";
|
|
3339
3356
|
/** Why the site withdrew this pick from its track record, or null when the pick counts. provider_game_cancelled: Polymarket marked the game Cancelled while the pick was pending. published_after_kickoff: the pick was published at or after its game started, including a suspended match that resumed later, so it was never a pre-game pick; this can be set after the pick settled. A withdrawn pick keeps its commitment and its real outcome here, but the site's record leaves it out of every count and money figure. Not part of the hashed payload, so it never moves commitment_hash. */
|
|
3340
3357
|
withdrawal_reason: "provider_game_cancelled" | "published_after_kickoff" | null;
|
|
3358
|
+
/** When the site withdrew this pick from its track record, or null when the pick counts. Set beside withdrawal_reason by the same write and never without it, so a reader can tell a correction made after the pick settled (withdrawn_at later than resolved_at) from a withdrawal made while it was pending. null beside a reason only if that instant was not stored. Not part of the hashed payload, so it never moves commitment_hash. */
|
|
3359
|
+
withdrawn_at: string | null;
|
|
3341
3360
|
/** Frozen matchup, for a reader. */
|
|
3342
3361
|
matchup: string;
|
|
3343
3362
|
/** Frozen canonical sport bucket (for example Basketball or MMA), not the exact public league identity; the archive owns that. */
|
|
@@ -3406,6 +3425,8 @@ export type PickOfTheDayLedgerUncommittedEntry = {
|
|
|
3406
3425
|
outcome: "pending" | "win" | "loss" | "void";
|
|
3407
3426
|
/** Omitted while the pick is pending; once it settles, why the site withdrew it from its track record, or null when the pick counts. provider_game_cancelled: Polymarket marked the game Cancelled while the pick was pending. published_after_kickoff: the pick was published at or after its game started, including a suspended match that resumed later, so it was never a pre-game pick; this can be set after the pick settled. A withdrawn pick stays here with its real outcome, but the site's record leaves it out of every count and money figure. */
|
|
3408
3427
|
withdrawal_reason?: "provider_game_cancelled" | "published_after_kickoff" | null;
|
|
3428
|
+
/** Omitted while the pick is pending; once it settles, when the site withdrew it from its track record, or null when the pick counts. Set beside withdrawal_reason by the same write and never without it, so a reader can tell a correction made after the pick settled (withdrawn_at later than resolved_at) from a withdrawal made while it was pending. null beside a reason only if that instant was not stored. */
|
|
3429
|
+
withdrawn_at?: string | null;
|
|
3409
3430
|
/** Frozen matchup, for a reader. */
|
|
3410
3431
|
matchup?: string;
|
|
3411
3432
|
/** Frozen canonical sport bucket (for example Basketball or MMA), not the exact public league identity; the archive owns that. */
|
|
@@ -4501,6 +4522,10 @@ export type Position = {
|
|
|
4501
4522
|
wallet_age_days?: number;
|
|
4502
4523
|
/** True when wallet_age_days is under the new-wallet threshold (30 days), which means 0xinsider first recorded the wallet in the last 30 days. False when wallet_age_days is absent. This public V1 field is first-seen recency, not the wallet's on-chain age. */
|
|
4503
4524
|
is_new_wallet: boolean;
|
|
4525
|
+
/** Additive (since 2026-11-11, #34333): sports and esports markets the wallet closed with a profit or a loss, the divisor of win_rate; pnl.in_scope.markets_decided on GET /api/v1/trader/{address}. Absent when the wallet has no record. */
|
|
4526
|
+
markets_decided?: number;
|
|
4527
|
+
/** Additive (since 2026-11-11, #34333): measured from 5 decided markets (markets_decided), not_enough_data below, the floor the 0xinsider profile and leaderboards apply before they show a win rate. Below it win_rate is still sent; quote markets_decided instead of win_rate as a rate. Sent with markets_decided. */
|
|
4528
|
+
win_rate_status?: "measured" | "not_enough_data";
|
|
4504
4529
|
};
|
|
4505
4530
|
market: {
|
|
4506
4531
|
/** Prefixed ID (`mkt_...`). */
|
|
@@ -5053,9 +5078,15 @@ export type SuspiciousTrade = {
|
|
|
5053
5078
|
title: string | null;
|
|
5054
5079
|
};
|
|
5055
5080
|
scores: {
|
|
5056
|
-
/**
|
|
5081
|
+
/**
|
|
5082
|
+
* Deprecated: always null, because the live scorer records no timing component. How long before kickoff the trade filled is clv.close_anchor_at minus created_at.
|
|
5083
|
+
* @deprecated
|
|
5084
|
+
*/
|
|
5057
5085
|
timing: number | null;
|
|
5058
|
-
/**
|
|
5086
|
+
/**
|
|
5087
|
+
* Deprecated: always null, because the live scorer records no edge component. The trade's edge over the closing line is clv.clv_cents.
|
|
5088
|
+
* @deprecated
|
|
5089
|
+
*/
|
|
5059
5090
|
edge: number | null;
|
|
5060
5091
|
/** Numeric evidence.size when recorded; otherwise null. */
|
|
5061
5092
|
size: number | null;
|
|
@@ -5066,6 +5097,64 @@ export type SuspiciousTrade = {
|
|
|
5066
5097
|
evidence: unknown;
|
|
5067
5098
|
/** Stored trade timestamp. */
|
|
5068
5099
|
created_at: string;
|
|
5100
|
+
/** Closing line value against the market's stored close (GET /api/v1/market/{condition_id}/close), the same object large trades carry. Always present; status says whether it is measured. */
|
|
5101
|
+
clv: {
|
|
5102
|
+
/** The CLV definition, clv@v1. */
|
|
5103
|
+
basis_version: string;
|
|
5104
|
+
/** The anchor pre_kickoff was judged against: the stored close's anchor, else the market's kickoff. */
|
|
5105
|
+
close_anchor_at: string | null;
|
|
5106
|
+
/** The traded outcome's closing price, 0 to 1, whenever a usable close is stored and the outcome is known, in play included. */
|
|
5107
|
+
close_price: number | null;
|
|
5108
|
+
/** Cents per share, positive when the trade beat the close: buy is (close_price - price) * 100, sell is (price - close_price) * 100. Gross of fees. Computed from the trade's exact stored price; price on the wire is rounded to 4 places, so a recomputation from it agrees within 0.005 cents. Set exactly when status is measured. */
|
|
5109
|
+
clv_cents: number | null;
|
|
5110
|
+
/** Whether the trade filled before close_anchor_at. null when the market has no anchor. */
|
|
5111
|
+
pre_kickoff: boolean | null;
|
|
5112
|
+
/** measured: clv_cents is set. in_play: traded at or after the close anchor (kickoff), no CLV is defined. pending: traded before kickoff and the market's close is not stored yet. unavailable: see unavailable_reason. */
|
|
5113
|
+
status: "measured" | "in_play" | "pending" | "unavailable";
|
|
5114
|
+
/** Set exactly when status is unavailable. The market's reasons (see MarketClose.unavailable_reason), plus anchor_stale (the kickoff moved after the close was captured) and outcome_unknown (the traded outcome is not known for this trade). */
|
|
5115
|
+
unavailable_reason: "no_observation_in_lookback" | "provider_empty_window" | "provider_invalid_contract" | "capture_window_closed" | "no_game_start_time" | "not_one_sided_resolution" | "not_captured" | "close_token_mismatch" | "anchor_stale" | "outcome_unknown" | null;
|
|
5116
|
+
/** clv_cents - taker_fee_cents: the CLV after the fee the fill paid, cents per share. Set exactly when both are set. */
|
|
5117
|
+
clv_after_fees_cents: number | null;
|
|
5118
|
+
/** The fee the fill paid as taker, cents per share, from the exchange's on-chain record of the fill (the OrderFilled event in its Polygon receipt); the trader is its taker. Polymarket charges only takers, so a buy's fee adds to its cost and a sell's comes out of its proceeds, and either way it lowers the CLV by this amount. Includes any builder fee an app added; excludes maker and taker rebates, which Polymarket pays later and no fill records. Set whatever status is; null until the record is decoded (about a minute after the trade) and for trades before 2026-08-16. */
|
|
5119
|
+
taker_fee_cents: number | null;
|
|
5120
|
+
};
|
|
5121
|
+
/** How the market settled for the trade's side. A flag is a lead, not a verdict; this is what followed it. */
|
|
5122
|
+
result: {
|
|
5123
|
+
/** won: the trade's side won at settlement, a buy whose outcome won or a sell whose outcome lost. lost: the opposite. void: the market resolved to neither side (cancelled or 50-50). pending: the market has not resolved to a side yet. unknown: the market resolved, but the trade's outcome is not known. */
|
|
5124
|
+
status: "won" | "lost" | "void" | "pending" | "unknown";
|
|
5125
|
+
/** When the market resolved. Set when status is won, lost or void. */
|
|
5126
|
+
resolved_at: string | null;
|
|
5127
|
+
/** What the fill made or lost at settlement, in USDC: shares times (payout - price) for a buy, shares times (price - payout) for a sell, the payout 1 for the winning outcome and 0 for a losing one. Gross of fees and of anything the wallet did after the trade. Set exactly when status is won or lost. */
|
|
5128
|
+
pnl_usdc: number | null;
|
|
5129
|
+
};
|
|
5130
|
+
/** What else the wallet holds that pays if the flagged outcome loses: the hedge the Suspicious trades page shows. Only outcomes that cannot win together with the flagged one count: the other outcome of the same market, and for a Yes buy on a negative-risk market, Yes on the event's other negative-risk markets of the same type. Null when the trade is older than 90 days, the window the page measures. */
|
|
5131
|
+
hedge: {
|
|
5132
|
+
/** Which positions were measured. `live`: the wallet's current positions, while they can still show the hedge. `at_flag`: the positions frozen when the trade was flagged, served once the current ones cannot (the market decided, or the listing went stale or missing). */
|
|
5133
|
+
basis: "live" | "at_flag";
|
|
5134
|
+
/** Each opposing position, largest cost first. Empty unless `state` is `hedged`. */
|
|
5135
|
+
legs: ({
|
|
5136
|
+
/** The leg's market. */
|
|
5137
|
+
condition_id: string;
|
|
5138
|
+
/** The leg's outcome index in that market, 0 or 1 in Polymarket's outcome order (0 is Yes on a Yes/No market). */
|
|
5139
|
+
outcome_index: number;
|
|
5140
|
+
/** Where the money is, in the market's words: the outcome's name ("Raptors"), the market for a generic Yes ("Draw (Real Madrid CF vs. Sevilla FC)"), or "No on" the market for a generic No. */
|
|
5141
|
+
place: string;
|
|
5142
|
+
/** True for the other outcome of the flagged market itself. */
|
|
5143
|
+
same_market: boolean;
|
|
5144
|
+
/** Shares held. Null only when the amount has no finite number. */
|
|
5145
|
+
shares: number | null;
|
|
5146
|
+
/** Shares times the wallet's average entry price, in USD. Null when Polymarket gave no entry price. */
|
|
5147
|
+
usd: number | null;
|
|
5148
|
+
})[];
|
|
5149
|
+
/** The legs' total cost in USD: `0` for `none`, null when a leg's entry price is unknown or nothing was measured. */
|
|
5150
|
+
opposing_usd: number | null;
|
|
5151
|
+
/** When Polymarket listed the positions measured. For `unknown` with `stale`, the last listing, too old to measure from (null on a flag recorded before that time was kept). Null for every other state. */
|
|
5152
|
+
positions_at: string | null;
|
|
5153
|
+
/** `hedged`: holds at least one leg. `none`: holds no leg. `unknown`: see `unknown_reason`, and never read it as `none`. `sell`: the flagged trade is a sell, which takes no side, so nothing is measured. */
|
|
5154
|
+
state: "hedged" | "none" | "unknown" | "sell";
|
|
5155
|
+
/** Set exactly when `state` is `unknown`. `not_loaded`: no position listing for the wallet. `stale`: the last listing is older than the freshness bound. `market_decided`: the flagged market resolved or closed. `read_failed`: the positions read failed. `not_recorded`: the trade was flagged before hedges were recorded. */
|
|
5156
|
+
unknown_reason: "not_loaded" | "stale" | "market_decided" | "read_failed" | "not_recorded" | null;
|
|
5157
|
+
} | null;
|
|
5069
5158
|
};
|
|
5070
5159
|
/** `suspicious_trade_flagged` data (Pro and Max): a trade's suspicion score crossed the flag threshold for the first time. The deprecated spelling `insider_radar_flag_raised` delivers the same object until its sunset on 2027-02-01 (#29352). */
|
|
5071
5160
|
export type SuspiciousTradeFlaggedData = {
|
|
@@ -5176,7 +5265,7 @@ export type Trader = {
|
|
|
5176
5265
|
stats: {
|
|
5177
5266
|
/** Sports and esports markets the wallet traded, any status: pnl.in_scope.markets, dated by the sports_record data_quality group. Omitted until the record is computed. 0 for a wallet that traded no sports or esports market, which never gets a record: at its last completed sync Polymarket counted no market for it, or the sync read its Polymarket positions and found no sports or esports market; none is stored, and no Polymarket sports or esports board lists it; the sports_record group then carries the sync clock (since 2026-10-29, #30589; the second case since #30657). Omitted for a wallet that trades only combos and holds no single sports or esports market, which has no record (since 2026-10-29, #30637). Counted every Polymarket market before 2026-10-27. */
|
|
5178
5267
|
markets_traded?: number;
|
|
5179
|
-
/** Won over decided sports and esports markets, 0 to 1: pnl.in_scope.win_rate truncated to four places, dated by the sports_record data_quality group. Omitted until the record is computed, while the wallet has no decided sports or esports market, for a wallet that traded no sports or esports market (#30589, #30657), and for one that trades only combos (#30637). Counted every Polymarket market before 2026-10-27. */
|
|
5268
|
+
/** Won over decided sports and esports markets, 0 to 1: pnl.in_scope.win_rate truncated to four places, dated by the sports_record data_quality group. Omitted until the record is computed, while the wallet has no decided sports or esports market, for a wallet that traded no sports or esports market (#30589, #30657), and for one that trades only combos (#30637). Counted every Polymarket market before 2026-10-27. Sent at any count of decided markets: read win_rate_status before showing it as a rate (since 2026-11-11, #34315). */
|
|
5180
5269
|
win_rate?: number;
|
|
5181
5270
|
/**
|
|
5182
5271
|
* Deprecated since 2026-10-27 and never sent. It counted mark-to-market days over every Polymarket market of the wallet (#29830). Read stats.all.win_days and stats.all.loss_days from GET /api/v1/trader/{address}/pnl, which count sports and esports days.
|
|
@@ -5187,6 +5276,12 @@ export type Trader = {
|
|
|
5187
5276
|
total_volume?: number;
|
|
5188
5277
|
/** Additive lossless counterpart to `total_volume`, present exactly when it is. */
|
|
5189
5278
|
exact?: TraderStatsExact;
|
|
5279
|
+
/** Additive (since 2026-11-11, #34315): sports and esports markets the wallet closed with a profit or a loss, the divisor of win_rate. A market that closed at zero P&L is in neither count, so it can be below pnl.in_scope.markets_resolved. Sent exactly when pnl.in_scope is, dated by the sports_record data_quality group. */
|
|
5280
|
+
markets_decided?: number;
|
|
5281
|
+
/** Additive (since 2026-11-11, #34315): decided sports and esports markets the wallet closed with a profit; win_rate is markets_won / markets_decided. Sent exactly when pnl.in_scope is, dated by the sports_record data_quality group. */
|
|
5282
|
+
markets_won?: number;
|
|
5283
|
+
/** Additive (since 2026-11-11, #34315): measured from 5 decided markets (markets_decided), not_enough_data below. It is the floor the 0xinsider leaderboards, profile and trade rows apply before they show a win rate, so one lucky market never reads as 100%. Below it win_rate is still sent when present, as the ratio of the counts; quote markets_won of markets_decided instead of a rate. Sent exactly when pnl.in_scope is. */
|
|
5284
|
+
win_rate_status?: "measured" | "not_enough_data";
|
|
5190
5285
|
};
|
|
5191
5286
|
strategy?: {
|
|
5192
5287
|
/** Observed trading style identifier. New rows use two_sided, category_focused, high_activity, diversified, mixed, or unclassified, counted over the wallet's sports and esports markets only. Historical identifiers remain readable during normal reclassification; style does not predict skill or intent. */
|
|
@@ -5383,12 +5478,16 @@ export type TraderContext = {
|
|
|
5383
5478
|
export type TraderEntryPriceAnalysis = {
|
|
5384
5479
|
/** One bucket per price band that has a market, in bucket_order. */
|
|
5385
5480
|
buckets: TraderEntryPriceBucket[];
|
|
5386
|
-
/** The bucket with the highest win rate among buckets of at least 3 markets. null when no bucket has 3. */
|
|
5481
|
+
/** The bucket with the highest win rate among buckets of at least 3 markets. null when no bucket has 3. The 3 counts markets, not decided ones: best_measured_bucket is the pick behind the decided-market floor. */
|
|
5387
5482
|
best_bucket: string | null;
|
|
5388
|
-
/** The bucket with the lowest win rate among buckets of at least 3 markets. null when no bucket has 3. */
|
|
5483
|
+
/** The bucket with the lowest win rate among buckets of at least 3 markets. null when no bucket has 3. The 3 counts markets, not decided ones: worst_measured_bucket is the pick behind the decided-market floor. */
|
|
5389
5484
|
worst_bucket: string | null;
|
|
5390
5485
|
/** What the buckets cover (since 2026-11-03, #32671). */
|
|
5391
5486
|
coverage: TraderEntryPriceCoverage;
|
|
5487
|
+
/** Additive (since 2026-11-11, #34355): the bucket with the highest win rate among buckets whose win_rate_status is measured (5 or more decided markets), so one lucky market is never the best range at 100%. The 0xinsider profile shows this pick. null when no bucket has 5 decided markets. */
|
|
5488
|
+
best_measured_bucket: string | null;
|
|
5489
|
+
/** Additive (since 2026-11-11, #34355): the bucket with the lowest win rate among buckets whose win_rate_status is measured. Equal to best_measured_bucket when one bucket is measured. null exactly when best_measured_bucket is. */
|
|
5490
|
+
worst_measured_bucket: string | null;
|
|
5392
5491
|
};
|
|
5393
5492
|
/** One entry-price band. Each measure is an analytic value: read state before value. */
|
|
5394
5493
|
export type TraderEntryPriceBucket = {
|
|
@@ -5406,6 +5505,10 @@ export type TraderEntryPriceBucket = {
|
|
|
5406
5505
|
total_pnl: AnalyticNumber;
|
|
5407
5506
|
/** Mean realized P&L of a market in the band, USD. */
|
|
5408
5507
|
avg_pnl: AnalyticNumber;
|
|
5508
|
+
/** Additive (since 2026-11-11, #34355): the band's markets with a nonzero P&L, win_rate's divisor. Present on every band. */
|
|
5509
|
+
markets_decided: number;
|
|
5510
|
+
/** Additive (since 2026-11-11, #34355): measured from 5 decided markets (markets_decided), not_enough_data below, the floor the 0xinsider profile applies before it shows a band's win rate, so one lucky market never reads as 100%. Below it win_rate is still sent as before; quote wins of markets_decided instead of a rate. Present on every band. */
|
|
5511
|
+
win_rate_status: "measured" | "not_enough_data";
|
|
5409
5512
|
};
|
|
5410
5513
|
/** The settled sports and esports positions the entry-price section reads. The buckets' markets plus every unbucketed row's are settled_markets, and their realized P&L sums to settled_pnl. settled_pnl adds up the wallet's per-market realized P&L, so it differs from pnl.in_scope.realized_pnl, which is Polymarket's published sports and esports P&L with a share of the wallet's rebates. */
|
|
5411
5514
|
export type TraderEntryPriceCoverage = {
|
|
@@ -5618,12 +5721,16 @@ export type TraderHourlyPerformance = {
|
|
|
5618
5721
|
total_pnl: number;
|
|
5619
5722
|
/** total_pnl over markets, USD. */
|
|
5620
5723
|
avg_pnl: number;
|
|
5724
|
+
/** Additive (since 2026-11-11, #34349): the hour's settled markets with a nonzero P&L, win_rate's divisor. */
|
|
5725
|
+
markets_decided: number;
|
|
5726
|
+
/** Additive (since 2026-11-11, #34349): measured from 5 decided markets (markets_decided), not_enough_data below, the floor the 0xinsider profile applies before it shows an hour's win rate, so one lucky market never reads as 100%. Below it win_rate is still sent; quote wins of markets_decided instead of a rate. */
|
|
5727
|
+
win_rate_status: "measured" | "not_enough_data";
|
|
5621
5728
|
})[];
|
|
5622
|
-
/** The hour with the highest win_rate. null when no entry exists. */
|
|
5729
|
+
/** The hour with the highest win_rate. null when no entry exists. Picked over every hour, an hour of one decided market included: best_measured_hour is the pick behind the decided-market floor. */
|
|
5623
5730
|
best_hour: number | null;
|
|
5624
5731
|
/** best_hour's win_rate, percentage 0-100. null exactly when best_hour is. */
|
|
5625
5732
|
best_win_rate: number | null;
|
|
5626
|
-
/** The hour with the lowest win_rate. null when no entry exists. */
|
|
5733
|
+
/** The hour with the lowest win_rate. null when no entry exists. Picked over every hour, an hour of one decided market included: worst_measured_hour is the pick behind the decided-market floor. */
|
|
5627
5734
|
worst_hour: number | null;
|
|
5628
5735
|
/** worst_hour's win_rate, percentage 0-100. null exactly when worst_hour is. */
|
|
5629
5736
|
worst_win_rate: number | null;
|
|
@@ -5631,6 +5738,16 @@ export type TraderHourlyPerformance = {
|
|
|
5631
5738
|
spread_pp: number | null;
|
|
5632
5739
|
/** true when at least 12 hours have markets and every one of them has the same P&L sign, so the hour-to-hour spread says little about timing. */
|
|
5633
5740
|
is_approximate: boolean;
|
|
5741
|
+
/** Additive (since 2026-11-11, #34355): the hour with the highest win_rate among entries whose win_rate_status is measured (5 or more decided markets), so one lucky market is never the best hour at 100%. The 0xinsider profile shows this pick. null when no hour has 5 decided markets; the five measured fields are null together. */
|
|
5742
|
+
best_measured_hour: number | null;
|
|
5743
|
+
/** Additive (since 2026-11-11, #34355): best_measured_hour's win_rate, percentage 0-100. null exactly when best_measured_hour is. */
|
|
5744
|
+
best_measured_win_rate: number | null;
|
|
5745
|
+
/** Additive (since 2026-11-11, #34355): best_measured_win_rate minus worst_measured_win_rate, percentage points. null exactly when best_measured_hour is. */
|
|
5746
|
+
measured_spread_pp: number | null;
|
|
5747
|
+
/** Additive (since 2026-11-11, #34355): the hour with the lowest win_rate among entries whose win_rate_status is measured. Equal to best_measured_hour when one hour is measured. null exactly when best_measured_hour is. */
|
|
5748
|
+
worst_measured_hour: number | null;
|
|
5749
|
+
/** Additive (since 2026-11-11, #34355): worst_measured_hour's win_rate, percentage 0-100. null exactly when worst_measured_hour is. */
|
|
5750
|
+
worst_measured_win_rate: number | null;
|
|
5634
5751
|
};
|
|
5635
5752
|
/** A trader's sports and esports daily P&L object. `id`, `freshness_at`, `series_status` and `realized` are 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. While `series_status` is `pending` the sections are empty and never mean zero. */
|
|
5636
5753
|
export type TraderPnl = {
|
|
@@ -5784,6 +5901,10 @@ export type TraderPnlInScope = {
|
|
|
5784
5901
|
markets_out_of_scope: number;
|
|
5785
5902
|
/** When the record behind these figures was computed. */
|
|
5786
5903
|
as_of: string;
|
|
5904
|
+
/** Additive (since 2026-11-11, #34333): sports and esports markets the wallet closed with a profit or a loss, the divisor of win_rate. A market that closed at zero P&L is in neither count, so it can be below markets_resolved. */
|
|
5905
|
+
markets_decided?: number;
|
|
5906
|
+
/** Additive (since 2026-11-11, #34333): measured from 5 decided markets (markets_decided), not_enough_data below. It is the floor the 0xinsider leaderboards, profile and trade rows apply before they show a win rate, so one lucky market never reads as 100%. Below it win_rate is still sent; quote the decided count instead of win_rate as a rate. Sent with markets_decided. */
|
|
5907
|
+
win_rate_status?: "measured" | "not_enough_data";
|
|
5787
5908
|
};
|
|
5788
5909
|
/** Edge over the price paid (#32270, #32622): how often the side a wallet bought won, minus the average price it paid, over its settled sports and esports markets of $20 or more at a known entry price. Probabilities throughout: edge 0.012 is 1.2 percentage points. The same figures as LeaderboardPriceEdge, plus the shrunk edge the profile badge and the leaderboard show. No hold: a hold is a fact of a leaderboard row, not of the wallet. */
|
|
5789
5910
|
export type TraderPriceEdge = {
|
|
@@ -5845,6 +5966,12 @@ export type TraderTimeBreakdownBand = {
|
|
|
5845
5966
|
profit_factor: number | null;
|
|
5846
5967
|
/** Realized P&L of the band's markets, USD. */
|
|
5847
5968
|
total_pnl: number | null;
|
|
5969
|
+
/** Additive (since 2026-11-11, #34349): the band's resolved markets that made money, win_rate's numerator. Present on every band. */
|
|
5970
|
+
markets_won?: number;
|
|
5971
|
+
/** Additive (since 2026-11-11, #34349): the band's resolved markets with a nonzero P&L, win_rate's divisor. Present on every band. */
|
|
5972
|
+
markets_decided?: number;
|
|
5973
|
+
/** Additive (since 2026-11-11, #34349): measured from 5 decided markets (markets_decided), not_enough_data below, the floor the 0xinsider profile applies before it shows a band's win rate, so one lucky market never reads as 100%. Below it win_rate is still sent when present; quote markets_won of markets_decided instead of a rate. Present on every band. */
|
|
5974
|
+
win_rate_status?: "measured" | "not_enough_data";
|
|
5848
5975
|
};
|
|
5849
5976
|
/** The hold-time and first-trade-hour bands of the profile's Performance breakdown card, over the wallet's sports and esports markets with a realized P&L. */
|
|
5850
5977
|
export type TraderTimeBreakdowns = {
|
|
@@ -5912,7 +6039,7 @@ export type TrendingWallet = {
|
|
|
5912
6039
|
window_markets_traded: number;
|
|
5913
6040
|
/** Distinct in-window UTC trade days from our trades (0 if the winner is not in our DB). */
|
|
5914
6041
|
window_trade_days: number;
|
|
5915
|
-
/** All-time trader grade; a separate axis from streak_tier. Led by realized profit on sports and esports markets (the money actually banked, about 95 percent of the grade; since 2026-10-22, the sports and esports share of the wallet's realized P&L), with forecasting calibration, risk-adjusted returns, and consistency as the tie-breaker and proven-trader guardrails: any grade above C requires verified net-positive realized profit on those markets, and the top grades also require a real track record of resolved sports and esports markets plus a survivable drawdown. Relative, so it drifts as the cohort moves. Omitted when the trader is Unranked (fewer than 5 markets, or too little verified record to cohort-rank). */
|
|
6042
|
+
/** All-time trader grade; a separate axis from streak_tier. Led by realized profit on sports and esports markets (the money actually banked, about 95 percent of the grade; since 2026-10-22, the sports and esports share of the wallet's realized P&L), with forecasting calibration, risk-adjusted returns, and consistency as the tie-breaker and proven-trader guardrails: any grade above C requires verified net-positive realized profit on those markets, and the top grades also require a real track record of resolved sports and esports markets plus a survivable drawdown. Relative, so it drifts as the cohort moves. Omitted when the trader is Unranked (fewer than 5 sports or esports markets, or too little verified record to cohort-rank). */
|
|
5916
6043
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
5917
6044
|
/** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
|
|
5918
6045
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
@@ -6538,6 +6665,10 @@ export interface OperationData {
|
|
|
6538
6665
|
unit_score?: number;
|
|
6539
6666
|
/** When the backed game starts (RFC3339 UTC): the full pick's kickoff. */
|
|
6540
6667
|
kickoff?: string;
|
|
6668
|
+
/** The full pick's backed_side_share: the Side share the pick's page shows, as a 0..1 fraction. */
|
|
6669
|
+
backed_side_share?: number;
|
|
6670
|
+
/** The full pick's sharp_positioned_usd: the Sharp positioned value the pick's page shows, in USD. */
|
|
6671
|
+
sharp_positioned_usd?: number;
|
|
6541
6672
|
}[];
|
|
6542
6673
|
proof_pending_picks?: ({
|
|
6543
6674
|
is_free_selection: boolean;
|
|
@@ -7149,7 +7280,7 @@ export interface OperationQuery {
|
|
|
7149
7280
|
getPickOfTheDay: {
|
|
7150
7281
|
/** A product day (America/New_York) in YYYY-MM-DD format, on or before today. Omit it, or send today, for the current read. A past day with no published pick returns 404 not_found with error.param=date; a date after today, or a value that is not a date, returns 400 bad_request with error.param=date. */
|
|
7151
7282
|
date?: string;
|
|
7152
|
-
/** full (default) is the whole recorded set: every pick with its thesis, and its holders, lead backer, sports context and entry_authorization when recorded, and the top-level copy of the first pick. summary returns pick_date, pick_count, the disclaimer once, and each entitled pick's identity, side, price, result, return and grade (pick_id, publication_order, is_free_selection, matchup, category, display_category, event_slug, polymarket_url, token_id, pick_outcome_label, outcome, backed_price, stake_usd, return_usd, unit_score, top_grade, holder_count, clv_status, clv_pct, release_at, kickoff, game_started, game_ended), with the same scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. The locked-only state=none body is the same in both views. Any other value returns 400 bad_request with error.param=view. */
|
|
7283
|
+
/** full (default) is the whole recorded set: every pick with its thesis, and its holders, lead backer, sports context and entry_authorization when recorded, and the top-level copy of the first pick. summary returns pick_date, pick_count, the disclaimer once, and each entitled pick's identity, side, price, result, return and grade (pick_id, publication_order, is_free_selection, matchup, category, display_category, event_slug, polymarket_url, token_id, pick_outcome_label, outcome, backed_price, stake_usd, return_usd, unit_score, top_grade, holder_count, backed_side_share, sharp_positioned_usd, clv_status, clv_pct, release_at, kickoff, game_started, game_ended), with the same scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. The locked-only state=none body is the same in both views. Any other value returns 400 bad_request with error.param=view. */
|
|
7153
7284
|
view?: "full" | "summary";
|
|
7154
7285
|
/** One entitled published pick, by its stable decimal-string pick_id. Without date it reads the pick on its own product day, whatever day published it, under the same tier rule as date with pick_id. The body carries that pick once, as picks[0], beside state, pick_date and pick_count=1. It leaves out the top-level copy of the first pick that a set read without pick_id repeats, and scheduled_picks, proof_pending_picks, locked_picks and more_picks_until. With date, the pick must be one of that day's. A pick_id that is not among the day's entitled published picks (its own day without date, or the date sent) returns 404 not_found with error.param=pick_id, as does one that no served pick has (unknown, skipped or withdrawn); one whose holder proof is not readable yet returns 503 read_model_warming with Retry-After; a value that is not a positive canonical decimal returns 400 bad_request with error.param=pick_id. */
|
|
7155
7286
|
pick_id?: string;
|
|
@@ -7159,7 +7290,7 @@ export interface OperationQuery {
|
|
|
7159
7290
|
view?: "full" | "summary";
|
|
7160
7291
|
/** Rows per page of picks, 1 to 200, default 50. An integer outside that range is clamped into it, like every list limit, and X-Effective-Query reports the limit applied; a value that is not an integer returns 400 invalid_query. On view=full, sending limit or cursor pages picks and adds page, while days and hit_rate still describe the whole record; with neither, the response is the whole record. */
|
|
7161
7292
|
limit?: number;
|
|
7162
|
-
/** The page.next_cursor of the previous page: the rows after it, newest first. A cursor is a position in the record, so a pick published while you page does not shift later pages.
|
|
7293
|
+
/** The page.next_cursor of the previous page: the rows after it, newest first. A cursor is a position in the record, pick_date.pick_rank (YYYY-MM-DD.N), so a pick published while you page does not shift later pages. Any value in that form is read as a position, including one this route did not return, and the page holds the rows after it; a value not in that form returns 400 bad_request with error.param=cursor. */
|
|
7163
7294
|
cursor?: string;
|
|
7164
7295
|
};
|
|
7165
7296
|
getPickOfTheDayLedger: Record<string, never>;
|
|
@@ -7366,6 +7497,8 @@ export interface OperationQuery {
|
|
|
7366
7497
|
severity?: "flag" | "watch";
|
|
7367
7498
|
/** Pagination mode. live (default) keeps the 120-second response cache; stable pins the walk to one published scoring generation and binds the cursor to the limit and filters. */
|
|
7368
7499
|
mode?: "live" | "stable";
|
|
7500
|
+
/** List order. suspicion_score (default) lists the highest score first; recent lists the newest flagged trade (greatest created_at) first. Each sort, in each mode, issues its own cursor, and a cursor from another sort returns 400 bad_request. An unknown value returns 400 bad_request with param sort. */
|
|
7501
|
+
sort?: "suspicion_score" | "recent";
|
|
7369
7502
|
};
|
|
7370
7503
|
listLargePositions: {
|
|
7371
7504
|
/** Maximum number of large positions to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -7599,6 +7732,8 @@ export interface OperationQuery {
|
|
|
7599
7732
|
severity?: "flag" | "watch";
|
|
7600
7733
|
/** Pagination mode. live (default) keeps the 120-second response cache; stable pins the walk to one published scoring generation and binds the cursor to the limit and filters. */
|
|
7601
7734
|
mode?: "live" | "stable";
|
|
7735
|
+
/** List order. suspicion_score (default) lists the highest score first; recent lists the newest flagged trade (greatest created_at) first. Each sort, in each mode, issues its own cursor, and a cursor from another sort returns 400 bad_request. An unknown value returns 400 bad_request with param sort. */
|
|
7736
|
+
sort?: "suspicion_score" | "recent";
|
|
7602
7737
|
};
|
|
7603
7738
|
listTrendingWallets: {
|
|
7604
7739
|
/** Polymarket's weekly leaderboard caps the ranked set at 50 wallets; requests above 50 still return at most 50. Out-of-range values are clamped to 1..50. */
|