@0xinsider/mcp 2.13.0 → 2.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +10 -0
  2. package/dist/cli-lib.d.ts.map +1 -1
  3. package/dist/cli-lib.js +14 -10
  4. package/dist/cli-lib.js.map +1 -1
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +37 -22
  7. package/dist/client.js.map +1 -1
  8. package/dist/constants.d.ts +1 -1
  9. package/dist/constants.js +1 -1
  10. package/dist/product-cli/index.d.ts.map +1 -1
  11. package/dist/product-cli/index.js +25 -7
  12. package/dist/product-cli/index.js.map +1 -1
  13. package/dist/product-cli/oauth.js +6 -6
  14. package/dist/product-cli/oauth.js.map +1 -1
  15. package/dist/product-cli/storage.d.ts +1 -1
  16. package/dist/product-cli/storage.js +3 -3
  17. package/dist/product-cli/storage.js.map +1 -1
  18. package/dist/prompts/index.js.map +1 -1
  19. package/dist/resources/index.js +4 -4
  20. package/dist/resources/index.js.map +1 -1
  21. package/dist/sdk/client.d.ts +32 -81
  22. package/dist/sdk/client.d.ts.map +1 -1
  23. package/dist/sdk/client.js +65 -28
  24. package/dist/sdk/client.js.map +1 -1
  25. package/dist/sdk/data-quality.d.ts +4 -4
  26. package/dist/sdk/data-quality.d.ts.map +1 -1
  27. package/dist/sdk/data-quality.js +1 -1
  28. package/dist/sdk/data-quality.js.map +1 -1
  29. package/dist/sdk/errors.d.ts +5 -6
  30. package/dist/sdk/errors.d.ts.map +1 -1
  31. package/dist/sdk/errors.js +4 -5
  32. package/dist/sdk/errors.js.map +1 -1
  33. package/dist/sdk/index.d.ts +5 -5
  34. package/dist/sdk/index.d.ts.map +1 -1
  35. package/dist/sdk/index.js +3 -3
  36. package/dist/sdk/index.js.map +1 -1
  37. package/dist/sdk/pagination.d.ts +3 -3
  38. package/dist/sdk/pagination.d.ts.map +1 -1
  39. package/dist/sdk/pagination.js +3 -3
  40. package/dist/sdk/pagination.js.map +1 -1
  41. package/dist/sdk/retry.js +4 -2
  42. package/dist/sdk/retry.js.map +1 -1
  43. package/dist/sdk/schema.d.ts +242 -113
  44. package/dist/sdk/schema.d.ts.map +1 -1
  45. package/dist/sdk/stream.d.ts +28 -8
  46. package/dist/sdk/stream.d.ts.map +1 -1
  47. package/dist/sdk/stream.js +277 -76
  48. package/dist/sdk/stream.js.map +1 -1
  49. package/dist/sdk/webhooks.d.ts +14 -6
  50. package/dist/sdk/webhooks.d.ts.map +1 -1
  51. package/dist/sdk/webhooks.js +11 -3
  52. package/dist/sdk/webhooks.js.map +1 -1
  53. package/dist/server.js +1 -1
  54. package/dist/server.js.map +1 -1
  55. package/dist/tools/explore-markets.d.ts +7 -7
  56. package/dist/tools/explore-markets.d.ts.map +1 -1
  57. package/dist/tools/get-large-positions.d.ts +6 -6
  58. package/dist/tools/get-large-positions.d.ts.map +1 -1
  59. package/dist/tools/get-large-positions.js +2 -4
  60. package/dist/tools/get-large-positions.js.map +1 -1
  61. package/dist/tools/get-leaderboard.d.ts.map +1 -1
  62. package/dist/tools/get-leaderboard.js +7 -1
  63. package/dist/tools/get-leaderboard.js.map +1 -1
  64. package/dist/tools/get-position-timeline.d.ts +4 -4
  65. package/dist/tools/get-position-timeline.d.ts.map +1 -1
  66. package/dist/tools/get-position-timeline.js +2 -4
  67. package/dist/tools/get-position-timeline.js.map +1 -1
  68. package/dist/tools/get-positions.d.ts +8 -8
  69. package/dist/tools/get-positions.d.ts.map +1 -1
  70. package/dist/tools/get-trending-wallets.d.ts +3 -3
  71. package/dist/tools/get-trending-wallets.d.ts.map +1 -1
  72. package/dist/tools/get-trending-wallets.js +2 -4
  73. package/dist/tools/get-trending-wallets.js.map +1 -1
  74. package/dist/tools/get-whale-trades.d.ts.map +1 -1
  75. package/dist/tools/get-whale-trades.js +2 -4
  76. package/dist/tools/get-whale-trades.js.map +1 -1
  77. package/dist/tools/pick-of-the-day.js +3 -3
  78. package/dist/tools/read-parity.js +2 -2
  79. package/dist/tools/read-parity.js.map +1 -1
  80. package/dist/tools/result.d.ts +5 -1
  81. package/dist/tools/result.d.ts.map +1 -1
  82. package/dist/tools/result.js +11 -7
  83. package/dist/tools/result.js.map +1 -1
  84. package/package.json +7 -3
