@0xinsider/sdk 0.32.0 → 0.36.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 +19 -5
- package/dist/client.d.ts +215 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +228 -13
- package/dist/client.js.map +1 -1
- package/dist/data-quality.d.ts +10 -5
- package/dist/data-quality.d.ts.map +1 -1
- package/dist/data-quality.js +2 -2
- package/dist/data-quality.js.map +1 -1
- package/dist/errors.d.ts +25 -12
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +31 -11
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/provenance.d.ts +2 -2
- package/dist/provenance.d.ts.map +1 -1
- package/dist/provenance.js +3 -3
- package/dist/provenance.js.map +1 -1
- package/dist/schema.d.ts +1427 -166
- package/dist/schema.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/schema.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ export type AccountIdentity = {
|
|
|
3
3
|
data: {
|
|
4
4
|
user_id: number;
|
|
5
5
|
credential_id: number;
|
|
6
|
-
|
|
6
|
+
/** The kind of credential that made the request: api_key is a full-access developer key, oauth_grant an OAuth access token, integration_key a named integration key with fixed scopes created on https://0xinsider.com/developers. Before integration_key was added, these keys reported oauth_grant. */
|
|
7
|
+
credential_kind: "api_key" | "oauth_grant" | "integration_key";
|
|
7
8
|
/** The credential is currently valid; revoked, expired or unknown credentials are rejected. */
|
|
8
9
|
credential_status: "active";
|
|
9
10
|
entitlement: {
|
|
@@ -11,7 +12,7 @@ export type AccountIdentity = {
|
|
|
11
12
|
/** When paid data access is lapsed, the caller should renew the subscription; otherwise null. */
|
|
12
13
|
recovery_action: "renew_subscription" | null;
|
|
13
14
|
};
|
|
14
|
-
/**
|
|
15
|
+
/** The scopes an OAuth grant or integration key carries; null for full developer-key access. */
|
|
15
16
|
scopes: string[] | null;
|
|
16
17
|
};
|
|
17
18
|
meta: ResponseMeta;
|
|
@@ -76,8 +77,10 @@ export type ApiError = {
|
|
|
76
77
|
/** 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
78
|
retry_at?: string;
|
|
78
79
|
freshness?: FreshnessFailure;
|
|
79
|
-
/**
|
|
80
|
-
|
|
80
|
+
/** Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message. */
|
|
81
|
+
billing_url?: string;
|
|
82
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
83
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "payment_overdue" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
81
84
|
};
|
|
82
85
|
meta: ResponseMeta;
|
|
83
86
|
};
|
|
@@ -90,8 +93,18 @@ export type ApiErrorBody = {
|
|
|
90
93
|
/** The recommended next retry instant (RFC3339). Present on every retryable error (reason=pick_not_released, code=rate_limited including reason=monthly_quota_exceeded, code=rate_limit_unavailable, reason=read_model_warming) and omitted otherwise. Always in the future. For pick_not_released, the recommendation is advisory and can change before a pick becomes available. Schedule the next request from the returned value instead of inferring a release schedule or polling. Prefer Retry-After for the duration because it is immune to client clock skew. */
|
|
91
94
|
retry_at?: string;
|
|
92
95
|
freshness?: FreshnessFailure;
|
|
93
|
-
/**
|
|
94
|
-
|
|
96
|
+
/** Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message. */
|
|
97
|
+
billing_url?: string;
|
|
98
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
99
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "payment_overdue" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
100
|
+
};
|
|
101
|
+
export type BatchGameHoldersItem = {
|
|
102
|
+
/** Zero-based request index. Duplicate inputs keep separate result rows. */
|
|
103
|
+
index: number;
|
|
104
|
+
input: string;
|
|
105
|
+
status: "ok" | "error";
|
|
106
|
+
data?: GameHoldersItem;
|
|
107
|
+
error?: ApiErrorBody;
|
|
95
108
|
};
|
|
96
109
|
export type BatchMarketFlowItem = {
|
|
97
110
|
/** Zero-based request index. Duplicate inputs keep separate result rows. */
|
|
@@ -141,6 +154,22 @@ export type Candle = {
|
|
|
141
154
|
/** Close price in provider [0, 1] units (last observed point in the bucket). */
|
|
142
155
|
c: number;
|
|
143
156
|
};
|
|
157
|
+
export type CategoryLeader = {
|
|
158
|
+
address: string;
|
|
159
|
+
as_of: string;
|
|
160
|
+
category: string;
|
|
161
|
+
edge_lower_bound: number | null;
|
|
162
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
163
|
+
id: string;
|
|
164
|
+
independent_events: number;
|
|
165
|
+
n_resolved: number | null;
|
|
166
|
+
platform: "polymarket";
|
|
167
|
+
pnl: number | null;
|
|
168
|
+
rank: number;
|
|
169
|
+
unresolved_events: number;
|
|
170
|
+
username: string | null;
|
|
171
|
+
win_rate: number | null;
|
|
172
|
+
};
|
|
144
173
|
/** Model-wide readiness, read in the same database snapshot as category_records. Individual category rows retain their own status. */
|
|
145
174
|
export type CategorySkillModelReadiness = {
|
|
146
175
|
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
@@ -267,8 +296,6 @@ export type ComboFillsResponse = {
|
|
|
267
296
|
/** Continuation offset for largest or payout ordering. */
|
|
268
297
|
next_offset?: number;
|
|
269
298
|
meta: ResponseMeta;
|
|
270
|
-
/** Not computed for combo fill pages; omitted. */
|
|
271
|
-
total?: number;
|
|
272
299
|
};
|
|
273
300
|
export type ComboLeg = {
|
|
274
301
|
leg_index: number;
|
|
@@ -450,10 +477,10 @@ export type CreateWebhookVerificationAttemptRequest = {
|
|
|
450
477
|
/** The original one-time token returned by webhook creation or a URL change. Sent only in the request body and signed receiver challenge. */
|
|
451
478
|
verification_token: string;
|
|
452
479
|
};
|
|
453
|
-
/** 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. */
|
|
480
|
+
/** 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, and each clocked group is judged against its writer's budget when the body is served, so a cached body reports the same ages and verdicts 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. */
|
|
454
481
|
export type DataQuality = {
|
|
455
|
-
/** fresh when every group is fresh, unavailable when every group is unavailable, and partial in every other case. */
|
|
456
|
-
status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
482
|
+
/** fresh when every group is fresh, unavailable when every group is unavailable, stale when every group is fresh or stale and at least one is stale, and partial in every other case. */
|
|
483
|
+
status: "fresh" | "stale" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
457
484
|
/** 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. */
|
|
458
485
|
as_of?: string;
|
|
459
486
|
/** One entry per field group. Entries may be added in later releases, so match on group rather than on position or length. */
|
|
@@ -465,12 +492,14 @@ export type DataQualityGroup = {
|
|
|
465
492
|
group: string;
|
|
466
493
|
/** The table and column that write this group, named so the verdict can be audited (for example trader_rankings.computed_at). */
|
|
467
494
|
owner: string;
|
|
468
|
-
/** fresh: served,
|
|
469
|
-
status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
495
|
+
/** fresh: served, as_of carries this group's real observation or computation clock, and that clock is no older than max_age_s when the group carries one. stale: served and clocked, but as_of is older than max_age_s, so the writer has missed a refresh its schedule promises. 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. Neither fresh nor stale is a tolerance for your use: compare as_of against your own. */
|
|
496
|
+
status: "fresh" | "stale" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
470
497
|
/** 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. */
|
|
471
498
|
as_of?: string;
|
|
472
499
|
/** Why the status is not fresh. Omitted when it is. */
|
|
473
500
|
reason?: string;
|
|
501
|
+
/** The longest gap in seconds this group's writer leaves between refreshes on its schedule: the age past which the group reads stale instead of fresh. Omitted when the writer keeps no schedule its clock could fall behind (a clock stamped once, only on a change, or when a reader asks), and such a group is never stale. It is the writer's promise, not a tolerance for your use. */
|
|
502
|
+
max_age_s?: number;
|
|
474
503
|
};
|
|
475
504
|
/** The full Max-only Edge Hunter board. Defaults cover all sports and esports with B grade floor, 48-hour horizon and at most 30 rows; common selections, legacy category, min_grade and limit narrow that projection. No pagination or ETag. Rows add frozen market_context discovery metadata. */
|
|
476
505
|
export type EdgeHunterBoard = {
|
|
@@ -566,7 +595,7 @@ export type EdgeHunterObservation = {
|
|
|
566
595
|
/** 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. */
|
|
567
596
|
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
568
597
|
/** Which evaluation place in its sport the row took this refresh. most_held: a wider_holder place for up to 8 markets per sport kicking off within 24 hours, most graded holders first, kept until kickoff while the holder page still shows a card or could not be read; also every in_play row, whose places go most graded holders first. soonest_kickoff: a wider_holder place among the sport's 8 soonest kickoffs, which is not kept. emerging_pile rows carry their source wider_holder row's value. Filter on most_held to keep the most-held selection. most_held_48h: every row of an admission=most_held_48h response, which is that opt-in selection (up to 8 markets per sport within 48 hours, most graded holders first, recomputed every refresh), including a market a default place also evaluates; it never appears on a default response. */
|
|
569
|
-
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h";
|
|
598
|
+
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h" | "most_held_48h_by_type";
|
|
570
599
|
/** Always true. This row must not be routed to an order executor. */
|
|
571
600
|
observation_only: true;
|
|
572
601
|
/**
|
|
@@ -604,7 +633,7 @@ export type EdgeHunterObservation = {
|
|
|
604
633
|
provider_read_source: "cached" | "live";
|
|
605
634
|
/** True only when the provider page read for each outcome token listed every holder of that token. Observation collection reads one 100-row page per token; a token with more holders stays incomplete. False means holder counts and dollar totals measure the observed positive-holder subset. sharp_pct describes that observed subset and is not a lower bound on the full-population percentage. Incomplete scans cannot satisfy a future capital-promotion gate. */
|
|
606
635
|
holder_scan_complete: boolean;
|
|
607
|
-
/** Proven provider holder observation time. A warm cache hit uses only the original provider completion time from its companion metadata, never cache-read time. A wider_holder or emerging_pile row whose holder read did not finish in the current pass may reuse that market's last pregame holder page for up to 15 minutes; an in_play row may reuse its last in-play page, read after the provider reported the game live and never before that market's own kickoff, for up to 10 minutes. Both ages are counted when the snapshot is computed. Either reuse carries that page's original time here and provider_read_source cached. A pregame market more than an hour before kickoff reuses its last page the same way until that page is 10 minutes old, and only then is read again. Once that market's own kickoff has passed, an in_play row with provider_read_source cached, a warm hit or a reuse, never carries a page read before it. Null, malformed, future, or stale holder time fails in-play closed. */
|
|
636
|
+
/** Proven provider holder observation time. A warm cache hit uses only the original provider completion time from its companion metadata, never cache-read time. A wider_holder or emerging_pile row whose holder read did not finish or failed in the current pass may reuse that market's last pregame holder page for up to 15 minutes; an in_play row may reuse its last in-play page, read after the provider reported the game live and never before that market's own kickoff, for up to 10 minutes. Both ages are counted when the snapshot is computed. Either reuse carries that page's original time here and provider_read_source cached. A pregame market more than an hour before kickoff reuses its last page the same way until that page is 10 minutes old, and only then is read again; while that market has had no trade since the page, it keeps reusing the page until it is 30 minutes old. Once that market's own kickoff has passed, an in_play row with provider_read_source cached, a warm hit or a reuse, never carries a page read before it. Null, malformed, future, or stale holder time fails in-play closed. */
|
|
608
637
|
holder_snapshot_at: string | null;
|
|
609
638
|
/** 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. */
|
|
610
639
|
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
@@ -649,14 +678,14 @@ export type EdgeHunterObservationDeparture = {
|
|
|
649
678
|
/** Canonical sport bucket the departed card carried. */
|
|
650
679
|
category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
651
680
|
/** The departed card's admitted_by: most_held_48h on an admission=most_held_48h response. */
|
|
652
|
-
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h";
|
|
681
|
+
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h" | "most_held_48h_by_type";
|
|
653
682
|
/** Kickoff the departed card carried, in UTC. The entry leaves the list once it passes. */
|
|
654
683
|
game_start_time: string;
|
|
655
684
|
/** The departed card's observed_at: when its last evaluation finished. */
|
|
656
685
|
last_observed_at: string;
|
|
657
686
|
/** snapshot_as_of of the first snapshot of this selection without the card. */
|
|
658
687
|
departed_at: string;
|
|
659
|
-
/** Why the market has no card: its terminal in this selection's funnel in the snapshot it left, and while that terminal reports a read that did not finish (holder_deadline_unavailable, provider_unavailable, holder_computation_unavailable, internal_unclassified), the terminal of each later snapshot until one answers; an answered reason
|
|
688
|
+
/** Why the market has no card: its terminal in this selection's funnel in the snapshot it left, and while that terminal reports a read that did not finish (holder_deadline_unavailable, provider_unavailable, holder_computation_unavailable, internal_unclassified), the terminal of each later snapshot until one answers; an answered reason stays, except as view=signals starts or stops listing the market. primary_slate_candidate: view=signals lists the market. While the entry stays, a later snapshot that read view=signals and no longer excludes the market replaces it with that snapshot's terminal, one that excludes the market replaces any other reason with it, and one with signals_as_of null leaves it as it is. capacity_limited: it lost its evaluation place without another outcome. missing_stored_market: the market was no longer in the stored market universe. Any other value means what it means in the funnel, for example split_holder_pile, no_current_graded_holder or resolved. */
|
|
660
689
|
reason: EdgeHunterObservationTerminalReason;
|
|
661
690
|
};
|
|
662
691
|
/** Full Edge Hunter observations list envelope. Required degradation_reasons explains the source-generation verdict; required coverage distinguishes source input, intentional capacity exclusions, source emissions, incomplete holder scans, selection and the returned page. The view literal distinguishes advanced collections, including empty pages. */
|
|
@@ -679,11 +708,13 @@ export type EdgeHunterObservationsResponse = {
|
|
|
679
708
|
/** Normalized axes requested with a selector or category; omitted on an unselected default read. */
|
|
680
709
|
selection?: EdgeHunterSelection;
|
|
681
710
|
/** Echoes the opt-in admission rule a request named; omitted on a default read. When present, data, funnel, coverage, degraded and degradation_reasons describe that selection, not the default one. */
|
|
682
|
-
admission?: "most_held_48h";
|
|
683
|
-
/** cohort=wider_holder only, for the default selection and for admission=most_held_48h: markets that had a wider_holder card in an earlier snapshot of the same selection, have none in this one, and have not kicked off. Newest departed_at first. An entry stays until the game_start_time it carries passes, and leaves as soon as the market has a card again; while it stays only
|
|
711
|
+
admission?: "most_held_48h" | "most_held_48h_by_type";
|
|
712
|
+
/** cohort=wider_holder only, for the default selection and for admission=most_held_48h: markets that had a wider_holder card in an earlier snapshot of the same selection, have none in this one, and have not kicked off. Newest departed_at first. An entry stays until the game_start_time it carries passes, and leaves as soon as the market has a card again; while it stays, its reason changes only while it reports an unfinished read or when view=signals starts or stops listing the market (see reason), and a later departure of the same market is a new entry. Filtered by the same category and selectors as data, and identical on every page of one snapshot. At most 336 entries; when more are open, the oldest departures leave first. An empty array means no card of this selection is departed. Omitted on in_play and emerging_pile, and on a snapshot that could not establish its departures, never reported as an empty array. Tracking that restarts after its record is lost starts empty. */
|
|
684
713
|
departures?: EdgeHunterObservationDeparture[];
|
|
714
|
+
/** The ranked_at of the view=signals snapshot whose listed markets this snapshot excluded from wider_holder as primary_slate_candidate. The refresh that computed this snapshot read it as it started, so it can be one refresh older than the view=signals snapshot a reader sees at the same moment. null when no view=signals snapshot could be read: that refresh excluded no market, and the funnel counts no primary_slate_candidate. Omitted on an unmappable legacy category, which reads no generation. */
|
|
715
|
+
signals_as_of?: string | null;
|
|
685
716
|
};
|
|
686
|
-
/** Closed 25-value terminal-reason vocabulary for the accountable Edge Hunter 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
|
|
717
|
+
/** Closed 25-value terminal-reason vocabulary for the accountable Edge Hunter 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 a holder read sent to the provider that failed, with no reusable holder page; holder_deadline_unavailable is holder cache/provider absolute-deadline exhaustion or a holder read local capacity never sent, with no reusable holder page. */
|
|
687
718
|
export type EdgeHunterObservationTerminalReason = "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";
|
|
688
719
|
/** One provider outcome in fixed YES/NO order, including its frozen token identity and independently observed quote. Null current_price means no verified current quote is available. */
|
|
689
720
|
export type EdgeHunterOutcome = {
|
|
@@ -703,6 +734,8 @@ export type EdgeHunterParticipant = {
|
|
|
703
734
|
headshot_revision?: number;
|
|
704
735
|
tour?: string;
|
|
705
736
|
name: string;
|
|
737
|
+
logo_mark_light?: boolean;
|
|
738
|
+
logo_mark_measured?: boolean;
|
|
706
739
|
};
|
|
707
740
|
export type EdgeHunterPrice = {
|
|
708
741
|
/** Provider probability as a decimal string. Keep its precision until display. */
|
|
@@ -878,15 +911,15 @@ export type EdgeHunterSportFunnelReport = {
|
|
|
878
911
|
board_live_available: boolean;
|
|
879
912
|
/** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
|
|
880
913
|
board_upcoming_configured: boolean;
|
|
881
|
-
/** 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 (
|
|
914
|
+
/** 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 (unknown means no cause was recorded, which no computed snapshot reports): 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. */
|
|
882
915
|
board_upcoming_available: boolean;
|
|
883
|
-
/** 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
|
|
916
|
+
/** 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 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 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: no cause was recorded; every computed snapshot reports a concrete status, so none reads unknown. board_upcoming_available is exactly board_upcoming_status == available. */
|
|
884
917
|
board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
|
|
885
|
-
/** Configured upcoming scopes that did not complete as available. Values are category, a provider league tag slug (nfl, cfb, nba, wnba, euroleague-basketball, 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. */
|
|
886
|
-
board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "euroleague-basketball" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
|
|
918
|
+
/** Configured upcoming scopes that did not complete as available. Values are category, a provider league tag slug (nfl, cfb, nba, wnba, euroleague-basketball, ncaa-basketball, cwbb, 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. */
|
|
919
|
+
board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "euroleague-basketball" | "ncaa-basketball" | "cwbb" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
|
|
887
920
|
/** Stored-universe rows plus provider-board rows missing from storage. */
|
|
888
921
|
input: number;
|
|
889
|
-
/** 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
|
|
922
|
+
/** 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 the view=signals snapshot named by signals_as_of lists the market at its widest selection (horizon_hours=48, min_grade=B, no selector), so it is not a wider_holder candidate; when no view=signals snapshot could be read (signals_as_of null), no market takes it. 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 a holder read sent to the provider failed and the market had no reusable holder page; holder_deadline_unavailable means holder cache/provider work missed the absolute request deadline, or local capacity never sent the holder read, and the market had no reusable holder page; holder_computation_unavailable means post-holder provider or DB-backed price/metadata evaluation was unavailable. */
|
|
890
923
|
terminals: Record<string, number>;
|
|
891
924
|
/** Sum of every sparse terminal count. */
|
|
892
925
|
terminal_total: number;
|
|
@@ -928,7 +961,6 @@ export type EventReplayMeta = {
|
|
|
928
961
|
/** 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. */
|
|
929
962
|
request_id: string;
|
|
930
963
|
cached: boolean;
|
|
931
|
-
cache_age_s?: number;
|
|
932
964
|
/** Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price. */
|
|
933
965
|
cost: number;
|
|
934
966
|
replay: {
|
|
@@ -1130,7 +1162,7 @@ export type ExportCompleteness = {
|
|
|
1130
1162
|
sync_coverage: number;
|
|
1131
1163
|
};
|
|
1132
1164
|
export type ExportCounts = {
|
|
1133
|
-
/**
|
|
1165
|
+
/** The days in the export file's pnl section, the wallet's sports and esports realized P&L by UTC day: the file's export_metadata.pnl_rows, at most its earliest 3650 days. 0 while source_range.pnl_series_status is pending, and 0 with it ready for a wallet that traded no sports or esports market. */
|
|
1134
1166
|
pnl_days: number;
|
|
1135
1167
|
/** The wallet's sports and esports markets: the rows of the export's markets section, before its 50,000-row cap. */
|
|
1136
1168
|
exported_markets: number;
|
|
@@ -1174,21 +1206,28 @@ export type ExportJobReadyData = {
|
|
|
1174
1206
|
data_as_of: string | null;
|
|
1175
1207
|
};
|
|
1176
1208
|
export type ExportSourceRange = {
|
|
1209
|
+
/** The first UTC day in the export file's pnl section, the wallet's sports and esports realized P&L by day: the file's export_metadata.pnl_date_from. Null when that section has no day, including while pnl_series_status is pending. */
|
|
1177
1210
|
first_pnl_date: string | null;
|
|
1211
|
+
/** The last UTC day in the export file's pnl section: the file's export_metadata.pnl_date_to. Null when that section has no day. */
|
|
1178
1212
|
last_pnl_date: string | null;
|
|
1213
|
+
/** Whether the export file's pnl section holds the wallet's sports and esports day series, the file's export_metadata.pnl_series_status. pending means 0xinsider has not computed the series yet: the dates are null and counts.pnl_days is 0, which then never means the wallet has no day. A wallet that traded no sports or esports market is ready with null dates and counts.pnl_days 0: it never gets a series, and with nothing stored completeness.status is empty (since 2026-10-29, #30620, #30657). */
|
|
1214
|
+
pnl_series_status: "ready" | "pending";
|
|
1179
1215
|
/** The latest trade in the wallet's sports and esports markets. Null when it has none. */
|
|
1180
1216
|
latest_trade_at: string | null;
|
|
1181
1217
|
/** Same instant as latest_trade_at: the latest activity of the markets the export holds. */
|
|
1182
1218
|
latest_market_activity_at: string | null;
|
|
1183
1219
|
};
|
|
1184
1220
|
export type ExportVolumeReconciliation = {
|
|
1185
|
-
/**
|
|
1221
|
+
/**
|
|
1222
|
+
* Deprecated (#30499): always null since 2026-10-29. It held Polymarket's volume across every market of the wallet, which reconciles nothing against the sports and esports exported_activity_volume; the key stays so existing V1 clients keep parsing. Read exported_activity_volume for the wallet's sports and esports volume.
|
|
1223
|
+
* @deprecated
|
|
1224
|
+
*/
|
|
1186
1225
|
provider_lifetime_volume: number | null;
|
|
1187
|
-
/**
|
|
1226
|
+
/** Volume in USD, buys and sells, in sports and esports markets, each fill's size times its price with fees excluded, summed over the wallet's stored daily volume rows (from the fills 0xinsider stores for the wallet): the export file's summary.volume_reconciliation.exported_activity_volume, not the sum of its pnl[].total_volume, which is null on a day the trade rollups do not cover. Never Polymarket's share count. Null when any of those rows has no volume: a sum over the other days would be a partial subtotal. */
|
|
1188
1227
|
exported_activity_volume: number | null;
|
|
1189
1228
|
/** Cost basis in USD summed over the wallet's sports and esports markets, the markets section of the export. */
|
|
1190
1229
|
exported_market_cost_basis: number;
|
|
1191
|
-
/** Always null. provider_lifetime_volume
|
|
1230
|
+
/** Always null. provider_lifetime_volume covered every market and exported_activity_volume sports and esports markets only, so their difference measured nothing; the field stays so existing clients keep parsing the object. */
|
|
1192
1231
|
provider_activity_volume_gap: number | null;
|
|
1193
1232
|
/** Always null, for the same reason as provider_activity_volume_gap. */
|
|
1194
1233
|
activity_volume_coverage: number | null;
|
|
@@ -1200,10 +1239,10 @@ export type FreshnessFailure = {
|
|
|
1200
1239
|
actual_age_s?: number;
|
|
1201
1240
|
/** The oldest stored data-quality clock used to calculate actual_age_s, when one is available. */
|
|
1202
1241
|
as_of?: string;
|
|
1203
|
-
/** The trader body's whole-response data-quality status. Only fresh can satisfy max_age_s. */
|
|
1204
|
-
data_quality_status: "fresh" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
1242
|
+
/** The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered. */
|
|
1243
|
+
data_quality_status: "fresh" | "stale" | "partial" | "unknown" | "untracked" | "unavailable";
|
|
1205
1244
|
};
|
|
1206
|
-
/** One sports or esports game: both sides, its schedule, provider status,
|
|
1245
|
+
/** One sports or esports game: both sides, its schedule, provider status, its winner markets (the moneyline, or the soccer 1X2 legs) with their available provider moneyline price states and liquidity, and the game's traded volume. The event's other markets are on GET /api/v1/games/{event_slug}/markets. Assembled from the same provider-first live and upcoming projections the site's boards use, with no request-time provider fan-out. */
|
|
1207
1246
|
export type Game = {
|
|
1208
1247
|
object: "game";
|
|
1209
1248
|
/** 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. */
|
|
@@ -1225,12 +1264,17 @@ export type Game = {
|
|
|
1225
1264
|
series_format?: string;
|
|
1226
1265
|
/** Whether this read includes a market classified as paying on a draw, including soccer's independent 1X2 draw leg. Read this instead of assuming a two-outcome moneyline. */
|
|
1227
1266
|
draw_offered: boolean;
|
|
1228
|
-
/**
|
|
1267
|
+
/** The game's winner markets the sports board binds to its sides (the moneyline, or a soccer game's three 1X2 legs), ordered by condition_id. Spreads, totals, period lines and props are on GET /api/v1/games/{event_slug}/markets. */
|
|
1229
1268
|
markets: GameMarket[];
|
|
1230
1269
|
freshness: GameFreshness;
|
|
1231
1270
|
coverage: GameCoverage;
|
|
1232
1271
|
/** The game's page on 0xinsider. */
|
|
1233
1272
|
url: string;
|
|
1273
|
+
sharp_money?: GameSharpMoney;
|
|
1274
|
+
/** The game's traded volume, the figure the sports board carries for it, with its source, basis, unit and observation clock. A client can rank or filter games by volume.value. Omitted when the board carries no volume for the game, and on a finished game read from its stored record (freshness.source stored); never 0 in place of a missing figure. */
|
|
1275
|
+
volume?: GameVolume;
|
|
1276
|
+
/** A tennis game's tournament edition: its tier, city and country, venue time zone and official dates, from 0xinsider's reviewed registry, the same facts the game's page states. Omitted outside tennis, on a finished game read from its stored record (freshness.source stored), and when the registry holds no single edition for the game's competition label, players' tour and kickoff; never a guessed value. */
|
|
1277
|
+
tournament?: GameTournament;
|
|
1234
1278
|
};
|
|
1235
1279
|
/** One side of the game. */
|
|
1236
1280
|
export type GameCompetitor = {
|
|
@@ -1247,7 +1291,7 @@ export type GameCompetitor = {
|
|
|
1247
1291
|
};
|
|
1248
1292
|
/** What this game's read actually supplied, so a client branches on coverage instead of on a missing key. */
|
|
1249
1293
|
export type GameCoverage = {
|
|
1250
|
-
/** available when a live-score frame supplied this game
|
|
1294
|
+
/** available when a live-score frame supplied a score for this game. A game no live-score feed has reported yet, as most scheduled games are, reads unavailable. */
|
|
1251
1295
|
scores: "available" | "unavailable";
|
|
1252
1296
|
/** 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. */
|
|
1253
1297
|
competitors: "provider_ids" | "labels" | "unavailable";
|
|
@@ -1256,15 +1300,15 @@ export type GameCoverage = {
|
|
|
1256
1300
|
};
|
|
1257
1301
|
/** 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. */
|
|
1258
1302
|
export type GameFreshness = {
|
|
1259
|
-
/**
|
|
1260
|
-
source: "live" | "upcoming";
|
|
1303
|
+
/** What produced this game: live or upcoming, the board half that carried it, or stored, the stored record of a finished game that has left the board (GET /api/v1/games/{event_slug}, and GET /api/v1/games with a finished status). */
|
|
1304
|
+
source: "live" | "upcoming" | "stored";
|
|
1261
1305
|
/** Whether that half returned a truthful source body for this read. */
|
|
1262
1306
|
source_status: "ok" | "unavailable";
|
|
1263
1307
|
/** Whether that half had a source body at all. not_applicable means the sport has no configured source for that half. */
|
|
1264
1308
|
source_availability: "available" | "unavailable" | "not_applicable";
|
|
1265
|
-
/** Freshness of the cached source body, never inferred from the response clock or the row count. */
|
|
1309
|
+
/** Freshness of the cached source body, never inferred from the response clock or the row count. not_applicable for a stored game, whose record is final. */
|
|
1266
1310
|
source_freshness: "fresh" | "stale" | "unknown" | "not_applicable";
|
|
1267
|
-
/** The source body's data vintage. Omitted when the read has no vintage anchor, which is not age zero. */
|
|
1311
|
+
/** The source body's data vintage. Omitted when the read has no vintage anchor, which is not age zero. For a stored game, the later of its last live-score write and its last leg settlement. */
|
|
1268
1312
|
source_observed_at?: string;
|
|
1269
1313
|
/** Age of source_observed_at in seconds, capped at 600. Omitted past the cap or with no anchor. */
|
|
1270
1314
|
source_age_seconds?: number;
|
|
@@ -1275,6 +1319,22 @@ export type GameFreshness = {
|
|
|
1275
1319
|
/** The provider's own frame clock. Omitted when the frame carries none. */
|
|
1276
1320
|
scores_source_at?: string;
|
|
1277
1321
|
};
|
|
1322
|
+
/** One market of a game holders batch: GET /api/v1/market/{condition_id}/holders unfiltered and cut to the batch limit. */
|
|
1323
|
+
export type GameHoldersItem = {
|
|
1324
|
+
/** The roster's top holders by current value, at most limit. */
|
|
1325
|
+
data: MarketHolder[];
|
|
1326
|
+
/** More graded holders than limit: page them on GET /api/v1/market/{condition_id}/holders. */
|
|
1327
|
+
has_more: boolean;
|
|
1328
|
+
/** Graded holders in the roster, across every page. */
|
|
1329
|
+
total: number;
|
|
1330
|
+
market: MarketHoldersMarket;
|
|
1331
|
+
scan: MarketHoldersScan;
|
|
1332
|
+
totals: MarketHoldersTotals;
|
|
1333
|
+
/** When this roster was computed. A cached roster is at most 60 seconds old. */
|
|
1334
|
+
computed_at: string;
|
|
1335
|
+
/** true when the roster came from the 60-second roster cache. */
|
|
1336
|
+
cached: boolean;
|
|
1337
|
+
};
|
|
1278
1338
|
/** One Polymarket market linked to this game. */
|
|
1279
1339
|
export type GameMarket = {
|
|
1280
1340
|
/** The mkt_-prefixed market id every other V1 response uses. */
|
|
@@ -1297,6 +1357,17 @@ export type GameMarket = {
|
|
|
1297
1357
|
outcome_token_ids?: string[];
|
|
1298
1358
|
/** Default provider moneyline state. Omitted when this market has no classified moneyline projection; incomplete and invalid projections remain explicit. */
|
|
1299
1359
|
prices?: GameMarketPrices;
|
|
1360
|
+
/** Polymarket's reported liquidity for this market. Omitted when the provider read carried none, and on a finished game read from its stored record; never 0 in place of a missing figure. */
|
|
1361
|
+
liquidity?: GameMarketLiquidity;
|
|
1362
|
+
};
|
|
1363
|
+
/** One market's liquidity as Polymarket reports it (Gamma liquidityNum), verbatim. Polymarket documents it only as reported market liquidity, with no unit. It describes the market's resting order book, not traded volume. */
|
|
1364
|
+
export type GameMarketLiquidity = {
|
|
1365
|
+
/** The provider's figure at full precision. */
|
|
1366
|
+
value: number;
|
|
1367
|
+
/** Always gamma: the Polymarket Gamma API. */
|
|
1368
|
+
source: "gamma";
|
|
1369
|
+
/** When 0xinsider read the sports board body this figure came from, never a provider-authored timestamp. Omitted when that read has no clock. */
|
|
1370
|
+
observed_at?: string;
|
|
1300
1371
|
};
|
|
1301
1372
|
/** How the existing sports-board writer bound prices to competitors. */
|
|
1302
1373
|
export type GameMarketPriceBindingProvenance = "provider_ids" | "exact_labels" | "containment_labels" | "elimination";
|
|
@@ -1357,28 +1428,164 @@ export type GameMarketProviderPrices = GameMarketPricePaired | GameMarketPriceIn
|
|
|
1357
1428
|
export type GamesCoverage = {
|
|
1358
1429
|
/** Canonical sport buckets served, sorted. */
|
|
1359
1430
|
sports: string[];
|
|
1360
|
-
/** League tags served, sorted. EuroLeague is euroleague under the Basketball sport bucket. */
|
|
1431
|
+
/** League tags served, sorted. EuroLeague is euroleague, NCAA men's college basketball cbb and NCAA women's college basketball cwbb, all under the Basketball sport bucket. */
|
|
1361
1432
|
leagues: string[];
|
|
1362
1433
|
/** Scopes whose source half was unavailable for this read, as <sport>:<half>. Empty means every scope answered. */
|
|
1363
1434
|
sources_unavailable: string[];
|
|
1364
1435
|
};
|
|
1436
|
+
/** Event-level sharp money for one game. Every aggregate field is null unless status is computed; null means unknown, never zero. */
|
|
1437
|
+
export type GameSharpMoney = {
|
|
1438
|
+
allocation: "exact" | "degraded" | null;
|
|
1439
|
+
computed_at: string | null;
|
|
1440
|
+
event_slug: string;
|
|
1441
|
+
holders_partial: boolean | null;
|
|
1442
|
+
lifecycle: "live" | "settled" | "indeterminate" | null;
|
|
1443
|
+
money_as_of: string | null;
|
|
1444
|
+
object: string;
|
|
1445
|
+
outcomes: ({
|
|
1446
|
+
is_leader: boolean;
|
|
1447
|
+
label: string;
|
|
1448
|
+
pct: number;
|
|
1449
|
+
side: "home" | "draw" | "away";
|
|
1450
|
+
usd: number;
|
|
1451
|
+
wallets: {
|
|
1452
|
+
a: number;
|
|
1453
|
+
b: number;
|
|
1454
|
+
s: number;
|
|
1455
|
+
};
|
|
1456
|
+
})[];
|
|
1457
|
+
status: "computed" | "not_computed" | "unavailable";
|
|
1458
|
+
total_usd: number | null;
|
|
1459
|
+
trader_count: number | null;
|
|
1460
|
+
unallocated_usd: number | null;
|
|
1461
|
+
verdict: {
|
|
1462
|
+
kind: "no_sharp_money";
|
|
1463
|
+
} | {
|
|
1464
|
+
kind: "all_on";
|
|
1465
|
+
label: string;
|
|
1466
|
+
} | {
|
|
1467
|
+
kind: "split";
|
|
1468
|
+
} | {
|
|
1469
|
+
kind: "leans";
|
|
1470
|
+
label: string;
|
|
1471
|
+
pct: number;
|
|
1472
|
+
} | {
|
|
1473
|
+
kind: "unavailable";
|
|
1474
|
+
} | {
|
|
1475
|
+
divergence_pts: number;
|
|
1476
|
+
kind: "leans_over_price";
|
|
1477
|
+
label: string;
|
|
1478
|
+
} | {
|
|
1479
|
+
kind: "no_clear_lean";
|
|
1480
|
+
} | {
|
|
1481
|
+
kind: "withheld";
|
|
1482
|
+
} | null;
|
|
1483
|
+
};
|
|
1365
1484
|
/** 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. */
|
|
1366
1485
|
export type GameStatus = {
|
|
1367
|
-
/** scheduled: kickoff is ahead or the provider still
|
|
1486
|
+
/** scheduled: kickoff is ahead, or the provider still lists the game open and neither in play nor ended. With no live-score frame a game stays scheduled past its kickoff until the provider says otherwise. 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. A tennis match that the provider still lists in play, with no live score feed and no change of period or score for 3 hours, also reads suspended. unknown: no provider state reached this read. A kickoff in the past is never read as live on its own. */
|
|
1368
1487
|
state: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
1369
|
-
/** 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. */
|
|
1488
|
+
/** 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, as for a listed game no live-score feed has reported yet. */
|
|
1370
1489
|
match_status?: "scheduled" | "in_progress" | "halftime" | "penalty_shootout" | "delayed" | "suspended" | "final" | "final_overtime" | "final_shootout" | "awarded" | "forfeit" | "not_necessary" | "postponed" | "cancelled" | "unknown";
|
|
1371
|
-
/** The
|
|
1490
|
+
/** The live-score feed's status string, verbatim. Omitted when no live-score frame carries one. This API never puts a label of its own here, such as Scheduled for a listed game. */
|
|
1372
1491
|
provider_status?: string;
|
|
1373
1492
|
/** The provider's period label, for example Q3, End Q2 or T5. Omitted when the provider sent none. */
|
|
1374
1493
|
period?: string;
|
|
1375
1494
|
/** The game clock as the provider spells it, never reformatted. Omitted when the provider sent none. */
|
|
1376
1495
|
clock?: string;
|
|
1377
|
-
/** Whether the game is in play. It is the provider's own in-play flag, except that a game the provider reports suspended (period SUS)
|
|
1496
|
+
/** Whether the game is in play. It is the provider's own in-play flag, except that three cases read false: a game the provider reports suspended (period SUS), a game rescheduled to a later kickoff, and a tennis match that the provider still lists in play with no live score feed and no change of period or score for 3 hours. Omitted when no live-score frame exists, which is not the same as false. */
|
|
1378
1497
|
live?: boolean;
|
|
1379
1498
|
/** Whether the game is over. Always present. */
|
|
1380
1499
|
ended: boolean;
|
|
1381
1500
|
};
|
|
1501
|
+
/** The tennis tournament edition a game belongs to, curated from official ATP, WTA and ITF pages (source_urls), never from Polymarket, which supplies the competition label and tour only. Selected by the game's provider competition label, the one tour both players carry, and the kickoff's day at the venue. A fact no official page states is omitted. */
|
|
1502
|
+
export type GameTournament = {
|
|
1503
|
+
/** The provider competition label that selected this edition, verbatim, for example "Erste Bank Open, Qualification". */
|
|
1504
|
+
label: string;
|
|
1505
|
+
/** The edition's tour. */
|
|
1506
|
+
tour: "atp" | "wta" | "itf";
|
|
1507
|
+
/** The match's draw. qualification when the provider competition label carries Polymarket's qualifying mark (", Qualification", which 0xinsider also applies when Polymarket flags an ATP Challenger qualifying fixture); main for an unmarked ATP or WTA label. Omitted for an unmarked ITF label: Polymarket gives an ITF qualifying match the main draw's label. */
|
|
1508
|
+
draw?: "main" | "qualification";
|
|
1509
|
+
/** The edition's verified category, for example "ATP Masters 1000", "ATP Challenger 50", "WTA 1000" or "ITF M25". Omitted when no official page states it. */
|
|
1510
|
+
tier?: string;
|
|
1511
|
+
/** The verified venue city and country. Omitted when no official page states it. */
|
|
1512
|
+
location?: GameTournamentLocation;
|
|
1513
|
+
/** The venue's IANA time zone, for example "Europe/Rome". Format the venue's local time with it; it carries the daylight-saving rules. Omitted when the venue is unverified. */
|
|
1514
|
+
timezone?: string;
|
|
1515
|
+
/** The year of the edition. */
|
|
1516
|
+
edition_year: number;
|
|
1517
|
+
/** The edition's first official day, inclusive (YYYY-MM-DD). A qualifying match can be played up to two days before it. */
|
|
1518
|
+
starts_on: string;
|
|
1519
|
+
/** The edition's last official day, inclusive (YYYY-MM-DD). */
|
|
1520
|
+
ends_on: string;
|
|
1521
|
+
/** The official tournament, tour, federation or time-zone pages the facts were taken from. */
|
|
1522
|
+
source_urls: string[];
|
|
1523
|
+
/** When those pages were checked: a catalogue verification date, not a score or price clock. */
|
|
1524
|
+
checked_on: string;
|
|
1525
|
+
};
|
|
1526
|
+
/** A verified tournament venue. */
|
|
1527
|
+
export type GameTournamentLocation = {
|
|
1528
|
+
city: string;
|
|
1529
|
+
country: string;
|
|
1530
|
+
/** ISO 3166-1 alpha-2, for example "IT". */
|
|
1531
|
+
country_code: string;
|
|
1532
|
+
};
|
|
1533
|
+
/** One fill in a game, as the game page's activity list shows it. */
|
|
1534
|
+
export type GameTrade = {
|
|
1535
|
+
/** Stable fill identity: {transaction_hash}:{token_id}:{wallet}:{shares}. Deduplicate on it across polls. */
|
|
1536
|
+
id: string;
|
|
1537
|
+
/** When the fill happened, to the second. */
|
|
1538
|
+
traded_at: string;
|
|
1539
|
+
/** The provider's side of the fill. */
|
|
1540
|
+
side: "BUY" | "SELL";
|
|
1541
|
+
/** The traded outcome's label; null when the provider named none. */
|
|
1542
|
+
outcome: string | null;
|
|
1543
|
+
/** 0 for the first (Yes) outcome token, 1 for the second (No); null when the provider did not say. */
|
|
1544
|
+
outcome_index: number | null;
|
|
1545
|
+
/** Fill price, 0 to 1. */
|
|
1546
|
+
price: number;
|
|
1547
|
+
/** Shares filled. */
|
|
1548
|
+
shares: number;
|
|
1549
|
+
/** USDC notional of the fill. */
|
|
1550
|
+
size_usd: number;
|
|
1551
|
+
/** The signed handicap the fill's side carries on a spread line, for example -1.5 or 1.5; null off spreads. */
|
|
1552
|
+
point: number | null;
|
|
1553
|
+
trader: {
|
|
1554
|
+
/** Lowercase proxy wallet. */
|
|
1555
|
+
address: string;
|
|
1556
|
+
/** The name the site shows: the 0xinsider username, else the provider's name or pseudonym, else the shortened address. */
|
|
1557
|
+
display_name: string;
|
|
1558
|
+
/** The trader's grade today; null for an ungraded or untracked wallet. */
|
|
1559
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1560
|
+
};
|
|
1561
|
+
market: {
|
|
1562
|
+
/** The market's v1 id, mkt_ plus the condition_id. */
|
|
1563
|
+
id: string;
|
|
1564
|
+
/** The raw provider condition_id. */
|
|
1565
|
+
condition_id: string;
|
|
1566
|
+
/** The market's question. */
|
|
1567
|
+
title: string | null;
|
|
1568
|
+
/** The market's page slug. */
|
|
1569
|
+
slug: string | null;
|
|
1570
|
+
/** The market's name within the game, for example Draw, O/U 2.5, First to Score: CD Guadalajara, Game 2: Any Player Quadra Kill. */
|
|
1571
|
+
line_label: string | null;
|
|
1572
|
+
};
|
|
1573
|
+
};
|
|
1574
|
+
/** A game's traded volume as Polymarket reports it, read by the sports board with no request-time provider call. A one-side taker share count, the number Polymarket's own pages print behind a dollar sign, not the cash that changed hands. */
|
|
1575
|
+
export type GameVolume = {
|
|
1576
|
+
/** The volume at full precision, in unit. */
|
|
1577
|
+
value: number;
|
|
1578
|
+
/** taker_shares: cumulative one-side taker volume in shares. One share pays $1 at settlement, so this is not cash traded. Omitted only on a figure observed before units were recorded; never assume cash. */
|
|
1579
|
+
unit?: "taker_shares";
|
|
1580
|
+
/** game_lines: the game volume Polymarket's game page states, summed over the game's own lines. event_total: the whole event's volume, stated when no game volume was readable. The two can differ in either direction. Omitted when the basis is unknown. */
|
|
1581
|
+
basis?: "game_lines" | "event_total";
|
|
1582
|
+
/** The Polymarket API the figure was read from: polymarket_data (the Data API's live volume) or gamma (the Gamma API). */
|
|
1583
|
+
source: "polymarket_data" | "gamma";
|
|
1584
|
+
/** When 0xinsider read the figure from the provider, never a provider-authored timestamp. Omitted when no read time is held for it. */
|
|
1585
|
+
observed_at?: string;
|
|
1586
|
+
/** How long after observed_at 0xinsider treats the figure as current: 60 or 300 by source and basis, or 3600 for an older figure kept because a later read of the same total was lower or missing (a cumulative volume never falls). */
|
|
1587
|
+
fresh_for_seconds: number;
|
|
1588
|
+
};
|
|
1382
1589
|
/** Current category evidence, independent of the global grade. Pick of the Day stamps only the served display roster; frozen entry snapshots remain unchanged. */
|
|
1383
1590
|
export type HolderCategoryEvidence = {
|
|
1384
1591
|
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
@@ -1405,9 +1612,20 @@ export type LargeExportPolicy = {
|
|
|
1405
1612
|
/** How long a finished export is retained before expiry. */
|
|
1406
1613
|
retention: string;
|
|
1407
1614
|
};
|
|
1408
|
-
direct_streaming:
|
|
1409
|
-
|
|
1410
|
-
|
|
1615
|
+
direct_streaming: {
|
|
1616
|
+
available_when: string;
|
|
1617
|
+
backpressure: string;
|
|
1618
|
+
chunk_size_rows: number;
|
|
1619
|
+
};
|
|
1620
|
+
async_job: {
|
|
1621
|
+
available_when: string;
|
|
1622
|
+
status_values: string[];
|
|
1623
|
+
retention: string;
|
|
1624
|
+
};
|
|
1625
|
+
rate_limit: {
|
|
1626
|
+
daily_cap_per_user: number;
|
|
1627
|
+
per_address_hourly_cap: number;
|
|
1628
|
+
};
|
|
1411
1629
|
};
|
|
1412
1630
|
export type LargePosition = {
|
|
1413
1631
|
/** Composite prefixed ID `pos_<wallet>:<condition_id>:<outcome_index>`. */
|
|
@@ -1465,9 +1683,16 @@ export type LargePosition = {
|
|
|
1465
1683
|
address: string;
|
|
1466
1684
|
username?: string;
|
|
1467
1685
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1686
|
+
/** Sports and esports win rate as a ratio from 0 to 1 (0.62 means 62%): wins over the decided sports and esports markets on the wallet's record, the same figure as pnl.in_scope.win_rate on GET /api/v1/trader/{address}. Since 2026-10-27 it no longer counts other markets (#29953). Absent when the wallet has no record or no decided market. */
|
|
1468
1687
|
win_rate?: number;
|
|
1469
|
-
/**
|
|
1688
|
+
/**
|
|
1689
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's net total P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29953). Read trader.in_scope_realized_pnl.
|
|
1690
|
+
* @deprecated
|
|
1691
|
+
*/
|
|
1470
1692
|
pnl?: number;
|
|
1693
|
+
/** The wallet's realized P&L in USD on sports and esports markets, the figure the 0xinsider profile shows: the record behind pnl.in_scope.realized_pnl on GET /api/v1/trader/{address}, to cents. Distinct from this position's position_unrealized_pnl. For a graded wallet it is read from the latest grading pass, so it can trail that figure until the next pass. Omitted until 0xinsider has computed the wallet's record (#29953). */
|
|
1694
|
+
in_scope_realized_pnl?: number;
|
|
1695
|
+
/** Sports and esports markets on the wallet's record, pnl.in_scope.markets on GET /api/v1/trader/{address}. Since 2026-10-27 it no longer counts other markets (#29953). Absent when the wallet has no record. */
|
|
1471
1696
|
markets_traded?: number;
|
|
1472
1697
|
};
|
|
1473
1698
|
market: {
|
|
@@ -1521,7 +1746,7 @@ export type LargeTrade = {
|
|
|
1521
1746
|
address: string;
|
|
1522
1747
|
username?: string;
|
|
1523
1748
|
/** The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade. */
|
|
1524
|
-
grade?:
|
|
1749
|
+
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1525
1750
|
/** 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. */
|
|
1526
1751
|
grade_at_trade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1527
1752
|
/** 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. */
|
|
@@ -1603,29 +1828,73 @@ export type LeaderboardEntry = {
|
|
|
1603
1828
|
id: string;
|
|
1604
1829
|
address: string;
|
|
1605
1830
|
username?: string;
|
|
1606
|
-
grade?:
|
|
1831
|
+
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1607
1832
|
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
|
|
1608
1833
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
1609
1834
|
score?: number;
|
|
1610
|
-
/**
|
|
1835
|
+
/**
|
|
1836
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's all-time leaderboard P&L, which covered every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29971). Read in_scope.realized_pnl.
|
|
1837
|
+
* @deprecated
|
|
1838
|
+
*/
|
|
1611
1839
|
pnl?: number;
|
|
1612
|
-
/**
|
|
1840
|
+
/**
|
|
1841
|
+
* Deprecated since 2026-10-27 and never sent. It was native Polymarket realized P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29971). Read in_scope.realized_pnl.
|
|
1842
|
+
* @deprecated
|
|
1843
|
+
*/
|
|
1613
1844
|
realized_pnl?: number;
|
|
1614
|
-
/**
|
|
1845
|
+
/**
|
|
1846
|
+
* Deprecated since 2026-10-27 and never sent. It was the neg-risk conversion correction to the wallet-wide realized_pnl (#29971). Its sports and esports part is inside in_scope.realized_pnl.
|
|
1847
|
+
* @deprecated
|
|
1848
|
+
*/
|
|
1615
1849
|
pnl_correction?: PnlCorrection;
|
|
1616
|
-
/**
|
|
1850
|
+
/**
|
|
1851
|
+
* Deprecated since 2026-10-27 and never sent. It was full-history USD cash volume over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29971).
|
|
1852
|
+
* @deprecated
|
|
1853
|
+
*/
|
|
1617
1854
|
volume?: number;
|
|
1855
|
+
/** Sports and esports markets on the wallet's record, the same count as in_scope.markets. Since 2026-10-27 (#29971); before, it counted every Polymarket market. Sent exactly when in_scope is. */
|
|
1618
1856
|
markets_traded?: number;
|
|
1619
|
-
/** The wallet's win rate
|
|
1857
|
+
/** The wallet's sports and esports win rate, in_scope.win_rate rounded to four places. Since 2026-10-27 (#29971); before, it covered every Polymarket market. ?category= decides WHICH wallets are listed (the wallet must be ranked in that category); it does not rescope this field. For a per-category record use GET /api/v1/trader/{address}/categories. Omitted when in_scope is omitted or has no win rate. */
|
|
1620
1858
|
win_rate?: number;
|
|
1621
|
-
/** Additive (#27859): the wallet's sports and esports record, the same object as GET /api/v1/trader/{address} pnl.in_scope, as of the leaderboard's last refresh. The 0xinsider leaderboard page shows and sorts by in_scope.realized_pnl and in_scope.win_rate. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero.
|
|
1859
|
+
/** Additive (#27859): the wallet's sports and esports record, the same object as GET /api/v1/trader/{address} pnl.in_scope, as of the leaderboard's last refresh. The 0xinsider leaderboard page shows and sorts by in_scope.realized_pnl and in_scope.win_rate. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero. */
|
|
1622
1860
|
in_scope?: TraderPnlInScope;
|
|
1861
|
+
/** Additive (#32270): the wallet's edge over the price paid on its sports and esports markets, the figures the 0xinsider leaderboard page's Edge column states for the row. sort=edge orders by price_edge.edge. Omitted when the wallet has no settled sports or esports market of $20 or more at a known entry price. */
|
|
1862
|
+
price_edge?: LeaderboardPriceEdge;
|
|
1623
1863
|
/** Observed trading style identifier. New rows use two_sided, category_focused, high_activity, diversified, mixed, or unclassified, counted over the wallet's sports and esports markets only. Historical identifiers remain readable during normal reclassification; style does not predict skill or intent. */
|
|
1624
1864
|
strategy_type?: string;
|
|
1625
1865
|
/** Provider platform. Always polymarket. */
|
|
1626
1866
|
platform: "polymarket";
|
|
1867
|
+
/** When the wallet last traded: its most recent recorded trade, as of the leaderboard row's last refresh, which re-reads it hourly, so a new trade can take about an hour to show. It agrees with the activity filter: every wallet listed under activity=inactive last traded more than 30 days ago. Since 2026-11-02 (#32322); before, it carried the time 0xinsider last synced the wallet, usually within the past week whether or not the wallet traded. Omitted when the wallet has no recorded trade. */
|
|
1627
1868
|
last_active?: string;
|
|
1628
1869
|
};
|
|
1870
|
+
export type LeaderboardLeagues = {
|
|
1871
|
+
leagues: {
|
|
1872
|
+
category: string;
|
|
1873
|
+
name: string;
|
|
1874
|
+
ranked_traders: number;
|
|
1875
|
+
slug: string;
|
|
1876
|
+
sport: string;
|
|
1877
|
+
total_traders: number;
|
|
1878
|
+
}[];
|
|
1879
|
+
min_ranked: number;
|
|
1880
|
+
min_resolved: number;
|
|
1881
|
+
refreshed_at: string;
|
|
1882
|
+
};
|
|
1883
|
+
/** Edge over the price paid (#32270): how often the side a wallet bought won, minus the average price it paid, over its settled sports and esports markets of $20 or more at a known entry price. Probabilities throughout: edge 0.12 is 12 percentage points. A wallet buying at 99 cents that wins every market has an edge of about 0.01. A market bought on both sides counts by its shares: the winning side's share of the shares bought is its hit, the cost over those shares its price. */
|
|
1884
|
+
export type LeaderboardPriceEdge = {
|
|
1885
|
+
/** Settled sports and esports markets of $20 or more at a known entry price that the edge is measured over. */
|
|
1886
|
+
markets: number;
|
|
1887
|
+
/** Share of those markets whose bought side won, 0-1. */
|
|
1888
|
+
hit_rate: number;
|
|
1889
|
+
/** Mean entry price paid, 0-1. */
|
|
1890
|
+
avg_price: number;
|
|
1891
|
+
/** hit_rate minus avg_price, full precision. The value sort=edge orders by. */
|
|
1892
|
+
edge: number;
|
|
1893
|
+
/** Whether the edge ranks. ranked: at least 30 such markets, and the share of the decided ones that made money at settlement within 10 points of the win rate over the same markets. too_few_markets: fewer than 30. sample_mismatch: that share is more than 10 points away, so these markets do not describe the wallet's record. Only a ranked edge with no hold orders on sort=edge. */
|
|
1894
|
+
status: "ranked" | "too_few_markets" | "sample_mismatch";
|
|
1895
|
+
/** Why the leaderboard does not rank a ranked edge. record_incomplete: the wallet's stored sports and esports record shows more profit than Polymarket reports for it, so some losing markets are likely missing. Omitted when nothing holds the edge, and always omitted unless status is ranked. */
|
|
1896
|
+
hold?: "record_incomplete";
|
|
1897
|
+
};
|
|
1629
1898
|
/** One side's score line inside a `live_sports_updated` pulse. */
|
|
1630
1899
|
export type LiveSportsScoreEntry = {
|
|
1631
1900
|
/** Team name, ordered for the league (away first where the league reads that way). */
|
|
@@ -1706,7 +1975,7 @@ export type MarketFlow = {
|
|
|
1706
1975
|
id: string;
|
|
1707
1976
|
address: string;
|
|
1708
1977
|
username: string | null;
|
|
1709
|
-
grade:
|
|
1978
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1710
1979
|
side: "YES" | "NO";
|
|
1711
1980
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1712
1981
|
token_id: string | null;
|
|
@@ -1737,7 +2006,7 @@ export type MarketFlow = {
|
|
|
1737
2006
|
id: string;
|
|
1738
2007
|
address: string;
|
|
1739
2008
|
username: string | null;
|
|
1740
|
-
grade:
|
|
2009
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1741
2010
|
side: "YES" | "NO";
|
|
1742
2011
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1743
2012
|
token_id: string | null;
|
|
@@ -1771,21 +2040,21 @@ export type MarketHolder = {
|
|
|
1771
2040
|
other_outcome_shares?: number;
|
|
1772
2041
|
/** The wallet's last recorded trade anywhere, null when unknown. */
|
|
1773
2042
|
last_traded_at: string | null;
|
|
1774
|
-
/** This wallet's win rate in the market's canonical category (`market.category`): the share of its
|
|
2043
|
+
/** This wallet's win rate in the market's canonical category (`market.category`): the share of its settled markets in that category (it closed its position by selling out, or the market resolved) whose realized P&L closed positive, as a 0..1 fraction. Present only with `category_win_rate_status` = `measured`. The same read `GET /api/v1/trader/{address}/categories` serves per wallet. */
|
|
1775
2044
|
category_win_rate?: number;
|
|
1776
|
-
/** The two counts `category_win_rate` is the ratio of, from the same row: `wins / decided` equals the rate. Every
|
|
2045
|
+
/** The two counts `category_win_rate` is the ratio of, from the same row: `wins / decided` equals the rate. Every settled Polymarket market the wallet traded (it closed its position by selling out, or the market resolved) in the market's canonical category, at any position size, rebuilt daily. Present only with `category_win_rate_status` = `measured`. */
|
|
1777
2046
|
category_win_record?: {
|
|
1778
|
-
/**
|
|
2047
|
+
/** Settled markets in the category that this wallet closed with a profit. */
|
|
1779
2048
|
wins: number;
|
|
1780
|
-
/**
|
|
2049
|
+
/** Settled markets in the category that this wallet closed with a profit or a loss. A market resolved at zero realized P&L is in neither count. */
|
|
1781
2050
|
decided: number;
|
|
1782
2051
|
};
|
|
1783
|
-
/** The wallet's average entry price in the market's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's
|
|
2052
|
+
/** The wallet's average entry price in the market's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's markets in that category that resolved to a winning side, of $20 or more where it bought one side at a known price, so it can differ from the `category_win_record` sample. A wallet that buys near-certain outcomes wins almost every time, so read the win rate beside this price. Present only with `category_win_rate_status` = `measured`, and only when that sample has at least 5 markets. When `category_win_rate_game` is present the price is still the whole `category` bucket's: this field has no per-game or per-league price. Absent otherwise and on payloads predating the field. */
|
|
1784
2053
|
category_avg_price?: number;
|
|
1785
|
-
/**
|
|
2054
|
+
/** Where `category_win_rate` and `category_win_record` were measured: for an esports market the game (`LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`), and for a market in a registered league that league, by the name Pick of the Day uses for it (`NBA`, `NFL`, `NHL`, `MLB`, `UFC`, `ATP`, `WTA`, `LaLiga`, `Premier League`, `Serie A`, `UEFA Champions League`, `MLS` and the other registered leagues). Present only when the wallet's record there clears the 5-settled-market floor, in which case the rate and record are the game's or league's rather than the whole `category` bucket's. Absent when the rate is the bucket's (the wallet's history there is under the floor, or the competition is not a registered league), on every other market, and beside every non-measured status. Label the rate with this when present and with the market's `category` otherwise. */
|
|
1786
2055
|
category_win_rate_game?: string;
|
|
1787
|
-
/** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (under the floor of 5 decided markets in the category), or `unavailable` (the market has no canonical category, or the read failed; retry later). Always present on this route. */
|
|
1788
|
-
category_win_rate_status: "measured" | "not_enough_data" | "unavailable";
|
|
2056
|
+
/** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (under the floor of 5 decided markets in the category), or `unavailable` (the market has no canonical category, or the read failed; retry later). Never `untracked`: this route lists S, A and B wallets only, all on file. Always present on this route. */
|
|
2057
|
+
category_win_rate_status: "measured" | "not_enough_data" | "unavailable" | "untracked";
|
|
1789
2058
|
category_evidence?: HolderCategoryEvidence;
|
|
1790
2059
|
/** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
|
|
1791
2060
|
wallet_age_days?: number | null;
|
|
@@ -1830,6 +2099,15 @@ export type MarketHoldersSideGrades = {
|
|
|
1830
2099
|
a: number;
|
|
1831
2100
|
b: number;
|
|
1832
2101
|
};
|
|
2102
|
+
/** Polymarket currentValue in USD per grade on one side, over the same wallets as that side's usd total. Each value is rounded to the cent after summing, so s + a + b can differ from the side total by up to 2 cents. */
|
|
2103
|
+
export type MarketHoldersSideGradeUsd = {
|
|
2104
|
+
/** USD held by S-grade wallets netting this side. */
|
|
2105
|
+
s: number;
|
|
2106
|
+
/** USD held by A-grade wallets netting this side. */
|
|
2107
|
+
a: number;
|
|
2108
|
+
/** USD held by B-grade wallets netting this side. */
|
|
2109
|
+
b: number;
|
|
2110
|
+
};
|
|
1833
2111
|
/** Roster totals BEFORE any `outcome` or `min_grade` filter, so a page always knows the whole market it was cut from. */
|
|
1834
2112
|
export type MarketHoldersTotals = {
|
|
1835
2113
|
/** Distinct graded wallets with net exposure; a two-sided wallet counts once. */
|
|
@@ -1844,6 +2122,10 @@ export type MarketHoldersTotals = {
|
|
|
1844
2122
|
no_usd: number;
|
|
1845
2123
|
yes_grades: MarketHoldersSideGrades;
|
|
1846
2124
|
no_grades: MarketHoldersSideGrades;
|
|
2125
|
+
/** yes_usd split by grade: where the S, A and B money on YES sits. */
|
|
2126
|
+
yes_grade_usd: MarketHoldersSideGradeUsd;
|
|
2127
|
+
/** no_usd split by grade: where the S, A and B money on NO sits. */
|
|
2128
|
+
no_grade_usd: MarketHoldersSideGradeUsd;
|
|
1847
2129
|
};
|
|
1848
2130
|
export type MarketSearchResult = {
|
|
1849
2131
|
id: string;
|
|
@@ -1855,6 +2137,7 @@ export type MarketSearchResult = {
|
|
|
1855
2137
|
platform: "polymarket" | null;
|
|
1856
2138
|
/** closed once Polymarket has closed trading or the market has resolved; active otherwise. The same rule labels a market on markets/search, markets/explore and market/{condition_id}/snapshot. */
|
|
1857
2139
|
status: "active" | "closed";
|
|
2140
|
+
event_slug?: string;
|
|
1858
2141
|
};
|
|
1859
2142
|
export type MarketSnapshot = {
|
|
1860
2143
|
market: {
|
|
@@ -1949,9 +2232,149 @@ export type MarketSnapshotTrust = {
|
|
|
1949
2232
|
current_price: TrustMetadata;
|
|
1950
2233
|
spread_bps: TrustMetadata;
|
|
1951
2234
|
};
|
|
2235
|
+
export type MarketTopHolder = {
|
|
2236
|
+
/** 1-based position on this outcome, by shares. */
|
|
2237
|
+
rank: number;
|
|
2238
|
+
/** `trd_`-prefixed trader id, accepted by `GET /api/v1/trader/{address}`. */
|
|
2239
|
+
trader_id: string;
|
|
2240
|
+
/** Lowercased proxy wallet. */
|
|
2241
|
+
address: string;
|
|
2242
|
+
/** The wallet's display name; null when it shows none. */
|
|
2243
|
+
name: string | null;
|
|
2244
|
+
/** All-time trader grade, S to F. Null for a wallet 0xinsider has not graded: this route lists every holder whatever its grade. */
|
|
2245
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2246
|
+
/** Shares held on this outcome. */
|
|
2247
|
+
shares: number;
|
|
2248
|
+
/** Polymarket's current value of this position, in USD. Null when the provider served none. */
|
|
2249
|
+
current_value_usd: number | null;
|
|
2250
|
+
/** Average price paid for the shares still held, as a 0..1 fraction of $1. Null when the provider served none. */
|
|
2251
|
+
avg_entry_price: number | null;
|
|
2252
|
+
/** Shares on the other outcome when the wallet holds both; the wallet is then listed on both sides. Absent when it is one-sided. */
|
|
2253
|
+
other_outcome_shares?: number;
|
|
2254
|
+
/** Polymarket's realized P&L of this position (sells and redemptions), in USD. Null when the provider served no economics for the row. */
|
|
2255
|
+
position_realized_pnl: number | null;
|
|
2256
|
+
/** Polymarket's mark-to-market P&L of the shares still held, in USD. On a resolved market the mark is the settlement price. */
|
|
2257
|
+
position_unrealized_pnl: number | null;
|
|
2258
|
+
/** `position_realized_pnl` plus `position_unrealized_pnl`, in USD. */
|
|
2259
|
+
position_total_pnl: number | null;
|
|
2260
|
+
/** The wallet's realized P&L on sports and esports markets, in USD, the figure on its 0xinsider profile. Null until 0xinsider has computed the record, never 0 in its place, and null for every row when `profiles_status` is `unavailable`. */
|
|
2261
|
+
in_scope_realized_pnl: number | null;
|
|
2262
|
+
/** The wallet's volume traded on sports and esports markets, in USD. Null under the same rule as `in_scope_realized_pnl`. */
|
|
2263
|
+
in_scope_volume: number | null;
|
|
2264
|
+
/** The wallet's stored trading-style label (see Wallet trading styles); null when it has none. */
|
|
2265
|
+
strategy_type: string | null;
|
|
2266
|
+
/** The wallet's last recorded trade anywhere, null when unknown. */
|
|
2267
|
+
last_traded_at: string | null;
|
|
2268
|
+
/** This wallet's win rate in the market's canonical category (`market.category`): the share of its settled markets in that category (it closed its position by selling out, or the market resolved) whose realized P&L closed positive, as a 0..1 fraction. Present only with `category_win_rate_status` = `measured`. The same read `GET /api/v1/trader/{address}/categories` serves per wallet. */
|
|
2269
|
+
category_win_rate?: number;
|
|
2270
|
+
/** The two counts `category_win_rate` is the ratio of, from the same row: `wins / decided` equals the rate. Every settled Polymarket market the wallet traded (it closed its position by selling out, or the market resolved) in the market's canonical category, at any position size, rebuilt daily. Present only with `category_win_rate_status` = `measured`. */
|
|
2271
|
+
category_win_record?: {
|
|
2272
|
+
/** Settled markets in the category that this wallet closed with a profit. */
|
|
2273
|
+
wins: number;
|
|
2274
|
+
/** Settled markets in the category that this wallet closed with a profit or a loss. A market resolved at zero realized P&L is in neither count. */
|
|
2275
|
+
decided: number;
|
|
2276
|
+
};
|
|
2277
|
+
/** The wallet's average entry price in the market's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's markets in that category that resolved to a winning side, of $20 or more where it bought one side at a known price, so it can differ from the `category_win_record` sample. A wallet that buys near-certain outcomes wins almost every time, so read the win rate beside this price. Present only with `category_win_rate_status` = `measured`, and only when that sample has at least 5 markets. When `category_win_rate_game` is present the price is still the whole `category` bucket's: this field has no per-game or per-league price. Absent otherwise and on payloads predating the field. */
|
|
2278
|
+
category_avg_price?: number;
|
|
2279
|
+
/** Where `category_win_rate` and `category_win_record` were measured: for an esports market the game (`LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`), and for a market in a registered league that league, by the name Pick of the Day uses for it (`NBA`, `NFL`, `NHL`, `MLB`, `UFC`, `ATP`, `WTA`, `LaLiga`, `Premier League`, `Serie A`, `UEFA Champions League`, `MLS` and the other registered leagues). Present only when the wallet's record there clears the 5-settled-market floor, in which case the rate and record are the game's or league's rather than the whole `category` bucket's. Absent when the rate is the bucket's (the wallet's history there is under the floor, or the competition is not a registered league), on every other market, and beside every non-measured status. Label the rate with this when present and with the market's `category` otherwise. */
|
|
2280
|
+
category_win_rate_game?: string;
|
|
2281
|
+
/** Why `category_win_rate` is present or absent: `measured` (rate present), `not_enough_data` (the wallet is on file and under the floor of 5 decided markets in the category), `untracked` (0xinsider has no record of the wallet, so nothing was measured; `grade`, `in_scope_realized_pnl` and `in_scope_volume` are null too), or `unavailable` (a read failed; retry later). Absent when the market has no canonical category. */
|
|
2282
|
+
category_win_rate_status?: "measured" | "not_enough_data" | "unavailable" | "untracked";
|
|
2283
|
+
/** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request. The five badge fields are present together, only for a wallet that draws at least one badge. */
|
|
2284
|
+
wallet_age_days?: number | null;
|
|
2285
|
+
/** True when the wallet's first trade was under 30 days ago. */
|
|
2286
|
+
is_new_wallet?: boolean;
|
|
2287
|
+
/** Distinct markets the wallet has traded. */
|
|
2288
|
+
markets_traded?: number | null;
|
|
2289
|
+
/** True when the wallet is flagged as automated. */
|
|
2290
|
+
is_bot?: boolean;
|
|
2291
|
+
/** The wallet's X handle without the @, when linked. */
|
|
2292
|
+
x_username?: string | null;
|
|
2293
|
+
};
|
|
2294
|
+
export type MarketTopHolders = {
|
|
2295
|
+
market: MarketHoldersMarket;
|
|
2296
|
+
/** The largest YES holders, by shares, up to `limit`. */
|
|
2297
|
+
yes: MarketTopHolder[];
|
|
2298
|
+
/** The largest NO holders, by shares, up to `limit`. */
|
|
2299
|
+
no: MarketTopHolder[];
|
|
2300
|
+
totals: MarketTopHoldersTotals;
|
|
2301
|
+
/** `unavailable` when the wallet record read failed: `in_scope_realized_pnl`, `in_scope_volume` and `strategy_type` are then null for every row because they were not read, not because they are unknown. */
|
|
2302
|
+
profiles_status: "available" | "unavailable";
|
|
2303
|
+
/** When the daily pass behind the rows' category win records began. Absent when the market has no category or the read answered no row. */
|
|
2304
|
+
category_records_as_of?: string;
|
|
2305
|
+
/** When this holder sample was built. */
|
|
2306
|
+
computed_at?: string;
|
|
2307
|
+
/** When Polymarket's holder board behind this sample was fetched: up to 120 s before `computed_at` on an open market. Absent on a resolved market, whose sample reads no live board, and when the fetch stamp could not be read. */
|
|
2308
|
+
positions_as_of?: string;
|
|
2309
|
+
/** `true` when this is the market's last sample, served after its 30 s window while a refresh runs; `positions_as_of` is then at most 300 s old. Read again in a few seconds for the refreshed sample. Always `false` on a resolved market. */
|
|
2310
|
+
source_stale: boolean;
|
|
2311
|
+
};
|
|
2312
|
+
export type MarketTopHoldersTotals = {
|
|
2313
|
+
/** Holders in the YES sample, before `limit`. Equal to `sample_cap` means that many or more. */
|
|
2314
|
+
yes_count: number;
|
|
2315
|
+
/** Holders in the NO sample, before `limit`. */
|
|
2316
|
+
no_count: number;
|
|
2317
|
+
/** Shares summed over the YES sample. */
|
|
2318
|
+
yes_shares: number;
|
|
2319
|
+
/** Shares summed over the NO sample. */
|
|
2320
|
+
no_shares: number;
|
|
2321
|
+
/** The most holders the sample keeps per outcome (100). */
|
|
2322
|
+
sample_cap: number;
|
|
2323
|
+
};
|
|
2324
|
+
/** One market's net buyers and net sellers over a 24h or 7d window, as the market page's wallets in/out panel shows a Pro viewer. */
|
|
2325
|
+
export type MarketWalletsInOut = {
|
|
2326
|
+
/** The market's raw provider condition id. */
|
|
2327
|
+
condition_id: string;
|
|
2328
|
+
/** The window the nets are summed over: 24h or 7d. */
|
|
2329
|
+
window: string;
|
|
2330
|
+
/** The window's inclusive start; null only when the bounds are unknown. */
|
|
2331
|
+
window_start: string | null;
|
|
2332
|
+
/** The window's inclusive end, the read's clock; null only when the bounds are unknown. */
|
|
2333
|
+
window_end: string | null;
|
|
2334
|
+
/** Totals over every wallet that traded the market in the window, not only the listed 50. */
|
|
2335
|
+
summary: {
|
|
2336
|
+
/** Wallets with a positive net in the window. */
|
|
2337
|
+
wallets_in: number;
|
|
2338
|
+
/** Wallets with a negative net in the window. */
|
|
2339
|
+
wallets_out: number;
|
|
2340
|
+
/** The sum of every wallet's net, in USD. A fully rotated wallet nets zero and is on neither side. */
|
|
2341
|
+
net_usd: number;
|
|
2342
|
+
};
|
|
2343
|
+
/** Wallets whose net is positive, largest first, at most 25. */
|
|
2344
|
+
net_buyers: ({
|
|
2345
|
+
/** Lowercase proxy wallet. */
|
|
2346
|
+
address: string;
|
|
2347
|
+
/** The name the site shows: the 0xinsider username, else the shortened address. */
|
|
2348
|
+
display_name: string;
|
|
2349
|
+
/** Today's grade; null for an ungraded or untracked wallet. */
|
|
2350
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2351
|
+
/** Buys minus sells in the window, both outcomes, in USD: the matched notional, fees excluded. */
|
|
2352
|
+
net_usd: number;
|
|
2353
|
+
/** Fills in the window. */
|
|
2354
|
+
trades: number;
|
|
2355
|
+
/** The wallet's newest trade on any market, at or before window_end; null when unknown. */
|
|
2356
|
+
last_traded_at: string | null;
|
|
2357
|
+
})[];
|
|
2358
|
+
/** Wallets whose net is negative, most negative first, at most 25. */
|
|
2359
|
+
net_sellers: ({
|
|
2360
|
+
/** Lowercase proxy wallet. */
|
|
2361
|
+
address: string;
|
|
2362
|
+
/** The name the site shows: the 0xinsider username, else the shortened address. */
|
|
2363
|
+
display_name: string;
|
|
2364
|
+
/** Today's grade; null for an ungraded or untracked wallet. */
|
|
2365
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2366
|
+
/** Buys minus sells in the window, both outcomes, in USD: the matched notional, fees excluded. */
|
|
2367
|
+
net_usd: number;
|
|
2368
|
+
/** Fills in the window. */
|
|
2369
|
+
trades: number;
|
|
2370
|
+
/** The wallet's newest trade on any market, at or before window_end; null when unknown. */
|
|
2371
|
+
last_traded_at: string | null;
|
|
2372
|
+
})[];
|
|
2373
|
+
};
|
|
1952
2374
|
export type McpJsonRpcError = {
|
|
1953
2375
|
jsonrpc: "2.0";
|
|
1954
|
-
id
|
|
2376
|
+
/** The request's id, or null when the request could not be parsed. Omitted on the answer to an unsolicited response message. */
|
|
2377
|
+
id?: string | number | null;
|
|
1955
2378
|
error: {
|
|
1956
2379
|
code: number;
|
|
1957
2380
|
message: string;
|
|
@@ -1980,21 +2403,21 @@ export type PickHolder = {
|
|
|
1980
2403
|
shares: number;
|
|
1981
2404
|
/** USD entry value of this wallet's position: `shares` times the pick's frozen `backed_price`. An entry valuation, never a live balance or the provider's current value. Omitted when the holder snapshot has no valid price. */
|
|
1982
2405
|
entry_value_usd?: number;
|
|
1983
|
-
/** This wallet's win rate in the pick's canonical category bucket (the pick's `category` field, e.g. Basketball -- label the rate with it, never with the narrower `display_category` league, except when `category_win_rate_game` is present, in which case the rate is that game's and is labelled with it): the share of the wallet's
|
|
2406
|
+
/** This wallet's win rate in the pick's canonical category bucket (the pick's `category` field, e.g. Basketball -- label the rate with it, never with the narrower `display_category` league, except when `category_win_rate_game` is present, in which case the rate is that game's or league's and is labelled with it): the share of the wallet's settled markets in that category (it closed its position by selling out, or the market resolved) whose realized P&L closed positive, as a 0..1 fraction. Present only with `category_win_rate_status` = `measured`, on `display_holders` entries, and only when the wallet clears the settled-market floor; recomputed at serve time from the current category read model, not frozen with the pick. Absent on `holders` entries, legacy rows, and payloads predating the field. */
|
|
1984
2407
|
category_win_rate?: number;
|
|
1985
|
-
/** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every
|
|
2408
|
+
/** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every settled Polymarket market the wallet traded (it closed its position by selling out, or the market resolved) in the pick's canonical category (or in its game or league, when `category_win_rate_game` is present), at any position size; the counts are rebuilt daily. Present only with `category_win_rate_status` = `measured`; absent otherwise and on payloads predating the field. */
|
|
1986
2409
|
category_win_record?: {
|
|
1987
|
-
/**
|
|
2410
|
+
/** Settled markets in the category that this wallet closed with a profit. */
|
|
1988
2411
|
wins: number;
|
|
1989
|
-
/**
|
|
2412
|
+
/** Settled markets in the category that this wallet closed with a profit or a loss. A market resolved at zero realized P&L is in neither count. */
|
|
1990
2413
|
decided: number;
|
|
1991
2414
|
};
|
|
1992
|
-
/** The wallet's average entry price in the pick's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's
|
|
2415
|
+
/** The wallet's average entry price in the pick's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's markets in that category that resolved to a winning side, of $20 or more where it bought one side at a known price, so it can differ from the `category_win_record` sample. A wallet that buys near-certain outcomes wins almost every time, so read the win rate beside this price. Present only with `category_win_rate_status` = `measured`, and only when that sample has at least 5 markets. When `category_win_rate_game` is present the price is still the whole `category` bucket's: this field has no per-game or per-league price. Absent otherwise and on payloads predating the field. */
|
|
1993
2416
|
category_avg_price?: number;
|
|
1994
|
-
/**
|
|
2417
|
+
/** Where `category_win_rate` and `category_win_record` were measured, by the same name the pick's `display_category` uses for it: for an esports pick the game (`LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`), and for a pick in a registered league that league (`NBA`, `NFL`, `NHL`, `MLB`, `UFC`, `ATP`, `WTA`, `LaLiga`, `Premier League`, `Serie A`, `UEFA Champions League`, `MLS` and the other registered leagues). Present only when the wallet's record there clears the 5-settled-market floor, in which case the rate and record are the game's or league's rather than the whole `category` bucket's. Absent when the rate is the bucket's (the wallet's history there is under the floor, or the competition is not a registered league), on every other pick, beside every non-measured status, and on payloads predating the field. Label the rate with this when present and with `category` otherwise. */
|
|
1995
2418
|
category_win_rate_game?: string;
|
|
1996
|
-
/** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the
|
|
1997
|
-
category_win_rate_status?: "measured" | "not_enough_data" | "unavailable";
|
|
2419
|
+
/** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the settled-market floor of 5 in the category), or `unavailable` (the annotation read failed; retry later). Never `untracked`: every recorded holder is a graded wallet 0xinsider has on file. Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample. */
|
|
2420
|
+
category_win_rate_status?: "measured" | "not_enough_data" | "unavailable" | "untracked";
|
|
1998
2421
|
/** Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request, and the pick's ETag holds between requests. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
|
|
1999
2422
|
wallet_age_days?: number | null;
|
|
2000
2423
|
/** True when the wallet's first trade was under 30 days ago. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped. */
|
|
@@ -2141,9 +2564,9 @@ export type PickOfTheDay = {
|
|
|
2141
2564
|
grade: string | null;
|
|
2142
2565
|
/** The canonical sport bucket the win rate was measured over (for example Basketball). Can be BROADER than the pick's display_category, which names an exact league such as NBA — label the rate with this field, never with display_category. */
|
|
2143
2566
|
canonical_category: string;
|
|
2144
|
-
/** Share of the trader’s
|
|
2567
|
+
/** Share of the trader’s settled markets in canonical_category (closed by selling out, or resolved) with positive realized P&L, as a 0..1 fraction. Null when not measured. This is a trader statistic, not the pick’s probability of winning. */
|
|
2145
2568
|
win_rate: number | null;
|
|
2146
|
-
/** Number of
|
|
2569
|
+
/** Number of settled markets behind win_rate; null when not measured. */
|
|
2147
2570
|
n_resolved: number | null;
|
|
2148
2571
|
/** Recorded Polymarket position value on the backed outcome, in USD. It can change after this snapshot. */
|
|
2149
2572
|
position_usd: number;
|
|
@@ -2569,14 +2992,411 @@ export type PickOfTheDayNoEntitledPicks = {
|
|
|
2569
2992
|
message: string;
|
|
2570
2993
|
/** Rank-ordered entitled selections that have not released. Every row retains release_at and kickoff; unauthorized scheduled ranks appear only in identity-free locked_picks. */
|
|
2571
2994
|
scheduled_picks?: ScheduledPickSlot[];
|
|
2572
|
-
/** Entitled published picks whose holder proof is unreadable, ordered by rank. Unauthorized ranks appear only in locked_picks and cannot trigger proof warming. Read retry_at for the next read. */
|
|
2573
|
-
proof_pending_picks?: ProofPendingPickSlot[];
|
|
2574
2995
|
/**
|
|
2575
2996
|
* Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id.
|
|
2576
2997
|
* @deprecated
|
|
2577
2998
|
*/
|
|
2578
2999
|
supersedes_pick_id: string | null;
|
|
2579
3000
|
};
|
|
3001
|
+
export type PickOfTheDayStats = {
|
|
3002
|
+
categories: {
|
|
3003
|
+
canonical_category?: string;
|
|
3004
|
+
clv_avg_display?: string;
|
|
3005
|
+
clv_avg_pct?: number;
|
|
3006
|
+
clv_avg_pp?: number;
|
|
3007
|
+
clv_avg_pp_display?: string;
|
|
3008
|
+
clv_measured: number;
|
|
3009
|
+
edge_display?: string;
|
|
3010
|
+
edge_pp?: number;
|
|
3011
|
+
key: string;
|
|
3012
|
+
label: string;
|
|
3013
|
+
losses: number;
|
|
3014
|
+
net_profit_display?: string;
|
|
3015
|
+
net_profit_usd?: number;
|
|
3016
|
+
pending: number;
|
|
3017
|
+
picks: number;
|
|
3018
|
+
priced_decided: number;
|
|
3019
|
+
priced_in_display?: string;
|
|
3020
|
+
priced_in_pct?: number;
|
|
3021
|
+
roi_display?: string;
|
|
3022
|
+
roi_pct?: number;
|
|
3023
|
+
settled: number;
|
|
3024
|
+
small_sample: boolean;
|
|
3025
|
+
staked_usd: number;
|
|
3026
|
+
unit_score?: number;
|
|
3027
|
+
unit_score_display?: string;
|
|
3028
|
+
void: number;
|
|
3029
|
+
win_rate_display?: string;
|
|
3030
|
+
win_rate_pct?: number;
|
|
3031
|
+
wins: number;
|
|
3032
|
+
}[];
|
|
3033
|
+
days: ({
|
|
3034
|
+
date: string;
|
|
3035
|
+
losses: number;
|
|
3036
|
+
net_profit_display?: string;
|
|
3037
|
+
net_profit_usd?: number;
|
|
3038
|
+
pending: number;
|
|
3039
|
+
picks: number;
|
|
3040
|
+
sweep?: "win" | "loss";
|
|
3041
|
+
unit_score?: number;
|
|
3042
|
+
unit_score_display?: string;
|
|
3043
|
+
void: number;
|
|
3044
|
+
wins: number;
|
|
3045
|
+
})[];
|
|
3046
|
+
hit_rate: PickOfTheDayHitRate;
|
|
3047
|
+
market_expectations: {
|
|
3048
|
+
as_of_date: string;
|
|
3049
|
+
price_basis: string;
|
|
3050
|
+
timezone: string;
|
|
3051
|
+
windows: ({
|
|
3052
|
+
clv_avg_display: string | null;
|
|
3053
|
+
clv_avg_pct: number | null;
|
|
3054
|
+
clv_avg_pp: number | null;
|
|
3055
|
+
clv_avg_pp_display: string | null;
|
|
3056
|
+
clv_measured: number;
|
|
3057
|
+
clv_missing: number;
|
|
3058
|
+
expected_wins: number | null;
|
|
3059
|
+
expected_wins_display: string | null;
|
|
3060
|
+
from_date: string | null;
|
|
3061
|
+
key: string;
|
|
3062
|
+
label: string;
|
|
3063
|
+
numeric_unavailable: boolean;
|
|
3064
|
+
priced_decided: number;
|
|
3065
|
+
through_date: string;
|
|
3066
|
+
units: number | null;
|
|
3067
|
+
units_display: string | null;
|
|
3068
|
+
units_z: number | null;
|
|
3069
|
+
units_z_display: string | null;
|
|
3070
|
+
unpriced_decided: number;
|
|
3071
|
+
wins: number;
|
|
3072
|
+
wins_z: number | null;
|
|
3073
|
+
wins_z_display: string | null;
|
|
3074
|
+
})[];
|
|
3075
|
+
};
|
|
3076
|
+
market_types: {
|
|
3077
|
+
canonical_category?: string;
|
|
3078
|
+
clv_avg_display?: string;
|
|
3079
|
+
clv_avg_pct?: number;
|
|
3080
|
+
clv_avg_pp?: number;
|
|
3081
|
+
clv_avg_pp_display?: string;
|
|
3082
|
+
clv_measured: number;
|
|
3083
|
+
edge_display?: string;
|
|
3084
|
+
edge_pp?: number;
|
|
3085
|
+
key: string;
|
|
3086
|
+
label: string;
|
|
3087
|
+
losses: number;
|
|
3088
|
+
net_profit_display?: string;
|
|
3089
|
+
net_profit_usd?: number;
|
|
3090
|
+
pending: number;
|
|
3091
|
+
picks: number;
|
|
3092
|
+
priced_decided: number;
|
|
3093
|
+
priced_in_display?: string;
|
|
3094
|
+
priced_in_pct?: number;
|
|
3095
|
+
roi_display?: string;
|
|
3096
|
+
roi_pct?: number;
|
|
3097
|
+
settled: number;
|
|
3098
|
+
small_sample: boolean;
|
|
3099
|
+
staked_usd: number;
|
|
3100
|
+
unit_score?: number;
|
|
3101
|
+
unit_score_display?: string;
|
|
3102
|
+
void: number;
|
|
3103
|
+
win_rate_display?: string;
|
|
3104
|
+
win_rate_pct?: number;
|
|
3105
|
+
wins: number;
|
|
3106
|
+
}[];
|
|
3107
|
+
months: {
|
|
3108
|
+
canonical_category?: string;
|
|
3109
|
+
clv_avg_display?: string;
|
|
3110
|
+
clv_avg_pct?: number;
|
|
3111
|
+
clv_avg_pp?: number;
|
|
3112
|
+
clv_avg_pp_display?: string;
|
|
3113
|
+
clv_measured: number;
|
|
3114
|
+
edge_display?: string;
|
|
3115
|
+
edge_pp?: number;
|
|
3116
|
+
key: string;
|
|
3117
|
+
label: string;
|
|
3118
|
+
losses: number;
|
|
3119
|
+
net_profit_display?: string;
|
|
3120
|
+
net_profit_usd?: number;
|
|
3121
|
+
pending: number;
|
|
3122
|
+
picks: number;
|
|
3123
|
+
priced_decided: number;
|
|
3124
|
+
priced_in_display?: string;
|
|
3125
|
+
priced_in_pct?: number;
|
|
3126
|
+
roi_display?: string;
|
|
3127
|
+
roi_pct?: number;
|
|
3128
|
+
settled: number;
|
|
3129
|
+
small_sample: boolean;
|
|
3130
|
+
staked_usd: number;
|
|
3131
|
+
unit_score?: number;
|
|
3132
|
+
unit_score_display?: string;
|
|
3133
|
+
void: number;
|
|
3134
|
+
win_rate_display?: string;
|
|
3135
|
+
win_rate_pct?: number;
|
|
3136
|
+
wins: number;
|
|
3137
|
+
}[];
|
|
3138
|
+
outcome_stats: {
|
|
3139
|
+
concentration: {
|
|
3140
|
+
positive_wins: number;
|
|
3141
|
+
remaining_valued_decided: number;
|
|
3142
|
+
removed_wins: number;
|
|
3143
|
+
roi_without_top_wins_display: string | null;
|
|
3144
|
+
roi_without_top_wins_pct: number | null;
|
|
3145
|
+
target_wins: number;
|
|
3146
|
+
top_wins_share_display: string | null;
|
|
3147
|
+
top_wins_share_pct: number | null;
|
|
3148
|
+
valued_decided: number;
|
|
3149
|
+
};
|
|
3150
|
+
drawdown: {
|
|
3151
|
+
completed_days: number;
|
|
3152
|
+
current_days_below_peak: number | null;
|
|
3153
|
+
current_drawdown_display: string | null;
|
|
3154
|
+
current_drawdown_units: number | null;
|
|
3155
|
+
days_below_peak: number | null;
|
|
3156
|
+
excluded_days: number;
|
|
3157
|
+
from_date: string | null;
|
|
3158
|
+
longest_days_below_peak: number | null;
|
|
3159
|
+
longest_recovery_days: number | null;
|
|
3160
|
+
max_drawdown_display: string | null;
|
|
3161
|
+
max_drawdown_units: number | null;
|
|
3162
|
+
peak_date: string | null;
|
|
3163
|
+
peak_net_profit_usd: number | null;
|
|
3164
|
+
through_date: string | null;
|
|
3165
|
+
};
|
|
3166
|
+
profit_factor: {
|
|
3167
|
+
display: string | null;
|
|
3168
|
+
gross_loss_usd: number | null;
|
|
3169
|
+
gross_profit_usd: number | null;
|
|
3170
|
+
state: "empty" | "measured" | "no_losses" | "numeric_unavailable";
|
|
3171
|
+
value: number | null;
|
|
3172
|
+
valued_decided: number;
|
|
3173
|
+
};
|
|
3174
|
+
rolling: ({
|
|
3175
|
+
from_date: string | null;
|
|
3176
|
+
losses: number;
|
|
3177
|
+
roi_display: string | null;
|
|
3178
|
+
roi_pct: number | null;
|
|
3179
|
+
through_date: string | null;
|
|
3180
|
+
units: number | null;
|
|
3181
|
+
units_display: string | null;
|
|
3182
|
+
valued_decided: number;
|
|
3183
|
+
win_rate_display: string | null;
|
|
3184
|
+
win_rate_pct: number | null;
|
|
3185
|
+
window_size: number;
|
|
3186
|
+
wins: number;
|
|
3187
|
+
})[];
|
|
3188
|
+
};
|
|
3189
|
+
price_bands: {
|
|
3190
|
+
canonical_category?: string;
|
|
3191
|
+
clv_avg_display?: string;
|
|
3192
|
+
clv_avg_pct?: number;
|
|
3193
|
+
clv_avg_pp?: number;
|
|
3194
|
+
clv_avg_pp_display?: string;
|
|
3195
|
+
clv_measured: number;
|
|
3196
|
+
edge_display?: string;
|
|
3197
|
+
edge_pp?: number;
|
|
3198
|
+
key: string;
|
|
3199
|
+
label: string;
|
|
3200
|
+
losses: number;
|
|
3201
|
+
net_profit_display?: string;
|
|
3202
|
+
net_profit_usd?: number;
|
|
3203
|
+
pending: number;
|
|
3204
|
+
picks: number;
|
|
3205
|
+
priced_decided: number;
|
|
3206
|
+
priced_in_display?: string;
|
|
3207
|
+
priced_in_pct?: number;
|
|
3208
|
+
roi_display?: string;
|
|
3209
|
+
roi_pct?: number;
|
|
3210
|
+
settled: number;
|
|
3211
|
+
small_sample: boolean;
|
|
3212
|
+
staked_usd: number;
|
|
3213
|
+
unit_score?: number;
|
|
3214
|
+
unit_score_display?: string;
|
|
3215
|
+
void: number;
|
|
3216
|
+
win_rate_display?: string;
|
|
3217
|
+
win_rate_pct?: number;
|
|
3218
|
+
wins: number;
|
|
3219
|
+
}[];
|
|
3220
|
+
records: {
|
|
3221
|
+
best_day?: {
|
|
3222
|
+
date: string;
|
|
3223
|
+
date_display: string;
|
|
3224
|
+
losses: number;
|
|
3225
|
+
net_profit_display: string;
|
|
3226
|
+
net_profit_usd: number;
|
|
3227
|
+
picks: number;
|
|
3228
|
+
wins: number;
|
|
3229
|
+
};
|
|
3230
|
+
biggest_win?: {
|
|
3231
|
+
category: string;
|
|
3232
|
+
date: string;
|
|
3233
|
+
date_display: string;
|
|
3234
|
+
matchup: string;
|
|
3235
|
+
net_profit_display: string;
|
|
3236
|
+
net_profit_usd: number;
|
|
3237
|
+
};
|
|
3238
|
+
longest_losing_day_streak?: {
|
|
3239
|
+
days: number;
|
|
3240
|
+
end_date: string;
|
|
3241
|
+
net_profit_display: string;
|
|
3242
|
+
net_profit_usd: number;
|
|
3243
|
+
range_display: string;
|
|
3244
|
+
start_date: string;
|
|
3245
|
+
};
|
|
3246
|
+
longest_winning_day_streak?: {
|
|
3247
|
+
days: number;
|
|
3248
|
+
end_date: string;
|
|
3249
|
+
net_profit_display: string;
|
|
3250
|
+
net_profit_usd: number;
|
|
3251
|
+
range_display: string;
|
|
3252
|
+
start_date: string;
|
|
3253
|
+
};
|
|
3254
|
+
sweeps: {
|
|
3255
|
+
clean_sweeps: number;
|
|
3256
|
+
latest_clean_sweep?: {
|
|
3257
|
+
date: string;
|
|
3258
|
+
date_display: string;
|
|
3259
|
+
losses: number;
|
|
3260
|
+
wins: number;
|
|
3261
|
+
};
|
|
3262
|
+
latest_wipeout?: {
|
|
3263
|
+
date: string;
|
|
3264
|
+
date_display: string;
|
|
3265
|
+
losses: number;
|
|
3266
|
+
wins: number;
|
|
3267
|
+
};
|
|
3268
|
+
min_decided: number;
|
|
3269
|
+
wipeouts: number;
|
|
3270
|
+
};
|
|
3271
|
+
winning_days?: {
|
|
3272
|
+
flat: number;
|
|
3273
|
+
losing: number;
|
|
3274
|
+
settled: number;
|
|
3275
|
+
winning: number;
|
|
3276
|
+
winning_pct: number;
|
|
3277
|
+
winning_pct_display: string;
|
|
3278
|
+
};
|
|
3279
|
+
worst_day?: {
|
|
3280
|
+
date: string;
|
|
3281
|
+
date_display: string;
|
|
3282
|
+
losses: number;
|
|
3283
|
+
net_profit_display: string;
|
|
3284
|
+
net_profit_usd: number;
|
|
3285
|
+
picks: number;
|
|
3286
|
+
wins: number;
|
|
3287
|
+
};
|
|
3288
|
+
};
|
|
3289
|
+
sports: {
|
|
3290
|
+
canonical_category?: string;
|
|
3291
|
+
clv_avg_display?: string;
|
|
3292
|
+
clv_avg_pct?: number;
|
|
3293
|
+
clv_avg_pp?: number;
|
|
3294
|
+
clv_avg_pp_display?: string;
|
|
3295
|
+
clv_measured: number;
|
|
3296
|
+
edge_display?: string;
|
|
3297
|
+
edge_pp?: number;
|
|
3298
|
+
key: string;
|
|
3299
|
+
label: string;
|
|
3300
|
+
losses: number;
|
|
3301
|
+
net_profit_display?: string;
|
|
3302
|
+
net_profit_usd?: number;
|
|
3303
|
+
pending: number;
|
|
3304
|
+
picks: number;
|
|
3305
|
+
priced_decided: number;
|
|
3306
|
+
priced_in_display?: string;
|
|
3307
|
+
priced_in_pct?: number;
|
|
3308
|
+
roi_display?: string;
|
|
3309
|
+
roi_pct?: number;
|
|
3310
|
+
settled: number;
|
|
3311
|
+
small_sample: boolean;
|
|
3312
|
+
staked_usd: number;
|
|
3313
|
+
unit_score?: number;
|
|
3314
|
+
unit_score_display?: string;
|
|
3315
|
+
void: number;
|
|
3316
|
+
win_rate_display?: string;
|
|
3317
|
+
win_rate_pct?: number;
|
|
3318
|
+
wins: number;
|
|
3319
|
+
}[];
|
|
3320
|
+
streaks: {
|
|
3321
|
+
current?: number;
|
|
3322
|
+
current_day?: number;
|
|
3323
|
+
current_day_display?: string;
|
|
3324
|
+
current_display?: string;
|
|
3325
|
+
longest_loss: number;
|
|
3326
|
+
longest_win: number;
|
|
3327
|
+
};
|
|
3328
|
+
tiers: {
|
|
3329
|
+
canonical_category?: string;
|
|
3330
|
+
clv_avg_display?: string;
|
|
3331
|
+
clv_avg_pct?: number;
|
|
3332
|
+
clv_avg_pp?: number;
|
|
3333
|
+
clv_avg_pp_display?: string;
|
|
3334
|
+
clv_measured: number;
|
|
3335
|
+
edge_display?: string;
|
|
3336
|
+
edge_pp?: number;
|
|
3337
|
+
key: string;
|
|
3338
|
+
label: string;
|
|
3339
|
+
losses: number;
|
|
3340
|
+
net_profit_display?: string;
|
|
3341
|
+
net_profit_usd?: number;
|
|
3342
|
+
pending: number;
|
|
3343
|
+
picks: number;
|
|
3344
|
+
priced_decided: number;
|
|
3345
|
+
priced_in_display?: string;
|
|
3346
|
+
priced_in_pct?: number;
|
|
3347
|
+
roi_display?: string;
|
|
3348
|
+
roi_pct?: number;
|
|
3349
|
+
settled: number;
|
|
3350
|
+
small_sample: boolean;
|
|
3351
|
+
staked_usd: number;
|
|
3352
|
+
unit_score?: number;
|
|
3353
|
+
unit_score_display?: string;
|
|
3354
|
+
void: number;
|
|
3355
|
+
win_rate_display?: string;
|
|
3356
|
+
win_rate_pct?: number;
|
|
3357
|
+
wins: number;
|
|
3358
|
+
}[];
|
|
3359
|
+
total_sides: {
|
|
3360
|
+
canonical_category?: string;
|
|
3361
|
+
clv_avg_display?: string;
|
|
3362
|
+
clv_avg_pct?: number;
|
|
3363
|
+
clv_avg_pp?: number;
|
|
3364
|
+
clv_avg_pp_display?: string;
|
|
3365
|
+
clv_measured: number;
|
|
3366
|
+
edge_display?: string;
|
|
3367
|
+
edge_pp?: number;
|
|
3368
|
+
key: string;
|
|
3369
|
+
label: string;
|
|
3370
|
+
losses: number;
|
|
3371
|
+
net_profit_display?: string;
|
|
3372
|
+
net_profit_usd?: number;
|
|
3373
|
+
pending: number;
|
|
3374
|
+
picks: number;
|
|
3375
|
+
priced_decided: number;
|
|
3376
|
+
priced_in_display?: string;
|
|
3377
|
+
priced_in_pct?: number;
|
|
3378
|
+
roi_display?: string;
|
|
3379
|
+
roi_pct?: number;
|
|
3380
|
+
settled: number;
|
|
3381
|
+
small_sample: boolean;
|
|
3382
|
+
staked_usd: number;
|
|
3383
|
+
unit_score?: number;
|
|
3384
|
+
unit_score_display?: string;
|
|
3385
|
+
void: number;
|
|
3386
|
+
win_rate_display?: string;
|
|
3387
|
+
win_rate_pct?: number;
|
|
3388
|
+
wins: number;
|
|
3389
|
+
}[];
|
|
3390
|
+
voids: {
|
|
3391
|
+
backed_price?: number;
|
|
3392
|
+
backed_side?: string;
|
|
3393
|
+
category?: string;
|
|
3394
|
+
matchup?: string;
|
|
3395
|
+
pick_date: string;
|
|
3396
|
+
pick_id: string;
|
|
3397
|
+
pick_rank: number;
|
|
3398
|
+
}[];
|
|
3399
|
+
};
|
|
2580
3400
|
/** A settled uncommitted pick's market, side and price. The same eight fields as PickOfTheDayCommitmentPayload, in the same key order, so a settled pick's side and price sit under payload whatever the entry's state. It is NOT a commitment: no hash was taken over it before the game, and it proves nothing about when the pick was made. */
|
|
2581
3401
|
export type PickOfTheDayUncommittedPayload = {
|
|
2582
3402
|
/** Frozen pre-game price of the backed side, 0..1, as the plain decimal text of the stored NUMERIC at full stored precision, trailing zeros included -- rendered exactly as the commitment payload renders it. */
|
|
@@ -2623,7 +3443,7 @@ export type PickSportsTeam = {
|
|
|
2623
3443
|
label: string | null;
|
|
2624
3444
|
/** Abbreviated team label (e.g. "POR"). */
|
|
2625
3445
|
short_label: string | null;
|
|
2626
|
-
/**
|
|
3446
|
+
/** The name to show for this team or competitor, the same on every surface (e.g. "UCF Knights", "Oklahoma City Thunder", "Portugal"). `label` keeps the market outcome's own spelling. */
|
|
2627
3447
|
full_name: string | null;
|
|
2628
3448
|
/** Provider team identifier (Polymarket /teams id). */
|
|
2629
3449
|
provider_id: number | null;
|
|
@@ -2650,6 +3470,10 @@ export type PickSportsTeam = {
|
|
|
2650
3470
|
headshot_revision?: number;
|
|
2651
3471
|
/** Optional latest retrieved ATP/WTA singles rank for this player. Absent for unranked, ambiguous, doubles, expired, or unavailable identities. This is not rank at match time. */
|
|
2652
3472
|
ranking?: TennisRanking;
|
|
3473
|
+
/** True when artwork measurements show that the team mark disappears on a white background and needs a dark plate there: the light-background twin of logo_mark_dark. Vendored crest verdicts are tied to the exact asset bytes; provider artwork is measured on white by the teams sync. Always sent; false when no current measurement marks the logo light. */
|
|
3474
|
+
logo_mark_light: boolean;
|
|
3475
|
+
/** True when logo_mark_dark and logo_mark_light are both measurements of this exact logo URL, so their false means the mark is legible on that background. Every vendored crest is measured; a provider logo is measured once the teams sync has scored it, usually within a few hourly cycles of first appearing. Always sent; false while the logo is not measured yet. */
|
|
3476
|
+
logo_mark_measured: boolean;
|
|
2653
3477
|
};
|
|
2654
3478
|
export type PlatformCapabilities = {
|
|
2655
3479
|
grade: PlatformCapabilityStatus;
|
|
@@ -2686,7 +3510,7 @@ export type PnlCorrection = {
|
|
|
2686
3510
|
amount: number;
|
|
2687
3511
|
/** Polymarket's net realized P&L plus amount. Since 2026-10-22 the grade reads this figure's sports and esports share. Omitted when Polymarket's figure is. */
|
|
2688
3512
|
realized?: number;
|
|
2689
|
-
/** Polymarket's net total P&L
|
|
3513
|
+
/** Polymarket's net total P&L over every Polymarket market of the wallet, plus amount. Omitted when Polymarket's figure is, and on leaderboard entries. */
|
|
2690
3514
|
net_total?: number;
|
|
2691
3515
|
/** The newest measurement among the measured markets. */
|
|
2692
3516
|
as_of: string;
|
|
@@ -2729,10 +3553,16 @@ export type Position = {
|
|
|
2729
3553
|
address: string;
|
|
2730
3554
|
username?: string;
|
|
2731
3555
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2732
|
-
/**
|
|
3556
|
+
/** Sports and esports win rate as a ratio from 0 to 1 (0.62 means 62%): wins over the decided sports and esports markets on the wallet's record, the same figure as pnl.in_scope.win_rate and stats.win_rate on GET /api/v1/trader/{address}. Since 2026-10-27 it no longer counts other markets (#29953). Absent when the wallet has no record or no decided market. */
|
|
2733
3557
|
win_rate?: number;
|
|
2734
|
-
/**
|
|
3558
|
+
/**
|
|
3559
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's net total P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29953). Read trader.in_scope_realized_pnl.
|
|
3560
|
+
* @deprecated
|
|
3561
|
+
*/
|
|
2735
3562
|
pnl?: number;
|
|
3563
|
+
/** The wallet's realized P&L in USD on sports and esports markets, the figure the 0xinsider profile shows: the record behind pnl.in_scope.realized_pnl on GET /api/v1/trader/{address}, to cents. For a graded wallet it is read from the latest grading pass, so it can trail that figure until the next pass. Omitted until 0xinsider has computed the wallet's record (#29953). */
|
|
3564
|
+
in_scope_realized_pnl?: number;
|
|
3565
|
+
/** Sports and esports markets on the wallet's record, pnl.in_scope.markets on GET /api/v1/trader/{address}. Since 2026-10-27 it no longer counts other markets (#29953). Absent when the wallet has no record. */
|
|
2736
3566
|
markets?: number;
|
|
2737
3567
|
/** Days since the wallet's first-seen time. For a wallet 0xinsider first recorded on or after March 21, 2026, that is when 0xinsider recorded it. For a wallet recorded earlier, it is usually the wallet's first Polymarket activity, so the age can run to years. It is not the wallet's on-chain age or the time of its first trade. Absent when the first-seen time is unknown. */
|
|
2738
3568
|
wallet_age_days?: number;
|
|
@@ -2871,7 +3701,7 @@ export type ReportPayload = {
|
|
|
2871
3701
|
/** Trader pseudonym, when no display name is known. */
|
|
2872
3702
|
pseudonym: string | null;
|
|
2873
3703
|
/** Trader grade (S-F) at snapshot time. */
|
|
2874
|
-
trader_grade:
|
|
3704
|
+
trader_grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2875
3705
|
})[] | null;
|
|
2876
3706
|
top_whale_trades: ({
|
|
2877
3707
|
/** Provider outcome label for the traded side. */
|
|
@@ -2899,11 +3729,19 @@ export type ReportPayload = {
|
|
|
2899
3729
|
/** Trader pseudonym, when no display name is known. */
|
|
2900
3730
|
pseudonym: string | null;
|
|
2901
3731
|
/** Trader grade (S-F) at snapshot time. */
|
|
2902
|
-
trader_grade:
|
|
3732
|
+
trader_grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
3733
|
+
})[] | null;
|
|
3734
|
+
categories: ({
|
|
3735
|
+
category: string | null;
|
|
3736
|
+
large_trade_count: number | null;
|
|
3737
|
+
whale_trade_count: number | null;
|
|
3738
|
+
category_volume: number | null;
|
|
2903
3739
|
})[] | null;
|
|
2904
|
-
categories: Record<string, unknown>[] | null;
|
|
2905
3740
|
/** 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. */
|
|
2906
|
-
grade_distribution:
|
|
3741
|
+
grade_distribution: ({
|
|
3742
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
3743
|
+
count: number | null;
|
|
3744
|
+
})[] | null;
|
|
2907
3745
|
/** Which markets the report counts. sports_and_esports for a period that ends on or after 2026-10-21: totals, categories, top trades and the grade cohort cover sports and esports markets only. all_markets for an earlier period, whose stored report keeps every Polymarket market it published. */
|
|
2908
3746
|
market_scope: "all_markets" | "sports_and_esports";
|
|
2909
3747
|
};
|
|
@@ -2927,6 +3765,60 @@ export type ReportSourceRange = {
|
|
|
2927
3765
|
end_date: string;
|
|
2928
3766
|
timezone: "UTC";
|
|
2929
3767
|
};
|
|
3768
|
+
export type ResolutionReport = {
|
|
3769
|
+
accuracy: number | null;
|
|
3770
|
+
all_wallets_accuracy: number | null;
|
|
3771
|
+
all_wallets_right: number | null;
|
|
3772
|
+
all_wallets_wrong: number | null;
|
|
3773
|
+
date: string | null;
|
|
3774
|
+
generated_at: string | null;
|
|
3775
|
+
grade_basis: "at_resolution" | "current" | null;
|
|
3776
|
+
market_scope: "all_markets" | "sports_and_esports";
|
|
3777
|
+
markets?: ({
|
|
3778
|
+
all_wallets_right: boolean | null;
|
|
3779
|
+
category: string | null;
|
|
3780
|
+
condition_id: string | null;
|
|
3781
|
+
confidence: number | null;
|
|
3782
|
+
event_slug: string | null;
|
|
3783
|
+
out_of_product_scope: boolean;
|
|
3784
|
+
outcome_no: string | null;
|
|
3785
|
+
outcome_yes: string | null;
|
|
3786
|
+
report_at: string;
|
|
3787
|
+
smart_consensus: string | null;
|
|
3788
|
+
smart_right: boolean | null;
|
|
3789
|
+
smart_trader_count: number | null;
|
|
3790
|
+
time_basis: "polymarket_gamma_closed_time" | "observed_resolution";
|
|
3791
|
+
title: string | null;
|
|
3792
|
+
total_smart_pnl: number | null;
|
|
3793
|
+
traders: ({
|
|
3794
|
+
address: string | null;
|
|
3795
|
+
correct: boolean | null;
|
|
3796
|
+
cost: number | null;
|
|
3797
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
3798
|
+
last_traded_at: string | null;
|
|
3799
|
+
pnl: number | null;
|
|
3800
|
+
side: string | null;
|
|
3801
|
+
username: string | null;
|
|
3802
|
+
})[];
|
|
3803
|
+
weighted_no: number | null;
|
|
3804
|
+
weighted_yes: number | null;
|
|
3805
|
+
winning_outcome: number | null;
|
|
3806
|
+
})[];
|
|
3807
|
+
markets_without_smart_positions: number | null;
|
|
3808
|
+
no_consensus: number | null;
|
|
3809
|
+
positions_grade_unknown: number | null;
|
|
3810
|
+
positions_without_side: number | null;
|
|
3811
|
+
smart_money_right: number | null;
|
|
3812
|
+
smart_money_wrong: number | null;
|
|
3813
|
+
source_updates_pending: boolean;
|
|
3814
|
+
time_basis_counts: {
|
|
3815
|
+
observed_resolution: number;
|
|
3816
|
+
polymarket_gamma_closed_time: number;
|
|
3817
|
+
} | null;
|
|
3818
|
+
total_resolved: number | null;
|
|
3819
|
+
total_smart_pnl: number | null;
|
|
3820
|
+
with_smart_positions: number | null;
|
|
3821
|
+
};
|
|
2930
3822
|
export type ResponseMeta = {
|
|
2931
3823
|
/** 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. */
|
|
2932
3824
|
request_id: string;
|
|
@@ -3091,6 +3983,50 @@ export type SnapshotState = {
|
|
|
3091
3983
|
/** When this body's source read started, the clock finality is judged on. null for a body stored before that clock was recorded. */
|
|
3092
3984
|
source_read_started_at: string | null;
|
|
3093
3985
|
};
|
|
3986
|
+
export type SportLeaderboard = {
|
|
3987
|
+
as_of: string | null;
|
|
3988
|
+
category: string | null;
|
|
3989
|
+
edge_average: number | null;
|
|
3990
|
+
league: {
|
|
3991
|
+
name: string;
|
|
3992
|
+
ranked_traders: number;
|
|
3993
|
+
slug: string;
|
|
3994
|
+
} | null;
|
|
3995
|
+
limit: number;
|
|
3996
|
+
min_resolved: number;
|
|
3997
|
+
rows: ({
|
|
3998
|
+
address: string;
|
|
3999
|
+
cost: number | null;
|
|
4000
|
+
edge_hold: "category_loss" | "record_incomplete" | null;
|
|
4001
|
+
edge_skill: number | null;
|
|
4002
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
4003
|
+
id: string;
|
|
4004
|
+
last_category_trade_at: string | null;
|
|
4005
|
+
losses: number;
|
|
4006
|
+
n_resolved: number;
|
|
4007
|
+
platform: "polymarket";
|
|
4008
|
+
pnl: number | null;
|
|
4009
|
+
price_edge: {
|
|
4010
|
+
avg_price: number;
|
|
4011
|
+
edge: number;
|
|
4012
|
+
edge_lower: number;
|
|
4013
|
+
hit_rate: number;
|
|
4014
|
+
markets: number;
|
|
4015
|
+
status: "ranked" | "too_few_markets" | "sample_mismatch";
|
|
4016
|
+
} | null;
|
|
4017
|
+
rank: number;
|
|
4018
|
+
roi: number | null;
|
|
4019
|
+
username: string | null;
|
|
4020
|
+
volume: number | null;
|
|
4021
|
+
win_rate: number | null;
|
|
4022
|
+
win_rate_wilson_lb: number | null;
|
|
4023
|
+
wins: number;
|
|
4024
|
+
})[];
|
|
4025
|
+
sort: "edge" | "pnl" | "win_rate";
|
|
4026
|
+
sport: string;
|
|
4027
|
+
total_traders: number;
|
|
4028
|
+
volume_scope: "sports_and_esports";
|
|
4029
|
+
};
|
|
3094
4030
|
export type SuspiciousTrade = {
|
|
3095
4031
|
/** Prefixed ID (rf_...). */
|
|
3096
4032
|
id: string;
|
|
@@ -3145,7 +4081,7 @@ export type SuspiciousTradeFlaggedData = {
|
|
|
3145
4081
|
/** Fill price of the flagged trade. */
|
|
3146
4082
|
price: number;
|
|
3147
4083
|
};
|
|
3148
|
-
/** Optional current-game tennis facts from API-Tennis, aligned with live_score.scores display order. These facts have their own revision and expiry; Polymarket remains the source of sets, match status, period, and the outer live-score revision. New observations require corroborated identity, current set/games, and live state. Cached responses and replayed frames may still carry expired facts, so clients must enforce expires_at. */
|
|
4084
|
+
/** Optional current-game tennis facts from API-Tennis, aligned with live_score.scores display order. These facts have their own revision and expiry; Polymarket remains the source of sets, match status, period, and the outer live-score revision. New observations require corroborated identity, current set/games, and live state. Where Polymarket publishes no score (tennis doubles, whose live_score reads one 0-0 set throughout), the group binds on both pairs' names, the tour, the date and API-Tennis's live flag, and carries set_games, the provider's set score for the match. Cached responses and replayed frames may still carry expired facts, so clients must enforce expires_at. */
|
|
3149
4085
|
export type TennisPoints = {
|
|
3150
4086
|
source: "api_tennis";
|
|
3151
4087
|
/** API-Tennis match ID. This is not a Polymarket market or event ID. */
|
|
@@ -3162,10 +4098,12 @@ export type TennisPoints = {
|
|
|
3162
4098
|
observed_at: string;
|
|
3163
4099
|
/** Stop displaying the point group at this instant, even if the enclosing score remains fresh. The group expires 30 seconds after observed_at. */
|
|
3164
4100
|
expires_at: string;
|
|
3165
|
-
/** Current set number. Display points only while this matches the enclosing scoreboard. */
|
|
4101
|
+
/** Current set number. Display points only while this matches the enclosing scoreboard, unless set_games is present. */
|
|
3166
4102
|
set_number: number;
|
|
3167
|
-
/** Current-set games in first/second order. Display points only while these match the enclosing scoreboard. */
|
|
4103
|
+
/** Current-set games in first/second order. Display points only while these match the enclosing scoreboard, unless set_games is present. */
|
|
3168
4104
|
games: number[];
|
|
4105
|
+
/** API-Tennis games in every listed set, first set first, each in first/second order. Present only when Polymarket publishes no score for the match (tennis doubles): display these as the set score, and discard the group once live_score carries a nonzero game. A deciding match tie-break is listed as games, for example 9-5. Omitted for every other match. */
|
|
4106
|
+
set_games?: number[][];
|
|
3169
4107
|
};
|
|
3170
4108
|
/** A provider-reported ATP/WTA singles rank with independent retrieval and expiry clocks. API-Tennis provides no ranking publication date. Retrieval time does not establish when the tour published the ranking. */
|
|
3171
4109
|
export type TennisRanking = {
|
|
@@ -3195,29 +4133,52 @@ export type Trader = {
|
|
|
3195
4133
|
forecast_evidence?: number;
|
|
3196
4134
|
rank?: number;
|
|
3197
4135
|
pnl: {
|
|
3198
|
-
/**
|
|
4136
|
+
/**
|
|
4137
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's all-time leaderboard P&L, which covered every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29830). Read pnl.in_scope.realized_pnl.
|
|
4138
|
+
* @deprecated
|
|
4139
|
+
*/
|
|
3199
4140
|
total?: number;
|
|
3200
|
-
/**
|
|
4141
|
+
/**
|
|
4142
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's net total P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29830). Read pnl.in_scope.realized_pnl.
|
|
4143
|
+
* @deprecated
|
|
4144
|
+
*/
|
|
3201
4145
|
net_total?: number;
|
|
3202
|
-
/**
|
|
4146
|
+
/**
|
|
4147
|
+
* Deprecated since 2026-10-27 and never sent. It was the neg-risk conversion correction to the wallet-wide pnl.net_total and pnl.realized (#29830). Its sports and esports part is inside pnl.in_scope.realized_pnl.
|
|
4148
|
+
* @deprecated
|
|
4149
|
+
*/
|
|
3203
4150
|
correction?: PnlCorrection;
|
|
3204
|
-
/** true while 0xinsider is still checking some of the wallet's converted neg-risk markets with a sports or esports event (not yet measured, measured and not yet checked for transfers, or its latest reads keep failing), so the correction may change, or arrive where none is published yet. Omitted otherwise. */
|
|
4151
|
+
/** true while 0xinsider is still checking some of the wallet's converted neg-risk markets with a sports or esports event (not yet measured, measured and not yet checked for transfers, or its latest reads keep failing), so the correction's part inside pnl.in_scope.realized_pnl may change, or arrive where none is published yet. Omitted otherwise. */
|
|
3205
4152
|
correction_pending?: boolean;
|
|
3206
|
-
/**
|
|
4153
|
+
/**
|
|
4154
|
+
* Deprecated since 2026-10-27 and never sent. It was native Polymarket realized P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29830). Read pnl.in_scope.realized_pnl.
|
|
4155
|
+
* @deprecated
|
|
4156
|
+
*/
|
|
3207
4157
|
realized?: number;
|
|
4158
|
+
/** Unrealized (mark-to-market) P&L in USD of the wallet's open positions on its synced sports and esports markets: Polymarket's cashPnl, current value minus cost, summed over the positions still held, from the open-position aggregate (dated by the positions data_quality group). It is the same figure as position_summary.unrealized_mtm on GET /api/v1/trader/{address}/context. It leaves out the realized P&L of partial sells on those markets, which pnl.in_scope.realized_pnl already counts; until 2026-11-02 (#32459) it added it, so pnl.in_scope.realized_pnl plus pnl.unrealized counted those sells twice. Each open position's market is judged when the aggregate is read (#32119), so a stored position on a market of another category (one that moved out of sports and esports, or one stored before its category was known) is left out. Before 2026-10-27 (#29366) it covered every Polymarket market. */
|
|
3208
4159
|
unrealized?: number;
|
|
3209
|
-
/**
|
|
4160
|
+
/**
|
|
4161
|
+
* Deprecated since 2026-10-27 and never sent: its one member was the lossless counterpart of the retired pnl.realized (#29830).
|
|
4162
|
+
* @deprecated
|
|
4163
|
+
*/
|
|
3210
4164
|
exact?: TraderPnlExact;
|
|
3211
|
-
/** Additive (#27311): the wallet's sports and esports record, the figure the 0xinsider profile headlines. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero.
|
|
4165
|
+
/** Additive (#27311): the wallet's sports and esports record, the figure the 0xinsider profile headlines, dated by the sports_record data_quality group. Omitted until 0xinsider has computed the wallet's record; absent means not computed yet, never zero. Also omitted for a wallet that traded no sports or esports market, which never gets a record: then stats.markets_traded is 0 and the sports_record group is partial with owner traders.last_synced (since 2026-10-29, #30589, #30657). Also omitted for a wallet that trades only combos and holds no single sports or esports market: the record counts single markets, so it has none, stats.markets_traded and stats.win_rate are omitted, and the sports_record group is partial with owner traders.last_synced (since 2026-10-29, #30637). Since 2026-10-27 it is the wallet's only P&L figure besides pnl.unrealized (#29830). */
|
|
3212
4166
|
in_scope?: TraderPnlInScope;
|
|
3213
4167
|
};
|
|
4168
|
+
/** Sports and esports markets only since 2026-10-27 (#29830): markets_traded and win_rate come from the wallet's sports and esports record (pnl.in_scope), and total_volume from its stored trade days. A wallet that traded no sports or esports market never gets a record: markets_traded is 0 and win_rate is omitted (since 2026-10-29, #30589, #30657). A wallet that trades only combos has no record either: both are omitted (since 2026-10-29, #30637). */
|
|
3214
4169
|
stats: {
|
|
4170
|
+
/** Sports and esports markets the wallet traded, any status: pnl.in_scope.markets, dated by the sports_record data_quality group. Omitted until the record is computed. 0 for a wallet that traded no sports or esports market, which never gets a record: at its last completed sync Polymarket counted no market for it, or the sync read its Polymarket positions and found no sports or esports market; none is stored, and no Polymarket sports or esports board lists it; the sports_record group then carries the sync clock (since 2026-10-29, #30589; the second case since #30657). Omitted for a wallet that trades only combos and holds no single sports or esports market, which has no record (since 2026-10-29, #30637). Counted every Polymarket market before 2026-10-27. */
|
|
3215
4171
|
markets_traded?: number;
|
|
4172
|
+
/** Won over decided sports and esports markets, 0 to 1: pnl.in_scope.win_rate truncated to four places, dated by the sports_record data_quality group. Omitted until the record is computed, while the wallet has no decided sports or esports market, for a wallet that traded no sports or esports market (#30589, #30657), and for one that trades only combos (#30637). Counted every Polymarket market before 2026-10-27. */
|
|
3216
4173
|
win_rate?: number;
|
|
4174
|
+
/**
|
|
4175
|
+
* Deprecated since 2026-10-27 and never sent. It counted mark-to-market days over every Polymarket market of the wallet (#29830). Read stats.all.win_days and stats.all.loss_days from GET /api/v1/trader/{address}/pnl, which count sports and esports days.
|
|
4176
|
+
* @deprecated
|
|
4177
|
+
*/
|
|
3217
4178
|
daily_win_rate?: number;
|
|
3218
|
-
/**
|
|
4179
|
+
/** Sports and esports USD volume, all time: the sum of every stored trade day's in-scope volume (trader_trade_daily_rollups.in_scope_volume_total), the profile's Volume traded. Dated by the volume data_quality group, which carries the trader sync clock. 0 for a synced wallet with no stored trade day. Omitted before the wallet's first completed sync and while any stored day's in-scope volume is not computed yet, so a partial sum is never served. Polymarket's full-history wallet-wide volume before 2026-10-27 (#29830). */
|
|
3219
4180
|
total_volume?: number;
|
|
3220
|
-
/** Additive lossless counterpart to `total_volume
|
|
4181
|
+
/** Additive lossless counterpart to `total_volume`, present exactly when it is. */
|
|
3221
4182
|
exact?: TraderStatsExact;
|
|
3222
4183
|
};
|
|
3223
4184
|
strategy?: {
|
|
@@ -3228,7 +4189,10 @@ export type Trader = {
|
|
|
3228
4189
|
};
|
|
3229
4190
|
/** Per-category rank context when expand=categories is requested. Values include available rank, category totals, performance and record counts; scaled_total_pnl is a legacy alias of total_pnl. Its measurement basis and update timing differ from the plain record returned by GET /api/v1/trader/{address}/categories, so the two need not agree. Use this for rank context and that route for the plain record. Sports and esports only (#28761): keys are sports and esports categories, and a category outside them is omitted, as on that route. The inner key-set is intentionally unconstrained and may contain additional compatibility fields. */
|
|
3230
4191
|
category_strengths?: Record<string, unknown>;
|
|
3231
|
-
/**
|
|
4192
|
+
/**
|
|
4193
|
+
* Deprecated since 2026-10-27 and never sent. These advanced risk and performance metrics covered every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29589). expand=quant_metrics is still accepted and adds nothing. For the sports and esports record read pnl.in_scope here, and GET /api/v1/trader/{address}/pnl for its daily series. The member shape below is what the object held before; it is kept so existing type declarations still compile.
|
|
4194
|
+
* @deprecated
|
|
4195
|
+
*/
|
|
3232
4196
|
quant_metrics?: {
|
|
3233
4197
|
/** Trader smart score on a 0..100 display scale; higher is stronger. Null when unavailable. */
|
|
3234
4198
|
smart_score: number | null;
|
|
@@ -3249,11 +4213,13 @@ export type Trader = {
|
|
|
3249
4213
|
/** Cross-sectional percentile rank of edge consistency versus all traders, 0-100. null when insufficient history. */
|
|
3250
4214
|
consistency_percentile: number | null;
|
|
3251
4215
|
};
|
|
4216
|
+
/** When the wallet last traded: its most recent recorded trade, the same value the leaderboard entry's last_active carries (which re-reads it hourly). A cached body (meta.cached true) can lag a new trade by up to 60 seconds. No data_quality group dates it: the value is itself a trade time. Since 2026-11-02 (#32324); before, it carried the time 0xinsider last synced the wallet, the same value as synced_at. Omitted when the wallet has no recorded trade. */
|
|
3252
4217
|
last_active?: string;
|
|
4218
|
+
/** When 0xinsider last completed a sync of the wallet (traders.last_synced), dated by the sync data_quality group. Not when the wallet traded: read last_active for that. */
|
|
3253
4219
|
synced_at?: string;
|
|
3254
4220
|
/** synced, unknown, or pending. */
|
|
3255
4221
|
sync_status?: string;
|
|
3256
|
-
/** Data age and coverage for this trader body. Always present. Its six groups are sync (traders.last_synced, covering
|
|
4222
|
+
/** Data age and coverage for this trader body. Always present. Its six groups are sync (traders.last_synced, covering synced_at and sync_status; it covered last_active until 2026-11-02, #32324, and no group covers last_active now, since the value is itself a trade time), sports_record (trader_product_scope_records.computed_at, covering pnl.in_scope, stats.markets_traded and stats.win_rate: unavailable until the wallet's sports and esports record is computed, partial while it has no decided sports or esports market; for a wallet that traded no sports or esports market, which never gets a record, partial with owner traders.last_synced, as of the completed sync that found none, stats.markets_traded 0 and pnl.in_scope and stats.win_rate omitted, since 2026-10-29, #30589, #30657; for a wallet that trades only combos and holds no single sports or esports market, partial with owner traders.last_synced and all three omitted, since 2026-10-29, #30637), ranking (trader_rankings.computed_at, covering grade, score, streak_tier, forecast_score and forecast_evidence), leaderboard_rank (leaderboard_rank_refresh_state.completed_at, the completion time of the latest fully completed global rank refresh, covering rank), volume (traders.last_synced, covering stats.total_volume, the sum of the trade days the sync stores: unavailable before the first completed sync and while a stored day's sports and esports volume is not computed) and positions (trader_position_snapshots.last_refreshed_at with traders.last_synced as fallback, covering pnl.unrealized, the open-position aggregate). Since 2026-10-27 (#29830) there is no leaderboard_pnl group, and volume is dated by the sync clock instead of trader_usd_volume.observed_at. The positions clock is the latest successful /positions snapshot when one exists, otherwise the last completed trader sync. A rank or position value remains unknown or unavailable when its clock or value is absent. For an unknown wallet every group is unavailable. If the open-position read itself fails, positions is unavailable with a reason that says so, pnl.unrealized is absent, and the body is answered fresh (meta.cached false) and is not kept for later callers. */
|
|
3257
4223
|
data_quality: DataQuality;
|
|
3258
4224
|
/** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
|
|
3259
4225
|
trust?: TraderTrust;
|
|
@@ -3291,31 +4257,37 @@ export type TraderCategoryRecords = {
|
|
|
3291
4257
|
};
|
|
3292
4258
|
export type TraderContext = {
|
|
3293
4259
|
trader: Trader;
|
|
3294
|
-
/** Aggregate position and P&L coverage for the trader.
|
|
4260
|
+
/** Aggregate position and P&L coverage for the trader, over its synced markets. markets_open, unrealized_mtm and cost_basis_locked cover the open positions on sports and esports markets, each market judged when the summary is read (#32119). markets_synced, markets_resolved and the resolved win figures count every stored market: since 2026-10-27 (#29366) those are mostly sports and esports markets, but a market that moved out of sports and esports, or one stored before its category was known, stays in them, and sync_coverage counts every category on both sides. markets_total, total_realized_pnl and synced_realized_pnl still cover every Polymarket market of the wallet. Omitted entirely (key absent, never null) when the trader is not in the local database or native net economics is unavailable. Realized fields remain numbers when present, including a genuine zero. */
|
|
3295
4261
|
position_summary?: {
|
|
3296
|
-
/**
|
|
4262
|
+
/** Polymarket's count of the markets the wallet traded, every category, when known; null when the provider total is unavailable. */
|
|
3297
4263
|
markets_total: number | null;
|
|
3298
4264
|
/** Markets with locally synced position rows. */
|
|
3299
4265
|
markets_synced: number;
|
|
3300
|
-
/**
|
|
4266
|
+
/** Markets outside sports and esports that the wallet traded and whose synced rows 0xinsider deleted, counted when they were deleted (from 2026-10-27, #29366); 0 when none were. Not in markets_synced or any other count here; sync_coverage adds it to markets_synced so both sides of that ratio count every category. */
|
|
4267
|
+
markets_pruned: number;
|
|
4268
|
+
/** Markets outside sports and esports that the wallet first traded since 2026-10-26, which 0xinsider does not store, counted as the wallet syncs (#30165); 0 when none are. Not in markets_synced, markets_pruned or any other count here; sync_coverage adds it with markets_pruned to markets_synced. */
|
|
4269
|
+
markets_unstored: number;
|
|
4270
|
+
/** Combo markets the wallet traded, as maker or taker, counted from the combo fills 0xinsider indexes from the chain (#30218); 0 when it traded none. Polymarket counts each combo as one market in markets_total, and no position read lists one, so a combo is in no other count here; sync_coverage adds it with markets_pruned and markets_unstored to markets_synced. */
|
|
4271
|
+
markets_combo: number;
|
|
4272
|
+
/** Synced markets the wallet has settled: it closed its position by selling out, or the market resolved. Its P&L there is final. */
|
|
3301
4273
|
markets_resolved: number;
|
|
3302
|
-
/** Synced markets still open with residual value (open positions with current value > 0). */
|
|
4274
|
+
/** Synced sports and esports markets still open with residual value (open positions with current value > 0); a stored market of another category is left out (#32119). */
|
|
3303
4275
|
markets_open: number;
|
|
3304
|
-
/** markets_synced divided by markets_total when the provider total is known (capped at 1.0); 0.0-1.0. When markets_total is unknown or not positive (null, 0, or negative), this is 1.0 if
|
|
4276
|
+
/** markets_synced plus markets_pruned plus markets_unstored plus markets_combo, divided by markets_total when the provider total is known (capped at 1.0); 0.0-1.0. Both sides count every category: no Polymarket count of a wallet's sports and esports markets exists, so the ratio does not estimate one. When markets_total is unknown or not positive (null, 0, or negative), this is 1.0 if that sum is positive (else 0.0), so cross-check markets_total before treating 1.0 as full coverage. */
|
|
3305
4277
|
sync_coverage: number;
|
|
3306
|
-
/** Native net realized P&L (USD) including credited rebates, minus the stored realized component of open positions with positive current value. Rebates are credited to the account, not to a position, so every credited rebate stays in this figure. NUMERIC arithmetic precedes conversion to a JSON number. */
|
|
4278
|
+
/** Native net realized P&L (USD) over every Polymarket market of the wallet, including credited rebates, minus the stored realized component of synced open positions with positive current value. Rebates are credited to the account, not to a position, so every credited rebate stays in this figure. NUMERIC arithmetic precedes conversion to a JSON number. */
|
|
3307
4279
|
synced_realized_pnl: number;
|
|
3308
|
-
/** Native net realized P&L (USD) including credited rebates, read directly from the accounting snapshot. Position sync_coverage is separate from this accounting basis. */
|
|
4280
|
+
/** Native net realized P&L (USD) over every Polymarket market of the wallet, including credited rebates, read directly from the accounting snapshot. For the sports and esports figure read trader.pnl.in_scope.realized_pnl. Position sync_coverage is separate from this accounting basis. */
|
|
3309
4281
|
total_realized_pnl: number;
|
|
3310
|
-
/** Mark-to-market unrealized P&L (USD) on open positions. */
|
|
4282
|
+
/** Mark-to-market unrealized P&L (USD) on open positions in synced sports and esports markets (#32119): Polymarket's cashPnl summed over the positions still held, without the realized P&L of partial sells. The same figure as trader.pnl.unrealized, in this body and on GET /api/v1/trader/{address}, since 2026-11-02 (#32459). */
|
|
3311
4283
|
unrealized_mtm: number;
|
|
3312
|
-
/** Cost basis (USD) currently tied up in open positions. */
|
|
4284
|
+
/** Cost basis (USD) currently tied up in open positions in synced sports and esports markets (#32119). */
|
|
3313
4285
|
cost_basis_locked: number;
|
|
3314
|
-
/** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A
|
|
4286
|
+
/** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A settled market that closed at exactly zero realized P&L (a void, a refund, a fully hedged position) is neither a win nor a loss and is not in the denominator, the same rule the leaderboard applies; null when no resolved market was decided. It is the rule of trader.stats.win_rate, read from the synced rows at request time; stats.win_rate is the stored figure the profile shows, refreshed by each sync and a few minutes after a closed-history write. context.md prints one Market win rate, stats.win_rate. */
|
|
3315
4287
|
resolved_win_rate: number | null;
|
|
3316
|
-
/**
|
|
4288
|
+
/** Settled markets that closed at positive realized P&L: the win-rate numerator. Additive; null only on a summary cached before the field existed. */
|
|
3317
4289
|
resolved_wins: number | null;
|
|
3318
|
-
/**
|
|
4290
|
+
/** Settled markets that closed at a non-zero realized P&L: the win-rate denominator. At most markets_resolved; the difference is markets settled at exactly zero or with an unknown P&L. Additive; null only on a summary cached before the field existed. */
|
|
3319
4291
|
resolved_decided: number | null;
|
|
3320
4292
|
/** RFC3339 freshness of the served OPEN-position data: the trader's latest /positions snapshot, else the last completed sync. The snapshot advances ONLY open positions, so read this as the open-position freshness clock -- the resolved/closed aggregates on this same summary (markets_resolved, resolved_win_rate) advance only on a full sync. The value is the /positions snapshot instant when one exists, so it is typically at or just before the trader-level last sync on a normal sync, and can be AFTER it while the active-view loop refreshes open positions between full syncs. This clock does not establish native accounting freshness. Always present on the wire (serialized as JSON null when the trader has neither a snapshot nor a sync); never omitted. */
|
|
3321
4293
|
as_of: string | null;
|
|
@@ -3379,7 +4351,7 @@ export type TraderExportJob = {
|
|
|
3379
4351
|
object: "trader_export_job";
|
|
3380
4352
|
data: {
|
|
3381
4353
|
job_id: number;
|
|
3382
|
-
/** queued:
|
|
4354
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
3383
4355
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
3384
4356
|
format: "json" | "ndjson" | "csv";
|
|
3385
4357
|
/** Trade rows the file holds: trades in the wallet's sports and esports markets, counted in the file's own read snapshot. Null until the worker has read the snapshot (queued, and early in running); a job accepted before 2026-10-22 can carry the earlier all-markets estimate until its file is read. */
|
|
@@ -3410,7 +4382,7 @@ export type TraderExportJob = {
|
|
|
3410
4382
|
cancel_requested_at: string | null;
|
|
3411
4383
|
/** When the job reached cancelled; null until then. */
|
|
3412
4384
|
cancelled_at: string | null;
|
|
3413
|
-
/** Worker claims so far. */
|
|
4385
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
3414
4386
|
attempt: number;
|
|
3415
4387
|
/** The job fails when attempt reaches this. */
|
|
3416
4388
|
max_attempts: number;
|
|
@@ -3444,7 +4416,7 @@ export type TraderExportPositionWatermark = {
|
|
|
3444
4416
|
};
|
|
3445
4417
|
export type TraderExportSnapshot = {
|
|
3446
4418
|
address: string;
|
|
3447
|
-
/** The markets the export file's trades and markets sections hold: sports and esports markets only. counts.exported_markets, counts.estimated_trade_rows, counts.estimated_size_mb, reconciliation.exported_market_cost_basis and source_range.latest_trade_at and latest_market_activity_at describe those markets, and reconciliation.exported_activity_volume is the cash the wallet traded in sports and esports markets.
|
|
4419
|
+
/** The markets the export file's trades and markets sections hold: sports and esports markets only. counts.exported_markets, counts.estimated_trade_rows, counts.estimated_size_mb, reconciliation.exported_market_cost_basis and source_range.latest_trade_at and latest_market_activity_at describe those markets, and reconciliation.exported_activity_volume is the cash the wallet traded in sports and esports markets. source_range.first_pnl_date, last_pnl_date and pnl_series_status and counts.pnl_days describe the file's pnl section, the wallet's sports and esports realized P&L by day. completeness.sync_coverage is the wallet's stored markets (its sports and esports markets since 2026-10-27, #29366) plus the markets of other categories whose rows were deleted and counted (position_summary.markets_pruned on the context) and those first traded since 2026-10-26, which are not stored and are counted as the wallet syncs (position_summary.markets_unstored, #30165) and its combo markets, which Polymarket counts and no position read lists (position_summary.markets_combo, #30218), over Polymarket's count of every market it traded: both sides count every category, so a fully synced wallet reads 1.0 and complete. A wallet with nothing stored and no pnl day is empty whatever its coverage. */
|
|
3448
4420
|
product_scope: "sports_esports_v1";
|
|
3449
4421
|
generated_at: string;
|
|
3450
4422
|
source_range: ExportSourceRange;
|
|
@@ -3525,11 +4497,11 @@ export type TraderPnl = {
|
|
|
3525
4497
|
drawdown: number | null;
|
|
3526
4498
|
} | null;
|
|
3527
4499
|
};
|
|
3528
|
-
/** RFC3339 served-freshness clock: when the wallet's sports and esports record, which this series is read from, was last computed; null while series_status is pending. Always present, so read it as a value that can be null rather than a key that can be missing. */
|
|
4500
|
+
/** RFC3339 served-freshness clock: when the wallet's sports and esports record, which this series is read from, was last computed, or, for a wallet that traded no sports or esports market (#30589, #30657) or trades only combos (#30637) and so has no record, its last completed sync; null while series_status is pending. Always present, so read it as a value that can be null rather than a key that can be missing. */
|
|
3529
4501
|
freshness_at: string | null;
|
|
3530
|
-
/** `ready` when the series is served; an empty one is a wallet with no sports or esports day. `pending` when the wallet's sports and esports record does not carry the daily series yet: every section is empty, realized is null, and the empty sections never mean zero. Retry later. */
|
|
4502
|
+
/** `ready` when the series is served; an empty one is a wallet with no sports or esports day, or one that traded no sports or esports market (#30589, #30657) or trades only combos (#30637). `pending` when the wallet's sports and esports record does not carry the daily series yet: every section is empty, realized is null, and the empty sections never mean zero. Retry later. */
|
|
3531
4503
|
series_status: "ready" | "pending";
|
|
3532
|
-
/** How the daily series adds up to the wallet's Sports P&L, full precision: dated_pnl + undated_pnl = realized_pnl. null while series_status is pending. */
|
|
4504
|
+
/** How the daily series adds up to the wallet's Sports P&L, full precision: dated_pnl + undated_pnl = realized_pnl. null while series_status is pending, and for a wallet that traded no sports or esports market or trades only combos, which has no record (#30589, #30657, #30637). */
|
|
3533
4505
|
realized: {
|
|
3534
4506
|
/** The rule behind realized_pnl, the same basis as pnl.in_scope.basis on GET /api/v1/trader/{address}. */
|
|
3535
4507
|
basis: "polymarket_sports_esports_v1" | "sports_esports_split_v1";
|
|
@@ -3545,7 +4517,7 @@ export type TraderPnl = {
|
|
|
3545
4517
|
date: string;
|
|
3546
4518
|
/** Sports and esports markets this wallet traded on this UTC day, counted from the fills 0xinsider stores for it. Omitted on a day whose stored fills include a market outside sports and esports (stored before October 2026), where the count would include it, and on a day above 20 times the wallet's median day. */
|
|
3547
4519
|
markets_traded?: number;
|
|
3548
|
-
/**
|
|
4520
|
+
/** Volume in USD this wallet traded on this UTC day in sports and esports markets, buys and sells: each fill's size times its price, fees excluded, the measure of Polymarket user-volume `volume_usdc`, summed from the fills 0xinsider stores for it. A day stored before 2026-10-27 counts the cash each fill moved, fee included, until it is recomputed. Not Polymarket's share count, and not the full-history stats.total_volume on GET /api/v1/trader/{address}, which covers every market. Omitted on a day with realized P&L and no stored sports or esports fill, and, with markets_traded, on a day above 20 times the wallet's median day. */
|
|
3549
4521
|
total_volume?: number;
|
|
3550
4522
|
/** Running sum of daily_change through this day. */
|
|
3551
4523
|
cumulative_profit?: number;
|
|
@@ -3629,12 +4601,12 @@ export type TraderPnl = {
|
|
|
3629
4601
|
drawdown: number;
|
|
3630
4602
|
}[];
|
|
3631
4603
|
};
|
|
3632
|
-
/**
|
|
4604
|
+
/** Deprecated since 2026-10-27 and never sent: pnl.exact held the lossless counterpart of the retired wallet-wide pnl.realized (#29830). The member shape below is what the object held before; it is kept so existing type declarations still compile. */
|
|
3633
4605
|
export type TraderPnlExact = {
|
|
3634
4606
|
/** 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. */
|
|
3635
4607
|
realized: ExactDecimal;
|
|
3636
4608
|
};
|
|
3637
|
-
/** A wallet's sports and esports record (#27311). basis names the rule behind realized_pnl (#29370): polymarket_sports_esports_v1 is Polymarket's own realized P&L for the wallet in its sports and esports categories, plus the wallet's maker and taker rebates apportioned by its sports and esports share of its Polymarket volume (by cost while Polymarket reports no overall volume) and the in-scope part of any published
|
|
4609
|
+
/** A wallet's sports and esports record (#27311). basis names the rule behind realized_pnl (#29370): polymarket_sports_esports_v1 is Polymarket's own realized P&L for the wallet in its sports and esports categories, plus the wallet's maker and taker rebates apportioned by its sports and esports share of its Polymarket volume (by cost while Polymarket reports no overall volume) and the in-scope part of any published neg-risk conversion correction; sports_esports_split_v1, used until both of the wallet's category figures are confirmed, is Polymarket's published wallet-wide realized P&L (with any published correction) split into the part earned on sports and esports markets, with fees, refunds and rebates apportioned by cost. Refreshed after each wallet sync and each read of Polymarket's category leaderboards; as_of dates the market counts. */
|
|
3638
4610
|
export type TraderPnlInScope = {
|
|
3639
4611
|
/** The rule behind realized_pnl: polymarket_sports_esports_v1 (Polymarket's sports and esports category figures plus apportioned rebates) or sports_esports_split_v1 (the published realized figure split by cost). A new value means the rule changed; compare figures only within one basis. */
|
|
3640
4612
|
basis: string;
|
|
@@ -3642,18 +4614,18 @@ export type TraderPnlInScope = {
|
|
|
3642
4614
|
realized_pnl: number | null;
|
|
3643
4615
|
/** Sports and esports markets the wallet has traded, any status. */
|
|
3644
4616
|
markets: number;
|
|
3645
|
-
/** Of those, the markets
|
|
4617
|
+
/** Of those, the settled markets: the wallet closed its position by selling out, or the market resolved. Its P&L there is final. */
|
|
3646
4618
|
markets_resolved: number;
|
|
3647
4619
|
/** Share of decided sports and esports markets the wallet won, 0 to 1. null with no decided market. */
|
|
3648
4620
|
win_rate: number | null;
|
|
3649
|
-
/** The wallet's markets outside sports and esports, which 0xinsider no longer lists. */
|
|
4621
|
+
/** The wallet's markets outside sports and esports, which 0xinsider no longer lists: those it still stores, those whose rows it deleted and counted, and those of other categories first traded since 2026-10-26, which it does not store and counts as the wallet syncs (#30165). */
|
|
3650
4622
|
markets_out_of_scope: number;
|
|
3651
4623
|
/** When the record behind these figures was computed. */
|
|
3652
4624
|
as_of: string;
|
|
3653
4625
|
};
|
|
3654
|
-
/** Lossless counterparts for trader statistics. The object is
|
|
4626
|
+
/** Lossless counterparts for trader statistics. The object is present exactly when stats.total_volume is. */
|
|
3655
4627
|
export type TraderStatsExact = {
|
|
3656
|
-
/** stats.total_volume as an exact decimal:
|
|
4628
|
+
/** stats.total_volume as an exact decimal: the sports and esports USD volume, the sum of every stored trade day's `trader_trade_daily_rollups.in_scope_volume_total` (#29830). Polymarket's full-history wallet-wide user volume before 2026-10-27. */
|
|
3657
4629
|
total_volume: ExactDecimal;
|
|
3658
4630
|
};
|
|
3659
4631
|
/** `trader_synced` data: a tracked wallet finished a sync pass and has a fresh grade. The deprecated spelling `whale_trader_synced` delivers the same object until its sunset on 2027-02-01 (#29352). */
|
|
@@ -3665,15 +4637,25 @@ export type TraderSyncedData = {
|
|
|
3665
4637
|
};
|
|
3666
4638
|
/** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
|
|
3667
4639
|
export type TraderTrust = {
|
|
4640
|
+
/** Since 2026-10-27 always not_computed: pnl.total is retired and never sent (#29830). The key stays so the object keeps its shape. */
|
|
3668
4641
|
total_pnl: TrustMetadata;
|
|
4642
|
+
/** Since 2026-10-27 always not_computed: pnl.realized and pnl.exact are retired and never sent (#29830). The key stays so the object keeps its shape. */
|
|
3669
4643
|
realized_pnl: TrustMetadata;
|
|
4644
|
+
/** Since 2026-10-27 always not_computed: pnl.net_total is retired and never sent (#29830). The key stays so the object keeps its shape. */
|
|
3670
4645
|
net_total_pnl: TrustMetadata;
|
|
3671
|
-
/**
|
|
4646
|
+
/**
|
|
4647
|
+
* Deprecated since 2026-10-27 and never sent: it was present only with pnl.correction, which is retired (#29830).
|
|
4648
|
+
* @deprecated
|
|
4649
|
+
*/
|
|
3672
4650
|
pnl_correction?: TrustMetadata;
|
|
3673
4651
|
unrealized_pnl: TrustMetadata;
|
|
4652
|
+
/** Computed, owned by trader_product_scope_records (markets) and dated by the record's computed_at, since 2026-10-27 (#29830). For a wallet that traded no sports or esports market, which never gets a record, owned by traders (last_synced), the completed sync that found none, and dated by it, since 2026-10-29 (#30589, #30657; owned by traders (markets_traded) until #30657). */
|
|
3674
4653
|
markets_traded: TrustMetadata;
|
|
4654
|
+
/** Computed, owned by trader_product_scope_records (win_rate) and dated by the record's computed_at, since 2026-10-27 (#29830). */
|
|
3675
4655
|
win_rate: TrustMetadata;
|
|
4656
|
+
/** Since 2026-10-27 always not_computed: stats.daily_win_rate is retired and never sent (#29830). The key stays so the object keeps its shape. */
|
|
3676
4657
|
daily_win_rate: TrustMetadata;
|
|
4658
|
+
/** Computed, owned by trader_trade_daily_rollups (in_scope_volume_total) and dated by traders.last_synced, since 2026-10-27 (#29830). */
|
|
3677
4659
|
total_volume: TrustMetadata;
|
|
3678
4660
|
grade: TrustMetadata;
|
|
3679
4661
|
score: TrustMetadata;
|
|
@@ -3714,9 +4696,17 @@ export type TrendingWallet = {
|
|
|
3714
4696
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3715
4697
|
/** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
|
|
3716
4698
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
3717
|
-
/**
|
|
4699
|
+
/** Additive (#29971): the wallet's sports and esports realized P&L in USD, the same figure as pnl.in_scope.realized_pnl on GET /api/v1/trader/{address} and the 0xinsider profile's Sports P&L, as of the board's last rebuild. Context only: it does not affect the ranking, which follows trending_pnl_usd. Omitted when the wallet is not in the 0xinsider database or has no sports and esports record yet: absent means not computed, never zero. */
|
|
4700
|
+
in_scope_realized_pnl?: number;
|
|
4701
|
+
/**
|
|
4702
|
+
* Deprecated since 2026-10-27 and never sent. It was Polymarket's net total P&L over every Polymarket market of the wallet, and wallet figures cover sports and esports markets only (#29971). Read in_scope_realized_pnl.
|
|
4703
|
+
* @deprecated
|
|
4704
|
+
*/
|
|
3718
4705
|
all_time_pnl_usd?: number;
|
|
3719
|
-
/**
|
|
4706
|
+
/**
|
|
4707
|
+
* Deprecated since 2026-10-27 and never sent. It was the neg-risk conversion correction to the wallet-wide all_time_pnl_usd (#29971). Its sports and esports part is inside in_scope_realized_pnl.
|
|
4708
|
+
* @deprecated
|
|
4709
|
+
*/
|
|
3720
4710
|
pnl_correction?: PnlCorrection;
|
|
3721
4711
|
all_time_score?: number;
|
|
3722
4712
|
last_synced?: string;
|
|
@@ -3984,7 +4974,7 @@ export type WhaleDatasetJob = {
|
|
|
3984
4974
|
object: "whale_dataset_job";
|
|
3985
4975
|
data: {
|
|
3986
4976
|
job_id: number;
|
|
3987
|
-
/** queued:
|
|
4977
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
3988
4978
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
3989
4979
|
format: "ndjson";
|
|
3990
4980
|
total_trades: number | null;
|
|
@@ -4013,7 +5003,7 @@ export type WhaleDatasetJob = {
|
|
|
4013
5003
|
cancel_requested_at: string | null;
|
|
4014
5004
|
/** When the job reached cancelled; null until then. */
|
|
4015
5005
|
cancelled_at: string | null;
|
|
4016
|
-
/** Worker claims so far. */
|
|
5006
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4017
5007
|
attempt: number;
|
|
4018
5008
|
/** The job fails when attempt reaches this. */
|
|
4019
5009
|
max_attempts: number;
|
|
@@ -4091,7 +5081,7 @@ export interface OperationData {
|
|
|
4091
5081
|
batchGetTraders: BatchTraderItem[];
|
|
4092
5082
|
cancelTraderExport: {
|
|
4093
5083
|
job_id: number;
|
|
4094
|
-
/** queued:
|
|
5084
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4095
5085
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4096
5086
|
format: "json" | "ndjson" | "csv";
|
|
4097
5087
|
/** Trade rows the file holds: trades in the wallet's sports and esports markets, counted in the file's own read snapshot. Null until the worker has read the snapshot (queued, and early in running); a job accepted before 2026-10-22 can carry the earlier all-markets estimate until its file is read. */
|
|
@@ -4122,7 +5112,7 @@ export interface OperationData {
|
|
|
4122
5112
|
cancel_requested_at: string | null;
|
|
4123
5113
|
/** When the job reached cancelled; null until then. */
|
|
4124
5114
|
cancelled_at: string | null;
|
|
4125
|
-
/** Worker claims so far. */
|
|
5115
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4126
5116
|
attempt: number;
|
|
4127
5117
|
/** The job fails when attempt reaches this. */
|
|
4128
5118
|
max_attempts: number;
|
|
@@ -4142,7 +5132,7 @@ export interface OperationData {
|
|
|
4142
5132
|
};
|
|
4143
5133
|
cancelWhaleDataset: {
|
|
4144
5134
|
job_id: number;
|
|
4145
|
-
/** queued:
|
|
5135
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4146
5136
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4147
5137
|
format: "ndjson";
|
|
4148
5138
|
total_trades: number | null;
|
|
@@ -4171,7 +5161,7 @@ export interface OperationData {
|
|
|
4171
5161
|
cancel_requested_at: string | null;
|
|
4172
5162
|
/** When the job reached cancelled; null until then. */
|
|
4173
5163
|
cancelled_at: string | null;
|
|
4174
|
-
/** Worker claims so far. */
|
|
5164
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4175
5165
|
attempt: number;
|
|
4176
5166
|
/** The job fails when attempt reaches this. */
|
|
4177
5167
|
max_attempts: number;
|
|
@@ -4208,7 +5198,8 @@ export interface OperationData {
|
|
|
4208
5198
|
getAccountIdentity: {
|
|
4209
5199
|
user_id: number;
|
|
4210
5200
|
credential_id: number;
|
|
4211
|
-
|
|
5201
|
+
/** The kind of credential that made the request: api_key is a full-access developer key, oauth_grant an OAuth access token, integration_key a named integration key with fixed scopes created on https://0xinsider.com/developers. Before integration_key was added, these keys reported oauth_grant. */
|
|
5202
|
+
credential_kind: "api_key" | "oauth_grant" | "integration_key";
|
|
4212
5203
|
/** The credential is currently valid; revoked, expired or unknown credentials are rejected. */
|
|
4213
5204
|
credential_status: "active";
|
|
4214
5205
|
entitlement: {
|
|
@@ -4216,10 +5207,11 @@ export interface OperationData {
|
|
|
4216
5207
|
/** When paid data access is lapsed, the caller should renew the subscription; otherwise null. */
|
|
4217
5208
|
recovery_action: "renew_subscription" | null;
|
|
4218
5209
|
};
|
|
4219
|
-
/**
|
|
5210
|
+
/** The scopes an OAuth grant or integration key carries; null for full developer-key access. */
|
|
4220
5211
|
scopes: string[] | null;
|
|
4221
5212
|
};
|
|
4222
5213
|
getApiDiscovery: ApiDiscovery;
|
|
5214
|
+
getCategoryLeaderboard: CategoryLeader[];
|
|
4223
5215
|
getCombo: ComboDetail;
|
|
4224
5216
|
getCombosSummary: CombosSummary;
|
|
4225
5217
|
getCoverage: Platforms;
|
|
@@ -4227,6 +5219,8 @@ export interface OperationData {
|
|
|
4227
5219
|
getEdgeHunter: EdgeHunterBoard | EdgeHunterRankedSignal[] | EdgeHunterObservation[];
|
|
4228
5220
|
getEventReplaySince: EventReplayEvent[];
|
|
4229
5221
|
getGame: Game;
|
|
5222
|
+
getGameHolders: BatchGameHoldersItem[];
|
|
5223
|
+
getGameSharpMoney: GameSharpMoney;
|
|
4230
5224
|
getHealth: {
|
|
4231
5225
|
status: "ok" | "degraded" | "down" | "maintenance";
|
|
4232
5226
|
db: boolean;
|
|
@@ -4257,15 +5251,20 @@ export interface OperationData {
|
|
|
4257
5251
|
getMarketHolders: MarketHolder[];
|
|
4258
5252
|
getMarketIntel: MarketFlow;
|
|
4259
5253
|
getMarketSnapshot: MarketSnapshot;
|
|
5254
|
+
getMarketTopHolders: MarketTopHolders;
|
|
5255
|
+
getMarketWalletsInOut: MarketWalletsInOut;
|
|
4260
5256
|
getMonthlyReportSnapshot: ReportSnapshot;
|
|
4261
5257
|
getPickOfTheDay: PickOfTheDay | PickOfTheDayNoEntitledPicks;
|
|
4262
5258
|
getPickOfTheDayArchive: PickOfTheDayArchive;
|
|
4263
5259
|
getPickOfTheDayLedger: PickOfTheDayLedger;
|
|
4264
5260
|
getPickOfTheDayLedgerEntry: PickOfTheDayLedgerEntry;
|
|
5261
|
+
getPickOfTheDayStats: PickOfTheDayStats;
|
|
4265
5262
|
getPlatforms: Platforms;
|
|
4266
5263
|
getPositionTimeline: PositionTimelineEvent[];
|
|
4267
5264
|
getPositionTimelineById: PositionTimelineEvent[];
|
|
4268
5265
|
getReports: ReportSnapshot;
|
|
5266
|
+
getResolutionReport: ResolutionReport;
|
|
5267
|
+
getSportLeaderboard: SportLeaderboard;
|
|
4269
5268
|
getStream: string;
|
|
4270
5269
|
getSuspiciousTrade: SuspiciousTrade;
|
|
4271
5270
|
getTrader: Trader;
|
|
@@ -4275,7 +5274,7 @@ export interface OperationData {
|
|
|
4275
5274
|
getTraderExportSnapshot: TraderExportSnapshot;
|
|
4276
5275
|
getTraderExportStatus: {
|
|
4277
5276
|
job_id: number;
|
|
4278
|
-
/** queued:
|
|
5277
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4279
5278
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4280
5279
|
format: "json" | "ndjson" | "csv";
|
|
4281
5280
|
/** Trade rows the file holds: trades in the wallet's sports and esports markets, counted in the file's own read snapshot. Null until the worker has read the snapshot (queued, and early in running); a job accepted before 2026-10-22 can carry the earlier all-markets estimate until its file is read. */
|
|
@@ -4306,7 +5305,7 @@ export interface OperationData {
|
|
|
4306
5305
|
cancel_requested_at: string | null;
|
|
4307
5306
|
/** When the job reached cancelled; null until then. */
|
|
4308
5307
|
cancelled_at: string | null;
|
|
4309
|
-
/** Worker claims so far. */
|
|
5308
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4310
5309
|
attempt: number;
|
|
4311
5310
|
/** The job fails when attempt reaches this. */
|
|
4312
5311
|
max_attempts: number;
|
|
@@ -4369,7 +5368,7 @@ export interface OperationData {
|
|
|
4369
5368
|
getWeeklyReportSnapshot: ReportSnapshot;
|
|
4370
5369
|
getWhaleDatasetStatus: {
|
|
4371
5370
|
job_id: number;
|
|
4372
|
-
/** queued:
|
|
5371
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4373
5372
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4374
5373
|
format: "ndjson";
|
|
4375
5374
|
total_trades: number | null;
|
|
@@ -4398,7 +5397,7 @@ export interface OperationData {
|
|
|
4398
5397
|
cancel_requested_at: string | null;
|
|
4399
5398
|
/** When the job reached cancelled; null until then. */
|
|
4400
5399
|
cancelled_at: string | null;
|
|
4401
|
-
/** Worker claims so far. */
|
|
5400
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4402
5401
|
attempt: number;
|
|
4403
5402
|
/** The job fails when attempt reaches this. */
|
|
4404
5403
|
max_attempts: number;
|
|
@@ -4418,8 +5417,43 @@ export interface OperationData {
|
|
|
4418
5417
|
filters: WhaleDatasetFilters;
|
|
4419
5418
|
};
|
|
4420
5419
|
getWhaleTrade: LargeTradeDetail;
|
|
5420
|
+
listCategoryLeaders: CategoryLeader[];
|
|
4421
5421
|
listComboFills: ComboFill[];
|
|
5422
|
+
listGameMarkets: ({
|
|
5423
|
+
condition_id: string;
|
|
5424
|
+
event_slug: string;
|
|
5425
|
+
group_item_title?: string;
|
|
5426
|
+
id: string;
|
|
5427
|
+
line?: number;
|
|
5428
|
+
line_outcome_index?: number;
|
|
5429
|
+
negative_risk?: boolean;
|
|
5430
|
+
outcomes: {
|
|
5431
|
+
index: number;
|
|
5432
|
+
label?: string;
|
|
5433
|
+
token_id?: string;
|
|
5434
|
+
}[];
|
|
5435
|
+
platform?: string;
|
|
5436
|
+
slug?: string;
|
|
5437
|
+
sports_market_type?: string;
|
|
5438
|
+
status: string;
|
|
5439
|
+
title?: string;
|
|
5440
|
+
sharp_money?: {
|
|
5441
|
+
money_as_of: string | null;
|
|
5442
|
+
outcomes: {
|
|
5443
|
+
index: number;
|
|
5444
|
+
usd: number;
|
|
5445
|
+
wallets: {
|
|
5446
|
+
a: number;
|
|
5447
|
+
b: number;
|
|
5448
|
+
s: number;
|
|
5449
|
+
};
|
|
5450
|
+
}[];
|
|
5451
|
+
status: "computed" | "not_computed" | "unavailable";
|
|
5452
|
+
trader_count: number | null;
|
|
5453
|
+
};
|
|
5454
|
+
})[];
|
|
4422
5455
|
listGames: Game[];
|
|
5456
|
+
listGameTrades: GameTrade[];
|
|
4423
5457
|
listInsiderRadar: SuspiciousTrade[];
|
|
4424
5458
|
listLargePositions: LargePosition[];
|
|
4425
5459
|
listLargeTradeCounterpartyExecutions: CounterpartyAnalysis;
|
|
@@ -4427,6 +5461,7 @@ export interface OperationData {
|
|
|
4427
5461
|
listLargeTradeHistory: LargeTrade[];
|
|
4428
5462
|
listLargeTrades: LargeTrade[];
|
|
4429
5463
|
listLeaderboard: LeaderboardEntry[];
|
|
5464
|
+
listLeaderboardLeagues: LeaderboardLeagues;
|
|
4430
5465
|
listPositions: Position[];
|
|
4431
5466
|
listSharpMoneyFlows: SmartMoneyFlowMarket[];
|
|
4432
5467
|
listSmartMoneyFlows: SmartMoneyFlowMarket[];
|
|
@@ -4448,7 +5483,7 @@ export interface OperationData {
|
|
|
4448
5483
|
searchMarkets: MarketSearchResult[];
|
|
4449
5484
|
submitTraderExport: {
|
|
4450
5485
|
job_id: number;
|
|
4451
|
-
/** queued:
|
|
5486
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4452
5487
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4453
5488
|
format: "json" | "ndjson" | "csv";
|
|
4454
5489
|
/** Trade rows the file holds: trades in the wallet's sports and esports markets, counted in the file's own read snapshot. Null until the worker has read the snapshot (queued, and early in running); a job accepted before 2026-10-22 can carry the earlier all-markets estimate until its file is read. */
|
|
@@ -4479,7 +5514,7 @@ export interface OperationData {
|
|
|
4479
5514
|
cancel_requested_at: string | null;
|
|
4480
5515
|
/** When the job reached cancelled; null until then. */
|
|
4481
5516
|
cancelled_at: string | null;
|
|
4482
|
-
/** Worker claims so far. */
|
|
5517
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4483
5518
|
attempt: number;
|
|
4484
5519
|
/** The job fails when attempt reaches this. */
|
|
4485
5520
|
max_attempts: number;
|
|
@@ -4499,7 +5534,7 @@ export interface OperationData {
|
|
|
4499
5534
|
};
|
|
4500
5535
|
submitWhaleDataset: {
|
|
4501
5536
|
job_id: number;
|
|
4502
|
-
/** queued:
|
|
5537
|
+
/** queued: waiting for a worker. A running job reads queued again, with error saying why, when its worker restarts for a deploy (the next worker claims it within seconds) or stops without handing it back (requeued within a minute of its 30-minute lease lapsing); it starts again from the beginning. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the reconciler reads the object back within a minute, retries a failed readback an hour later, 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. */
|
|
4503
5538
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4504
5539
|
format: "ndjson";
|
|
4505
5540
|
total_trades: number | null;
|
|
@@ -4528,7 +5563,7 @@ export interface OperationData {
|
|
|
4528
5563
|
cancel_requested_at: string | null;
|
|
4529
5564
|
/** When the job reached cancelled; null until then. */
|
|
4530
5565
|
cancelled_at: string | null;
|
|
4531
|
-
/** Worker claims so far. */
|
|
5566
|
+
/** Worker claims so far. A claim handed back when its worker restarts for a deploy is not counted, so attempt steps back by one when the job reads queued again for that reason. */
|
|
4532
5567
|
attempt: number;
|
|
4533
5568
|
/** The job fails when attempt reaches this. */
|
|
4534
5569
|
max_attempts: number;
|
|
@@ -4583,6 +5618,16 @@ export interface OperationQuery {
|
|
|
4583
5618
|
};
|
|
4584
5619
|
getAccountIdentity: Record<string, never>;
|
|
4585
5620
|
getApiDiscovery: Record<string, never>;
|
|
5621
|
+
getCategoryLeaderboard: {
|
|
5622
|
+
/** Keep wallets that traded in the category within this window. all (the default) keeps every ranked wallet. */
|
|
5623
|
+
active_within?: "all" | "7d" | "30d" | "90d";
|
|
5624
|
+
/** Independent events a wallet needs in the category to be listed. The site offers 0, 50, 100 and 250. Clamped to 0..1000000. */
|
|
5625
|
+
min_events?: number;
|
|
5626
|
+
/** Maximum number of leaders to return. Out-of-range values are clamped to 1..100. */
|
|
5627
|
+
limit?: number;
|
|
5628
|
+
/** Opaque cel_ pagination cursor from a prior response. It binds the lower-bound/independent-event/wallet boundary to the committed category-skill ranking and to the slug, active_within and min_events of the request that issued it; a cursor from another filter is 400 on cursor, and one issued before the ranking refreshed is 400 with error.reason=cursor_expired. */
|
|
5629
|
+
cursor?: string;
|
|
5630
|
+
};
|
|
4586
5631
|
getCombo: Record<string, never>;
|
|
4587
5632
|
getCombosSummary: Record<string, never>;
|
|
4588
5633
|
getCoverage: Record<string, never>;
|
|
@@ -4595,10 +5640,10 @@ export interface OperationQuery {
|
|
|
4595
5640
|
view?: "board" | "signals" | "observations";
|
|
4596
5641
|
/** Legacy canonical bucket alias, now accepted in every view. Provider aliases canonicalize: NFL reaches Football and EPL reaches Soccer. Use leagues for a league-specific selection. An unmappable non-sport category returns an empty result and echoes category non_sport. Combines with other selection axes using AND. */
|
|
4597
5642
|
category?: string;
|
|
4598
|
-
/** Required for view=observations; wider_holder, in_play or emerging_pile. Rejected for board and signals. wider_holder covers pregame markets
|
|
5643
|
+
/** Required for view=observations; wider_holder, in_play or emerging_pile. Rejected for board and signals. wider_holder covers pregame markets that view=signals does not list at its widest selection (horizon_hours=48, min_grade=B, no selector), so until kickoff a market is read in one view or the other. A market view=signals lists leaves wider_holder as primary_slate_candidate, and is a wider_holder candidate again in the first refresh after view=signals stops listing it; signals_as_of names the view=signals snapshot each refresh read. Each refresh evaluates at most 8 markets per sport and cohort, wider_holder by soonest kickoff (most graded holders first among equal kickoffs) and in_play by most graded holders, so a market among a sport's 8 soonest stays evaluated until its game starts. wider_holder also evaluates up to 8 more markets per sport that kick off within 24 hours, most graded holders first, so the most-held markets appear up to a day before kickoff. Each of these keeps its place in later refreshes until its game starts while its holder page still shows a card or could not be read, so a more-held market waits for a free place instead of displacing it. Each row's admitted_by names its place, most_held or soonest_kickoff. The rest count in coverage.capacity_limited_markets. Emerging pile is a wider-holder projection with sharp_pct in [0.75,0.85), complete holder scans and future kickoff, not an independent population or arrival history. */
|
|
4599
5644
|
cohort?: "wider_holder" | "in_play" | "emerging_pile";
|
|
4600
|
-
/** Opt-in admission rule for view=observations with cohort=wider_holder; rejected for every other view and cohort. most_held_48h returns the most-held selection instead of the default one: per sport, up to 8 wider_holder markets kicking off within 48 hours, most graded holders first, then most volume, then soonest kickoff, at most 4 per event. It is recomputed every refresh and keeps no place, so a more-held market displaces a less-held one;
|
|
4601
|
-
admission?: "most_held_48h";
|
|
5645
|
+
/** Opt-in admission rule for view=observations with cohort=wider_holder; rejected for every other view and cohort. most_held_48h returns the most-held selection instead of the default one: per sport, up to 8 wider_holder markets kicking off within 48 hours, most graded holders first, then most volume, then soonest kickoff, at most 4 per event. It is recomputed every refresh and keeps no place, so a more-held market displaces a less-held one; markets view=signals lists stay excluded. Every row carries admitted_by most_held_48h, including a market the default selection also evaluates, and the response echoes admission. funnel, coverage, degraded and degradation_reasons describe this selection: a wider_holder candidate it did not take counts as capacity_limited. Its markets that no default place covers are read after every default market, at most once per 10 minutes, so a row can rest on a holder page up to 15 minutes old (holder_snapshot_at). most_held_48h_by_type requires market_types and runs the same rule within each named type: per sport and market_context.market_type, up to 8 markets (4 per event), most graded holders first, then volume, then soonest kickoff, so a type whose markets hold fewer wallets than team-win markets still gets its own places. Its rows carry admitted_by most_held_48h_by_type and it has no departures. Its markets no other selection read are read after every default and most_held_48h market, at most once per 10 minutes. A market type not asked for in the last 30 minutes answers 503 read_model_warming with Retry-After 45 s while the next refresh computes it. Omit for the default selection. Cursors and ETags bind it. */
|
|
5646
|
+
admission?: "most_held_48h" | "most_held_48h_by_type";
|
|
4602
5647
|
/** Board and signals: S, A or B, default B. Requires a piled-side holder at the selected grade floor or better, without removing other holders. Rejected for observations. */
|
|
4603
5648
|
min_grade?: "S" | "A" | "B";
|
|
4604
5649
|
/** Board row cap defaults to 30 and clamps integer values to 1..30; total counts selected admitted rows before the cap. Signals and observations page size defaults to 20 and clamps to 1..100. */
|
|
@@ -4641,6 +5686,13 @@ export interface OperationQuery {
|
|
|
4641
5686
|
expand?: "trade"[];
|
|
4642
5687
|
};
|
|
4643
5688
|
getGame: Record<string, never>;
|
|
5689
|
+
getGameHolders: {
|
|
5690
|
+
/** 1 to 25 condition_id values of this game's markets, comma-separated. The key may also repeat (condition_ids=a&condition_ids=b). A raw provider condition_id or the mkt_-prefixed market id. */
|
|
5691
|
+
condition_ids: string[];
|
|
5692
|
+
/** Holders per market. Out-of-range values are clamped to 1..100. */
|
|
5693
|
+
limit?: number;
|
|
5694
|
+
};
|
|
5695
|
+
getGameSharpMoney: Record<string, never>;
|
|
4644
5696
|
getHealth: Record<string, never>;
|
|
4645
5697
|
getInsiderRadarFlag: Record<string, never>;
|
|
4646
5698
|
getLargeTrade: Record<string, never>;
|
|
@@ -4677,14 +5729,26 @@ export interface OperationQuery {
|
|
|
4677
5729
|
/** Include trust metadata for current_price and spread_bps. Repeatable: trust. */
|
|
4678
5730
|
expand?: "trust"[];
|
|
4679
5731
|
};
|
|
5732
|
+
getMarketTopHolders: {
|
|
5733
|
+
/** Maximum holders per outcome. Out-of-range values are clamped to 1..100. `totals` covers the whole sample whatever the limit. */
|
|
5734
|
+
limit?: number;
|
|
5735
|
+
};
|
|
5736
|
+
getMarketWalletsInOut: {
|
|
5737
|
+
/** The window the nets are summed over, ending at the read's clock: 24h (the default) or 7d. */
|
|
5738
|
+
window?: "24h" | "7d";
|
|
5739
|
+
};
|
|
4680
5740
|
getMonthlyReportSnapshot: {
|
|
4681
5741
|
/** UTC report month in YYYY-MM format. A month that ends before 2024-03-01, the first day report data covers, or starts after tomorrow UTC returns 400 bad_request with error.param=month. */
|
|
4682
5742
|
month: string;
|
|
4683
5743
|
};
|
|
4684
|
-
getPickOfTheDay:
|
|
5744
|
+
getPickOfTheDay: {
|
|
5745
|
+
/** A product day (America/New_York) in YYYY-MM-DD format, on or before today. Omit it, or send today, for the current read. A past day with no published pick returns 404 not_found with error.param=date; a date after today, or a value that is not a date, returns 400 bad_request with error.param=date. */
|
|
5746
|
+
date?: string;
|
|
5747
|
+
};
|
|
4685
5748
|
getPickOfTheDayArchive: Record<string, never>;
|
|
4686
5749
|
getPickOfTheDayLedger: Record<string, never>;
|
|
4687
5750
|
getPickOfTheDayLedgerEntry: Record<string, never>;
|
|
5751
|
+
getPickOfTheDayStats: Record<string, never>;
|
|
4688
5752
|
getPlatforms: Record<string, never>;
|
|
4689
5753
|
getPositionTimeline: {
|
|
4690
5754
|
/** Market condition_id. One timeline per (trader, market). */
|
|
@@ -4708,6 +5772,20 @@ export interface OperationQuery {
|
|
|
4708
5772
|
/** Period token for the granularity. daily: UTC date YYYY-MM-DD. weekly: ISO week YYYY-WW for a durable canonical snapshot, or a from,to YYYY-MM-DD pair for an exact ephemeral range limited to 31 inclusive UTC days. A wider explicit range returns 400 invalid_query. monthly: UTC month YYYY-MM. A period that ends before 2024-03-01, the first day report data covers, or starts after tomorrow UTC returns 400 bad_request with error.param=period. */
|
|
4709
5773
|
period: string;
|
|
4710
5774
|
};
|
|
5775
|
+
getResolutionReport: {
|
|
5776
|
+
/** UTC report date in YYYY-MM-DD format, no later than today UTC. Any other value returns 400 bad_request with error.param=date. */
|
|
5777
|
+
date: string;
|
|
5778
|
+
/** `totals` returns the counts without `markets`. Any other value than full or totals returns 400 bad_request with error.param=view. */
|
|
5779
|
+
view?: "full" | "totals";
|
|
5780
|
+
};
|
|
5781
|
+
getSportLeaderboard: {
|
|
5782
|
+
/** A league slug of the sport, for example premier-league or cs2, from GET /api/v1/leaderboard/leagues. Omit it for the sport board. */
|
|
5783
|
+
league?: string;
|
|
5784
|
+
/** Ranking axis. Any other value returns 400 bad_request with error.param=sort. */
|
|
5785
|
+
sort?: "edge" | "pnl" | "win_rate";
|
|
5786
|
+
/** Rows to return from the top of the board. Out-of-range values are clamped to 1..100. */
|
|
5787
|
+
limit?: number;
|
|
5788
|
+
};
|
|
4711
5789
|
getStream: {
|
|
4712
5790
|
/** Query-string fallback for the Last-Event-ID resume cursor when the client cannot set the request header. Numeric cluster-shared sequence id; non-numeric or absent attaches live with no replay. A future or expired id emits resync. */
|
|
4713
5791
|
last_event_id?: string;
|
|
@@ -4726,11 +5804,11 @@ export interface OperationQuery {
|
|
|
4726
5804
|
};
|
|
4727
5805
|
getSuspiciousTrade: Record<string, never>;
|
|
4728
5806
|
getTrader: {
|
|
4729
|
-
/** Backward-compatible alias for expand. Repeatable: strategy, categories, quant_metrics
|
|
5807
|
+
/** Backward-compatible alias for expand. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
|
|
4730
5808
|
"expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
4731
|
-
/** Include heavy fields and trust metadata. Repeatable: strategy, categories, quant_metrics
|
|
5809
|
+
/** Include heavy fields and trust metadata. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
|
|
4732
5810
|
expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
4733
|
-
/** Opt into a whole-response freshness ceiling in seconds. The server returns 200 only when data_quality.status is fresh and data_quality.as_of is no older than this value; otherwise it returns 409 with error.reason=freshness_ceiling_unsatisfied. No refresh or alternate read is attempted. */
|
|
5811
|
+
/** Opt into a whole-response freshness ceiling in seconds. The server returns 200 only when data_quality.status is fresh or stale and data_quality.as_of is no older than this value; otherwise it returns 409 with error.reason=freshness_ceiling_unsatisfied. No refresh or alternate read is attempted. */
|
|
4734
5812
|
max_age_s?: number;
|
|
4735
5813
|
};
|
|
4736
5814
|
getTraderCategoryRecords: {
|
|
@@ -4771,6 +5849,7 @@ export interface OperationQuery {
|
|
|
4771
5849
|
};
|
|
4772
5850
|
getWhaleDatasetStatus: Record<string, never>;
|
|
4773
5851
|
getWhaleTrade: Record<string, never>;
|
|
5852
|
+
listCategoryLeaders: Record<string, never>;
|
|
4774
5853
|
listComboFills: {
|
|
4775
5854
|
/** CSV of pending, won, or lost; all clears the filter. Unknown results appear only in unfiltered lists. */
|
|
4776
5855
|
result?: string;
|
|
@@ -4795,21 +5874,45 @@ export interface OperationQuery {
|
|
|
4795
5874
|
/** Offset for ranked largest or payout ordering; use returned next_offset. */
|
|
4796
5875
|
offset?: number;
|
|
4797
5876
|
};
|
|
5877
|
+
listGameMarkets: {
|
|
5878
|
+
/** Comma-separated provider market types to keep, case-insensitive: spreads, totals, points, first_half_totals. Omitted keeps every type. An unknown type returns an empty page, not a 400; families lists the event's types. */
|
|
5879
|
+
sports_market_type?: string;
|
|
5880
|
+
/** active, closed or all. closed means the provider closed the market or it resolved. */
|
|
5881
|
+
status?: "active" | "closed" | "all";
|
|
5882
|
+
/** Page size. Out-of-range values are clamped to 1..100. */
|
|
5883
|
+
limit?: number;
|
|
5884
|
+
/** Opaque gmk_v1_ cursor from next_cursor, sent with the same filters. It pins the page position (sports_market_type, line, condition_id), not a snapshot. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
|
|
5885
|
+
cursor?: string;
|
|
5886
|
+
/** sharp_money adds each row's sharp_money: the game page's per-line split, side USD and S, A and B wallet counts per outcome. One read for the event whatever the page size; the request costs 5 instead of 2. Pro and Max. Repeatable: sharp_money. */
|
|
5887
|
+
expand?: "sharp_money"[];
|
|
5888
|
+
/** Backward-compatible alias for expand. Repeatable: sharp_money. */
|
|
5889
|
+
"expand[]"?: "sharp_money"[];
|
|
5890
|
+
};
|
|
4798
5891
|
listGames: {
|
|
4799
5892
|
/** 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. */
|
|
4800
5893
|
sport?: string;
|
|
4801
|
-
/** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2, euroleague. EuroLeague games use sport=Basketball and league=euroleague. Omit for every league inside the selected sports. */
|
|
5894
|
+
/** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2, euroleague, cbb, cwbb. EuroLeague games use sport=Basketball and league=euroleague; NCAA men's and women's college basketball games use sport=Basketball with league=cbb and league=cwbb. Omit for every league inside the selected sports. */
|
|
4802
5895
|
league?: string;
|
|
4803
|
-
/** Keep only games in this state. A value outside the enum returns an empty page. */
|
|
5896
|
+
/** Keep only games in this state. ended, cancelled and postponed also list finished games that have left the live board, read from their stored records, for kickoffs within starts_after..starts_before (default: the 7 days before now). Without status, or with any other state, the list is the live and upcoming board. A value outside the enum returns an empty page. */
|
|
4804
5897
|
status?: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
4805
|
-
/** 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. */
|
|
5898
|
+
/** 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. With a finished status, the stored games' look-back starts here; omitted, it starts 7 days before starts_before, and nothing caps an earlier value. */
|
|
4806
5899
|
starts_after?: string;
|
|
4807
5900
|
/** RFC 3339 instant. Keep only games whose kickoff is at or before it. Must be at or after starts_after. */
|
|
4808
5901
|
starts_before?: string;
|
|
5902
|
+
/** Which games to read. all, the default, lists the whole covered catalog, which can start with games the provider still holds open weeks after kickoff. now lists what is on now: every game the provider reports in play (live or paused), plus any other game whose kickoff was at most 3 hours ago or is still to come; ended, postponed and cancelled games are left out, and a game with no published kickoff stays and sorts last. Combines with every other filter. A value other than all or now returns 400 invalid_query with error.param=window. */
|
|
5903
|
+
window?: "all" | "now";
|
|
4809
5904
|
/** Page size. Out-of-range values are clamped to 1..100. */
|
|
4810
5905
|
limit?: number;
|
|
4811
|
-
/** 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. */
|
|
5906
|
+
/** 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. With a finished status, a page that spent its read budget carries a cursor past everything it read, which may be past the last game it returned. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
|
|
4812
5907
|
cursor?: string;
|
|
5908
|
+
/** Backward-compatible alias for expand. Repeatable: sharp_money. */
|
|
5909
|
+
"expand[]"?: "sharp_money"[];
|
|
5910
|
+
/** sharp_money adds each game's sharp_money, the GameSharpMoney object GET /api/v1/games/{event_slug}/sharp-money returns, read from the sport board's cached aggregate: one board read per sport on the page, never a per-game compute. A game the board did not evaluate carries status not_computed (read the per-game route for it); a sport whose aggregate could not be read carries status unavailable while the rest of the page is served. Adds 3 to the request cost. Repeatable. */
|
|
5911
|
+
expand?: "sharp_money"[];
|
|
5912
|
+
};
|
|
5913
|
+
listGameTrades: {
|
|
5914
|
+
/** Newest fills to return. Out-of-range values are clamped to 1..200. */
|
|
5915
|
+
limit?: number;
|
|
4813
5916
|
};
|
|
4814
5917
|
listInsiderRadar: {
|
|
4815
5918
|
/** Maximum number of radar flags to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -4832,7 +5935,7 @@ export interface OperationQuery {
|
|
|
4832
5935
|
min_size?: number;
|
|
4833
5936
|
/** One RFC 4180 CSV record of exact current provider-backed market_canonical.category values. Legacy unquoted lists such as NBA,WNBA remain valid; values containing commas, quotes, or newlines are CSV-quoted. Matching is case-insensitive. Malformed quoted input fails closed as one unknown exact category. A value outside sports and esports returns 400 bad_request with param=category (#27305), as on GET /api/v1/markets/explore. */
|
|
4834
5937
|
category?: string;
|
|
4835
|
-
/** Minimum trader grade. */
|
|
5938
|
+
/** Minimum trader grade. Matched against the trader.grade each row returns, the wallet's current grade, so every row listed shows a grade at or above this floor. */
|
|
4836
5939
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
4837
5940
|
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id (round-trips a value from a list response). Must be 0x followed by 64 hexadecimal characters after any mkt_ prefix is stripped; any other value returns 400. Polymarket-only; an unknown but well-formed id returns []. A market outside sports and esports returns 404 not_found with error.reason=market_out_of_scope (#27305). */
|
|
4838
5941
|
condition_id?: string;
|
|
@@ -4880,6 +5983,8 @@ export interface OperationQuery {
|
|
|
4880
5983
|
min_market_volume_share?: number;
|
|
4881
5984
|
/** 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. */
|
|
4882
5985
|
sort?: "recent" | "market_volume_share";
|
|
5986
|
+
/** Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), and cannot be combined with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
5987
|
+
event_slug?: string;
|
|
4883
5988
|
};
|
|
4884
5989
|
listLargeTrades: {
|
|
4885
5990
|
/** Maximum number of recent large trades to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -4900,17 +6005,28 @@ export interface OperationQuery {
|
|
|
4900
6005
|
sort?: "recent" | "market_volume_share";
|
|
4901
6006
|
/** Return only the trades recorded after this one. Pass the id of a large trade this API returned (wt_<n>, or the bare integer). The answer keeps the list shape and newest-first order, and next_cursor pages within it. After means commit order: a trade recorded late with an earlier traded_at is still returned, and a trade whose write has not committed yet is returned on a later poll, never skipped. To poll, send the id of the first trade on the first page of your last answer that had trades, with If-None-Match set to the ETag you last received; when nothing new was recorded the answer is 304 with an empty body. A late trade can come back once, so deduplicate on id. Only with sort=recent. An id that names no trade, or one more than 10000 trades behind the newest, answers 400 with error.param since; request the list without since and continue from its first trade. */
|
|
4902
6007
|
since?: string;
|
|
6008
|
+
/** Only this market's large trades: an exact raw provider condition_id. The page is read from the market's own index, newest first, and pages with cursor; it cannot be combined with since or with event_slug (400). An unknown market returns an empty list. */
|
|
6009
|
+
condition_id?: string;
|
|
6010
|
+
/** Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), pages with cursor, and cannot be combined with since or with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
6011
|
+
event_slug?: string;
|
|
4903
6012
|
};
|
|
4904
6013
|
listLeaderboard: {
|
|
4905
6014
|
/** Maximum number of ranked traders to return. Out-of-range values are clamped to 1..100. */
|
|
4906
6015
|
limit?: number;
|
|
4907
|
-
/** Opaque lbv1_ pagination cursor from a prior response. It binds the finite score/address boundary to the committed leaderboard generation and the effective category/strategy filters;
|
|
6016
|
+
/** Opaque lbv1_ pagination cursor from a prior response. It binds the finite score/address boundary to the committed leaderboard generation and the effective category/strategy filters, and on a sorted page to its sort, dir and activity. A cursor from another sort or dir is a 400 bad_request on cursor; one from another activity, category, strategy or generation is cursor_expired. Legacy, malformed, non-finite, and unsupported-version cursors are rejected. */
|
|
4908
6017
|
cursor?: string;
|
|
4909
6018
|
/** Filter by category: a sport or esports bucket. Values are matched to canonical category buckets: league values fold into their sport (NBA and NCAAB into Basketball, NFL into Football). Mapped buckets are case-insensitive; passthrough buckets (Cricket, Sports) match case-sensitively against the provider-native bucket key, so use exact casing. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4910
6019
|
category?: string;
|
|
4911
|
-
/** Filter by observed trading style. Current styles: two_sided, category_focused, high_activity, diversified, mixed, unclassified. Current styles count the wallet's sports and esports markets only. The
|
|
4912
|
-
strategy?: "
|
|
4913
|
-
|
|
6020
|
+
/** Filter by observed trading style. Current styles: two_sided, category_focused, high_activity, diversified, mixed, unclassified. Current styles count the wallet's sports and esports markets only. The ten archetype keys retired on 2026-10-01 (accumulator, algo_trader, arbitrageur, directional, event_driven, market_maker, momentum, scalper, speculator, swing_trader) are still accepted and match no wallet. Style describes recorded behavior; grade measures performance. */
|
|
6021
|
+
strategy?: "category_focused" | "diversified" | "high_activity" | "mixed" | "two_sided" | "unclassified";
|
|
6022
|
+
/** Order of the list, the sort columns of the site's leaderboard (/skill-leaderboard). rank (default) is the board's own order, the rank the site and the trader profile show. grade orders by score. volume orders by sports and esports USD volume, the figure GET /api/v1/trader/{address} serves as stats.total_volume. predictions orders by markets_traded. pnl orders by in_scope.realized_pnl. win_rate orders by win_rate among wallets with at least 5 decided sports and esports markets; a wallet with fewer sorts as having none. edge orders by price_edge.edge among wallets whose price_edge.status is ranked and that carry no price_edge.hold; any other wallet sorts as having none. The site's Edge column ranks those same wallets by their edge pulled toward the sports and esports average, a figure the API does not send, so the two orders can differ. A wallet without the value sorts as the lowest, so last in the natural direction and first with the direction reversed. Ties fall to address ascending. With ?category= a sort still orders by these whole-record figures; the category only decides which wallets are listed. Since 2026-11-02 (#32237; edge, #32270). */
|
|
6023
|
+
sort?: "rank" | "grade" | "volume" | "predictions" | "pnl" | "win_rate" | "edge";
|
|
6024
|
+
/** Direction of sort. Omitted, each sort reads in its natural direction: rank 1 first for rank (asc), largest first for every other sort (desc). The opposite value reverses the list. Since 2026-11-02 (#32237). */
|
|
6025
|
+
dir?: "asc" | "desc";
|
|
6026
|
+
/** Limit the list to wallets by recent trading, the site leaderboard's split. active: the wallet's last trade, as its current grade recorded it and aged to today, is 30 days old or less. inactive: older than 30 days, or no trade on record. all (default): every ranked wallet. Since 2026-11-02 (#32237). */
|
|
6027
|
+
activity?: "all" | "active" | "inactive";
|
|
6028
|
+
};
|
|
6029
|
+
listLeaderboardLeagues: Record<string, never>;
|
|
4914
6030
|
listPositions: {
|
|
4915
6031
|
/** Maximum number of current positions to return. Out-of-range values are clamped to 1..100. */
|
|
4916
6032
|
limit?: number;
|
|
@@ -4948,6 +6064,10 @@ export interface OperationQuery {
|
|
|
4948
6064
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
4949
6065
|
/** Optional post-aggregate flow direction filter. */
|
|
4950
6066
|
direction?: "YES" | "NO";
|
|
6067
|
+
/** Only this market's flow: an exact raw provider condition_id. Cannot be combined with event_slug (400). An unknown market returns an empty list. */
|
|
6068
|
+
condition_id?: string;
|
|
6069
|
+
/** Only the markets of one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them, ranked as the unfiltered list ranks. Matched case-insensitively; cannot be combined with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
6070
|
+
event_slug?: string;
|
|
4951
6071
|
};
|
|
4952
6072
|
listSmartMoneyFlows: {
|
|
4953
6073
|
/** Lookback window for grade-filtered whale flow aggregation. */
|
|
@@ -4964,6 +6084,10 @@ export interface OperationQuery {
|
|
|
4964
6084
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
4965
6085
|
/** Optional post-aggregate flow direction filter. */
|
|
4966
6086
|
direction?: "YES" | "NO";
|
|
6087
|
+
/** Only this market's flow: an exact raw provider condition_id. Cannot be combined with event_slug (400). An unknown market returns an empty list. */
|
|
6088
|
+
condition_id?: string;
|
|
6089
|
+
/** Only the markets of one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them, ranked as the unfiltered list ranks. Matched case-insensitively; cannot be combined with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
6090
|
+
event_slug?: string;
|
|
4967
6091
|
};
|
|
4968
6092
|
listSuspiciousTrades: {
|
|
4969
6093
|
/** Maximum number of suspicious trades to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -5036,6 +6160,8 @@ export interface OperationQuery {
|
|
|
5036
6160
|
min_market_volume_share?: number;
|
|
5037
6161
|
/** 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. */
|
|
5038
6162
|
sort?: "recent" | "market_volume_share";
|
|
6163
|
+
/** Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), and cannot be combined with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
6164
|
+
event_slug?: string;
|
|
5039
6165
|
};
|
|
5040
6166
|
listWhaleTrades: {
|
|
5041
6167
|
/** Maximum number of recent large trades to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -5056,6 +6182,10 @@ export interface OperationQuery {
|
|
|
5056
6182
|
sort?: "recent" | "market_volume_share";
|
|
5057
6183
|
/** Return only the trades recorded after this one. Pass the id of a large trade this API returned (wt_<n>, or the bare integer). The answer keeps the list shape and newest-first order, and next_cursor pages within it. After means commit order: a trade recorded late with an earlier traded_at is still returned, and a trade whose write has not committed yet is returned on a later poll, never skipped. To poll, send the id of the first trade on the first page of your last answer that had trades, with If-None-Match set to the ETag you last received; when nothing new was recorded the answer is 304 with an empty body. A late trade can come back once, so deduplicate on id. Only with sort=recent. An id that names no trade, or one more than 10000 trades behind the newest, answers 400 with error.param since; request the list without since and continue from its first trade. */
|
|
5058
6184
|
since?: string;
|
|
6185
|
+
/** Only this market's large trades: an exact raw provider condition_id. The page is read from the market's own index, newest first, and pages with cursor; it cannot be combined with since or with event_slug (400). An unknown market returns an empty list. */
|
|
6186
|
+
condition_id?: string;
|
|
6187
|
+
/** Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), pages with cursor, and cannot be combined with since or with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug. */
|
|
6188
|
+
event_slug?: string;
|
|
5059
6189
|
};
|
|
5060
6190
|
prepareWebhookSecret: Record<string, never>;
|
|
5061
6191
|
redeliverWebhookDelivery: Record<string, never>;
|
|
@@ -5069,7 +6199,7 @@ export interface OperationQuery {
|
|
|
5069
6199
|
limit?: number;
|
|
5070
6200
|
};
|
|
5071
6201
|
searchMarkets: {
|
|
5072
|
-
/** Search query. Must be
|
|
6202
|
+
/** Search query. Must be 2-512 characters before whitespace trimming and hold at least 2 letters or digits after trimming; a query with fewer letters or digits (a, 7, ?) returns 400 bad_request with param q (#32309). */
|
|
5073
6203
|
q: string;
|
|
5074
6204
|
/** Maximum number of matching markets to return. Out-of-range values are clamped to 1..100. */
|
|
5075
6205
|
limit?: number;
|
|
@@ -5120,6 +6250,10 @@ export interface OperationPath {
|
|
|
5120
6250
|
exploreMarkets: Record<string, never>;
|
|
5121
6251
|
getAccountIdentity: Record<string, never>;
|
|
5122
6252
|
getApiDiscovery: Record<string, never>;
|
|
6253
|
+
getCategoryLeaderboard: {
|
|
6254
|
+
/** The category slug, for example soccer, basketball, tennis or esports, as GET /api/v1/leaderboard/categories lists it lowercased. Matched case-insensitively. */
|
|
6255
|
+
slug: string;
|
|
6256
|
+
};
|
|
5123
6257
|
getCombo: {
|
|
5124
6258
|
/** Combo identifier: 0x followed by 62 lowercase hex characters. This differs from a binary market condition ID. */
|
|
5125
6259
|
condition_id: string;
|
|
@@ -5133,6 +6267,14 @@ export interface OperationPath {
|
|
|
5133
6267
|
/** The game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively. */
|
|
5134
6268
|
event_slug: string;
|
|
5135
6269
|
};
|
|
6270
|
+
getGameHolders: {
|
|
6271
|
+
/** The game's event slug from GET /api/v1/games, for example nba-bos-orl-2026-11-01. Matched case-insensitively. */
|
|
6272
|
+
event_slug: string;
|
|
6273
|
+
};
|
|
6274
|
+
getGameSharpMoney: {
|
|
6275
|
+
/** The game's event slug, for example nba-bos-orl-2026-11-01. Matched case-insensitively; the response carries the canonical slug. */
|
|
6276
|
+
event_slug: string;
|
|
6277
|
+
};
|
|
5136
6278
|
getHealth: Record<string, never>;
|
|
5137
6279
|
getInsiderRadarFlag: {
|
|
5138
6280
|
/** Raw whale_alerts.id or rf_-prefixed radar flag id. */
|
|
@@ -5166,6 +6308,14 @@ export interface OperationPath {
|
|
|
5166
6308
|
/** 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. */
|
|
5167
6309
|
condition_id: string;
|
|
5168
6310
|
};
|
|
6311
|
+
getMarketTopHolders: {
|
|
6312
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
6313
|
+
condition_id: string;
|
|
6314
|
+
};
|
|
6315
|
+
getMarketWalletsInOut: {
|
|
6316
|
+
/** 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. */
|
|
6317
|
+
condition_id: string;
|
|
6318
|
+
};
|
|
5169
6319
|
getMonthlyReportSnapshot: Record<string, never>;
|
|
5170
6320
|
getPickOfTheDay: Record<string, never>;
|
|
5171
6321
|
getPickOfTheDayArchive: Record<string, never>;
|
|
@@ -5174,6 +6324,7 @@ export interface OperationPath {
|
|
|
5174
6324
|
/** Stable positive pick row id as canonical decimal text. */
|
|
5175
6325
|
pick_id: string;
|
|
5176
6326
|
};
|
|
6327
|
+
getPickOfTheDayStats: Record<string, never>;
|
|
5177
6328
|
getPlatforms: Record<string, never>;
|
|
5178
6329
|
getPositionTimeline: {
|
|
5179
6330
|
/** Trader identity: 0x... wallet address, username, trd_-prefixed trader id, bare integer traders.id, or @username. Resolved with precedence @username -> wallet -> trd_ -> integer -> username (a leading @ forces a username lookup, for all-digit usernames); wallet matching is case-insensitive. */
|
|
@@ -5184,6 +6335,11 @@ export interface OperationPath {
|
|
|
5184
6335
|
trader: string;
|
|
5185
6336
|
};
|
|
5186
6337
|
getReports: Record<string, never>;
|
|
6338
|
+
getResolutionReport: Record<string, never>;
|
|
6339
|
+
getSportLeaderboard: {
|
|
6340
|
+
/** The sport slug, for example soccer, basketball, football or esports. Matched case-insensitively. A league or title alias such as nba, epl or cs2 reads its sport's board, and the body's sport is that board's slug; pass league for one league's board. */
|
|
6341
|
+
sport: string;
|
|
6342
|
+
};
|
|
5187
6343
|
getStream: Record<string, never>;
|
|
5188
6344
|
getSuspiciousTrade: {
|
|
5189
6345
|
/** Raw whale_alerts.id or rf_-prefixed suspicious trade id. */
|
|
@@ -5241,8 +6397,17 @@ export interface OperationPath {
|
|
|
5241
6397
|
/** Raw whale_alerts.id or wt_-prefixed whale trade id. */
|
|
5242
6398
|
id: string;
|
|
5243
6399
|
};
|
|
6400
|
+
listCategoryLeaders: Record<string, never>;
|
|
5244
6401
|
listComboFills: Record<string, never>;
|
|
6402
|
+
listGameMarkets: {
|
|
6403
|
+
/** The event slug from GET /api/v1/games, GET /api/v1/games/{event_slug} or a markets/search result's event_slug, for example nba-bos-orl-2026-11-01. Matched case-insensitively. */
|
|
6404
|
+
event_slug: string;
|
|
6405
|
+
};
|
|
5245
6406
|
listGames: Record<string, never>;
|
|
6407
|
+
listGameTrades: {
|
|
6408
|
+
/** The game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively. */
|
|
6409
|
+
event_slug: string;
|
|
6410
|
+
};
|
|
5246
6411
|
listInsiderRadar: Record<string, never>;
|
|
5247
6412
|
listLargePositions: Record<string, never>;
|
|
5248
6413
|
listLargeTradeCounterpartyExecutions: {
|
|
@@ -5258,6 +6423,7 @@ export interface OperationPath {
|
|
|
5258
6423
|
listLargeTradeHistory: Record<string, never>;
|
|
5259
6424
|
listLargeTrades: Record<string, never>;
|
|
5260
6425
|
listLeaderboard: Record<string, never>;
|
|
6426
|
+
listLeaderboardLeagues: Record<string, never>;
|
|
5261
6427
|
listPositions: Record<string, never>;
|
|
5262
6428
|
listSharpMoneyFlows: Record<string, never>;
|
|
5263
6429
|
listSmartMoneyFlows: Record<string, never>;
|
|
@@ -5342,10 +6508,10 @@ export interface OperationBody {
|
|
|
5342
6508
|
createMcpJsonRpcResponse: {
|
|
5343
6509
|
/** JSON-RPC protocol version; this server accepts 2.0. */
|
|
5344
6510
|
jsonrpc: "2.0";
|
|
5345
|
-
/** Request identifier echoed exactly in one JSON-RPC response;
|
|
5346
|
-
id?: string | number
|
|
6511
|
+
/** Request identifier, a string or a number, echoed exactly in one JSON-RPC response; a notification omits it and receives an empty HTTP 202. A null id answers HTTP 400 with JSON-RPC error -32600. */
|
|
6512
|
+
id?: string | number;
|
|
5347
6513
|
/** MCP method to invoke. */
|
|
5348
|
-
method: "initialize" | "notifications/initialized" | "notifications/cancelled" | "ping" | "tools/list" | "tools/call";
|
|
6514
|
+
method: "initialize" | "notifications/initialized" | "notifications/cancelled" | "ping" | "tools/list" | "tools/call" | "server/discover";
|
|
5349
6515
|
/** Method-specific MCP parameters. */
|
|
5350
6516
|
params?: Record<string, unknown>;
|
|
5351
6517
|
};
|
|
@@ -5355,6 +6521,7 @@ export interface OperationBody {
|
|
|
5355
6521
|
exploreMarkets: never;
|
|
5356
6522
|
getAccountIdentity: never;
|
|
5357
6523
|
getApiDiscovery: never;
|
|
6524
|
+
getCategoryLeaderboard: never;
|
|
5358
6525
|
getCombo: never;
|
|
5359
6526
|
getCombosSummary: never;
|
|
5360
6527
|
getCoverage: never;
|
|
@@ -5362,6 +6529,8 @@ export interface OperationBody {
|
|
|
5362
6529
|
getEdgeHunter: never;
|
|
5363
6530
|
getEventReplaySince: never;
|
|
5364
6531
|
getGame: never;
|
|
6532
|
+
getGameHolders: never;
|
|
6533
|
+
getGameSharpMoney: never;
|
|
5365
6534
|
getHealth: never;
|
|
5366
6535
|
getInsiderRadarFlag: never;
|
|
5367
6536
|
getLargeTrade: never;
|
|
@@ -5371,15 +6540,20 @@ export interface OperationBody {
|
|
|
5371
6540
|
getMarketHolders: never;
|
|
5372
6541
|
getMarketIntel: never;
|
|
5373
6542
|
getMarketSnapshot: never;
|
|
6543
|
+
getMarketTopHolders: never;
|
|
6544
|
+
getMarketWalletsInOut: never;
|
|
5374
6545
|
getMonthlyReportSnapshot: never;
|
|
5375
6546
|
getPickOfTheDay: never;
|
|
5376
6547
|
getPickOfTheDayArchive: never;
|
|
5377
6548
|
getPickOfTheDayLedger: never;
|
|
5378
6549
|
getPickOfTheDayLedgerEntry: never;
|
|
6550
|
+
getPickOfTheDayStats: never;
|
|
5379
6551
|
getPlatforms: never;
|
|
5380
6552
|
getPositionTimeline: never;
|
|
5381
6553
|
getPositionTimelineById: never;
|
|
5382
6554
|
getReports: never;
|
|
6555
|
+
getResolutionReport: never;
|
|
6556
|
+
getSportLeaderboard: never;
|
|
5383
6557
|
getStream: never;
|
|
5384
6558
|
getSuspiciousTrade: never;
|
|
5385
6559
|
getTrader: never;
|
|
@@ -5396,8 +6570,11 @@ export interface OperationBody {
|
|
|
5396
6570
|
getWeeklyReportSnapshot: never;
|
|
5397
6571
|
getWhaleDatasetStatus: never;
|
|
5398
6572
|
getWhaleTrade: never;
|
|
6573
|
+
listCategoryLeaders: never;
|
|
5399
6574
|
listComboFills: never;
|
|
6575
|
+
listGameMarkets: never;
|
|
5400
6576
|
listGames: never;
|
|
6577
|
+
listGameTrades: never;
|
|
5401
6578
|
listInsiderRadar: never;
|
|
5402
6579
|
listLargePositions: never;
|
|
5403
6580
|
listLargeTradeCounterpartyExecutions: never;
|
|
@@ -5405,6 +6582,7 @@ export interface OperationBody {
|
|
|
5405
6582
|
listLargeTradeHistory: never;
|
|
5406
6583
|
listLargeTrades: never;
|
|
5407
6584
|
listLeaderboard: never;
|
|
6585
|
+
listLeaderboardLeagues: never;
|
|
5408
6586
|
listPositions: never;
|
|
5409
6587
|
listSharpMoneyFlows: never;
|
|
5410
6588
|
listSmartMoneyFlows: never;
|
|
@@ -5510,6 +6688,15 @@ export interface OperationResponse {
|
|
|
5510
6688
|
data: OperationData["getApiDiscovery"];
|
|
5511
6689
|
meta: ResponseMeta;
|
|
5512
6690
|
};
|
|
6691
|
+
getCategoryLeaderboard: {
|
|
6692
|
+
object: "list";
|
|
6693
|
+
data: OperationData["getCategoryLeaderboard"];
|
|
6694
|
+
has_more: boolean;
|
|
6695
|
+
next_cursor?: string;
|
|
6696
|
+
/** Wallets in the category whose edge lower bound is above zero, Wallets in the full walk across every page: those in the category, under this request's active_within and min_events, whose edge lower bound is above zero. The same on every page. */
|
|
6697
|
+
total?: number;
|
|
6698
|
+
meta: ResponseMeta;
|
|
6699
|
+
};
|
|
5513
6700
|
getCombo: ComboResponse;
|
|
5514
6701
|
getCombosSummary: CombosSummaryResponse;
|
|
5515
6702
|
getCoverage: {
|
|
@@ -5537,6 +6724,16 @@ export interface OperationResponse {
|
|
|
5537
6724
|
as_of: string;
|
|
5538
6725
|
meta: ResponseMeta;
|
|
5539
6726
|
};
|
|
6727
|
+
getGameHolders: {
|
|
6728
|
+
object: "game_holders_batch";
|
|
6729
|
+
data: OperationData["getGameHolders"];
|
|
6730
|
+
meta: BatchResponseMeta;
|
|
6731
|
+
};
|
|
6732
|
+
getGameSharpMoney: {
|
|
6733
|
+
object: "game_sharp_money";
|
|
6734
|
+
data: OperationData["getGameSharpMoney"];
|
|
6735
|
+
meta: ResponseMeta;
|
|
6736
|
+
};
|
|
5540
6737
|
getHealth: {
|
|
5541
6738
|
object: "health";
|
|
5542
6739
|
data: OperationData["getHealth"];
|
|
@@ -5586,6 +6783,16 @@ export interface OperationResponse {
|
|
|
5586
6783
|
data: OperationData["getMarketSnapshot"];
|
|
5587
6784
|
meta: ResponseMeta;
|
|
5588
6785
|
};
|
|
6786
|
+
getMarketTopHolders: {
|
|
6787
|
+
object: "market_top_holders";
|
|
6788
|
+
data: OperationData["getMarketTopHolders"];
|
|
6789
|
+
meta: ResponseMeta;
|
|
6790
|
+
};
|
|
6791
|
+
getMarketWalletsInOut: {
|
|
6792
|
+
object: "market_wallets_in_out";
|
|
6793
|
+
data: OperationData["getMarketWalletsInOut"];
|
|
6794
|
+
meta: ResponseMeta;
|
|
6795
|
+
};
|
|
5589
6796
|
getMonthlyReportSnapshot: {
|
|
5590
6797
|
object: "report_snapshot";
|
|
5591
6798
|
data: OperationData["getMonthlyReportSnapshot"];
|
|
@@ -5611,6 +6818,11 @@ export interface OperationResponse {
|
|
|
5611
6818
|
data: OperationData["getPickOfTheDayLedgerEntry"];
|
|
5612
6819
|
meta: ResponseMeta;
|
|
5613
6820
|
};
|
|
6821
|
+
getPickOfTheDayStats: {
|
|
6822
|
+
object: "pick_of_the_day_stats";
|
|
6823
|
+
data: OperationData["getPickOfTheDayStats"];
|
|
6824
|
+
meta: ResponseMeta;
|
|
6825
|
+
};
|
|
5614
6826
|
getPlatforms: {
|
|
5615
6827
|
object: "platforms";
|
|
5616
6828
|
data: OperationData["getPlatforms"];
|
|
@@ -5639,6 +6851,16 @@ export interface OperationResponse {
|
|
|
5639
6851
|
data: OperationData["getReports"];
|
|
5640
6852
|
meta: ResponseMeta;
|
|
5641
6853
|
};
|
|
6854
|
+
getResolutionReport: {
|
|
6855
|
+
object: "resolution_report";
|
|
6856
|
+
data: OperationData["getResolutionReport"];
|
|
6857
|
+
meta: ResponseMeta;
|
|
6858
|
+
};
|
|
6859
|
+
getSportLeaderboard: {
|
|
6860
|
+
object: "sport_leaderboard";
|
|
6861
|
+
data: OperationData["getSportLeaderboard"];
|
|
6862
|
+
meta: ResponseMeta;
|
|
6863
|
+
};
|
|
5642
6864
|
getStream: string;
|
|
5643
6865
|
getSuspiciousTrade: {
|
|
5644
6866
|
object: "suspicious_trade";
|
|
@@ -5699,18 +6921,52 @@ export interface OperationResponse {
|
|
|
5699
6921
|
data: OperationData["getWhaleTrade"];
|
|
5700
6922
|
meta: ResponseMeta;
|
|
5701
6923
|
};
|
|
6924
|
+
listCategoryLeaders: {
|
|
6925
|
+
object: "list";
|
|
6926
|
+
data: OperationData["listCategoryLeaders"];
|
|
6927
|
+
has_more: boolean;
|
|
6928
|
+
next_cursor?: string;
|
|
6929
|
+
/** Number of rows returned: up to three per category. */
|
|
6930
|
+
total?: number;
|
|
6931
|
+
meta: ResponseMeta;
|
|
6932
|
+
};
|
|
5702
6933
|
listComboFills: ComboFillsResponse;
|
|
6934
|
+
listGameMarkets: {
|
|
6935
|
+
data: OperationData["listGameMarkets"];
|
|
6936
|
+
event_slug: string;
|
|
6937
|
+
families: {
|
|
6938
|
+
active: number;
|
|
6939
|
+
markets: number;
|
|
6940
|
+
sports_market_type?: string;
|
|
6941
|
+
}[];
|
|
6942
|
+
has_more: boolean;
|
|
6943
|
+
meta: ResponseMeta;
|
|
6944
|
+
next_cursor?: string;
|
|
6945
|
+
object: string;
|
|
6946
|
+
};
|
|
5703
6947
|
listGames: {
|
|
5704
6948
|
object: "list";
|
|
5705
6949
|
data: OperationData["listGames"];
|
|
5706
6950
|
has_more: boolean;
|
|
5707
6951
|
/** Pass as cursor for the next page. Present only when has_more is true. */
|
|
5708
6952
|
next_cursor?: string;
|
|
5709
|
-
/** When this read assembled the catalog. Per-source vintage is on each game's freshness. */
|
|
6953
|
+
/** When this read assembled the catalog; with status ended, cancelled or postponed, when it read the stored records. Per-source vintage is on each game's freshness. */
|
|
5710
6954
|
as_of: string;
|
|
5711
6955
|
coverage: GamesCoverage;
|
|
5712
6956
|
meta: ResponseMeta;
|
|
5713
6957
|
};
|
|
6958
|
+
listGameTrades: {
|
|
6959
|
+
object: "list";
|
|
6960
|
+
/** Newest first. */
|
|
6961
|
+
data: OperationData["listGameTrades"];
|
|
6962
|
+
/** Always false: the list is the game's newest limit fills, not a walk. Poll again for newer fills. */
|
|
6963
|
+
has_more: boolean;
|
|
6964
|
+
/** The game the rows were read for, lowercased. */
|
|
6965
|
+
event_slug: string;
|
|
6966
|
+
/** true when the rows are the game's last complete read, served while its refresh runs. Read again in a few seconds for the live rows. */
|
|
6967
|
+
source_stale: boolean;
|
|
6968
|
+
meta: ResponseMeta;
|
|
6969
|
+
};
|
|
5714
6970
|
listInsiderRadar: {
|
|
5715
6971
|
object: "list";
|
|
5716
6972
|
data: OperationData["listInsiderRadar"];
|
|
@@ -5771,6 +7027,11 @@ export interface OperationResponse {
|
|
|
5771
7027
|
total?: number;
|
|
5772
7028
|
meta: ResponseMeta;
|
|
5773
7029
|
};
|
|
7030
|
+
listLeaderboardLeagues: {
|
|
7031
|
+
object: "leaderboard_leagues";
|
|
7032
|
+
data: OperationData["listLeaderboardLeagues"];
|
|
7033
|
+
meta: ResponseMeta;
|
|
7034
|
+
};
|
|
5774
7035
|
listPositions: {
|
|
5775
7036
|
object: "list";
|
|
5776
7037
|
data: OperationData["listPositions"];
|