@0xinsider/sdk 0.18.0 → 0.20.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
@@ -69,15 +69,15 @@ export type ApiError = {
69
69
  object: "error";
70
70
  error: {
71
71
  /** FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key. */
72
- code: "bad_request" | "invalid_api_key" | "subscription_required" | "forbidden" | "insufficient_scope" | "not_found" | "account_locked" | "rate_limited" | "rate_limit_unavailable" | "internal_error" | "request_timeout";
72
+ code: "bad_request" | "invalid_api_key" | "subscription_required" | "forbidden" | "insufficient_scope" | "not_found" | "account_locked" | "rate_limited" | "rate_limit_unavailable" | "internal_error" | "request_timeout" | "endpoint_retired";
73
73
  message: string;
74
74
  doc_url?: string;
75
75
  param?: string;
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 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. */
80
- reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "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";
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. 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" | "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";
81
81
  };
82
82
  meta: ResponseMeta;
83
83
  };
@@ -87,11 +87,11 @@ 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 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. */
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 03:00 America/New_York 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
- /** 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. */
94
- reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "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";
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. 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/sports/pre-game-sides, GET /api/v1/sports/pre-game-side-observations and their deprecated aliases); 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. */
94
+ reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "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";
95
95
  };
96
96
  export type BatchMarketFlowItem = {
97
97
  /** Zero-based request index. Duplicate inputs keep separate result rows. */
@@ -171,6 +171,196 @@ export type CategorySkillV2 = {
171
171
  edge_lower_95: number | null;
172
172
  brier_event_avg: number | null;
173
173
  };
174
+ export type Combo = {
175
+ /** Combo identifier: 0x followed by 62 lowercase hex characters. This differs from a binary market condition ID. */
176
+ condition_id: string;
177
+ leg_count: number | null;
178
+ prepared_at: string | null;
179
+ /** Whether the preparation event has been indexed. */
180
+ legs_known: boolean;
181
+ legs: ComboLeg[];
182
+ window: ComboWindowStats | null;
183
+ totals: ComboTotals | null;
184
+ /** Result of the YES conjunction, independent of the wallet side or its P&L. */
185
+ status: "pending" | "won" | "lost" | "unknown";
186
+ /** Reason the conjunction result cannot be verified, when unknown. */
187
+ status_reason: string | null;
188
+ };
189
+ export type ComboCoverage = {
190
+ state: "paused" | "uninitialized" | "stale" | "backfilling" | "live";
191
+ ingest_enabled: boolean;
192
+ cursors: ComboCoverageCursor[];
193
+ max_lag_blocks: number | null;
194
+ oldest_cursor_update: string | null;
195
+ lifecycle_lag_blocks: number | null;
196
+ lifecycle_backfilling: boolean;
197
+ /** Time the coverage state was evaluated; not a market-price timestamp. */
198
+ computed_at: string;
199
+ };
200
+ export type ComboCoverageCursor = {
201
+ /** Indexed contract. */
202
+ contract: string;
203
+ last_block: number;
204
+ seed_block: number;
205
+ seed_origin: string;
206
+ chain_finalized_block: number | null;
207
+ lag_blocks: number | null;
208
+ updated_at: string;
209
+ };
210
+ /** One combo with its newest 100 fills and all-time lifecycle totals. Paid API callers receive full access. */
211
+ export type ComboDetail = {
212
+ access: "full";
213
+ combo: Combo;
214
+ fills: ComboFill[];
215
+ lifecycle: ComboLifecycleStats | null;
216
+ coverage: ComboCoverage;
217
+ };
218
+ export type ComboFill = {
219
+ /** Stable fill identity. */
220
+ id: string;
221
+ block_number: number;
222
+ log_index: number;
223
+ block_timestamp: string;
224
+ tx_hash: string;
225
+ /** Taker wallet address. */
226
+ trader: string | null;
227
+ trader_name: string | null;
228
+ trader_grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
229
+ /** Recorded wallet-wide trade time. */
230
+ last_traded_at: string | null;
231
+ action: "buy" | "sell";
232
+ /** Combo identifier: 0x followed by 62 lowercase hex characters. This differs from a binary market condition ID. */
233
+ condition_id: string;
234
+ /** 0 is YES, 1 is NO. */
235
+ outcome_index: number;
236
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
237
+ shares: string;
238
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
239
+ collateral_usdc: string;
240
+ /** Execution price for the traded outcome; null for a zero-share event. */
241
+ price: string | null;
242
+ /** Execution price normalized to YES. */
243
+ price_yes: string | null;
244
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
245
+ fee_usdc: string;
246
+ leg_count: number | null;
247
+ /** Result of the YES conjunction, independent of the wallet side or its P&L. */
248
+ status: "pending" | "won" | "lost" | "unknown";
249
+ status_reason: string | null;
250
+ won_legs: number;
251
+ /** Shares per dollar at execution; not a forecast or guaranteed return. */
252
+ payout_multiplier: string | null;
253
+ legs: ComboLeg[];
254
+ };
255
+ export type ComboFillsResponse = {
256
+ object: "list";
257
+ data: ComboFill[];
258
+ sort: "recent" | "largest" | "payout";
259
+ window: "24h" | "7d" | "all";
260
+ limit: number;
261
+ coverage: ComboCoverage;
262
+ /** A continuation is available based on page fullness. Its next page may be empty. */
263
+ has_more: boolean;
264
+ /** Exclusive block_number:log_index continuation for recent ordering. */
265
+ next_cursor?: string;
266
+ /** Continuation offset for largest or payout ordering. */
267
+ next_offset?: number;
268
+ meta: ResponseMeta;
269
+ /** Not computed for combo fill pages; omitted. */
270
+ total?: number;
271
+ };
272
+ export type ComboLeg = {
273
+ leg_index: number;
274
+ outcome_index: number;
275
+ module_id: number;
276
+ state: "pending" | "won" | "lost" | "void" | "unknown";
277
+ market: ComboLegMarket | null;
278
+ };
279
+ export type ComboLegMarket = {
280
+ /** Source of the leg facts. */
281
+ source: "markets" | "provider";
282
+ /** Full binary CTF condition ID for this leg. */
283
+ condition_id: string;
284
+ title: string | null;
285
+ slug: string | null;
286
+ event_slug: string | null;
287
+ /** Provider-resolved URL including the referral tag. */
288
+ polymarket_url?: string;
289
+ outcome_label: string | null;
290
+ image: string | null;
291
+ category: string | null;
292
+ /** Provider outcome index; negative sentinels describe void or unresolved states. */
293
+ winning_outcome: number | null;
294
+ resolved_at: string | null;
295
+ /** A closed market may still have no terminal outcome. */
296
+ market_closed: boolean | null;
297
+ /** Stored daily price for this leg outcome token; not a live quote. */
298
+ pick_price_daily: number | null;
299
+ /** Observation time of the stored daily price. */
300
+ pick_price_as_of: string | null;
301
+ /** Whole days since the stored daily bucket. */
302
+ pick_price_age_days: number | null;
303
+ /** Unmodified provider leg status when available. */
304
+ provider_leg_status: string | null;
305
+ };
306
+ export type ComboLifecycleStats = {
307
+ splits: number;
308
+ merges: number;
309
+ redeems: number;
310
+ compresses: number;
311
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
312
+ split_usdc: string;
313
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
314
+ merge_usdc: string;
315
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
316
+ redeemed_shares: string;
317
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
318
+ redeemed_usdc: string;
319
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
320
+ compressed_usdc: string;
321
+ last_event_at: string;
322
+ };
323
+ export type ComboLiveCount = {
324
+ /** Traded combos whose YES conjunction remains pending. */
325
+ count: number;
326
+ /** Time the count was computed; check its age before using it. */
327
+ computed_at: string;
328
+ };
329
+ export type ComboResponse = {
330
+ object: "combo";
331
+ data: ComboDetail;
332
+ meta: ResponseMeta;
333
+ };
334
+ /** Stored live combo count. Null means the first count is unavailable, never zero. */
335
+ export type CombosSummary = {
336
+ live: ComboLiveCount | null;
337
+ };
338
+ export type CombosSummaryResponse = {
339
+ object: "combos_summary";
340
+ data: CombosSummary;
341
+ meta: ResponseMeta;
342
+ };
343
+ export type ComboTotals = {
344
+ fills: number;
345
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
346
+ volume_usdc: string;
347
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
348
+ largest_fill_usdc: string;
349
+ first_fill_at: string;
350
+ last_fill_at: string;
351
+ /** Last taker execution normalized to YES; not a current quote. */
352
+ last_fill_price_yes: string | null;
353
+ last_fill_outcome_index: number;
354
+ last_fill_action: "buy" | "sell";
355
+ };
356
+ export type ComboWindowStats = {
357
+ fills: number;
358
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
359
+ volume_usdc: string;
360
+ distinct_traders: number;
361
+ /** Exact decimal string from the stored chain or SQL value; preserve precision until display. */
362
+ largest_fill_usdc: string;
363
+ };
174
364
  export type ContentSearchResult = {
175
365
  /** Backend-owned stable editorial content identifier. */
176
366
  content_id: string;
@@ -280,6 +470,90 @@ export type DataQualityGroup = {
280
470
  /** Why the status is not fresh. Omitted when it is. */
281
471
  reason?: string;
282
472
  };
473
+ /** The full Edge Hunter board shown at https://0xinsider.com/sports/edge, for Max credentials. It covers all sports and esports with a fixed B grade floor and returns the first 30 ranked rows. No cursor or observation cohorts are exposed. */
474
+ export type EdgeHunterBoard = {
475
+ /** When the ranked snapshot was computed. Date current quotes with their own ts values. */
476
+ as_of: string;
477
+ horizon_hours: number;
478
+ min_grade: "B";
479
+ /** live uses the current graded holder pile; db_only is a weaker stored-data fallback. */
480
+ ranking_source: "live" | "db_only";
481
+ /** degraded means directional enrichment was unavailable. */
482
+ directional_source: "live" | "degraded";
483
+ cached_age_seconds: number | null;
484
+ viewer: "max";
485
+ /** Always null: Edge Hunter has no free signal slot. */
486
+ free_rank: number | null;
487
+ /** Ranked rows in this window before the 30-row cap. */
488
+ total: number;
489
+ rows: EdgeHunterRow[];
490
+ };
491
+ /** One provider outcome in YES/NO order. Null current_price means no verified current quote is available. */
492
+ export type EdgeHunterOutcome = {
493
+ index: 0 | 1;
494
+ label: string | null;
495
+ provider_id: number | null;
496
+ current_price: EdgeHunterPrice;
497
+ };
498
+ export type EdgeHunterParticipant = {
499
+ provider_id?: number;
500
+ logo?: string;
501
+ logo_mark_dark?: boolean;
502
+ color?: string;
503
+ headshot?: string;
504
+ headshot_revision?: number;
505
+ tour?: string;
506
+ name: string;
507
+ };
508
+ export type EdgeHunterPrice = {
509
+ /** Provider probability as a decimal string. Keep its precision until display. */
510
+ price: string;
511
+ basis: "midpoint" | "last_trade";
512
+ /** Source observation clock in epoch milliseconds, represented as a string. */
513
+ ts: string;
514
+ /** Backend validation clock in epoch milliseconds. Omitted when no current-source validation is available. */
515
+ validated_at?: string;
516
+ };
517
+ /** One full Max row from Edge Hunter. signal is populated on every row this endpoint returns. Identity and quotes preserve provider values; unknown values stay null. */
518
+ export type EdgeHunterRow = {
519
+ rank: number;
520
+ state: "full";
521
+ free: false;
522
+ condition_id: string;
523
+ event_slug: string | null;
524
+ title: string | null;
525
+ category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball" | null;
526
+ raw_category: string | null;
527
+ game_start_time: string | null;
528
+ /** Cumulative provider taker volume in shares, not cash in USD. Null when unavailable. */
529
+ volume: number | null;
530
+ participants: EdgeHunterParticipant[];
531
+ image: string | null;
532
+ outcomes: EdgeHunterOutcome[];
533
+ signal: EdgeHunterSignal;
534
+ };
535
+ /** Backed-side analytics from the ranked snapshot, plus a separately dated current quote. Scores rank attention; they are not probabilities or order instructions. */
536
+ export type EdgeHunterSignal = {
537
+ piled_side: string | null;
538
+ piled_outcome_index: 0 | 1;
539
+ /** Fraction of graded money on the backed side, not a percentage from 0 to 100. */
540
+ sharp_pct: number | null;
541
+ backed_sharp_usd: number;
542
+ s_count: number;
543
+ a_count: number;
544
+ b_count: number;
545
+ graded_holders: number;
546
+ top_grade: "S" | "A" | "B" | null;
547
+ smart_score: number | null;
548
+ net_side: string | null;
549
+ conviction_score: number;
550
+ one_way_holder_count: number | null;
551
+ hedged_holder_count: number | null;
552
+ one_way_graded_usd: number | null;
553
+ directional_confidence: number | null;
554
+ directional_rank_score: number;
555
+ current_price: EdgeHunterPrice;
556
+ };
283
557
  export type EventReplayEvent = {
284
558
  /** Opaque event identity: the ef_-encoded whale_alerts.id, stable across cursor formats. Deduplicate on this, never on cursor or sequence. */
285
559
  id: string;
@@ -391,6 +665,7 @@ export type ExploreGroup = {
391
665
  category: string | null;
392
666
  /** Markets in the event cluster, ranked by volume with condition_id as the tie-breaker. The selected representative is retained within the 12-market cap. */
393
667
  markets: ExploreMarket[];
668
+ /** 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. */
394
669
  rep_volume: number | null;
395
670
  /** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value. */
396
671
  rep_large_trades: number | null;
@@ -412,6 +687,7 @@ export type ExploreMarket = {
412
687
  platform: "polymarket" | null;
413
688
  /** closed once Polymarket has closed trading or the market has resolved; active otherwise. The same rule labels a market on markets/search, markets/explore and market/{condition_id}/snapshot. */
414
689
  status: "active" | "closed";
690
+ /** 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. */
415
691
  volume: number | null;
416
692
  liquidity: number | null;
417
693
  /** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
@@ -503,9 +779,12 @@ export type ExportSourceRange = {
503
779
  export type ExportVolumeReconciliation = {
504
780
  /** Verified full-history both-sides USD cash volume. Null without coverage; the local activity numerator may cover only a subset of history. */
505
781
  provider_lifetime_volume: number | null;
782
+ /** 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. */
506
783
  exported_activity_volume: number;
507
784
  exported_market_cost_basis: number;
785
+ /** provider_lifetime_volume minus exported_activity_volume, in USD, rounded to cents. Null when provider_lifetime_volume is null. */
508
786
  provider_activity_volume_gap: number | null;
787
+ /** 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. */
509
788
  activity_volume_coverage: number | null;
510
789
  };
511
790
  export type FreshnessFailure = {
@@ -672,7 +951,7 @@ export type GameMarketProviderPrices = GameMarketPricePaired | GameMarketPriceIn
672
951
  export type GamesCoverage = {
673
952
  /** Canonical sport buckets served, sorted. */
674
953
  sports: string[];
675
- /** League tags served, sorted. */
954
+ /** League tags served, sorted. EuroLeague is euroleague under the Basketball sport bucket. */
676
955
  leagues: string[];
677
956
  /** Scopes whose source half was unavailable for this read, as <sport>:<half>. Empty means every scope answered. */
678
957
  sources_unavailable: string[];
@@ -781,7 +1060,7 @@ export type LargePosition = {
781
1060
  username?: string;
782
1061
  grade?: "S" | "A" | "B" | "C" | "D" | "F";
783
1062
  win_rate?: number;
784
- /** Trader lifetime realized P&L across all markets. */
1063
+ /** The wallet's Total P&L in USD, the figure its 0xinsider profile shows: native Polymarket position P&L across all markets, fees included, plus credited maker and taker rebates. Distinct from this position's position_unrealized_pnl. Omitted when the wallet has no native accounting snapshot. */
785
1064
  pnl?: number;
786
1065
  markets_traded?: number;
787
1066
  };
@@ -824,7 +1103,7 @@ export type LargeTrade = {
824
1103
  suspicion_score: number | null;
825
1104
  /** Persisted scorer track. Null when a legacy row has no stored track label. */
826
1105
  suspicion_track: "whale" | "fresh_conviction" | "sliced_position" | null;
827
- /** This fill's size relative to its market: size_usd divided by a market volume figure recorded at or after the trade, so the value always falls between 0 and 1 inclusive. A $10,000 fill is 0.00005 of a $200M market and 0.125 of an $80,000 one, which size_usd alone cannot distinguish. Absent when no volume figure recorded at or after the trade is available; never 0 as a stand-in and never capped at 1, because a denominator we cannot trust publishes nothing rather than a trimmed number. A market's volume keeps growing, so the same trade reports a smaller share as the market trades on. */
1106
+ /** This fill's size relative to its market: its share count (size_usd / price) divided by the shares the market has traded, Polymarket's recorded volume, which counts shares rather than dollars, as observed at or after the trade, so the value always falls between 0 and 1 inclusive. A 20,000-share fill is 0.00005 of a market that has traded 400M shares and 0.125 of one that has traded 160,000, which size_usd alone cannot distinguish. Absent when no volume figure recorded at or after the trade is available, or when that figure is smaller than the fill; never 0 as a stand-in and never capped at 1, because a denominator we cannot trust publishes nothing rather than a trimmed number. A market's volume keeps growing, so the same trade reports a smaller share as the market trades on. */
828
1107
  market_volume_share?: number;
829
1108
  trader: {
830
1109
  id: string;
@@ -885,9 +1164,9 @@ export type LeaderboardEntry = {
885
1164
  /** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
886
1165
  streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
887
1166
  score?: number;
888
- /** All-time P&L in USD (total_pnl), including unrealized open positions. Kept for back-compat; prefer realized_pnl for the banked figure. */
1167
+ /** Polymarket's all-time leaderboard P&L in USD, from Polymarket's latest observation of this wallet on its all-time leaderboard (dated by the leaderboard_pnl data_quality group). Omitted when that leaderboard has no current observation ranking the wallet; 0xinsider requests one, and never serves an older stored figure in its place. Includes unrealized open positions. Kept for back-compat. Not the profile's Total P&L, which GET /api/v1/trader/{address} serves as pnl.net_total; the two can differ by a wide margin. Prefer realized_pnl for the banked figure. */
889
1168
  pnl?: number;
890
- /** Native realized P&L plus credited maker and taker rebates in USD, with fees already included. The exact numeric value is truncated toward zero to cents before JSON conversion. Wallets without a native snapshot retain their historical stored realized P&L. Omitted when the native snapshot has no net realized value. */
1169
+ /** 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. */
891
1170
  realized_pnl?: number;
892
1171
  /** Full-history both-sides USD cash volume from a verified Polymarket user-volume observation. Omitted without coverage. */
893
1172
  volume?: number;
@@ -900,7 +1179,7 @@ export type LeaderboardEntry = {
900
1179
  platform: "polymarket";
901
1180
  last_active?: string;
902
1181
  };
903
- /** Provider-first bucketed OHLC price candles for a market's outcome tokens, derived from the stored token_price_snapshots series (covers open and resolved markets). */
1182
+ /** Provider-first bucketed OHLC price candles for a market's outcome tokens, derived from our stored copy of the Polymarket CLOB prices-history series (covers open and resolved markets). */
904
1183
  export type MarketCandles = {
905
1184
  /** Market condition id the candles were read for. */
906
1185
  condition_id: string;
@@ -1109,9 +1388,13 @@ export type MarketSnapshot = {
1109
1388
  })[];
1110
1389
  liquidity: {
1111
1390
  source: string;
1391
+ /** 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. The name ends in _usd because Polymarket prints this figure with a dollar sign; it is a share count. Null when unavailable. */
1112
1392
  volume_usd: number | null;
1113
1393
  liquidity_usd: number | null;
1394
+ /** Polymarket's taker volume over the 24 hours before volume_24h_as_of, 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). The name ends in _usd because Polymarket prints volume with a dollar sign; it is a share count. Null when Polymarket does not report one: it omits the figure on closed markets and on open markets with no trades in the last 24 hours. */
1114
1395
  volume_24h_usd: number | null;
1396
+ /** When 0xinsider read volume_24h_usd from Polymarket; the figure covers the 24 hours before this time. Null exactly when volume_24h_usd is null. */
1397
+ volume_24h_as_of: string | null;
1115
1398
  /** Always null. Polymarket snapshot prices come from outcome top-of-book midpoints. */
1116
1399
  last_price: number | null;
1117
1400
  };
@@ -1264,7 +1547,7 @@ export type PickOfTheDay = {
1264
1547
  matchup?: string;
1265
1548
  /** Recorded canonical sport category. Prefer display_category for the public competition label. */
1266
1549
  category?: string;
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. */
1550
+ /** Frozen public presentation category. Tennis uses the provider-verified ATP or WTA tour, including Wimbledon and doubles; unknown tours retain Tennis. Every men's and women's cricket competition uses Cricket. Other sports use the curated league, esports title or soccer competition label, then the provider series name without its season year, then category when no competition is known. The canonical category and measured cohort are unchanged: an esports title still uses the pooled Esports category. Optional for mixed-version client compatibility. */
1268
1551
  display_category?: string;
1269
1552
  /** Provider platform. Always polymarket. */
1270
1553
  platform?: "polymarket";
@@ -1369,8 +1652,6 @@ export type PickOfTheDay = {
1369
1652
  display_holders?: PickHolder[];
1370
1653
  /** S/A holder count for the public V1 compatibility projection. display_holders can include additional grades. */
1371
1654
  holder_count?: number;
1372
- /** Optional editorial note attached to the pick. */
1373
- editorial_note?: string;
1374
1655
  /** Required truthful thesis. With at least one profitable-wallet holder: Profitable wallets hold {pick_outcome_label}[, led by a grade-{top_grade} trader]. Without holder backing: 0xInsider's Pick of the Day is {pick_outcome_label}. Wallet counts are not appended. */
1375
1656
  thesis?: string;
1376
1657
  /** Canonical web market URL. */
@@ -1442,13 +1723,13 @@ export type PickOfTheDayArchiveEntry = {
1442
1723
  * @deprecated
1443
1724
  */
1444
1725
  pick_rank?: number;
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. */
1726
+ /** 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 picks publish from 03:00 America/New_York on pick_date. Absent only for historical rows whose publication instant is unknown. */
1446
1727
  published_at?: string;
1447
1728
  /** Human-readable matchup (e.g. "Portugal vs. Uzbekistan"). */
1448
1729
  matchup?: string;
1449
1730
  /** Frozen canonical calibration/report bucket (e.g. "Basketball", "MMA", or "Soccer"). Existing semantics are unchanged; presentation consumers should prefer display_category when present. */
1450
1731
  category?: string;
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. */
1732
+ /** Frozen public presentation category. Tennis uses the provider-verified ATP or WTA tour, including Wimbledon and doubles; unknown tours retain Tennis. Every men's and women's cricket competition uses Cricket. Other sports use the curated league, esports title or soccer competition label, then the provider series name without its season year, then category when no competition is known. The canonical category and measured cohort are unchanged: an esports title still uses the pooled Esports category. Optional for mixed-version client compatibility. */
1452
1733
  display_category?: string;
1453
1734
  /** 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. */
1454
1735
  image_url?: string;
@@ -1891,8 +2172,9 @@ export type Position = {
1891
2172
  address: string;
1892
2173
  username?: string;
1893
2174
  grade?: "S" | "A" | "B" | "C" | "D" | "F";
1894
- /** Percentage 0-100. */
2175
+ /** Win rate as a ratio from 0 to 1 (0.62 means 62%), the same scale as stats.win_rate on GET /api/v1/trader/{address}. Absent when unknown. */
1895
2176
  win_rate?: number;
2177
+ /** The wallet's Total P&L in USD, the figure its 0xinsider profile shows: native Polymarket position P&L across all markets, fees included, plus credited maker and taker rebates (trader_trading_pnl.net_total_pnl). Not the Polymarket leaderboard figure, which GET /api/v1/trader/{address} still serves as pnl.total. Omitted when the wallet has no native accounting snapshot; the leaderboard figure is never substituted. */
1896
2178
  pnl?: number;
1897
2179
  markets?: number;
1898
2180
  wallet_age_days?: number;
@@ -1929,7 +2211,7 @@ export type PositionTimelineEvent = {
1929
2211
  id: string;
1930
2212
  /** ISO 8601 timestamp of the on-chain fill. */
1931
2213
  event_timestamp: string;
1932
- /** From the taker's perspective. */
2214
+ /** The wallet's own side of this fill: buy or sell. */
1933
2215
  action: "buy" | "sell";
1934
2216
  outcome_side: "yes" | "no";
1935
2217
  /** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
@@ -1970,214 +2252,6 @@ export type PotdEntryAuthorization = {
1970
2252
  /** Original authorization expiry at the earlier requested or provider kickoff; never extended. An expired authorization cannot authorize a new automated entry. */
1971
2253
  expires_at: string;
1972
2254
  };
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. */
1974
- export type PreGameSide = {
1975
- /** 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. */
1976
- side: string | null;
1977
- /** UTC time at which the snapshot that ranked this row was computed. Canonical spelling of signal_created_at (#16310), same value. */
1978
- ranked_at: string;
1979
- /** Recorded side backing score; higher values indicate stronger backing. */
1980
- backing_score: number;
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. */
1982
- side_share: number | null;
1983
- /** Polymarket condition id. */
1984
- condition_id: string;
1985
- /**
1986
- * UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. Deprecated (#16310): `ranked_at` is the canonical spelling and carries the same value; this key stays on the wire.
1987
- * @deprecated
1988
- */
1989
- signal_created_at: string;
1990
- /** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
1991
- token_id: string | null;
1992
- /** Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping. */
1993
- category: string | null;
1994
- /** Raw provider category as stored (e.g. NBA, EPL). */
1995
- raw_category: string | null;
1996
- title: string | null;
1997
- event_slug: string | null;
1998
- /** Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started. */
1999
- game_start_time: string | null;
2000
- /**
2001
- * Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
2002
- * @deprecated
2003
- */
2004
- piled_side: string | null;
2005
- /** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
2006
- piled_outcome_index: number;
2007
- /** Piled-side dollar concentration backed_usd / (yes_usd + no_usd), in (0.5, 1] for a real pile; null when there is no sharp USD. */
2008
- sharp_pct: number | null;
2009
- /** Raw piled-side sharp-money USD. */
2010
- backed_sharp_usd: number;
2011
- /** S-grade graded holders on the piled side. */
2012
- s_count: number;
2013
- /** A-grade graded holders on the piled side. */
2014
- a_count: number;
2015
- /** B-grade graded holders on the piled side. */
2016
- b_count: number;
2017
- /** Piled-side graded holder count (s_count + a_count + b_count). */
2018
- graded_holders: number;
2019
- /** Best grade present on the piled side; null when none. */
2020
- top_grade: "S" | "A" | "B" | null;
2021
- /**
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.
2023
- * @deprecated
2024
- */
2025
- smart_score: number | null;
2026
- /** Market volume (USD). */
2027
- volume: number | null;
2028
- /** Aggregate recent flow direction on the market; null when unavailable. */
2029
- net_side: "BUY" | "SELL" | null;
2030
- /**
2031
- * Recorded conviction score; higher values indicate stronger conviction.
2032
- * @deprecated
2033
- */
2034
- conviction_score: number;
2035
- /** Piled-side graded holders read one-way: their fresh open legs across the signal game's markets (cross-market within the one game; moneyline+spread family only) all back the same team, or, when the market's holder scan was complete, Polymarket's currentValue shows no opposite leg on this market worth 10% of the backed leg and no fresh leg opposes it. Null when the directional read was not computed (no groupable game, no holder-level data on this ranking path, or the enrichment read failed) or classified nobody. */
2036
- one_way_holder_count: number | null;
2037
- /** Piled-side graded holders classified HEDGED across the game by fresh legs (they back two or more distinct teams). A wallet long both outcomes of this market is not one-way and not counted here. Null when the directional read was not computed or classified nobody. */
2038
- hedged_holder_count: number | null;
2039
- /** Piled-side graded USD held by one-way wallets (share-weighted allocation of backed_sharp_usd). Null when the directional read was not computed or classified nobody. */
2040
- one_way_graded_usd: number | null;
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. */
2042
- directional_confidence: number | null;
2043
- /** Recorded side ordering score; higher values sort first. */
2044
- directional_rank_score: number;
2045
- category_skill: PreGameSideCategorySkill;
2046
- /** 1-based rank within the (min_grade-filtered) ranked result. */
2047
- rank: number;
2048
- };
2049
- /** Shadow-only category evidence over the full uncapped piled-side S/A/B holder allocation. It never changes signal membership, ordering, routing, or sizing. */
2050
- export type PreGameSideCategorySkill = {
2051
- status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
2052
- model_version: string;
2053
- taxonomy_version: string | null;
2054
- platform: "polymarket";
2055
- scope: "observed_goldsky_primary_taker_fill";
2056
- source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
2057
- observation_started_at: string;
2058
- as_of: string;
2059
- canonical_category: string | null;
2060
- eligible_holders: number;
2061
- covered_holders: number;
2062
- backed_sharp_usd: number | null;
2063
- covered_backed_usd: number | null;
2064
- coverage_pct: number | null;
2065
- weighted_edge_mean: number | null;
2066
- weighted_holder_lower_mean: number | null;
2067
- specialist_backed_usd: number | null;
2068
- specialist_backed_usd_pct: number | null;
2069
- largest_holder_backed_usd_pct: number | null;
2070
- minimum_holder_event_count: number | null;
2071
- };
2072
- /** Per-sport accountable funnel for the full observation snapshot, returned on every page. */
2073
- export type PreGameSideFunnelReport = {
2074
- sports: PreGameSideSportFunnelReport[];
2075
- };
2076
- /** One explicitly observation-only holder-pile measurement. It is evidence for cohort evaluation, not an execution instruction, and is isolated from the funded sports-edge-signals route. */
2077
- export type PreGameSideObservation = {
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. */
2079
- side: string | null;
2080
- /** Recorded side backing score; higher values indicate stronger backing. */
2081
- backing_score: number;
2082
- /** Signed share of graded money on the side, in [-1, 1]. Canonical spelling of smart_score (#16309, #16310), same value. */
2083
- side_share: number;
2084
- /** Raw Polymarket condition id. */
2085
- condition_id: string;
2086
- /** Provider-backed Polymarket CLOB token id for the piled outcome. Rows without a verified token terminate before emission. */
2087
- token_id: string;
2088
- /** Canonical sport bucket. */
2089
- category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
2090
- /** Raw provider category as stored. */
2091
- raw_category: string | null;
2092
- /** Provider-backed market title. */
2093
- title: string;
2094
- event_slug: string | null;
2095
- /** Provider event id when available. */
2096
- event_id: string | null;
2097
- /** Provider parent-event id used as the first event-cap identity when available. */
2098
- parent_event_id: string | null;
2099
- /** Provider-backed kickoff time in UTC. */
2100
- game_start_time: string;
2101
- /** UTC instant when this row finished provider/holder evaluation. */
2102
- observed_at: string;
2103
- /** Source cohort or additive projection view. emerging_pile is projected from wider_holder after source computation, overlaps its funnel denominator, and uses the source row's directional evidence. */
2104
- cohort: "wider_holder" | "in_play" | "emerging_pile";
2105
- /** Always true. This row must not be routed to an order executor. */
2106
- observation_only: true;
2107
- /**
2108
- * Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
2109
- * @deprecated
2110
- */
2111
- piled_side: string | null;
2112
- /** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
2113
- piled_outcome_index: 0 | 1;
2114
- /** Provider-backed implied price for the piled outcome at observation time. */
2115
- backed_price: number;
2116
- /** Piled-side graded-holder dollar concentration. */
2117
- sharp_pct: number;
2118
- /** Raw graded-holder USD on the piled outcome. */
2119
- backed_sharp_usd: number;
2120
- s_count: number;
2121
- a_count: number;
2122
- b_count: number;
2123
- /** Piled-side S/A/B holder count. */
2124
- graded_holders: number;
2125
- top_grade: "S" | "A" | "B";
2126
- /**
2127
- * Canonical signed holder-pile score. Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
2128
- * @deprecated
2129
- */
2130
- smart_score: number;
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. */
2132
- volume: number;
2133
- /**
2134
- * Recorded conviction score; higher values indicate stronger conviction.
2135
- * @deprecated
2136
- */
2137
- conviction_score: number;
2138
- /** Whether the provider holder page came from the shared cache or a live provider read. */
2139
- provider_read_source: "cached" | "live";
2140
- /** True only when neither provider outcome holder page hit the top-100 scan bound. False means the pile is a positive lower bound and cannot satisfy a future capital-promotion gate. */
2141
- holder_scan_complete: boolean;
2142
- /** Proven provider holder observation time. A warm cache hit uses only the original provider completion time from its companion metadata, never cache-read time. Null, malformed, future, or stale holder time fails in-play closed. */
2143
- holder_snapshot_at: string | null;
2144
- /** Truthful state of the directional read, which classifies each graded holder by its fresh synced legs across the game's markets and, when holder_scan_complete is true, by Polymarket's currentValue on both outcomes of this market. A wider_holder row can remain emitted with unavailable and terminal wider_holder_emitted; in_play fails closed instead and terminates as in_play_directional_unavailable. */
2145
- directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
2146
- one_way_holder_count: number | null;
2147
- hedged_holder_count: number | null;
2148
- one_way_graded_usd: number | null;
2149
- directional_confidence: number | null;
2150
- /** Recorded side ordering score; higher values sort first. */
2151
- directional_rank_score: number;
2152
- /** 1-based rank within this observation cohort and snapshot. */
2153
- rank: number;
2154
- };
2155
- /** Closed 25-value terminal-reason vocabulary for the accountable sports-edge observation funnel. capacity_limited is intentional bounded provider-work admission and does not itself set the snapshot degraded. board_source_unavailable is a completed board-source failure; board_deadline_unavailable means live-board work missed either an internal configured-scope deadline or the outer fair-wave deadline; both classify only already-started rows, so for the upcoming source read funnel.sports[].board_upcoming_status instead; provider_unavailable is reserved for an attempted holder-provider failure; holder_deadline_unavailable is holder cache/provider absolute-deadline exhaustion. */
2156
- export type PreGameSideObservationTerminalReason = "outside_horizon" | "resolved" | "provider_closed" | "provider_excluded" | "invalid_market" | "missing_token" | "missing_stored_market" | "not_provider_live" | "board_source_unavailable" | "board_deadline_unavailable" | "primary_slate_candidate" | "zero_indexed_holder_research" | "capacity_limited" | "provider_unavailable" | "holder_deadline_unavailable" | "holder_computation_unavailable" | "holder_scan_incomplete" | "no_current_graded_holder" | "split_holder_pile" | "price_unavailable" | "wider_holder_emitted" | "in_play_emitted" | "in_play_stale_observed" | "in_play_directional_unavailable" | "internal_unclassified";
2157
- /** Independent sports-board supply plus stored-universe terminal accounting for one canonical sport. */
2158
- export type PreGameSideSportFunnelReport = {
2159
- sport: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
2160
- /** Unique condition ids independently visible on the provider-first sports board. */
2161
- board_input: number;
2162
- /** Whether the always-applicable live-board source completed as available. False can mean a completed source failure (board_source_unavailable) or live-board work missing an internal configured-scope deadline or the outer fair-wave deadline (board_deadline_unavailable); inspect terminals to distinguish them. */
2163
- board_live_available: boolean;
2164
- /** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
2165
- board_upcoming_configured: boolean;
2166
- /** Whether every configured upcoming-board scope completed as available. False with board_upcoming_configured=false means not applicable. When board_upcoming_configured is true and this flag is false, read board_upcoming_status for the cause (it reads unknown, i.e. no recorded cause, only on a snapshot cached before that field existed, which self-clears within one TTL): the board_source_unavailable and board_deadline_unavailable terminals are assigned only to already-started rows (the live half) and are structurally 0 for the upcoming source, so they never explain this flag. */
2167
- board_upcoming_available: boolean;
2168
- /** Why the upcoming-board source is (un)available. Board supply is one canonical-sport union: the bare category owns live truth and every configured composed league scope contributes upcoming rows; folded leagues without a configured board (currently NCAAB and CFL) are not in the upcoming union. available: every configured scope completed truthfully (a successful empty schedule still counts). capacity_limited: provider pagination or a configured upcoming cache published an intentionally bounded complete-event prefix; those rows are excluded from diagnostic-universe input and must not be treated as a complete upcoming universe. Cache-bound prefixes are limited to 3,000 rows or an exact 5,000,000-byte final envelope. source_unavailable: composition failed before a truthful union; resolved scope readers turn half failures into cold_unavailable, so fresh producers are whole-union identity reconciliation or a registry contract failure and carry zero rows. cold_unavailable: every scope completed but at least one reported its upcoming half unavailable because no servable entry was inside the stale-serve bound and the background warm did not land in time; it is not by itself proof of a provider outage. deadline_unavailable: an internal configured-scope deadline or the outer bounded fair wave expired. An internal deadline may retain healthy bare-category or sibling-scope rows; the outer wave records zero rows. These upcoming fields do not describe league live-membership availability. If the bare-category live scope fails, all live rows are dropped even when a league scope completed, because the bare category is the sole live-truth owner. not_configured: no upcoming scope applies to the sport. unknown: exactly one cause -- a snapshot cached before this field existed whose legacy flags recorded an unavailable-but-configured half without saying why. Every freshly computed snapshot reports a concrete status, and a legacy available or not-configured row is reconstructed exactly, so unknown self-clears within one TTL. board_upcoming_available is exactly board_upcoming_status == available. */
2169
- board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
2170
- /** Configured upcoming scopes that did not complete as available. Values are category, a provider league tag slug (nfl, cfb, nba, wnba, nhl, mls, valorant, league-of-legends, counter-strike-2, or dota-2), registry when the compiled scope/projection contract drifted, union when cross-scope identity reconciliation failed, or wave when the outer fair-wave deadline expired before scope-level evidence returned. Empty means no unavailable upcoming scope was identified; this includes healthy/not-configured rows and a legacy cached row. Observation league scopes are upcoming-only and perform no live-membership read. */
2171
- board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
2172
- /** Stored-universe rows plus provider-board rows missing from storage. */
2173
- input: number;
2174
- /** Sparse counts over the closed 25-value terminal vocabulary: outside_horizon, resolved, provider_closed, provider_excluded, invalid_market, missing_token, missing_stored_market, not_provider_live, board_source_unavailable, board_deadline_unavailable, primary_slate_candidate, zero_indexed_holder_research, capacity_limited, provider_unavailable, holder_deadline_unavailable, holder_computation_unavailable, holder_scan_incomplete, no_current_graded_holder, split_holder_pile, price_unavailable, wider_holder_emitted, in_play_emitted, in_play_stale_observed, in_play_directional_unavailable, or internal_unclassified. primary_slate_candidate means exact admission by the funded route's raw shared signals query before provider/holder enrichment; recent-flow rows rejected by its event, bucket, or total caps remain eligible for wider_holder measurement. capacity_limited is intentional bounded provider-work admission, is fully accounted here, and does not itself set degraded=true. board_source_unavailable means a completed board source was unavailable; board_deadline_unavailable means live-board work missed either an internal configured-scope deadline or the outer fair-wave deadline; provider_unavailable means an attempted holder-provider read failed; holder_deadline_unavailable means holder cache/provider work missed the absolute request deadline; holder_computation_unavailable means post-holder provider or DB-backed price/metadata evaluation was unavailable. */
2175
- terminals: Record<string, number>;
2176
- /** Sum of every sparse terminal count. */
2177
- terminal_total: number;
2178
- /** True exactly when input equals terminal_total. */
2179
- reconciled: boolean;
2180
- };
2181
2255
  /** One PUBLISHED same-day pick whose holder proof is not readable yet: its stable slot rank, the release and kickoff instants, and the instant before which a retry cannot succeed. Every item in `picks` carries its full required shape, so a pick that cannot meet it is listed here instead of being served with missing fields or a synthetic zero. */
2182
2256
  export type ProofPendingPickSlot = {
2183
2257
  /**
@@ -2302,9 +2376,9 @@ export type ResponseMeta = {
2302
2376
  ranking_generation?: number;
2303
2377
  /** Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order. */
2304
2378
  ranking_as_of?: string;
2305
- /** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a sharp-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
2379
+ /** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/edge-hunter). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a sharp-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
2306
2380
  directional_source?: "live" | "degraded";
2307
- /** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a sharp-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
2381
+ /** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/edge-hunter). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a sharp-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
2308
2382
  ranking_source?: "live" | "db_only";
2309
2383
  /** Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage. */
2310
2384
  category_skill_source?: "live" | "partial" | "degraded" | "unavailable";
@@ -2314,7 +2388,7 @@ export type ResponseMeta = {
2314
2388
  category_skill_scope?: "observed_goldsky_primary_taker_fill";
2315
2389
  category_skill_source_coverage?: "partial_whale_threshold_fills" | "graded_wallet_fills";
2316
2390
  category_skill_observation_started_at?: string;
2317
- /** Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and sports-edge-signals uses the shorter degraded cache TTL. */
2391
+ /** Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and the ranked sports snapshot uses the shorter degraded cache TTL. */
2318
2392
  category_skill_model_operationally_degraded?: boolean;
2319
2393
  category_skill_status_counts?: {
2320
2394
  live: number;
@@ -2325,7 +2399,7 @@ export type ResponseMeta = {
2325
2399
  };
2326
2400
  /** SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Sports-edge-signals only. */
2327
2401
  category_skill_base_payload_hash?: string;
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. */
2402
+ /** Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Sports-edge-signals only. */
2329
2403
  category_skill_enriched_base_payload_hash?: string;
2330
2404
  };
2331
2405
  /** 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. */
@@ -2505,7 +2579,10 @@ export type Trader = {
2505
2579
  forecast_evidence?: number;
2506
2580
  rank?: number;
2507
2581
  pnl: {
2582
+ /** Polymarket's all-time leaderboard P&L in USD, from Polymarket's latest observation of this wallet on its all-time leaderboard (dated by the leaderboard_pnl data_quality group). Omitted when that leaderboard has no current observation ranking the wallet; 0xinsider requests one, and never serves an older stored figure in its place. Kept for provider parity and back-compat. Not the profile's Total P&L and not realized plus unrealized: it can differ from net_total by a wide margin. Read net_total for the figure the 0xinsider profile shows. */
2508
2583
  total?: number;
2584
+ /** The profile's Total P&L in USD: native Polymarket position P&L, with fees already included, plus credited maker and taker rebates (trader_trading_pnl.net_total_pnl). The same figure the 0xinsider profile, search, live feed, portfolio and watchlist show. Truncated toward zero to cents before conversion to a JSON number. Omitted when the wallet has no native accounting snapshot; pnl.total is never substituted. */
2585
+ net_total?: number;
2509
2586
  /** 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. */
2510
2587
  realized?: number;
2511
2588
  unrealized?: number;
@@ -2537,7 +2614,7 @@ export type Trader = {
2537
2614
  quant_metrics?: {
2538
2615
  /** Trader smart score on a 0..100 display scale; higher is stronger. Null when unavailable. */
2539
2616
  smart_score: number | null;
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. */
2617
+ /** 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 largest loss on one settled market exceeds 30% of the capital the wallet deployed across all its positions, -10 if edge is inconsistent; result clamped to 0-100. Higher means easier to follow. null when insufficient history. */
2541
2618
  copy_score: number | null;
2542
2619
  /** Sharpe ratio over the trailing 30 days (risk-adjusted return; higher is better). Magnitude can be large for small samples. null when insufficient history. */
2543
2620
  sharpe_30d: number | null;
@@ -2558,7 +2635,7 @@ export type Trader = {
2558
2635
  synced_at?: string;
2559
2636
  /** synced, unknown, or pending. */
2560
2637
  sync_status?: string;
2561
- /** Data age and coverage for this trader body. Always present. Its five groups are sync (traders.last_synced, covering pnl.total, pnl.realized, stats.markets_traded, stats.win_rate, stats.daily_win_rate, last_active, synced_at and sync_status), ranking (trader_rankings.computed_at, covering grade, score, streak_tier, forecast_score and forecast_evidence), leaderboard_rank (leaderboard_rank_refresh_state.completed_at, the completion time of the latest fully completed global rank refresh, covering rank), volume (trader_usd_volume.observed_at, covering stats.total_volume) and positions (trader_position_snapshots.last_refreshed_at with traders.last_synced as fallback, covering pnl.unrealized, the open-position aggregate). The positions clock is the latest successful /positions snapshot when one exists, otherwise the last completed trader sync; it does not date closed or native accounting values. A rank or position value remains unknown or unavailable when its clock or value is absent. For an unknown wallet every group is unavailable. If the open-position read itself fails, positions is unavailable with a reason that says so, pnl.unrealized is absent, and the body is answered fresh (meta.cached false) and is not kept for later callers. */
2638
+ /** Data age and coverage for this trader body. Always present. Its six groups are sync (traders.last_synced, covering pnl.net_total, pnl.realized, stats.markets_traded, stats.win_rate, stats.daily_win_rate, last_active, synced_at and sync_status), ranking (trader_rankings.computed_at, covering grade, score, streak_tier, forecast_score and forecast_evidence), leaderboard_rank (leaderboard_rank_refresh_state.completed_at, the completion time of the latest fully completed global rank refresh, covering rank), volume (trader_usd_volume.observed_at, covering stats.total_volume) and positions (trader_position_snapshots.last_refreshed_at with traders.last_synced as fallback, covering pnl.unrealized, the open-position aggregate) and leaderboard_pnl (trader_profile_provider_snapshots.observed_at, covering pnl.total: unavailable when Polymarket's all-time leaderboard has no current observation ranking the wallet). The positions clock is the latest successful /positions snapshot when one exists, otherwise the last completed trader sync; it does not date closed or native accounting values. A rank or position value remains unknown or unavailable when its clock or value is absent. For an unknown wallet every group is unavailable. If the open-position read itself fails, positions is unavailable with a reason that says so, pnl.unrealized is absent, and the body is answered fresh (meta.cached false) and is not kept for later callers. */
2562
2639
  data_quality: DataQuality;
2563
2640
  /** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
2564
2641
  trust?: TraderTrust;
@@ -2616,7 +2693,7 @@ export type TraderContext = {
2616
2693
  unrealized_mtm: number;
2617
2694
  /** Cost basis (USD) currently tied up in open positions. */
2618
2695
  cost_basis_locked: number;
2619
- /** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A resolved market that settled at exactly zero realized P&L (a void, a refund, a fully hedged position) is neither a win nor a loss and is not in the denominator, the same rule the leaderboard applies; null when no resolved market was decided. */
2696
+ /** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A resolved market that settled at exactly zero realized P&L (a void, a refund, a fully hedged position) is neither a win nor a loss and is not in the denominator, the same rule the leaderboard applies; null when no resolved market was decided. It is the rule of trader.stats.win_rate, read from the synced rows at request time; stats.win_rate is the stored figure the profile shows, refreshed by each sync and a few minutes after a closed-history write. context.md prints one Market win rate: this one when position_summary is present, else stats.win_rate. */
2620
2697
  resolved_win_rate: number | null;
2621
2698
  /** Resolved markets that settled at positive realized P&L: the win-rate numerator. Additive; null only on a summary cached before the field existed. */
2622
2699
  resolved_wins: number | null;
@@ -2627,7 +2704,7 @@ export type TraderContext = {
2627
2704
  };
2628
2705
  /** RFC3339 freshness of the OPEN-position-level data: when a position_summary is present this mirrors its as_of byte-for-byte (latest /positions snapshot, else last completed sync) -- the open-position freshness clock, since the snapshot advances only open positions; otherwise the trader's last completed sync, even if an unserved position snapshot exists. Null when the selected clock is unavailable; a missing breakdown does not establish position or accounting freshness. */
2629
2706
  data_as_of: string | null;
2630
- /** Human-readable statement of the point-in-time snapshot semantics (data_as_of is the open-position clock -- the latest /positions snapshot, else the last completed sync; the snapshot advances only open positions, so resolved counts and win rate date to the last full sync; native realized P&L follows its accounting snapshot -- not a live feed; re-fetch for fresher data). */
2707
+ /** Human-readable statement of the point-in-time snapshot semantics (data_as_of is the open-position clock -- the latest /positions snapshot, else the last completed sync; the snapshot advances only open positions, so resolved counts and win rate can include settled markets recorded after the last full sync; native realized P&L follows its accounting snapshot -- not a live feed; re-fetch for fresher data). */
2631
2708
  freshness_note: string;
2632
2709
  };
2633
2710
  export type TraderEsportsGameRecord = {
@@ -2787,7 +2864,7 @@ export type TraderGradeAt = {
2787
2864
  observed_at: string;
2788
2865
  /** Upper bound: a later snapshot confirmed the observation was committed. This is not an exact commit timestamp. */
2789
2866
  published_by: string;
2790
- /** Writer-proven model family, such as grading-v4. Null when unknown. */
2867
+ /** Writer-proven model family, such as grading. Null when unknown. */
2791
2868
  model_version: string | null;
2792
2869
  /** Exact writer build SHA when recorded. Null on old and non-model observations. */
2793
2870
  model_build_sha: string | null;
@@ -2828,6 +2905,7 @@ export type TraderPnl = {
2828
2905
  entries?: {
2829
2906
  date: string;
2830
2907
  markets_traded?: number;
2908
+ /** 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. */
2831
2909
  total_volume?: number;
2832
2910
  cumulative_profit?: number;
2833
2911
  total_pnl?: number;
@@ -2914,13 +2992,14 @@ export type TraderPnlExact = {
2914
2992
  };
2915
2993
  /** Lossless counterparts for trader statistics. The object is omitted when the verified provider observation is unavailable. */
2916
2994
  export type TraderStatsExact = {
2917
- /** Full-history both-sides Polymarket user-volume atom from the verified `trader_usd_volume` observation. */
2995
+ /** 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. */
2918
2996
  total_volume: ExactDecimal;
2919
2997
  };
2920
2998
  /** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
2921
2999
  export type TraderTrust = {
2922
3000
  total_pnl: TrustMetadata;
2923
3001
  realized_pnl: TrustMetadata;
3002
+ net_total_pnl: TrustMetadata;
2924
3003
  unrealized_pnl: TrustMetadata;
2925
3004
  markets_traded: TrustMetadata;
2926
3005
  win_rate: TrustMetadata;
@@ -2965,6 +3044,7 @@ export type TrendingWallet = {
2965
3044
  grade?: "S" | "A" | "B" | "C" | "D" | "F";
2966
3045
  /** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
2967
3046
  streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
3047
+ /** The wallet's all-time Total P&L in USD, the figure its 0xinsider profile shows: native Polymarket position P&L across all markets, fees included, plus credited maker and taker rebates (trader_trading_pnl.net_total_pnl). Context only: it does not affect the ranking, which follows trending_pnl_usd. Omitted when the wallet is not in the 0xinsider database or has no native accounting snapshot; the Polymarket leaderboard all-time figure is never substituted. */
2968
3048
  all_time_pnl_usd?: number;
2969
3049
  all_time_score?: number;
2970
3050
  last_synced?: string;
@@ -3035,7 +3115,7 @@ export type Usage = {
3035
3115
  monthly_quota: {
3036
3116
  /** Admitted requests so far this UTC calendar month. */
3037
3117
  used: number;
3038
- /** Requests Pro includes per UTC calendar month. */
3118
+ /** Requests the account's plan includes per UTC calendar month: 500,000 for Pro, 2,000,000 for Max. */
3039
3119
  limit: number;
3040
3120
  remaining: number;
3041
3121
  /** Unix seconds: the first instant of the next UTC calendar month. */
@@ -3046,7 +3126,7 @@ export type Usage = {
3046
3126
  binding: boolean;
3047
3127
  /** Pay as you go is on: requests over the quota keep answering and bill on a monthly invoice, up to ceiling. */
3048
3128
  pay_as_you_go: boolean;
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. */
3129
+ /** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or four times limit with pay as you go on (2,000,000 for Pro). null for an admin account, which no number stops. Additive since 2026-09-22. */
3050
3130
  ceiling: number | null;
3051
3131
  /** A historical usage price has not been reconciled to this plan allowance. Pay as you go remains unavailable until billing reconciliation. */
3052
3132
  unavailable_reason?: "usage_price_reconciliation_required" | null;
@@ -3421,8 +3501,11 @@ export interface OperationData {
3421
3501
  scopes: string[] | null;
3422
3502
  };
3423
3503
  getApiDiscovery: ApiDiscovery;
3504
+ getCombo: ComboDetail;
3505
+ getCombosSummary: CombosSummary;
3424
3506
  getCoverage: Platforms;
3425
3507
  getDailyReportSnapshot: ReportSnapshot;
3508
+ getEdgeHunter: EdgeHunterBoard;
3426
3509
  getEventReplaySince: EventReplayEvent[];
3427
3510
  getGame: Game;
3428
3511
  getHealth: {
@@ -3542,7 +3625,7 @@ export interface OperationData {
3542
3625
  monthly_quota: {
3543
3626
  /** Admitted requests so far this UTC calendar month. */
3544
3627
  used: number;
3545
- /** Requests Pro includes per UTC calendar month. */
3628
+ /** Requests the account's plan includes per UTC calendar month: 500,000 for Pro, 2,000,000 for Max. */
3546
3629
  limit: number;
3547
3630
  remaining: number;
3548
3631
  /** Unix seconds: the first instant of the next UTC calendar month. */
@@ -3553,7 +3636,7 @@ export interface OperationData {
3553
3636
  binding: boolean;
3554
3637
  /** Pay as you go is on: requests over the quota keep answering and bill on a monthly invoice, up to ceiling. */
3555
3638
  pay_as_you_go: boolean;
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. */
3639
+ /** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or four times limit with pay as you go on (2,000,000 for Pro). null for an admin account, which no number stops. Additive since 2026-09-22. */
3557
3640
  ceiling: number | null;
3558
3641
  /** A historical usage price has not been reconciled to this plan allowance. Pay as you go remains unavailable until billing reconciliation. */
3559
3642
  unavailable_reason?: "usage_price_reconciliation_required" | null;
@@ -3613,6 +3696,7 @@ export interface OperationData {
3613
3696
  filters: WhaleDatasetFilters;
3614
3697
  };
3615
3698
  getWhaleTrade: LargeTradeDetail;
3699
+ listComboFills: ComboFill[];
3616
3700
  listGames: Game[];
3617
3701
  listInsiderRadar: SuspiciousTrade[];
3618
3702
  listLargePositions: LargePosition[];
@@ -3622,12 +3706,8 @@ export interface OperationData {
3622
3706
  listLargeTrades: LargeTrade[];
3623
3707
  listLeaderboard: LeaderboardEntry[];
3624
3708
  listPositions: Position[];
3625
- listPreGameSideObservations: PreGameSideObservation[];
3626
- listPreGameSides: PreGameSide[];
3627
3709
  listSharpMoneyFlows: SmartMoneyFlowMarket[];
3628
3710
  listSmartMoneyFlows: SmartMoneyFlowMarket[];
3629
- listSportsEdgeObservations: PreGameSideObservation[];
3630
- listSportsEdgeSignals: PreGameSide[];
3631
3711
  listSuspiciousTrades: SuspiciousTrade[];
3632
3712
  listTrendingWallets: TrendingWallet[];
3633
3713
  listWebhookDeliveries: WebhookDelivery[];
@@ -3779,11 +3859,17 @@ export interface OperationQuery {
3779
3859
  };
3780
3860
  getAccountIdentity: Record<string, never>;
3781
3861
  getApiDiscovery: Record<string, never>;
3862
+ getCombo: Record<string, never>;
3863
+ getCombosSummary: Record<string, never>;
3782
3864
  getCoverage: Record<string, never>;
3783
3865
  getDailyReportSnapshot: {
3784
3866
  /** UTC report date in YYYY-MM-DD format, from 2024-03-01 (the first day report data covers) through tomorrow UTC. Any other date returns 400 bad_request with error.param=date. */
3785
3867
  date: string;
3786
3868
  };
3869
+ getEdgeHunter: {
3870
+ /** Kickoff window in hours from the snapshot anchor. Defaults to 48; integer values below 1 or above 48 are clamped to 1 or 48. */
3871
+ horizon_hours?: number;
3872
+ };
3787
3873
  getEventReplaySince: {
3788
3874
  /** Opaque event replay cursor returned as next_cursor by a prior response. The cursor maps to the global (whale_alerts.inserted_xid, whale_alerts.id) commit-order position, is valid across backend replicas, and is bound to the filter set the walk ran with (trader, condition_id, min_grade, min_size): presenting it under different filters answers 400 bad_request with error.reason cursor_expired, and the walk restarts without a cursor. Cursors issued before 2026-09-22 (id-only) stay accepted and are bound to no filters. Omit to fetch the latest durable public suffix. */
3789
3875
  cursor?: string;
@@ -3933,10 +4019,34 @@ export interface OperationQuery {
3933
4019
  };
3934
4020
  getWhaleDatasetStatus: Record<string, never>;
3935
4021
  getWhaleTrade: Record<string, never>;
4022
+ listComboFills: {
4023
+ /** CSV of pending, won, or lost; all clears the filter. Unknown results appear only in unfiltered lists. */
4024
+ result?: string;
4025
+ /** CSV of 2, 3, 4, or 5+; all clears the filter. A combo matches any named pick count. */
4026
+ legs?: string;
4027
+ /** Minimum collateral in whole USDC. */
4028
+ min_stake?: number;
4029
+ /** 0 disables the filter; otherwise use 2..1000000. Minimum shares per dollar at execution. */
4030
+ min_multiplier?: number;
4031
+ /** CSV of S, A, B, C, D, F; all clears the filter. Ungraded wallets do not match. */
4032
+ grades?: string;
4033
+ /** CSV of nfl, ncaaf, nba, wnba, baseball, hockey, soccer, tennis, table-tennis, esports, mma, boxing, golf, cricket, f1, pickleball; all clears the filter. Matches when any leg belongs to a selected sport. */
4034
+ sports?: string;
4035
+ /** Recent is newest first; largest ranks collateral; payout ranks buy-fill shares and excludes sells. */
4036
+ sort?: "recent" | "largest" | "payout";
4037
+ /** Defaults to all for recent and 24h for largest or payout. */
4038
+ window?: "24h" | "7d" | "all";
4039
+ /** Page size. Integer values outside the range are clamped to 1..200. */
4040
+ limit?: number;
4041
+ /** Exclusive block_number:log_index cursor for recent only; send the returned next_cursor unchanged. */
4042
+ cursor?: string;
4043
+ /** Offset for ranked largest or payout ordering; use returned next_offset. */
4044
+ offset?: number;
4045
+ };
3936
4046
  listGames: {
3937
4047
  /** Canonical sport bucket, case-insensitive, with - and _ read as a space: table-tennis and Table Tennis are the same bucket. Omit for every covered sport. A bucket this deployment does not serve returns an empty page. */
3938
4048
  sport?: string;
3939
- /** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2. Omit for every league inside the selected sports. */
4049
+ /** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2, euroleague. EuroLeague games use sport=Basketball and league=euroleague. Omit for every league inside the selected sports. */
3940
4050
  league?: string;
3941
4051
  /** Keep only games in this state. A value outside the enum returns an empty page. */
3942
4052
  status?: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
@@ -4060,7 +4170,7 @@ export interface OperationQuery {
4060
4170
  min_size?: number;
4061
4171
  /** Exact match against provider-backed market_canonical.category. */
4062
4172
  category?: string;
4063
- /** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id returns []. */
4173
+ /** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id or a resolved market returns []. */
4064
4174
  condition_id?: string;
4065
4175
  /** Scope to one wallet or a book of wallets (repeatable, up to 25 per request; comma-separated values inside one occurrence also work). Each value is a wallet address, a known username, or a trd_-prefixed trader id, resolved like /api/v1/trader/{address}. The response keeps the board's order and cursor, so pages of a book interleave wallets by current_value_usd. An address this API has never tracked returns its mirror rows or an empty list; a username or trader id that resolves to nothing is a 404 naming wallet; more than 25 values is a 400. min_size defaults to 0 when wallet is present. */
4066
4176
  wallet?: string[];
@@ -4071,28 +4181,6 @@ export interface OperationQuery {
4071
4181
  /** Filter by the binary outcome side. `yes` maps to outcome_index=0, `no` to outcome_index=1. */
4072
4182
  side?: "yes" | "no";
4073
4183
  };
4074
- listPreGameSideObservations: {
4075
- /** Observation cohort. wider_holder measures pre-game holder piles outside the funded route's exact raw signals admission. in_play admits only provider-confirmed live games and excludes stale or unavailable provider live-board, holder, or directional evidence. emerging_pile is a post-compute wider_holder projection for finite sharp_pct in [0.75, 0.85) with holder_scan_complete=true and a kickoff after its pinned projection cutoff; it overlaps wider_holder, is not an independent denominator, and is not arrival history. */
4076
- cohort: "wider_holder" | "in_play" | "emerging_pile";
4077
- /** Optional canonical sport bucket. Omitted or blank selects all registered sports. Raw provider categories resolve through the canonical taxonomy, including table-tennis or table tennis to Table Tennis and pickleball to Pickleball; a non-sport category returns an empty list. */
4078
- category?: string;
4079
- /** Page size. Out-of-range values are clamped to 1..100. */
4080
- limit?: number;
4081
- /** Server-authenticated opaque seo_v2_ cursor from next_cursor. Pins snapshot_as_of, cohort, rank, and condition_id; pre-deploy unsigned seo_ cursors are rejected, so clients must request the first page after this contract ships; emerging_pile cursors also pin the first-page projection_now cutoff so kickoff filtering cannot renumber continuation pages. Client edits fail closed; it cannot cross cohorts; a refreshed snapshot invalidates it with 400. */
4082
- cursor?: string;
4083
- };
4084
- listPreGameSides: {
4085
- /** Optional canonical sport bucket filter (e.g. Basketball, Tennis, Soccer). A raw provider value (NBA) resolves to its canonical bucket. A non-sport category returns an empty list. */
4086
- category?: string;
4087
- /** Page size. Out-of-range values are clamped to 1..100. */
4088
- limit?: number;
4089
- /** Opaque cursor from a previous response's next_cursor. Encodes the snapshot anchor plus the last row's directional_rank_score, conviction_score, smart_score and condition_id. A cursor from an expired snapshot returns 400. */
4090
- cursor?: string;
4091
- /** Kickoff ceiling in hours from now; the floor is now (only games not yet started). Clamped to 1..48. */
4092
- horizon_hours?: number;
4093
- /** Minimum trader grade required on the piled side. Only S, A, B are accepted (the piled-side grade distribution is S/A/B only; C, D, F return 400). Default B means at least one S/A/B holder is piled; S requires an S holder, A requires an S or A holder. */
4094
- min_grade?: "S" | "A" | "B";
4095
- };
4096
4184
  listSharpMoneyFlows: {
4097
4185
  /** Lookback window for grade-filtered whale flow aggregation. */
4098
4186
  timeframe?: "1h" | "4h" | "24h" | "7d";
@@ -4125,28 +4213,6 @@ export interface OperationQuery {
4125
4213
  /** Optional post-aggregate flow direction filter. */
4126
4214
  direction?: "YES" | "NO";
4127
4215
  };
4128
- listSportsEdgeObservations: {
4129
- /** Observation cohort. wider_holder measures pre-game holder piles outside the funded route's exact raw signals admission. in_play admits only provider-confirmed live games and excludes stale or unavailable provider live-board, holder, or directional evidence. emerging_pile is a post-compute wider_holder projection for finite sharp_pct in [0.75, 0.85) with holder_scan_complete=true and a kickoff after its pinned projection cutoff; it overlaps wider_holder, is not an independent denominator, and is not arrival history. */
4130
- cohort: "wider_holder" | "in_play" | "emerging_pile";
4131
- /** Optional canonical sport bucket. Omitted or blank selects all registered sports. Raw provider categories resolve through the canonical taxonomy, including table-tennis or table tennis to Table Tennis and pickleball to Pickleball; a non-sport category returns an empty list. */
4132
- category?: string;
4133
- /** Page size. Out-of-range values are clamped to 1..100. */
4134
- limit?: number;
4135
- /** Server-authenticated opaque seo_v2_ cursor from next_cursor. Pins snapshot_as_of, cohort, rank, and condition_id; pre-deploy unsigned seo_ cursors are rejected, so clients must request the first page after this contract ships; emerging_pile cursors also pin the first-page projection_now cutoff so kickoff filtering cannot renumber continuation pages. Client edits fail closed; it cannot cross cohorts; a refreshed snapshot invalidates it with 400. */
4136
- cursor?: string;
4137
- };
4138
- listSportsEdgeSignals: {
4139
- /** Optional canonical sport bucket filter (e.g. Basketball, Tennis, Soccer). A raw provider value (NBA) resolves to its canonical bucket. A non-sport category returns an empty list. */
4140
- category?: string;
4141
- /** Page size. Out-of-range values are clamped to 1..100. */
4142
- limit?: number;
4143
- /** Opaque cursor from a previous response's next_cursor. Encodes the snapshot anchor plus the last row's directional_rank_score, conviction_score, smart_score and condition_id. A cursor from an expired snapshot returns 400. */
4144
- cursor?: string;
4145
- /** Kickoff ceiling in hours from now; the floor is now (only games not yet started). Clamped to 1..48. */
4146
- horizon_hours?: number;
4147
- /** Minimum trader grade required on the piled side. Only S, A, B are accepted (the piled-side grade distribution is S/A/B only; C, D, F return 400). Default B means at least one S/A/B holder is piled; S requires an S holder, A requires an S or A holder. */
4148
- min_grade?: "S" | "A" | "B";
4149
- };
4150
4216
  listSuspiciousTrades: {
4151
4217
  /** Maximum number of suspicious trades to return. Out-of-range values are clamped to 1..100. */
4152
4218
  limit?: number;
@@ -4302,8 +4368,14 @@ export interface OperationPath {
4302
4368
  exploreMarkets: Record<string, never>;
4303
4369
  getAccountIdentity: Record<string, never>;
4304
4370
  getApiDiscovery: Record<string, never>;
4371
+ getCombo: {
4372
+ /** Combo identifier: 0x followed by 62 lowercase hex characters. This differs from a binary market condition ID. */
4373
+ condition_id: string;
4374
+ };
4375
+ getCombosSummary: Record<string, never>;
4305
4376
  getCoverage: Record<string, never>;
4306
4377
  getDailyReportSnapshot: Record<string, never>;
4378
+ getEdgeHunter: Record<string, never>;
4307
4379
  getEventReplaySince: Record<string, never>;
4308
4380
  getGame: {
4309
4381
  /** The game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively. */
@@ -4417,6 +4489,7 @@ export interface OperationPath {
4417
4489
  /** Raw whale_alerts.id or wt_-prefixed whale trade id. */
4418
4490
  id: string;
4419
4491
  };
4492
+ listComboFills: Record<string, never>;
4420
4493
  listGames: Record<string, never>;
4421
4494
  listInsiderRadar: Record<string, never>;
4422
4495
  listLargePositions: Record<string, never>;
@@ -4434,12 +4507,8 @@ export interface OperationPath {
4434
4507
  listLargeTrades: Record<string, never>;
4435
4508
  listLeaderboard: Record<string, never>;
4436
4509
  listPositions: Record<string, never>;
4437
- listPreGameSideObservations: Record<string, never>;
4438
- listPreGameSides: Record<string, never>;
4439
4510
  listSharpMoneyFlows: Record<string, never>;
4440
4511
  listSmartMoneyFlows: Record<string, never>;
4441
- listSportsEdgeObservations: Record<string, never>;
4442
- listSportsEdgeSignals: Record<string, never>;
4443
4512
  listSuspiciousTrades: Record<string, never>;
4444
4513
  listTrendingWallets: Record<string, never>;
4445
4514
  listWebhookDeliveries: {
@@ -4534,8 +4603,11 @@ export interface OperationBody {
4534
4603
  exploreMarkets: never;
4535
4604
  getAccountIdentity: never;
4536
4605
  getApiDiscovery: never;
4606
+ getCombo: never;
4607
+ getCombosSummary: never;
4537
4608
  getCoverage: never;
4538
4609
  getDailyReportSnapshot: never;
4610
+ getEdgeHunter: never;
4539
4611
  getEventReplaySince: never;
4540
4612
  getGame: never;
4541
4613
  getHealth: never;
@@ -4572,6 +4644,7 @@ export interface OperationBody {
4572
4644
  getWeeklyReportSnapshot: never;
4573
4645
  getWhaleDatasetStatus: never;
4574
4646
  getWhaleTrade: never;
4647
+ listComboFills: never;
4575
4648
  listGames: never;
4576
4649
  listInsiderRadar: never;
4577
4650
  listLargePositions: never;
@@ -4581,12 +4654,8 @@ export interface OperationBody {
4581
4654
  listLargeTrades: never;
4582
4655
  listLeaderboard: never;
4583
4656
  listPositions: never;
4584
- listPreGameSideObservations: never;
4585
- listPreGameSides: never;
4586
4657
  listSharpMoneyFlows: never;
4587
4658
  listSmartMoneyFlows: never;
4588
- listSportsEdgeObservations: never;
4589
- listSportsEdgeSignals: never;
4590
4659
  listSuspiciousTrades: never;
4591
4660
  listTrendingWallets: never;
4592
4661
  listWebhookDeliveries: never;
@@ -4687,6 +4756,8 @@ export interface OperationResponse {
4687
4756
  data: OperationData["getApiDiscovery"];
4688
4757
  meta: ResponseMeta;
4689
4758
  };
4759
+ getCombo: ComboResponse;
4760
+ getCombosSummary: CombosSummaryResponse;
4690
4761
  getCoverage: {
4691
4762
  object: "platforms";
4692
4763
  data: OperationData["getCoverage"];
@@ -4697,6 +4768,11 @@ export interface OperationResponse {
4697
4768
  data: OperationData["getDailyReportSnapshot"];
4698
4769
  meta: ResponseMeta;
4699
4770
  };
4771
+ getEdgeHunter: {
4772
+ object: "edge_hunter";
4773
+ data: OperationData["getEdgeHunter"];
4774
+ meta: ResponseMeta;
4775
+ };
4700
4776
  getEventReplaySince: {
4701
4777
  object: "event_replay";
4702
4778
  data: OperationData["getEventReplaySince"];
@@ -4873,6 +4949,7 @@ export interface OperationResponse {
4873
4949
  data: OperationData["getWhaleTrade"];
4874
4950
  meta: ResponseMeta;
4875
4951
  };
4952
+ listComboFills: ComboFillsResponse;
4876
4953
  listGames: {
4877
4954
  object: "list";
4878
4955
  data: OperationData["listGames"];
@@ -4961,27 +5038,6 @@ export interface OperationResponse {
4961
5038
  };
4962
5039
  meta: ResponseMeta;
4963
5040
  };
4964
- listPreGameSideObservations: {
4965
- object: "list";
4966
- data: OperationData["listPreGameSideObservations"];
4967
- has_more: boolean;
4968
- /** Pass as cursor for the next page. Always sent; null on the last page. */
4969
- next_cursor: string | null;
4970
- /** Completion time of the shared observation snapshot pinned by the cursor. */
4971
- snapshot_as_of: string;
4972
- /** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Intentional bounded capacity_limited rows remain fully accounted in the funnel and do not by themselves set this field. */
4973
- degraded: boolean;
4974
- funnel: PreGameSideFunnelReport;
4975
- meta: ResponseMeta;
4976
- };
4977
- listPreGameSides: {
4978
- object: "list";
4979
- data: OperationData["listPreGameSides"];
4980
- has_more: boolean;
4981
- next_cursor?: string;
4982
- total?: number;
4983
- meta: ResponseMeta;
4984
- };
4985
5041
  listSharpMoneyFlows: {
4986
5042
  object: "list";
4987
5043
  data: OperationData["listSharpMoneyFlows"];
@@ -4998,27 +5054,6 @@ export interface OperationResponse {
4998
5054
  total?: number;
4999
5055
  meta: ResponseMeta;
5000
5056
  };
5001
- listSportsEdgeObservations: {
5002
- object: "list";
5003
- data: OperationData["listSportsEdgeObservations"];
5004
- has_more: boolean;
5005
- /** Pass as cursor for the next page. Always sent; null on the last page. */
5006
- next_cursor: string | null;
5007
- /** Completion time of the shared observation snapshot pinned by the cursor. */
5008
- snapshot_as_of: string;
5009
- /** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Intentional bounded capacity_limited rows remain fully accounted in the funnel and do not by themselves set this field. */
5010
- degraded: boolean;
5011
- funnel: PreGameSideFunnelReport;
5012
- meta: ResponseMeta;
5013
- };
5014
- listSportsEdgeSignals: {
5015
- object: "list";
5016
- data: OperationData["listSportsEdgeSignals"];
5017
- has_more: boolean;
5018
- next_cursor?: string;
5019
- total?: number;
5020
- meta: ResponseMeta;
5021
- };
5022
5057
  listSuspiciousTrades: {
5023
5058
  object: "list";
5024
5059
  data: OperationData["listSuspiciousTrades"];