@0xinsider/mcp 2.1.3 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -19
- package/dist/catalog.generated.d.ts +46 -10
- package/dist/catalog.generated.d.ts.map +1 -1
- package/dist/catalog.generated.js +55 -10
- package/dist/catalog.generated.js.map +1 -1
- package/dist/cli-lib.d.ts +7 -0
- package/dist/cli-lib.d.ts.map +1 -1
- package/dist/cli-lib.js +83 -17
- package/dist/cli-lib.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/product-cli/index.d.ts.map +1 -1
- package/dist/product-cli/index.js +3 -1
- package/dist/product-cli/index.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +38 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/sdk/client.d.ts +242 -21
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +371 -16
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/errors.d.ts +21 -1
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +46 -1
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +35 -5
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +2 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/pagination.d.ts +7 -7
- package/dist/sdk/pagination.d.ts.map +1 -1
- package/dist/sdk/pagination.js.map +1 -1
- package/dist/sdk/schema.d.ts +1164 -314
- package/dist/sdk/schema.d.ts.map +1 -1
- package/dist/sdk/stream.d.ts +12 -7
- package/dist/sdk/stream.d.ts.map +1 -1
- package/dist/sdk/stream.js +82 -3
- package/dist/sdk/stream.js.map +1 -1
- package/dist/sdk/webhooks.d.ts +148 -12
- package/dist/sdk/webhooks.d.ts.map +1 -1
- package/dist/sdk/webhooks.js +25 -6
- package/dist/sdk/webhooks.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/games.d.ts +5 -0
- package/dist/tools/games.d.ts.map +1 -0
- package/dist/tools/games.js +103 -0
- package/dist/tools/games.js.map +1 -0
- package/dist/tools/get-insider-radar.d.ts.map +1 -1
- package/dist/tools/get-insider-radar.js +10 -32
- package/dist/tools/get-insider-radar.js.map +1 -1
- package/dist/tools/get-leaderboard.d.ts.map +1 -1
- package/dist/tools/get-leaderboard.js +20 -2
- package/dist/tools/get-leaderboard.js.map +1 -1
- package/dist/tools/get-market-intel.js +2 -2
- package/dist/tools/get-market-intel.js.map +1 -1
- package/dist/tools/get-suspicious-trades.d.ts +26 -0
- package/dist/tools/get-suspicious-trades.d.ts.map +1 -0
- package/dist/tools/get-suspicious-trades.js +91 -0
- package/dist/tools/get-suspicious-trades.js.map +1 -0
- package/dist/tools/get-whale-trades.d.ts +2 -0
- package/dist/tools/get-whale-trades.d.ts.map +1 -1
- package/dist/tools/get-whale-trades.js +18 -6
- package/dist/tools/get-whale-trades.js.map +1 -1
- package/dist/tools/pick-of-the-day.js +1 -1
- package/dist/tools/read-parity.d.ts +9 -1
- package/dist/tools/read-parity.d.ts.map +1 -1
- package/dist/tools/read-parity.js +109 -50
- package/dist/tools/read-parity.js.map +1 -1
- package/package.json +1 -1
package/dist/sdk/schema.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export type AgentRegistration = {
|
|
|
25
25
|
environment: "sandbox";
|
|
26
26
|
created_at: string;
|
|
27
27
|
sandbox: {
|
|
28
|
-
/** The sandbox V1 base URL. Every documented operation answers here with example data. */
|
|
28
|
+
/** The sandbox V1 base URL. Every documented operation answers here with example data, except GET /api/v1/stream: a Server-Sent Events stream is a live connection rather than a body, so the sandbox answers it with 400. */
|
|
29
29
|
api_base_url: string;
|
|
30
30
|
/** A read to send with the key. */
|
|
31
31
|
first_request_url: string;
|
|
@@ -76,7 +76,7 @@ export type ApiError = {
|
|
|
76
76
|
/** The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response. */
|
|
77
77
|
retry_at?: string;
|
|
78
78
|
/** 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. */
|
|
79
|
-
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";
|
|
79
|
+
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";
|
|
80
80
|
};
|
|
81
81
|
meta: ResponseMeta;
|
|
82
82
|
};
|
|
@@ -89,7 +89,7 @@ export type ApiErrorBody = {
|
|
|
89
89
|
/** The recommended next retry instant (RFC3339). Present on every retryable error (reason=pick_not_released, code=rate_limited including reason=monthly_quota_exceeded, code=rate_limit_unavailable, reason=read_model_warming) and omitted otherwise. Always in the future. For pick_not_released: before the 11:00 UTC operating-window start, before a selected pick's stored release, or after a skipped day, it names the automatic system's next boundary. While no candidate exists in the live window it normally names the persisted next automatic selector attempt. Every value is advisory under supported operator actions: manual publication, release-time override, or admin generation can make a pick available first. 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
90
|
retry_at?: string;
|
|
91
91
|
/** 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. */
|
|
92
|
-
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";
|
|
92
|
+
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";
|
|
93
93
|
};
|
|
94
94
|
export type BatchMarketIntelItem = {
|
|
95
95
|
/** Zero-based request index. Duplicate inputs keep separate result rows. */
|
|
@@ -251,6 +251,28 @@ export type CreateWebhookRequest = {
|
|
|
251
251
|
url: string;
|
|
252
252
|
event_types: WebhookEventType[];
|
|
253
253
|
};
|
|
254
|
+
/** Compact data age and coverage for a response body, always present on the operations that publish it. Read status and as_of to decide whether to use the body at all, and field_groups to see which part is weak. Everything here comes from stored observation clocks, so a cached body reports the same ages a freshly computed one does: meta.cached and meta.cache_age_s stay the only transport-time facts and neither makes this block newer. The per-field audit object is still available through expand=trust; this is the default summary of the same question. */
|
|
255
|
+
export type DataQuality = {
|
|
256
|
+
/** fresh when every group is fresh, unavailable when every group is unavailable, and partial in every other case. */
|
|
257
|
+
status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
258
|
+
/** The oldest as_of among the groups that carry one: the age of the weakest clock this body rests on. Omitted when no group carries a clock. */
|
|
259
|
+
as_of?: string;
|
|
260
|
+
/** One entry per field group. Entries may be added in later releases, so match on group rather than on position or length. */
|
|
261
|
+
field_groups: DataQualityGroup[];
|
|
262
|
+
};
|
|
263
|
+
/** One group of response fields that share a writer and therefore share a clock. */
|
|
264
|
+
export type DataQualityGroup = {
|
|
265
|
+
/** Stable snake_case group name. Names are additive across releases, so match on the ones you know and ignore the rest. */
|
|
266
|
+
group: string;
|
|
267
|
+
/** The table and column that write this group, named so the verdict can be audited (for example trader_rankings.computed_at). */
|
|
268
|
+
owner: string;
|
|
269
|
+
/** fresh: served, and as_of carries this group's real observation or computation clock. partial: some of the group's fields are served and some are missing. unknown: served, and this read has no clock for it, so no age may be inferred. untracked: 0xinsider does not track this group for this subject, by design. unavailable: the group could not be served. New values may be added; treat one you do not recognize as unknown. fresh means the group is tracked and clocked, not that it is inside any particular tolerance: compare as_of against your own. */
|
|
270
|
+
status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
271
|
+
/** When this group's values were observed or computed. Omitted whenever the read cannot measure it, and never filled with the serialization time, the cache time, or another group's clock. */
|
|
272
|
+
as_of?: string;
|
|
273
|
+
/** Why the status is not fresh. Omitted when it is. */
|
|
274
|
+
reason?: string;
|
|
275
|
+
};
|
|
254
276
|
export type EventReplayEvent = {
|
|
255
277
|
/** Opaque event identity: the ef_-encoded whale_alerts.id, stable across cursor formats. Deduplicate on this, never on cursor or sequence. */
|
|
256
278
|
id: string;
|
|
@@ -273,8 +295,8 @@ export type EventReplayEvent = {
|
|
|
273
295
|
/** Provider discriminator. Polymarket only. */
|
|
274
296
|
platform: "polymarket";
|
|
275
297
|
};
|
|
276
|
-
/** Present only with expand=trade: the
|
|
277
|
-
trade?:
|
|
298
|
+
/** Present only with expand=trade: the base trade fields for this row, read at request time from one query per page. GET /api/v1/large-trades/{id} adds counterparty_analysis; replay does not include it. traded_at, side, size_usd, price, outcome, token_id, recorded_signal_score and trader.grade_at_trade with its status are the row's event-time facts; trader.grade, trader.username, signal_score, suspicion_score, suspicion_track and market title/slug/category are enrichment that can move after the event. null when that route would answer 404 for the row (its trader or market is not synced yet). */
|
|
299
|
+
trade?: LargeTrade | null;
|
|
278
300
|
source: EventReplaySource;
|
|
279
301
|
freshness: EventReplayFreshness;
|
|
280
302
|
};
|
|
@@ -331,6 +353,17 @@ export type EventReplaySource = {
|
|
|
331
353
|
owner: "whale_alerts";
|
|
332
354
|
provider_fetch_at_request_time: false;
|
|
333
355
|
};
|
|
356
|
+
/** A lossless decimal atom rendered from the canonical NUMERIC or provider value. The value is a decimal string and must be parsed with a decimal library; it is never a display string and must not be converted through a binary float. `scale` is the source decimal scale. The field is omitted when its source is unavailable. */
|
|
357
|
+
export type ExactDecimal = {
|
|
358
|
+
/** Plain decimal text at full source precision, including a minus sign for negative values and trailing zeros when the source scale carries them. Parse as an arbitrary-precision decimal. */
|
|
359
|
+
value: string;
|
|
360
|
+
/** Unit of the value, such as `USD`, `USD/share`, or `shares`. */
|
|
361
|
+
unit: string;
|
|
362
|
+
/** Number of digits after the decimal point in `value`'s source atom. */
|
|
363
|
+
scale: number;
|
|
364
|
+
/** Backend-owned source or derivation basis. Treat it as provenance, not as a display label. */
|
|
365
|
+
basis: string;
|
|
366
|
+
};
|
|
334
367
|
export type ExploreEntry = ExploreGroup | ExploreStandalone;
|
|
335
368
|
export type ExploreFacets = {
|
|
336
369
|
categories: ExploreFacetValue[];
|
|
@@ -351,6 +384,8 @@ export type ExploreGroup = {
|
|
|
351
384
|
/** 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. */
|
|
352
385
|
markets: ExploreMarket[];
|
|
353
386
|
rep_volume: number | null;
|
|
387
|
+
/** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value. */
|
|
388
|
+
rep_large_trades: number | null;
|
|
354
389
|
rep_whales: number | null;
|
|
355
390
|
};
|
|
356
391
|
export type ExploreMarket = {
|
|
@@ -369,9 +404,17 @@ export type ExploreMarket = {
|
|
|
369
404
|
status: "active" | "closed";
|
|
370
405
|
volume: number | null;
|
|
371
406
|
liquidity: number | null;
|
|
407
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
408
|
+
large_trade_count: number | null;
|
|
372
409
|
whale_trade_count: number | null;
|
|
410
|
+
/** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value. */
|
|
411
|
+
large_trade_distinct_wallets: number | null;
|
|
373
412
|
whale_distinct_wallets: number | null;
|
|
413
|
+
/** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value. */
|
|
414
|
+
large_trade_total_usd: number | null;
|
|
374
415
|
whale_total_usd: number | null;
|
|
416
|
+
/** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value. */
|
|
417
|
+
large_trade_last_at: string | null;
|
|
375
418
|
whale_last_trade_at: string | null;
|
|
376
419
|
end_date: string | null;
|
|
377
420
|
created_at: string | null;
|
|
@@ -405,9 +448,17 @@ export type ExploreMarket = {
|
|
|
405
448
|
discover_score: number | null;
|
|
406
449
|
score_components?: {
|
|
407
450
|
volume_signal: number | null;
|
|
451
|
+
/** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
452
|
+
large_trade_signal: number | null;
|
|
408
453
|
whale_signal: number | null;
|
|
409
454
|
liquidity_signal: number | null;
|
|
410
455
|
recency_signal: number | null;
|
|
456
|
+
/** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
457
|
+
sharp_money_signal: number | null;
|
|
458
|
+
/**
|
|
459
|
+
* Deprecated spelling of sharp_money_signal; emitted beside it with the same value and never removed.
|
|
460
|
+
* @deprecated
|
|
461
|
+
*/
|
|
411
462
|
smart_money_signal: number | null;
|
|
412
463
|
price_move_signal: number | null;
|
|
413
464
|
missing_price_penalty: number;
|
|
@@ -446,6 +497,125 @@ export type ExportVolumeReconciliation = {
|
|
|
446
497
|
provider_activity_volume_gap: number | null;
|
|
447
498
|
activity_volume_coverage: number | null;
|
|
448
499
|
};
|
|
500
|
+
/** One sports or esports game: both sides, its schedule, its provider status and the Polymarket markets linked to it. Assembled from the same provider-first live and upcoming projections the site's boards use, with no request-time provider fan-out. */
|
|
501
|
+
export type Game = {
|
|
502
|
+
object: "game";
|
|
503
|
+
/** The game's identity, for example mlb-mil-cin-2026-06-22. The same key the live_sports_updated webhook pulse carries and the same key /api/v1/games/{event_slug} takes. */
|
|
504
|
+
event_slug: string;
|
|
505
|
+
/** The provider's Gamma gameId, as a string. Omitted when the canonical owner has no single value for this slug: the provider stamps one gameId across an event's derivative siblings, so an ambiguous read is reported as unknown rather than guessed. */
|
|
506
|
+
game_id?: string;
|
|
507
|
+
/** The canonical sport bucket, for example Soccer or Table Tennis. Omitted when neither the board scope nor the provider category names one. */
|
|
508
|
+
sport?: string;
|
|
509
|
+
/** The league tag, for example nfl or epl. Omitted for a sport served as one whole bucket with no league scope. */
|
|
510
|
+
league?: string;
|
|
511
|
+
/** The provider's event title. Omitted when the provider sent none. */
|
|
512
|
+
title?: string;
|
|
513
|
+
/** Kickoff in UTC, as the provider supplied it. Omitted when the provider published none; coverage.schedule then reads unavailable. */
|
|
514
|
+
scheduled_at?: string;
|
|
515
|
+
status: GameStatus;
|
|
516
|
+
/** Both sides, in the provider's own order. For a team league the provider lists the home side first. Empty when the provider identified neither side. */
|
|
517
|
+
competitors: GameCompetitor[];
|
|
518
|
+
/** The esports series length, for example Bo3. Omitted for everything else. */
|
|
519
|
+
series_format?: string;
|
|
520
|
+
/** Whether one of this game's markets pays on a draw. Read this instead of assuming a two-outcome moneyline. */
|
|
521
|
+
draw_offered: boolean;
|
|
522
|
+
/** Every market this read linked to the game, ordered by condition_id. */
|
|
523
|
+
markets: GameMarket[];
|
|
524
|
+
freshness: GameFreshness;
|
|
525
|
+
coverage: GameCoverage;
|
|
526
|
+
/** The game's page on 0xinsider. */
|
|
527
|
+
url: string;
|
|
528
|
+
};
|
|
529
|
+
/** One side of the game. */
|
|
530
|
+
export type GameCompetitor = {
|
|
531
|
+
/** The competitor's name as the provider gives it. */
|
|
532
|
+
name: string;
|
|
533
|
+
/** The provider's league-scoped competitor id, as a string. Omitted when the provider has not identified this side; coverage.competitors then reads labels. */
|
|
534
|
+
provider_id?: string;
|
|
535
|
+
/** Provider crest or logo URL. Omitted when there is none. */
|
|
536
|
+
logo?: string;
|
|
537
|
+
/** The provider's score for this side, verbatim. A string because the provider sends one: a set score, a map score and a run total are not all integers. Omitted when no live-score frame carries a score. */
|
|
538
|
+
score?: string;
|
|
539
|
+
/** The provider's season record for this side, for example 12-4. Omitted when the provider sent none. */
|
|
540
|
+
record?: string;
|
|
541
|
+
};
|
|
542
|
+
/** What this game's read actually supplied, so a client branches on coverage instead of on a missing key. */
|
|
543
|
+
export type GameCoverage = {
|
|
544
|
+
/** available when a live-score frame supplied this game's scores. */
|
|
545
|
+
scores: "available" | "unavailable";
|
|
546
|
+
/** provider_ids when every side carries a provider id, labels when only the provider's names identify them, unavailable when neither exists. Do not join on names when this reads labels. */
|
|
547
|
+
competitors: "provider_ids" | "labels" | "unavailable";
|
|
548
|
+
/** available when the provider supplied a kickoff. */
|
|
549
|
+
schedule: "available" | "unavailable";
|
|
550
|
+
};
|
|
551
|
+
/** How current this game's facts are. Independent per source: the board half that produced the game, and the live-score frame that produced its scores. */
|
|
552
|
+
export type GameFreshness = {
|
|
553
|
+
/** Which board half produced this game. */
|
|
554
|
+
source: "live" | "upcoming";
|
|
555
|
+
/** Whether that half returned a truthful source body for this read. */
|
|
556
|
+
source_status: "ok" | "unavailable";
|
|
557
|
+
/** Whether that half had a source body at all. not_applicable means the sport has no configured source for that half. */
|
|
558
|
+
source_availability: "available" | "unavailable" | "not_applicable";
|
|
559
|
+
/** Freshness of the cached source body, never inferred from the response clock or the row count. */
|
|
560
|
+
source_freshness: "fresh" | "stale" | "unknown" | "not_applicable";
|
|
561
|
+
/** The source body's data vintage. Omitted when the read has no vintage anchor, which is not age zero. */
|
|
562
|
+
source_observed_at?: string;
|
|
563
|
+
/** Age of source_observed_at in seconds, capped at 600. Omitted past the cap or with no anchor. */
|
|
564
|
+
source_age_seconds?: number;
|
|
565
|
+
/** Whether a reader should be told these rows are behind. This applies the half's own servable-age bar (15 s live, 120 s upcoming), which is not the same as source_freshness: a live board whose scores are seconds old reads stale for about half of every publish cycle and is not delayed. */
|
|
566
|
+
delayed: boolean;
|
|
567
|
+
/** When this game's live-score frame was observed. Omitted when there is no frame. */
|
|
568
|
+
scores_observed_at?: string;
|
|
569
|
+
/** The provider's own frame clock. Omitted when the frame carries none. */
|
|
570
|
+
scores_source_at?: string;
|
|
571
|
+
};
|
|
572
|
+
/** One Polymarket market linked to this game. */
|
|
573
|
+
export type GameMarket = {
|
|
574
|
+
/** The mkt_-prefixed market id every other V1 response uses. */
|
|
575
|
+
id: string;
|
|
576
|
+
/** The raw provider condition id. */
|
|
577
|
+
condition_id: string;
|
|
578
|
+
/** Always polymarket. */
|
|
579
|
+
platform: string;
|
|
580
|
+
/** The provider's market slug. Omitted when the provider sent none. */
|
|
581
|
+
slug?: string;
|
|
582
|
+
/** The provider's own market type, for example moneyline or spread. Omitted when the provider sent none. Not an enum: the provider owns this vocabulary and adds to it. */
|
|
583
|
+
sports_market_type?: string;
|
|
584
|
+
/** Which side of the game this market's YES leg pays. draw is a real value: a 1X2 market's third leg is not a competitor. Omitted when the provider ids do not classify the leg, which is not the same as other. */
|
|
585
|
+
side?: "home" | "away" | "draw" | "other";
|
|
586
|
+
/** The provider's label for the YES outcome. Omitted when the provider sent none. */
|
|
587
|
+
outcome_yes?: string;
|
|
588
|
+
/** The provider's label for the NO outcome. Omitted when the provider sent none. */
|
|
589
|
+
outcome_no?: string;
|
|
590
|
+
/** Polymarket CLOB token ids in the provider's own outcome-index order. Omitted when the provider has published none for this market. */
|
|
591
|
+
outcome_token_ids?: string[];
|
|
592
|
+
};
|
|
593
|
+
/** What this deployment covers, published with every page so a client never has to guess whether an empty list means no games or no coverage. */
|
|
594
|
+
export type GamesCoverage = {
|
|
595
|
+
/** Canonical sport buckets served, sorted. */
|
|
596
|
+
sports: string[];
|
|
597
|
+
/** League tags served, sorted. */
|
|
598
|
+
leagues: string[];
|
|
599
|
+
/** Scopes whose source half was unavailable for this read, as <sport>:<half>. Empty means every scope answered. */
|
|
600
|
+
sources_unavailable: string[];
|
|
601
|
+
};
|
|
602
|
+
/** Where the game is in its own life, as the provider reports it. A postponement, a cancellation and a suspension each keep their own state, so a client can tell a game that will be played later from one that never will be. */
|
|
603
|
+
export type GameStatus = {
|
|
604
|
+
/** scheduled: kickoff is ahead or the provider still calls it scheduled. live: the provider reports it in play. paused: halftime or a provider-reported break. ended: the provider reported a final, an award or a forfeit. postponed, cancelled, suspended, delayed: the provider's own verdict, kept distinct. unknown: no provider state reached this read. A kickoff in the past is never read as live on its own. */
|
|
605
|
+
state: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
606
|
+
/** The provider status folded onto one vocabulary across leagues. unknown means the provider sent a value this API has no meaning for; provider_status keeps that value verbatim. Omitted when no live-score frame carries a status. */
|
|
607
|
+
match_status?: "scheduled" | "in_progress" | "halftime" | "penalty_shootout" | "delayed" | "suspended" | "final" | "final_overtime" | "final_shootout" | "awarded" | "forfeit" | "not_necessary" | "postponed" | "cancelled" | "unknown";
|
|
608
|
+
/** The provider's status string, verbatim. Omitted when the provider sent none. */
|
|
609
|
+
provider_status?: string;
|
|
610
|
+
/** The provider's period label, for example Q3, End Q2 or T5. Omitted when the provider sent none. */
|
|
611
|
+
period?: string;
|
|
612
|
+
/** The game clock as the provider spells it, never reformatted. Omitted when the provider sent none. */
|
|
613
|
+
clock?: string;
|
|
614
|
+
/** The provider's own in-play flag. Omitted when no live-score frame exists, which is not the same as false. */
|
|
615
|
+
live?: boolean;
|
|
616
|
+
/** Whether the game is over. Always present. */
|
|
617
|
+
ended: boolean;
|
|
618
|
+
};
|
|
449
619
|
/** Current category evidence, independent of the global grade. Pick of the Day stamps only the served display roster; frozen entry snapshots remain unchanged. */
|
|
450
620
|
export type HolderCategoryEvidence = {
|
|
451
621
|
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
@@ -455,18 +625,20 @@ export type HolderCategoryEvidence = {
|
|
|
455
625
|
export type LargeExportPolicy = {
|
|
456
626
|
mode: "v1_async_export";
|
|
457
627
|
current_internal_route: string;
|
|
458
|
-
/** Programmatic API-key-gated export routes (submit/status/download) and supported formats (json, ndjson, csv). */
|
|
628
|
+
/** Programmatic API-key-gated export routes (submit/status/download/cancel) and supported formats (json, ndjson, csv). */
|
|
459
629
|
v1_async: {
|
|
460
|
-
/** POST route template to submit an export job. */
|
|
630
|
+
/** POST route template to submit an export job. fresh=true asks for a snapshot read after the submit instead of reusing a finished one. */
|
|
461
631
|
submit_route?: string;
|
|
462
632
|
/** GET route template to poll job status. */
|
|
463
633
|
status_route?: string;
|
|
464
634
|
/** GET route template that 302-redirects to the file. */
|
|
465
635
|
download_route?: string;
|
|
636
|
+
/** POST route template to cancel a queued or running job. */
|
|
637
|
+
cancel_route?: string;
|
|
466
638
|
/** Supported ?format= values. */
|
|
467
639
|
formats?: ("json" | "ndjson" | "csv")[];
|
|
468
640
|
/** Possible job status values. */
|
|
469
|
-
status_values?: ("queued" | "running" | "ready" | "failed")[];
|
|
641
|
+
status_values?: ("queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled")[];
|
|
470
642
|
/** How long a finished export is retained before expiry. */
|
|
471
643
|
retention?: string;
|
|
472
644
|
};
|
|
@@ -545,6 +717,77 @@ export type LargePosition = {
|
|
|
545
717
|
category?: string;
|
|
546
718
|
};
|
|
547
719
|
};
|
|
720
|
+
export type LargeTrade = {
|
|
721
|
+
/** Prefixed ID (wt_...). */
|
|
722
|
+
id: string;
|
|
723
|
+
traded_at: string;
|
|
724
|
+
size_usd: number;
|
|
725
|
+
side: "BUY" | "SELL";
|
|
726
|
+
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, whose stored outcome_index is not trusted (a defaulted 0 for about a third of those rows; the side is unknown, not defaulted). */
|
|
727
|
+
outcome: string | null;
|
|
728
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
|
|
729
|
+
token_id: string | null;
|
|
730
|
+
price: number;
|
|
731
|
+
/** Current 0.0–1.0 review score, computed at request time from the trade's size, the trader's win rate today, a bonus when a trader with a win rate above 55% trades at a price below 30¢, and the trade's age now. A higher score means read this trade first; it does not measure edge or predict an outcome. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_review_score for that. Canonical since #16311; signal_score carries the same value. */
|
|
732
|
+
review_score: number;
|
|
733
|
+
/**
|
|
734
|
+
* Current 0.0–1.0 review score, computed at request time from the trader's win rate today and the trade's age now. Deprecated (#16311): `review_score` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
735
|
+
* @deprecated
|
|
736
|
+
*/
|
|
737
|
+
signal_score: number;
|
|
738
|
+
/** 0.0–1.0 review score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. Canonical since #16311; recorded_signal_score carries the same value. */
|
|
739
|
+
recorded_review_score: number | null;
|
|
740
|
+
/**
|
|
741
|
+
* 0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
742
|
+
* @deprecated
|
|
743
|
+
*/
|
|
744
|
+
recorded_signal_score: number | null;
|
|
745
|
+
/** Persisted live suspicion score from the scorer. Null when the row has no persisted score. */
|
|
746
|
+
suspicion_score: number | null;
|
|
747
|
+
/** Persisted scorer track. Null when a legacy row has no stored track label. */
|
|
748
|
+
suspicion_track: "whale" | "fresh_conviction" | "sliced_position" | null;
|
|
749
|
+
/** 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. */
|
|
750
|
+
market_volume_share?: number;
|
|
751
|
+
trader: {
|
|
752
|
+
id: string;
|
|
753
|
+
address: string;
|
|
754
|
+
username?: string;
|
|
755
|
+
/** The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade. */
|
|
756
|
+
grade?: string;
|
|
757
|
+
/** The grade the trader held when the trade happened, from recorded grade history (recorded from 2026-09-19T23:00Z). Null unless grade_at_trade_status is graded. Never today's grade projected backward. */
|
|
758
|
+
grade_at_trade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
759
|
+
/** graded: grade_at_trade holds the recorded grade. ungraded: the trader was recorded without a grade at that moment. unknown: no record covers the moment, which is every trade before 2026-09-19T23:00Z and a trade that fell between a grade change and its confirmation. unknown never means ungraded. */
|
|
760
|
+
grade_at_trade_status: "graded" | "ungraded" | "unknown";
|
|
761
|
+
};
|
|
762
|
+
market: {
|
|
763
|
+
id: string;
|
|
764
|
+
condition_id: string;
|
|
765
|
+
title: string;
|
|
766
|
+
slug?: string;
|
|
767
|
+
/** Provider-backed market_canonical category. */
|
|
768
|
+
category?: string;
|
|
769
|
+
};
|
|
770
|
+
};
|
|
771
|
+
export type LargeTradeDetail = LargeTrade & {
|
|
772
|
+
counterparty_analysis: CounterpartyAnalysis;
|
|
773
|
+
};
|
|
774
|
+
export type LargeTradeHistoryMeta = {
|
|
775
|
+
/** Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines. */
|
|
776
|
+
request_id: string;
|
|
777
|
+
cached: boolean;
|
|
778
|
+
/** Cache age in seconds; the key is absent when the response was not cached. */
|
|
779
|
+
cache_age_s?: number;
|
|
780
|
+
source: {
|
|
781
|
+
kind: "local_replay";
|
|
782
|
+
table: "whale_alerts";
|
|
783
|
+
provider_fetch_at_request_time: false;
|
|
784
|
+
};
|
|
785
|
+
completeness: {
|
|
786
|
+
status: "best_effort";
|
|
787
|
+
/** Explains that local replay completeness can vary by market and time window. */
|
|
788
|
+
reason: string;
|
|
789
|
+
};
|
|
790
|
+
};
|
|
548
791
|
export type LeaderboardEntry = {
|
|
549
792
|
id: string;
|
|
550
793
|
address: string;
|
|
@@ -685,6 +928,8 @@ export type MarketIntel = {
|
|
|
685
928
|
direction: "YES" | "NO";
|
|
686
929
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
687
930
|
token_id: string | null;
|
|
931
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
932
|
+
large_trade_count?: number;
|
|
688
933
|
whale_trade_count: number;
|
|
689
934
|
buy_volume_usd: number;
|
|
690
935
|
sell_volume_usd: number;
|
|
@@ -698,13 +943,20 @@ export type MarketIntel = {
|
|
|
698
943
|
token_id: string | null;
|
|
699
944
|
size_usd: number;
|
|
700
945
|
})[];
|
|
946
|
+
/** Age of the oldest stored position snapshot behind top_positions: the minimum wallet sync clock over the positions this body publishes. The roster is a stored read rather than a live one, and graded wallets sit on different sync tiers, so this names how current the whole roster is; the response is no fresher than this timestamp. Null when the roster is empty or no published position carries a sync clock. It does not date net_flow_usd, the volumes or the trade counts, which come from large-trade event times. */
|
|
947
|
+
oldest_snapshot_as_of: string | null;
|
|
701
948
|
};
|
|
702
|
-
/**
|
|
949
|
+
/**
|
|
950
|
+
* Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
|
|
951
|
+
* @deprecated
|
|
952
|
+
*/
|
|
703
953
|
smart_money: {
|
|
704
954
|
net_flow_usd: number;
|
|
705
955
|
direction: "YES" | "NO";
|
|
706
956
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
707
957
|
token_id: string | null;
|
|
958
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
959
|
+
large_trade_count?: number;
|
|
708
960
|
whale_trade_count: number;
|
|
709
961
|
buy_volume_usd: number;
|
|
710
962
|
sell_volume_usd: number;
|
|
@@ -718,6 +970,8 @@ export type MarketIntel = {
|
|
|
718
970
|
token_id: string | null;
|
|
719
971
|
size_usd: number;
|
|
720
972
|
})[];
|
|
973
|
+
/** Age of the oldest stored position snapshot behind top_positions: the minimum wallet sync clock over the positions this body publishes. The roster is a stored read rather than a live one, and graded wallets sit on different sync tiers, so this names how current the whole roster is; the response is no fresher than this timestamp. Null when the roster is empty or no published position carries a sync clock. It does not date net_flow_usd, the volumes or the trade counts, which come from large-trade event times. */
|
|
974
|
+
oldest_snapshot_as_of: string | null;
|
|
721
975
|
};
|
|
722
976
|
timeframe: string;
|
|
723
977
|
};
|
|
@@ -898,15 +1152,25 @@ export type PickOfTheDay = {
|
|
|
898
1152
|
position?: string;
|
|
899
1153
|
/** One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
|
|
900
1154
|
side_summary?: string;
|
|
901
|
-
/** Public V1 compatibility count of S/A
|
|
1155
|
+
/** Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. Canonical key since #16308; smart_wallet_count is its deprecated spelling, emitted beside it with the same value. */
|
|
1156
|
+
sharp_wallet_count?: number;
|
|
1157
|
+
/**
|
|
1158
|
+
* Deprecated spelling of sharp_wallet_count, emitted beside it with the same value and never removed. Public V1 compatibility count of S/A sharp-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof.
|
|
1159
|
+
* @deprecated
|
|
1160
|
+
*/
|
|
902
1161
|
smart_wallet_count?: number;
|
|
903
|
-
/** Best public V1-compatible S/A
|
|
1162
|
+
/** Best public V1-compatible S/A sharp-money grade on the backed side. The first-party/internal current policy can select B, but a current B-only grade is omitted by the stable V1 adapter. Historical rows retain their frozen policy's grade. A current-day published pick with pending legacy proof, unknown-future proof, or structurally invalid current-policy proof returns 503 before this success schema is served. Resolved legacy proof remains readable on both current-day and archive/history responses. */
|
|
904
1163
|
top_grade?: string;
|
|
905
1164
|
/** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: category win-rate edge as a fraction (the backed-side cohort's win rate in this category minus the non-market-maker category baseline, e.g. 0.09 = +9 points), paired with category_edge_sample. */
|
|
906
1165
|
category_edge_pct?: number;
|
|
907
1166
|
/** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: pooled count of resolved markets behind category_edge_pct (the headline's n). */
|
|
908
1167
|
category_edge_sample?: number;
|
|
909
|
-
/** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. */
|
|
1168
|
+
/** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. Canonical key since #16308; smart_usd is its deprecated spelling, emitted beside it with the same value. */
|
|
1169
|
+
sharp_usd?: number;
|
|
1170
|
+
/**
|
|
1171
|
+
* Deprecated spelling of sharp_usd, emitted beside it with the same value and never removed. Recency-weighted graded-flow magnitude in USD; omitted when <= 0.
|
|
1172
|
+
* @deprecated
|
|
1173
|
+
*/
|
|
910
1174
|
smart_usd?: number;
|
|
911
1175
|
/** Frozen pre-game probability (0..1) for the backed side, written once at publication. It is the Polymarket CLOB order book midpoint at release, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price. */
|
|
912
1176
|
backed_price?: number;
|
|
@@ -990,15 +1254,15 @@ export type PickOfTheDay = {
|
|
|
990
1254
|
lane_probability_source?: "p";
|
|
991
1255
|
};
|
|
992
1256
|
trust?: PickTrust;
|
|
993
|
-
/** Public V1 S/A compatibility count on the backed side (equals the adapted
|
|
1257
|
+
/** Public V1 S/A compatibility count on the backed side (equals the adapted sharp_wallet_count). The first-party/internal current policy counts S/A/B. Historical rows retain their frozen policy's count. */
|
|
994
1258
|
traders?: number;
|
|
995
|
-
/** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted
|
|
1259
|
+
/** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted sharp_usd which decays. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. */
|
|
996
1260
|
backed_sharp_usd?: number;
|
|
997
1261
|
/** Bounded S/A compatibility projection of the frozen sharp-money holders on the backed side. Current full payloads expose the complete S/A/B roster in display_holders; historical rows can retain their earlier frozen shape. */
|
|
998
1262
|
holders?: PickHolder[];
|
|
999
1263
|
/** Full-only complete provider-confirmed S/A/B holder roster for the current Pick of the Day backing policy. Omitted for teaser, no-pick, and historical rows whose frozen holder proof predates this policy. Each entry may additionally carry `category_win_rate` / `category_win_rate_status`: the wallet's win rate in the pick's canonical `category`, stamped at serve time from the current category read model (the same annotation the sports sharp-money chips carry). The bounded `holders` compatibility projection never carries these fields. */
|
|
1000
1264
|
display_holders?: PickHolder[];
|
|
1001
|
-
/** Exact S/A
|
|
1265
|
+
/** Exact S/A sharp-money proof count on the backed side. The current display_holders roster can be longer because it also carries B-grade sharp-money holders. */
|
|
1002
1266
|
holder_count?: number;
|
|
1003
1267
|
/** Optional editorial note attached to the pick. */
|
|
1004
1268
|
editorial_note?: string;
|
|
@@ -1063,7 +1327,7 @@ export type PickOfTheDayArchiveEntry = {
|
|
|
1063
1327
|
image_url?: string;
|
|
1064
1328
|
/** The backed side's outcome label. Omitted for a still-pending pick when the request is not from an authenticated Pro key. */
|
|
1065
1329
|
pick_outcome_label?: string;
|
|
1066
|
-
/** Best public V1-compatible S/A
|
|
1330
|
+
/** Best public V1-compatible S/A sharp-money grade on the backed side; a current B-only grade is omitted by the stable V1 adapter, while historical rows retain their frozen policy's grade. Omitted when no sharp-money wallet backs the pick, when a pending legacy proof has not yet upgraded, or when the stored holder policy is unknown-future or structurally invalid. Resolved legacy history remains supported. */
|
|
1067
1331
|
top_grade?: string;
|
|
1068
1332
|
/** Settlement outcome of the backed side; 'pending' until the market resolves. */
|
|
1069
1333
|
outcome: "pending" | "win" | "loss" | "void";
|
|
@@ -1356,7 +1620,10 @@ export type PlatformCapabilities = {
|
|
|
1356
1620
|
pnl: PlatformCapabilityStatus;
|
|
1357
1621
|
strategy: PlatformCapabilityStatus;
|
|
1358
1622
|
timeline: PlatformCapabilityStatus;
|
|
1623
|
+
/** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
1624
|
+
large_trades: PlatformCapabilityStatus;
|
|
1359
1625
|
whale_signal: PlatformCapabilityStatus;
|
|
1626
|
+
suspicious_trades: PlatformCapabilityStatus;
|
|
1360
1627
|
insider_radar: PlatformCapabilityStatus;
|
|
1361
1628
|
market_snapshot: PlatformCapabilityStatus;
|
|
1362
1629
|
};
|
|
@@ -1388,6 +1655,8 @@ export type Position = {
|
|
|
1388
1655
|
cash_pnl?: number;
|
|
1389
1656
|
/** Closed-leg P&L rolled up (Polymarket `realizedPnl`). */
|
|
1390
1657
|
realized_pnl?: number;
|
|
1658
|
+
/** Additive lossless source atoms for the display-safe position fields. Parse every `value` with decimal-safe arithmetic; never recover exact values from the numeric twins. */
|
|
1659
|
+
exact?: PositionExact;
|
|
1391
1660
|
/** Max updated_at across mirror legs for this pair. */
|
|
1392
1661
|
last_reconciled_at?: string;
|
|
1393
1662
|
/** Backend-computed staleness bucket derived from last_reconciled_at. */
|
|
@@ -1420,6 +1689,17 @@ export type Position = {
|
|
|
1420
1689
|
end_date?: string;
|
|
1421
1690
|
};
|
|
1422
1691
|
};
|
|
1692
|
+
/** Lossless position atoms from `wallet_positions`. `shares` and `current_value_usd` are required when this object is present; other source values are omitted when the mirror has no verified value. */
|
|
1693
|
+
export type PositionExact = {
|
|
1694
|
+
shares: ExactDecimal;
|
|
1695
|
+
cost_basis_usd?: ExactDecimal;
|
|
1696
|
+
/** Exact derived price: `wallet_positions.cost_basis_usd / wallet_positions.shares`. */
|
|
1697
|
+
avg_price?: ExactDecimal;
|
|
1698
|
+
current_value_usd: ExactDecimal;
|
|
1699
|
+
initial_value_usd?: ExactDecimal;
|
|
1700
|
+
cash_pnl?: ExactDecimal;
|
|
1701
|
+
realized_pnl?: ExactDecimal;
|
|
1702
|
+
};
|
|
1423
1703
|
export type PositionTimelineEvent = {
|
|
1424
1704
|
/** Prefixed ID (pe_...). */
|
|
1425
1705
|
id: string;
|
|
@@ -1464,6 +1744,214 @@ export type PotdEntryAuthorization = {
|
|
|
1464
1744
|
/** Original provider kickoff ceiling. Never extended on retry. */
|
|
1465
1745
|
expires_at: string;
|
|
1466
1746
|
};
|
|
1747
|
+
/** 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. */
|
|
1748
|
+
export type PreGameSide = {
|
|
1749
|
+
/** 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. */
|
|
1750
|
+
side: string | null;
|
|
1751
|
+
/** UTC time at which the snapshot that ranked this row was computed. Canonical spelling of signal_created_at (#16310), same value. */
|
|
1752
|
+
ranked_at: string;
|
|
1753
|
+
/** Grade-weighted holders times the share of their money on the side: (5*s + 4*a + 3*b) * sharp_pct. Canonical spelling of conviction_score (#16310), same value. */
|
|
1754
|
+
backing_score: number;
|
|
1755
|
+
/** 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. */
|
|
1756
|
+
side_share: number | null;
|
|
1757
|
+
/** Polymarket condition id. */
|
|
1758
|
+
condition_id: string;
|
|
1759
|
+
/**
|
|
1760
|
+
* UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. Deprecated (#16310): `ranked_at` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1761
|
+
* @deprecated
|
|
1762
|
+
*/
|
|
1763
|
+
signal_created_at: string;
|
|
1764
|
+
/** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
|
|
1765
|
+
token_id: string | null;
|
|
1766
|
+
/** Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping. */
|
|
1767
|
+
category: string | null;
|
|
1768
|
+
/** Raw provider category as stored (e.g. NBA, EPL). */
|
|
1769
|
+
raw_category: string | null;
|
|
1770
|
+
title: string | null;
|
|
1771
|
+
event_slug: string | null;
|
|
1772
|
+
/** Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started. */
|
|
1773
|
+
game_start_time: string | null;
|
|
1774
|
+
/**
|
|
1775
|
+
* Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1776
|
+
* @deprecated
|
|
1777
|
+
*/
|
|
1778
|
+
piled_side: string | null;
|
|
1779
|
+
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1780
|
+
piled_outcome_index: number;
|
|
1781
|
+
/** 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. */
|
|
1782
|
+
sharp_pct: number | null;
|
|
1783
|
+
/** Raw piled-side sharp-money USD. */
|
|
1784
|
+
backed_sharp_usd: number;
|
|
1785
|
+
/** S-grade graded holders on the piled side. */
|
|
1786
|
+
s_count: number;
|
|
1787
|
+
/** A-grade graded holders on the piled side. */
|
|
1788
|
+
a_count: number;
|
|
1789
|
+
/** B-grade graded holders on the piled side. */
|
|
1790
|
+
b_count: number;
|
|
1791
|
+
/** Piled-side graded holder count (s_count + a_count + b_count). */
|
|
1792
|
+
graded_holders: number;
|
|
1793
|
+
/** Best grade present on the piled side; null when none. */
|
|
1794
|
+
top_grade: "S" | "A" | "B" | null;
|
|
1795
|
+
/**
|
|
1796
|
+
* Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1797
|
+
* @deprecated
|
|
1798
|
+
*/
|
|
1799
|
+
smart_score: number | null;
|
|
1800
|
+
/** Market volume (USD). */
|
|
1801
|
+
volume: number | null;
|
|
1802
|
+
/** Aggregate recent flow direction on the market; null when unavailable. */
|
|
1803
|
+
net_side: "BUY" | "SELL" | null;
|
|
1804
|
+
/**
|
|
1805
|
+
* Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1806
|
+
* @deprecated
|
|
1807
|
+
*/
|
|
1808
|
+
conviction_score: number;
|
|
1809
|
+
/** Piled-side graded holders read one-way: their fresh open legs across the signal game's markets (cross-market within the one game; moneyline+spread family only) all back the same team, or, when the market's holder scan was complete, Polymarket's currentValue shows no opposite leg on this market worth 10% of the backed leg and no fresh leg opposes it. Null when the directional read was not computed (no groupable game, no holder-level data on this ranking path, or the enrichment read failed) or classified nobody. */
|
|
1810
|
+
one_way_holder_count: number | null;
|
|
1811
|
+
/** 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. */
|
|
1812
|
+
hedged_holder_count: number | null;
|
|
1813
|
+
/** 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. */
|
|
1814
|
+
one_way_graded_usd: number | null;
|
|
1815
|
+
/** 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. */
|
|
1816
|
+
directional_confidence: number | null;
|
|
1817
|
+
/** The ranking key, descending: conviction_score * (1 + 0.25 * directional_confidence). Equals conviction_score when the directional read is null/zero, so signals without the read rank exactly as before. */
|
|
1818
|
+
directional_rank_score: number;
|
|
1819
|
+
category_skill: PreGameSideCategorySkill;
|
|
1820
|
+
/** 1-based rank within the (min_grade-filtered) ranked result. */
|
|
1821
|
+
rank: number;
|
|
1822
|
+
};
|
|
1823
|
+
/** Shadow-only category evidence over the full uncapped piled-side S/A/B holder allocation. It never changes signal membership, ordering, routing, or sizing. */
|
|
1824
|
+
export type PreGameSideCategorySkill = {
|
|
1825
|
+
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
1826
|
+
model_version: string;
|
|
1827
|
+
taxonomy_version: string | null;
|
|
1828
|
+
platform: "polymarket";
|
|
1829
|
+
scope: "observed_goldsky_primary_taker_fill";
|
|
1830
|
+
source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
|
|
1831
|
+
observation_started_at: string;
|
|
1832
|
+
as_of: string;
|
|
1833
|
+
canonical_category: string | null;
|
|
1834
|
+
eligible_holders: number;
|
|
1835
|
+
covered_holders: number;
|
|
1836
|
+
backed_sharp_usd: number | null;
|
|
1837
|
+
covered_backed_usd: number | null;
|
|
1838
|
+
coverage_pct: number | null;
|
|
1839
|
+
weighted_edge_mean: number | null;
|
|
1840
|
+
weighted_holder_lower_mean: number | null;
|
|
1841
|
+
specialist_backed_usd: number | null;
|
|
1842
|
+
specialist_backed_usd_pct: number | null;
|
|
1843
|
+
largest_holder_backed_usd_pct: number | null;
|
|
1844
|
+
minimum_holder_event_count: number | null;
|
|
1845
|
+
};
|
|
1846
|
+
/** Per-sport accountable funnel for the full observation snapshot, returned on every page. */
|
|
1847
|
+
export type PreGameSideFunnelReport = {
|
|
1848
|
+
sports: PreGameSideSportFunnelReport[];
|
|
1849
|
+
};
|
|
1850
|
+
/** 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. */
|
|
1851
|
+
export type PreGameSideObservation = {
|
|
1852
|
+
/** 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. */
|
|
1853
|
+
side: string | null;
|
|
1854
|
+
/** Grade-weighted holder-pile score before directional enrichment. Canonical spelling of conviction_score (#16310), same value. */
|
|
1855
|
+
backing_score: number;
|
|
1856
|
+
/** Signed share of graded money on the side, in [-1, 1]. Canonical spelling of smart_score (#16309, #16310), same value. */
|
|
1857
|
+
side_share: number;
|
|
1858
|
+
/** Raw Polymarket condition id. */
|
|
1859
|
+
condition_id: string;
|
|
1860
|
+
/** Provider-backed Polymarket CLOB token id for the piled outcome. Rows without a verified token terminate before emission. */
|
|
1861
|
+
token_id: string;
|
|
1862
|
+
/** Canonical sport bucket. */
|
|
1863
|
+
category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1864
|
+
/** Raw provider category as stored. */
|
|
1865
|
+
raw_category: string | null;
|
|
1866
|
+
/** Provider-backed market title. */
|
|
1867
|
+
title: string;
|
|
1868
|
+
event_slug: string | null;
|
|
1869
|
+
/** Provider event id when available. */
|
|
1870
|
+
event_id: string | null;
|
|
1871
|
+
/** Provider parent-event id used as the first event-cap identity when available. */
|
|
1872
|
+
parent_event_id: string | null;
|
|
1873
|
+
/** Provider-backed kickoff time in UTC. */
|
|
1874
|
+
game_start_time: string;
|
|
1875
|
+
/** UTC instant when this row finished provider/holder evaluation. */
|
|
1876
|
+
observed_at: string;
|
|
1877
|
+
/** 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. */
|
|
1878
|
+
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
1879
|
+
/** Always true. This row must not be routed to an order executor. */
|
|
1880
|
+
observation_only: true;
|
|
1881
|
+
/**
|
|
1882
|
+
* Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1883
|
+
* @deprecated
|
|
1884
|
+
*/
|
|
1885
|
+
piled_side: string | null;
|
|
1886
|
+
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1887
|
+
piled_outcome_index: 0 | 1;
|
|
1888
|
+
/** Provider-backed implied price for the piled outcome at observation time. */
|
|
1889
|
+
backed_price: number;
|
|
1890
|
+
/** Piled-side graded-holder dollar concentration. */
|
|
1891
|
+
sharp_pct: number;
|
|
1892
|
+
/** Raw graded-holder USD on the piled outcome. */
|
|
1893
|
+
backed_sharp_usd: number;
|
|
1894
|
+
s_count: number;
|
|
1895
|
+
a_count: number;
|
|
1896
|
+
b_count: number;
|
|
1897
|
+
/** Piled-side S/A/B holder count. */
|
|
1898
|
+
graded_holders: number;
|
|
1899
|
+
top_grade: "S" | "A" | "B";
|
|
1900
|
+
/**
|
|
1901
|
+
* Canonical signed holder-pile score. Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1902
|
+
* @deprecated
|
|
1903
|
+
*/
|
|
1904
|
+
smart_score: number;
|
|
1905
|
+
/** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
|
|
1906
|
+
volume: number;
|
|
1907
|
+
/**
|
|
1908
|
+
* Grade-weighted holder-pile score before directional enrichment. Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1909
|
+
* @deprecated
|
|
1910
|
+
*/
|
|
1911
|
+
conviction_score: number;
|
|
1912
|
+
/** Whether the provider holder page came from the shared cache or a live provider read. */
|
|
1913
|
+
provider_read_source: "cached" | "live";
|
|
1914
|
+
/** 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. */
|
|
1915
|
+
holder_scan_complete: boolean;
|
|
1916
|
+
/** 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. */
|
|
1917
|
+
holder_snapshot_at: string | null;
|
|
1918
|
+
/** 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. */
|
|
1919
|
+
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
1920
|
+
one_way_holder_count: number | null;
|
|
1921
|
+
hedged_holder_count: number | null;
|
|
1922
|
+
one_way_graded_usd: number | null;
|
|
1923
|
+
directional_confidence: number | null;
|
|
1924
|
+
/** Default cohort ordering key: conviction_score * (1 + 0.25 * directional_confidence), or conviction_score when confidence is null. */
|
|
1925
|
+
directional_rank_score: number;
|
|
1926
|
+
/** 1-based rank within this observation cohort and snapshot. */
|
|
1927
|
+
rank: number;
|
|
1928
|
+
};
|
|
1929
|
+
/** 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. */
|
|
1930
|
+
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";
|
|
1931
|
+
/** Independent sports-board supply plus stored-universe terminal accounting for one canonical sport. */
|
|
1932
|
+
export type PreGameSideSportFunnelReport = {
|
|
1933
|
+
sport: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1934
|
+
/** Unique condition ids independently visible on the provider-first sports board. */
|
|
1935
|
+
board_input: number;
|
|
1936
|
+
/** 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. */
|
|
1937
|
+
board_live_available: boolean;
|
|
1938
|
+
/** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
|
|
1939
|
+
board_upcoming_configured: boolean;
|
|
1940
|
+
/** 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. */
|
|
1941
|
+
board_upcoming_available: boolean;
|
|
1942
|
+
/** 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. */
|
|
1943
|
+
board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
|
|
1944
|
+
/** 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. */
|
|
1945
|
+
board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
|
|
1946
|
+
/** Stored-universe rows plus provider-board rows missing from storage. */
|
|
1947
|
+
input: number;
|
|
1948
|
+
/** 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. */
|
|
1949
|
+
terminals: Record<string, number>;
|
|
1950
|
+
/** Sum of every sparse terminal count. */
|
|
1951
|
+
terminal_total: number;
|
|
1952
|
+
/** True exactly when input equals terminal_total. */
|
|
1953
|
+
reconciled: boolean;
|
|
1954
|
+
};
|
|
1467
1955
|
/** 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. */
|
|
1468
1956
|
export type ProofPendingPickSlot = {
|
|
1469
1957
|
/** Stable 1-based slot within the product day's ranked picks. The pick keeps this rank once its proof is readable and it moves into `picks`. */
|
|
@@ -1475,44 +1963,44 @@ export type ProofPendingPickSlot = {
|
|
|
1475
1963
|
/** Recommended next read: 30 seconds ahead while pre-game proof is warming, one hour ahead for a post-kickoff pending legacy row that only settlement can make readable. Schedule against it instead of polling. */
|
|
1476
1964
|
retry_at: string;
|
|
1477
1965
|
};
|
|
1478
|
-
export type RadarFlag = {
|
|
1479
|
-
/** Prefixed ID (rf_...). */
|
|
1480
|
-
id: string;
|
|
1481
|
-
/** Stored score that met the live flag threshold. */
|
|
1482
|
-
suspicion_score: number;
|
|
1483
|
-
/** The live scorer persists one threshold class. */
|
|
1484
|
-
severity: "flag";
|
|
1485
|
-
trader: {
|
|
1486
|
-
id: string;
|
|
1487
|
-
address: string;
|
|
1488
|
-
username: string | null;
|
|
1489
|
-
};
|
|
1490
|
-
market: {
|
|
1491
|
-
id: string;
|
|
1492
|
-
condition_id: string;
|
|
1493
|
-
/** Canonical market question when available. */
|
|
1494
|
-
title: string | null;
|
|
1495
|
-
};
|
|
1496
|
-
scores: {
|
|
1497
|
-
/** Null because the live scorer does not record this component. */
|
|
1498
|
-
timing: number | null;
|
|
1499
|
-
/** Null because the live scorer does not record this component. */
|
|
1500
|
-
edge: number | null;
|
|
1501
|
-
/** Numeric evidence.size when recorded; otherwise null. */
|
|
1502
|
-
size: number | null;
|
|
1503
|
-
/** Numeric evidence.fresh when recorded; otherwise null. */
|
|
1504
|
-
fresh_wallet: number | null;
|
|
1505
|
-
};
|
|
1506
|
-
/** Stored whale_alerts.suspicion_signals JSON from the scorer. */
|
|
1507
|
-
evidence: unknown;
|
|
1508
|
-
/** Stored trade timestamp. */
|
|
1509
|
-
created_at: string;
|
|
1510
|
-
};
|
|
1511
1966
|
export type ReportPayload = {
|
|
1967
|
+
/** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
1968
|
+
total_large_trades: number | null;
|
|
1512
1969
|
total_whale_trades: number | null;
|
|
1970
|
+
/** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value. */
|
|
1971
|
+
total_large_trade_volume: number | null;
|
|
1513
1972
|
total_whale_volume: number | null;
|
|
1514
1973
|
biggest_trade_size: number | null;
|
|
1515
1974
|
active_traders: number | null;
|
|
1975
|
+
/** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
1976
|
+
top_large_trades: ({
|
|
1977
|
+
/** Provider outcome label for the traded side. */
|
|
1978
|
+
outcome: string | null;
|
|
1979
|
+
/** Trade direction (BUY or SELL), not the outcome side. */
|
|
1980
|
+
side: string | null;
|
|
1981
|
+
/** Market title. */
|
|
1982
|
+
title: string | null;
|
|
1983
|
+
/** Trade size in USD. */
|
|
1984
|
+
size: number | null;
|
|
1985
|
+
/** Trade price in provider [0, 1] units. */
|
|
1986
|
+
price: number | null;
|
|
1987
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets). */
|
|
1988
|
+
token_id: string | null;
|
|
1989
|
+
/** Whale trade id. */
|
|
1990
|
+
id: number | null;
|
|
1991
|
+
/** Trade timestamp (UTC). */
|
|
1992
|
+
trade_time: string | null;
|
|
1993
|
+
/** Provider market category. */
|
|
1994
|
+
market_category: string | null;
|
|
1995
|
+
/** Venue: polymarket. */
|
|
1996
|
+
platform: string | null;
|
|
1997
|
+
/** Trader display name, when known. */
|
|
1998
|
+
name: string | null;
|
|
1999
|
+
/** Trader pseudonym, when no display name is known. */
|
|
2000
|
+
pseudonym: string | null;
|
|
2001
|
+
/** Trader grade (S-F) at snapshot time. */
|
|
2002
|
+
trader_grade: string | null;
|
|
2003
|
+
})[] | null;
|
|
1516
2004
|
top_whale_trades: ({
|
|
1517
2005
|
/** Provider outcome label for the traded side. */
|
|
1518
2006
|
outcome: string | null;
|
|
@@ -1542,6 +2030,7 @@ export type ReportPayload = {
|
|
|
1542
2030
|
trader_grade: string | null;
|
|
1543
2031
|
})[] | null;
|
|
1544
2032
|
categories: Record<string, unknown>[] | null;
|
|
2033
|
+
/** Counts of current grades for distinct Polymarket traders with at least one whale alert in the report's source date range. The grade is the current projection at snapshot materialization time, not a historical grade at trade time. Traders without a current ranking projection are omitted; a null grade entry means the active trader's current grade is unavailable. */
|
|
1545
2034
|
grade_distribution: Record<string, unknown>[] | null;
|
|
1546
2035
|
};
|
|
1547
2036
|
export type ReportReconciliation = {
|
|
@@ -1576,9 +2065,9 @@ export type ResponseMeta = {
|
|
|
1576
2065
|
ranking_generation?: number;
|
|
1577
2066
|
/** Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order. */
|
|
1578
2067
|
ranking_as_of?: string;
|
|
1579
|
-
/** 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
|
|
2068
|
+
/** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a sharp-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
|
|
1580
2069
|
directional_source?: "live" | "degraded";
|
|
1581
|
-
/** 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
|
|
2070
|
+
/** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a sharp-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
|
|
1582
2071
|
ranking_source?: "live" | "db_only";
|
|
1583
2072
|
/** Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage. */
|
|
1584
2073
|
category_skill_source?: "live" | "partial" | "degraded" | "unavailable";
|
|
@@ -1635,16 +2124,23 @@ export type SmartMoneyFlowMarket = {
|
|
|
1635
2124
|
direction: "YES" | "NO";
|
|
1636
2125
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1637
2126
|
token_id: string | null;
|
|
2127
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
2128
|
+
large_trade_count?: number;
|
|
1638
2129
|
whale_trade_count: number;
|
|
1639
2130
|
buy_volume_usd: number;
|
|
1640
2131
|
sell_volume_usd: number;
|
|
1641
2132
|
};
|
|
1642
|
-
/**
|
|
2133
|
+
/**
|
|
2134
|
+
* Deprecated alias of sharp_money; byte-identical and retained for backward compatibility.
|
|
2135
|
+
* @deprecated
|
|
2136
|
+
*/
|
|
1643
2137
|
smart_money: {
|
|
1644
2138
|
net_flow_usd: number;
|
|
1645
2139
|
direction: "YES" | "NO";
|
|
1646
2140
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1647
2141
|
token_id: string | null;
|
|
2142
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
2143
|
+
large_trade_count?: number;
|
|
1648
2144
|
whale_trade_count: number;
|
|
1649
2145
|
buy_volume_usd: number;
|
|
1650
2146
|
sell_volume_usd: number;
|
|
@@ -1656,6 +2152,8 @@ export type SnapshotCompleteness = {
|
|
|
1656
2152
|
status: "complete" | "partial" | "empty";
|
|
1657
2153
|
reason: string;
|
|
1658
2154
|
expected_days: number;
|
|
2155
|
+
/** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value. */
|
|
2156
|
+
covered_days_with_large_trade_activity?: number;
|
|
1659
2157
|
covered_days_with_whale_activity: number;
|
|
1660
2158
|
};
|
|
1661
2159
|
export type SnapshotState = {
|
|
@@ -1675,178 +2173,38 @@ export type SnapshotState = {
|
|
|
1675
2173
|
/** When this body's source read started, the clock finality is judged on. null for a body stored before that clock was recorded. */
|
|
1676
2174
|
source_read_started_at: string | null;
|
|
1677
2175
|
};
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
piled_outcome_index: 0 | 1;
|
|
1711
|
-
/** Provider-backed implied price for the piled outcome at observation time. */
|
|
1712
|
-
backed_price: number;
|
|
1713
|
-
/** Piled-side graded-holder dollar concentration. */
|
|
1714
|
-
sharp_pct: number;
|
|
1715
|
-
/** Raw graded-holder USD on the piled outcome. */
|
|
1716
|
-
backed_sharp_usd: number;
|
|
1717
|
-
s_count: number;
|
|
1718
|
-
a_count: number;
|
|
1719
|
-
b_count: number;
|
|
1720
|
-
/** Piled-side S/A/B holder count. */
|
|
1721
|
-
graded_holders: number;
|
|
1722
|
-
top_grade: "S" | "A" | "B";
|
|
1723
|
-
/** Canonical signed holder-pile score. */
|
|
1724
|
-
smart_score: number;
|
|
1725
|
-
/** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
|
|
1726
|
-
volume: number;
|
|
1727
|
-
/** Grade-weighted holder-pile score before directional enrichment. */
|
|
1728
|
-
conviction_score: number;
|
|
1729
|
-
/** Whether the provider holder page came from the shared cache or a live provider read. */
|
|
1730
|
-
provider_read_source: "cached" | "live";
|
|
1731
|
-
/** 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. */
|
|
1732
|
-
holder_scan_complete: boolean;
|
|
1733
|
-
/** 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. */
|
|
1734
|
-
holder_snapshot_at: string | null;
|
|
1735
|
-
/** 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. */
|
|
1736
|
-
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
1737
|
-
one_way_holder_count: number | null;
|
|
1738
|
-
hedged_holder_count: number | null;
|
|
1739
|
-
one_way_graded_usd: number | null;
|
|
1740
|
-
directional_confidence: number | null;
|
|
1741
|
-
/** Default cohort ordering key: conviction_score * (1 + 0.25 * directional_confidence), or conviction_score when confidence is null. */
|
|
1742
|
-
directional_rank_score: number;
|
|
1743
|
-
/** 1-based rank within this observation cohort and snapshot. */
|
|
1744
|
-
rank: number;
|
|
1745
|
-
};
|
|
1746
|
-
/** 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. */
|
|
1747
|
-
export type SportsEdgeObservationTerminalReason = "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";
|
|
1748
|
-
/** 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. */
|
|
1749
|
-
export type SportsEdgeSignal = {
|
|
1750
|
-
/** Polymarket condition id. */
|
|
1751
|
-
condition_id: string;
|
|
1752
|
-
/** 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. */
|
|
1753
|
-
signal_created_at: string;
|
|
1754
|
-
/** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
|
|
1755
|
-
token_id: string | null;
|
|
1756
|
-
/** Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping. */
|
|
1757
|
-
category: string | null;
|
|
1758
|
-
/** Raw provider category as stored (e.g. NBA, EPL). */
|
|
1759
|
-
raw_category: string | null;
|
|
1760
|
-
title: string | null;
|
|
1761
|
-
event_slug: string | null;
|
|
1762
|
-
/** 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. */
|
|
1763
|
-
game_start_time: string | null;
|
|
1764
|
-
/** 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. */
|
|
1765
|
-
piled_side: string | null;
|
|
1766
|
-
/** 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. */
|
|
1767
|
-
piled_outcome_index: number;
|
|
1768
|
-
/** 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. */
|
|
1769
|
-
sharp_pct: number | null;
|
|
1770
|
-
/** Raw piled-side sharp-money USD. */
|
|
1771
|
-
backed_sharp_usd: number;
|
|
1772
|
-
/** S-grade graded holders on the piled side. */
|
|
1773
|
-
s_count: number;
|
|
1774
|
-
/** A-grade graded holders on the piled side. */
|
|
1775
|
-
a_count: number;
|
|
1776
|
-
/** B-grade graded holders on the piled side. */
|
|
1777
|
-
b_count: number;
|
|
1778
|
-
/** Piled-side graded holder count (s_count + a_count + b_count). */
|
|
1779
|
-
graded_holders: number;
|
|
1780
|
-
/** Best grade present on the piled side; null when none. */
|
|
1781
|
-
top_grade: "S" | "A" | "B" | null;
|
|
1782
|
-
/** Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). */
|
|
1783
|
-
smart_score: number | null;
|
|
1784
|
-
/** Market volume (USD). */
|
|
1785
|
-
volume: number | null;
|
|
1786
|
-
/** Aggregate recent flow direction on the market; null when unavailable. */
|
|
1787
|
-
net_side: "BUY" | "SELL" | null;
|
|
1788
|
-
/** Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). */
|
|
1789
|
-
conviction_score: number;
|
|
1790
|
-
/** 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. */
|
|
1791
|
-
one_way_holder_count: number | null;
|
|
1792
|
-
/** 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. */
|
|
1793
|
-
hedged_holder_count: number | null;
|
|
1794
|
-
/** 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. */
|
|
1795
|
-
one_way_graded_usd: number | null;
|
|
1796
|
-
/** 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. */
|
|
1797
|
-
directional_confidence: number | null;
|
|
1798
|
-
/** The ranking key, descending: conviction_score * (1 + 0.25 * directional_confidence). Equals conviction_score when the directional read is null/zero, so signals without the read rank exactly as before. */
|
|
1799
|
-
directional_rank_score: number;
|
|
1800
|
-
category_skill: SportsEdgeSignalCategorySkill;
|
|
1801
|
-
/** 1-based rank within the (min_grade-filtered) ranked result. */
|
|
1802
|
-
rank: number;
|
|
1803
|
-
};
|
|
1804
|
-
/** Shadow-only category evidence over the full uncapped piled-side S/A/B holder allocation. It never changes signal membership, ordering, routing, or sizing. */
|
|
1805
|
-
export type SportsEdgeSignalCategorySkill = {
|
|
1806
|
-
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
1807
|
-
model_version: string;
|
|
1808
|
-
taxonomy_version: string | null;
|
|
1809
|
-
platform: "polymarket";
|
|
1810
|
-
scope: "observed_goldsky_primary_taker_fill";
|
|
1811
|
-
source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
|
|
1812
|
-
observation_started_at: string;
|
|
1813
|
-
as_of: string;
|
|
1814
|
-
canonical_category: string | null;
|
|
1815
|
-
eligible_holders: number;
|
|
1816
|
-
covered_holders: number;
|
|
1817
|
-
backed_sharp_usd: number | null;
|
|
1818
|
-
covered_backed_usd: number | null;
|
|
1819
|
-
coverage_pct: number | null;
|
|
1820
|
-
weighted_edge_mean: number | null;
|
|
1821
|
-
weighted_holder_lower_mean: number | null;
|
|
1822
|
-
specialist_backed_usd: number | null;
|
|
1823
|
-
specialist_backed_usd_pct: number | null;
|
|
1824
|
-
largest_holder_backed_usd_pct: number | null;
|
|
1825
|
-
minimum_holder_event_count: number | null;
|
|
1826
|
-
};
|
|
1827
|
-
/** Independent sports-board supply plus stored-universe terminal accounting for one canonical sport. */
|
|
1828
|
-
export type SportsEdgeSportFunnelReport = {
|
|
1829
|
-
sport: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1830
|
-
/** Unique condition ids independently visible on the provider-first sports board. */
|
|
1831
|
-
board_input: number;
|
|
1832
|
-
/** 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. */
|
|
1833
|
-
board_live_available: boolean;
|
|
1834
|
-
/** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
|
|
1835
|
-
board_upcoming_configured: boolean;
|
|
1836
|
-
/** 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. */
|
|
1837
|
-
board_upcoming_available: boolean;
|
|
1838
|
-
/** 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. */
|
|
1839
|
-
board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
|
|
1840
|
-
/** 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. */
|
|
1841
|
-
board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
|
|
1842
|
-
/** Stored-universe rows plus provider-board rows missing from storage. */
|
|
1843
|
-
input: number;
|
|
1844
|
-
/** 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. */
|
|
1845
|
-
terminals: Record<string, number>;
|
|
1846
|
-
/** Sum of every sparse terminal count. */
|
|
1847
|
-
terminal_total: number;
|
|
1848
|
-
/** True exactly when input equals terminal_total. */
|
|
1849
|
-
reconciled: boolean;
|
|
2176
|
+
export type SuspiciousTrade = {
|
|
2177
|
+
/** Prefixed ID (rf_...). */
|
|
2178
|
+
id: string;
|
|
2179
|
+
/** Stored score that met the live flag threshold. */
|
|
2180
|
+
suspicion_score: number;
|
|
2181
|
+
/** The live scorer persists one threshold class. */
|
|
2182
|
+
severity: "flag";
|
|
2183
|
+
trader: {
|
|
2184
|
+
id: string;
|
|
2185
|
+
address: string;
|
|
2186
|
+
username: string | null;
|
|
2187
|
+
};
|
|
2188
|
+
market: {
|
|
2189
|
+
id: string;
|
|
2190
|
+
condition_id: string;
|
|
2191
|
+
/** Canonical market question when available. */
|
|
2192
|
+
title: string | null;
|
|
2193
|
+
};
|
|
2194
|
+
scores: {
|
|
2195
|
+
/** Null because the live scorer does not record this component. */
|
|
2196
|
+
timing: number | null;
|
|
2197
|
+
/** Null because the live scorer does not record this component. */
|
|
2198
|
+
edge: number | null;
|
|
2199
|
+
/** Numeric evidence.size when recorded; otherwise null. */
|
|
2200
|
+
size: number | null;
|
|
2201
|
+
/** Numeric evidence.fresh when recorded; otherwise null. */
|
|
2202
|
+
fresh_wallet: number | null;
|
|
2203
|
+
};
|
|
2204
|
+
/** Stored whale_alerts.suspicion_signals JSON from the scorer. */
|
|
2205
|
+
evidence: unknown;
|
|
2206
|
+
/** Stored trade timestamp. */
|
|
2207
|
+
created_at: string;
|
|
1850
2208
|
};
|
|
1851
2209
|
export type Trader = {
|
|
1852
2210
|
/** Prefixed ID (trd_...). */
|
|
@@ -1857,6 +2215,10 @@ export type Trader = {
|
|
|
1857
2215
|
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
|
|
1858
2216
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
1859
2217
|
score?: number;
|
|
2218
|
+
/** Capital-normalized forecasting score: the cohort percentile (0-100) of the EB-shrunk calibration edge. Omitted when the forecasting signal is unavailable; never replaced with zero. */
|
|
2219
|
+
forecast_score?: number;
|
|
2220
|
+
/** Share of forecast_score supported by the trader's own resolved-market record rather than the cohort prior: n / (n + 30). Omitted when forecast_score is unavailable. */
|
|
2221
|
+
forecast_evidence?: number;
|
|
1860
2222
|
rank?: number;
|
|
1861
2223
|
pnl: {
|
|
1862
2224
|
total?: number;
|
|
@@ -1867,13 +2229,17 @@ export type Trader = {
|
|
|
1867
2229
|
last_7d?: number;
|
|
1868
2230
|
/** DEPRECATED, never sent. The local pnl_30d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native monthly window from GET /api/trader/{address}/profile-summary instead. */
|
|
1869
2231
|
last_30d?: number;
|
|
2232
|
+
/** Additive lossless counterpart. Omitted when the trusted native realized-P&L source is unavailable; existing numeric fields keep their display-safe v1 semantics. */
|
|
2233
|
+
exact?: TraderPnlExact;
|
|
1870
2234
|
};
|
|
1871
2235
|
stats: {
|
|
1872
2236
|
markets_traded?: number;
|
|
1873
2237
|
win_rate?: number;
|
|
1874
2238
|
daily_win_rate?: number;
|
|
1875
|
-
/** Full-history both-sides USD cash volume from Polymarket user-volume. Omitted without a verified observation; never leaderboard shares.
|
|
2239
|
+
/** Full-history both-sides USD cash volume from Polymarket user-volume. Omitted without a verified observation; never leaderboard shares. Its observation time is published as the volume group in data_quality and as trust.total_volume.freshness.as_of, both trader_usd_volume.observed_at; synced_at is a different clock and is never a substitute for it. */
|
|
1876
2240
|
total_volume?: number;
|
|
2241
|
+
/** Additive lossless counterpart to `total_volume`. Omitted when the verified provider observation is unavailable. */
|
|
2242
|
+
exact?: TraderStatsExact;
|
|
1877
2243
|
};
|
|
1878
2244
|
strategy?: {
|
|
1879
2245
|
strategy_type?: string;
|
|
@@ -1907,6 +2273,8 @@ export type Trader = {
|
|
|
1907
2273
|
synced_at?: string;
|
|
1908
2274
|
/** synced, unknown, or pending. */
|
|
1909
2275
|
sync_status?: string;
|
|
2276
|
+
/** Data age and coverage for this trader body. Always present. Its five groups are sync (traders.last_synced, covering pnl.total, pnl.realized, stats.markets_traded, stats.win_rate, stats.daily_win_rate, last_active, synced_at and sync_status), ranking (trader_rankings.computed_at, covering grade, score, streak_tier, forecast_score and forecast_evidence), leaderboard_rank (traders.leaderboard_rank, which stores no write timestamp, so its status is unknown rather than dated by another clock), volume (trader_usd_volume.observed_at, covering stats.total_volume) and positions (trader_markets, covering pnl.unrealized, whose own write times this read does not carry). For an unknown wallet every group is unavailable. */
|
|
2277
|
+
data_quality: DataQuality;
|
|
1910
2278
|
/** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
|
|
1911
2279
|
trust?: TraderTrust;
|
|
1912
2280
|
/** Current evidence for observed and known categories (expand=categories or expand[]=categories). Omitted unless expanded. Includes insufficient, stale, unknown and degraded rows; absence of a category is not proof of skill. The global grade is unchanged. */
|
|
@@ -1991,19 +2359,105 @@ export type TraderEsportsGameRecord = {
|
|
|
1991
2359
|
/** The same rule as the parent record: measured when decided cleared min_decided_for_win_rate, not_enough_data when the counts are real but the sample is under the floor. A chip on a market in this game shows this row's rate when it is measured and the Esports bucket's otherwise. */
|
|
1992
2360
|
status: "measured" | "not_enough_data";
|
|
1993
2361
|
};
|
|
2362
|
+
export type TraderExportArtifactManifest = {
|
|
2363
|
+
/** Version of the artifact manifest contract. */
|
|
2364
|
+
manifest_version: string;
|
|
2365
|
+
/** Serialization used for the decompressed content. */
|
|
2366
|
+
format: "json" | "ndjson" | "csv";
|
|
2367
|
+
/** Stable schema identifier for the selected serialization. */
|
|
2368
|
+
schema_version: "trader-export-json-v1" | "trader-export-ndjson-v1" | "trader-export-csv-v1";
|
|
2369
|
+
/** Sections represented by the artifact. JSON and NDJSON carry the full envelope and trades; CSV carries trade rows only. */
|
|
2370
|
+
coverage: "full_envelope_and_trades" | "trades_only";
|
|
2371
|
+
generation: TraderExportGeneration;
|
|
2372
|
+
/** Number of trade rows written. */
|
|
2373
|
+
row_count: number;
|
|
2374
|
+
/** Exact byte count of the decompressed content stream clients receive. */
|
|
2375
|
+
content_size_bytes: number;
|
|
2376
|
+
/** Lowercase SHA-256 of the decompressed content bytes. */
|
|
2377
|
+
content_sha256: string;
|
|
2378
|
+
/** Exact byte count of the gzip-compressed bytes stored by the object provider. */
|
|
2379
|
+
compressed_size_bytes: number;
|
|
2380
|
+
/** Lowercase SHA-256 of the stored gzip bytes; the multipart ETag is not used as this checksum. */
|
|
2381
|
+
compressed_sha256: string;
|
|
2382
|
+
};
|
|
2383
|
+
export type TraderExportCategoryWatermark = {
|
|
2384
|
+
source: string;
|
|
2385
|
+
coverage: string;
|
|
2386
|
+
publication_fence: string | null;
|
|
2387
|
+
data_as_of: string | null;
|
|
2388
|
+
};
|
|
2389
|
+
export type TraderExportGeneration = {
|
|
2390
|
+
/** Opaque generation identity selected for the coherent read snapshot. */
|
|
2391
|
+
id: string;
|
|
2392
|
+
selected_at: string;
|
|
2393
|
+
consistency: "repeatable_read";
|
|
2394
|
+
source_watermarks: TraderExportSourceWatermarks;
|
|
2395
|
+
};
|
|
1994
2396
|
export type TraderExportJob = {
|
|
1995
2397
|
object: "trader_export_job";
|
|
1996
2398
|
data: {
|
|
1997
2399
|
job_id: number;
|
|
1998
|
-
|
|
2400
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2401
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
1999
2402
|
format: "json" | "ndjson" | "csv";
|
|
2000
2403
|
total_trades: number | null;
|
|
2001
2404
|
processed_trades: number | null;
|
|
2002
2405
|
file_size: number | null;
|
|
2003
2406
|
error: string | null;
|
|
2407
|
+
/** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
|
|
2408
|
+
terminal: boolean;
|
|
2409
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2410
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2411
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
|
|
2412
|
+
poll_after_s?: number;
|
|
2413
|
+
created_at: string;
|
|
2414
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2415
|
+
started_at: string | null;
|
|
2416
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2417
|
+
ready_at: string | null;
|
|
2418
|
+
failed_at: string | null;
|
|
2419
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2420
|
+
expires_at: string;
|
|
2421
|
+
/** When the job became expired; null until then. */
|
|
2422
|
+
expired_at: string | null;
|
|
2423
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2424
|
+
data_as_of: string | null;
|
|
2425
|
+
/** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
|
|
2426
|
+
cancel_requested_at: string | null;
|
|
2427
|
+
/** When the job reached cancelled; null until then. */
|
|
2428
|
+
cancelled_at: string | null;
|
|
2429
|
+
/** Worker claims so far. */
|
|
2430
|
+
attempt: number;
|
|
2431
|
+
/** The job fails when attempt reaches this. */
|
|
2432
|
+
max_attempts: number;
|
|
2433
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2434
|
+
artifact?: {
|
|
2435
|
+
/** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
|
|
2436
|
+
artifact_id: string;
|
|
2437
|
+
/** The storage ETag of the object. */
|
|
2438
|
+
etag: string | null;
|
|
2439
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2440
|
+
compressed_size_bytes: number | null;
|
|
2441
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2442
|
+
content_encoding: "gzip";
|
|
2443
|
+
/** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
|
|
2444
|
+
manifest: TraderExportArtifactManifest | null;
|
|
2445
|
+
};
|
|
2004
2446
|
};
|
|
2005
2447
|
meta: ResponseMeta;
|
|
2006
2448
|
};
|
|
2449
|
+
export type TraderExportPnlWatermark = {
|
|
2450
|
+
source: string;
|
|
2451
|
+
coverage: string;
|
|
2452
|
+
revision: number | null;
|
|
2453
|
+
observed_at: string | null;
|
|
2454
|
+
};
|
|
2455
|
+
export type TraderExportPositionWatermark = {
|
|
2456
|
+
source: string;
|
|
2457
|
+
coverage: string;
|
|
2458
|
+
generation: number | null;
|
|
2459
|
+
data_as_of: string | null;
|
|
2460
|
+
};
|
|
2007
2461
|
export type TraderExportSnapshot = {
|
|
2008
2462
|
address: string;
|
|
2009
2463
|
generated_at: string;
|
|
@@ -2013,13 +2467,49 @@ export type TraderExportSnapshot = {
|
|
|
2013
2467
|
counts: ExportCounts;
|
|
2014
2468
|
large_export_policy: LargeExportPolicy;
|
|
2015
2469
|
};
|
|
2470
|
+
export type TraderExportSourceWatermarks = {
|
|
2471
|
+
positions: TraderExportPositionWatermark;
|
|
2472
|
+
pnl: TraderExportPnlWatermark;
|
|
2473
|
+
categories: TraderExportCategoryWatermark;
|
|
2474
|
+
trades: TraderExportTradeWatermark;
|
|
2475
|
+
};
|
|
2476
|
+
export type TraderExportTradeWatermark = {
|
|
2477
|
+
source: string;
|
|
2478
|
+
coverage: string;
|
|
2479
|
+
rows: number;
|
|
2480
|
+
first_activity_date: string | null;
|
|
2481
|
+
};
|
|
2482
|
+
/** A trader's daily P&L object. `id` is always present. The five sections -- `entries`, `stats`, `monthly`, `year_totals`, `drawdown` -- are present unless the request's `sections` parameter excluded them, so a request that sends no `sections` always carries all five. An excluded section is absent from the object, never null and never an empty array. */
|
|
2016
2483
|
export type TraderPnl = {
|
|
2017
2484
|
/** Prefixed trader ID (`trd_...`). */
|
|
2018
2485
|
id: string;
|
|
2486
|
+
/** Representation parameters applied to this body. Present only when the request sent `from`, `to` or `sections`; omitted otherwise, which is what keeps a no-parameter response identical to the one this route served before the parameters existed. */
|
|
2487
|
+
view?: {
|
|
2488
|
+
/** Inclusive UTC lower bound applied to the daily series; null when the request left the series unbounded below. */
|
|
2489
|
+
from: string | null;
|
|
2490
|
+
/** Inclusive UTC upper bound applied to the daily series; null when the request left the series unbounded above. */
|
|
2491
|
+
to: string | null;
|
|
2492
|
+
/** Sections this body carries, in the order the object publishes them, whatever order the query listed. */
|
|
2493
|
+
sections: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
2494
|
+
/** Points in the full stored daily series, before the window. Compare with entries_in_window to tell a clipped chart from a wallet that really has that many days. */
|
|
2495
|
+
entries_total: number;
|
|
2496
|
+
/** Points of the daily series inside the window. Equal to entries_total when no bound narrowed it, and reported whether or not entries was among the requested sections. */
|
|
2497
|
+
entries_in_window: number;
|
|
2498
|
+
/** The last daily point strictly before `from`: the cumulative baseline the window was cut away from. null when the request set no lower bound, or when the window starts at or before the first stored point and the slice already begins at the start of the history. Cumulative values in `entries` and `drawdown` are never rebased to the window, so this is the figure to subtract for a window-relative change. */
|
|
2499
|
+
anchor: {
|
|
2500
|
+
date: string;
|
|
2501
|
+
/** Cumulative profit carried into the window; null when the stored point has none, the same nullability entries[].cumulative_profit has. */
|
|
2502
|
+
cumulative_profit: number | null;
|
|
2503
|
+
/** Cumulative total P&L carried into the window; null on the same terms. */
|
|
2504
|
+
total_pnl: number | null;
|
|
2505
|
+
/** Underwater value at the anchor date; null when that date has no drawdown point, which happens exactly when its cumulative_profit is null. The running peak behind the window is cumulative_profit minus drawdown (drawdown is zero or negative). */
|
|
2506
|
+
drawdown: number | null;
|
|
2507
|
+
} | null;
|
|
2508
|
+
};
|
|
2019
2509
|
/** RFC3339 served-freshness clock for this trader's PnL history = traders.daily_pnl_recomputed_at, when the daily_pnl read model this response is served from was last rebuilt; null when it has never been recomputed for the trader. Always present, so read it as a value that can be null rather than a key that can be missing. */
|
|
2020
2510
|
freshness_at: string | null;
|
|
2021
|
-
/** Daily cumulative-P&L series (oldest-first). */
|
|
2022
|
-
entries
|
|
2511
|
+
/** Daily cumulative-P&L series (oldest-first). Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. cumulative_profit and total_pnl stay cumulative from the start of the stored history, so a clipped slice keeps the same economic meaning; view.anchor carries the point before the window. */
|
|
2512
|
+
entries?: {
|
|
2023
2513
|
date: string;
|
|
2024
2514
|
markets_traded?: number;
|
|
2025
2515
|
total_volume?: number;
|
|
@@ -2027,7 +2517,8 @@ export type TraderPnl = {
|
|
|
2027
2517
|
total_pnl?: number;
|
|
2028
2518
|
daily_change: number;
|
|
2029
2519
|
}[];
|
|
2030
|
-
stats
|
|
2520
|
+
/** Pre-derived period stats. Present unless the request's `sections` excluded it. Always the published all/90d/30d/7d windows over the full stored history; `from`/`to` never recompute them over the request's range. */
|
|
2521
|
+
stats?: {
|
|
2031
2522
|
all: {
|
|
2032
2523
|
current: number;
|
|
2033
2524
|
change: number;
|
|
@@ -2081,25 +2572,35 @@ export type TraderPnl = {
|
|
|
2081
2572
|
rebase_anchor: number;
|
|
2082
2573
|
};
|
|
2083
2574
|
};
|
|
2084
|
-
/** Per-month P&L aggregation. */
|
|
2085
|
-
monthly
|
|
2575
|
+
/** Per-month P&L aggregation. Present unless the request's `sections` excluded it. Whole months over the full stored history, never clipped to `from`/`to`, so a month is never a partial month. */
|
|
2576
|
+
monthly?: {
|
|
2086
2577
|
year: number;
|
|
2087
2578
|
month: number;
|
|
2088
2579
|
pnl: number;
|
|
2089
2580
|
markets_traded: number;
|
|
2090
2581
|
}[];
|
|
2091
|
-
/** Per-year P&L totals (ascending by year). */
|
|
2092
|
-
year_totals
|
|
2582
|
+
/** Per-year P&L totals (ascending by year). Present unless the request's `sections` excluded it. Whole years over the full stored history, never clipped to `from`/`to`. */
|
|
2583
|
+
year_totals?: {
|
|
2093
2584
|
year: number;
|
|
2094
2585
|
pnl: number;
|
|
2095
2586
|
}[];
|
|
2096
|
-
/** Underwater (drawdown) series. */
|
|
2097
|
-
drawdown
|
|
2587
|
+
/** Underwater (drawdown) series. Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. The running peak behind each point is the full-history peak, so a clipped slice is not rebased; view.anchor.drawdown carries the value at the point before the window. */
|
|
2588
|
+
drawdown?: {
|
|
2098
2589
|
date: string;
|
|
2099
2590
|
cumulative_profit: number;
|
|
2100
2591
|
drawdown: number;
|
|
2101
2592
|
}[];
|
|
2102
2593
|
};
|
|
2594
|
+
/** Lossless counterparts for trader P&L values. The object is omitted when no trusted native realized-P&L snapshot is available. */
|
|
2595
|
+
export type TraderPnlExact = {
|
|
2596
|
+
/** Native Polymarket realized P&L plus credited maker and taker rebates, with fees included, from the trusted matching `trader_trading_pnl.net_realized_pnl` snapshot. */
|
|
2597
|
+
realized: ExactDecimal;
|
|
2598
|
+
};
|
|
2599
|
+
/** Lossless counterparts for trader statistics. The object is omitted when the verified provider observation is unavailable. */
|
|
2600
|
+
export type TraderStatsExact = {
|
|
2601
|
+
/** Full-history both-sides Polymarket user-volume atom from the verified `trader_usd_volume` observation. */
|
|
2602
|
+
total_volume: ExactDecimal;
|
|
2603
|
+
};
|
|
2103
2604
|
/** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
|
|
2104
2605
|
export type TraderTrust = {
|
|
2105
2606
|
total_pnl: TrustMetadata;
|
|
@@ -2111,6 +2612,8 @@ export type TraderTrust = {
|
|
|
2111
2612
|
total_volume: TrustMetadata;
|
|
2112
2613
|
grade: TrustMetadata;
|
|
2113
2614
|
score: TrustMetadata;
|
|
2615
|
+
forecast_score: TrustMetadata;
|
|
2616
|
+
forecast_evidence: TrustMetadata;
|
|
2114
2617
|
rank: TrustMetadata;
|
|
2115
2618
|
streak_tier: TrustMetadata;
|
|
2116
2619
|
strategy: TrustMetadata;
|
|
@@ -2277,7 +2780,7 @@ export type WebhookEndpoint = {
|
|
|
2277
2780
|
signing_secret?: string;
|
|
2278
2781
|
verification?: WebhookVerification;
|
|
2279
2782
|
};
|
|
2280
|
-
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (whale_trades_inserted, wallet_grade_changed, insider_radar_flag_raised, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. */
|
|
2783
|
+
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (large_trades_inserted, whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, sharp_money_flow_detected, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. Export lifecycle event types (export_job_ready, export_job_failed, export_job_expired, export_job_cancelled) are owner-scoped to the API-key account that created the export and contain no download URL; use the authorized export status/download routes. Some entries are two spellings of one event: large_trades_inserted and whale_trades_inserted, trader_synced and whale_trader_synced, suspicious_trade_flagged and insider_radar_flag_raised, sharp_money_flow_detected and smart_money_flow_detected. Either spelling subscribes, and an endpoint receives deliveries under the spelling it registered. */
|
|
2281
2784
|
export type WebhookEventDescriptor = {
|
|
2282
2785
|
id: WebhookEventType;
|
|
2283
2786
|
/** One-line description of when the event fires. */
|
|
@@ -2287,7 +2790,7 @@ export type WebhookEventDescriptor = {
|
|
|
2287
2790
|
/** active: the event has a firing producer callsite. dormant: advertised and subscribable, but does not yet enqueue any delivery. */
|
|
2288
2791
|
status: "active" | "dormant";
|
|
2289
2792
|
};
|
|
2290
|
-
export type WebhookEventType = "whale_trades_inserted" | "live_sports_updated" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "insider_radar_flag_raised" | "smart_money_flow_detected";
|
|
2793
|
+
export type WebhookEventType = "large_trades_inserted" | "whale_trades_inserted" | "live_sports_updated" | "trader_synced" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "suspicious_trade_flagged" | "insider_radar_flag_raised" | "sharp_money_flow_detected" | "smart_money_flow_detected" | "export_job_ready" | "export_job_failed" | "export_job_expired" | "export_job_cancelled";
|
|
2291
2794
|
export type WebhookRetryPolicy = {
|
|
2292
2795
|
max_attempts: 8;
|
|
2293
2796
|
terminal_status: "dead_letter";
|
|
@@ -2308,67 +2811,6 @@ export type WebhookVerification = {
|
|
|
2308
2811
|
token: string;
|
|
2309
2812
|
expires_at: string;
|
|
2310
2813
|
};
|
|
2311
|
-
export type WhaleTrade = {
|
|
2312
|
-
/** Prefixed ID (wt_...). */
|
|
2313
|
-
id: string;
|
|
2314
|
-
traded_at: string;
|
|
2315
|
-
size_usd: number;
|
|
2316
|
-
side: "BUY" | "SELL";
|
|
2317
|
-
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, whose stored outcome_index is not trusted (a defaulted 0 for about a third of those rows; the side is unknown, not defaulted). */
|
|
2318
|
-
outcome: string | null;
|
|
2319
|
-
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
|
|
2320
|
-
token_id: string | null;
|
|
2321
|
-
price: number;
|
|
2322
|
-
/** Current 0.0–1.0 normalized signal score, computed at request time from the trader's win rate today and the trade's age now. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_signal_score for that. */
|
|
2323
|
-
signal_score: number;
|
|
2324
|
-
/** 0.0–1.0 signal score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. */
|
|
2325
|
-
recorded_signal_score: number | null;
|
|
2326
|
-
/** Persisted live suspicion score from the scorer. Null when the row has no persisted score. */
|
|
2327
|
-
suspicion_score: number | null;
|
|
2328
|
-
/** Persisted scorer track. Null when a legacy row has no stored track label. */
|
|
2329
|
-
suspicion_track: "whale" | "fresh_conviction" | "sliced_position" | null;
|
|
2330
|
-
/** This fill's size relative to its market: size_usd divided by the market's volume at the moment the trade was inserted. 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 the market carried no volume figure and on rows written before 2026-09-16; never 0 as a stand-in. Not capped at 1: a fill larger than the stored trailing volume is real, and that is the most significant case. */
|
|
2331
|
-
market_volume_share?: number;
|
|
2332
|
-
trader: {
|
|
2333
|
-
id: string;
|
|
2334
|
-
address: string;
|
|
2335
|
-
username?: string;
|
|
2336
|
-
/** The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade. */
|
|
2337
|
-
grade?: string;
|
|
2338
|
-
/** The grade the trader held when the trade happened, from recorded grade history (recorded from 2026-09-19T23:00Z). Null unless grade_at_trade_status is graded. Never today's grade projected backward. */
|
|
2339
|
-
grade_at_trade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2340
|
-
/** graded: grade_at_trade holds the recorded grade. ungraded: the trader was recorded without a grade at that moment. unknown: no record covers the moment, which is every trade before 2026-09-19T23:00Z and a trade that fell between a grade change and its confirmation. unknown never means ungraded. */
|
|
2341
|
-
grade_at_trade_status: "graded" | "ungraded" | "unknown";
|
|
2342
|
-
};
|
|
2343
|
-
market: {
|
|
2344
|
-
id: string;
|
|
2345
|
-
condition_id: string;
|
|
2346
|
-
title: string;
|
|
2347
|
-
slug?: string;
|
|
2348
|
-
/** Provider-backed market_canonical category. */
|
|
2349
|
-
category?: string;
|
|
2350
|
-
};
|
|
2351
|
-
};
|
|
2352
|
-
export type WhaleTradeDetail = WhaleTrade & {
|
|
2353
|
-
counterparty_analysis: CounterpartyAnalysis;
|
|
2354
|
-
};
|
|
2355
|
-
export type WhaleTradeHistoryMeta = {
|
|
2356
|
-
/** Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines. */
|
|
2357
|
-
request_id: string;
|
|
2358
|
-
cached: boolean;
|
|
2359
|
-
/** Cache age in seconds; the key is absent when the response was not cached. */
|
|
2360
|
-
cache_age_s?: number;
|
|
2361
|
-
source: {
|
|
2362
|
-
kind: "local_replay";
|
|
2363
|
-
table: "whale_alerts";
|
|
2364
|
-
provider_fetch_at_request_time: false;
|
|
2365
|
-
};
|
|
2366
|
-
completeness: {
|
|
2367
|
-
status: "best_effort";
|
|
2368
|
-
/** Explains that local replay completeness can vary by market and time window. */
|
|
2369
|
-
reason: string;
|
|
2370
|
-
};
|
|
2371
|
-
};
|
|
2372
2814
|
/**
|
|
2373
2815
|
* The `data` payload each operation answers with: what
|
|
2374
2816
|
* `ApiClient.call<T>` resolves to, and the default `T` of every
|
|
@@ -2378,6 +2820,55 @@ export interface OperationData {
|
|
|
2378
2820
|
activateWebhookSecret: WebhookEndpoint;
|
|
2379
2821
|
batchGetMarketIntel: BatchMarketIntelItem[];
|
|
2380
2822
|
batchGetTraders: BatchTraderItem[];
|
|
2823
|
+
cancelTraderExport: {
|
|
2824
|
+
job_id: number;
|
|
2825
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2826
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
2827
|
+
format: "json" | "ndjson" | "csv";
|
|
2828
|
+
total_trades: number | null;
|
|
2829
|
+
processed_trades: number | null;
|
|
2830
|
+
file_size: number | null;
|
|
2831
|
+
error: string | null;
|
|
2832
|
+
/** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
|
|
2833
|
+
terminal: boolean;
|
|
2834
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2835
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2836
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
|
|
2837
|
+
poll_after_s?: number;
|
|
2838
|
+
created_at: string;
|
|
2839
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2840
|
+
started_at: string | null;
|
|
2841
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2842
|
+
ready_at: string | null;
|
|
2843
|
+
failed_at: string | null;
|
|
2844
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2845
|
+
expires_at: string;
|
|
2846
|
+
/** When the job became expired; null until then. */
|
|
2847
|
+
expired_at: string | null;
|
|
2848
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2849
|
+
data_as_of: string | null;
|
|
2850
|
+
/** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
|
|
2851
|
+
cancel_requested_at: string | null;
|
|
2852
|
+
/** When the job reached cancelled; null until then. */
|
|
2853
|
+
cancelled_at: string | null;
|
|
2854
|
+
/** Worker claims so far. */
|
|
2855
|
+
attempt: number;
|
|
2856
|
+
/** The job fails when attempt reaches this. */
|
|
2857
|
+
max_attempts: number;
|
|
2858
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2859
|
+
artifact?: {
|
|
2860
|
+
/** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
|
|
2861
|
+
artifact_id: string;
|
|
2862
|
+
/** The storage ETag of the object. */
|
|
2863
|
+
etag: string | null;
|
|
2864
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2865
|
+
compressed_size_bytes: number | null;
|
|
2866
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2867
|
+
content_encoding: "gzip";
|
|
2868
|
+
/** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
|
|
2869
|
+
manifest: TraderExportArtifactManifest | null;
|
|
2870
|
+
};
|
|
2871
|
+
};
|
|
2381
2872
|
createMcpJsonRpcResponse: {
|
|
2382
2873
|
jsonrpc: "2.0";
|
|
2383
2874
|
id: string | number | null;
|
|
@@ -2407,6 +2898,7 @@ export interface OperationData {
|
|
|
2407
2898
|
getApiDiscovery: ApiDiscovery;
|
|
2408
2899
|
getDailyReportSnapshot: ReportSnapshot;
|
|
2409
2900
|
getEventReplaySince: EventReplayEvent[];
|
|
2901
|
+
getGame: Game;
|
|
2410
2902
|
getHealth: {
|
|
2411
2903
|
status?: "ok" | "degraded" | "down" | "maintenance";
|
|
2412
2904
|
db?: boolean;
|
|
@@ -2429,7 +2921,8 @@ export interface OperationData {
|
|
|
2429
2921
|
};
|
|
2430
2922
|
};
|
|
2431
2923
|
};
|
|
2432
|
-
getInsiderRadarFlag:
|
|
2924
|
+
getInsiderRadarFlag: SuspiciousTrade;
|
|
2925
|
+
getLargeTrade: LargeTradeDetail;
|
|
2433
2926
|
getMarketCandles: MarketCandles;
|
|
2434
2927
|
getMarketContextMarkdown: string;
|
|
2435
2928
|
getMarketHolders: MarketHolder[];
|
|
@@ -2444,6 +2937,7 @@ export interface OperationData {
|
|
|
2444
2937
|
getPositionTimelineById: PositionTimelineEvent[];
|
|
2445
2938
|
getReports: ReportSnapshot;
|
|
2446
2939
|
getStream: string;
|
|
2940
|
+
getSuspiciousTrade: SuspiciousTrade;
|
|
2447
2941
|
getTrader: Trader;
|
|
2448
2942
|
getTraderCategoryRecords: TraderCategoryRecords;
|
|
2449
2943
|
getTraderContext: TraderContext;
|
|
@@ -2451,12 +2945,52 @@ export interface OperationData {
|
|
|
2451
2945
|
getTraderExportSnapshot: TraderExportSnapshot;
|
|
2452
2946
|
getTraderExportStatus: {
|
|
2453
2947
|
job_id: number;
|
|
2454
|
-
|
|
2948
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2949
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
2455
2950
|
format: "json" | "ndjson" | "csv";
|
|
2456
2951
|
total_trades: number | null;
|
|
2457
2952
|
processed_trades: number | null;
|
|
2458
2953
|
file_size: number | null;
|
|
2459
2954
|
error: string | null;
|
|
2955
|
+
/** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
|
|
2956
|
+
terminal: boolean;
|
|
2957
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2958
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2959
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
|
|
2960
|
+
poll_after_s?: number;
|
|
2961
|
+
created_at: string;
|
|
2962
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2963
|
+
started_at: string | null;
|
|
2964
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2965
|
+
ready_at: string | null;
|
|
2966
|
+
failed_at: string | null;
|
|
2967
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2968
|
+
expires_at: string;
|
|
2969
|
+
/** When the job became expired; null until then. */
|
|
2970
|
+
expired_at: string | null;
|
|
2971
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2972
|
+
data_as_of: string | null;
|
|
2973
|
+
/** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
|
|
2974
|
+
cancel_requested_at: string | null;
|
|
2975
|
+
/** When the job reached cancelled; null until then. */
|
|
2976
|
+
cancelled_at: string | null;
|
|
2977
|
+
/** Worker claims so far. */
|
|
2978
|
+
attempt: number;
|
|
2979
|
+
/** The job fails when attempt reaches this. */
|
|
2980
|
+
max_attempts: number;
|
|
2981
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2982
|
+
artifact?: {
|
|
2983
|
+
/** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
|
|
2984
|
+
artifact_id: string;
|
|
2985
|
+
/** The storage ETag of the object. */
|
|
2986
|
+
etag: string | null;
|
|
2987
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2988
|
+
compressed_size_bytes: number | null;
|
|
2989
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2990
|
+
content_encoding: "gzip";
|
|
2991
|
+
/** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
|
|
2992
|
+
manifest: TraderExportArtifactManifest | null;
|
|
2993
|
+
};
|
|
2460
2994
|
};
|
|
2461
2995
|
getTraderPnl: TraderPnl;
|
|
2462
2996
|
getUsage: {
|
|
@@ -2496,23 +3030,31 @@ export interface OperationData {
|
|
|
2496
3030
|
};
|
|
2497
3031
|
getWebhook: WebhookEndpoint;
|
|
2498
3032
|
getWeeklyReportSnapshot: ReportSnapshot;
|
|
2499
|
-
getWhaleTrade:
|
|
2500
|
-
|
|
3033
|
+
getWhaleTrade: LargeTradeDetail;
|
|
3034
|
+
listGames: Game[];
|
|
3035
|
+
listInsiderRadar: SuspiciousTrade[];
|
|
2501
3036
|
listLargePositions: LargePosition[];
|
|
3037
|
+
listLargeTradeCounterpartyExecutions: CounterpartyAnalysis;
|
|
3038
|
+
listLargeTradeCounterpartyMakers: CounterpartyMakerPage;
|
|
3039
|
+
listLargeTradeHistory: LargeTrade[];
|
|
3040
|
+
listLargeTrades: LargeTrade[];
|
|
2502
3041
|
listLeaderboard: LeaderboardEntry[];
|
|
2503
3042
|
listPositions: Position[];
|
|
3043
|
+
listPreGameSideObservations: PreGameSideObservation[];
|
|
3044
|
+
listPreGameSides: PreGameSide[];
|
|
2504
3045
|
listSharpMoneyFlows: SmartMoneyFlowMarket[];
|
|
2505
3046
|
listSmartMoneyFlows: SmartMoneyFlowMarket[];
|
|
2506
|
-
listSportsEdgeObservations:
|
|
2507
|
-
listSportsEdgeSignals:
|
|
3047
|
+
listSportsEdgeObservations: PreGameSideObservation[];
|
|
3048
|
+
listSportsEdgeSignals: PreGameSide[];
|
|
3049
|
+
listSuspiciousTrades: SuspiciousTrade[];
|
|
2508
3050
|
listTrendingWallets: TrendingWallet[];
|
|
2509
3051
|
listWebhookDeliveries: WebhookDelivery[];
|
|
2510
3052
|
listWebhookEvents: WebhookEventDescriptor[];
|
|
2511
3053
|
listWebhooks: WebhookEndpoint[];
|
|
2512
3054
|
listWhaleTradeCounterpartyExecutions: CounterpartyAnalysis;
|
|
2513
3055
|
listWhaleTradeCounterpartyMakers: CounterpartyMakerPage;
|
|
2514
|
-
listWhaleTradeHistory:
|
|
2515
|
-
listWhaleTrades:
|
|
3056
|
+
listWhaleTradeHistory: LargeTrade[];
|
|
3057
|
+
listWhaleTrades: LargeTrade[];
|
|
2516
3058
|
prepareWebhookSecret: WebhookEndpoint;
|
|
2517
3059
|
redeliverWebhookDelivery: WebhookDelivery;
|
|
2518
3060
|
registerAgent: AgentRegistration;
|
|
@@ -2522,12 +3064,52 @@ export interface OperationData {
|
|
|
2522
3064
|
searchMarkets: MarketSearchResult[];
|
|
2523
3065
|
submitTraderExport: {
|
|
2524
3066
|
job_id: number;
|
|
2525
|
-
|
|
3067
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. cancel_requested: the owner cancelled a running job (POST /api/v1/trader/{address}/export/cancel); the worker stops at its next safe point and the job reads cancelled. cancelled: terminal; the owner cancelled the job and no file was published; submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed, cancelled and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
3068
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
2526
3069
|
format: "json" | "ndjson" | "csv";
|
|
2527
3070
|
total_trades: number | null;
|
|
2528
3071
|
processed_trades: number | null;
|
|
2529
3072
|
file_size: number | null;
|
|
2530
3073
|
error: string | null;
|
|
3074
|
+
/** True when status never changes again (ready, failed, expired, cancelled). Stop polling. */
|
|
3075
|
+
terminal: boolean;
|
|
3076
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
3077
|
+
next_action: "poll" | "download" | "resubmit";
|
|
3078
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued, running or cancel_requested; 300 while reconcile_required, the cadence that state can change at. */
|
|
3079
|
+
poll_after_s?: number;
|
|
3080
|
+
created_at: string;
|
|
3081
|
+
/** When the worker last claimed the job; null while queued. */
|
|
3082
|
+
started_at: string | null;
|
|
3083
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
3084
|
+
ready_at: string | null;
|
|
3085
|
+
failed_at: string | null;
|
|
3086
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
3087
|
+
expires_at: string;
|
|
3088
|
+
/** When the job became expired; null until then. */
|
|
3089
|
+
expired_at: string | null;
|
|
3090
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
3091
|
+
data_as_of: string | null;
|
|
3092
|
+
/** When the owner asked to cancel the job; null otherwise. Set on every cancelled job, including one cancelled while queued. While status is cancel_requested this is the instant the worker was asked to stop. */
|
|
3093
|
+
cancel_requested_at: string | null;
|
|
3094
|
+
/** When the job reached cancelled; null until then. */
|
|
3095
|
+
cancelled_at: string | null;
|
|
3096
|
+
/** Worker claims so far. */
|
|
3097
|
+
attempt: number;
|
|
3098
|
+
/** The job fails when attempt reaches this. */
|
|
3099
|
+
max_attempts: number;
|
|
3100
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
3101
|
+
artifact?: {
|
|
3102
|
+
/** Stable identity for this completed export artifact; unchanged when a temporary download URL is renewed. */
|
|
3103
|
+
artifact_id: string;
|
|
3104
|
+
/** The storage ETag of the object. */
|
|
3105
|
+
etag: string | null;
|
|
3106
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
3107
|
+
compressed_size_bytes: number | null;
|
|
3108
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
3109
|
+
content_encoding: "gzip";
|
|
3110
|
+
/** Immutable manifest for artifacts generated with manifest support; null on historical artifacts written before this contract. */
|
|
3111
|
+
manifest: TraderExportArtifactManifest | null;
|
|
3112
|
+
};
|
|
2531
3113
|
};
|
|
2532
3114
|
updateWebhook: WebhookEndpoint;
|
|
2533
3115
|
verifyWebhook: WebhookEndpoint;
|
|
@@ -2537,6 +3119,10 @@ export interface OperationQuery {
|
|
|
2537
3119
|
activateWebhookSecret: Record<string, never>;
|
|
2538
3120
|
batchGetMarketIntel: Record<string, never>;
|
|
2539
3121
|
batchGetTraders: Record<string, never>;
|
|
3122
|
+
cancelTraderExport: {
|
|
3123
|
+
/** Export job id returned by the submit route. */
|
|
3124
|
+
job_id: number;
|
|
3125
|
+
};
|
|
2540
3126
|
createMcpJsonRpcResponse: Record<string, never>;
|
|
2541
3127
|
createWebhook: Record<string, never>;
|
|
2542
3128
|
deleteWebhook: Record<string, never>;
|
|
@@ -2578,8 +3164,10 @@ export interface OperationQuery {
|
|
|
2578
3164
|
/** Repeatable. trade adds the public trade read to every event (the object GET /api/v1/whale-trades/{id} returns for it), from one query per page, so a page of 100 events needs no per-event detail request. Not bound to the cursor: switch it on or off mid-walk. */
|
|
2579
3165
|
expand?: "trade"[];
|
|
2580
3166
|
};
|
|
3167
|
+
getGame: Record<string, never>;
|
|
2581
3168
|
getHealth: Record<string, never>;
|
|
2582
3169
|
getInsiderRadarFlag: Record<string, never>;
|
|
3170
|
+
getLargeTrade: Record<string, never>;
|
|
2583
3171
|
getMarketCandles: {
|
|
2584
3172
|
/** Bucketing granularity. 1d aggregates by UTC calendar day, 1w by ISO week (Monday 00:00 UTC start). Defaults to 1d. */
|
|
2585
3173
|
resolution?: "1d" | "1w";
|
|
@@ -2651,6 +3239,7 @@ export interface OperationQuery {
|
|
|
2651
3239
|
/** Optional per-connection subscribe-time filter. A frame passes only when it carries a grade field whose grade is better-or-equal to this minimum (S is best). Frames that carry no grade field (every frame except wallet_grade_changed) are EXCLUDED while this is set. An invalid grade returns HTTP 400. Combines with event and condition_id as a logical AND; an absent param adds no constraint. */
|
|
2652
3240
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2653
3241
|
};
|
|
3242
|
+
getSuspiciousTrade: Record<string, never>;
|
|
2654
3243
|
getTrader: {
|
|
2655
3244
|
/** Backward-compatible alias for expand. Repeatable: strategy, categories, quant_metrics, trust. */
|
|
2656
3245
|
"expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
@@ -2668,7 +3257,16 @@ export interface OperationQuery {
|
|
|
2668
3257
|
/** Export job id returned by the submit route. */
|
|
2669
3258
|
job_id: number;
|
|
2670
3259
|
};
|
|
2671
|
-
getTraderPnl:
|
|
3260
|
+
getTraderPnl: {
|
|
3261
|
+
/** Inclusive UTC calendar-date lower bound in YYYY-MM-DD form for the daily series (entries and drawdown). Omit for the whole stored history. A value that is not a calendar date, or a from later than to, returns 400 bad_request with error.param from. Does not change stats, monthly or year_totals, which stay defined over the full history. */
|
|
3262
|
+
from?: string;
|
|
3263
|
+
/** Inclusive UTC calendar-date upper bound in YYYY-MM-DD form for the daily series (entries and drawdown). Omit for the whole stored history. A value that is not a calendar date returns 400 bad_request with error.param to. Does not change stats, monthly or year_totals. */
|
|
3264
|
+
to?: string;
|
|
3265
|
+
/** Which sections of the object to return. Repeatable and comma-separated: entries, stats, monthly, year_totals, drawdown. Omit it, or send it empty, for all five. A section left out is absent from data. An unrecognized name returns 400 bad_request with error.param sections rather than being ignored, so a typo cannot look like a successful request that silently dropped the section you came for. */
|
|
3266
|
+
sections?: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
3267
|
+
/** Backward-compatible bracket alias for sections, for clients that emit array keys. Repeatable and comma-separated: entries, stats, monthly, year_totals, drawdown. */
|
|
3268
|
+
"sections[]"?: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
3269
|
+
};
|
|
2672
3270
|
getUsage: Record<string, never>;
|
|
2673
3271
|
getWebhook: Record<string, never>;
|
|
2674
3272
|
getWeeklyReportSnapshot: {
|
|
@@ -2680,6 +3278,22 @@ export interface OperationQuery {
|
|
|
2680
3278
|
week?: string;
|
|
2681
3279
|
};
|
|
2682
3280
|
getWhaleTrade: Record<string, never>;
|
|
3281
|
+
listGames: {
|
|
3282
|
+
/** 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. */
|
|
3283
|
+
sport?: string;
|
|
3284
|
+
/** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2. Omit for every league inside the selected sports. */
|
|
3285
|
+
league?: string;
|
|
3286
|
+
/** Keep only games in this state. A value outside the enum returns an empty page. */
|
|
3287
|
+
status?: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
3288
|
+
/** RFC 3339 instant. Keep only games whose kickoff is at or after it. Games with no published kickoff are excluded whenever either bound is set. */
|
|
3289
|
+
starts_after?: string;
|
|
3290
|
+
/** RFC 3339 instant. Keep only games whose kickoff is at or before it. Must be at or after starts_after. */
|
|
3291
|
+
starts_before?: string;
|
|
3292
|
+
/** Page size. */
|
|
3293
|
+
limit?: number;
|
|
3294
|
+
/** Opaque gms_v1_ cursor from next_cursor. It pins the page position (kickoff and event_slug), not a snapshot: the catalog is live, so a game added or removed between pages moves with it. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
|
|
3295
|
+
cursor?: string;
|
|
3296
|
+
};
|
|
2683
3297
|
listInsiderRadar: {
|
|
2684
3298
|
/** Maximum number of radar flags to return. */
|
|
2685
3299
|
limit?: number;
|
|
@@ -2706,6 +3320,68 @@ export interface OperationQuery {
|
|
|
2706
3320
|
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id (round-trips a value from a list response). Polymarket-only; an unknown id returns []. */
|
|
2707
3321
|
condition_id?: string;
|
|
2708
3322
|
};
|
|
3323
|
+
listLargeTradeCounterpartyExecutions: {
|
|
3324
|
+
/** Counterparty snapshot ID from the large trade detail response. */
|
|
3325
|
+
snapshot_id: string;
|
|
3326
|
+
/** Opaque cursor from the previous response's next_cursor. */
|
|
3327
|
+
cursor?: string;
|
|
3328
|
+
/** Maximum number of counterparty execution rows to return. */
|
|
3329
|
+
limit?: number;
|
|
3330
|
+
};
|
|
3331
|
+
listLargeTradeCounterpartyMakers: {
|
|
3332
|
+
/** Counterparty snapshot ID from the large trade detail response. */
|
|
3333
|
+
snapshot_id: string;
|
|
3334
|
+
/** Opaque cursor from the previous response's next_cursor. */
|
|
3335
|
+
cursor?: string;
|
|
3336
|
+
/** Maximum number of maker rows to return. */
|
|
3337
|
+
limit?: number;
|
|
3338
|
+
};
|
|
3339
|
+
listLargeTradeHistory: {
|
|
3340
|
+
/** Maximum number of historical large trades to return. */
|
|
3341
|
+
limit?: number;
|
|
3342
|
+
/** Pagination cursor from previous response's next_cursor. Prefix: wth_. URL-encode when replaying as a query parameter. */
|
|
3343
|
+
cursor?: string;
|
|
3344
|
+
/** Minimum trade size in USD. The capture floor was 3,000 USD before 2026-07-06 and 10,000 USD from then (1,000 USD in earnings markets), so 10000 gives one size rule across the whole archive. From 2026-09-23 a fill must also be at least 0.1% of its market's recorded traded volume (Polymarket's own share count); rows written before that date were not re-filtered. */
|
|
3345
|
+
min_size?: number;
|
|
3346
|
+
/** Exact raw provider condition_id. Unknown markets return an empty list. */
|
|
3347
|
+
condition_id?: string;
|
|
3348
|
+
/** Trader wallet address, timestamp-suffixed wallet alias, username, or trd_-prefixed trader ID, resolved against the traders table. Unknown traders return an empty list. */
|
|
3349
|
+
trader?: string;
|
|
3350
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
3351
|
+
category?: string;
|
|
3352
|
+
/** Minimum trader grade as of today (trader.grade), not at trade time. On a historical window it selects wallets by a grade they may have earned after the trade; for a point-in-time rule filter on trader.grade_at_trade instead. A means S or A, B means S, A or B. */
|
|
3353
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3354
|
+
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
3355
|
+
suspicious_only?: boolean;
|
|
3356
|
+
/** Filter by whale_alerts.platform. all is equivalent to omitted. */
|
|
3357
|
+
platform?: "polymarket" | "all";
|
|
3358
|
+
/** Inclusive RFC3339 lower bound on whale_alerts.traded_at. */
|
|
3359
|
+
from?: string;
|
|
3360
|
+
/** Exclusive RFC3339 upper bound on whale_alerts.traded_at. Must be after from when both are present. */
|
|
3361
|
+
to?: string;
|
|
3362
|
+
/** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */
|
|
3363
|
+
min_market_volume_share?: number;
|
|
3364
|
+
/** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads from, or the last 30 days when from is omitted, for the same reason. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
|
|
3365
|
+
sort?: "recent" | "market_volume_share";
|
|
3366
|
+
};
|
|
3367
|
+
listLargeTrades: {
|
|
3368
|
+
/** Maximum number of recent large trades to return. */
|
|
3369
|
+
limit?: number;
|
|
3370
|
+
/** Pagination cursor from previous response's next_cursor. */
|
|
3371
|
+
cursor?: string;
|
|
3372
|
+
/** Minimum trade size in USD. */
|
|
3373
|
+
min_size?: number;
|
|
3374
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
3375
|
+
category?: string;
|
|
3376
|
+
/** Minimum trader grade. */
|
|
3377
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3378
|
+
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
3379
|
+
suspicious_only?: boolean;
|
|
3380
|
+
/** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */
|
|
3381
|
+
min_market_volume_share?: number;
|
|
3382
|
+
/** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
|
|
3383
|
+
sort?: "recent" | "market_volume_share";
|
|
3384
|
+
};
|
|
2709
3385
|
listLeaderboard: {
|
|
2710
3386
|
/** Maximum number of ranked traders to return. */
|
|
2711
3387
|
limit?: number;
|
|
@@ -2736,6 +3412,28 @@ export interface OperationQuery {
|
|
|
2736
3412
|
/** Filter by the binary outcome side. `yes` maps to outcome_index=0, `no` to outcome_index=1. */
|
|
2737
3413
|
side?: "yes" | "no";
|
|
2738
3414
|
};
|
|
3415
|
+
listPreGameSideObservations: {
|
|
3416
|
+
/** 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. */
|
|
3417
|
+
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
3418
|
+
/** 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. */
|
|
3419
|
+
category?: string;
|
|
3420
|
+
/** Page size. */
|
|
3421
|
+
limit?: number;
|
|
3422
|
+
/** 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. */
|
|
3423
|
+
cursor?: string;
|
|
3424
|
+
};
|
|
3425
|
+
listPreGameSides: {
|
|
3426
|
+
/** 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. */
|
|
3427
|
+
category?: string;
|
|
3428
|
+
/** Page size. */
|
|
3429
|
+
limit?: number;
|
|
3430
|
+
/** 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. */
|
|
3431
|
+
cursor?: string;
|
|
3432
|
+
/** Kickoff ceiling in hours from now; the floor is now (only games not yet started). Clamped to 1..48. */
|
|
3433
|
+
horizon_hours?: number;
|
|
3434
|
+
/** 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. */
|
|
3435
|
+
min_grade?: "S" | "A" | "B";
|
|
3436
|
+
};
|
|
2739
3437
|
listSharpMoneyFlows: {
|
|
2740
3438
|
/** Lookback window for grade-filtered whale flow aggregation. */
|
|
2741
3439
|
timeframe?: "1h" | "4h" | "24h" | "7d";
|
|
@@ -2790,6 +3488,18 @@ export interface OperationQuery {
|
|
|
2790
3488
|
/** 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. */
|
|
2791
3489
|
min_grade?: "S" | "A" | "B";
|
|
2792
3490
|
};
|
|
3491
|
+
listSuspiciousTrades: {
|
|
3492
|
+
/** Maximum number of suspicious trades to return. */
|
|
3493
|
+
limit?: number;
|
|
3494
|
+
/** Pagination cursor from previous response. */
|
|
3495
|
+
cursor?: string;
|
|
3496
|
+
/** Minimum suspicion score (0-100). The live flag floor of 60 also applies. */
|
|
3497
|
+
min_suspicion?: number;
|
|
3498
|
+
/** Compatible filter. flag selects live threshold crossings. watch returns no rows because no live watch policy exists. */
|
|
3499
|
+
severity?: "flag" | "watch";
|
|
3500
|
+
/** Pagination mode. live (default) keeps the 120-second response cache; stable pins the walk to one published scoring generation and binds the cursor to the limit and filters. */
|
|
3501
|
+
mode?: "live" | "stable";
|
|
3502
|
+
};
|
|
2793
3503
|
listTrendingWallets: {
|
|
2794
3504
|
/** Polymarket's weekly leaderboard caps the ranked set at 50 wallets; requests above 50 still return at most 50. */
|
|
2795
3505
|
limit?: number;
|
|
@@ -2827,15 +3537,15 @@ export interface OperationQuery {
|
|
|
2827
3537
|
limit?: number;
|
|
2828
3538
|
/** Pagination cursor from previous response's next_cursor. Prefix: wth_. URL-encode when replaying as a query parameter. */
|
|
2829
3539
|
cursor?: string;
|
|
2830
|
-
/** Minimum trade size in USD.
|
|
3540
|
+
/** Minimum trade size in USD. */
|
|
2831
3541
|
min_size?: number;
|
|
2832
3542
|
/** Exact raw provider condition_id. Unknown markets return an empty list. */
|
|
2833
3543
|
condition_id?: string;
|
|
2834
|
-
/** Trader wallet address, timestamp-suffixed wallet alias,
|
|
3544
|
+
/** Trader wallet address, timestamp-suffixed wallet alias, or username resolved against the traders table. Unknown traders return an empty list. */
|
|
2835
3545
|
trader?: string;
|
|
2836
3546
|
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
2837
3547
|
category?: string;
|
|
2838
|
-
/** Minimum trader grade
|
|
3548
|
+
/** Minimum trader grade. */
|
|
2839
3549
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2840
3550
|
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
2841
3551
|
suspicious_only?: boolean;
|
|
@@ -2845,6 +3555,10 @@ export interface OperationQuery {
|
|
|
2845
3555
|
from?: string;
|
|
2846
3556
|
/** Exclusive RFC3339 upper bound on whale_alerts.traded_at. Must be after from when both are present. */
|
|
2847
3557
|
to?: string;
|
|
3558
|
+
/** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */
|
|
3559
|
+
min_market_volume_share?: number;
|
|
3560
|
+
/** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads from, or the last 30 days when from is omitted, for the same reason. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
|
|
3561
|
+
sort?: "recent" | "market_volume_share";
|
|
2848
3562
|
};
|
|
2849
3563
|
listWhaleTrades: {
|
|
2850
3564
|
/** Maximum number of recent large trades to return. */
|
|
@@ -2859,6 +3573,10 @@ export interface OperationQuery {
|
|
|
2859
3573
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2860
3574
|
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
2861
3575
|
suspicious_only?: boolean;
|
|
3576
|
+
/** Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor. */
|
|
3577
|
+
min_market_volume_share?: number;
|
|
3578
|
+
/** Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other. */
|
|
3579
|
+
sort?: "recent" | "market_volume_share";
|
|
2862
3580
|
};
|
|
2863
3581
|
prepareWebhookSecret: Record<string, never>;
|
|
2864
3582
|
redeliverWebhookDelivery: Record<string, never>;
|
|
@@ -2886,6 +3604,8 @@ export interface OperationQuery {
|
|
|
2886
3604
|
submitTraderExport: {
|
|
2887
3605
|
/** Output serialization. json = full envelope document (default); ndjson = full envelope as line 1 then one trade object per line; csv = flat trades rows only. */
|
|
2888
3606
|
format?: "json" | "ndjson" | "csv";
|
|
3607
|
+
/** true: do not reuse a finished, running or reconciling job; only a queued job is reused, so the file is a snapshot read after this submit. Consumes quota when nothing is queued. Default false. */
|
|
3608
|
+
fresh?: boolean;
|
|
2889
3609
|
};
|
|
2890
3610
|
updateWebhook: Record<string, never>;
|
|
2891
3611
|
verifyWebhook: Record<string, never>;
|
|
@@ -2898,6 +3618,10 @@ export interface OperationPath {
|
|
|
2898
3618
|
};
|
|
2899
3619
|
batchGetMarketIntel: Record<string, never>;
|
|
2900
3620
|
batchGetTraders: Record<string, never>;
|
|
3621
|
+
cancelTraderExport: {
|
|
3622
|
+
/** Trader wallet address (0x...), known trader username-style lookup, or trd_-prefixed trader ID emitted by this API. */
|
|
3623
|
+
address: string;
|
|
3624
|
+
};
|
|
2901
3625
|
createMcpJsonRpcResponse: Record<string, never>;
|
|
2902
3626
|
createWebhook: Record<string, never>;
|
|
2903
3627
|
deleteWebhook: {
|
|
@@ -2909,11 +3633,19 @@ export interface OperationPath {
|
|
|
2909
3633
|
getApiDiscovery: Record<string, never>;
|
|
2910
3634
|
getDailyReportSnapshot: Record<string, never>;
|
|
2911
3635
|
getEventReplaySince: Record<string, never>;
|
|
3636
|
+
getGame: {
|
|
3637
|
+
/** The game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively. */
|
|
3638
|
+
event_slug: string;
|
|
3639
|
+
};
|
|
2912
3640
|
getHealth: Record<string, never>;
|
|
2913
3641
|
getInsiderRadarFlag: {
|
|
2914
3642
|
/** Raw whale_alerts.id or rf_-prefixed radar flag id. */
|
|
2915
3643
|
id: string;
|
|
2916
3644
|
};
|
|
3645
|
+
getLargeTrade: {
|
|
3646
|
+
/** Raw whale_alerts.id or wt_-prefixed large trade id. */
|
|
3647
|
+
id: string;
|
|
3648
|
+
};
|
|
2917
3649
|
getMarketCandles: {
|
|
2918
3650
|
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or /api/v1/markets/explore, or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
2919
3651
|
condition_id: string;
|
|
@@ -2949,6 +3681,10 @@ export interface OperationPath {
|
|
|
2949
3681
|
};
|
|
2950
3682
|
getReports: Record<string, never>;
|
|
2951
3683
|
getStream: Record<string, never>;
|
|
3684
|
+
getSuspiciousTrade: {
|
|
3685
|
+
/** Raw whale_alerts.id or rf_-prefixed suspicious trade id. */
|
|
3686
|
+
id: string;
|
|
3687
|
+
};
|
|
2952
3688
|
getTrader: {
|
|
2953
3689
|
/** Ethereum wallet address (0x...), known trader username, or trd_-prefixed trader ID emitted by this API. */
|
|
2954
3690
|
address: string;
|
|
@@ -2987,14 +3723,30 @@ export interface OperationPath {
|
|
|
2987
3723
|
/** Raw whale_alerts.id or wt_-prefixed whale trade id. */
|
|
2988
3724
|
id: string;
|
|
2989
3725
|
};
|
|
3726
|
+
listGames: Record<string, never>;
|
|
2990
3727
|
listInsiderRadar: Record<string, never>;
|
|
2991
3728
|
listLargePositions: Record<string, never>;
|
|
3729
|
+
listLargeTradeCounterpartyExecutions: {
|
|
3730
|
+
/** Large trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3731
|
+
id: string;
|
|
3732
|
+
};
|
|
3733
|
+
listLargeTradeCounterpartyMakers: {
|
|
3734
|
+
/** Large trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3735
|
+
id: string;
|
|
3736
|
+
/** Counterparty execution ID from the parent response. */
|
|
3737
|
+
execution_id: string;
|
|
3738
|
+
};
|
|
3739
|
+
listLargeTradeHistory: Record<string, never>;
|
|
3740
|
+
listLargeTrades: Record<string, never>;
|
|
2992
3741
|
listLeaderboard: Record<string, never>;
|
|
2993
3742
|
listPositions: Record<string, never>;
|
|
3743
|
+
listPreGameSideObservations: Record<string, never>;
|
|
3744
|
+
listPreGameSides: Record<string, never>;
|
|
2994
3745
|
listSharpMoneyFlows: Record<string, never>;
|
|
2995
3746
|
listSmartMoneyFlows: Record<string, never>;
|
|
2996
3747
|
listSportsEdgeObservations: Record<string, never>;
|
|
2997
3748
|
listSportsEdgeSignals: Record<string, never>;
|
|
3749
|
+
listSuspiciousTrades: Record<string, never>;
|
|
2998
3750
|
listTrendingWallets: Record<string, never>;
|
|
2999
3751
|
listWebhookDeliveries: {
|
|
3000
3752
|
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
@@ -3063,6 +3815,7 @@ export interface OperationBody {
|
|
|
3063
3815
|
/** Shared expand flags applied to every trader item. */
|
|
3064
3816
|
expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
3065
3817
|
};
|
|
3818
|
+
cancelTraderExport: never;
|
|
3066
3819
|
createMcpJsonRpcResponse: {
|
|
3067
3820
|
/** JSON-RPC protocol version; this server accepts 2.0. */
|
|
3068
3821
|
jsonrpc: "2.0";
|
|
@@ -3080,8 +3833,10 @@ export interface OperationBody {
|
|
|
3080
3833
|
getApiDiscovery: never;
|
|
3081
3834
|
getDailyReportSnapshot: never;
|
|
3082
3835
|
getEventReplaySince: never;
|
|
3836
|
+
getGame: never;
|
|
3083
3837
|
getHealth: never;
|
|
3084
3838
|
getInsiderRadarFlag: never;
|
|
3839
|
+
getLargeTrade: never;
|
|
3085
3840
|
getMarketCandles: never;
|
|
3086
3841
|
getMarketContextMarkdown: never;
|
|
3087
3842
|
getMarketHolders: never;
|
|
@@ -3096,6 +3851,7 @@ export interface OperationBody {
|
|
|
3096
3851
|
getPositionTimelineById: never;
|
|
3097
3852
|
getReports: never;
|
|
3098
3853
|
getStream: never;
|
|
3854
|
+
getSuspiciousTrade: never;
|
|
3099
3855
|
getTrader: never;
|
|
3100
3856
|
getTraderCategoryRecords: never;
|
|
3101
3857
|
getTraderContext: never;
|
|
@@ -3107,14 +3863,22 @@ export interface OperationBody {
|
|
|
3107
3863
|
getWebhook: never;
|
|
3108
3864
|
getWeeklyReportSnapshot: never;
|
|
3109
3865
|
getWhaleTrade: never;
|
|
3866
|
+
listGames: never;
|
|
3110
3867
|
listInsiderRadar: never;
|
|
3111
3868
|
listLargePositions: never;
|
|
3869
|
+
listLargeTradeCounterpartyExecutions: never;
|
|
3870
|
+
listLargeTradeCounterpartyMakers: never;
|
|
3871
|
+
listLargeTradeHistory: never;
|
|
3872
|
+
listLargeTrades: never;
|
|
3112
3873
|
listLeaderboard: never;
|
|
3113
3874
|
listPositions: never;
|
|
3875
|
+
listPreGameSideObservations: never;
|
|
3876
|
+
listPreGameSides: never;
|
|
3114
3877
|
listSharpMoneyFlows: never;
|
|
3115
3878
|
listSmartMoneyFlows: never;
|
|
3116
3879
|
listSportsEdgeObservations: never;
|
|
3117
3880
|
listSportsEdgeSignals: never;
|
|
3881
|
+
listSuspiciousTrades: never;
|
|
3118
3882
|
listTrendingWallets: never;
|
|
3119
3883
|
listWebhookDeliveries: never;
|
|
3120
3884
|
listWebhookEvents: never;
|
|
@@ -3155,6 +3919,7 @@ export interface OperationResponse {
|
|
|
3155
3919
|
data: OperationData["batchGetTraders"];
|
|
3156
3920
|
meta: BatchResponseMeta;
|
|
3157
3921
|
};
|
|
3922
|
+
cancelTraderExport: TraderExportJob;
|
|
3158
3923
|
createMcpJsonRpcResponse: {
|
|
3159
3924
|
jsonrpc: "2.0";
|
|
3160
3925
|
id: string | number | null;
|
|
@@ -3206,6 +3971,13 @@ export interface OperationResponse {
|
|
|
3206
3971
|
next_cursor: string;
|
|
3207
3972
|
meta: EventReplayMeta;
|
|
3208
3973
|
};
|
|
3974
|
+
getGame: {
|
|
3975
|
+
object: "game";
|
|
3976
|
+
data: OperationData["getGame"];
|
|
3977
|
+
/** When this read assembled the catalog. Per-source vintage is on freshness. */
|
|
3978
|
+
as_of: string;
|
|
3979
|
+
meta: ResponseMeta;
|
|
3980
|
+
};
|
|
3209
3981
|
getHealth: {
|
|
3210
3982
|
object: "health";
|
|
3211
3983
|
data: OperationData["getHealth"];
|
|
@@ -3216,6 +3988,11 @@ export interface OperationResponse {
|
|
|
3216
3988
|
data: OperationData["getInsiderRadarFlag"];
|
|
3217
3989
|
meta: ResponseMeta;
|
|
3218
3990
|
};
|
|
3991
|
+
getLargeTrade: {
|
|
3992
|
+
object: "large_trade";
|
|
3993
|
+
data: OperationData["getLargeTrade"];
|
|
3994
|
+
meta: ResponseMeta;
|
|
3995
|
+
};
|
|
3219
3996
|
getMarketCandles: {
|
|
3220
3997
|
object: "market_candles";
|
|
3221
3998
|
data: OperationData["getMarketCandles"];
|
|
@@ -3294,6 +4071,11 @@ export interface OperationResponse {
|
|
|
3294
4071
|
meta: ResponseMeta;
|
|
3295
4072
|
};
|
|
3296
4073
|
getStream: string;
|
|
4074
|
+
getSuspiciousTrade: {
|
|
4075
|
+
object: "suspicious_trade";
|
|
4076
|
+
data: OperationData["getSuspiciousTrade"];
|
|
4077
|
+
meta: ResponseMeta;
|
|
4078
|
+
};
|
|
3297
4079
|
getTrader: {
|
|
3298
4080
|
object: "trader";
|
|
3299
4081
|
data: OperationData["getTrader"];
|
|
@@ -3337,6 +4119,17 @@ export interface OperationResponse {
|
|
|
3337
4119
|
data: OperationData["getWhaleTrade"];
|
|
3338
4120
|
meta: ResponseMeta;
|
|
3339
4121
|
};
|
|
4122
|
+
listGames: {
|
|
4123
|
+
object: "list";
|
|
4124
|
+
data: OperationData["listGames"];
|
|
4125
|
+
has_more: boolean;
|
|
4126
|
+
/** Pass as cursor for the next page. Present only when has_more is true. */
|
|
4127
|
+
next_cursor?: string;
|
|
4128
|
+
/** When this read assembled the catalog. Per-source vintage is on each game's freshness. */
|
|
4129
|
+
as_of: string;
|
|
4130
|
+
coverage: GamesCoverage;
|
|
4131
|
+
meta: ResponseMeta;
|
|
4132
|
+
};
|
|
3340
4133
|
listInsiderRadar: {
|
|
3341
4134
|
object: "list";
|
|
3342
4135
|
data: OperationData["listInsiderRadar"];
|
|
@@ -3356,6 +4149,34 @@ export interface OperationResponse {
|
|
|
3356
4149
|
total?: number;
|
|
3357
4150
|
meta: ResponseMeta;
|
|
3358
4151
|
};
|
|
4152
|
+
listLargeTradeCounterpartyExecutions: {
|
|
4153
|
+
object: "counterparty_analysis";
|
|
4154
|
+
data: OperationData["listLargeTradeCounterpartyExecutions"];
|
|
4155
|
+
meta: ResponseMeta;
|
|
4156
|
+
};
|
|
4157
|
+
listLargeTradeCounterpartyMakers: {
|
|
4158
|
+
object: "counterparty_maker_page";
|
|
4159
|
+
data: OperationData["listLargeTradeCounterpartyMakers"];
|
|
4160
|
+
meta: ResponseMeta;
|
|
4161
|
+
};
|
|
4162
|
+
listLargeTradeHistory: {
|
|
4163
|
+
object: "list";
|
|
4164
|
+
data: OperationData["listLargeTradeHistory"];
|
|
4165
|
+
has_more: boolean;
|
|
4166
|
+
next_cursor?: string;
|
|
4167
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
4168
|
+
total?: number;
|
|
4169
|
+
meta: LargeTradeHistoryMeta;
|
|
4170
|
+
};
|
|
4171
|
+
listLargeTrades: {
|
|
4172
|
+
object: "list";
|
|
4173
|
+
data: OperationData["listLargeTrades"];
|
|
4174
|
+
has_more: boolean;
|
|
4175
|
+
next_cursor?: string;
|
|
4176
|
+
/** Total matching rows when the read model exposes a count; absent (or null) when it does not. */
|
|
4177
|
+
total?: number;
|
|
4178
|
+
meta: ResponseMeta;
|
|
4179
|
+
};
|
|
3359
4180
|
listLeaderboard: {
|
|
3360
4181
|
object: "list";
|
|
3361
4182
|
data: OperationData["listLeaderboard"];
|
|
@@ -3374,6 +4195,26 @@ export interface OperationResponse {
|
|
|
3374
4195
|
total?: number;
|
|
3375
4196
|
meta: ResponseMeta;
|
|
3376
4197
|
};
|
|
4198
|
+
listPreGameSideObservations: {
|
|
4199
|
+
object: "list";
|
|
4200
|
+
data: OperationData["listPreGameSideObservations"];
|
|
4201
|
+
has_more: boolean;
|
|
4202
|
+
next_cursor?: string;
|
|
4203
|
+
/** Completion time of the shared observation snapshot pinned by the cursor. */
|
|
4204
|
+
snapshot_as_of: string;
|
|
4205
|
+
/** 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. */
|
|
4206
|
+
degraded: boolean;
|
|
4207
|
+
funnel: PreGameSideFunnelReport;
|
|
4208
|
+
meta: ResponseMeta;
|
|
4209
|
+
};
|
|
4210
|
+
listPreGameSides: {
|
|
4211
|
+
object: "list";
|
|
4212
|
+
data: OperationData["listPreGameSides"];
|
|
4213
|
+
has_more: boolean;
|
|
4214
|
+
next_cursor?: string;
|
|
4215
|
+
total?: number;
|
|
4216
|
+
meta: ResponseMeta;
|
|
4217
|
+
};
|
|
3377
4218
|
listSharpMoneyFlows: {
|
|
3378
4219
|
object: "list";
|
|
3379
4220
|
data: OperationData["listSharpMoneyFlows"];
|
|
@@ -3399,7 +4240,7 @@ export interface OperationResponse {
|
|
|
3399
4240
|
snapshot_as_of: string;
|
|
3400
4241
|
/** 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. */
|
|
3401
4242
|
degraded: boolean;
|
|
3402
|
-
funnel:
|
|
4243
|
+
funnel: PreGameSideFunnelReport;
|
|
3403
4244
|
meta: ResponseMeta;
|
|
3404
4245
|
};
|
|
3405
4246
|
listSportsEdgeSignals: {
|
|
@@ -3410,6 +4251,15 @@ export interface OperationResponse {
|
|
|
3410
4251
|
total?: number;
|
|
3411
4252
|
meta: ResponseMeta;
|
|
3412
4253
|
};
|
|
4254
|
+
listSuspiciousTrades: {
|
|
4255
|
+
object: "list";
|
|
4256
|
+
data: OperationData["listSuspiciousTrades"];
|
|
4257
|
+
has_more: boolean;
|
|
4258
|
+
next_cursor?: string;
|
|
4259
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
4260
|
+
total?: number;
|
|
4261
|
+
meta: ResponseMeta;
|
|
4262
|
+
};
|
|
3413
4263
|
listTrendingWallets: {
|
|
3414
4264
|
object: "list";
|
|
3415
4265
|
data: OperationData["listTrendingWallets"];
|
|
@@ -3459,9 +4309,9 @@ export interface OperationResponse {
|
|
|
3459
4309
|
data: OperationData["listWhaleTradeHistory"];
|
|
3460
4310
|
has_more: boolean;
|
|
3461
4311
|
next_cursor?: string;
|
|
3462
|
-
/** Total matching rows when the read model exposes a count;
|
|
4312
|
+
/** Total matching rows when the read model exposes a count; absent (or null) when it does not. */
|
|
3463
4313
|
total?: number;
|
|
3464
|
-
meta:
|
|
4314
|
+
meta: LargeTradeHistoryMeta;
|
|
3465
4315
|
};
|
|
3466
4316
|
listWhaleTrades: {
|
|
3467
4317
|
object: "list";
|