@0xinsider/mcp 3.6.1 → 3.7.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 +58 -22
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/product-cli/index.d.ts.map +1 -1
- package/dist/product-cli/index.js +162 -26
- package/dist/product-cli/index.js.map +1 -1
- package/dist/product-cli/operations.d.ts +24 -0
- package/dist/product-cli/operations.d.ts.map +1 -0
- package/dist/product-cli/operations.js +222 -0
- package/dist/product-cli/operations.js.map +1 -0
- package/dist/prompts/index.js +2 -2
- package/dist/sdk/client.d.ts +75 -160
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +122 -220
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/errors.d.ts +17 -6
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +30 -6
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +5 -27
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +3 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/pagination.d.ts +3 -3
- package/dist/sdk/pagination.js +2 -2
- package/dist/sdk/schema.d.ts +481 -215
- package/dist/sdk/schema.d.ts.map +1 -1
- package/dist/sdk/stream.d.ts.map +1 -1
- package/dist/sdk/stream.js +3 -2
- package/dist/sdk/stream.js.map +1 -1
- package/dist/sdk/webhooks.d.ts +8 -60
- package/dist/sdk/webhooks.d.ts.map +1 -1
- package/dist/sdk/webhooks.js.map +1 -1
- package/dist/tools/explore-markets.js +4 -4
- package/dist/tools/explore-markets.js.map +1 -1
- package/dist/tools/get-insider-radar.js +1 -1
- package/dist/tools/get-insider-radar.js.map +1 -1
- package/dist/tools/get-leaderboard.d.ts.map +1 -1
- package/dist/tools/get-leaderboard.js +5 -14
- package/dist/tools/get-leaderboard.js.map +1 -1
- package/dist/tools/get-market-flow.js +1 -1
- package/dist/tools/get-trader-pnl.js +3 -3
- package/dist/tools/get-trader-pnl.js.map +1 -1
- package/dist/tools/get-trader.js +3 -3
- package/dist/tools/get-trending-wallets.js +1 -1
- package/dist/tools/get-whale-trades.js +3 -3
- package/dist/tools/get-whale-trades.js.map +1 -1
- package/dist/tools/pick-of-the-day.js +2 -2
- package/dist/tools/read-parity.d.ts.map +1 -1
- package/dist/tools/read-parity.js +17 -15
- package/dist/tools/read-parity.js.map +1 -1
- package/dist/tools/trader-reads.js +1 -1
- package/package.json +6 -6
package/dist/sdk/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,8 @@ 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
|
-
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
80
|
-
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
80
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
81
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
81
82
|
};
|
|
82
83
|
meta: ResponseMeta;
|
|
83
84
|
};
|
|
@@ -90,8 +91,8 @@ export type ApiErrorBody = {
|
|
|
90
91
|
/** 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
92
|
retry_at?: string;
|
|
92
93
|
freshness?: FreshnessFailure;
|
|
93
|
-
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
94
|
-
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
94
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed. */
|
|
95
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "market_out_of_scope" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "cold_read_limited" | "export_expired" | "freshness_ceiling_unsatisfied" | "max_plan_required" | "endpoint_retired";
|
|
95
96
|
};
|
|
96
97
|
export type BatchMarketFlowItem = {
|
|
97
98
|
/** Zero-based request index. Duplicate inputs keep separate result rows. */
|
|
@@ -103,6 +104,7 @@ export type BatchMarketFlowItem = {
|
|
|
103
104
|
};
|
|
104
105
|
export type BatchRateLimitMeta = {
|
|
105
106
|
basis: "batch_items_per_minute";
|
|
107
|
+
/** The batch item budget per minute for the caller's plan: 2500 item units on Pro, 5000 on Max. The same number X-Batch-RateLimit-Limit reports. */
|
|
106
108
|
limit: number;
|
|
107
109
|
remaining: number;
|
|
108
110
|
/** Unix timestamp when the batch item window resets. */
|
|
@@ -266,8 +268,6 @@ export type ComboFillsResponse = {
|
|
|
266
268
|
/** Continuation offset for largest or payout ordering. */
|
|
267
269
|
next_offset?: number;
|
|
268
270
|
meta: ResponseMeta;
|
|
269
|
-
/** Not computed for combo fill pages; omitted. */
|
|
270
|
-
total?: number;
|
|
271
271
|
};
|
|
272
272
|
export type ComboLeg = {
|
|
273
273
|
leg_index: number;
|
|
@@ -391,7 +391,8 @@ export type CounterpartyAnalysis = {
|
|
|
391
391
|
};
|
|
392
392
|
export type CounterpartyExecution = {
|
|
393
393
|
execution_id: string;
|
|
394
|
-
|
|
394
|
+
/** Polymarket exchange contract that emitted the execution: `ctf_v2` the CTF Exchange v2, `neg_risk_ctf_v2` the Neg Risk CTF Exchange v2, `exchange_v3` ExchangeV3, which settles Polymarket Protocol V2 binary and neg-risk markets. Treat an unknown value as another exchange. */
|
|
395
|
+
exchange_family: "ctf_v2" | "neg_risk_ctf_v2" | "exchange_v3";
|
|
395
396
|
transaction_hash: string;
|
|
396
397
|
orders_matched_log_index: number;
|
|
397
398
|
taker: CounterpartyParticipant;
|
|
@@ -563,6 +564,8 @@ export type EdgeHunterObservation = {
|
|
|
563
564
|
observed_at: string;
|
|
564
565
|
/** 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. */
|
|
565
566
|
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
567
|
+
/** 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. */
|
|
568
|
+
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h";
|
|
566
569
|
/** Always true. This row must not be routed to an order executor. */
|
|
567
570
|
observation_only: true;
|
|
568
571
|
/**
|
|
@@ -598,9 +601,9 @@ export type EdgeHunterObservation = {
|
|
|
598
601
|
conviction_score: number;
|
|
599
602
|
/** Whether the provider holder page came from the shared cache or a live provider read. */
|
|
600
603
|
provider_read_source: "cached" | "live";
|
|
601
|
-
/** True only when provider
|
|
604
|
+
/** 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. */
|
|
602
605
|
holder_scan_complete: boolean;
|
|
603
|
-
/** Proven provider holder observation time. A warm cache hit uses only the original provider completion time from its companion metadata, never cache-read time. Null, malformed, future, or stale holder time fails in-play closed. */
|
|
606
|
+
/** 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. */
|
|
604
607
|
holder_snapshot_at: string | null;
|
|
605
608
|
/** 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. */
|
|
606
609
|
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
@@ -615,15 +618,15 @@ export type EdgeHunterObservation = {
|
|
|
615
618
|
/** Required nullable frozen metadata context. Null only during the legacy-generation transition; selected reads require sidecar readiness and fail closed with 503 instead. */
|
|
616
619
|
market_context: EdgeHunterMarketContext | null;
|
|
617
620
|
};
|
|
618
|
-
/** Measured coverage of the frozen canonical observation generation and this requested page. For sports and esports reads, the first four counts remain global through category, cohort and all selectors. They are neither a census of all provider markets nor a count of successfully evaluated holders. Selected and returned counts describe the requested projection. An unmappable legacy category synthesizes a zero-work empty generation with all six counts zero and no degradation reasons; it does not read the all-sports cache. */
|
|
621
|
+
/** Measured coverage of the frozen canonical observation generation and this requested page. For sports and esports reads, the first four counts remain global through category, cohort and all selectors; with admission=most_held_48h they count that selection's generation, where every wider_holder candidate it did not take is capacity_limited. They are neither a census of all provider markets nor a count of successfully evaluated holders. Selected and returned counts describe the requested projection. An unmappable legacy category synthesizes a zero-work empty generation with all six counts zero and no degradation reasons; it does not read the all-sports cache. */
|
|
619
622
|
export type EdgeHunterObservationCoverage = {
|
|
620
623
|
/** Sum of canonical source-generation funnel input across all sports, before category, cohort or selector projection. */
|
|
621
624
|
input_markets: number;
|
|
622
|
-
/** Canonical source-generation input assigned capacity_limited. These markets were intentionally outside the bounded holder-work admission and are not missing emitted rows. */
|
|
625
|
+
/** Canonical source-generation input assigned capacity_limited. These markets were intentionally outside the bounded holder-work admission and are not missing emitted rows. It includes the admitted pregame wider_holder markets of any sport no request named in the last 30 minutes, whose holders the generation did not read. */
|
|
623
626
|
capacity_limited_markets: number;
|
|
624
627
|
/** All wider_holder and in_play observations emitted in the canonical source generation, before cohort, category or selector projection. Emerging pile is an overlapping projection and does not add source emissions. */
|
|
625
628
|
emitted_observations: number;
|
|
626
|
-
/** Canonical source-generation markets whose attempted holder scan did not establish complete coverage, including incomplete scans that did not emit an observation. */
|
|
629
|
+
/** Canonical source-generation markets whose attempted holder scan did not establish complete coverage, including incomplete scans that did not emit an observation. Collection reads one 100-row page per token, so a market with more holders on a token counts here by design; this count does not by itself degrade the generation. */
|
|
627
630
|
incomplete_holder_markets: number;
|
|
628
631
|
/** Observations matching the requested cohort, category, selectors and applicable pinned projection cutoff before pagination. */
|
|
629
632
|
selected_observations: number;
|
|
@@ -632,11 +635,29 @@ export type EdgeHunterObservationCoverage = {
|
|
|
632
635
|
};
|
|
633
636
|
/** One observed cause of operational degradation in the canonical all-sports observation generation. Reasons are independent of the one-terminal-per-input funnel and remain unchanged through category, cohort and selector projection. Intentional capacity limits and an unconfigured upcoming source are not degradation reasons. */
|
|
634
637
|
export type EdgeHunterObservationDegradationReason = {
|
|
635
|
-
/** Recorded producer cause. holder_scan_incomplete
|
|
638
|
+
/** Recorded producer cause. holder_scan_incomplete is retired and no longer emitted: the one-page holder read is an intentional bound, disclosed by each row's holder_scan_complete and by coverage.incomplete_holder_markets, and it does not degrade a generation. directional_unavailable can accompany an emitted wider_holder row; live_source_stale means provider live evidence exceeded its freshness bound. Other values identify reconciliation, applicable board-source or terminal failure evidence. */
|
|
636
639
|
reason: "holder_scan_incomplete" | "live_source_stale" | "directional_unavailable" | "funnel_unreconciled" | "board_live_unavailable" | "board_upcoming_unavailable" | "provider_unavailable" | "holder_deadline_unavailable" | "holder_computation_unavailable" | "missing_stored_market" | "price_unavailable" | "in_play_stale_observed" | "in_play_directional_unavailable" | "internal_unclassified" | "board_source_unavailable" | "board_deadline_unavailable";
|
|
637
640
|
/** Canonical sport for the recorded cause; null only for generation-wide evidence without a sport attribution. */
|
|
638
641
|
sport: string | null;
|
|
639
642
|
};
|
|
643
|
+
/** A market whose wider_holder card left this selection before kickoff, with why it left. */
|
|
644
|
+
export type EdgeHunterObservationDeparture = {
|
|
645
|
+
/** Raw Polymarket condition id. */
|
|
646
|
+
condition_id: string;
|
|
647
|
+
event_slug: string | null;
|
|
648
|
+
/** Canonical sport bucket the departed card carried. */
|
|
649
|
+
category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
650
|
+
/** The departed card's admitted_by: most_held_48h on an admission=most_held_48h response. */
|
|
651
|
+
admitted_by: "most_held" | "soonest_kickoff" | "most_held_48h";
|
|
652
|
+
/** Kickoff the departed card carried, in UTC. The entry leaves the list once it passes. */
|
|
653
|
+
game_start_time: string;
|
|
654
|
+
/** The departed card's observed_at: when its last evaluation finished. */
|
|
655
|
+
last_observed_at: string;
|
|
656
|
+
/** snapshot_as_of of the first snapshot of this selection without the card. */
|
|
657
|
+
departed_at: string;
|
|
658
|
+
/** 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. */
|
|
659
|
+
reason: EdgeHunterObservationTerminalReason;
|
|
660
|
+
};
|
|
640
661
|
/** 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. */
|
|
641
662
|
export type EdgeHunterObservationsResponse = {
|
|
642
663
|
object: "list";
|
|
@@ -647,17 +668,23 @@ export type EdgeHunterObservationsResponse = {
|
|
|
647
668
|
next_cursor: string | null;
|
|
648
669
|
/** Completion time of the shared observation snapshot pinned by the cursor. */
|
|
649
670
|
snapshot_as_of: string;
|
|
650
|
-
/** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Inspect degradation_reasons for every recorded source-generation cause and its nullable canonical sport attribution. Intentional
|
|
671
|
+
/** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Inspect degradation_reasons for every recorded source-generation cause and its nullable canonical sport attribution. Intentional bounds do not by themselves set this field: capacity_limited rows remain fully accounted in the funnel, and a holder scan the one-page read leaves incomplete counts in coverage.incomplete_holder_markets; board_upcoming_status=not_configured is not a failure. */
|
|
651
672
|
degraded: boolean;
|
|
652
|
-
/** Sorted, deduplicated causes from the canonical all-sports generation, unchanged by category, cohort or selectors. Empty exactly when degraded is false. Capacity-limited input and board_upcoming_status=not_configured do not by themselves add a reason. */
|
|
673
|
+
/** Sorted, deduplicated causes from the canonical all-sports generation, unchanged by category, cohort or selectors; with admission=most_held_48h, from that selection's generation. Empty exactly when degraded is false. Capacity-limited input, the one-page holder bound (holder_scan_complete=false) and board_upcoming_status=not_configured do not by themselves add a reason. */
|
|
653
674
|
degradation_reasons: EdgeHunterObservationDegradationReason[];
|
|
654
675
|
coverage: EdgeHunterObservationCoverage;
|
|
655
676
|
funnel: EdgeHunterFunnelReport;
|
|
656
677
|
meta: ResponseMeta;
|
|
657
678
|
/** Normalized axes requested with a selector or category; omitted on an unselected default read. */
|
|
658
679
|
selection?: EdgeHunterSelection;
|
|
659
|
-
|
|
660
|
-
|
|
680
|
+
/** 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. */
|
|
681
|
+
admission?: "most_held_48h";
|
|
682
|
+
/** 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. */
|
|
683
|
+
departures?: EdgeHunterObservationDeparture[];
|
|
684
|
+
/** 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. */
|
|
685
|
+
signals_as_of?: string | null;
|
|
686
|
+
};
|
|
687
|
+
/** 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. */
|
|
661
688
|
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";
|
|
662
689
|
/** 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. */
|
|
663
690
|
export type EdgeHunterOutcome = {
|
|
@@ -677,6 +704,8 @@ export type EdgeHunterParticipant = {
|
|
|
677
704
|
headshot_revision?: number;
|
|
678
705
|
tour?: string;
|
|
679
706
|
name: string;
|
|
707
|
+
logo_mark_light?: boolean;
|
|
708
|
+
logo_mark_measured?: boolean;
|
|
680
709
|
};
|
|
681
710
|
export type EdgeHunterPrice = {
|
|
682
711
|
/** Provider probability as a decimal string. Keep its precision until display. */
|
|
@@ -852,15 +881,15 @@ export type EdgeHunterSportFunnelReport = {
|
|
|
852
881
|
board_live_available: boolean;
|
|
853
882
|
/** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
|
|
854
883
|
board_upcoming_configured: boolean;
|
|
855
|
-
/** 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 (
|
|
884
|
+
/** 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. */
|
|
856
885
|
board_upcoming_available: boolean;
|
|
857
|
-
/** Why the upcoming-board source is (un)available. Board supply is one canonical-sport union: the bare category owns live truth and every configured composed league scope contributes upcoming rows; folded leagues without a configured board (currently NCAAB and CFL) are not in the upcoming union. available: every configured scope completed truthfully (a successful empty schedule still counts). capacity_limited: provider pagination or a configured upcoming cache published an intentionally bounded complete-event prefix; those rows are excluded from diagnostic-universe input and must not be treated as a complete upcoming universe. Cache-bound prefixes are limited to
|
|
886
|
+
/** Why the upcoming-board source is (un)available. Board supply is one canonical-sport union: the bare category owns live truth and every configured composed league scope contributes upcoming rows; folded leagues without a configured board (currently NCAAB and CFL) are not in the upcoming union. available: every configured scope completed truthfully (a successful empty schedule still counts). capacity_limited: provider pagination or a configured upcoming cache published an intentionally bounded complete-event prefix; those rows are excluded from diagnostic-universe input and must not be treated as a complete upcoming universe. Cache-bound prefixes are limited to 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. */
|
|
858
887
|
board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
|
|
859
888
|
/** 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. */
|
|
860
889
|
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")[];
|
|
861
890
|
/** Stored-universe rows plus provider-board rows missing from storage. */
|
|
862
891
|
input: number;
|
|
863
|
-
/** 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
|
|
892
|
+
/** 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. */
|
|
864
893
|
terminals: Record<string, number>;
|
|
865
894
|
/** Sum of every sparse terminal count. */
|
|
866
895
|
terminal_total: number;
|
|
@@ -902,7 +931,6 @@ export type EventReplayMeta = {
|
|
|
902
931
|
/** 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. */
|
|
903
932
|
request_id: string;
|
|
904
933
|
cached: boolean;
|
|
905
|
-
cache_age_s?: number;
|
|
906
934
|
/** Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price. */
|
|
907
935
|
cost: number;
|
|
908
936
|
replay: {
|
|
@@ -980,8 +1008,12 @@ export type ExploreGroup = {
|
|
|
980
1008
|
markets: ExploreMarket[];
|
|
981
1009
|
/** The volume of the group's highest-volume market, which is markets[0]: the same figure as that market's volume, Polymarket's cumulative taker volume in shares rather than cash. Null when unavailable. */
|
|
982
1010
|
rep_volume: number | null;
|
|
983
|
-
/** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value. */
|
|
1011
|
+
/** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
984
1012
|
rep_large_trades: number | null;
|
|
1013
|
+
/**
|
|
1014
|
+
* Deprecated spelling of rep_large_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read rep_large_trades.
|
|
1015
|
+
* @deprecated
|
|
1016
|
+
*/
|
|
985
1017
|
rep_whales: number | null;
|
|
986
1018
|
};
|
|
987
1019
|
export type ExploreMarket = {
|
|
@@ -1003,17 +1035,33 @@ export type ExploreMarket = {
|
|
|
1003
1035
|
/** Polymarket's traded-volume figure for the market, as last stored: cumulative taker volume in shares, each counted at its $1 settlement value, not the cash that changed hands (100 shares bought at $0.40 add 100, not 40). It can lag Polymarket's current figure. sort=volume orders by it. Null when unavailable. */
|
|
1004
1036
|
volume: number | null;
|
|
1005
1037
|
liquidity: number | null;
|
|
1006
|
-
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
1038
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1007
1039
|
large_trade_count: number | null;
|
|
1040
|
+
/**
|
|
1041
|
+
* Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
|
|
1042
|
+
* @deprecated
|
|
1043
|
+
*/
|
|
1008
1044
|
whale_trade_count: number | null;
|
|
1009
|
-
/** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value. */
|
|
1045
|
+
/** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1010
1046
|
large_trade_distinct_wallets: number | null;
|
|
1047
|
+
/**
|
|
1048
|
+
* Deprecated spelling of large_trade_distinct_wallets, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_distinct_wallets.
|
|
1049
|
+
* @deprecated
|
|
1050
|
+
*/
|
|
1011
1051
|
whale_distinct_wallets: number | null;
|
|
1012
|
-
/** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value. */
|
|
1052
|
+
/** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1013
1053
|
large_trade_total_usd: number | null;
|
|
1054
|
+
/**
|
|
1055
|
+
* Deprecated spelling of large_trade_total_usd, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_total_usd.
|
|
1056
|
+
* @deprecated
|
|
1057
|
+
*/
|
|
1014
1058
|
whale_total_usd: number | null;
|
|
1015
|
-
/** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value. */
|
|
1059
|
+
/** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1016
1060
|
large_trade_last_at: string | null;
|
|
1061
|
+
/**
|
|
1062
|
+
* Deprecated spelling of large_trade_last_at, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_last_at.
|
|
1063
|
+
* @deprecated
|
|
1064
|
+
*/
|
|
1017
1065
|
whale_last_trade_at: string | null;
|
|
1018
1066
|
end_date: string | null;
|
|
1019
1067
|
created_at: string | null;
|
|
@@ -1028,6 +1076,8 @@ export type ExploreMarket = {
|
|
|
1028
1076
|
smart_count: number | null;
|
|
1029
1077
|
/** The outcome graded money leans toward RELATIVE TO THE PRICE: named only when the graded money's share of a side diverges from that side's price-implied share by at least 10 points, with at least $500 on the leaning side and outside the crowded-side guard. Null when the money sits with the price (no lean), when there is no graded money, or when the price is unavailable. The same rule as the market page. */
|
|
1030
1078
|
smart_label: string | null;
|
|
1079
|
+
/** When the oldest stored smart-money wallet behind this split (smart_score, smart_count and smart_label) last finished syncing. Graded wallets sync on different schedules, so this is often hours or days ago. Some holdings in the split can come from a Polymarket holder read cached for up to 3 minutes, which this time does not describe. Null when there is no split or a wallet's sync time is unknown. */
|
|
1080
|
+
sharp_money_as_of: string | null;
|
|
1031
1081
|
/** Display label for the YES/outcome_index=0 side, enriched from provider outcome metadata when available. */
|
|
1032
1082
|
outcome_yes_label: string | null;
|
|
1033
1083
|
/** Display label for the NO/outcome_index=1 side, enriched from provider outcome metadata when available. */
|
|
@@ -1048,15 +1098,19 @@ export type ExploreMarket = {
|
|
|
1048
1098
|
discover_score: number | null;
|
|
1049
1099
|
score_components: {
|
|
1050
1100
|
volume_signal: number | null;
|
|
1051
|
-
/** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
1101
|
+
/** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1052
1102
|
large_trade_signal: number | null;
|
|
1103
|
+
/**
|
|
1104
|
+
* Deprecated spelling of large_trade_signal, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_signal.
|
|
1105
|
+
* @deprecated
|
|
1106
|
+
*/
|
|
1053
1107
|
whale_signal: number | null;
|
|
1054
1108
|
liquidity_signal: number | null;
|
|
1055
1109
|
recency_signal: number | null;
|
|
1056
|
-
/** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
1110
|
+
/** Canonical key since #16308; smart_money_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1057
1111
|
sharp_money_signal: number | null;
|
|
1058
1112
|
/**
|
|
1059
|
-
* Deprecated spelling of sharp_money_signal; emitted beside it with the same value
|
|
1113
|
+
* Deprecated spelling of sharp_money_signal; emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money_signal.
|
|
1060
1114
|
* @deprecated
|
|
1061
1115
|
*/
|
|
1062
1116
|
smart_money_signal: number | null;
|
|
@@ -1078,9 +1132,13 @@ export type ExportCompleteness = {
|
|
|
1078
1132
|
sync_coverage: number;
|
|
1079
1133
|
};
|
|
1080
1134
|
export type ExportCounts = {
|
|
1135
|
+
/** 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. */
|
|
1081
1136
|
pnl_days: number;
|
|
1137
|
+
/** The wallet's sports and esports markets: the rows of the export's markets section, before its 50,000-row cap. */
|
|
1082
1138
|
exported_markets: number;
|
|
1139
|
+
/** Estimated trades in the wallet's sports and esports markets: the summed trade counts of those markets. The file counts its own rows in generation.source_watermarks.trades.rows. */
|
|
1083
1140
|
estimated_trade_rows: number;
|
|
1141
|
+
/** Estimated file size from estimated_trade_rows and exported_markets. */
|
|
1084
1142
|
estimated_size_mb: number;
|
|
1085
1143
|
};
|
|
1086
1144
|
/** `export_job_cancelled` data: the owner's export stopped because its owner cancelled it. */
|
|
@@ -1118,20 +1176,30 @@ export type ExportJobReadyData = {
|
|
|
1118
1176
|
data_as_of: string | null;
|
|
1119
1177
|
};
|
|
1120
1178
|
export type ExportSourceRange = {
|
|
1179
|
+
/** 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. */
|
|
1121
1180
|
first_pnl_date: string | null;
|
|
1181
|
+
/** 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. */
|
|
1122
1182
|
last_pnl_date: string | null;
|
|
1183
|
+
/** 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). */
|
|
1184
|
+
pnl_series_status: "ready" | "pending";
|
|
1185
|
+
/** The latest trade in the wallet's sports and esports markets. Null when it has none. */
|
|
1123
1186
|
latest_trade_at: string | null;
|
|
1187
|
+
/** Same instant as latest_trade_at: the latest activity of the markets the export holds. */
|
|
1124
1188
|
latest_market_activity_at: string | null;
|
|
1125
1189
|
};
|
|
1126
1190
|
export type ExportVolumeReconciliation = {
|
|
1127
|
-
/**
|
|
1191
|
+
/**
|
|
1192
|
+
* 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.
|
|
1193
|
+
* @deprecated
|
|
1194
|
+
*/
|
|
1128
1195
|
provider_lifetime_volume: number | null;
|
|
1129
|
-
/**
|
|
1130
|
-
exported_activity_volume: number;
|
|
1196
|
+
/** 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. */
|
|
1197
|
+
exported_activity_volume: number | null;
|
|
1198
|
+
/** Cost basis in USD summed over the wallet's sports and esports markets, the markets section of the export. */
|
|
1131
1199
|
exported_market_cost_basis: number;
|
|
1132
|
-
/** provider_lifetime_volume
|
|
1200
|
+
/** 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. */
|
|
1133
1201
|
provider_activity_volume_gap: number | null;
|
|
1134
|
-
/**
|
|
1202
|
+
/** Always null, for the same reason as provider_activity_volume_gap. */
|
|
1135
1203
|
activity_volume_coverage: number | null;
|
|
1136
1204
|
};
|
|
1137
1205
|
export type FreshnessFailure = {
|
|
@@ -1305,7 +1373,7 @@ export type GamesCoverage = {
|
|
|
1305
1373
|
};
|
|
1306
1374
|
/** 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. */
|
|
1307
1375
|
export type GameStatus = {
|
|
1308
|
-
/** scheduled: kickoff is ahead or the provider still calls it scheduled. live: the provider reports it in play. paused: halftime or a provider-reported break. ended: the provider reported a final, an award or a forfeit. postponed, cancelled, suspended, delayed: the provider's own verdict, kept distinct. unknown: no provider state reached this read. A kickoff in the past is never read as live on its own. */
|
|
1376
|
+
/** scheduled: kickoff is ahead or the provider still calls it scheduled. live: the provider reports it in play. paused: halftime or a provider-reported break. ended: the provider reported a final, an award or a forfeit. postponed, cancelled, suspended, delayed: the provider's own verdict, kept distinct. 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. */
|
|
1309
1377
|
state: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
1310
1378
|
/** 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. */
|
|
1311
1379
|
match_status?: "scheduled" | "in_progress" | "halftime" | "penalty_shootout" | "delayed" | "suspended" | "final" | "final_overtime" | "final_shootout" | "awarded" | "forfeit" | "not_necessary" | "postponed" | "cancelled" | "unknown";
|
|
@@ -1315,7 +1383,7 @@ export type GameStatus = {
|
|
|
1315
1383
|
period?: string;
|
|
1316
1384
|
/** The game clock as the provider spells it, never reformatted. Omitted when the provider sent none. */
|
|
1317
1385
|
clock?: string;
|
|
1318
|
-
/**
|
|
1386
|
+
/** 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. */
|
|
1319
1387
|
live?: boolean;
|
|
1320
1388
|
/** Whether the game is over. Always present. */
|
|
1321
1389
|
ended: boolean;
|
|
@@ -1346,9 +1414,20 @@ export type LargeExportPolicy = {
|
|
|
1346
1414
|
/** How long a finished export is retained before expiry. */
|
|
1347
1415
|
retention: string;
|
|
1348
1416
|
};
|
|
1349
|
-
direct_streaming:
|
|
1350
|
-
|
|
1351
|
-
|
|
1417
|
+
direct_streaming: {
|
|
1418
|
+
available_when: string;
|
|
1419
|
+
backpressure: string;
|
|
1420
|
+
chunk_size_rows: number;
|
|
1421
|
+
};
|
|
1422
|
+
async_job: {
|
|
1423
|
+
available_when: string;
|
|
1424
|
+
status_values: string[];
|
|
1425
|
+
retention: string;
|
|
1426
|
+
};
|
|
1427
|
+
rate_limit: {
|
|
1428
|
+
daily_cap_per_user: number;
|
|
1429
|
+
per_address_hourly_cap: number;
|
|
1430
|
+
};
|
|
1352
1431
|
};
|
|
1353
1432
|
export type LargePosition = {
|
|
1354
1433
|
/** Composite prefixed ID `pos_<wallet>:<condition_id>:<outcome_index>`. */
|
|
@@ -1406,9 +1485,16 @@ export type LargePosition = {
|
|
|
1406
1485
|
address: string;
|
|
1407
1486
|
username?: string;
|
|
1408
1487
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1488
|
+
/** 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. */
|
|
1409
1489
|
win_rate?: number;
|
|
1410
|
-
/**
|
|
1490
|
+
/**
|
|
1491
|
+
* 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.
|
|
1492
|
+
* @deprecated
|
|
1493
|
+
*/
|
|
1411
1494
|
pnl?: number;
|
|
1495
|
+
/** 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). */
|
|
1496
|
+
in_scope_realized_pnl?: number;
|
|
1497
|
+
/** 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. */
|
|
1412
1498
|
markets_traded?: number;
|
|
1413
1499
|
};
|
|
1414
1500
|
market: {
|
|
@@ -1432,22 +1518,22 @@ export type LargeTrade = {
|
|
|
1432
1518
|
traded_at: string;
|
|
1433
1519
|
size_usd: number;
|
|
1434
1520
|
side: "BUY" | "SELL";
|
|
1435
|
-
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z
|
|
1521
|
+
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z unless its stored outcome_index was verified against the fill's own trade records (before that date the stored index was wrong for a large share of trades; an unverified side is unknown, not defaulted). */
|
|
1436
1522
|
outcome: string | null;
|
|
1437
|
-
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z
|
|
1523
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z whose traded side is not verified (the same rule as outcome). */
|
|
1438
1524
|
token_id: string | null;
|
|
1439
1525
|
price: number;
|
|
1440
1526
|
/** Current trade review score on a 0..1 scale; higher values indicate a stronger review signal. This is the current response value and can differ from the recorded score. Missing measurements remain unavailable. */
|
|
1441
1527
|
review_score: number;
|
|
1442
1528
|
/**
|
|
1443
|
-
* Deprecated alias of review_score with the same current value and 0..1 scale.
|
|
1529
|
+
* Deprecated alias of review_score with the same current value and 0..1 scale. Sunset 2027-02-01 (#29352): removed from V1 on that date; read review_score.
|
|
1444
1530
|
* @deprecated
|
|
1445
1531
|
*/
|
|
1446
1532
|
signal_score: number;
|
|
1447
1533
|
/** 0.0–1.0 review score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. Canonical since #16311; recorded_signal_score carries the same value. */
|
|
1448
1534
|
recorded_review_score: number | null;
|
|
1449
1535
|
/**
|
|
1450
|
-
* 0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire.
|
|
1536
|
+
* 0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed.
|
|
1451
1537
|
* @deprecated
|
|
1452
1538
|
*/
|
|
1453
1539
|
recorded_signal_score: number | null;
|
|
@@ -1462,7 +1548,7 @@ export type LargeTrade = {
|
|
|
1462
1548
|
address: string;
|
|
1463
1549
|
username?: string;
|
|
1464
1550
|
/** The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade. */
|
|
1465
|
-
grade?:
|
|
1551
|
+
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1466
1552
|
/** 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. */
|
|
1467
1553
|
grade_at_trade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1468
1554
|
/** 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. */
|
|
@@ -1524,7 +1610,7 @@ export type LargeTradeInsertedV2Data = {
|
|
|
1524
1610
|
traded_at: string;
|
|
1525
1611
|
platform: "polymarket";
|
|
1526
1612
|
};
|
|
1527
|
-
/** `large_trades_inserted` data (Pro and Max): new large trades were ingested. It carries a count and no trade; subscribe to `large_trade_inserted_v2` for the trade itself. The deprecated spelling `whale_trades_inserted` delivers the same object. */
|
|
1613
|
+
/** `large_trades_inserted` data (Pro and Max): new large trades were ingested. It carries a count and no trade; subscribe to `large_trade_inserted_v2` for the trade itself. The deprecated spelling `whale_trades_inserted` delivers the same object until its sunset on 2027-02-01 (#29352). */
|
|
1528
1614
|
export type LargeTradesInsertedData = {
|
|
1529
1615
|
/** Large trades the producing batch admitted. */
|
|
1530
1616
|
count: number;
|
|
@@ -1544,22 +1630,37 @@ export type LeaderboardEntry = {
|
|
|
1544
1630
|
id: string;
|
|
1545
1631
|
address: string;
|
|
1546
1632
|
username?: string;
|
|
1547
|
-
grade?:
|
|
1633
|
+
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1548
1634
|
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
|
|
1549
1635
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
1550
1636
|
score?: number;
|
|
1551
|
-
/**
|
|
1637
|
+
/**
|
|
1638
|
+
* 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.
|
|
1639
|
+
* @deprecated
|
|
1640
|
+
*/
|
|
1552
1641
|
pnl?: number;
|
|
1553
|
-
/**
|
|
1642
|
+
/**
|
|
1643
|
+
* 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.
|
|
1644
|
+
* @deprecated
|
|
1645
|
+
*/
|
|
1554
1646
|
realized_pnl?: number;
|
|
1555
|
-
/**
|
|
1647
|
+
/**
|
|
1648
|
+
* 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.
|
|
1649
|
+
* @deprecated
|
|
1650
|
+
*/
|
|
1556
1651
|
pnl_correction?: PnlCorrection;
|
|
1557
|
-
/**
|
|
1652
|
+
/**
|
|
1653
|
+
* 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).
|
|
1654
|
+
* @deprecated
|
|
1655
|
+
*/
|
|
1558
1656
|
volume?: number;
|
|
1657
|
+
/** 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. */
|
|
1559
1658
|
markets_traded?: number;
|
|
1560
|
-
/** The wallet's win rate
|
|
1659
|
+
/** 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. */
|
|
1561
1660
|
win_rate?: number;
|
|
1562
|
-
/**
|
|
1661
|
+
/** 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. */
|
|
1662
|
+
in_scope?: TraderPnlInScope;
|
|
1663
|
+
/** 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. */
|
|
1563
1664
|
strategy_type?: string;
|
|
1564
1665
|
/** Provider platform. Always polymarket. */
|
|
1565
1666
|
platform: "polymarket";
|
|
@@ -1632,8 +1733,12 @@ export type MarketFlow = {
|
|
|
1632
1733
|
direction: "YES" | "NO";
|
|
1633
1734
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1634
1735
|
token_id: string | null;
|
|
1635
|
-
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
1736
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1636
1737
|
large_trade_count: number;
|
|
1738
|
+
/**
|
|
1739
|
+
* Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
|
|
1740
|
+
* @deprecated
|
|
1741
|
+
*/
|
|
1637
1742
|
whale_trade_count: number;
|
|
1638
1743
|
buy_volume_usd: number;
|
|
1639
1744
|
sell_volume_usd: number;
|
|
@@ -1641,7 +1746,7 @@ export type MarketFlow = {
|
|
|
1641
1746
|
id: string;
|
|
1642
1747
|
address: string;
|
|
1643
1748
|
username: string | null;
|
|
1644
|
-
grade:
|
|
1749
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1645
1750
|
side: "YES" | "NO";
|
|
1646
1751
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1647
1752
|
token_id: string | null;
|
|
@@ -1651,7 +1756,7 @@ export type MarketFlow = {
|
|
|
1651
1756
|
oldest_snapshot_as_of: string | null;
|
|
1652
1757
|
};
|
|
1653
1758
|
/**
|
|
1654
|
-
* Deprecated alias of sharp_money; byte-identical
|
|
1759
|
+
* Deprecated alias of sharp_money; byte-identical. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money.
|
|
1655
1760
|
* @deprecated
|
|
1656
1761
|
*/
|
|
1657
1762
|
smart_money: {
|
|
@@ -1659,8 +1764,12 @@ export type MarketFlow = {
|
|
|
1659
1764
|
direction: "YES" | "NO";
|
|
1660
1765
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1661
1766
|
token_id: string | null;
|
|
1662
|
-
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
1767
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
1663
1768
|
large_trade_count: number;
|
|
1769
|
+
/**
|
|
1770
|
+
* Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
|
|
1771
|
+
* @deprecated
|
|
1772
|
+
*/
|
|
1664
1773
|
whale_trade_count: number;
|
|
1665
1774
|
buy_volume_usd: number;
|
|
1666
1775
|
sell_volume_usd: number;
|
|
@@ -1668,7 +1777,7 @@ export type MarketFlow = {
|
|
|
1668
1777
|
id: string;
|
|
1669
1778
|
address: string;
|
|
1670
1779
|
username: string | null;
|
|
1671
|
-
grade:
|
|
1780
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
1672
1781
|
side: "YES" | "NO";
|
|
1673
1782
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1674
1783
|
token_id: string | null;
|
|
@@ -1702,21 +1811,23 @@ export type MarketHolder = {
|
|
|
1702
1811
|
other_outcome_shares?: number;
|
|
1703
1812
|
/** The wallet's last recorded trade anywhere, null when unknown. */
|
|
1704
1813
|
last_traded_at: string | null;
|
|
1705
|
-
/** This wallet's win rate in the market's canonical category (`market.category`): the share of its
|
|
1814
|
+
/** 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. */
|
|
1706
1815
|
category_win_rate?: number;
|
|
1707
|
-
/** The two counts `category_win_rate` is the ratio of, from the same row: `wins / decided` equals the rate. Every
|
|
1816
|
+
/** 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`. */
|
|
1708
1817
|
category_win_record?: {
|
|
1709
|
-
/**
|
|
1818
|
+
/** Settled markets in the category that this wallet closed with a profit. */
|
|
1710
1819
|
wins: number;
|
|
1711
|
-
/**
|
|
1820
|
+
/** 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. */
|
|
1712
1821
|
decided: number;
|
|
1713
1822
|
};
|
|
1714
|
-
/**
|
|
1823
|
+
/** 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. */
|
|
1824
|
+
category_avg_price?: number;
|
|
1825
|
+
/** 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. */
|
|
1715
1826
|
category_win_rate_game?: string;
|
|
1716
1827
|
/** 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. */
|
|
1717
1828
|
category_win_rate_status: "measured" | "not_enough_data" | "unavailable";
|
|
1718
1829
|
category_evidence?: HolderCategoryEvidence;
|
|
1719
|
-
/**
|
|
1830
|
+
/** 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. */
|
|
1720
1831
|
wallet_age_days?: number | null;
|
|
1721
1832
|
/** True when the wallet's first trade was under 30 days ago. */
|
|
1722
1833
|
is_new_wallet?: boolean;
|
|
@@ -1802,12 +1913,12 @@ export type MarketSnapshot = {
|
|
|
1802
1913
|
/** Polymarket series slug from the canonical identity row, null when unavailable. A sports series identifies a league and must not be used as a per-matchup grouping key. */
|
|
1803
1914
|
series_slug: string | null;
|
|
1804
1915
|
/**
|
|
1805
|
-
* Always null. Deprecated (#24169): 0xinsider has never stored a value for this field. The key stays on the wire
|
|
1916
|
+
* Always null. Deprecated (#24169): 0xinsider has never stored a value for this field. The key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed; do not read it.
|
|
1806
1917
|
* @deprecated
|
|
1807
1918
|
*/
|
|
1808
1919
|
market_type: string | null;
|
|
1809
1920
|
/**
|
|
1810
|
-
* Always null. Deprecated (#24169): 0xinsider stores no value for this field on a Polymarket market. The key stays on the wire
|
|
1921
|
+
* Always null. Deprecated (#24169): 0xinsider stores no value for this field on a Polymarket market. The key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed; do not read it. market.status and market.resolved_at say whether the market has closed or resolved.
|
|
1811
1922
|
* @deprecated
|
|
1812
1923
|
*/
|
|
1813
1924
|
market_result: string | null;
|
|
@@ -1880,7 +1991,8 @@ export type MarketSnapshotTrust = {
|
|
|
1880
1991
|
};
|
|
1881
1992
|
export type McpJsonRpcError = {
|
|
1882
1993
|
jsonrpc: "2.0";
|
|
1883
|
-
id
|
|
1994
|
+
/** The request's id, or null when the request could not be parsed. Omitted on the answer to an unsolicited response message. */
|
|
1995
|
+
id?: string | number | null;
|
|
1884
1996
|
error: {
|
|
1885
1997
|
code: number;
|
|
1886
1998
|
message: string;
|
|
@@ -1909,20 +2021,22 @@ export type PickHolder = {
|
|
|
1909
2021
|
shares: number;
|
|
1910
2022
|
/** 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. */
|
|
1911
2023
|
entry_value_usd?: number;
|
|
1912
|
-
/** 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
|
|
2024
|
+
/** 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. */
|
|
1913
2025
|
category_win_rate?: number;
|
|
1914
|
-
/** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every
|
|
2026
|
+
/** 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. */
|
|
1915
2027
|
category_win_record?: {
|
|
1916
|
-
/**
|
|
2028
|
+
/** Settled markets in the category that this wallet closed with a profit. */
|
|
1917
2029
|
wins: number;
|
|
1918
|
-
/**
|
|
2030
|
+
/** 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. */
|
|
1919
2031
|
decided: number;
|
|
1920
2032
|
};
|
|
1921
|
-
/**
|
|
2033
|
+
/** 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. */
|
|
2034
|
+
category_avg_price?: number;
|
|
2035
|
+
/** 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. */
|
|
1922
2036
|
category_win_rate_game?: string;
|
|
1923
|
-
/** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the
|
|
2037
|
+
/** 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). Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample. */
|
|
1924
2038
|
category_win_rate_status?: "measured" | "not_enough_data" | "unavailable";
|
|
1925
|
-
/**
|
|
2039
|
+
/** 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. */
|
|
1926
2040
|
wallet_age_days?: number | null;
|
|
1927
2041
|
/** 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. */
|
|
1928
2042
|
is_new_wallet?: boolean;
|
|
@@ -2068,9 +2182,9 @@ export type PickOfTheDay = {
|
|
|
2068
2182
|
grade: string | null;
|
|
2069
2183
|
/** 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. */
|
|
2070
2184
|
canonical_category: string;
|
|
2071
|
-
/** Share of the trader’s
|
|
2185
|
+
/** 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. */
|
|
2072
2186
|
win_rate: number | null;
|
|
2073
|
-
/** Number of
|
|
2187
|
+
/** Number of settled markets behind win_rate; null when not measured. */
|
|
2074
2188
|
n_resolved: number | null;
|
|
2075
2189
|
/** Recorded Polymarket position value on the backed outcome, in USD. It can change after this snapshot. */
|
|
2076
2190
|
position_usd: number;
|
|
@@ -2144,11 +2258,11 @@ export type PickOfTheDayArchiveDay = {
|
|
|
2144
2258
|
wins: number;
|
|
2145
2259
|
/** Picks on the day that resolved as a loss, counted by the same pass as hit_rate.losses. */
|
|
2146
2260
|
losses: number;
|
|
2147
|
-
/** Picks on the day that resolved void
|
|
2261
|
+
/** Picks on the day that resolved void: the market settled with no winner, or the game was suspended or postponed and not completed within 72 hours of kickoff. A void is neither a win nor a loss and is not staked, so it enters no money figure. */
|
|
2148
2262
|
void: number;
|
|
2149
2263
|
/** Picks on the day not yet resolved. A day whose picks are all pending is a real 0-0 day with pending > 0, not a missing record. */
|
|
2150
2264
|
pending: number;
|
|
2151
|
-
/** Net units over the day's visible, valued,
|
|
2265
|
+
/** Net units over the day's visible, valued, staked (win or loss) picks: the same population staked_usd runs over. Omitted when the day has not scored -- every pick still pending or void, or a price-gated current row -- which is not the same as a real 0.0 day. */
|
|
2152
2266
|
unit_score?: number;
|
|
2153
2267
|
/** unit_score pre-formatted as signed units to two decimals (for example +1.24u or -2.00u), by the same formatter the per-pick unit_score_display and hit_rate.unit_score_display use. Present exactly when unit_score is; unit_score is the source value. */
|
|
2154
2268
|
unit_score_display?: string;
|
|
@@ -2185,13 +2299,13 @@ export type PickOfTheDayArchiveEntry = {
|
|
|
2185
2299
|
resolved_at?: string;
|
|
2186
2300
|
/** The flat stake this row was valued at, in USD: 1000 since 2026-09-22 (100 before). Every row of the record is valued at the current stake, including picks published before the change. Present exactly when return_usd is. */
|
|
2187
2301
|
stake_usd?: number;
|
|
2188
|
-
/** Gross return of stake_usd on this resolved pick: a win returns stake_usd / backed_price
|
|
2302
|
+
/** Gross return of stake_usd on this resolved pick: a win returns stake_usd / backed_price and a loss returns 0. A loss always returns 0 (the whole stake is lost regardless of price). The operand is published beside it as backed_price on every row that carries a return, so the entry never has to be recovered by inverting this number. Omitted (not null) for a still-pending pick, for a void (the market settled with no winner, or the game was suspended or postponed and not completed within 72 hours of kickoff, so the pick is not staked) and for a resolved WIN with no frozen price (a win's payout needs the price); mirrors the backend skip-when-absent behavior and the route-client optional (non-nullable) schema. */
|
|
2189
2303
|
return_usd?: number;
|
|
2190
|
-
/** The same return on a literal $100 (a win returns 100 / backed_price, a loss 0
|
|
2304
|
+
/** The same return on a literal $100 (a win returns 100 / backed_price, a loss 0), kept for compatibility: the field predates stake_usd and its name promises the $100 basis. Present exactly when return_usd is. */
|
|
2191
2305
|
return_per_100?: number;
|
|
2192
|
-
/** Pre-formatted return_usd as USD with cents: "$2,000.00". Present exactly when return_usd is -- it is formatted from that already-gated value -- so it is omitted for a still-pending pick, an unpriced win, and any pick whose backed side is withheld. Convenience only; return_usd is the source value. */
|
|
2306
|
+
/** Pre-formatted return_usd as USD with cents: "$2,000.00". Present exactly when return_usd is -- it is formatted from that already-gated value -- so it is omitted for a still-pending pick, a void, an unpriced win, and any pick whose backed side is withheld. Convenience only; return_usd is the source value. */
|
|
2193
2307
|
payout_display?: string;
|
|
2194
|
-
/** Frozen price of the backed side (0..1) that return_usd and return_per_100 were computed from: on a win, stake_usd / backed_price equals return_usd. It is the Polymarket CLOB order book midpoint at release, frozen write-once at publication, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price. Present exactly when return_usd is, so it is omitted for a still-pending pick, an unpriced win, and any pick whose backed side is withheld. */
|
|
2308
|
+
/** Frozen price of the backed side (0..1) that return_usd and return_per_100 were computed from: on a win, stake_usd / backed_price equals return_usd. It is the Polymarket CLOB order book midpoint at release, frozen write-once at publication, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price. Present exactly when return_usd is, and on a void, which carries no return: so it is omitted for a still-pending pick, an unpriced win, and any pick whose backed side is withheld. */
|
|
2195
2309
|
backed_price?: number;
|
|
2196
2310
|
/** Closing-line value toward the backed side, computed as (close / entry - 1) * 100. Omitted when the row is gated, ineligible, or not measured. */
|
|
2197
2311
|
clv_pct?: number;
|
|
@@ -2285,9 +2399,9 @@ export type PickOfTheDayHitRate = {
|
|
|
2285
2399
|
pending: number;
|
|
2286
2400
|
/** The flat stake every money figure here assumes, in USD: 1000 since 2026-09-22 (100 before). Always present. */
|
|
2287
2401
|
stake_usd: number;
|
|
2288
|
-
/** Cumulative profit (USD) of a stake_usd-per-pick strategy over visible valued
|
|
2402
|
+
/** Cumulative profit (USD) of a stake_usd-per-pick strategy over visible valued settled picks: a priced win pays stake_usd/backed_price - stake_usd, every visible loss pays -stake_usd independent of price. A void is not staked and adds nothing. An unpriced visible win and a current non-Insider row whose price is gated remain in wins/losses but are excluded from price-derived totals. */
|
|
2289
2403
|
net_profit_usd: number;
|
|
2290
|
-
/** Total staked (USD) = stake_usd * count of visible valued
|
|
2404
|
+
/** Total staked (USD) = stake_usd * count of visible valued settled picks: every visible loss and every priced win. Voids, unpriced wins and current non-Insider rows whose price is gated are excluded. */
|
|
2291
2405
|
staked_usd: number;
|
|
2292
2406
|
/** Return on the staked amount as a percentage (net_profit_usd / staked_usd * 100, to 1 decimal); 0 when nothing is staked. */
|
|
2293
2407
|
roi_pct: number;
|
|
@@ -2335,7 +2449,7 @@ export type PickOfTheDayHitRate = {
|
|
|
2335
2449
|
clv_beats_close: number;
|
|
2336
2450
|
/** Measured public rows where close exactly equals entry. */
|
|
2337
2451
|
clv_ties: number;
|
|
2338
|
-
/** Cumulative track-record series, one point per decided (win/loss) pick in ascending pick_date order (
|
|
2452
|
+
/** Cumulative track-record series, one point per decided (win/loss) pick in ascending pick_date order (pending and void picks add no point). A non-valued decided row carries cumulative profit forward while advancing hit rate. The last point's net_profit_usd and hit_rate_pct equal the headline net_profit_usd and pct by construction. Empty when nothing is decided. */
|
|
2339
2453
|
series: {
|
|
2340
2454
|
/** The decided pick's publish date (YYYY-MM-DD). */
|
|
2341
2455
|
date: string;
|
|
@@ -2385,11 +2499,13 @@ export type PickOfTheDayLedgerOpenedEntry = {
|
|
|
2385
2499
|
payload: PickOfTheDayCommitmentPayload;
|
|
2386
2500
|
/** How the pick settled. Never pending: a pending pick is a sealed entry. */
|
|
2387
2501
|
outcome: "win" | "loss" | "void";
|
|
2502
|
+
/** Why the site withdrew this pick from its track record, or null when the pick counts. provider_game_cancelled: Polymarket marked the game Cancelled while the pick was pending. published_after_kickoff: the pick was published at or after its game started, including a suspended match that resumed later, so it was never a pre-game pick; this can be set after the pick settled. A withdrawn pick keeps its commitment and its real outcome here, but the site's record leaves it out of every count and money figure. Not part of the hashed payload, so it never moves commitment_hash. */
|
|
2503
|
+
withdrawal_reason: "provider_game_cancelled" | "published_after_kickoff" | null;
|
|
2388
2504
|
/** Frozen matchup, for a reader. */
|
|
2389
2505
|
matchup: string;
|
|
2390
2506
|
/** Frozen canonical sport bucket (for example Basketball or MMA), not the exact public league identity; the archive owns that. */
|
|
2391
2507
|
category: string;
|
|
2392
|
-
/** The pick's public page. */
|
|
2508
|
+
/** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
|
|
2393
2509
|
permalink: string;
|
|
2394
2510
|
/** Stable pick row identity as decimal text. Never use a quality rank as identity. */
|
|
2395
2511
|
pick_id: string;
|
|
@@ -2421,7 +2537,7 @@ export type PickOfTheDayLedgerSealedEntry = {
|
|
|
2421
2537
|
commitment_algo: "sha256(canonical_json(payload)||nonce)";
|
|
2422
2538
|
/** When the hash was frozen. Always strictly before kickoff: a pick that reaches kickoff unsealed stays unsealed forever, because a seal written after the game started would be a backdated proof. */
|
|
2423
2539
|
sealed_at: string;
|
|
2424
|
-
/** The pick's public page. */
|
|
2540
|
+
/** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
|
|
2425
2541
|
permalink: string;
|
|
2426
2542
|
/** Stable pick row identity as decimal text. Never use a quality rank as identity. */
|
|
2427
2543
|
pick_id: string;
|
|
@@ -2451,6 +2567,8 @@ export type PickOfTheDayLedgerUncommittedEntry = {
|
|
|
2451
2567
|
pre_commitment: true;
|
|
2452
2568
|
/** How the pick settled, or pending. */
|
|
2453
2569
|
outcome: "pending" | "win" | "loss" | "void";
|
|
2570
|
+
/** Omitted while the pick is pending; once it settles, why the site withdrew it from its track record, or null when the pick counts. provider_game_cancelled: Polymarket marked the game Cancelled while the pick was pending. published_after_kickoff: the pick was published at or after its game started, including a suspended match that resumed later, so it was never a pre-game pick; this can be set after the pick settled. A withdrawn pick stays here with its real outcome, but the site's record leaves it out of every count and money figure. */
|
|
2571
|
+
withdrawal_reason?: "provider_game_cancelled" | "published_after_kickoff" | null;
|
|
2454
2572
|
/** Frozen matchup, for a reader. */
|
|
2455
2573
|
matchup?: string;
|
|
2456
2574
|
/** Frozen canonical sport bucket (for example Basketball or MMA), not the exact public league identity; the archive owns that. */
|
|
@@ -2459,7 +2577,7 @@ export type PickOfTheDayLedgerUncommittedEntry = {
|
|
|
2459
2577
|
resolved_at: string | null;
|
|
2460
2578
|
/** The pick's market, side and price once it has settled; null while it is pending, and null for a settled pick whose stored row lacks one of these columns. Not hashed: nothing was committed over these values, which is what pre_commitment: true says. */
|
|
2461
2579
|
payload: PickOfTheDayUncommittedPayload | null;
|
|
2462
|
-
/** The pick's public page. */
|
|
2580
|
+
/** The pick's stable public page, `https://0xinsider.com/pick-of-the-day/picks/{pick_id}`. */
|
|
2463
2581
|
permalink: string;
|
|
2464
2582
|
/** Stable pick row identity as decimal text. Never use a quality rank as identity. */
|
|
2465
2583
|
pick_id: string;
|
|
@@ -2492,13 +2610,11 @@ export type PickOfTheDayNoEntitledPicks = {
|
|
|
2492
2610
|
message: string;
|
|
2493
2611
|
/** 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. */
|
|
2494
2612
|
scheduled_picks?: ScheduledPickSlot[];
|
|
2495
|
-
/** 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. */
|
|
2496
|
-
proof_pending_picks?: ProofPendingPickSlot[];
|
|
2497
2613
|
/**
|
|
2498
|
-
* Deprecated (#24157): always null
|
|
2614
|
+
* 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.
|
|
2499
2615
|
* @deprecated
|
|
2500
2616
|
*/
|
|
2501
|
-
supersedes_pick_id: null;
|
|
2617
|
+
supersedes_pick_id: string | null;
|
|
2502
2618
|
};
|
|
2503
2619
|
/** 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. */
|
|
2504
2620
|
export type PickOfTheDayUncommittedPayload = {
|
|
@@ -2519,18 +2635,18 @@ export type PickOfTheDayUncommittedPayload = {
|
|
|
2519
2635
|
/** Provider platform. Always polymarket. */
|
|
2520
2636
|
platform: "polymarket";
|
|
2521
2637
|
};
|
|
2522
|
-
/** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score.
|
|
2638
|
+
/** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Each team `logo` is a registered club crest or national flag as a same-origin path where one exists, and provider artwork otherwise. */
|
|
2523
2639
|
export type PickSportsContext = {
|
|
2524
2640
|
/** League or competition display name (e.g. "Premier League"). */
|
|
2525
2641
|
league_name: string | null;
|
|
2526
|
-
/** Provider-owned event taxonomy from Gamma eventMetadata, joined in league · serie · tournament order with blanks and case-insensitive duplicates removed. Separate from league_name; omitted when the provider does not supply the metadata. */
|
|
2642
|
+
/** Provider-owned event taxonomy from Gamma eventMetadata, joined in league · serie · tournament order with blanks and case-insensitive duplicates removed. A tennis qualifying match ends in ", Qualification", including an ATP Challenger qualifying match, which Gamma marks only in eventMetadata.tennisFixtureSource. Separate from league_name; omitted when the provider does not supply the metadata. */
|
|
2527
2643
|
competition_label?: string;
|
|
2528
2644
|
/** League logo URL (provider-owned). */
|
|
2529
2645
|
league_logo: string | null;
|
|
2530
2646
|
/** The team mapped to the market's YES outcome, or the parent-event home/first team when event_matchup is true. */
|
|
2531
|
-
yes_team: PickSportsTeam;
|
|
2647
|
+
yes_team: PickSportsTeam | null;
|
|
2532
2648
|
/** The team mapped to the market's NO outcome, or the parent-event away/second team when event_matchup is true. */
|
|
2533
|
-
no_team: PickSportsTeam;
|
|
2649
|
+
no_team: PickSportsTeam | null;
|
|
2534
2650
|
/** Provider game identifier (Polymarket Gamma gameId); omitted when the provider supplies none. */
|
|
2535
2651
|
game_id?: number;
|
|
2536
2652
|
/** Always present. True when the two teams are the parent-event match identity for a teamless binary leg (e.g. a draw, totals, or prop market), not the market's own outcomes. */
|
|
@@ -2546,11 +2662,11 @@ export type PickSportsTeam = {
|
|
|
2546
2662
|
label: string | null;
|
|
2547
2663
|
/** Abbreviated team label (e.g. "POR"). */
|
|
2548
2664
|
short_label: string | null;
|
|
2549
|
-
/**
|
|
2665
|
+
/** 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. */
|
|
2550
2666
|
full_name: string | null;
|
|
2551
2667
|
/** Provider team identifier (Polymarket /teams id). */
|
|
2552
2668
|
provider_id: number | null;
|
|
2553
|
-
/** Team crest or flag URL. Official NFL (32), WNBA (15), NBA (30), NHL (32), and MLB (30) club crests use same-origin relative paths (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>`); resolve relative URLs against the API origin. Vendored soccer club crests use the same path with `.png`. Other teams use provider artwork, including country flags for
|
|
2669
|
+
/** Team crest or flag URL. Official NFL (32), WNBA (15), NBA (30), NHL (32), and MLB (30) club crests use same-origin relative paths (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>`); resolve relative URLs against the API origin. Vendored soccer club crests use the same path with `.png`. National teams in the registered national-team competitions use the same path with `.svg`: the official national flag, drawn whole at its own aspect. Other teams use provider artwork, including country flags for tennis players. Novelty rows, and national-team rows that are not exactly one country, retain provider artwork. */
|
|
2554
2670
|
logo: string | null;
|
|
2555
2671
|
/** True when artwork measurements show that the team mark needs a light plate on a dark background. Vendored crest verdicts are tied to the exact asset bytes; provider artwork is measured by the teams sync. Always sent; false when no current measurement marks the logo dark. */
|
|
2556
2672
|
logo_mark_dark: boolean;
|
|
@@ -2573,16 +2689,28 @@ export type PickSportsTeam = {
|
|
|
2573
2689
|
headshot_revision?: number;
|
|
2574
2690
|
/** 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. */
|
|
2575
2691
|
ranking?: TennisRanking;
|
|
2692
|
+
/** 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. */
|
|
2693
|
+
logo_mark_light: boolean;
|
|
2694
|
+
/** 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. */
|
|
2695
|
+
logo_mark_measured: boolean;
|
|
2576
2696
|
};
|
|
2577
2697
|
export type PlatformCapabilities = {
|
|
2578
2698
|
grade: PlatformCapabilityStatus;
|
|
2579
2699
|
pnl: PlatformCapabilityStatus;
|
|
2580
2700
|
strategy: PlatformCapabilityStatus;
|
|
2581
2701
|
timeline: PlatformCapabilityStatus;
|
|
2582
|
-
/** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
2702
|
+
/** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2583
2703
|
large_trades: PlatformCapabilityStatus;
|
|
2704
|
+
/**
|
|
2705
|
+
* Deprecated spelling of large_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trades.
|
|
2706
|
+
* @deprecated
|
|
2707
|
+
*/
|
|
2584
2708
|
whale_signal: PlatformCapabilityStatus;
|
|
2585
2709
|
suspicious_trades: PlatformCapabilityStatus;
|
|
2710
|
+
/**
|
|
2711
|
+
* Deprecated spelling of suspicious_trades, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read suspicious_trades.
|
|
2712
|
+
* @deprecated
|
|
2713
|
+
*/
|
|
2586
2714
|
insider_radar: PlatformCapabilityStatus;
|
|
2587
2715
|
market_snapshot: PlatformCapabilityStatus;
|
|
2588
2716
|
};
|
|
@@ -2593,15 +2721,15 @@ export type Platforms = {
|
|
|
2593
2721
|
polymarket: PlatformCapabilities;
|
|
2594
2722
|
};
|
|
2595
2723
|
};
|
|
2596
|
-
/** A derived 0xinsider correction to Polymarket's P&L, never a Polymarket value. Polymarket misbooks neg-risk conversions, in both directions: it puts cost on placeholder YES outcomes minted by a conversion and never books it as a loss (negative amount), and its position records leave out shares the wallet really got, such as YES minted by a conversion, so it books no P&L on them (positive amount). Per neg-risk market the wallet converted in, 0xinsider measures Polymarket's own activity cash against the sum of its position P&L, and sums the difference over every measured market whose shares did not move by direct transfer: transferred shares have no activity row, so such a market keeps Polymarket's figure and is counted in markets_excluded. It is published once every neg-risk market the wallet converted in is measured and checked for transfers, and stays as last published until then (on the trader body, pnl.correction_pending says so); a sum under $1 either way publishes nothing. The body's own P&L fields keep Polymarket's figures; this object adds the amount and the corrected figures. Money is truncated toward zero to cents. */
|
|
2724
|
+
/** A derived 0xinsider correction to Polymarket's P&L, never a Polymarket value. Polymarket misbooks neg-risk conversions, in both directions: it puts cost on placeholder YES outcomes minted by a conversion and never books it as a loss (negative amount), and its position records leave out shares the wallet really got, such as YES minted by a conversion, so it books no P&L on them (positive amount). Per neg-risk market the wallet converted in, 0xinsider measures Polymarket's own activity cash against the sum of its position P&L, and sums the difference over every measured market whose shares did not move by direct transfer: transferred shares have no activity row, so such a market keeps Polymarket's figure and is counted in markets_excluded. It is published once every neg-risk market with a sports or esports event that the wallet converted in is measured and checked for transfers, and stays as last published until then; a market with no sports or esports event is not measured, and counts only when it was measured before (on the trader body, pnl.correction_pending says so); a sum under $1 either way publishes nothing. The body's own P&L fields keep Polymarket's figures; this object adds the amount and the corrected figures. Money is truncated toward zero to cents. */
|
|
2597
2725
|
export type PnlCorrection = {
|
|
2598
2726
|
/** The correction method. */
|
|
2599
2727
|
basis: "neg_risk_conversion_v1";
|
|
2600
2728
|
/** The correction in USD. Negative when Polymarket overstates the wallet. */
|
|
2601
2729
|
amount: number;
|
|
2602
|
-
/** Polymarket's net realized P&L plus amount
|
|
2730
|
+
/** 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. */
|
|
2603
2731
|
realized?: number;
|
|
2604
|
-
/** Polymarket's net total P&L
|
|
2732
|
+
/** 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. */
|
|
2605
2733
|
net_total?: number;
|
|
2606
2734
|
/** The newest measurement among the measured markets. */
|
|
2607
2735
|
as_of: string;
|
|
@@ -2644,10 +2772,16 @@ export type Position = {
|
|
|
2644
2772
|
address: string;
|
|
2645
2773
|
username?: string;
|
|
2646
2774
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2647
|
-
/**
|
|
2775
|
+
/** 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. */
|
|
2648
2776
|
win_rate?: number;
|
|
2649
|
-
/**
|
|
2777
|
+
/**
|
|
2778
|
+
* 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.
|
|
2779
|
+
* @deprecated
|
|
2780
|
+
*/
|
|
2650
2781
|
pnl?: number;
|
|
2782
|
+
/** 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). */
|
|
2783
|
+
in_scope_realized_pnl?: number;
|
|
2784
|
+
/** 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. */
|
|
2651
2785
|
markets?: number;
|
|
2652
2786
|
/** 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. */
|
|
2653
2787
|
wallet_age_days?: number;
|
|
@@ -2751,15 +2885,15 @@ export type ProofPendingPickSlot = {
|
|
|
2751
2885
|
supersedes_pick_id: string | null;
|
|
2752
2886
|
};
|
|
2753
2887
|
export type ReportPayload = {
|
|
2754
|
-
/** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
2888
|
+
/** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2755
2889
|
total_large_trades: number | null;
|
|
2756
2890
|
total_whale_trades: number | null;
|
|
2757
|
-
/** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value. */
|
|
2891
|
+
/** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2758
2892
|
total_large_trade_volume: number | null;
|
|
2759
2893
|
total_whale_volume: number | null;
|
|
2760
2894
|
biggest_trade_size: number | null;
|
|
2761
2895
|
active_traders: number | null;
|
|
2762
|
-
/** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
2896
|
+
/** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2763
2897
|
top_large_trades: ({
|
|
2764
2898
|
/** Provider outcome label for the traded side. */
|
|
2765
2899
|
outcome: string | null;
|
|
@@ -2786,7 +2920,7 @@ export type ReportPayload = {
|
|
|
2786
2920
|
/** Trader pseudonym, when no display name is known. */
|
|
2787
2921
|
pseudonym: string | null;
|
|
2788
2922
|
/** Trader grade (S-F) at snapshot time. */
|
|
2789
|
-
trader_grade:
|
|
2923
|
+
trader_grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2790
2924
|
})[] | null;
|
|
2791
2925
|
top_whale_trades: ({
|
|
2792
2926
|
/** Provider outcome label for the traded side. */
|
|
@@ -2814,11 +2948,21 @@ export type ReportPayload = {
|
|
|
2814
2948
|
/** Trader pseudonym, when no display name is known. */
|
|
2815
2949
|
pseudonym: string | null;
|
|
2816
2950
|
/** Trader grade (S-F) at snapshot time. */
|
|
2817
|
-
trader_grade:
|
|
2951
|
+
trader_grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2952
|
+
})[] | null;
|
|
2953
|
+
categories: ({
|
|
2954
|
+
category: string | null;
|
|
2955
|
+
large_trade_count: number | null;
|
|
2956
|
+
whale_trade_count: number | null;
|
|
2957
|
+
category_volume: number | null;
|
|
2818
2958
|
})[] | null;
|
|
2819
|
-
categories: Record<string, unknown>[] | null;
|
|
2820
2959
|
/** 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. */
|
|
2821
|
-
grade_distribution:
|
|
2960
|
+
grade_distribution: ({
|
|
2961
|
+
grade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
2962
|
+
count: number | null;
|
|
2963
|
+
})[] | null;
|
|
2964
|
+
/** 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. */
|
|
2965
|
+
market_scope: "all_markets" | "sports_and_esports";
|
|
2822
2966
|
};
|
|
2823
2967
|
export type ReportReconciliation = {
|
|
2824
2968
|
volume_kind: "local_whale_activity_volume";
|
|
@@ -2878,14 +3022,14 @@ export type ResponseMeta = {
|
|
|
2878
3022
|
/** Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only. */
|
|
2879
3023
|
category_skill_enriched_base_payload_hash?: string;
|
|
2880
3024
|
};
|
|
2881
|
-
/** An entitled same-day
|
|
3025
|
+
/** An entitled same-day slot with a future scheduled release: stable identity and backend-owned release/kickoff instants. It leaves this list at its release instant; an unpublished slot is never a delayed recommendation. No matchup, category, platform, side, price, or holder fields appear before release. Unauthorized scheduled ranks appear only in locked_picks. */
|
|
2882
3026
|
export type ScheduledPickSlot = {
|
|
2883
3027
|
/**
|
|
2884
3028
|
* Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.
|
|
2885
3029
|
* @deprecated
|
|
2886
3030
|
*/
|
|
2887
3031
|
pick_rank: number;
|
|
2888
|
-
/** The slot's
|
|
3032
|
+
/** The slot's future release instant. Remove this preview at that instant and read again for published picks; a scheduled slot does not guarantee publication. */
|
|
2889
3033
|
release_at: string;
|
|
2890
3034
|
/** The backed game's current kickoff instant. */
|
|
2891
3035
|
kickoff: string;
|
|
@@ -2910,7 +3054,7 @@ export type ScoreCell = {
|
|
|
2910
3054
|
};
|
|
2911
3055
|
/** Shape the provider score string was parsed into. `two_side` is one aggregate per side (basketball `105-98`), `multi_set` is per-set columns (tennis `6-7(5-7), 6-0, 1-0`), `esports_series` is a maps/sets/format triplet (`000-000|2-0|Bo3`). Omitted when the score could not be parsed. */
|
|
2912
3056
|
export type ScoreFormat = "two_side" | "multi_set" | "esports_series";
|
|
2913
|
-
/** `sharp_money_flow_detected` data (Pro and Max): ranked-trader net flow on a market crossed the threshold. The deprecated spelling `smart_money_flow_detected` delivers the same object. */
|
|
3057
|
+
/** `sharp_money_flow_detected` data (Pro and Max): ranked-trader net flow on a market crossed the threshold. The deprecated spelling `smart_money_flow_detected` delivers the same object until its sunset on 2027-02-01 (#29352). */
|
|
2914
3058
|
export type SharpMoneyFlowDetectedData = {
|
|
2915
3059
|
/** Polymarket condition id of the market. */
|
|
2916
3060
|
condition_id: string;
|
|
@@ -2943,14 +3087,18 @@ export type SmartMoneyFlowMarket = {
|
|
|
2943
3087
|
direction: "YES" | "NO";
|
|
2944
3088
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
2945
3089
|
token_id: string | null;
|
|
2946
|
-
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
3090
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2947
3091
|
large_trade_count: number;
|
|
3092
|
+
/**
|
|
3093
|
+
* Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
|
|
3094
|
+
* @deprecated
|
|
3095
|
+
*/
|
|
2948
3096
|
whale_trade_count: number;
|
|
2949
3097
|
buy_volume_usd: number;
|
|
2950
3098
|
sell_volume_usd: number;
|
|
2951
3099
|
};
|
|
2952
3100
|
/**
|
|
2953
|
-
* Deprecated alias of sharp_money; byte-identical
|
|
3101
|
+
* Deprecated alias of sharp_money; byte-identical. Sunset 2027-02-01 (#29352): removed from V1 on that date; read sharp_money.
|
|
2954
3102
|
* @deprecated
|
|
2955
3103
|
*/
|
|
2956
3104
|
smart_money: {
|
|
@@ -2958,8 +3106,12 @@ export type SmartMoneyFlowMarket = {
|
|
|
2958
3106
|
direction: "YES" | "NO";
|
|
2959
3107
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
2960
3108
|
token_id: string | null;
|
|
2961
|
-
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
3109
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2962
3110
|
large_trade_count: number;
|
|
3111
|
+
/**
|
|
3112
|
+
* Deprecated spelling of large_trade_count, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read large_trade_count.
|
|
3113
|
+
* @deprecated
|
|
3114
|
+
*/
|
|
2963
3115
|
whale_trade_count: number;
|
|
2964
3116
|
buy_volume_usd: number;
|
|
2965
3117
|
sell_volume_usd: number;
|
|
@@ -2971,8 +3123,12 @@ export type SnapshotCompleteness = {
|
|
|
2971
3123
|
status: "complete" | "partial" | "empty";
|
|
2972
3124
|
reason: string;
|
|
2973
3125
|
expected_days: number;
|
|
2974
|
-
/** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value. */
|
|
3126
|
+
/** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value until its sunset on 2027-02-01 (#29352). */
|
|
2975
3127
|
covered_days_with_large_trade_activity: number;
|
|
3128
|
+
/**
|
|
3129
|
+
* Deprecated spelling of covered_days_with_large_trade_activity, emitted beside it with the same value. Sunset 2027-02-01 (#29352): removed from V1 on that date; read covered_days_with_large_trade_activity.
|
|
3130
|
+
* @deprecated
|
|
3131
|
+
*/
|
|
2976
3132
|
covered_days_with_whale_activity: number;
|
|
2977
3133
|
};
|
|
2978
3134
|
export type SnapshotState = {
|
|
@@ -3025,7 +3181,7 @@ export type SuspiciousTrade = {
|
|
|
3025
3181
|
/** Stored trade timestamp. */
|
|
3026
3182
|
created_at: string;
|
|
3027
3183
|
};
|
|
3028
|
-
/** `suspicious_trade_flagged` data (Pro and Max): a trade's suspicion score crossed the flag threshold for the first time. The deprecated spelling `insider_radar_flag_raised` delivers the same object. */
|
|
3184
|
+
/** `suspicious_trade_flagged` data (Pro and Max): a trade's suspicion score crossed the flag threshold for the first time. The deprecated spelling `insider_radar_flag_raised` delivers the same object until its sunset on 2027-02-01 (#29352). */
|
|
3029
3185
|
export type SuspiciousTradeFlaggedData = {
|
|
3030
3186
|
/** Numeric id of the flagged trade, a JSON number. It is the `id` that `GET /api/v1/large-trades/{id}` accepts. */
|
|
3031
3187
|
trade_id: number;
|
|
@@ -3046,7 +3202,7 @@ export type SuspiciousTradeFlaggedData = {
|
|
|
3046
3202
|
/** Fill price of the flagged trade. */
|
|
3047
3203
|
price: number;
|
|
3048
3204
|
};
|
|
3049
|
-
/** 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. */
|
|
3205
|
+
/** 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. */
|
|
3050
3206
|
export type TennisPoints = {
|
|
3051
3207
|
source: "api_tennis";
|
|
3052
3208
|
/** API-Tennis match ID. This is not a Polymarket market or event ID. */
|
|
@@ -3063,10 +3219,12 @@ export type TennisPoints = {
|
|
|
3063
3219
|
observed_at: string;
|
|
3064
3220
|
/** Stop displaying the point group at this instant, even if the enclosing score remains fresh. The group expires 30 seconds after observed_at. */
|
|
3065
3221
|
expires_at: string;
|
|
3066
|
-
/** Current set number. Display points only while this matches the enclosing scoreboard. */
|
|
3222
|
+
/** Current set number. Display points only while this matches the enclosing scoreboard, unless set_games is present. */
|
|
3067
3223
|
set_number: number;
|
|
3068
|
-
/** Current-set games in first/second order. Display points only while these match the enclosing scoreboard. */
|
|
3224
|
+
/** Current-set games in first/second order. Display points only while these match the enclosing scoreboard, unless set_games is present. */
|
|
3069
3225
|
games: number[];
|
|
3226
|
+
/** 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. */
|
|
3227
|
+
set_games?: number[][];
|
|
3070
3228
|
};
|
|
3071
3229
|
/** 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. */
|
|
3072
3230
|
export type TennisRanking = {
|
|
@@ -3096,42 +3254,66 @@ export type Trader = {
|
|
|
3096
3254
|
forecast_evidence?: number;
|
|
3097
3255
|
rank?: number;
|
|
3098
3256
|
pnl: {
|
|
3099
|
-
/**
|
|
3257
|
+
/**
|
|
3258
|
+
* 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.
|
|
3259
|
+
* @deprecated
|
|
3260
|
+
*/
|
|
3100
3261
|
total?: number;
|
|
3101
|
-
/**
|
|
3262
|
+
/**
|
|
3263
|
+
* 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.
|
|
3264
|
+
* @deprecated
|
|
3265
|
+
*/
|
|
3102
3266
|
net_total?: number;
|
|
3103
|
-
/**
|
|
3267
|
+
/**
|
|
3268
|
+
* 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.
|
|
3269
|
+
* @deprecated
|
|
3270
|
+
*/
|
|
3104
3271
|
correction?: PnlCorrection;
|
|
3105
|
-
/** true while 0xinsider is still checking some of the wallet's converted neg-risk markets (not yet measured, measured and not yet checked for transfers, or its latest reads keep failing), so the correction may change, or arrive where none is published yet. Omitted otherwise. */
|
|
3272
|
+
/** 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. */
|
|
3106
3273
|
correction_pending?: boolean;
|
|
3107
|
-
/**
|
|
3274
|
+
/**
|
|
3275
|
+
* 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.
|
|
3276
|
+
* @deprecated
|
|
3277
|
+
*/
|
|
3108
3278
|
realized?: number;
|
|
3279
|
+
/** Unrealized P&L in USD of the wallet's open positions on its synced markets, from the open-position aggregate (dated by the positions data_quality group). Since 2026-10-27 (#29366) a wallet that holds a sports or esports market has only sports and esports markets synced, so this covers those positions; before, it covered every Polymarket market. A wallet with no sports or esports market can still carry older markets of other categories until they are deleted. */
|
|
3109
3280
|
unrealized?: number;
|
|
3110
|
-
/**
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
/** Additive lossless counterpart. Omitted when the trusted native realized-P&L source is unavailable; existing numeric fields keep their display-safe v1 semantics. */
|
|
3281
|
+
/**
|
|
3282
|
+
* Deprecated since 2026-10-27 and never sent: its one member was the lossless counterpart of the retired pnl.realized (#29830).
|
|
3283
|
+
* @deprecated
|
|
3284
|
+
*/
|
|
3115
3285
|
exact?: TraderPnlExact;
|
|
3286
|
+
/** 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). */
|
|
3287
|
+
in_scope?: TraderPnlInScope;
|
|
3116
3288
|
};
|
|
3289
|
+
/** 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). */
|
|
3117
3290
|
stats: {
|
|
3291
|
+
/** 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. */
|
|
3118
3292
|
markets_traded?: number;
|
|
3293
|
+
/** 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. */
|
|
3119
3294
|
win_rate?: number;
|
|
3295
|
+
/**
|
|
3296
|
+
* 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.
|
|
3297
|
+
* @deprecated
|
|
3298
|
+
*/
|
|
3120
3299
|
daily_win_rate?: number;
|
|
3121
|
-
/**
|
|
3300
|
+
/** 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). */
|
|
3122
3301
|
total_volume?: number;
|
|
3123
|
-
/** Additive lossless counterpart to `total_volume
|
|
3302
|
+
/** Additive lossless counterpart to `total_volume`, present exactly when it is. */
|
|
3124
3303
|
exact?: TraderStatsExact;
|
|
3125
3304
|
};
|
|
3126
3305
|
strategy?: {
|
|
3127
|
-
/** Observed trading style identifier. New rows use two_sided, category_focused, high_activity, diversified, mixed, or unclassified. Historical identifiers remain readable during normal reclassification; style does not predict skill or intent. */
|
|
3306
|
+
/** 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. */
|
|
3128
3307
|
strategy_type: string;
|
|
3129
3308
|
description?: string;
|
|
3130
3309
|
confidence?: number;
|
|
3131
3310
|
};
|
|
3132
|
-
/** Per-category rank context when expand=categories is requested. Values include available rank, category totals, performance and record counts; scaled_total_pnl is a legacy alias of total_pnl. Its measurement basis and update timing differ from the plain record returned by GET /api/v1/trader/{address}/categories, so the two need not agree. Use this for rank context and that route for the plain record. The inner key-set is intentionally unconstrained and may contain additional compatibility fields. */
|
|
3311
|
+
/** 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. */
|
|
3133
3312
|
category_strengths?: Record<string, unknown>;
|
|
3134
|
-
/**
|
|
3313
|
+
/**
|
|
3314
|
+
* 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.
|
|
3315
|
+
* @deprecated
|
|
3316
|
+
*/
|
|
3135
3317
|
quant_metrics?: {
|
|
3136
3318
|
/** Trader smart score on a 0..100 display scale; higher is stronger. Null when unavailable. */
|
|
3137
3319
|
smart_score: number | null;
|
|
@@ -3156,11 +3338,11 @@ export type Trader = {
|
|
|
3156
3338
|
synced_at?: string;
|
|
3157
3339
|
/** synced, unknown, or pending. */
|
|
3158
3340
|
sync_status?: string;
|
|
3159
|
-
/** Data age and coverage for this trader body. Always present. Its six groups are sync (traders.last_synced, covering
|
|
3341
|
+
/** Data age and coverage for this trader body. Always present. Its six groups are sync (traders.last_synced, covering last_active, synced_at and sync_status), 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. */
|
|
3160
3342
|
data_quality: DataQuality;
|
|
3161
3343
|
/** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
|
|
3162
3344
|
trust?: TraderTrust;
|
|
3163
|
-
/** Current evidence for observed and known categories (expand=categories or expand[]=categories). Omitted unless expanded. Includes insufficient, stale, unknown and degraded rows; absence of a category is not proof of skill. The global grade is unchanged. */
|
|
3345
|
+
/** Current evidence for observed and known categories (expand=categories or expand[]=categories). Omitted unless expanded. Includes insufficient, stale, unknown and degraded rows; absence of a category is not proof of skill. The global grade is unchanged. Sports and esports only (#28827): a category outside them is omitted, as on GET /api/v1/trader/{address}/categories. */
|
|
3164
3346
|
category_records?: CategorySkillV2[];
|
|
3165
3347
|
category_skill_model?: CategorySkillModelReadiness;
|
|
3166
3348
|
};
|
|
@@ -3194,31 +3376,37 @@ export type TraderCategoryRecords = {
|
|
|
3194
3376
|
};
|
|
3195
3377
|
export type TraderContext = {
|
|
3196
3378
|
trader: Trader;
|
|
3197
|
-
/** Aggregate position and P&L coverage for the trader. 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. */
|
|
3379
|
+
/** Aggregate position and P&L coverage for the trader, over its synced markets. Since 2026-10-27 (#29366) a wallet that holds a sports or esports market has only sports and esports markets synced, so markets_synced, markets_resolved, markets_open, unrealized_mtm, cost_basis_locked and the resolved win figures cover those markets; before, they covered every Polymarket market. A wallet with no sports or esports market can still carry older markets of other categories until they are deleted. 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. */
|
|
3198
3380
|
position_summary?: {
|
|
3199
|
-
/**
|
|
3381
|
+
/** Polymarket's count of the markets the wallet traded, every category, when known; null when the provider total is unavailable. */
|
|
3200
3382
|
markets_total: number | null;
|
|
3201
3383
|
/** Markets with locally synced position rows. */
|
|
3202
3384
|
markets_synced: number;
|
|
3203
|
-
/**
|
|
3385
|
+
/** 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. */
|
|
3386
|
+
markets_pruned: number;
|
|
3387
|
+
/** 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. */
|
|
3388
|
+
markets_unstored: number;
|
|
3389
|
+
/** 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. */
|
|
3390
|
+
markets_combo: number;
|
|
3391
|
+
/** Synced markets the wallet has settled: it closed its position by selling out, or the market resolved. Its P&L there is final. */
|
|
3204
3392
|
markets_resolved: number;
|
|
3205
3393
|
/** Synced markets still open with residual value (open positions with current value > 0). */
|
|
3206
3394
|
markets_open: number;
|
|
3207
|
-
/** 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
|
|
3395
|
+
/** 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. */
|
|
3208
3396
|
sync_coverage: number;
|
|
3209
|
-
/** 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. */
|
|
3397
|
+
/** 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. */
|
|
3210
3398
|
synced_realized_pnl: number;
|
|
3211
|
-
/** Native net realized P&L (USD) including credited rebates, read directly from the accounting snapshot. Position sync_coverage is separate from this accounting basis. */
|
|
3399
|
+
/** 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. */
|
|
3212
3400
|
total_realized_pnl: number;
|
|
3213
|
-
/** Mark-to-market unrealized P&L (USD) on open positions. */
|
|
3401
|
+
/** Mark-to-market unrealized P&L (USD) on open positions in synced markets. */
|
|
3214
3402
|
unrealized_mtm: number;
|
|
3215
|
-
/** Cost basis (USD) currently tied up in open positions. */
|
|
3403
|
+
/** Cost basis (USD) currently tied up in open positions in synced markets. */
|
|
3216
3404
|
cost_basis_locked: number;
|
|
3217
|
-
/** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A
|
|
3405
|
+
/** 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. */
|
|
3218
3406
|
resolved_win_rate: number | null;
|
|
3219
|
-
/**
|
|
3407
|
+
/** Settled markets that closed at positive realized P&L: the win-rate numerator. Additive; null only on a summary cached before the field existed. */
|
|
3220
3408
|
resolved_wins: number | null;
|
|
3221
|
-
/**
|
|
3409
|
+
/** 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. */
|
|
3222
3410
|
resolved_decided: number | null;
|
|
3223
3411
|
/** 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. */
|
|
3224
3412
|
as_of: string | null;
|
|
@@ -3275,15 +3463,19 @@ export type TraderExportGeneration = {
|
|
|
3275
3463
|
selected_at: string;
|
|
3276
3464
|
consistency: "repeatable_read";
|
|
3277
3465
|
source_watermarks: TraderExportSourceWatermarks;
|
|
3466
|
+
/** The markets the file's trades and markets sections hold: sports and esports markets only (export_metadata.scope_note in a JSON or NDJSON file names the sections that still cover every market). Absent on a file written before 2026-10-22, which holds every market; a submit never reuses such a file. */
|
|
3467
|
+
product_scope?: "sports_esports_v1";
|
|
3278
3468
|
};
|
|
3279
3469
|
export type TraderExportJob = {
|
|
3280
3470
|
object: "trader_export_job";
|
|
3281
3471
|
data: {
|
|
3282
3472
|
job_id: number;
|
|
3283
|
-
/** queued:
|
|
3473
|
+
/** 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. */
|
|
3284
3474
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
3285
3475
|
format: "json" | "ndjson" | "csv";
|
|
3476
|
+
/** 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. */
|
|
3286
3477
|
total_trades: number | null;
|
|
3478
|
+
/** Trade rows written so far; equals total_trades once the file is read. */
|
|
3287
3479
|
processed_trades: number | null;
|
|
3288
3480
|
file_size: number | null;
|
|
3289
3481
|
error: string | null;
|
|
@@ -3309,7 +3501,7 @@ export type TraderExportJob = {
|
|
|
3309
3501
|
cancel_requested_at: string | null;
|
|
3310
3502
|
/** When the job reached cancelled; null until then. */
|
|
3311
3503
|
cancelled_at: string | null;
|
|
3312
|
-
/** Worker claims so far. */
|
|
3504
|
+
/** 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. */
|
|
3313
3505
|
attempt: number;
|
|
3314
3506
|
/** The job fails when attempt reaches this. */
|
|
3315
3507
|
max_attempts: number;
|
|
@@ -3343,6 +3535,8 @@ export type TraderExportPositionWatermark = {
|
|
|
3343
3535
|
};
|
|
3344
3536
|
export type TraderExportSnapshot = {
|
|
3345
3537
|
address: string;
|
|
3538
|
+
/** 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. */
|
|
3539
|
+
product_scope: "sports_esports_v1";
|
|
3346
3540
|
generated_at: string;
|
|
3347
3541
|
source_range: ExportSourceRange;
|
|
3348
3542
|
completeness: ExportCompleteness;
|
|
@@ -3358,7 +3552,9 @@ export type TraderExportSourceWatermarks = {
|
|
|
3358
3552
|
};
|
|
3359
3553
|
export type TraderExportTradeWatermark = {
|
|
3360
3554
|
source: string;
|
|
3555
|
+
/** sports_esports_rows: the file holds every stored trade in the wallet's sports and esports markets. all_matching_rows on a file written before 2026-10-22, which holds every market's trades. */
|
|
3361
3556
|
coverage: string;
|
|
3557
|
+
/** Trade rows the file holds, counted in the same read snapshot as the rows. */
|
|
3362
3558
|
rows: number;
|
|
3363
3559
|
first_activity_date: string | null;
|
|
3364
3560
|
};
|
|
@@ -3393,7 +3589,7 @@ export type TraderGradeAt = {
|
|
|
3393
3589
|
source_observed_by: string | null;
|
|
3394
3590
|
} | null;
|
|
3395
3591
|
};
|
|
3396
|
-
/** A trader's daily P&L object. `id`
|
|
3592
|
+
/** A trader's sports and esports daily P&L object. `id`, `freshness_at`, `series_status` and `realized` are always present. The five sections -- `entries`, `stats`, `monthly`, `year_totals`, `drawdown` -- are present unless the request's `sections` parameter excluded them, so a request that sends no `sections` always carries all five. An excluded section is absent from the object, never null and never an empty array. While `series_status` is `pending` the sections are empty and never mean zero. */
|
|
3397
3593
|
export type TraderPnl = {
|
|
3398
3594
|
/** Prefixed trader ID (`trd_...`). */
|
|
3399
3595
|
id: string;
|
|
@@ -3420,18 +3616,35 @@ export type TraderPnl = {
|
|
|
3420
3616
|
drawdown: number | null;
|
|
3421
3617
|
} | null;
|
|
3422
3618
|
};
|
|
3423
|
-
/** RFC3339 served-freshness clock
|
|
3619
|
+
/** 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. */
|
|
3424
3620
|
freshness_at: string | null;
|
|
3425
|
-
/**
|
|
3426
|
-
|
|
3621
|
+
/** `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. */
|
|
3622
|
+
series_status: "ready" | "pending";
|
|
3623
|
+
/** 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). */
|
|
3624
|
+
realized: {
|
|
3625
|
+
/** The rule behind realized_pnl, the same basis as pnl.in_scope.basis on GET /api/v1/trader/{address}. */
|
|
3626
|
+
basis: "polymarket_sports_esports_v1" | "sports_esports_split_v1";
|
|
3627
|
+
/** The wallet's Sports P&L: pnl.in_scope.realized_pnl on GET /api/v1/trader/{address}. null when the wallet has no published realized figure. */
|
|
3628
|
+
realized_pnl: number | null;
|
|
3629
|
+
/** The sum of every day's daily_change over the full history, whatever from/to say. */
|
|
3630
|
+
dated_pnl: number;
|
|
3631
|
+
/** realized_pnl less dated_pnl. realized_pnl starts from Polymarket's figures under either basis (its sports and esports figures, or its published figure for the whole wallet split by cost) and the days from the per-market record, so undated_pnl holds the wallet's share of Polymarket rebates, the in-scope part of the neg-risk conversion correction, any market with no trade date, and the difference between Polymarket's figure and the per-market record, which on some wallets is most of it. null exactly when realized_pnl is. */
|
|
3632
|
+
undated_pnl: number | null;
|
|
3633
|
+
} | null;
|
|
3634
|
+
/** Sports and esports daily P&L series (oldest-first): one point for each UTC day with realized P&L or sports and esports volume. Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. cumulative_profit and total_pnl are the running sum of daily_change from the start of the history, so a clipped slice keeps the same economic meaning; view.anchor carries the point before the window. */
|
|
3635
|
+
entries?: ({
|
|
3427
3636
|
date: string;
|
|
3637
|
+
/** 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. */
|
|
3428
3638
|
markets_traded?: number;
|
|
3429
|
-
/**
|
|
3639
|
+
/** 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. */
|
|
3430
3640
|
total_volume?: number;
|
|
3641
|
+
/** Running sum of daily_change through this day. */
|
|
3431
3642
|
cumulative_profit?: number;
|
|
3643
|
+
/** The same running sum as cumulative_profit. */
|
|
3432
3644
|
total_pnl?: number;
|
|
3645
|
+
/** Realized P&L of the wallet's sports and esports markets dated to this UTC day: a settled market on its resolution day, else its last trade day; an open market's realized part on its last trade day. 0 on a day with volume and nothing realized. */
|
|
3433
3646
|
daily_change: number;
|
|
3434
|
-
}[];
|
|
3647
|
+
})[];
|
|
3435
3648
|
/** Pre-derived period stats. Present unless the request's `sections` excluded it. Always the published all/90d/30d/7d windows over the full stored history; `from`/`to` never recompute them over the request's range. */
|
|
3436
3649
|
stats?: {
|
|
3437
3650
|
all: {
|
|
@@ -3488,12 +3701,13 @@ export type TraderPnl = {
|
|
|
3488
3701
|
};
|
|
3489
3702
|
};
|
|
3490
3703
|
/** Per-month P&L aggregation. Present unless the request's `sections` excluded it. Whole months over the full stored history, never clipped to `from`/`to`, so a month is never a partial month. */
|
|
3491
|
-
monthly?: {
|
|
3704
|
+
monthly?: ({
|
|
3492
3705
|
year: number;
|
|
3493
3706
|
month: number;
|
|
3494
3707
|
pnl: number;
|
|
3495
|
-
markets_traded:
|
|
3496
|
-
|
|
3708
|
+
/** The month's entries[].markets_traded summed: a market traded on several days counts once a day. null when a day of the month has total_volume and no markets_traded, a day whose stored fills include a market outside sports and esports, where a sum would undercount. A day with no stored fill, or above 20 times the wallet's median day, adds 0. */
|
|
3709
|
+
markets_traded: number | null;
|
|
3710
|
+
})[];
|
|
3497
3711
|
/** Per-year P&L totals (ascending by year). Present unless the request's `sections` excluded it. Whole years over the full stored history, never clipped to `from`/`to`. */
|
|
3498
3712
|
year_totals?: {
|
|
3499
3713
|
year: number;
|
|
@@ -3506,17 +3720,34 @@ export type TraderPnl = {
|
|
|
3506
3720
|
drawdown: number;
|
|
3507
3721
|
}[];
|
|
3508
3722
|
};
|
|
3509
|
-
/**
|
|
3723
|
+
/** 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. */
|
|
3510
3724
|
export type TraderPnlExact = {
|
|
3511
3725
|
/** 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. */
|
|
3512
3726
|
realized: ExactDecimal;
|
|
3513
3727
|
};
|
|
3514
|
-
/**
|
|
3728
|
+
/** 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. */
|
|
3729
|
+
export type TraderPnlInScope = {
|
|
3730
|
+
/** 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. */
|
|
3731
|
+
basis: string;
|
|
3732
|
+
/** Sports and esports realized P&L in USD, display-safe. null when the split basis has no published realized figure to split. */
|
|
3733
|
+
realized_pnl: number | null;
|
|
3734
|
+
/** Sports and esports markets the wallet has traded, any status. */
|
|
3735
|
+
markets: number;
|
|
3736
|
+
/** Of those, the settled markets: the wallet closed its position by selling out, or the market resolved. Its P&L there is final. */
|
|
3737
|
+
markets_resolved: number;
|
|
3738
|
+
/** Share of decided sports and esports markets the wallet won, 0 to 1. null with no decided market. */
|
|
3739
|
+
win_rate: number | null;
|
|
3740
|
+
/** 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). */
|
|
3741
|
+
markets_out_of_scope: number;
|
|
3742
|
+
/** When the record behind these figures was computed. */
|
|
3743
|
+
as_of: string;
|
|
3744
|
+
};
|
|
3745
|
+
/** Lossless counterparts for trader statistics. The object is present exactly when stats.total_volume is. */
|
|
3515
3746
|
export type TraderStatsExact = {
|
|
3516
|
-
/** stats.total_volume as an exact decimal:
|
|
3747
|
+
/** 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. */
|
|
3517
3748
|
total_volume: ExactDecimal;
|
|
3518
3749
|
};
|
|
3519
|
-
/** `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. */
|
|
3750
|
+
/** `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). */
|
|
3520
3751
|
export type TraderSyncedData = {
|
|
3521
3752
|
/** 0xinsider's numeric id for the wallet. */
|
|
3522
3753
|
trader_id: number;
|
|
@@ -3525,15 +3756,25 @@ export type TraderSyncedData = {
|
|
|
3525
3756
|
};
|
|
3526
3757
|
/** Field-level trust metadata returned only when GET /api/v1/trader/{address} includes expand=trust. */
|
|
3527
3758
|
export type TraderTrust = {
|
|
3759
|
+
/** Since 2026-10-27 always not_computed: pnl.total is retired and never sent (#29830). The key stays so the object keeps its shape. */
|
|
3528
3760
|
total_pnl: TrustMetadata;
|
|
3761
|
+
/** 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. */
|
|
3529
3762
|
realized_pnl: TrustMetadata;
|
|
3763
|
+
/** 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. */
|
|
3530
3764
|
net_total_pnl: TrustMetadata;
|
|
3531
|
-
/**
|
|
3765
|
+
/**
|
|
3766
|
+
* Deprecated since 2026-10-27 and never sent: it was present only with pnl.correction, which is retired (#29830).
|
|
3767
|
+
* @deprecated
|
|
3768
|
+
*/
|
|
3532
3769
|
pnl_correction?: TrustMetadata;
|
|
3533
3770
|
unrealized_pnl: TrustMetadata;
|
|
3771
|
+
/** 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). */
|
|
3534
3772
|
markets_traded: TrustMetadata;
|
|
3773
|
+
/** Computed, owned by trader_product_scope_records (win_rate) and dated by the record's computed_at, since 2026-10-27 (#29830). */
|
|
3535
3774
|
win_rate: TrustMetadata;
|
|
3775
|
+
/** 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. */
|
|
3536
3776
|
daily_win_rate: TrustMetadata;
|
|
3777
|
+
/** Computed, owned by trader_trade_daily_rollups (in_scope_volume_total) and dated by traders.last_synced, since 2026-10-27 (#29830). */
|
|
3537
3778
|
total_volume: TrustMetadata;
|
|
3538
3779
|
grade: TrustMetadata;
|
|
3539
3780
|
score: TrustMetadata;
|
|
@@ -3570,21 +3811,31 @@ export type TrendingWallet = {
|
|
|
3570
3811
|
window_markets_traded: number;
|
|
3571
3812
|
/** Distinct in-window UTC trade days from our trades (0 if the winner is not in our DB). */
|
|
3572
3813
|
window_trade_days: number;
|
|
3573
|
-
/** All-time trader grade; a separate axis from streak_tier. Led by realized profit (the money actually banked, about 95 percent of the grade), with forecasting calibration, risk-adjusted returns, and consistency as the tie-breaker and proven-trader guardrails: any grade above C requires verified net-positive realized profit, and the top grades also require a real
|
|
3814
|
+
/** All-time trader grade; a separate axis from streak_tier. Led by realized profit on sports and esports markets (the money actually banked, about 95 percent of the grade; since 2026-10-22, the sports and esports share of the wallet's realized P&L), with forecasting calibration, risk-adjusted returns, and consistency as the tie-breaker and proven-trader guardrails: any grade above C requires verified net-positive realized profit on those markets, and the top grades also require a real track record of resolved sports and esports markets plus a survivable drawdown. Relative, so it drifts as the cohort moves. Omitted when the trader is Unranked (fewer than 5 markets, or too little verified record to cohort-rank). */
|
|
3574
3815
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3575
3816
|
/** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
|
|
3576
3817
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
3577
|
-
/**
|
|
3818
|
+
/** 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. */
|
|
3819
|
+
in_scope_realized_pnl?: number;
|
|
3820
|
+
/**
|
|
3821
|
+
* 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.
|
|
3822
|
+
* @deprecated
|
|
3823
|
+
*/
|
|
3578
3824
|
all_time_pnl_usd?: number;
|
|
3579
|
-
/**
|
|
3825
|
+
/**
|
|
3826
|
+
* 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.
|
|
3827
|
+
* @deprecated
|
|
3828
|
+
*/
|
|
3580
3829
|
pnl_correction?: PnlCorrection;
|
|
3581
3830
|
all_time_score?: number;
|
|
3582
3831
|
last_synced?: string;
|
|
3583
|
-
/**
|
|
3832
|
+
/** The wallet's sports and esports realized P&L on each UTC day of the window, ascending, one point a day, pnl_usd 0 on a day with none: the same in-scope realized day series the trader P&L endpoint serves. Empty while daily_pnl_series_status is pending, which never means zero. It leaves out non-sports markets, so it does not sum to trending_pnl_usd, which is Polymarket's leaderboard figure across all markets. */
|
|
3584
3833
|
daily_pnl_series: {
|
|
3585
3834
|
date: string;
|
|
3586
3835
|
pnl_usd: number;
|
|
3587
3836
|
}[];
|
|
3837
|
+
/** `ready` when daily_pnl_series is served; an all-zero one is a wallet with no sports or esports P&L in the window. `pending` when the wallet's sports and esports record does not carry its daily series yet, or the wallet is not in the 0xinsider database: daily_pnl_series is empty and never means zero. Retry later. */
|
|
3838
|
+
daily_pnl_series_status: "ready" | "pending";
|
|
3588
3839
|
};
|
|
3589
3840
|
/** Whether the described value or result set is complete for its stated contract. */
|
|
3590
3841
|
export type TrustCompleteness = {
|
|
@@ -3630,6 +3881,7 @@ export type Usage = {
|
|
|
3630
3881
|
data: {
|
|
3631
3882
|
rate_limit: {
|
|
3632
3883
|
used: number;
|
|
3884
|
+
/** The per-minute window's limit for the caller's plan: 100 requests on Pro, 200 on Max. The same number RateLimit-Limit reports on a counted request. */
|
|
3633
3885
|
limit: number;
|
|
3634
3886
|
remaining: number;
|
|
3635
3887
|
reset_at: number;
|
|
@@ -3660,6 +3912,8 @@ export type Usage = {
|
|
|
3660
3912
|
pay_as_you_go: boolean;
|
|
3661
3913
|
/** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or four times limit with pay as you go on (2,000,000 for Pro). null for an admin account, which no number stops. Additive since 2026-09-22. */
|
|
3662
3914
|
ceiling: number | null;
|
|
3915
|
+
/** Why pay as you go is unavailable, or null. usage_price_reconciliation_required: the account's usage subscription carries a historical price whose included requests differ from its plan's, so pay as you go stays off (pay_as_you_go false) until billing reconciles it. Always sent since 2026-10-17. */
|
|
3916
|
+
unavailable_reason: "usage_price_reconciliation_required" | null;
|
|
3663
3917
|
} | null;
|
|
3664
3918
|
};
|
|
3665
3919
|
meta: ResponseMeta;
|
|
@@ -3728,7 +3982,7 @@ export type WebhookEndpoint = {
|
|
|
3728
3982
|
signing_secret?: string;
|
|
3729
3983
|
verification?: WebhookVerification;
|
|
3730
3984
|
};
|
|
3731
|
-
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (large_trades_inserted, whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, sharp_money_flow_detected, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. Export lifecycle event types (export_job_ready, export_job_failed, export_job_expired, export_job_cancelled) are owner-scoped to the API-key account that created the export and contain no download URL; use the authorized export status/download routes. Some entries are two spellings of one event: large_trades_inserted and whale_trades_inserted, trader_synced and whale_trader_synced, suspicious_trade_flagged and insider_radar_flag_raised, sharp_money_flow_detected and smart_money_flow_detected. Either spelling subscribes, and an endpoint receives deliveries under the spelling it registered. */
|
|
3985
|
+
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (large_trades_inserted, whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, sharp_money_flow_detected, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. Export lifecycle event types (export_job_ready, export_job_failed, export_job_expired, export_job_cancelled) are owner-scoped to the API-key account that created the export and contain no download URL; use the authorized export status/download routes. Some entries are two spellings of one event: large_trades_inserted and whale_trades_inserted, trader_synced and whale_trader_synced, suspicious_trade_flagged and insider_radar_flag_raised, sharp_money_flow_detected and smart_money_flow_detected. Either spelling subscribes, and an endpoint receives deliveries under the spelling it registered. The deprecated spellings (whale_trades_inserted, whale_trader_synced, insider_radar_flag_raised, smart_money_flow_detected) reach their sunset on 2027-02-01 (#29352); register the canonical spelling. */
|
|
3732
3986
|
export type WebhookEventDescriptor = {
|
|
3733
3987
|
id: WebhookEventType;
|
|
3734
3988
|
/** One-line description of when the event fires. */
|
|
@@ -3839,7 +4093,7 @@ export type WhaleDatasetJob = {
|
|
|
3839
4093
|
object: "whale_dataset_job";
|
|
3840
4094
|
data: {
|
|
3841
4095
|
job_id: number;
|
|
3842
|
-
/** queued:
|
|
4096
|
+
/** 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. */
|
|
3843
4097
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
3844
4098
|
format: "ndjson";
|
|
3845
4099
|
total_trades: number | null;
|
|
@@ -3868,7 +4122,7 @@ export type WhaleDatasetJob = {
|
|
|
3868
4122
|
cancel_requested_at: string | null;
|
|
3869
4123
|
/** When the job reached cancelled; null until then. */
|
|
3870
4124
|
cancelled_at: string | null;
|
|
3871
|
-
/** Worker claims so far. */
|
|
4125
|
+
/** 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. */
|
|
3872
4126
|
attempt: number;
|
|
3873
4127
|
/** The job fails when attempt reaches this. */
|
|
3874
4128
|
max_attempts: number;
|
|
@@ -3946,10 +4200,12 @@ export interface OperationData {
|
|
|
3946
4200
|
batchGetTraders: BatchTraderItem[];
|
|
3947
4201
|
cancelTraderExport: {
|
|
3948
4202
|
job_id: number;
|
|
3949
|
-
/** queued:
|
|
4203
|
+
/** 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. */
|
|
3950
4204
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
3951
4205
|
format: "json" | "ndjson" | "csv";
|
|
4206
|
+
/** 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. */
|
|
3952
4207
|
total_trades: number | null;
|
|
4208
|
+
/** Trade rows written so far; equals total_trades once the file is read. */
|
|
3953
4209
|
processed_trades: number | null;
|
|
3954
4210
|
file_size: number | null;
|
|
3955
4211
|
error: string | null;
|
|
@@ -3975,7 +4231,7 @@ export interface OperationData {
|
|
|
3975
4231
|
cancel_requested_at: string | null;
|
|
3976
4232
|
/** When the job reached cancelled; null until then. */
|
|
3977
4233
|
cancelled_at: string | null;
|
|
3978
|
-
/** Worker claims so far. */
|
|
4234
|
+
/** 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. */
|
|
3979
4235
|
attempt: number;
|
|
3980
4236
|
/** The job fails when attempt reaches this. */
|
|
3981
4237
|
max_attempts: number;
|
|
@@ -3995,7 +4251,7 @@ export interface OperationData {
|
|
|
3995
4251
|
};
|
|
3996
4252
|
cancelWhaleDataset: {
|
|
3997
4253
|
job_id: number;
|
|
3998
|
-
/** queued:
|
|
4254
|
+
/** 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. */
|
|
3999
4255
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4000
4256
|
format: "ndjson";
|
|
4001
4257
|
total_trades: number | null;
|
|
@@ -4024,7 +4280,7 @@ export interface OperationData {
|
|
|
4024
4280
|
cancel_requested_at: string | null;
|
|
4025
4281
|
/** When the job reached cancelled; null until then. */
|
|
4026
4282
|
cancelled_at: string | null;
|
|
4027
|
-
/** Worker claims so far. */
|
|
4283
|
+
/** 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. */
|
|
4028
4284
|
attempt: number;
|
|
4029
4285
|
/** The job fails when attempt reaches this. */
|
|
4030
4286
|
max_attempts: number;
|
|
@@ -4061,7 +4317,8 @@ export interface OperationData {
|
|
|
4061
4317
|
getAccountIdentity: {
|
|
4062
4318
|
user_id: number;
|
|
4063
4319
|
credential_id: number;
|
|
4064
|
-
|
|
4320
|
+
/** 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. */
|
|
4321
|
+
credential_kind: "api_key" | "oauth_grant" | "integration_key";
|
|
4065
4322
|
/** The credential is currently valid; revoked, expired or unknown credentials are rejected. */
|
|
4066
4323
|
credential_status: "active";
|
|
4067
4324
|
entitlement: {
|
|
@@ -4069,7 +4326,7 @@ export interface OperationData {
|
|
|
4069
4326
|
/** When paid data access is lapsed, the caller should renew the subscription; otherwise null. */
|
|
4070
4327
|
recovery_action: "renew_subscription" | null;
|
|
4071
4328
|
};
|
|
4072
|
-
/**
|
|
4329
|
+
/** The scopes an OAuth grant or integration key carries; null for full developer-key access. */
|
|
4073
4330
|
scopes: string[] | null;
|
|
4074
4331
|
};
|
|
4075
4332
|
getApiDiscovery: ApiDiscovery;
|
|
@@ -4128,10 +4385,12 @@ export interface OperationData {
|
|
|
4128
4385
|
getTraderExportSnapshot: TraderExportSnapshot;
|
|
4129
4386
|
getTraderExportStatus: {
|
|
4130
4387
|
job_id: number;
|
|
4131
|
-
/** queued:
|
|
4388
|
+
/** 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. */
|
|
4132
4389
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4133
4390
|
format: "json" | "ndjson" | "csv";
|
|
4391
|
+
/** 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. */
|
|
4134
4392
|
total_trades: number | null;
|
|
4393
|
+
/** Trade rows written so far; equals total_trades once the file is read. */
|
|
4135
4394
|
processed_trades: number | null;
|
|
4136
4395
|
file_size: number | null;
|
|
4137
4396
|
error: string | null;
|
|
@@ -4157,7 +4416,7 @@ export interface OperationData {
|
|
|
4157
4416
|
cancel_requested_at: string | null;
|
|
4158
4417
|
/** When the job reached cancelled; null until then. */
|
|
4159
4418
|
cancelled_at: string | null;
|
|
4160
|
-
/** Worker claims so far. */
|
|
4419
|
+
/** 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. */
|
|
4161
4420
|
attempt: number;
|
|
4162
4421
|
/** The job fails when attempt reaches this. */
|
|
4163
4422
|
max_attempts: number;
|
|
@@ -4180,6 +4439,7 @@ export interface OperationData {
|
|
|
4180
4439
|
getUsage: {
|
|
4181
4440
|
rate_limit: {
|
|
4182
4441
|
used: number;
|
|
4442
|
+
/** The per-minute window's limit for the caller's plan: 100 requests on Pro, 200 on Max. The same number RateLimit-Limit reports on a counted request. */
|
|
4183
4443
|
limit: number;
|
|
4184
4444
|
remaining: number;
|
|
4185
4445
|
reset_at: number;
|
|
@@ -4210,6 +4470,8 @@ export interface OperationData {
|
|
|
4210
4470
|
pay_as_you_go: boolean;
|
|
4211
4471
|
/** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or four times limit with pay as you go on (2,000,000 for Pro). null for an admin account, which no number stops. Additive since 2026-09-22. */
|
|
4212
4472
|
ceiling: number | null;
|
|
4473
|
+
/** Why pay as you go is unavailable, or null. usage_price_reconciliation_required: the account's usage subscription carries a historical price whose included requests differ from its plan's, so pay as you go stays off (pay_as_you_go false) until billing reconciles it. Always sent since 2026-10-17. */
|
|
4474
|
+
unavailable_reason: "usage_price_reconciliation_required" | null;
|
|
4213
4475
|
} | null;
|
|
4214
4476
|
};
|
|
4215
4477
|
getWebhook: WebhookEndpoint;
|
|
@@ -4217,7 +4479,7 @@ export interface OperationData {
|
|
|
4217
4479
|
getWeeklyReportSnapshot: ReportSnapshot;
|
|
4218
4480
|
getWhaleDatasetStatus: {
|
|
4219
4481
|
job_id: number;
|
|
4220
|
-
/** queued:
|
|
4482
|
+
/** 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. */
|
|
4221
4483
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4222
4484
|
format: "ndjson";
|
|
4223
4485
|
total_trades: number | null;
|
|
@@ -4246,7 +4508,7 @@ export interface OperationData {
|
|
|
4246
4508
|
cancel_requested_at: string | null;
|
|
4247
4509
|
/** When the job reached cancelled; null until then. */
|
|
4248
4510
|
cancelled_at: string | null;
|
|
4249
|
-
/** Worker claims so far. */
|
|
4511
|
+
/** 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. */
|
|
4250
4512
|
attempt: number;
|
|
4251
4513
|
/** The job fails when attempt reaches this. */
|
|
4252
4514
|
max_attempts: number;
|
|
@@ -4296,10 +4558,12 @@ export interface OperationData {
|
|
|
4296
4558
|
searchMarkets: MarketSearchResult[];
|
|
4297
4559
|
submitTraderExport: {
|
|
4298
4560
|
job_id: number;
|
|
4299
|
-
/** queued:
|
|
4561
|
+
/** 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. */
|
|
4300
4562
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4301
4563
|
format: "json" | "ndjson" | "csv";
|
|
4564
|
+
/** 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. */
|
|
4302
4565
|
total_trades: number | null;
|
|
4566
|
+
/** Trade rows written so far; equals total_trades once the file is read. */
|
|
4303
4567
|
processed_trades: number | null;
|
|
4304
4568
|
file_size: number | null;
|
|
4305
4569
|
error: string | null;
|
|
@@ -4325,7 +4589,7 @@ export interface OperationData {
|
|
|
4325
4589
|
cancel_requested_at: string | null;
|
|
4326
4590
|
/** When the job reached cancelled; null until then. */
|
|
4327
4591
|
cancelled_at: string | null;
|
|
4328
|
-
/** Worker claims so far. */
|
|
4592
|
+
/** 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. */
|
|
4329
4593
|
attempt: number;
|
|
4330
4594
|
/** The job fails when attempt reaches this. */
|
|
4331
4595
|
max_attempts: number;
|
|
@@ -4345,7 +4609,7 @@ export interface OperationData {
|
|
|
4345
4609
|
};
|
|
4346
4610
|
submitWhaleDataset: {
|
|
4347
4611
|
job_id: number;
|
|
4348
|
-
/** queued:
|
|
4612
|
+
/** 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. */
|
|
4349
4613
|
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired" | "cancel_requested" | "cancelled";
|
|
4350
4614
|
format: "ndjson";
|
|
4351
4615
|
total_trades: number | null;
|
|
@@ -4374,7 +4638,7 @@ export interface OperationData {
|
|
|
4374
4638
|
cancel_requested_at: string | null;
|
|
4375
4639
|
/** When the job reached cancelled; null until then. */
|
|
4376
4640
|
cancelled_at: string | null;
|
|
4377
|
-
/** Worker claims so far. */
|
|
4641
|
+
/** 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. */
|
|
4378
4642
|
attempt: number;
|
|
4379
4643
|
/** The job fails when attempt reaches this. */
|
|
4380
4644
|
max_attempts: number;
|
|
@@ -4412,13 +4676,13 @@ export interface OperationQuery {
|
|
|
4412
4676
|
createWebhookVerificationAttempt: Record<string, never>;
|
|
4413
4677
|
deleteWebhook: Record<string, never>;
|
|
4414
4678
|
exploreMarkets: {
|
|
4415
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket. */
|
|
4679
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Facet values are returned as the canonical bucket. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4416
4680
|
category?: string;
|
|
4417
4681
|
/** Filter by market status. A market is closed once Polymarket has closed trading or it has resolved, and active otherwise; all returns both. */
|
|
4418
4682
|
status?: "active" | "closed" | "all";
|
|
4419
4683
|
/** Filter by source platform. Explore is Polymarket-only; polymarket is the only supported value and the parameter is accepted for backward-compatibility but does not change the result set. */
|
|
4420
4684
|
platform?: "polymarket";
|
|
4421
|
-
/** Sort order for the discovery feed. `large_trades` ranks by large-trade activity; `whales` is its deprecated spelling and selects the same order. */
|
|
4685
|
+
/** Sort order for the discovery feed. `large_trades` ranks by large-trade activity; `whales` is its deprecated spelling and selects the same order until its sunset on 2027-02-01 (#29352); from then it answers 400 bad_request. */
|
|
4422
4686
|
sort?: "trending" | "hot" | "expiring" | "large_trades" | "whales" | "volume" | "newest";
|
|
4423
4687
|
/** Opaque pagination cursor from the previous response. */
|
|
4424
4688
|
cursor?: string;
|
|
@@ -4441,13 +4705,15 @@ export interface OperationQuery {
|
|
|
4441
4705
|
view?: "board" | "signals" | "observations";
|
|
4442
4706
|
/** 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. */
|
|
4443
4707
|
category?: string;
|
|
4444
|
-
/** Required for view=observations; wider_holder, in_play or emerging_pile. Rejected for board and signals. 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. */
|
|
4708
|
+
/** 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. */
|
|
4445
4709
|
cohort?: "wider_holder" | "in_play" | "emerging_pile";
|
|
4710
|
+
/** 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). Omit for the default selection. Cursors and ETags bind it. */
|
|
4711
|
+
admission?: "most_held_48h";
|
|
4446
4712
|
/** 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. */
|
|
4447
4713
|
min_grade?: "S" | "A" | "B";
|
|
4448
4714
|
/** 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. */
|
|
4449
4715
|
limit?: number;
|
|
4450
|
-
/** Opaque canonical Edge Hunter cursor from next_cursor. Bound to view, every normalized selection axis, grade/horizon where applicable, source snapshot and ordering; observations also bind cohort and emerging cutoff. Changed selections or replaced snapshots return cursor_expired. Rejected in board. */
|
|
4716
|
+
/** Opaque canonical Edge Hunter cursor from next_cursor. Bound to view, every normalized selection axis, grade/horizon where applicable, source snapshot and ordering; observations also bind cohort, admission and emerging cutoff. Changed selections or replaced snapshots return cursor_expired. Rejected in board. */
|
|
4451
4717
|
cursor?: string;
|
|
4452
4718
|
/** Kickoff window for board (default 48) or signals (default 12). Integer values clamp to 1..48. Rejected for observations, whose pre-game universe is fixed at 48 hours with a 12-hour in-play kickoff lookback. */
|
|
4453
4719
|
horizon_hours?: number;
|
|
@@ -4508,7 +4774,7 @@ export interface OperationQuery {
|
|
|
4508
4774
|
min_grade?: "S" | "A" | "B";
|
|
4509
4775
|
/** Maximum holders per page. Out-of-range values are clamped to 1..100. */
|
|
4510
4776
|
limit?: number;
|
|
4511
|
-
/** Opaque pagination cursor from the previous response's next_cursor. New cursors carry an absolute next offset bound to normalized condition_id, outcome and effective min_grade, so limit can change without skipping or repeating rows on the same roster. Different market/filter bindings return 400 bad_request with param=cursor; omitted filters match all/B and mkt_-prefixed IDs match their raw condition_id.
|
|
4777
|
+
/** Opaque pagination cursor from the previous response's next_cursor. New cursors carry an absolute next offset bound to normalized condition_id, outcome and effective min_grade, so limit can change without skipping or repeating rows on the same roster. Different market/filter bindings return 400 bad_request with param=cursor; omitted filters match all/B and mkt_-prefixed IDs match their raw condition_id. Page-only cursors from before 2026-10-02 are no longer accepted and return 400 bad_request with param=cursor; restart without a cursor. A cursor remains valid across roster refreshes, which can still repeat or skip holders as the live roster changes. */
|
|
4512
4778
|
cursor?: string;
|
|
4513
4779
|
};
|
|
4514
4780
|
getMarketIntel: {
|
|
@@ -4570,15 +4836,15 @@ export interface OperationQuery {
|
|
|
4570
4836
|
};
|
|
4571
4837
|
getSuspiciousTrade: Record<string, never>;
|
|
4572
4838
|
getTrader: {
|
|
4573
|
-
/** Backward-compatible alias for expand. Repeatable: strategy, categories, quant_metrics
|
|
4839
|
+
/** Backward-compatible alias for expand. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
|
|
4574
4840
|
"expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
4575
|
-
/** Include heavy fields and trust metadata. Repeatable: strategy, categories, quant_metrics
|
|
4841
|
+
/** Include heavy fields and trust metadata. Repeatable: strategy, categories, trust. quant_metrics is accepted and returns nothing since 2026-10-27. */
|
|
4576
4842
|
expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
4577
4843
|
/** 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. */
|
|
4578
4844
|
max_age_s?: number;
|
|
4579
4845
|
};
|
|
4580
4846
|
getTraderCategoryRecords: {
|
|
4581
|
-
/** Filter to one canonical category, matched through the same rollup every other category surface uses: soccer, EPL and champions league all reach Soccer, every esports label folds into Esports, and football is AMERICAN football and reaches Football. A filter that reaches Esports returns the Esports record with all of its games; a game is not a filter of its own, so ask for esports and read games. A
|
|
4847
|
+
/** Filter to one canonical category, matched through the same rollup every other category surface uses: soccer, EPL and champions league all reach Soccer, every esports label folds into Esports, and football is AMERICAN football and reaches Football. A filter that reaches Esports returns the Esports record with all of its games; a game is not a filter of its own, so ask for esports and read games. A sports or esports category the wallet has no record in answers 200 with an empty records array, never 404. Sports and esports only (#27311): a category outside them, or a value that reaches no category, returns 400 bad_request with param category and names the accepted buckets. */
|
|
4582
4848
|
category?: string;
|
|
4583
4849
|
};
|
|
4584
4850
|
getTraderContext: Record<string, never>;
|
|
@@ -4674,11 +4940,11 @@ export interface OperationQuery {
|
|
|
4674
4940
|
cursor?: string;
|
|
4675
4941
|
/** Minimum position value in USD. Raises the feed's own floor of 50,000 USD; a smaller value does not lower it. */
|
|
4676
4942
|
min_size?: number;
|
|
4677
|
-
/** 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. */
|
|
4943
|
+
/** 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. */
|
|
4678
4944
|
category?: string;
|
|
4679
|
-
/** Minimum trader grade. */
|
|
4945
|
+
/** 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. */
|
|
4680
4946
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
4681
|
-
/** 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 []. */
|
|
4947
|
+
/** 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). */
|
|
4682
4948
|
condition_id?: string;
|
|
4683
4949
|
};
|
|
4684
4950
|
listLargeTradeCounterpartyExecutions: {
|
|
@@ -4708,7 +4974,7 @@ export interface OperationQuery {
|
|
|
4708
4974
|
condition_id?: string;
|
|
4709
4975
|
/** Trader wallet address, timestamp-suffixed wallet alias, username, or trd_-prefixed trader ID, resolved against the traders table. Unknown traders return an empty list. */
|
|
4710
4976
|
trader?: string;
|
|
4711
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
4977
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4712
4978
|
category?: string;
|
|
4713
4979
|
/** Minimum trader grade as of today (trader.grade), not at trade time. On a historical window it selects wallets by a grade they may have earned after the trade; for a point-in-time rule filter on trader.grade_at_trade instead. A means S or A, B means S, A or B. */
|
|
4714
4980
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
@@ -4732,7 +4998,7 @@ export interface OperationQuery {
|
|
|
4732
4998
|
cursor?: string;
|
|
4733
4999
|
/** Minimum trade size in USD. */
|
|
4734
5000
|
min_size?: number;
|
|
4735
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
5001
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4736
5002
|
category?: string;
|
|
4737
5003
|
/** Minimum trader grade. */
|
|
4738
5004
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
@@ -4750,10 +5016,10 @@ export interface OperationQuery {
|
|
|
4750
5016
|
limit?: number;
|
|
4751
5017
|
/** 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; legacy, malformed, non-finite, and unsupported-version cursors are rejected. */
|
|
4752
5018
|
cursor?: string;
|
|
4753
|
-
/** Filter by category. Values are matched to canonical category buckets:
|
|
5019
|
+
/** 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. */
|
|
4754
5020
|
category?: string;
|
|
4755
|
-
/** Filter by observed trading style. Current styles: two_sided, category_focused, high_activity, diversified, mixed, unclassified. The
|
|
4756
|
-
strategy?: "
|
|
5021
|
+
/** 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. */
|
|
5022
|
+
strategy?: "category_focused" | "diversified" | "high_activity" | "mixed" | "two_sided" | "unclassified";
|
|
4757
5023
|
};
|
|
4758
5024
|
listPositions: {
|
|
4759
5025
|
/** Maximum number of current positions to return. Out-of-range values are clamped to 1..100. */
|
|
@@ -4764,9 +5030,9 @@ export interface OperationQuery {
|
|
|
4764
5030
|
consistency?: "live" | "snapshot";
|
|
4765
5031
|
/** Minimum current position value in USD. Defaults to 100 when omitted, or to 0 when wallet is present; send 0 to include every reconciled position. */
|
|
4766
5032
|
min_size?: number;
|
|
4767
|
-
/** Exact match against provider-backed market_canonical.category. */
|
|
5033
|
+
/** Exact match against provider-backed market_canonical.category. Sports and esports only (#27311): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4768
5034
|
category?: string;
|
|
4769
|
-
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id or a resolved market returns []. */
|
|
5035
|
+
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id or a resolved market returns []. A market outside sports and esports returns 404 not_found with error.reason=market_out_of_scope (#27311). Without condition_id the board and wallet reads list sports and esports markets only. */
|
|
4770
5036
|
condition_id?: string;
|
|
4771
5037
|
/** Scope to one wallet or a book of wallets (repeatable, up to 25 per request; comma-separated values inside one occurrence also work). Each value is a wallet address, a known username, or a trd_-prefixed trader id, resolved like /api/v1/trader/{address}. The response keeps the board's order and cursor, so pages of a book interleave wallets by current_value_usd. An address this API has never tracked returns its mirror rows or an empty list; a username or trader id that resolves to nothing is a 404 naming wallet; more than 25 values is a 400. min_size defaults to 0 when wallet is present. */
|
|
4772
5038
|
wallet?: string[];
|
|
@@ -4784,7 +5050,7 @@ export interface OperationQuery {
|
|
|
4784
5050
|
limit?: number;
|
|
4785
5051
|
/** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp, normalized effective filters, ranking and aggregate collection revisions, plus the last row's absolute net flow and condition_id. A changed filter or collection returns cursor_expired; request the first page again. */
|
|
4786
5052
|
cursor?: string;
|
|
4787
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
5053
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4788
5054
|
category?: string;
|
|
4789
5055
|
/** Filter by source platform. all is a request-side no-op. */
|
|
4790
5056
|
platform?: "polymarket" | "all";
|
|
@@ -4800,7 +5066,7 @@ export interface OperationQuery {
|
|
|
4800
5066
|
limit?: number;
|
|
4801
5067
|
/** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp, normalized effective filters, ranking and aggregate collection revisions, plus the last row's absolute net flow and condition_id. A changed filter or collection returns cursor_expired; request the first page again. */
|
|
4802
5068
|
cursor?: string;
|
|
4803
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
5069
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27306): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4804
5070
|
category?: string;
|
|
4805
5071
|
/** Filter by source platform. all is a request-side no-op. */
|
|
4806
5072
|
platform?: "polymarket" | "all";
|
|
@@ -4864,7 +5130,7 @@ export interface OperationQuery {
|
|
|
4864
5130
|
condition_id?: string;
|
|
4865
5131
|
/** Trader wallet address, timestamp-suffixed wallet alias, or username resolved against the traders table. Unknown traders return an empty list. */
|
|
4866
5132
|
trader?: string;
|
|
4867
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
5133
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4868
5134
|
category?: string;
|
|
4869
5135
|
/** Minimum trader grade. */
|
|
4870
5136
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
@@ -4888,7 +5154,7 @@ export interface OperationQuery {
|
|
|
4888
5154
|
cursor?: string;
|
|
4889
5155
|
/** Minimum trade size in USD. */
|
|
4890
5156
|
min_size?: number;
|
|
4891
|
-
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. */
|
|
5157
|
+
/** Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4892
5158
|
category?: string;
|
|
4893
5159
|
/** Minimum trader grade as of today (trader.grade). A means S or A, B means S, A or B. */
|
|
4894
5160
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
@@ -4921,7 +5187,7 @@ export interface OperationQuery {
|
|
|
4921
5187
|
cursor?: string;
|
|
4922
5188
|
/** Filter by market status. A market is closed once Polymarket has closed trading or it has resolved, and active otherwise; all returns both. */
|
|
4923
5189
|
status?: "active" | "closed" | "all";
|
|
4924
|
-
/** Filter by category. */
|
|
5190
|
+
/** Filter by category. Sports and esports only (#27411): a category outside them returns 400 bad_request with param category and names the accepted buckets. */
|
|
4925
5191
|
category?: string;
|
|
4926
5192
|
};
|
|
4927
5193
|
submitTraderExport: {
|
|
@@ -5186,10 +5452,10 @@ export interface OperationBody {
|
|
|
5186
5452
|
createMcpJsonRpcResponse: {
|
|
5187
5453
|
/** JSON-RPC protocol version; this server accepts 2.0. */
|
|
5188
5454
|
jsonrpc: "2.0";
|
|
5189
|
-
/** Request identifier echoed exactly in one JSON-RPC response;
|
|
5190
|
-
id?: string | number
|
|
5455
|
+
/** 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. */
|
|
5456
|
+
id?: string | number;
|
|
5191
5457
|
/** MCP method to invoke. */
|
|
5192
|
-
method: "initialize" | "notifications/initialized" | "notifications/cancelled" | "ping" | "tools/list" | "tools/call";
|
|
5458
|
+
method: "initialize" | "notifications/initialized" | "notifications/cancelled" | "ping" | "tools/list" | "tools/call" | "server/discover";
|
|
5193
5459
|
/** Method-specific MCP parameters. */
|
|
5194
5460
|
params?: Record<string, unknown>;
|
|
5195
5461
|
};
|