@0xinsider/sdk 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/schema.d.ts CHANGED
@@ -76,8 +76,8 @@ export type ApiError = {
76
76
  /** The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response. */
77
77
  retry_at?: string;
78
78
  freshness?: FreshnessFailure;
79
- /** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
80
- reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
79
+ /** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
80
+ reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
81
81
  };
82
82
  meta: ResponseMeta;
83
83
  };
@@ -90,8 +90,8 @@ export type ApiErrorBody = {
90
90
  /** The recommended next retry instant (RFC3339). Present on every retryable error (reason=pick_not_released, code=rate_limited including reason=monthly_quota_exceeded, code=rate_limit_unavailable, reason=read_model_warming) and omitted otherwise. Always in the future. For pick_not_released, the recommendation is advisory and can change before a pick becomes available. Schedule the next request from the returned value instead of inferring a release schedule or polling. Prefer Retry-After for the duration because it is immune to client clock skew. */
91
91
  retry_at?: string;
92
92
  freshness?: FreshnessFailure;
93
- /** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
94
- reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
93
+ /** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
94
+ reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
95
95
  };
96
96
  export type BatchMarketFlowItem = {
97
97
  /** Zero-based request index. Duplicate inputs keep separate result rows. */
@@ -392,7 +392,8 @@ export type CounterpartyAnalysis = {
392
392
  };
393
393
  export type CounterpartyExecution = {
394
394
  execution_id: string;
395
- exchange_family: "ctf_v2" | "neg_risk_ctf_v2";
395
+ /** Polymarket exchange contract that emitted the execution: `ctf_v2` the CTF Exchange v2, `neg_risk_ctf_v2` the Neg Risk CTF Exchange v2, `exchange_v3` ExchangeV3, which settles Polymarket Protocol V2 binary and neg-risk markets. Treat an unknown value as another exchange. */
396
+ exchange_family: "ctf_v2" | "neg_risk_ctf_v2" | "exchange_v3";
396
397
  transaction_hash: string;
397
398
  orders_matched_log_index: number;
398
399
  taker: CounterpartyParticipant;
@@ -622,7 +623,7 @@ export type EdgeHunterObservation = {
622
623
  export type EdgeHunterObservationCoverage = {
623
624
  /** Sum of canonical source-generation funnel input across all sports, before category, cohort or selector projection. */
624
625
  input_markets: number;
625
- /** Canonical source-generation input assigned capacity_limited. These markets were intentionally outside the bounded holder-work admission and are not missing emitted rows. */
626
+ /** Canonical source-generation input assigned capacity_limited. These markets were intentionally outside the bounded holder-work admission and are not missing emitted rows. It includes the admitted pregame wider_holder markets of any sport no request named in the last 30 minutes, whose holders the generation did not read. */
626
627
  capacity_limited_markets: number;
627
628
  /** All wider_holder and in_play observations emitted in the canonical source generation, before cohort, category or selector projection. Emerging pile is an overlapping projection and does not add source emissions. */
628
629
  emitted_observations: number;
@@ -1005,8 +1006,12 @@ export type ExploreGroup = {
1005
1006
  markets: ExploreMarket[];
1006
1007
  /** The volume of the group's highest-volume market, which is markets[0]: the same figure as that market's volume, Polymarket's cumulative taker volume in shares rather than cash. Null when unavailable. */
1007
1008
  rep_volume: number | null;
1008
- /** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value. */
1009
+ /** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1009
1010
  rep_large_trades: number | null;
1011
+ /**
1012
+ * Deprecated spelling of rep_large_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read rep_large_trades.
1013
+ * @deprecated
1014
+ */
1010
1015
  rep_whales: number | null;
1011
1016
  };
1012
1017
  export type ExploreMarket = {
@@ -1028,17 +1033,33 @@ export type ExploreMarket = {
1028
1033
  /** Polymarket's traded-volume figure for the market, as last stored: cumulative taker volume in shares, each counted at its $1 settlement value, not the cash that changed hands (100 shares bought at $0.40 add 100, not 40). It can lag Polymarket's current figure. sort=volume orders by it. Null when unavailable. */
1029
1034
  volume: number | null;
1030
1035
  liquidity: number | null;
1031
- /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
1036
+ /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1032
1037
  large_trade_count: number | null;
1038
+ /**
1039
+ * Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
1040
+ * @deprecated
1041
+ */
1033
1042
  whale_trade_count: number | null;
1034
- /** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value. */
1043
+ /** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1035
1044
  large_trade_distinct_wallets: number | null;
1045
+ /**
1046
+ * Deprecated spelling of large_trade_distinct_wallets, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_distinct_wallets.
1047
+ * @deprecated
1048
+ */
1036
1049
  whale_distinct_wallets: number | null;
1037
- /** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value. */
1050
+ /** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1038
1051
  large_trade_total_usd: number | null;
1052
+ /**
1053
+ * Deprecated spelling of large_trade_total_usd, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_total_usd.
1054
+ * @deprecated
1055
+ */
1039
1056
  whale_total_usd: number | null;
1040
- /** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value. */
1057
+ /** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1041
1058
  large_trade_last_at: string | null;
1059
+ /**
1060
+ * Deprecated spelling of large_trade_last_at, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_last_at.
1061
+ * @deprecated
1062
+ */
1042
1063
  whale_last_trade_at: string | null;
1043
1064
  end_date: string | null;
1044
1065
  created_at: string | null;
@@ -1075,15 +1096,19 @@ export type ExploreMarket = {
1075
1096
  discover_score: number | null;
1076
1097
  score_components: {
1077
1098
  volume_signal: number | null;
1078
- /** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
1099
+ /** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1079
1100
  large_trade_signal: number | null;
1101
+ /**
1102
+ * Deprecated spelling of large_trade_signal, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_signal.
1103
+ * @deprecated
1104
+ */
1080
1105
  whale_signal: number | null;
1081
1106
  liquidity_signal: number | null;
1082
1107
  recency_signal: number | null;
1083
- /** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value. */
1108
+ /** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1084
1109
  sharp_money_signal: number | null;
1085
1110
  /**
1086
- * Deprecated spelling of sharp_money_signal; emitted beside it with the same value and never removed.
1111
+ * Deprecated spelling of sharp_money_signal; emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money_signal.
1087
1112
  * @deprecated
1088
1113
  */
1089
1114
  smart_money_signal: number | null;
@@ -1157,15 +1182,15 @@ export type ExportSourceRange = {
1157
1182
  latest_market_activity_at: string | null;
1158
1183
  };
1159
1184
  export type ExportVolumeReconciliation = {
1160
- /** Verified full-history both-sides USD cash volume. Null without coverage; the local activity numerator may cover only a subset of history. */
1185
+ /** Verified full-history both-sides USD cash volume across every market of the wallet. Null without coverage. */
1161
1186
  provider_lifetime_volume: number | null;
1162
- /** Cash in USD, buys and sells, summed over the daily P&L rows this export carries, from the fills 0xinsider has stored for the wallet. It can cover less history than provider_lifetime_volume; never Polymarket's share count. */
1163
- exported_activity_volume: number;
1187
+ /** Cash in USD, buys and sells, in sports and esports markets, summed over the daily P&L rows this export carries (their total_volume, from the fills 0xinsider stores for the wallet). Never Polymarket's share count. Null when any of those rows has no volume: a sum over the other days would be a partial subtotal. A wallet whose stored history 0xinsider has not rebuilt yet still sums cash across every market, and is null once it has a day from 2026-10-23 on. */
1188
+ exported_activity_volume: number | null;
1164
1189
  /** Cost basis in USD summed over the wallet's sports and esports markets, the markets section of the export. */
1165
1190
  exported_market_cost_basis: number;
1166
- /** provider_lifetime_volume minus exported_activity_volume, in USD, rounded to cents. Null when provider_lifetime_volume is null. */
1191
+ /** Always null. provider_lifetime_volume covers every market and exported_activity_volume sports and esports markets only, so their difference measures nothing; the field stays so existing clients keep parsing the object. */
1167
1192
  provider_activity_volume_gap: number | null;
1168
- /** exported_activity_volume divided by provider_lifetime_volume, a fraction of the cash, not a percent. Null when provider_lifetime_volume is null or zero. */
1193
+ /** Always null, for the same reason as provider_activity_volume_gap. */
1169
1194
  activity_volume_coverage: number | null;
1170
1195
  };
1171
1196
  export type FreshnessFailure = {
@@ -1474,14 +1499,14 @@ export type LargeTrade = {
1474
1499
  /** Current trade review score on a 0..1 scale; higher values indicate a stronger review signal. This is the current response value and can differ from the recorded score. Missing measurements remain unavailable. */
1475
1500
  review_score: number;
1476
1501
  /**
1477
- * Deprecated alias of review_score with the same current value and 0..1 scale.
1502
+ * Deprecated alias of review_score with the same current value and 0..1 scale. Sunset 2027-02-01 (#29352): removed from V1 on that date; read review_score.
1478
1503
  * @deprecated
1479
1504
  */
1480
1505
  signal_score: number;
1481
1506
  /** 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. */
1482
1507
  recorded_review_score: number | null;
1483
1508
  /**
1484
- * 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.
1509
+ * 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 until its sunset on 2027-02-01 (#29352), when it is removed.
1485
1510
  * @deprecated
1486
1511
  */
1487
1512
  recorded_signal_score: number | null;
@@ -1558,7 +1583,7 @@ export type LargeTradeInsertedV2Data = {
1558
1583
  traded_at: string;
1559
1584
  platform: "polymarket";
1560
1585
  };
1561
- /** `large_trades_inserted` data (Pro and Max): new large trades were ingested. It carries a count and no trade; subscribe to `large_trade_inserted_v2` for the trade itself. The deprecated spelling `whale_trades_inserted` delivers the same object. */
1586
+ /** `large_trades_inserted` data (Pro and Max): new large trades were ingested. It carries a count and no trade; subscribe to `large_trade_inserted_v2` for the trade itself. The deprecated spelling `whale_trades_inserted` delivers the same object until its sunset on 2027-02-01 (#29352). */
1562
1587
  export type LargeTradesInsertedData = {
1563
1588
  /** Large trades the producing batch admitted. */
1564
1589
  count: number;
@@ -1586,13 +1611,15 @@ export type LeaderboardEntry = {
1586
1611
  pnl?: number;
1587
1612
  /** Native realized P&L plus credited maker and taker rebates in USD, with fees already included. The exact numeric value is truncated toward zero to cents before JSON conversion. Omitted when the wallet has no native snapshot or the snapshot has no net realized value; never filled from another P&L basis. */
1588
1613
  realized_pnl?: number;
1589
- /** The 0xinsider correction to Polymarket's P&L for neg-risk conversions. Present only when one is published; realized_pnl keeps Polymarket's own figure and pnl_correction.realized adds the amount to it. The grade and the ranking use the corrected figure. net_total is omitted here. */
1614
+ /** The 0xinsider correction to Polymarket's P&L for neg-risk conversions. Present only when one is published; realized_pnl keeps Polymarket's own figure and pnl_correction.realized adds the amount to it. Since 2026-10-22 the grade and the ranking read the sports and esports share of the corrected figure. net_total is omitted here. */
1590
1615
  pnl_correction?: PnlCorrection;
1591
1616
  /** Full-history both-sides USD cash volume from a verified Polymarket user-volume observation. Omitted without coverage. */
1592
1617
  volume?: number;
1593
1618
  markets_traded?: number;
1594
- /** The wallet's win rate across ALL categories, not the filtered one. ?category= decides WHICH wallets are listed (the wallet must be ranked in that category); it does not rescope this field, so a soccer-filtered list still reports each wallet's overall rate. For a per-category record use GET /api/v1/trader/{address}/categories. */
1619
+ /** The wallet's win rate across ALL categories, not the filtered one. ?category= decides WHICH wallets are listed (the wallet must be ranked in that category); it does not rescope this field, so a soccer-filtered list still reports each wallet's overall rate. For a per-category record use GET /api/v1/trader/{address}/categories. in_scope.win_rate is the sports and esports rate. */
1595
1620
  win_rate?: number;
1621
+ /** Additive (#27859): the wallet's sports and esports record, the same object as GET /api/v1/trader/{address} pnl.in_scope, as of the leaderboard's last refresh. The 0xinsider leaderboard page shows and sorts by in_scope.realized_pnl and in_scope.win_rate. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero. pnl, realized_pnl and win_rate stay wallet-wide. */
1622
+ in_scope?: TraderPnlInScope;
1596
1623
  /** 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. */
1597
1624
  strategy_type?: string;
1598
1625
  /** Provider platform. Always polymarket. */
@@ -1666,8 +1693,12 @@ export type MarketFlow = {
1666
1693
  direction: "YES" | "NO";
1667
1694
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
1668
1695
  token_id: string | null;
1669
- /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
1696
+ /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1670
1697
  large_trade_count: number;
1698
+ /**
1699
+ * Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
1700
+ * @deprecated
1701
+ */
1671
1702
  whale_trade_count: number;
1672
1703
  buy_volume_usd: number;
1673
1704
  sell_volume_usd: number;
@@ -1685,7 +1716,7 @@ export type MarketFlow = {
1685
1716
  oldest_snapshot_as_of: string | null;
1686
1717
  };
1687
1718
  /**
1688
- * Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
1719
+ * Deprecated alias of sharp_money; byte-identical. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money.
1689
1720
  * @deprecated
1690
1721
  */
1691
1722
  smart_money: {
@@ -1693,8 +1724,12 @@ export type MarketFlow = {
1693
1724
  direction: "YES" | "NO";
1694
1725
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
1695
1726
  token_id: string | null;
1696
- /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
1727
+ /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
1697
1728
  large_trade_count: number;
1729
+ /**
1730
+ * Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
1731
+ * @deprecated
1732
+ */
1698
1733
  whale_trade_count: number;
1699
1734
  buy_volume_usd: number;
1700
1735
  sell_volume_usd: number;
@@ -1752,7 +1787,7 @@ export type MarketHolder = {
1752
1787
  /** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (under the floor of 5 decided markets in the category), or `unavailable` (the market has no canonical category, or the read failed; retry later). Always present on this route. */
1753
1788
  category_win_rate_status: "measured" | "not_enough_data" | "unavailable";
1754
1789
  category_evidence?: HolderCategoryEvidence;
1755
- /** Days since this wallet's first trade. The five badge fields are present together, only for a wallet that draws at least one badge. */
1790
+ /** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
1756
1791
  wallet_age_days?: number | null;
1757
1792
  /** True when the wallet's first trade was under 30 days ago. */
1758
1793
  is_new_wallet?: boolean;
@@ -1838,12 +1873,12 @@ export type MarketSnapshot = {
1838
1873
  /** Polymarket series slug from the canonical identity row, null when unavailable. A sports series identifies a league and must not be used as a per-matchup grouping key. */
1839
1874
  series_slug: string | null;
1840
1875
  /**
1841
- * Always null. Deprecated (#24169): 0xinsider has never stored a value for this field. The key stays on the wire so existing clients keep parsing; do not read it.
1876
+ * Always null. Deprecated (#24169): 0xinsider has never stored a value for this field. The key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed; do not read it.
1842
1877
  * @deprecated
1843
1878
  */
1844
1879
  market_type: string | null;
1845
1880
  /**
1846
- * Always null. Deprecated (#24169): 0xinsider stores no value for this field on a Polymarket market. The key stays on the wire so existing clients keep parsing; do not read it. market.status and market.resolved_at say whether the market has closed or resolved.
1881
+ * Always null. Deprecated (#24169): 0xinsider stores no value for this field on a Polymarket market. The key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed; do not read it. market.status and market.resolved_at say whether the market has closed or resolved.
1847
1882
  * @deprecated
1848
1883
  */
1849
1884
  market_result: string | null;
@@ -1960,7 +1995,7 @@ export type PickHolder = {
1960
1995
  category_win_rate_game?: string;
1961
1996
  /** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the resolved-market floor of 5 in the category), or `unavailable` (the annotation read failed; retry later). Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample. */
1962
1997
  category_win_rate_status?: "measured" | "not_enough_data" | "unavailable";
1963
- /** Days since this wallet's first trade. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
1998
+ /** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request, and the pick's ETag holds between requests. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
1964
1999
  wallet_age_days?: number | null;
1965
2000
  /** True when the wallet's first trade was under 30 days ago. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
1966
2001
  is_new_wallet?: boolean;
@@ -2429,7 +2464,7 @@ export type PickOfTheDayLedgerOpenedEntry = {
2429
2464
  matchup: string;
2430
2465
  /** Frozen canonical sport bucket (for example Basketball or MMA), not the exact public league identity; the archive owns that. */
2431
2466
  category: string;
2432
- /** The pick's public page. */
2467
+ /** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
2433
2468
  permalink: string;
2434
2469
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
2435
2470
  pick_id: string;
@@ -2461,7 +2496,7 @@ export type PickOfTheDayLedgerSealedEntry = {
2461
2496
  commitment_algo: "sha256(canonical_json(payload)||nonce)";
2462
2497
  /** When the hash was frozen. Always strictly before kickoff: a pick that reaches kickoff unsealed stays unsealed forever, because a seal written after the game started would be a backdated proof. */
2463
2498
  sealed_at: string;
2464
- /** The pick's public page. */
2499
+ /** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
2465
2500
  permalink: string;
2466
2501
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
2467
2502
  pick_id: string;
@@ -2501,7 +2536,7 @@ export type PickOfTheDayLedgerUncommittedEntry = {
2501
2536
  resolved_at: string | null;
2502
2537
  /** The pick's market, side and price once it has settled; null while it is pending, and null for a settled pick whose stored row lacks one of these columns. Not hashed: nothing was committed over these values, which is what pre_commitment: true says. */
2503
2538
  payload: PickOfTheDayUncommittedPayload | null;
2504
- /** The pick's public page. */
2539
+ /** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
2505
2540
  permalink: string;
2506
2541
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
2507
2542
  pick_id: string;
@@ -2537,10 +2572,10 @@ export type PickOfTheDayNoEntitledPicks = {
2537
2572
  /** Entitled published picks whose holder proof is unreadable, ordered by rank. Unauthorized ranks appear only in locked_picks and cannot trigger proof warming. Read retry_at for the next read. */
2538
2573
  proof_pending_picks?: ProofPendingPickSlot[];
2539
2574
  /**
2540
- * Deprecated (#24157): always null, as on every Pick of the Day shape.
2575
+ * Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id.
2541
2576
  * @deprecated
2542
2577
  */
2543
- supersedes_pick_id: null;
2578
+ supersedes_pick_id: string | null;
2544
2579
  };
2545
2580
  /** A settled uncommitted pick's market, side and price. The same eight fields as PickOfTheDayCommitmentPayload, in the same key order, so a settled pick's side and price sit under payload whatever the entry's state. It is NOT a commitment: no hash was taken over it before the game, and it proves nothing about when the pick was made. */
2546
2581
  export type PickOfTheDayUncommittedPayload = {
@@ -2561,18 +2596,18 @@ export type PickOfTheDayUncommittedPayload = {
2561
2596
  /** Provider platform. Always polymarket. */
2562
2597
  platform: "polymarket";
2563
2598
  };
2564
- /** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Team logos and league logo are provider-owned (Polymarket /teams crests for clubs, country flags for national teams and tennis players); no local derivation. */
2599
+ /** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Each team `logo` is a registered club crest or national flag as a same-origin path where one exists, and provider artwork otherwise. */
2565
2600
  export type PickSportsContext = {
2566
2601
  /** League or competition display name (e.g. "Premier League"). */
2567
2602
  league_name: string | null;
2568
- /** Provider-owned event taxonomy from Gamma eventMetadata, joined in league · serie · tournament order with blanks and case-insensitive duplicates removed. Separate from league_name; omitted when the provider does not supply the metadata. */
2603
+ /** Provider-owned event taxonomy from Gamma eventMetadata, joined in league · serie · tournament order with blanks and case-insensitive duplicates removed. A tennis qualifying match ends in ", Qualification", including an ATP Challenger qualifying match, which Gamma marks only in eventMetadata.tennisFixtureSource. Separate from league_name; omitted when the provider does not supply the metadata. */
2569
2604
  competition_label?: string;
2570
2605
  /** League logo URL (provider-owned). */
2571
2606
  league_logo: string | null;
2572
2607
  /** The team mapped to the market's YES outcome, or the parent-event home/first team when event_matchup is true. */
2573
- yes_team: PickSportsTeam;
2608
+ yes_team: PickSportsTeam | null;
2574
2609
  /** The team mapped to the market's NO outcome, or the parent-event away/second team when event_matchup is true. */
2575
- no_team: PickSportsTeam;
2610
+ no_team: PickSportsTeam | null;
2576
2611
  /** Provider game identifier (Polymarket Gamma gameId); omitted when the provider supplies none. */
2577
2612
  game_id?: number;
2578
2613
  /** Always present. True when the two teams are the parent-event match identity for a teamless binary leg (e.g. a draw, totals, or prop market), not the market's own outcomes. */
@@ -2592,7 +2627,7 @@ export type PickSportsTeam = {
2592
2627
  full_name: string | null;
2593
2628
  /** Provider team identifier (Polymarket /teams id). */
2594
2629
  provider_id: number | null;
2595
- /** Team crest or flag URL. Official NFL (32), WNBA (15), NBA (30), NHL (32), and MLB (30) club crests use same-origin relative paths (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>`); resolve relative URLs against the API origin. Vendored soccer club crests use the same path with `.png`. Other teams use provider artwork, including country flags for national teams and tennis players. Novelty and national-team rows outside the vendored club sets retain provider artwork. */
2630
+ /** Team crest or flag URL. Official NFL (32), WNBA (15), NBA (30), NHL (32), and MLB (30) club crests use same-origin relative paths (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>`); resolve relative URLs against the API origin. Vendored soccer club crests use the same path with `.png`. National teams in the registered national-team competitions use the same path with `.svg`: the official national flag, drawn whole at its own aspect. Other teams use provider artwork, including country flags for tennis players. Novelty rows, and national-team rows that are not exactly one country, retain provider artwork. */
2596
2631
  logo: string | null;
2597
2632
  /** True when artwork measurements show that the team mark needs a light plate on a dark background. Vendored crest verdicts are tied to the exact asset bytes; provider artwork is measured by the teams sync. Always sent; false when no current measurement marks the logo dark. */
2598
2633
  logo_mark_dark: boolean;
@@ -2621,10 +2656,18 @@ export type PlatformCapabilities = {
2621
2656
  pnl: PlatformCapabilityStatus;
2622
2657
  strategy: PlatformCapabilityStatus;
2623
2658
  timeline: PlatformCapabilityStatus;
2624
- /** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
2659
+ /** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
2625
2660
  large_trades: PlatformCapabilityStatus;
2661
+ /**
2662
+ * Deprecated spelling of large_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trades.
2663
+ * @deprecated
2664
+ */
2626
2665
  whale_signal: PlatformCapabilityStatus;
2627
2666
  suspicious_trades: PlatformCapabilityStatus;
2667
+ /**
2668
+ * Deprecated spelling of suspicious_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read suspicious_trades.
2669
+ * @deprecated
2670
+ */
2628
2671
  insider_radar: PlatformCapabilityStatus;
2629
2672
  market_snapshot: PlatformCapabilityStatus;
2630
2673
  };
@@ -2635,13 +2678,13 @@ export type Platforms = {
2635
2678
  polymarket: PlatformCapabilities;
2636
2679
  };
2637
2680
  };
2638
- /** A derived 0xinsider correction to Polymarket's P&L, never a Polymarket value. Polymarket misbooks neg-risk conversions, in both directions: it puts cost on placeholder YES outcomes minted by a conversion and never books it as a loss (negative amount), and its position records leave out shares the wallet really got, such as YES minted by a conversion, so it books no P&L on them (positive amount). Per neg-risk market the wallet converted in, 0xinsider measures Polymarket's own activity cash against the sum of its position P&L, and sums the difference over every measured market whose shares did not move by direct transfer: transferred shares have no activity row, so such a market keeps Polymarket's figure and is counted in markets_excluded. It is published once every neg-risk market the wallet converted in is measured and checked for transfers, and stays as last published until then (on the trader body, pnl.correction_pending says so); a sum under $1 either way publishes nothing. The body's own P&L fields keep Polymarket's figures; this object adds the amount and the corrected figures. Money is truncated toward zero to cents. */
2681
+ /** A derived 0xinsider correction to Polymarket's P&L, never a Polymarket value. Polymarket misbooks neg-risk conversions, in both directions: it puts cost on placeholder YES outcomes minted by a conversion and never books it as a loss (negative amount), and its position records leave out shares the wallet really got, such as YES minted by a conversion, so it books no P&L on them (positive amount). Per neg-risk market the wallet converted in, 0xinsider measures Polymarket's own activity cash against the sum of its position P&L, and sums the difference over every measured market whose shares did not move by direct transfer: transferred shares have no activity row, so such a market keeps Polymarket's figure and is counted in markets_excluded. It is published once every neg-risk market with a sports or esports event that the wallet converted in is measured and checked for transfers, and stays as last published until then; a market with no sports or esports event is not measured, and counts only when it was measured before (on the trader body, pnl.correction_pending says so); a sum under $1 either way publishes nothing. The body's own P&L fields keep Polymarket's figures; this object adds the amount and the corrected figures. Money is truncated toward zero to cents. */
2639
2682
  export type PnlCorrection = {
2640
2683
  /** The correction method. */
2641
2684
  basis: "neg_risk_conversion_v1";
2642
2685
  /** The correction in USD. Negative when Polymarket overstates the wallet. */
2643
2686
  amount: number;
2644
- /** Polymarket's net realized P&L plus amount: the figure 0xinsider grades on. Omitted when Polymarket's figure is. */
2687
+ /** Polymarket's net realized P&L plus amount. Since 2026-10-22 the grade reads this figure's sports and esports share. Omitted when Polymarket's figure is. */
2645
2688
  realized?: number;
2646
2689
  /** Polymarket's net total P&L plus amount: the 0xinsider profile's Total P&L. Omitted when Polymarket's figure is, and on leaderboard entries. */
2647
2690
  net_total?: number;
@@ -2793,15 +2836,15 @@ export type ProofPendingPickSlot = {
2793
2836
  supersedes_pick_id: string | null;
2794
2837
  };
2795
2838
  export type ReportPayload = {
2796
- /** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value. */
2839
+ /** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
2797
2840
  total_large_trades: number | null;
2798
2841
  total_whale_trades: number | null;
2799
- /** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value. */
2842
+ /** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
2800
2843
  total_large_trade_volume: number | null;
2801
2844
  total_whale_volume: number | null;
2802
2845
  biggest_trade_size: number | null;
2803
2846
  active_traders: number | null;
2804
- /** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value. */
2847
+ /** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
2805
2848
  top_large_trades: ({
2806
2849
  /** Provider outcome label for the traded side. */
2807
2850
  outcome: string | null;
@@ -2954,7 +2997,7 @@ export type ScoreCell = {
2954
2997
  };
2955
2998
  /** Shape the provider score string was parsed into. `two_side` is one aggregate per side (basketball `105-98`), `multi_set` is per-set columns (tennis `6-7(5-7), 6-0, 1-0`), `esports_series` is a maps/sets/format triplet (`000-000|2-0|Bo3`). Omitted when the score could not be parsed. */
2956
2999
  export type ScoreFormat = "two_side" | "multi_set" | "esports_series";
2957
- /** `sharp_money_flow_detected` data (Pro and Max): ranked-trader net flow on a market crossed the threshold. The deprecated spelling `smart_money_flow_detected` delivers the same object. */
3000
+ /** `sharp_money_flow_detected` data (Pro and Max): ranked-trader net flow on a market crossed the threshold. The deprecated spelling `smart_money_flow_detected` delivers the same object until its sunset on 2027-02-01 (#29352). */
2958
3001
  export type SharpMoneyFlowDetectedData = {
2959
3002
  /** Polymarket condition id of the market. */
2960
3003
  condition_id: string;
@@ -2987,14 +3030,18 @@ export type SmartMoneyFlowMarket = {
2987
3030
  direction: "YES" | "NO";
2988
3031
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
2989
3032
  token_id: string | null;
2990
- /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
3033
+ /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
2991
3034
  large_trade_count: number;
3035
+ /**
3036
+ * Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
3037
+ * @deprecated
3038
+ */
2992
3039
  whale_trade_count: number;
2993
3040
  buy_volume_usd: number;
2994
3041
  sell_volume_usd: number;
2995
3042
  };
2996
3043
  /**
2997
- * Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
3044
+ * Deprecated alias of sharp_money; byte-identical. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money.
2998
3045
  * @deprecated
2999
3046
  */
3000
3047
  smart_money: {
@@ -3002,8 +3049,12 @@ export type SmartMoneyFlowMarket = {
3002
3049
  direction: "YES" | "NO";
3003
3050
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
3004
3051
  token_id: string | null;
3005
- /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
3052
+ /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
3006
3053
  large_trade_count: number;
3054
+ /**
3055
+ * Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
3056
+ * @deprecated
3057
+ */
3007
3058
  whale_trade_count: number;
3008
3059
  buy_volume_usd: number;
3009
3060
  sell_volume_usd: number;
@@ -3015,8 +3066,12 @@ export type SnapshotCompleteness = {
3015
3066
  status: "complete" | "partial" | "empty";
3016
3067
  reason: string;
3017
3068
  expected_days: number;
3018
- /** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value. */
3069
+ /** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
3019
3070
  covered_days_with_large_trade_activity: number;
3071
+ /**
3072
+ * Deprecated spelling of covered_days_with_large_trade_activity, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read covered_days_with_large_trade_activity.
3073
+ * @deprecated
3074
+ */
3020
3075
  covered_days_with_whale_activity: number;
3021
3076
  };
3022
3077
  export type SnapshotState = {
@@ -3069,7 +3124,7 @@ export type SuspiciousTrade = {
3069
3124
  /** Stored trade timestamp. */
3070
3125
  created_at: string;
3071
3126
  };
3072
- /** `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. */
3127
+ /** `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). */
3073
3128
  export type SuspiciousTradeFlaggedData = {
3074
3129
  /** Numeric id of the flagged trade, a JSON number. It is the `id` that `GET /api/v1/large-trades/{id}` accepts. */
3075
3130
  trade_id: number;
@@ -3146,15 +3201,11 @@ export type Trader = {
3146
3201
  net_total?: number;
3147
3202
  /** The 0xinsider correction to Polymarket's P&L for neg-risk conversions. Present only when one is published; pnl.net_total and pnl.realized keep Polymarket's own figures, and correction.net_total and correction.realized add the amount to them. */
3148
3203
  correction?: PnlCorrection;
3149
- /** true while 0xinsider is still checking some of the wallet's converted neg-risk markets (not yet measured, measured and not yet checked for transfers, or its latest reads keep failing), so the correction may change, or arrive where none is published yet. Omitted otherwise. */
3204
+ /** true while 0xinsider is still checking some of the wallet's converted neg-risk markets with a sports or esports event (not yet measured, measured and not yet checked for transfers, or its latest reads keep failing), so the correction may change, or arrive where none is published yet. Omitted otherwise. */
3150
3205
  correction_pending?: boolean;
3151
3206
  /** For pnl.realized, expand=trust marks a matching native accounting snapshot as computed: native Polymarket realized P&L plus credited maker and taker rebates, with fees already included. The exact numeric value is truncated toward zero to cents before conversion to a JSON number. Without a matching native accounting snapshot, pnl.realized is omitted and its trust metadata is unavailable. Raw total P&L is never substituted for realized P&L. */
3152
3207
  realized?: number;
3153
3208
  unrealized?: number;
3154
- /** DEPRECATED, never sent. The local pnl_7d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native weekly window from GET /api/trader/{address}/profile-summary instead. */
3155
- last_7d?: number;
3156
- /** 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. */
3157
- last_30d?: number;
3158
3209
  /** Additive lossless counterpart. Omitted when the trusted native realized-P&L source is unavailable; existing numeric fields keep their display-safe v1 semantics. */
3159
3210
  exact?: TraderPnlExact;
3160
3211
  /** Additive (#27311): the wallet's sports and esports record, the figure the 0xinsider profile headlines. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero. The other pnl fields stay Polymarket's wallet-wide figures. */
@@ -3175,7 +3226,7 @@ export type Trader = {
3175
3226
  description?: string;
3176
3227
  confidence?: number;
3177
3228
  };
3178
- /** Per-category rank context when expand=categories is requested. Values include available rank, category totals, performance and record counts; scaled_total_pnl is a legacy alias of total_pnl. Its measurement basis and update timing differ from the plain record returned by GET /api/v1/trader/{address}/categories, so the two need not agree. Use this for rank context and that route for the plain record. The inner key-set is intentionally unconstrained and may contain additional compatibility fields. */
3229
+ /** Per-category rank context when expand=categories is requested. Values include available rank, category totals, performance and record counts; scaled_total_pnl is a legacy alias of total_pnl. Its measurement basis and update timing differ from the plain record returned by GET /api/v1/trader/{address}/categories, so the two need not agree. Use this for rank context and that route for the plain record. Sports and esports only (#28761): keys are sports and esports categories, and a category outside them is omitted, as on that route. The inner key-set is intentionally unconstrained and may contain additional compatibility fields. */
3179
3230
  category_strengths?: Record<string, unknown>;
3180
3231
  /** Curated advanced risk/performance metrics (expand=quant_metrics or expand[]=quant_metrics). Omitted unless expanded and backed by a computed row strictly under six hours old; a missing row, NULL computed_at, or age of exactly six hours or more is stale and omitted. Provider-input changes may intentionally lag inside the bounded six-hour window. When present, all listed fields are present (each is a number or null); null means insufficient trade history and must not be treated as 0. The fixed field shape is unchanged. */
3181
3232
  quant_metrics?: {
@@ -3206,7 +3257,7 @@ export type Trader = {
3206
3257
  data_quality: DataQuality;
3207
3258
  /** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
3208
3259
  trust?: TraderTrust;
3209
- /** 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. */
3260
+ /** 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. Sports and esports only (#28827): a category outside them is omitted, as on GET /api/v1/trader/{address}/categories. */
3210
3261
  category_records?: CategorySkillV2[];
3211
3262
  category_skill_model?: CategorySkillModelReadiness;
3212
3263
  };
@@ -3393,7 +3444,7 @@ export type TraderExportPositionWatermark = {
3393
3444
  };
3394
3445
  export type TraderExportSnapshot = {
3395
3446
  address: string;
3396
- /** The markets the export file's trades and markets sections hold: sports and esports markets only. counts.exported_markets, counts.estimated_trade_rows, counts.estimated_size_mb, reconciliation.exported_market_cost_basis and source_range.latest_trade_at and latest_market_activity_at describe those markets. The pnl dates, pnl_days, exported_activity_volume and completeness cover every market of the wallet. */
3447
+ /** The markets the export file's trades and markets sections hold: sports and esports markets only. counts.exported_markets, counts.estimated_trade_rows, counts.estimated_size_mb, reconciliation.exported_market_cost_basis and source_range.latest_trade_at and latest_market_activity_at describe those markets, and reconciliation.exported_activity_volume is the cash the wallet traded in sports and esports markets. The pnl dates, pnl_days and completeness cover every market of the wallet. */
3397
3448
  product_scope: "sports_esports_v1";
3398
3449
  generated_at: string;
3399
3450
  source_range: ExportSourceRange;
@@ -3447,7 +3498,7 @@ export type TraderGradeAt = {
3447
3498
  source_observed_by: string | null;
3448
3499
  } | null;
3449
3500
  };
3450
- /** 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. */
3501
+ /** 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. */
3451
3502
  export type TraderPnl = {
3452
3503
  /** Prefixed trader ID (`trd_...`). */
3453
3504
  id: string;
@@ -3474,18 +3525,35 @@ export type TraderPnl = {
3474
3525
  drawdown: number | null;
3475
3526
  } | null;
3476
3527
  };
3477
- /** RFC3339 served-freshness clock for this trader's PnL history = traders.daily_pnl_recomputed_at, when the daily_pnl read model this response is served from was last rebuilt; null when it has never been recomputed for the trader. Always present, so read it as a value that can be null rather than a key that can be missing. */
3528
+ /** RFC3339 served-freshness clock: when the wallet's sports and esports record, which this series is read from, was last computed; null while series_status is pending. Always present, so read it as a value that can be null rather than a key that can be missing. */
3478
3529
  freshness_at: string | null;
3479
- /** Daily cumulative-P&L series (oldest-first). Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. cumulative_profit and total_pnl stay cumulative from the start of the stored history, so a clipped slice keeps the same economic meaning; view.anchor carries the point before the window. */
3480
- entries?: {
3530
+ /** `ready` when the series is served; an empty one is a wallet with no sports or esports day. `pending` when the wallet's sports and esports record does not carry the daily series yet: every section is empty, realized is null, and the empty sections never mean zero. Retry later. */
3531
+ series_status: "ready" | "pending";
3532
+ /** How the daily series adds up to the wallet's Sports P&L, full precision: dated_pnl + undated_pnl = realized_pnl. null while series_status is pending. */
3533
+ realized: {
3534
+ /** The rule behind realized_pnl, the same basis as pnl.in_scope.basis on GET /api/v1/trader/{address}. */
3535
+ basis: "polymarket_sports_esports_v1" | "sports_esports_split_v1";
3536
+ /** The wallet's Sports P&L: pnl.in_scope.realized_pnl on GET /api/v1/trader/{address}. null when the wallet has no published realized figure. */
3537
+ realized_pnl: number | null;
3538
+ /** The sum of every day's daily_change over the full history, whatever from/to say. */
3539
+ dated_pnl: number;
3540
+ /** realized_pnl less dated_pnl. realized_pnl starts from Polymarket's figures under either basis (its sports and esports figures, or its published figure for the whole wallet split by cost) and the days from the per-market record, so undated_pnl holds the wallet's share of Polymarket rebates, the in-scope part of the neg-risk conversion correction, any market with no trade date, and the difference between Polymarket's figure and the per-market record, which on some wallets is most of it. null exactly when realized_pnl is. */
3541
+ undated_pnl: number | null;
3542
+ } | null;
3543
+ /** Sports and esports daily P&L series (oldest-first): one point for each UTC day with realized P&L or sports and esports volume. Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. cumulative_profit and total_pnl are the running sum of daily_change from the start of the history, so a clipped slice keeps the same economic meaning; view.anchor carries the point before the window. */
3544
+ entries?: ({
3481
3545
  date: string;
3546
+ /** Sports and esports markets this wallet traded on this UTC day, counted from the fills 0xinsider stores for it. Omitted on a day whose stored fills include a market outside sports and esports (stored before October 2026), where the count would include it, and on a day above 20 times the wallet's median day. */
3482
3547
  markets_traded?: number;
3483
- /** Cash in USD this wallet traded on this UTC day, buys and sells, summed from the fills 0xinsider has stored for it. Not Polymarket's share count, and not the full-history stats.total_volume on GET /api/v1/trader/{address}. Omitted, with markets_traded, on a day above 20 times the wallet's median day. */
3548
+ /** Cash in USD this wallet traded on this UTC day in sports and esports markets, buys and sells, summed from the fills 0xinsider stores for it. Not Polymarket's share count, and not the full-history stats.total_volume on GET /api/v1/trader/{address}, which covers every market. Omitted on a day with realized P&L and no stored sports or esports fill, and, with markets_traded, on a day above 20 times the wallet's median day. */
3484
3549
  total_volume?: number;
3550
+ /** Running sum of daily_change through this day. */
3485
3551
  cumulative_profit?: number;
3552
+ /** The same running sum as cumulative_profit. */
3486
3553
  total_pnl?: number;
3554
+ /** Realized P&L of the wallet's sports and esports markets dated to this UTC day: a settled market on its resolution day, else its last trade day; an open market's realized part on its last trade day. 0 on a day with volume and nothing realized. */
3487
3555
  daily_change: number;
3488
- }[];
3556
+ })[];
3489
3557
  /** Pre-derived period stats. Present unless the request's `sections` excluded it. Always the published all/90d/30d/7d windows over the full stored history; `from`/`to` never recompute them over the request's range. */
3490
3558
  stats?: {
3491
3559
  all: {
@@ -3542,12 +3610,13 @@ export type TraderPnl = {
3542
3610
  };
3543
3611
  };
3544
3612
  /** Per-month P&L aggregation. Present unless the request's `sections` excluded it. Whole months over the full stored history, never clipped to `from`/`to`, so a month is never a partial month. */
3545
- monthly?: {
3613
+ monthly?: ({
3546
3614
  year: number;
3547
3615
  month: number;
3548
3616
  pnl: number;
3549
- markets_traded: number;
3550
- }[];
3617
+ /** The month's entries[].markets_traded summed: a market traded on several days counts once a day. null when a day of the month has total_volume and no markets_traded, a day whose stored fills include a market outside sports and esports, where a sum would undercount. A day with no stored fill, or above 20 times the wallet's median day, adds 0. */
3618
+ markets_traded: number | null;
3619
+ })[];
3551
3620
  /** Per-year P&L totals (ascending by year). Present unless the request's `sections` excluded it. Whole years over the full stored history, never clipped to `from`/`to`. */
3552
3621
  year_totals?: {
3553
3622
  year: number;
@@ -3565,11 +3634,11 @@ export type TraderPnlExact = {
3565
3634
  /** 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. */
3566
3635
  realized: ExactDecimal;
3567
3636
  };
3568
- /** A wallet's sports and esports record (#27311): Polymarket's published realized P&L (pnl.realized plus any published pnl.correction) split into the part earned on sports and esports markets. Fees, refunds and rebates stay in, apportioned by cost. A wallet wholly in sports keeps the published figure exactly; one with no sports market gets 0. Refreshed after each wallet sync; as_of dates it. */
3637
+ /** A wallet's sports and esports record (#27311). basis names the rule behind realized_pnl (#29370): polymarket_sports_esports_v1 is Polymarket's own realized P&L for the wallet in its sports and esports categories, plus the wallet's maker and taker rebates apportioned by its sports and esports share of its Polymarket volume (by cost while Polymarket reports no overall volume) and the in-scope part of any published pnl.correction; sports_esports_split_v1, used until both of the wallet's category figures are confirmed, is Polymarket's published realized P&L (pnl.realized plus any published pnl.correction) split into the part earned on sports and esports markets, with fees, refunds and rebates apportioned by cost. Refreshed after each wallet sync and each read of Polymarket's category leaderboards; as_of dates the market counts. */
3569
3638
  export type TraderPnlInScope = {
3570
- /** Names the split rule, currently sports_esports_split_v1. A new value means the rule changed; compare figures only within one basis. */
3639
+ /** The rule behind realized_pnl: polymarket_sports_esports_v1 (Polymarket's sports and esports category figures plus apportioned rebates) or sports_esports_split_v1 (the published realized figure split by cost). A new value means the rule changed; compare figures only within one basis. */
3571
3640
  basis: string;
3572
- /** Sports and esports realized P&L in USD, display-safe. null when the wallet has no published realized figure to split. */
3641
+ /** Sports and esports realized P&L in USD, display-safe. null when the split basis has no published realized figure to split. */
3573
3642
  realized_pnl: number | null;
3574
3643
  /** Sports and esports markets the wallet has traded, any status. */
3575
3644
  markets: number;
@@ -3587,7 +3656,7 @@ export type TraderStatsExact = {
3587
3656
  /** stats.total_volume as an exact decimal: full-history both-sides cash volume in USD, Polymarket user-volume `volume_usdc`, from the verified `trader_usd_volume` observation. Never Polymarket's share count. */
3588
3657
  total_volume: ExactDecimal;
3589
3658
  };
3590
- /** `trader_synced` data: a tracked wallet finished a sync pass and has a fresh grade. The deprecated spelling `whale_trader_synced` delivers the same object. */
3659
+ /** `trader_synced` data: a tracked wallet finished a sync pass and has a fresh grade. The deprecated spelling `whale_trader_synced` delivers the same object until its sunset on 2027-02-01 (#29352). */
3591
3660
  export type TraderSyncedData = {
3592
3661
  /** 0xinsider's numeric id for the wallet. */
3593
3662
  trader_id: number;
@@ -3641,7 +3710,7 @@ export type TrendingWallet = {
3641
3710
  window_markets_traded: number;
3642
3711
  /** Distinct in-window UTC trade days from our trades (0 if the winner is not in our DB). */
3643
3712
  window_trade_days: number;
3644
- /** All-time trader grade; a separate axis from streak_tier. Led by realized profit (the money actually banked, about 95 percent of the grade), 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, and the top grades also require a real resolved-market track record 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). */
3713
+ /** 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). */
3645
3714
  grade?: "S" | "A" | "B" | "C" | "D" | "F";
3646
3715
  /** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
3647
3716
  streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
@@ -3651,11 +3720,13 @@ export type TrendingWallet = {
3651
3720
  pnl_correction?: PnlCorrection;
3652
3721
  all_time_score?: number;
3653
3722
  last_synced?: string;
3654
- /** Shape-only daily P&L sparkline across the window, derived from Polymarket's documented user-pnl cumulative curve (GET /v2/user-pnl) converted to per-day deltas. It conveys the trend of the curve only and is NOT guaranteed to sum to trending_pnl_usd, which is the canonical leaderboard total. */
3723
+ /** The wallet's sports and esports realized P&L on each UTC day of the window, ascending, one point a day, pnl_usd 0 on a day with none: the same in-scope realized day series the trader P&L endpoint serves. Empty while daily_pnl_series_status is pending, which never means zero. It leaves out non-sports markets, so it does not sum to trending_pnl_usd, which is Polymarket's leaderboard figure across all markets. */
3655
3724
  daily_pnl_series: {
3656
3725
  date: string;
3657
3726
  pnl_usd: number;
3658
3727
  }[];
3728
+ /** `ready` when daily_pnl_series is served; an all-zero one is a wallet with no sports or esports P&L in the window. `pending` when the wallet's sports and esports record does not carry its daily series yet, or the wallet is not in the 0xinsider database: daily_pnl_series is empty and never means zero. Retry later. */
3729
+ daily_pnl_series_status: "ready" | "pending";
3659
3730
  };
3660
3731
  /** Whether the described value or result set is complete for its stated contract. */
3661
3732
  export type TrustCompleteness = {
@@ -3802,7 +3873,7 @@ export type WebhookEndpoint = {
3802
3873
  signing_secret?: string;
3803
3874
  verification?: WebhookVerification;
3804
3875
  };
3805
- /** 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. */
3876
+ /** 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. The deprecated spellings (whale_trades_inserted, whale_trader_synced, insider_radar_flag_raised, smart_money_flow_detected) reach their sunset on 2027-02-01 (#29352); register the canonical spelling. */
3806
3877
  export type WebhookEventDescriptor = {
3807
3878
  id: WebhookEventType;
3808
3879
  /** One-line description of when the event fires. */
@@ -4501,7 +4572,7 @@ export interface OperationQuery {
4501
4572
  status?: "active" | "closed" | "all";
4502
4573
  /** Filter by source platform. Explore is Polymarket-only; polymarket is the only supported value and the parameter is accepted for backward-compatibility but does not change the result set. */
4503
4574
  platform?: "polymarket";
4504
- /** Sort order for the discovery feed. `large_trades` ranks by large-trade activity; `whales` is its deprecated spelling and selects the same order. */
4575
+ /** Sort order for the discovery feed. `large_trades` ranks by large-trade activity; `whales` is its deprecated spelling and selects the same order until its sunset on 2027-02-01 (#29352); from then it answers 400 bad_request. */
4505
4576
  sort?: "trending" | "hot" | "expiring" | "large_trades" | "whales" | "volume" | "newest";
4506
4577
  /** Opaque pagination cursor from the previous response. */
4507
4578
  cursor?: string;
@@ -4593,7 +4664,7 @@ export interface OperationQuery {
4593
4664
  min_grade?: "S" | "A" | "B";
4594
4665
  /** Maximum holders per page. Out-of-range values are clamped to 1..100. */
4595
4666
  limit?: number;
4596
- /** Opaque pagination cursor from the previous response's next_cursor. New cursors carry an absolute next offset bound to normalized condition_id, outcome and effective min_grade, so limit can change without skipping or repeating rows on the same roster. Different market/filter bindings return 400 bad_request with param=cursor; omitted filters match all/B and mkt_-prefixed IDs match their raw condition_id. Legacy page-only cursors remain accepted without scheduled retirement and require their original limit; their next response emits the new format. A cursor remains valid across roster refreshes, which can still repeat or skip holders as the live roster changes. */
4667
+ /** Opaque pagination cursor from the previous response's next_cursor. New cursors carry an absolute next offset bound to normalized condition_id, outcome and effective min_grade, so limit can change without skipping or repeating rows on the same roster. Different market/filter bindings return 400 bad_request with param=cursor; omitted filters match all/B and mkt_-prefixed IDs match their raw condition_id. Page-only cursors from before 2026-10-02 are no longer accepted and return 400 bad_request with param=cursor; restart without a cursor. A cursor remains valid across roster refreshes, which can still repeat or skip holders as the live roster changes. */
4597
4668
  cursor?: string;
4598
4669
  };
4599
4670
  getMarketIntel: {