@@ -87,7 +87,7 @@ export type ApiErrorBody = {
87
87
  message: string;
88
88
  doc_url?: string;
89
89
  param?: string;
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: before the 11:00 UTC operating-window start, before a selected pick's stored release, or after a skipped day, it names the automatic system's next boundary. While no candidate exists in the live window it normally names the persisted next automatic selector attempt. Every value is advisory and can change before release. When the automatic schedule is absent/due or a pick is overdue it degrades to ~60s. Schedule one request and do not poll. Prefer Retry-After for the duration because it is immune to client clock skew. */
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: before the 07:00 UTC operating-window start, before a selected pick's stored release, or after a skipped day, it names the automatic system's next boundary. While no candidate exists in the live window it normally names the persisted next automatic selector attempt. Every value is advisory and can change before release. When the automatic schedule is absent/due or a pick is overdue it degrades to ~60s. Schedule one request and do not poll. Prefer Retry-After for the duration because it is immune to client clock skew. */
91
91
  retry_at?: string;
92
92
  freshness?: FreshnessFailure;
93
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 outside the HOT/WARM sync tiers -- stop asking for this wallet. 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 Pro 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. */
@@ -254,6 +254,10 @@ export type CreateWebhookRequest = {
254
254
  event_types: WebhookEventType[];
255
255
  trade_filters?: LargeTradeSubscriptionFilters;
256
256
  };
257
+ export type CreateWebhookVerificationAttemptRequest = {
258
+ /** The original one-time token returned by webhook creation or a URL change. Sent only in the request body and signed receiver challenge. */
259
+ verification_token: string;
260
+ };
257
261
  /** Compact data age and coverage for a response body, always present on the operations that publish it. Read status and as_of to decide whether to use the body at all, and field_groups to see which part is weak. Everything here comes from stored observation clocks, so a cached body reports the same ages a freshly computed one does: meta.cached and meta.cache_age_s stay the only transport-time facts and neither makes this block newer. The per-field audit object is still available through expand=trust; this is the default summary of the same question. */
258
262
  export type DataQuality = {
259
263
  /** fresh when every group is fresh, unavailable when every group is unavailable, and partial in every other case. */
@@ -534,7 +538,7 @@ export type Game = {
534
538
  competitors: GameCompetitor[];
535
539
  /** The esports series length, for example Bo3. Omitted for everything else. */
536
540
  series_format?: string;
537
- /** Whether one of this game's markets pays on a draw. Read this instead of assuming a two-outcome moneyline. */
541
+ /** Whether this read includes a market classified as paying on a draw, including soccer's independent 1X2 draw leg. Read this instead of assuming a two-outcome moneyline. */
538
542
  draw_offered: boolean;
539
543
  /** Every market this read linked to the game, ordered by condition_id. */
540
544
  markets: GameMarket[];
@@ -598,7 +602,7 @@ export type GameMarket = {
598
602
  slug?: string;
599
603
  /** The provider's own market type, for example moneyline or spread. Omitted when the provider sent none. Not an enum: the provider owns this vocabulary and adds to it. */
600
604
  sports_market_type?: string;
601
- /** Which side of the game this market's YES leg pays. draw is a real value: a 1X2 market's third leg is not a competitor. Omitted when the provider ids do not classify the leg, which is not the same as other. */
605
+ /** Which side of the game this market's YES leg pays. Soccer 1X2 legs are explicitly classified as home, draw or away by the provider projection. draw is a real value, not a competitor. Omitted when the provider projection cannot classify the leg, which is not the same as other. */
602
606
  side?: "home" | "away" | "draw" | "other";
603
607
  /** The provider's label for the YES outcome. Omitted when the provider sent none. */
604
608
  outcome_yes?: string;
@@ -802,10 +806,10 @@ export type LargeTrade = {
802
806
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
803
807
  token_id: string | null;
804
808
  price: number;
805
- /** Current 0.0–1.0 review score, computed at request time from the trade's size, the trader's win rate today, a bonus when a trader with a win rate above 55% trades at a price below 30¢, and the trade's age now. A higher score means read this trade first; it does not measure edge or predict an outcome. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_review_score for that. Canonical since #16311; signal_score carries the same value. */
809
+ /** 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. */
806
810
  review_score: number;
807
811
  /**
808
- * Current 0.0–1.0 review score, computed at request time from the trader's win rate today and the trade's age now. Deprecated (#16311): `review_score` is the canonical spelling and carries the same value; this key stays on the wire.
812
+ * Deprecated alias of review_score with the same current value and 0..1 scale.
809
813
  * @deprecated
810
814
  */
811
815
  signal_score: number;
@@ -890,6 +894,7 @@ export type LeaderboardEntry = {
890
894
  markets_traded?: number;
891
895
  /** 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. */
892
896
  win_rate?: number;
897
+ /** Observed trading style identifier. New rows use two_sided, category_focused, high_activity, diversified, mixed, or unclassified. Historical identifiers remain readable during normal reclassification; style does not predict skill or intent. */
893
898
  strategy_type?: string;
894
899
  /** Provider platform. Always polymarket. */
895
900
  platform: "polymarket";
@@ -1115,8 +1120,10 @@ export type MarketSnapshot = {
1115
1120
  source: string;
1116
1121
  live_match_key?: string;
1117
1122
  live_league_key?: string;
1118
- /** Live-score period and elapsed may be omitted when unavailable (older responses use null). A score entry may omit full_name when it equals team; fall back to team. Distinct aliases and score admission markers are preserved. */
1119
- live_score?: Record<string, unknown>;
1123
+ /** Live-score period and elapsed may be omitted when unavailable (older responses use null). A score entry may omit full_name when it equals team; fall back to team. Distinct aliases and score admission markers are preserved. For live esports, scores[].map_score retains an available pair through an update omitting both sides only within the same live map, series format and series totals. Map changes and final state follow current provider updates; absent detail remains unavailable. Optional tennis_points supplies independently sourced current-game points and serving side; absence means unavailable. Compatible unexpired tennis_points survives temporary supplemental snapshot unavailability or contention; expiry and set/game mismatch still clear it. */
1124
+ live_score?: Record<string, unknown> & {
1125
+ tennis_points?: TennisPoints;
1126
+ };
1120
1127
  reason?: string;
1121
1128
  };
1122
1129
  freshness: {
@@ -1205,10 +1212,40 @@ export type PickHolder = {
1205
1212
  is_bot?: boolean;
1206
1213
  /** The wallet's X handle from its Polymarket profile, normalized to 1-15 characters of [A-Za-z0-9_] with no `@`. Link it as `https://x.com/<handle>`. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
1207
1214
  x_username?: string | null;
1208
- category_evidence?: HolderCategoryEvidence;
1215
+ };
1216
+ /** Recorded lead wallet facts, available only on full newly certified picks. Position and category history are frozen at publication; they are not live balances or pick win probabilities. */
1217
+ export type PickLeadBacker = {
1218
+ /** Lead trader wallet address. */
1219
+ address: string;
1220
+ /** Recorded provider display name. */
1221
+ name: string | null;
1222
+ /** Trader grade recorded at publication. */
1223
+ grade: string;
1224
+ /** Canonical sport of the recorded directional history. */
1225
+ category: string;
1226
+ /** Provider-reported position value on the backed outcome at publication, in USD. It is the gross value on that outcome and does not subtract shares the wallet held on the other outcome; see net_position_usd. It is not the entry cost or a live balance. */
1227
+ position_usd: number;
1228
+ /** Net value of the lead's position toward the backed outcome at publication, in USD: shares held on the backed outcome minus shares held on the other outcome of the same market, valued at the backed outcome's provider price at publication. Present only when the wallet also held the other outcome; absent for a one-sided position, whose net equals position_usd. It is not a live balance. */
1229
+ net_position_usd?: number;
1230
+ /** Start time of the provider position fetch used at publication. This conservative observation clock precedes completion; the position is not a live balance. */
1231
+ position_observed_at: string;
1232
+ /** Distinct directional events in the recorded category history. */
1233
+ directional_event_count: number;
1234
+ /** Events with strictly positive native terminal P&L in the same frozen category sample as directional_event_count, realized_pnl_usd and roi. Multiple market positions in one event contribute one combined event result. Zero-profit events remain in directional_event_count but do not increase this count. This is a recorded wallet result, not a market win rate or the pick's win probability. */
1235
+ profitable_event_count: number;
1236
+ /** Realized P&L over the recorded directional category sample, in USD. Excludes open positions and later changes. */
1237
+ realized_pnl_usd: number;
1238
+ /** Recorded entry basis of that directional sample, in USD; not a claim of complete trading costs or fees. */
1239
+ entry_basis_usd: number;
1240
+ /** Realized P&L divided by recorded entry basis, as a fraction: 0.10 means 10%. This is a wallet statistic, not a pick win probability. */
1241
+ roi: number;
1242
+ /** Peak-to-trough realized P&L drawdown after each event result in the recorded sample, in USD. Excludes intragame, unrealized, and account equity drawdown. */
1243
+ max_realized_drawdown_usd: number;
1244
+ /** Timestamp when the directional history evidence was recorded, separate from the provider position snapshot clock. */
1245
+ recorded_at: string;
1209
1246
  };
1210
1247
  export type PickOfTheDay = {
1211
- /** Always 'full' for an authenticated Pro key. */
1248
+ /** Full success containing entitled proof-readable picks. */
1212
1249
  state: "full";
1213
1250
  /** The pick's local publication date (YYYY-MM-DD). */
1214
1251
  pick_date?: string;
@@ -1217,21 +1254,21 @@ export type PickOfTheDay = {
1217
1254
  * @deprecated
1218
1255
  */
1219
1256
  pick_rank?: number;
1220
- /** The complete ranked picks for this product day, ordered by pick_rank. Thin days contain fewer items; the selector never fabricates rows. */
1257
+ /** Published picks for this product day in the returned display order. Use pick_id for identity. */
1221
1258
  picks?: PickOfTheDay[];
1222
1259
  /** Number of items in `picks`: the proof-readable picks. Picks held in `proof_pending_picks` are not counted. */
1223
1260
  pick_count?: number;
1224
- /** Same-day picks selected but not yet released, ordered by pick_rank. Additive and optional: present only while at least one unreleased slot exists. Each slot exposes only its rank and schedule -- no market identity before release. Schedule the next read from the earliest release_at instead of polling. */
1261
+ /** Rank-ordered entitled selections that have not released. Every row retains release_at and kickoff; unauthorized scheduled ranks appear only in identity-free locked_picks. */
1225
1262
  scheduled_picks?: ScheduledPickSlot[];
1226
1263
  /** Human-readable matchup (e.g. "Portugal vs. Uzbekistan"). */
1227
1264
  matchup?: string;
1228
- /** Frozen canonical calibration/report bucket (e.g. "Basketball", "MMA", or "Soccer"). Existing semantics are unchanged; presentation consumers should prefer display_category when present. */
1265
+ /** Recorded canonical sport category. Prefer display_category for the public competition label. */
1229
1266
  category?: string;
1230
1267
  /** Frozen public presentation category: the competition the Polymarket event belongs to. A curated label comes first -- an official league (e.g. "WNBA" or "UFC"), the esports title (e.g. "CS2", "LoL", "Dota 2" or "Valorant"), or a soccer competition (e.g. "LaLiga", "Premier League", "Serie A" or "UEFA Champions League"); any other competition carries the provider's own competition name without its season year (e.g. "UEFA Nations League", "ATP" or "Wimbledon"). It equals category only when the provider names no competition. An esports pick keeps the pooled "Esports" bucket in category, so a per-title label never implies a per-title measured cohort. Additive and optional for mixed-version client compatibility. */
1231
1268
  display_category?: string;
1232
1269
  /** Provider platform. Always polymarket. */
1233
1270
  platform?: "polymarket";
1234
- /** The pick's stored release instant. Normally the current provider kickoff minus one hour; an operator may override it. The actual publish instant can trail it because of worker or claim delay. */
1271
+ /** The pick's stored release instant. Qualified automatic selections are due immediately; explicitly scheduled selections retain their stored time. Final checks, worker or claim delay can make the actual publication later. */
1235
1272
  release_at?: string;
1236
1273
  /** True only before the pick's stored release instant (a pre-release embargo flag); effectively always false on a served, already-published pick. To detect that the backed game has kicked off, use `game_started`. */
1237
1274
  is_locked?: boolean;
@@ -1251,23 +1288,19 @@ export type PickOfTheDay = {
1251
1288
  position?: string;
1252
1289
  /** One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
1253
1290
  side_summary?: string;
1254
- /** Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. Canonical key since #16308; smart_wallet_count is its deprecated spelling, emitted beside it with the same value. */
1291
+ /** S/A wallet count on the backed side in the public V1 compatibility projection. */
1255
1292
  sharp_wallet_count?: number;
1256
1293
  /**
1257
- * Deprecated spelling of sharp_wallet_count, emitted beside it with the same value and never removed. Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof.
1294
+ * Deprecated spelling of sharp_wallet_count with the same value.
1258
1295
  * @deprecated
1259
1296
  */
1260
1297
  smart_wallet_count?: number;
1261
- /** Best public V1-compatible S/A sharp-money grade on the backed side. The first-party/internal current policy can select B, but a current B-only grade is omitted by the stable V1 adapter. Historical rows retain their frozen policy's grade. A current-day published pick with pending legacy proof, unknown-future proof, or structurally invalid current-policy proof returns 503 before this success schema is served. Resolved legacy proof remains readable on both current-day and archive/history responses. */
1298
+ /** Best recorded S/A grade in the public V1 compatibility projection. */
1262
1299
  top_grade?: string;
1263
- /** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: category win-rate edge as a fraction (the backed-side cohort's win rate in this category minus the non-market-maker category baseline, e.g. 0.09 = +9 points), paired with category_edge_sample. */
1264
- category_edge_pct?: number;
1265
- /** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: pooled count of resolved markets behind category_edge_pct (the headline's n). */
1266
- category_edge_sample?: number;
1267
- /** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. Canonical key since #16308; smart_usd is its deprecated spelling, emitted beside it with the same value. */
1300
+ /** Recorded sharp-money magnitude in USD when available. */
1268
1301
  sharp_usd?: number;
1269
1302
  /**
1270
- * Deprecated spelling of sharp_usd, emitted beside it with the same value and never removed. Recency-weighted graded-flow magnitude in USD; omitted when <= 0.
1303
+ * Deprecated spelling of sharp_usd with the same value.
1271
1304
  * @deprecated
1272
1305
  */
1273
1306
  smart_usd?: number;
@@ -1301,67 +1334,40 @@ export type PickOfTheDay = {
1301
1334
  unit_score?: number;
1302
1335
  /** Backend-formatted signed unit score, present exactly when unit_score is present. */
1303
1336
  unit_score_display?: string;
1304
- /** First-party/internal backed-side sharp-money dollar consensus as a fraction 0..1: the share of current-policy sharp dollars on the backed side. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. A conviction signal, NOT a probability or expected-value claim. Frozen at generation. */
1337
+ /** Recorded sharp-money share as a 0..1 fraction when available. This is not a winning probability. */
1305
1338
  sharp_pct?: number;
1306
- /** Market-implied probability of the backed side as a fraction 0..1 (equals backed_price), re-exposed alongside sharp_pct for the WHY breakdown. */
1339
+ /** Recorded market-implied probability as a 0..1 fraction when available. */
1307
1340
  market_pct?: number;
1308
- /** First-party/internal consensus edge = sharp_pct - market_pct, the conviction-vs-price gap (how much more of the current-policy sharp money sits on this side than the price implies). Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. This is NOT an expected-value or guaranteed edge. Omitted when either input is unavailable. */
1309
- consensus_edge_pct?: number;
1310
- /** First-party/internal team-directional commitment read at selection time: the fraction (0..1) of the backed side's current-policy graded sharp-money DOLLARS held by wallets read one-way rather than hedged: no opposite leg on this market worth at least 10% of the backed leg (Polymarket's own currentValue pair), and no opposing team across the game's markets where the wallet's synced legs are fresh. Current public V1 rows omit this B-inclusive read because its historical S/A equivalent is not reconstructed. A high value means the graded pile is really committed to this side; a low one means much of it is hedged or unreadable. Omitted when the read was not computed (a pick selected before the field existed, an ungroupable game, an empty graded pile, or a pile where no holder carried usable evidence) -- which is NOT the same as 0.0, a computed reading that classified holders and found none one-way. */
1311
- directional_confidence?: number;
1312
- /** Graded backed-side holders read as one-way-committed on this game. */
1313
- one_way_holder_count?: number;
1314
- /** Graded backed-side holders read as HEDGED across the game's markets. */
1315
- hedged_holder_count?: number;
1316
- /** The one-way holders' share of the backed-side graded dollars (the confidence's numerator). */
1317
- one_way_graded_usd?: number;
1318
- /** Backed-side graded dollars the confidence is measured against (its denominator). */
1319
- total_graded_usd?: number;
1320
- /** The qualifying category expert whose sport-specific record and real position earned this pick its top selection tier. The first-party/internal current policy admits S/A/B; public V1 exposes a compatible S/A expert and omits a current-policy B-grade expert: a candidate backed by one outranks every candidate without one. Present only on the full payload. Omitted when no wallet qualified on the backed side, on picks generated before the field existed, and on the first-party web teaser, which withholds all backed-side evidence. Frozen at SELECTION time — the wallet's position can move before the pick renders. */
1341
+ /** Optional legacy recorded specialist facts. These describe the trader and do not disclose selection decisions. Present only on a full response when available; newly certified picks use lead_backer instead. */
1321
1342
  qualifying_expert?: {
1322
- /** Wallet address of the qualifying expert. */
1343
+ /** Trader wallet address. */
1323
1344
  address: string;
1324
1345
  /** Provider display name, or null for an unnamed wallet. */
1325
1346
  name: string | null;
1326
- /** 0xinsider grade letter. The first-party/internal current Pick of the Day policy counts S, A, and B; public V1 exposes only the compatible S/A expert. */
1347
+ /** Recorded trader grade. Public V1 preserves its S/A compatibility projection. */
1327
1348
  grade: string | null;
1328
1349
  /** The canonical sport bucket the win rate was measured over (for example Basketball). Can be BROADER than the pick's display_category, which names an exact league such as NBA — label the rate with this field, never with display_category. */
1329
1350
  canonical_category: string;
1330
- /** Share of this wallet's resolved markets in canonical_category whose realized P&L came out positive, as a 0..1 fraction. Above 0.60 by construction for a source=v1 expert; null for an expert who qualified on the category-skill v2 definition only. Deliberately NOT phrased as "closed profitable": the metric counts realized P&L above zero, so a resolved winner the wallet never redeemed sits at zero and counts against it. */
1351
+ /** Share of the trader’s resolved markets in canonical_category with positive realized P&L, as a 0..1 fraction. Null when not measured. This is a trader statistic, not the pick’s probability of winning. */
1331
1352
  win_rate: number | null;
1332
- /** Resolved markets in canonical_category behind win_rate. At least 10 by construction for a source=v1 expert; null with win_rate. */
1353
+ /** Number of resolved markets behind win_rate; null when not measured. */
1333
1354
  n_resolved: number | null;
1334
- /** Current expert policy 10 does not require a category-skill v2 specialist in any sport; in every sport a specialist raises the candidate's rank tier rather than gating it. Standard specialists need a positive edge_lower_95 over enough independent events and enough net backing on the backed side; the floors are not published. Fresh healthy records below the shared model's live sample floor can qualify; stale, unknown and degraded records cannot. Historical records preserve which definition qualified the wallet: v1, the profitability rate (win_rate over n_resolved), or v2, the forward-only category-skill calibration edge (edge_lower_95 over independent_event_count). Absent on picks frozen before the v2 definition existed; read absence as v1. A Tennis pick frozen under gate policy v4 or later carries v2 only: a v1 rate stopped qualifying a tennis expert at v4. A Tennis pick frozen under an earlier policy can still carry v1 with a win rate. */
1335
- source?: "v1" | "v2";
1336
- /** 95% lower bound of the wallet's mean calibration edge over the market price in canonical_category, in probability units (0.08 is 8 points). Positive by construction for a v2 expert; present on a v1 expert only when the wallet also holds a live v2 row. */
1337
- edge_lower_95?: number;
1338
- /** Point estimate behind edge_lower_95. */
1339
- edge_mean?: number;
1340
- /** Independent canonical events behind the edge. At least 10 by construction for a v2 expert. */
1341
- independent_event_count?: number;
1342
- /** Polymarket's own currentValue for this wallet on the backed outcome, in USD, as of selection. At least 1000 by construction through gate policy v7; the standard floor is 500 from v8. From gate policy v5 the floor is read on the net: position_usd minus opposite_position_usd is at least that floor, and the pick re-verifies that net against the live holder snapshot when it is released. */
1355
+ /** Recorded Polymarket position value on the backed outcome, in USD. It can change after this snapshot. */
1343
1356
  position_usd: number;
1344
- /** The same wallet's currentValue on the OTHER outcome of this market, in USD, as of selection. Present from gate policy v5, when the floor moved to net exposure; a wallet long both sides does not qualify. Absent on picks frozen before v5, which never read the leg. 0 is a measured one-way position, not an absence. */
1357
+ /** Recorded position value on the other outcome of this market, in USD. Omitted when not recorded; zero is a measured value. */
1345
1358
  opposite_position_usd?: number;
1346
- /** When the skill read model behind the evidence was last rebuilt: trader_category_stats.computed_at for a source=v1 expert, category_skill_v2_current.as_of for a source=v2 expert. */
1359
+ /** Timestamp of the recorded trader statistics. */
1347
1360
  stats_computed_at: string;
1348
- /** Present from expert policy 6. Current expert policy 10 retains the longshot requirement of live v2 only, with a positive lower bound over a large sample, large net backed value and no meaningful opposite value. Historical policy 6: a specialist required large net backed value, no meaningful opposite value, and either a live v2 positive lower bound over a large sample or a high v1 rate over enough resolved markets. Tennis requires v2. The floors are not published. */
1349
- lane?: "standard" | "longshot_specialist";
1350
- /** Answered, spread-gated, index-scoped backed probability frozen only on a specialist exception. */
1351
- lane_probability?: number;
1352
- /** Canonical provider probability pair branch; absent on standard experts. */
1353
- lane_probability_source?: "p";
1354
- };
1355
- trust?: PickTrust;
1356
- /** Public V1 S/A compatibility count on the backed side (equals the adapted sharp_wallet_count). The first-party/internal current policy counts S/A/B. Historical rows retain their frozen policy's count. */
1361
+ };
1362
+ /** Public V1 S/A wallet count on the backed side, equal to sharp_wallet_count. */
1357
1363
  traders?: number;
1358
- /** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted sharp_usd which decays. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. */
1364
+ /** Recorded backed-side position value in USD when available. Newly certified picks sum only publication-certified wallet positions; legacy rows retain their recorded value. */
1359
1365
  backed_sharp_usd?: number;
1360
- /** Bounded S/A compatibility projection of the frozen sharp-money holders on the backed side. Current full payloads expose the complete S/A/B roster in display_holders; historical rows can retain their earlier frozen shape. */
1366
+ /** Bounded S/A holder display projection. Newly certified picks include only publication-certified wallets; historical rows retain their recorded display shape. */
1361
1367
  holders?: PickHolder[];
1362
- /** Full-only complete provider-confirmed S/A/B holder roster for the current Pick of the Day backing policy. Omitted for teaser, no-pick, and historical rows whose frozen holder proof predates this policy. Each entry may additionally carry `category_win_rate` / `category_win_rate_status`: the wallet's win rate in the pick's canonical `category`, stamped at serve time from the current category read model (the same annotation the sports sharp-money chips carry). The bounded `holders` compatibility projection never carries these fields. */
1368
+ /** Optional complete holder display roster. Newly certified picks list the recorded lead first, then any verified supporters, then the other graded wallets that held the backed side at publication, ordered by shares; only the lead and supporters are verified, the other rows are gross holdings that may also hold the other side and are not counted in the wallet counts, holder_count or backed_sharp_usd. Legacy rows retain their recorded display shape. */
1363
1369
  display_holders?: PickHolder[];
1364
- /** Exact S/A sharp-money proof count on the backed side. The current display_holders roster can be longer because it also carries B-grade sharp-money holders. */
1370
+ /** S/A holder count for the public V1 compatibility projection. display_holders can include additional grades. */
1365
1371
  holder_count?: number;
1366
1372
  /** Optional editorial note attached to the pick. */
1367
1373
  editorial_note?: string;
@@ -1373,18 +1379,23 @@ export type PickOfTheDay = {
1373
1379
  polymarket_url?: string;
1374
1380
  /** The canonical /event game-page slug (one neutral page per game); omitted when the game has no neutral event page. */
1375
1381
  event_slug?: string;
1376
- /** Backend-resolved /event destination slug for this pick's source market; its absence is an authoritative no-link decision. */
1377
- event_link_slug?: string;
1382
+ /** Backend-resolved /event destination slug for the source market. Omitted outside full responses; null is an authoritative no-link decision. */
1383
+ event_link_slug?: string | null;
1378
1384
  /** Provider-first sports context for the pick's market (team logos, league branding, live score). Full-state only; omitted when the pick is not a team-sports market. */
1379
1385
  sports_context?: PickSportsContext;
1380
1386
  /** Risk disclaimer shown with every pick. */
1381
1387
  disclaimer?: string;
1382
- /** Published same-day picks whose holder proof is not readable yet, ordered by pick_rank. Additive and optional: present only while at least one such pick exists. While present, `picks` carries only the proof-readable picks and `pick_count` counts them. Schedule the next read from the earliest retry_at instead of polling. The route returns 503 read_model_warming only when no published pick has readable proof. */
1388
+ /** 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. */
1383
1389
  proof_pending_picks?: ProofPendingPickSlot[];
1384
- /** Frozen admission classification, full payload only. The specialist lane exempts two probability rejects and adds no rank bonus. Historical rows remain standard. */
1385
- selection_lane?: "standard" | "longshot_specialist";
1386
- /** Optional full-only authorization for newly issued policy-7 picks; omitted for legacy or unissued picks and teasers. It remains historical after expiry. */
1390
+ /** Optional full-response entry authorization. Missing or expired authorization cannot authorize an automated entry. */
1387
1391
  entry_authorization?: PotdEntryAuthorization;
1392
+ /** Unauthorized unresolved published or scheduled ranks. Contains no game, provider identity, price, or identifying clock. Pro may upgrade to Max to open these ranks. */
1393
+ locked_picks?: {
1394
+ pick_rank: number;
1395
+ required_tier: "max";
1396
+ }[];
1397
+ /** Actionable status, including Upgrade to Max when only locked ranks are published. */
1398
+ message?: string;
1388
1399
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
1389
1400
  pick_id?: string;
1390
1401
  /** Compatibility release slot. No quality claim; historic scheduling order is retained. */
@@ -1393,11 +1404,13 @@ export type PickOfTheDay = {
1393
1404
  is_free_selection?: boolean;
1394
1405
  /** Replacement predecessor stable id; null when no lineage is recorded. */
1395
1406
  supersedes_pick_id: string | null;
1407
+ /** Optional full-only lead wallet publication facts. Omitted on legacy picks or when the recorded evidence is unavailable. */
1408
+ lead_backer?: PickLeadBacker;
1396
1409
  };
1397
1410
  export type PickOfTheDayArchive = {
1398
- /** Every published Pick of the Day, newest first by pick_date and then pick_rank within each product day. */
1411
+ /** 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. */
1399
1412
  picks: PickOfTheDayArchiveEntry[];
1400
- /** One entry per product day that has a published pick, newest first, in the same order as picks. Each carries that day's net units, accumulated in the same backend pass and behind the same visibility gate as hit_rate.unit_score, so both cover the same population of picks. Re-adding the day totals reproduces hit_rate.unit_score to display precision rather than bit-for-bit, since that re-associates the floating-point sum. */
1413
+ /** One entry per product day that has a published pick included in the archive, newest first, in the same order as picks. Each carries that day's net units, accumulated in the same backend pass and behind the same visibility gate as hit_rate.unit_score, so both cover the same population of picks. Re-adding the day totals reproduces hit_rate.unit_score to display precision rather than bit-for-bit, since that re-associates the floating-point sum. */
1401
1414
  days: PickOfTheDayArchiveDay[];
1402
1415
  hit_rate: PickOfTheDayHitRate;
1403
1416
  };
@@ -1429,12 +1442,12 @@ export type PickOfTheDayArchiveEntry = {
1429
1442
  * @deprecated
1430
1443
  */
1431
1444
  pick_rank?: number;
1432
- /** When this pick became public (RFC3339 UTC). pick_date above is the America/New_York product day, not an instant, so read this whenever you need a real time: reading the bare date as UTC midnight places it hours before the earliest instant a pick can drop (11:00 UTC on that date). A day's last pick can drop at 23:00 ET, which is the following UTC date. Omitted (not null) when the instant is unknown; additive and optional for mixed-version client compatibility. */
1445
+ /** When this selection was published, as RFC3339 UTC. Use this instant for publication feeds and timelines; pick_date is the America/New_York product day, not a publication timestamp. Automatic qualification can begin at ET midnight. Absent only for historical rows whose publication instant is unknown. */
1433
1446
  published_at?: string;
1434
1447
  /** Human-readable matchup (e.g. "Portugal vs. Uzbekistan"). */
1435
- matchup: string;
1448
+ matchup?: string;
1436
1449
  /** Frozen canonical calibration/report bucket (e.g. "Basketball", "MMA", or "Soccer"). Existing semantics are unchanged; presentation consumers should prefer display_category when present. */
1437
- category: string;
1450
+ category?: string;
1438
1451
  /** Frozen public presentation category: the competition the Polymarket event belongs to. A curated label comes first -- an official league (e.g. "WNBA" or "UFC"), the esports title (e.g. "CS2", "LoL", "Dota 2" or "Valorant"), or a soccer competition (e.g. "LaLiga", "Premier League", "Serie A" or "UEFA Champions League"); any other competition carries the provider's own competition name without its season year (e.g. "UEFA Nations League", "ATP" or "Wimbledon"). It equals category only when the provider names no competition. An esports pick keeps the pooled "Esports" bucket in category, so a per-title label never implies a per-title measured cohort. Additive and optional for mixed-version client compatibility. */
1439
1452
  display_category?: string;
1440
1453
  /** Provider (Polymarket Gamma) market thumbnail URL (markets.image); omitted (not null) when the market has no image. Public regardless of the backed-side gate, so present for pending rows too. */
@@ -1479,6 +1492,10 @@ export type PickOfTheDayArchiveEntry = {
1479
1492
  unit_score?: number;
1480
1493
  /** Backend-formatted signed unit score, present exactly when unit_score is present. */
1481
1494
  unit_score_display?: string;
1495
+ /** The account or paid tier needed to open this unresolved rank. */
1496
+ required_tier?: "account" | "insider" | "max";
1497
+ /** True for an unauthorized unresolved row. Game identity, category, image, publication clock and all backed facts are omitted. */
1498
+ backed_side_locked?: boolean;
1482
1499
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
1483
1500
  pick_id: string;
1484
1501
  /** Compatibility release slot. No quality claim; historic scheduling order is retained. */
@@ -1661,7 +1678,7 @@ export type PickOfTheDayLedgerOpenedEntry = {
1661
1678
  /** Explicit proof provenance: 1 retains historic eight-field canonical JSON; 2 binds stable pick_id and version without pick_rank. */
1662
1679
  commitment_version: 1 | 2;
1663
1680
  };
1664
- /** A published pick that has not settled. Carries the commitment and nothing that states a side or a price: no nonce, no payload, no outcome. Publishable the instant the pick releases. */
1681
+ /** An unresolved published pick. Carries only date, rank, hash, algorithm, seal instant and permalink. Kickoff and game identity are withheld; seal time remains public commitment provenance. */
1665
1682
  export type PickOfTheDayLedgerSealedEntry = {
1666
1683
  state: "sealed";
1667
1684
  /** ET product day the pick belongs to (YYYY-MM-DD). */
@@ -1677,8 +1694,6 @@ export type PickOfTheDayLedgerSealedEntry = {
1677
1694
  commitment_algo: "sha256(canonical_json(payload)||nonce)";
1678
1695
  /** 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. */
1679
1696
  sealed_at: string;
1680
- /** The frozen provider kickoff in the canonical payload form: whole seconds, UTC, literal Z. This exact string reappears inside payload.kickoff when the pick opens. */
1681
- kickoff: string;
1682
1697
  /** The pick's public page. */
1683
1698
  permalink: string;
1684
1699
  /** Stable pick row identity as decimal text. Never use a quality rank as identity. */
@@ -1692,7 +1707,7 @@ export type PickOfTheDayLedgerSealedEntry = {
1692
1707
  /** Explicit proof provenance: 1 retains historic eight-field canonical JSON; 2 binds stable pick_id and version without pick_rank. */
1693
1708
  commitment_version: 1 | 2;
1694
1709
  };
1695
- /** A published pick with no commitment: it predates the scheme, or it reached kickoff unsealed. Nothing here is evidence of WHEN the pick was made. It is emitted rather than skipped, because a ledger with holes where the unprovable picks were would silently flatter the record. Once the pick settles, payload names its market, side and price, so the outcome can still be checked against the market's own resolution. */
1710
+ /** A pick without a commitment, retained so the record cannot omit unprovable entries. Unresolved entries omit game identity; once resolved, matchup, category and payload become public. Existing opened canonical payload bytes and hashes are unchanged. */
1696
1711
  export type PickOfTheDayLedgerUncommittedEntry = {
1697
1712
  state: "uncommitted";
1698
1713
  /** ET product day the pick belongs to (YYYY-MM-DD). */
@@ -1707,9 +1722,9 @@ export type PickOfTheDayLedgerUncommittedEntry = {
1707
1722
  /** How the pick settled, or pending. */
1708
1723
  outcome: "pending" | "win" | "loss" | "void";
1709
1724
  /** Frozen matchup, for a reader. */
1710
- matchup: string;
1725
+ matchup?: string;
1711
1726
  /** Frozen canonical sport bucket used for selection calibration (Basketball, MMA), not the exact public league identity; the archive owns that. */
1712
- category: string;
1727
+ category?: string;
1713
1728
  /** When outcome was LAST written to a settled value, or null when that instant is unknown. It moves with a corrected market re-mapping an already-settled pick, while commitment_hash stays untouched -- which is how a mirror that keeps history sees a correction. */
1714
1729
  resolved_at: string | null;
1715
1730
  /** 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. */
@@ -1725,6 +1740,30 @@ export type PickOfTheDayLedgerUncommittedEntry = {
1725
1740
  /** Replacement predecessor stable id; null when no lineage is recorded. */
1726
1741
  supersedes_pick_id: string | null;
1727
1742
  };
1743
+ /** A successful current-day entitlement response when only unauthorized ranks have published. It carries an empty pick set, identity-free locked ranks and an upgrade message. Selection IDs, game identity, prices and unauthorized clocks are absent. Any scheduled or proof-pending rows are entitled rows. */
1744
+ export type PickOfTheDayNoEntitledPicks = {
1745
+ /** Only locked ranks are published for this account. */
1746
+ state: "none";
1747
+ /** Current product date in America/New_York (YYYY-MM-DD). */
1748
+ pick_date: string;
1749
+ /** Empty: no entitled proof-readable picks are returned. */
1750
+ picks: PickOfTheDay[];
1751
+ /** Zero entitled proof-readable picks. */
1752
+ pick_count: 0;
1753
+ /** Unauthorized unresolved published or scheduled ranks. Contains no game, provider identity, price, or identifying clock. Pro may upgrade to Max to open these ranks. */
1754
+ locked_picks: {
1755
+ pick_rank: number;
1756
+ required_tier: "max";
1757
+ }[];
1758
+ /** Actionable status, including Upgrade to Max when only locked ranks are published. */
1759
+ message: string;
1760
+ /** Rank-ordered entitled selections that have not released. Every row retains release_at and kickoff; unauthorized scheduled ranks appear only in identity-free locked_picks. */
1761
+ scheduled_picks?: ScheduledPickSlot[];
1762
+ /** 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. */
1763
+ proof_pending_picks?: ProofPendingPickSlot[];
1764
+ /** Null: the empty entitlement envelope has no selection lineage. */
1765
+ supersedes_pick_id: null;
1766
+ };
1728
1767
  /** 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. */
1729
1768
  export type PickOfTheDayUncommittedPayload = {
1730
1769
  /** Frozen pre-game price of the backed side, 0..1, as the plain decimal text of the stored NUMERIC at full stored precision, trailing zeros included -- rendered exactly as the commitment payload renders it. */
@@ -1765,7 +1804,7 @@ export type PickSportsContext = {
1765
1804
  /** The two teams as a single whole-game label, joined "<home> – <away>" (en-dash) in provider display order (e.g. "Portugal – Uzbekistan"). Composed server-side from the provider team names (no title/slug parsing). Present when both teams resolve a name; omitted for single-subject, teamless, or non-two-team contexts. */
1766
1805
  matchup_title?: string;
1767
1806
  };
1768
- /** A single sports team or competitor in a Pick of the Day market's sports context. Identity and score fields are provider-owned and nullable. The structured score fields (`sets`, `format`, `sets_won`) and the tennis fields (`headshot`, `tour`) are backend-owned and are OMITTED rather than null when they do not apply, so a consumer must treat an absent key and a null the same way. */
1807
+ /** A single sports team or competitor in a Pick of the Day market's sports context. Identity and score fields are provider-owned and nullable. The structured score fields (`sets`, `format`, `sets_won`) and the tennis fields (`headshot`, `headshot_revision`, `tour`) are backend-owned and are OMITTED rather than null when they do not apply, so a consumer must treat an absent key and a null the same way. */
1769
1808
  export type PickSportsTeam = {
1770
1809
  /** Team display label as it appears on the market outcome (e.g. "Portugal"). */
1771
1810
  label: string | null;
@@ -1775,9 +1814,9 @@ export type PickSportsTeam = {
1775
1814
  full_name: string | null;
1776
1815
  /** Provider team identifier (Polymarket /teams id). */
1777
1816
  provider_id: number | null;
1778
- /** Team crest or flag URL. Provider-owned for most teams (Polymarket /teams crest for clubs, country flag for national teams and tennis players). A club with a vendored crest carries it instead, served same-origin as a relative path (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>` or `.png`, resolve it against this server): every NFL and WNBA team, whose provider asset is a text tile, and the soccer clubs whose provider asset is an empty object. */
1817
+ /** 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. */
1779
1818
  logo: string | null;
1780
- /** True when the team mark is dark enough to disappear on a dark background, measured from the artwork by the teams sync. Render a dark mark on a light plate. Always sent; false until the artwork has been measured. */
1819
+ /** 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. */
1781
1820
  logo_mark_dark: boolean;
1782
1821
  /** Team brand color as a hex string (provider-owned). */
1783
1822
  color: string | null;
@@ -1794,11 +1833,10 @@ export type PickSportsTeam = {
1794
1833
  format?: ScoreFormat;
1795
1834
  /** Completed sets won by this side. Present only when both sides expose the same set columns, so a partially parsed scoreline reports no tally rather than a misleading one. */
1796
1835
  sets_won?: number;
1797
- };
1798
- /** Field-level trust metadata for the full Pick of the Day payload. Present on the full shape only (omitted on the teaser and the no-pick state, because whether a specialist backs the pick is itself backed-side evidence). Unlike TraderTrust it is not gated behind expand=trust: it carries one member on an endpoint that returns a single object per day. */
1799
- export type PickTrust = {
1800
- /** Provenance of the frozen qualifying category expert. source.kind=database with reconciliation.status=db_mirror means the evidence deserialized, still satisfies every frozen selection gate, and is being served. On that arm freshness.status is always not_live and never fresh, because this evidence is frozen at selection and never refreshed, so on an archived pick the as_of (the expert's own stats_computed_at) can be days or months old by design. source.kind=computed with reconciliation.status=not_applicable means the selector evaluated the backed side and nobody qualified -- a real negative. source.kind=computed with freshness.status=unknown and completeness.status=not_computed means the selector never evaluated this field, as on a pre-feature pick. source.kind=unavailable means the payload is malformed, violates a selection gate, or conflicts with its persisted status, or the public V1 adapter intentionally omitted a current-policy B-grade expert; read the reason before treating it as a negative. Do not read an omitted qualifying_expert as 'no specialist' without checking this field. */
1801
- qualifying_expert: TrustMetadata;
1836
+ /** Optional monotonic photo revision for this tennis player, independent of the sports score revision. Legacy stored photos start at zero. Successful new or changed image bytes advance it; source checks and attribution changes do not. Compare only for the same tour and provider_id: a higher revision replaces the portrait, an equal revision may fill a missing portrait, and a lower revision must not replace a newer one. Absent when no photo resolved. */
1837
+ headshot_revision?: number;
1838
+ /** Optional latest retrieved ATP/WTA singles rank for this player. Absent for unranked, ambiguous, doubles, expired, or unavailable identities. This is not rank at match time. */
1839
+ ranking?: TennisRanking;
1802
1840
  };
1803
1841
  export type PlatformCapabilities = {
1804
1842
  grade: PlatformCapabilityStatus;
@@ -1909,11 +1947,12 @@ export type PositionTimelineEvent = {
1909
1947
  /** Cumulative buy-weighted average of stored fills for this outcome, including older pages; not provider current-position avgPrice. Sells do not change this value. 0 when no stored buys have occurred yet. */
1910
1948
  running_avg_price: number;
1911
1949
  };
1912
- /** Policy-7 issuance binds one condition, selected token, outcome, canonical event and sport. Reuse the same authorization across public/private discovery and retries. Require a new account-size executable book and current market eligibility; this frozen reference does not prove current liquidity or positive expected value. Absence or expiry cannot authorize a new automated entry. */
1950
+ /** Returned entry permission bound to the named market, token and outcome. New policy-8 grants allow five cents above the first reference ask, capped at 85 cents and floored to the provider tick; policy-7 grants retain their original two-cent allowance. Honor the immutable max_entry_price and expires_at, and quote a current executable book for the actual stake. The submitted order price must remain within the limit; fills may be lower. Fees are separate, and this grant does not guarantee liquidity, execution or positive expected value. */
1913
1951
  export type PotdEntryAuthorization = {
1914
1952
  version: 1;
1915
1953
  authorization_id: string;
1916
- policy_version: 7;
1954
+ /** Entry allowance policy, independent of selection or feed policy. Policy 8 issues new grants at the first reference ask plus 0.05, capped at 0.85 and floored to the provider tick. Policy 7 retains its original plus-0.02 grant. Existing grants never rise or extend. */
1955
+ policy_version: 7 | 8;
1917
1956
  condition_id: string;
1918
1957
  token_id: string;
1919
1958
  outcome_index: 0 | 1;
@@ -1921,13 +1960,14 @@ export type PotdEntryAuthorization = {
1921
1960
  category: string;
1922
1961
  /** Exact provider parent event ID, or provider event ID when no parent exists. */
1923
1962
  canonical_event_id: string;
1924
- /** Immutable decimal limit: first fresh selected-token ask plus 0.02, floored to the provider tick below 1. Fees excluded. Never a calibrated fair probability. */
1963
+ /** Maximum authorized order price as an exact decimal string, excluding fees. Quote a current executable book for the actual stake and keep the submitted order price at or below this bound. Actual fills may be lower; this limit does not guarantee a fill or define fair probability. */
1925
1964
  max_entry_price: string;
1965
+ /** Selected-token best ask at first issuance. The entry allowance uses this immutable reference, not the published pick price or a later quote. */
1926
1966
  reference_best_ask: string;
1927
1967
  reference_book_hash: string;
1928
1968
  reference_book_at: string;
1929
1969
  issued_at: string;
1930
- /** Original provider kickoff ceiling. Never extended on retry. */
1970
+ /** Original authorization expiry at the earlier requested or provider kickoff; never extended. An expired authorization cannot authorize a new automated entry. */
1931
1971
  expires_at: string;
1932
1972
  };
1933
1973
  /** One ranked pre-game sports market where graded sharp money is piled on one side, with required-status shadow category evidence from partial forward-observed Polymarket fills. */
@@ -1936,7 +1976,7 @@ export type PreGameSide = {
1936
1976
  side: string | null;
1937
1977
  /** UTC time at which the snapshot that ranked this row was computed. Canonical spelling of signal_created_at (#16310), same value. */
1938
1978
  ranked_at: string;
1939
- /** Grade-weighted holders times the share of their money on the side: (5*s + 4*a + 3*b) * sharp_pct. Canonical spelling of conviction_score (#16310), same value. */
1979
+ /** Recorded side backing score; higher values indicate stronger backing. */
1940
1980
  backing_score: number;
1941
1981
  /** Signed share of graded money on the side, (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (side-yes positive, side-no negative). Canonical spelling of smart_score (#16309, #16310), same value. */
1942
1982
  side_share: number | null;
@@ -1979,7 +2019,7 @@ export type PreGameSide = {
1979
2019
  /** Best grade present on the piled side; null when none. */
1980
2020
  top_grade: "S" | "A" | "B" | null;
1981
2021
  /**
1982
- * Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
2022
+ * Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
1983
2023
  * @deprecated
1984
2024
  */
1985
2025
  smart_score: number | null;
@@ -1988,7 +2028,7 @@ export type PreGameSide = {
1988
2028
  /** Aggregate recent flow direction on the market; null when unavailable. */
1989
2029
  net_side: "BUY" | "SELL" | null;
1990
2030
  /**
1991
- * Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
2031
+ * Recorded conviction score; higher values indicate stronger conviction.
1992
2032
  * @deprecated
1993
2033
  */
1994
2034
  conviction_score: number;
@@ -2000,7 +2040,7 @@ export type PreGameSide = {
2000
2040
  one_way_graded_usd: number | null;
2001
2041
  /** One-way fraction of the piled graded dollars, in [0, 1] -- the metric orthogonal to sharp_pct. Stale, unknown, hedged, and two-sided dollars dilute it toward zero (conservative). Null when the directional read was not computed or classified nobody. */
2002
2042
  directional_confidence: number | null;
2003
- /** The ranking key, descending: conviction_score * (1 + 0.25 * directional_confidence). Equals conviction_score when the directional read is null/zero, so signals without the read rank exactly as before. */
2043
+ /** Recorded side ordering score; higher values sort first. */
2004
2044
  directional_rank_score: number;
2005
2045
  category_skill: PreGameSideCategorySkill;
2006
2046
  /** 1-based rank within the (min_grade-filtered) ranked result. */
@@ -2037,7 +2077,7 @@ export type PreGameSideFunnelReport = {
2037
2077
  export type PreGameSideObservation = {
2038
2078
  /** The side profitable wallets hold, as a provider-backed display label. Canonical spelling of piled_side (#16310), same value: when provider group context is unavailable it may remain a bare Yes/No/Over/Under, so do not use it alone as participant identity. */
2039
2079
  side: string | null;
2040
- /** Grade-weighted holder-pile score before directional enrichment. Canonical spelling of conviction_score (#16310), same value. */
2080
+ /** Recorded side backing score; higher values indicate stronger backing. */
2041
2081
  backing_score: number;
2042
2082
  /** Signed share of graded money on the side, in [-1, 1]. Canonical spelling of smart_score (#16309, #16310), same value. */
2043
2083
  side_share: number;
@@ -2091,7 +2131,7 @@ export type PreGameSideObservation = {
2091
2131
  /** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
2092
2132
  volume: number;
2093
2133
  /**
2094
- * Grade-weighted holder-pile score before directional enrichment. Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
2134
+ * Recorded conviction score; higher values indicate stronger conviction.
2095
2135
  * @deprecated
2096
2136
  */
2097
2137
  conviction_score: number;
@@ -2107,7 +2147,7 @@ export type PreGameSideObservation = {
2107
2147
  hedged_holder_count: number | null;
2108
2148
  one_way_graded_usd: number | null;
2109
2149
  directional_confidence: number | null;
2110
- /** Default cohort ordering key: conviction_score * (1 + 0.25 * directional_confidence), or conviction_score when confidence is null. */
2150
+ /** Recorded side ordering score; higher values sort first. */
2111
2151
  directional_rank_score: number;
2112
2152
  /** 1-based rank within this observation cohort and snapshot. */
2113
2153
  rank: number;
@@ -2288,14 +2328,14 @@ export type ResponseMeta = {
2288
2328
  /** Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves shadow enrichment did not change funded inputs. Sports-edge-signals only. */
2289
2329
  category_skill_enriched_base_payload_hash?: string;
2290
2330
  };
2291
- /** One same-day pick that is selected but not yet released: its stable slot rank plus the backend-owned release and kickoff instants. Deliberately minimal -- no matchup, category, platform, side, price, or holder fields exist on this shape before release. */
2331
+ /** An entitled same-day pick selected but not yet released: stable rank and backend-owned release/kickoff instants. No matchup, category, platform, side, price, or holder fields appear before release. Unauthorized scheduled ranks appear only in locked_picks. */
2292
2332
  export type ScheduledPickSlot = {
2293
2333
  /**
2294
2334
  * Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.
2295
2335
  * @deprecated
2296
2336
  */
2297
2337
  pick_rank: number;
2298
- /** The slot's scheduled release instant, normally the current provider kickoff minus one hour. The actual publish can trail it by bounded worker delay. */
2338
+ /** The slot's stored release instant. Qualified automatic selections are due immediately; explicitly scheduled selections retain their stored time. The actual publication can follow final checks and worker delay. */
2299
2339
  release_at: string;
2300
2340
  /** The backed game's current kickoff instant. */
2301
2341
  kickoff: string;
@@ -2415,6 +2455,41 @@ export type SuspiciousTrade = {
2415
2455
  /** Stored trade timestamp. */
2416
2456
  created_at: string;
2417
2457
  };
2458
+ /** Optional current-game tennis facts from API-Tennis, aligned with live_score.scores display order. These facts have their own revision and expiry; Polymarket remains the source of sets, match status, period, and the outer live-score revision. New observations require corroborated identity, current set/games, and live state. Cached responses and replayed frames may still carry expired facts, so clients must enforce expires_at. */
2459
+ export type TennisPoints = {
2460
+ source: "api_tennis";
2461
+ /** API-Tennis match ID. This is not a Polymarket market or event ID. */
2462
+ match_key: number;
2463
+ /** API-Tennis player IDs in the same first/second order as live_score.scores. These are not Polymarket team IDs. */
2464
+ player_keys: number[];
2465
+ /** Current-game point values in first/second order. Read strings, including A for advantage and numeric tiebreak points. Missing points are not zero. */
2466
+ points: string[];
2467
+ /** The serving player in live_score.scores display order. Omitted when API-Tennis does not identify the server. */
2468
+ serving_side?: "first" | "second";
2469
+ /** Orders only the tennis_points group for the same match. Never compare this with live_score.source_revision. */
2470
+ source_revision: number;
2471
+ /** When 0xinsider observed these API-Tennis facts. This is not a timestamp from the court. */
2472
+ observed_at: string;
2473
+ /** Stop displaying the point group at this instant, even if the enclosing score remains fresh. The group expires 30 seconds after observed_at. */
2474
+ expires_at: string;
2475
+ /** Current set number. Display points only while this matches the enclosing scoreboard. */
2476
+ set_number: number;
2477
+ /** Current-set games in first/second order. Display points only while these match the enclosing scoreboard. */
2478
+ games: number[];
2479
+ };
2480
+ /** A provider-reported ATP/WTA singles rank with independent retrieval and expiry clocks. API-Tennis provides no ranking publication date. Retrieval time does not establish when the tour published the ranking. */
2481
+ export type TennisRanking = {
2482
+ /** Provider-reported singles rank. */
2483
+ rank: number;
2484
+ /** The player ranking tour. */
2485
+ tour: "atp" | "wta";
2486
+ /** The standings provider. */
2487
+ source: "api_tennis";
2488
+ /** Successful snapshot retrieval time in UTC, not ranking publication date. */
2489
+ observed_at: string;
2490
+ /** UTC deadline after which clients must hide this rank, including when an older game or pick response remains cached. */
2491
+ expires_at: string;
2492
+ };
2418
2493
  export type Trader = {
2419
2494
  /** Prefixed ID (trd_...). */
2420
2495
  id: string;
@@ -2424,9 +2499,9 @@ export type Trader = {
2424
2499
  /** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
2425
2500
  streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
2426
2501
  score?: number;
2427
- /** Capital-normalized forecasting score: the cohort percentile (0-100) of the EB-shrunk calibration edge. Omitted when the forecasting signal is unavailable; never replaced with zero. */
2502
+ /** Optional forecast score on the documented display scale. Null when unavailable. */
2428
2503
  forecast_score?: number;
2429
- /** Share of forecast_score supported by the trader's own resolved-market record rather than the cohort prior: n / (n + 30). Omitted when forecast_score is unavailable. */
2504
+ /** Optional measured forecast context. Missing values remain unavailable rather than being inferred. */
2430
2505
  forecast_evidence?: number;
2431
2506
  rank?: number;
2432
2507
  pnl: {
@@ -2451,15 +2526,16 @@ export type Trader = {
2451
2526
  exact?: TraderStatsExact;
2452
2527
  };
2453
2528
  strategy?: {
2529
+ /** Observed trading style identifier. New rows use two_sided, category_focused, high_activity, diversified, mixed, or unclassified. Historical identifiers remain readable during normal reclassification; style does not predict skill or intent. */
2454
2530
  strategy_type?: string;
2455
2531
  description?: string;
2456
2532
  confidence?: number;
2457
2533
  };
2458
- /** Per-category performance breakdown (expand=categories or expand[]=categories). Omitted unless expanded. Object keyed by category name; each value is the precomputed trader_rankings.category_ranks payload (rank, total_in_category, total_pnl, scaled_total_pnl, n_markets, wins, losses, win_rate; scaled_total_pnl is a legacy alias that currently equals total_pnl). RANK BASIS: rank and total_in_category use the same hourly breakpoint publication; categories absent from that publication are omitted until a later publication includes them. Current trader performance values update separately, so this is not a frozen historical record. BASIS: the calibration sample, which admits a position only above a 20 USD notional floor and with a chosen-side entry price strictly inside (0,1), because the ranks and the calibration edge derived from it depend on both rules. That is a different sample from GET /api/v1/trader/{address}/categories, which counts every settled market at any size, and the two differ in both directions. Measured on production 2026-09-22 over the 122,497 wallet-category pairs with at least 20 decided markets on both bases: the floored rate was higher in 56.5% of pairs, lower in 34.5% and equal in 9.0%, median +0.6 points, p10 -4.6, p90 +9.8, and 14.0% of pairs differ by 10 points or more. The difference is not only small positions: on a 1-in-250 wallet sample the same day, admitted markets won 56.6% while markets dropped by the notional floor alone won 45.2% and markets dropped by the entry-price rule alone won 48.7%. n_markets counts every admitted market including the ones that resolved at exactly zero P&L, so it is not the denominator of win_rate: it differed from wins + losses in 15.8% of pairs with at least 5 decided markets. The two tables also run on different clocks, this one updated incrementally and that route rebuilt daily, so a same-day read can differ on timing alone. Use this for rank context and that route for the wallet's plain record. Pass-through DB JSON: keys and value shape are DB-owned, so the inner shape is intentionally unconstrained and may carry additional compatibility fields. */
2534
+ /** 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. */
2459
2535
  category_strengths?: Record<string, unknown>;
2460
2536
  /** 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. */
2461
2537
  quant_metrics?: {
2462
- /** Composite skill score, 0-100. smart_score = clamp(0, 100, 30*sharpe_percentile_fraction + 20*profit_factor_percentile_fraction + 20*edge_consistency_percentile_fraction + 10*min(1, return_on_capital/2) + 10*equity_smoothness + 10*(1 - min(1, asset_concentration))). Higher is better. null when insufficient history. */
2538
+ /** Trader smart score on a 0..100 display scale; higher is stronger. Null when unavailable. */
2463
2539
  smart_score: number | null;
2464
2540
  /** Copyability score, 0-100. Same base as smart_score minus penalties for traits that make a strategy hard to replicate: -20 if fewer than 50 markets traded, -15 if positions are highly concentrated, -15 if position sizing exceeds about 2x Kelly, -10 if the worst single-trade loss exceeds 30%, -10 if edge is inconsistent; result clamped to 0-100. Higher means easier to follow. null when insufficient history. */
2465
2541
  copy_score: number | null;
@@ -2955,7 +3031,7 @@ export type Usage = {
2955
3031
  reset_at: number;
2956
3032
  window_seconds: number;
2957
3033
  };
2958
- /** The monthly request quota (#16111): where the account stands against the requests Pro includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
3034
+ /** The monthly request quota (#16111): where the account stands against the requests the current Pro or Max plan includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
2959
3035
  monthly_quota: {
2960
3036
  /** Admitted requests so far this UTC calendar month. */
2961
3037
  used: number;
@@ -2972,6 +3048,8 @@ export type Usage = {
2972
3048
  pay_as_you_go: boolean;
2973
3049
  /** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or 1,000,000 with pay as you go on. null for an admin account, which no number stops. Additive since 2026-09-22. */
2974
3050
  ceiling: number | null;
3051
+ /** A historical usage price has not been reconciled to this plan allowance. Pay as you go remains unavailable until billing reconciliation. */
3052
+ unavailable_reason?: "usage_price_reconciliation_required" | null;
2975
3053
  } | null;
2976
3054
  };
2977
3055
  meta: ResponseMeta;
@@ -3053,6 +3131,29 @@ export type WebhookVerification = {
3053
3131
  token: string;
3054
3132
  expires_at: string;
3055
3133
  };
3134
+ export type WebhookVerificationAttempt = {
3135
+ id: string;
3136
+ object: "webhook_verification_attempt";
3137
+ webhook_id: number;
3138
+ /** queued/running are pending consent. verified means the same endpoint revision answered 2xx and activated atomically. failed/cancelled/expired are terminal and do not restart on polling or replay. */
3139
+ state: "queued" | "running" | "verified" | "failed" | "cancelled" | "expired";
3140
+ /** Sanitized last observation. Null before an observation; queued retries may retain their previous failure outcome. */
3141
+ outcome: "verified" | "target_rejected" | "challenge_timeout" | "transport_failed" | "receiver_rejected" | "token_expired" | "endpoint_changed" | "owner_revoked" | "attempts_exhausted" | "internal_error" | null;
3142
+ attempt_count: number;
3143
+ max_attempts: 4;
3144
+ /** Earlier of the verification-token deadline and 15 minutes after admission. Activation is forbidden at or after this instant. */
3145
+ expires_at: string;
3146
+ /** Scheduled retry/admission time while queued; null while running or terminal. */
3147
+ next_attempt_at: string | null;
3148
+ /** Actual receiver HTTP status, when one arrived. No receiver response body or resolved address is returned. */
3149
+ last_response_status: number | null;
3150
+ started_at: string | null;
3151
+ completed_at: string | null;
3152
+ created_at: string;
3153
+ updated_at: string;
3154
+ /** Relative authorized API path for this attempt. Uses the same bearer credential as admission. */
3155
+ status_url: string;
3156
+ };
3056
3157
  export type WhaleDatasetArtifactManifest = {
3057
3158
  /** Version of the artifact manifest contract. */
3058
3159
  manifest_version: string;
@@ -3302,6 +3403,7 @@ export interface OperationData {
3302
3403
  };
3303
3404
  };
3304
3405
  createWebhook: WebhookEndpoint;
3406
+ createWebhookVerificationAttempt: WebhookVerificationAttempt;
3305
3407
  deleteWebhook: WebhookEndpoint;
3306
3408
  exploreMarkets: ExploreEntry[];
3307
3409
  getAccountIdentity: {
@@ -3354,7 +3456,7 @@ export interface OperationData {
3354
3456
  getMarketIntel: MarketFlow;
3355
3457
  getMarketSnapshot: MarketSnapshot;
3356
3458
  getMonthlyReportSnapshot: ReportSnapshot;
3357
- getPickOfTheDay: PickOfTheDay;
3459
+ getPickOfTheDay: PickOfTheDay | PickOfTheDayNoEntitledPicks;
3358
3460
  getPickOfTheDayArchive: PickOfTheDayArchive;
3359
3461
  getPickOfTheDayLedger: PickOfTheDayLedger;
3360
3462
  getPickOfTheDayLedgerEntry: PickOfTheDayLedgerEntry;
@@ -3436,7 +3538,7 @@ export interface OperationData {
3436
3538
  reset_at: number;
3437
3539
  window_seconds: number;
3438
3540
  };
3439
- /** The monthly request quota (#16111): where the account stands against the requests Pro includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
3541
+ /** The monthly request quota (#16111): where the account stands against the requests the current Pro or Max plan includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
3440
3542
  monthly_quota: {
3441
3543
  /** Admitted requests so far this UTC calendar month. */
3442
3544
  used: number;
@@ -3453,9 +3555,12 @@ export interface OperationData {
3453
3555
  pay_as_you_go: boolean;
3454
3556
  /** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or 1,000,000 with pay as you go on. null for an admin account, which no number stops. Additive since 2026-09-22. */
3455
3557
  ceiling: number | null;
3558
+ /** A historical usage price has not been reconciled to this plan allowance. Pay as you go remains unavailable until billing reconciliation. */
3559
+ unavailable_reason?: "usage_price_reconciliation_required" | null;
3456
3560
  } | null;
3457
3561
  };
3458
3562
  getWebhook: WebhookEndpoint;
3563
+ getWebhookVerificationAttempt: WebhookVerificationAttempt;
3459
3564
  getWeeklyReportSnapshot: ReportSnapshot;
3460
3565
  getWhaleDatasetStatus: {
3461
3566
  job_id: number;
@@ -3654,6 +3759,7 @@ export interface OperationQuery {
3654
3759
  cancelWhaleDataset: Record<string, never>;
3655
3760
  createMcpJsonRpcResponse: Record<string, never>;
3656
3761
  createWebhook: Record<string, never>;
3762
+ createWebhookVerificationAttempt: Record<string, never>;
3657
3763
  deleteWebhook: Record<string, never>;
3658
3764
  exploreMarkets: {
3659
3765
  /** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket. */
@@ -3720,7 +3826,7 @@ export interface OperationQuery {
3720
3826
  min_grade?: "S" | "A" | "B";
3721
3827
  /** Maximum holders per page. Out-of-range values are clamped to 1..100. */
3722
3828
  limit?: number;
3723
- /** Opaque pagination cursor from the previous response's next_cursor. It encodes a page of one shared roster, so it stays valid across the roster's refresh, but a page read after a refresh can repeat or skip a holder. */
3829
+ /** 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. */
3724
3830
  cursor?: string;
3725
3831
  };
3726
3832
  getMarketIntel: {
@@ -3816,6 +3922,7 @@ export interface OperationQuery {
3816
3922
  };
3817
3923
  getUsage: Record<string, never>;
3818
3924
  getWebhook: Record<string, never>;
3925
+ getWebhookVerificationAttempt: Record<string, never>;
3819
3926
  getWeeklyReportSnapshot: {
3820
3927
  /** UTC source-range start in YYYY-MM-DD format; required with to. Together with to, selects an exact ephemeral range of at most 31 inclusive UTC days. A start after tomorrow UTC returns 400 bad_request with error.param=from. */
3821
3928
  from?: string;
@@ -3939,8 +4046,8 @@ export interface OperationQuery {
3939
4046
  cursor?: string;
3940
4047
  /** Filter by category. Values are matched to canonical category buckets: political variants (Elections, Global Politics, U.S. Politics, ...) fold into Politics, Geopolitics stays distinct, Culture/Entertainment map to Pop Culture, Science maps to Science & Tech, and Finance/Business map to Stocks. Mapped buckets are case-insensitive; passthrough categories (Crypto, NBA, and the sports leagues) match case-sensitively against the provider-native bucket key, so use exact casing (e.g. Crypto, NBA). */
3941
4048
  category?: string;
3942
- /** Filter by ML-detected strategy type. Values come from backend/crates/analytics/src/trader_analysis/classification/decision_tree.rs and are matched exactly against ml_trader_category.primary_type. Values outside the declared enum return HTTP 400. */
3943
- strategy?: "accumulator" | "algo_trader" | "arbitrageur" | "directional" | "event_driven" | "market_maker" | "momentum" | "scalper" | "speculator" | "swing_trader";
4049
+ /** Filter by observed trading style. Current styles: two_sided, category_focused, high_activity, diversified, mixed, unclassified. The original ten archetype identifiers remain accepted for historical rows until normal reclassification. Style describes recorded behavior; grade measures performance. */
4050
+ strategy?: "accumulator" | "algo_trader" | "arbitrageur" | "category_focused" | "directional" | "diversified" | "event_driven" | "high_activity" | "market_maker" | "mixed" | "momentum" | "scalper" | "speculator" | "swing_trader" | "two_sided" | "unclassified";
3944
4051
  };
3945
4052
  listPositions: {
3946
4053
  /** Maximum number of current positions to return. Out-of-range values are clamped to 1..100. */
@@ -4184,6 +4291,10 @@ export interface OperationPath {
4184
4291
  };
4185
4292
  createMcpJsonRpcResponse: Record<string, never>;
4186
4293
  createWebhook: Record<string, never>;
4294
+ createWebhookVerificationAttempt: {
4295
+ /** Webhook endpoint id owned by the authenticated API key user. */
4296
+ id: number;
4297
+ };
4187
4298
  deleteWebhook: {
4188
4299
  /** Webhook endpoint id owned by the authenticated API key user. */
4189
4300
  id: number;
@@ -4291,6 +4402,12 @@ export interface OperationPath {
4291
4402
  /** Webhook endpoint id owned by the authenticated API key user. */
4292
4403
  id: number;
4293
4404
  };
4405
+ getWebhookVerificationAttempt: {
4406
+ /** Webhook endpoint id owned by the authenticated API key user. */
4407
+ id: number;
4408
+ /** Verification attempt UUID returned by admission. Must belong to this webhook and account. */
4409
+ attempt_id: string;
4410
+ };
4294
4411
  getWeeklyReportSnapshot: Record<string, never>;
4295
4412
  getWhaleDatasetStatus: {
4296
4413
  /** Dataset job ID returned by submit; another owner or a trader export returns 404. */
@@ -4412,6 +4529,7 @@ export interface OperationBody {
4412
4529
  params?: Record<string, unknown>;
4413
4530
  };
4414
4531
  createWebhook: CreateWebhookRequest;
4532
+ createWebhookVerificationAttempt: CreateWebhookVerificationAttemptRequest;
4415
4533
  deleteWebhook: never;
4416
4534
  exploreMarkets: never;
4417
4535
  getAccountIdentity: never;
@@ -4450,6 +4568,7 @@ export interface OperationBody {
4450
4568
  getTraderPnl: never;
4451
4569
  getUsage: never;
4452
4570
  getWebhook: never;
4571
+ getWebhookVerificationAttempt: never;
4453
4572
  getWeeklyReportSnapshot: never;
4454
4573
  getWhaleDatasetStatus: never;
4455
4574
  getWhaleTrade: never;
@@ -4538,6 +4657,11 @@ export interface OperationResponse {
4538
4657
  data: OperationData["createWebhook"];
4539
4658
  meta: ResponseMeta;
4540
4659
  };
4660
+ createWebhookVerificationAttempt: {
4661
+ object: "webhook_verification_attempt";
4662
+ data: OperationData["createWebhookVerificationAttempt"];
4663
+ meta: ResponseMeta;
4664
+ };
4541
4665
  deleteWebhook: {
4542
4666
  object: "webhook";
4543
4667
  data: OperationData["deleteWebhook"];
@@ -4733,6 +4857,11 @@ export interface OperationResponse {
4733
4857
  data: OperationData["getWebhook"];
4734
4858
  meta: ResponseMeta;
4735
4859
  };
4860
+ getWebhookVerificationAttempt: {
4861
+ object: "webhook_verification_attempt";
4862
+ data: OperationData["getWebhookVerificationAttempt"];
4863
+ meta: ResponseMeta;
4864
+ };
4736
4865
  getWeeklyReportSnapshot: {
4737
4866
  object: "report_snapshot";
4738
4867
  data: OperationData["getWeeklyReportSnapshot"];