@0xinsider/mcp 2.1.0 → 2.4.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 +49 -17
- package/dist/catalog.generated.d.ts +42 -6
- package/dist/catalog.generated.d.ts.map +1 -1
- package/dist/catalog.generated.js +51 -6
- package/dist/catalog.generated.js.map +1 -1
- package/dist/cli-lib.d.ts +8 -0
- package/dist/cli-lib.d.ts.map +1 -1
- package/dist/cli-lib.js +123 -17
- package/dist/cli-lib.js.map +1 -1
- package/dist/client.d.ts +35 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +42 -4
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/product-cli/client.d.ts +3 -2
- package/dist/product-cli/client.d.ts.map +1 -1
- package/dist/product-cli/client.js.map +1 -1
- package/dist/product-cli/index.d.ts.map +1 -1
- package/dist/product-cli/index.js +3 -1
- package/dist/product-cli/index.js.map +1 -1
- package/dist/prompts/index.js +2 -2
- package/dist/sdk/client.d.ts +861 -136
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +924 -127
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/errors.d.ts +48 -4
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +123 -3
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/index.d.ts +40 -9
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +6 -4
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/pagination.d.ts +133 -15
- package/dist/sdk/pagination.d.ts.map +1 -1
- package/dist/sdk/pagination.js +132 -34
- package/dist/sdk/pagination.js.map +1 -1
- package/dist/sdk/retry.d.ts +68 -0
- package/dist/sdk/retry.d.ts.map +1 -0
- package/dist/sdk/retry.js +125 -0
- package/dist/sdk/retry.js.map +1 -0
- package/dist/sdk/schema.d.ts +2200 -688
- package/dist/sdk/schema.d.ts.map +1 -1
- package/dist/sdk/stream.d.ts +323 -8
- package/dist/sdk/stream.d.ts.map +1 -1
- package/dist/sdk/stream.js +582 -56
- package/dist/sdk/stream.js.map +1 -1
- package/dist/sdk/webhooks.d.ts +104 -12
- package/dist/sdk/webhooks.d.ts.map +1 -1
- package/dist/sdk/webhooks.js +22 -4
- package/dist/sdk/webhooks.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/explore-markets.d.ts.map +1 -1
- package/dist/tools/explore-markets.js +2 -5
- package/dist/tools/explore-markets.js.map +1 -1
- package/dist/tools/games.d.ts +5 -0
- package/dist/tools/games.d.ts.map +1 -0
- package/dist/tools/games.js +103 -0
- package/dist/tools/games.js.map +1 -0
- package/dist/tools/get-insider-radar.d.ts.map +1 -1
- package/dist/tools/get-insider-radar.js +11 -40
- package/dist/tools/get-insider-radar.js.map +1 -1
- package/dist/tools/get-large-positions.d.ts.map +1 -1
- package/dist/tools/get-large-positions.js +3 -10
- package/dist/tools/get-large-positions.js.map +1 -1
- package/dist/tools/get-leaderboard.d.ts.map +1 -1
- package/dist/tools/get-leaderboard.js +23 -12
- package/dist/tools/get-leaderboard.js.map +1 -1
- package/dist/tools/get-market-intel.d.ts.map +1 -1
- package/dist/tools/get-market-intel.js +3 -6
- package/dist/tools/get-market-intel.js.map +1 -1
- package/dist/tools/get-position-timeline.d.ts.map +1 -1
- package/dist/tools/get-position-timeline.js +3 -10
- package/dist/tools/get-position-timeline.js.map +1 -1
- package/dist/tools/get-positions.d.ts +2 -0
- package/dist/tools/get-positions.d.ts.map +1 -1
- package/dist/tools/get-positions.js +8 -11
- package/dist/tools/get-positions.js.map +1 -1
- package/dist/tools/get-suspicious-trades.d.ts +26 -0
- package/dist/tools/get-suspicious-trades.d.ts.map +1 -0
- package/dist/tools/get-suspicious-trades.js +91 -0
- package/dist/tools/get-suspicious-trades.js.map +1 -0
- package/dist/tools/get-trader-pnl.d.ts.map +1 -1
- package/dist/tools/get-trader-pnl.js +3 -6
- package/dist/tools/get-trader-pnl.js.map +1 -1
- package/dist/tools/get-trader.d.ts.map +1 -1
- package/dist/tools/get-trader.js +3 -6
- package/dist/tools/get-trader.js.map +1 -1
- package/dist/tools/get-trending-wallets.d.ts.map +1 -1
- package/dist/tools/get-trending-wallets.js +3 -10
- package/dist/tools/get-trending-wallets.js.map +1 -1
- package/dist/tools/get-whale-trades.d.ts +2 -0
- package/dist/tools/get-whale-trades.d.ts.map +1 -1
- package/dist/tools/get-whale-trades.js +21 -16
- package/dist/tools/get-whale-trades.js.map +1 -1
- package/dist/tools/pick-of-the-day.d.ts.map +1 -1
- package/dist/tools/pick-of-the-day.js +5 -21
- package/dist/tools/pick-of-the-day.js.map +1 -1
- package/dist/tools/read-parity.d.ts +8 -0
- package/dist/tools/read-parity.d.ts.map +1 -1
- package/dist/tools/read-parity.js +125 -77
- package/dist/tools/read-parity.js.map +1 -1
- package/dist/tools/result.d.ts +31 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +70 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/search-markets.d.ts.map +1 -1
- package/dist/tools/search-markets.js +16 -11
- package/dist/tools/search-markets.js.map +1 -1
- package/package.json +4 -4
package/dist/sdk/schema.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ export type AccountIdentity = {
|
|
|
4
4
|
user_id: number;
|
|
5
5
|
credential_id: number;
|
|
6
6
|
credential_kind: "api_key" | "oauth_grant";
|
|
7
|
+
/** The credential is currently valid; revoked, expired or unknown credentials are rejected. */
|
|
8
|
+
credential_status: "active";
|
|
9
|
+
entitlement: {
|
|
10
|
+
paid_data_access: "active" | "lapsed";
|
|
11
|
+
/** When paid data access is lapsed, the caller should renew the subscription; otherwise null. */
|
|
12
|
+
recovery_action: "renew_subscription" | null;
|
|
13
|
+
};
|
|
7
14
|
/** Approved OAuth scopes; null for full developer-key access. */
|
|
8
15
|
scopes: string[] | null;
|
|
9
16
|
};
|
|
@@ -18,7 +25,7 @@ export type AgentRegistration = {
|
|
|
18
25
|
environment: "sandbox";
|
|
19
26
|
created_at: string;
|
|
20
27
|
sandbox: {
|
|
21
|
-
/** The sandbox V1 base URL. Every documented operation answers here with example data. */
|
|
28
|
+
/** The sandbox V1 base URL. Every documented operation answers here with example data, except GET /api/v1/stream: a Server-Sent Events stream is a live connection rather than a body, so the sandbox answers it with 400. */
|
|
22
29
|
api_base_url: string;
|
|
23
30
|
/** A read to send with the key. */
|
|
24
31
|
first_request_url: string;
|
|
@@ -52,7 +59,7 @@ export type ApiDiscovery = {
|
|
|
52
59
|
openapi_url: string;
|
|
53
60
|
/** Unauthenticated API health endpoint. */
|
|
54
61
|
health_url: string;
|
|
55
|
-
authentication: "Bearer API key required for data endpoints; discovery (/api/v1), health, /api/v1/platforms, and the MCP handshake (initialize, ping, tools/list on /api/v1/mcp) are public. A 401 carries WWW-Authenticate with the resource_metadata URL.";
|
|
62
|
+
authentication: "Bearer API key required for data endpoints; discovery (/api/v1), health, /api/v1/platforms, the Pick of the Day commitment ledger (/api/v1/pick-of-the-day/ledger), and the MCP handshake (initialize, ping, tools/list on /api/v1/mcp) are public. A 401 carries WWW-Authenticate with the resource_metadata URL.";
|
|
56
63
|
/** RFC 9728 protected-resource metadata for the API origin: the document every V1 401 names in its WWW-Authenticate challenge (resource, bearer_methods_supported, resource_documentation). The remote MCP server has its own document at /.well-known/oauth-protected-resource/api/v1/mcp. */
|
|
57
64
|
protected_resource_metadata_url: string;
|
|
58
65
|
/** The complete authenticated route index: one entry per authenticated route this spec documents, in "<METHOD> <path>" form, not a representative subset. GET /api/v1 is the unauthenticated entrypoint an agent hits first, so it hands back the whole authenticated surface rather than a sample the caller would have to guess around. The example on GET /api/v1 is abridged for readability -- the live response returns all of them. Kept in lockstep with this spec by review: it is a hand-maintained const in backend/src/api_v1/discovery.rs and no automated check compares the two, so treat this spec as authoritative if they ever disagree. */
|
|
@@ -61,26 +68,28 @@ export type ApiDiscovery = {
|
|
|
61
68
|
export type ApiError = {
|
|
62
69
|
object: "error";
|
|
63
70
|
error: {
|
|
64
|
-
|
|
71
|
+
/** FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key. */
|
|
72
|
+
code: "bad_request" | "invalid_api_key" | "subscription_required" | "forbidden" | "insufficient_scope" | "not_found" | "account_locked" | "rate_limited" | "rate_limit_unavailable" | "internal_error" | "request_timeout";
|
|
65
73
|
message: string;
|
|
66
|
-
doc_url?: string
|
|
67
|
-
param?: string
|
|
74
|
+
doc_url?: string;
|
|
75
|
+
param?: string;
|
|
68
76
|
/** The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response. */
|
|
69
|
-
retry_at?: string
|
|
70
|
-
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is outside the HOT/WARM sync tiers -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. */
|
|
71
|
-
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" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive";
|
|
77
|
+
retry_at?: string;
|
|
78
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is outside the HOT/WARM sync tiers -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests Pro includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. */
|
|
79
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired";
|
|
72
80
|
};
|
|
73
81
|
meta: ResponseMeta;
|
|
74
82
|
};
|
|
75
83
|
export type ApiErrorBody = {
|
|
76
|
-
|
|
84
|
+
/** FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key. */
|
|
85
|
+
code: "bad_request" | "invalid_api_key" | "subscription_required" | "forbidden" | "insufficient_scope" | "not_found" | "account_locked" | "rate_limited" | "rate_limit_unavailable" | "internal_error" | "request_timeout";
|
|
77
86
|
message: string;
|
|
78
|
-
doc_url?: string
|
|
79
|
-
param?: string
|
|
80
|
-
/** The recommended next retry instant (RFC3339). Present on every retryable error (reason=pick_not_released, code=rate_limited, code=rate_limit_unavailable, reason=read_model_warming) and omitted otherwise. Always in the future. For pick_not_released: before the 11:00 UTC operating-window start, before a selected pick's stored release, or after a skipped day, it names the automatic system's next boundary. While no candidate exists in the live window it normally names the persisted next automatic selector attempt. Every value is advisory under supported operator actions: manual publication, release-time override, or admin generation can make a pick available first. When the automatic schedule is absent/due or a pick is overdue it degrades to ~60s. Schedule one request and do not poll. Prefer Retry-After for the duration because it is immune to client clock skew. */
|
|
81
|
-
retry_at?: string
|
|
82
|
-
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is outside the HOT/WARM sync tiers -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. */
|
|
83
|
-
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" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive";
|
|
87
|
+
doc_url?: string;
|
|
88
|
+
param?: string;
|
|
89
|
+
/** The recommended next retry instant (RFC3339). Present on every retryable error (reason=pick_not_released, code=rate_limited including reason=monthly_quota_exceeded, code=rate_limit_unavailable, reason=read_model_warming) and omitted otherwise. Always in the future. For pick_not_released: before the 11:00 UTC operating-window start, before a selected pick's stored release, or after a skipped day, it names the automatic system's next boundary. While no candidate exists in the live window it normally names the persisted next automatic selector attempt. Every value is advisory under supported operator actions: manual publication, release-time override, or admin generation can make a pick available first. When the automatic schedule is absent/due or a pick is overdue it degrades to ~60s. Schedule one request and do not poll. Prefer Retry-After for the duration because it is immune to client clock skew. */
|
|
90
|
+
retry_at?: string;
|
|
91
|
+
/** ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is outside the HOT/WARM sync tiers -- stop asking for this wallet. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. monthly_quota_exceeded: the account has used the requests Pro includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. */
|
|
92
|
+
reason?: "cursor_expired" | "unknown_endpoint" | "pick_not_released" | "trader_not_tracked" | "read_model_warming" | "database_unavailable" | "request_accounting_unavailable" | "idempotency_in_progress" | "webhook_delivery_in_progress" | "webhook_secret_rotation_not_prepared" | "webhook_secret_rotation_overlap_active" | "sandbox_api_key" | "api_key_in_query" | "subscription_inactive" | "monthly_quota_exceeded" | "invalid_query" | "unknown_query_parameter" | "invalid_path" | "invalid_body" | "unsupported_media_type" | "payload_too_large" | "method_not_allowed" | "ip_rate_limited" | "ip_throttled" | "export_expired";
|
|
84
93
|
};
|
|
85
94
|
export type BatchMarketIntelItem = {
|
|
86
95
|
/** Zero-based request index. Duplicate inputs keep separate result rows. */
|
|
@@ -98,6 +107,7 @@ export type BatchRateLimitMeta = {
|
|
|
98
107
|
reset: number;
|
|
99
108
|
};
|
|
100
109
|
export type BatchResponseMeta = {
|
|
110
|
+
/** 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. */
|
|
101
111
|
request_id: string;
|
|
102
112
|
cached: boolean;
|
|
103
113
|
total_items: number;
|
|
@@ -175,17 +185,17 @@ export type ContentSearchResult = {
|
|
|
175
185
|
};
|
|
176
186
|
export type CounterpartyAnalysis = {
|
|
177
187
|
status: "available" | "partial" | "unavailable";
|
|
178
|
-
unavailable_reason?: string
|
|
188
|
+
unavailable_reason?: string;
|
|
179
189
|
/** Deterministic immutable membership snapshot for this detail response. */
|
|
180
|
-
snapshot_id?: string
|
|
190
|
+
snapshot_id?: string;
|
|
181
191
|
/** Stable digest binding page cursors to one snapshot and execution set. */
|
|
182
|
-
analysis_id?: string
|
|
192
|
+
analysis_id?: string;
|
|
183
193
|
execution_count: number;
|
|
184
194
|
available_execution_count: number;
|
|
185
195
|
unavailable_execution_count: number;
|
|
186
196
|
executions: CounterpartyExecution[];
|
|
187
197
|
/** Stable cursor after the last execution included in the bounded inline page. */
|
|
188
|
-
executions_next_cursor?: string
|
|
198
|
+
executions_next_cursor?: string;
|
|
189
199
|
};
|
|
190
200
|
export type CounterpartyExecution = {
|
|
191
201
|
execution_id: string;
|
|
@@ -195,7 +205,7 @@ export type CounterpartyExecution = {
|
|
|
195
205
|
taker: CounterpartyParticipant;
|
|
196
206
|
makers: CounterpartyParticipant[];
|
|
197
207
|
/** Stable cursor after the last maker included in the bounded inline page. */
|
|
198
|
-
makers_next_cursor?: string
|
|
208
|
+
makers_next_cursor?: string;
|
|
199
209
|
};
|
|
200
210
|
export type CounterpartyMakerPage = {
|
|
201
211
|
analysis_id: string;
|
|
@@ -203,7 +213,7 @@ export type CounterpartyMakerPage = {
|
|
|
203
213
|
execution_id: string;
|
|
204
214
|
items: CounterpartyParticipant[];
|
|
205
215
|
/** Cursor bound to the analysis, execution, last full-denominator share total, and wallet. */
|
|
206
|
-
next_cursor?: string
|
|
216
|
+
next_cursor?: string;
|
|
207
217
|
};
|
|
208
218
|
export type CounterpartyMatchBreakdown = {
|
|
209
219
|
match_type: "COMPLEMENTARY" | "MINT" | "MERGE";
|
|
@@ -216,16 +226,16 @@ export type CounterpartyParticipant = {
|
|
|
216
226
|
/** Lowercase Polygon wallet from the exact OrderFilled log. */
|
|
217
227
|
execution_wallet: string;
|
|
218
228
|
identity_status: "resolved" | "infrastructure" | "unavailable";
|
|
219
|
-
resolved_user_id?: string
|
|
220
|
-
wallet_family?: string
|
|
221
|
-
resolution_block?: number
|
|
222
|
-
resolution_source?: string
|
|
223
|
-
display_name?: string
|
|
224
|
-
grade?: string
|
|
229
|
+
resolved_user_id?: string;
|
|
230
|
+
wallet_family?: string;
|
|
231
|
+
resolution_block?: number;
|
|
232
|
+
resolution_source?: string;
|
|
233
|
+
display_name?: string;
|
|
234
|
+
grade?: string;
|
|
225
235
|
/** Latest nonfuture recorded wallet-wide trade time for the tracked trader supplying this participant's grade. Omitted when unavailable; not the receipt time or the owner EOA's activity. Trader context is read with the response and is not frozen by execution membership snapshots. */
|
|
226
236
|
last_traded_at?: string;
|
|
227
237
|
/** 0xinsider profile path segment for this participant, present only when the execution wallet has a tracked trader: `@<username>` when that username resolves to the trader alone, otherwise the trader's lowercase wallet. Percent-encode the part after `@` and append to `https://0xinsider.com/profile/`. */
|
|
228
|
-
profile_segment?: string
|
|
238
|
+
profile_segment?: string;
|
|
229
239
|
maker_fill_count: number;
|
|
230
240
|
/** Exact decimal shares. */
|
|
231
241
|
filled_shares: string;
|
|
@@ -242,15 +252,29 @@ export type CreateWebhookRequest = {
|
|
|
242
252
|
event_types: WebhookEventType[];
|
|
243
253
|
};
|
|
244
254
|
export type EventReplayEvent = {
|
|
245
|
-
/** Opaque event
|
|
255
|
+
/** Opaque event identity: the ef_-encoded whale_alerts.id, stable across cursor formats. Deduplicate on this, never on cursor or sequence. */
|
|
246
256
|
id: string;
|
|
247
257
|
type: "whale_trades_inserted";
|
|
248
|
-
/** Cursor positioned at this event. */
|
|
258
|
+
/** Cursor positioned at this event: its (inserted_xid, id) commit-order position. Store the page's next_cursor to continue; this one resumes from exactly this event. */
|
|
249
259
|
cursor: string;
|
|
250
|
-
/**
|
|
260
|
+
/** whale_alerts.id of the event. Not monotonic across a replay: events arrive in commit order, so a lower id can follow a higher one when its write finished later. Order and resume by cursor, deduplicate by id. */
|
|
251
261
|
sequence: number;
|
|
252
262
|
published_at: string;
|
|
253
|
-
|
|
263
|
+
/** What the event announces. Every field is present on every event; a field added later is additive, so a client tolerates keys it does not know. */
|
|
264
|
+
payload: {
|
|
265
|
+
/** Whale trades this event announces. One event is minted per stored whale trade, so this is 1. */
|
|
266
|
+
count: number;
|
|
267
|
+
/** The raw whale_alerts.id of the trade, the same number as sequence. GET /api/v1/whale-trades/{id} accepts it and returns the trade with its wallet, grade, size, price and market. */
|
|
268
|
+
whale_alert_id: number;
|
|
269
|
+
/** The Polymarket condition id of the market the trade was in. */
|
|
270
|
+
condition_id: string;
|
|
271
|
+
/** 0xinsider's numeric id for the wallet's trader row. It is not the trd_ id, which is derived from the address; read the address and grade from the whale trade. */
|
|
272
|
+
trader_id: number;
|
|
273
|
+
/** Provider discriminator. Polymarket only. */
|
|
274
|
+
platform: "polymarket";
|
|
275
|
+
};
|
|
276
|
+
/** Present only with expand=trade: the base trade fields for this row, read at request time from one query per page. GET /api/v1/large-trades/{id} adds counterparty_analysis; replay does not include it. traded_at, side, size_usd, price, outcome, token_id, recorded_signal_score and trader.grade_at_trade with its status are the row's event-time facts; trader.grade, trader.username, signal_score, suspicion_score, suspicion_track and market title/slug/category are enrichment that can move after the event. null when that route would answer 404 for the row (its trader or market is not synced yet). */
|
|
277
|
+
trade?: LargeTrade | null;
|
|
254
278
|
source: EventReplaySource;
|
|
255
279
|
freshness: EventReplayFreshness;
|
|
256
280
|
};
|
|
@@ -259,18 +283,36 @@ export type EventReplayFreshness = {
|
|
|
259
283
|
observed_at: string;
|
|
260
284
|
};
|
|
261
285
|
export type EventReplayMeta = {
|
|
262
|
-
/** Unique request ID (req_ prefix). */
|
|
286
|
+
/** 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. */
|
|
263
287
|
request_id: string;
|
|
264
288
|
cached: boolean;
|
|
265
|
-
cache_age_s?: number
|
|
289
|
+
cache_age_s?: number;
|
|
266
290
|
/** Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price. */
|
|
267
291
|
cost: number;
|
|
268
292
|
replay: {
|
|
293
|
+
/** The request cursor in canonical form (an id-only cursor is re-encoded), or the zero position when omitted. */
|
|
269
294
|
from_cursor: string;
|
|
295
|
+
/** Identical to next_cursor. After a full page, the cursor of the last event; after a page that is not full, the commit horizon itself, since every row below it, matching or not, has been examined. An empty page therefore still advances. */
|
|
270
296
|
to_cursor: string;
|
|
297
|
+
/** whale_alerts.id component of the request cursor (0 when omitted). */
|
|
271
298
|
from_sequence: number;
|
|
299
|
+
/** whale_alerts.id of the last event on this page, or from_sequence when the page is empty. Can sit below the position next_cursor encodes after a page that is not full. */
|
|
272
300
|
to_sequence: number;
|
|
273
|
-
|
|
301
|
+
/** Events are ordered by the position at which their write became visible (whale_alerts.inserted_xid), then by whale_alerts.id, and a page is bounded by the oldest write transaction still open when it was read. Before 2026-09-22 this read whale_alerts_id_asc; that order could skip a late-committing lower id (#16180). */
|
|
302
|
+
ordering: "commit_visibility_then_id_asc";
|
|
303
|
+
/** True when committed whale-trade rows newer than this page's commit-visibility horizon exist. They are held until every older write transaction has finished and are served on a later request, so a caught_up page with this true is not the end of the stream: poll again. A long open write transaction on the database (a single-transaction backfill) is what keeps this true for more than a few seconds. */
|
|
304
|
+
pending_beyond_horizon: boolean;
|
|
305
|
+
/** The effective filter set this page ran with and next_cursor is bound to. Absent on an unfiltered walk. */
|
|
306
|
+
filters?: {
|
|
307
|
+
/** The trader parameter as given. */
|
|
308
|
+
trader?: string;
|
|
309
|
+
/** The raw provider condition id after mkt_ is stripped. */
|
|
310
|
+
condition_id?: string;
|
|
311
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
312
|
+
min_size?: number;
|
|
313
|
+
};
|
|
314
|
+
/** The expansions applied to every event on this page; empty when none. */
|
|
315
|
+
expand: "trade"[];
|
|
274
316
|
};
|
|
275
317
|
retention: {
|
|
276
318
|
status: "durable_database";
|
|
@@ -278,6 +320,7 @@ export type EventReplayMeta = {
|
|
|
278
320
|
cursor_expired: false;
|
|
279
321
|
};
|
|
280
322
|
completeness: {
|
|
323
|
+
/** complete: the page carries every durable event matching the filters after the cursor below the commit horizon, up to limit. caught_up: nothing matching after the cursor is visible below the horizon; read pending_beyond_horizon to tell an idle stream from held rows, and note next_cursor has still advanced to the horizon. */
|
|
281
324
|
status: "complete" | "caught_up";
|
|
282
325
|
reason: string;
|
|
283
326
|
};
|
|
@@ -302,13 +345,15 @@ export type ExploreGroup = {
|
|
|
302
345
|
type: "group";
|
|
303
346
|
event_slug: string;
|
|
304
347
|
parent_title: string;
|
|
305
|
-
image
|
|
306
|
-
platform
|
|
307
|
-
category
|
|
348
|
+
image: string | null;
|
|
349
|
+
platform: string | null;
|
|
350
|
+
category: string | null;
|
|
308
351
|
/** Markets in the event cluster, ranked by volume with condition_id as the tie-breaker. The selected representative is retained within the 12-market cap. */
|
|
309
352
|
markets: ExploreMarket[];
|
|
310
|
-
rep_volume
|
|
311
|
-
rep_whales
|
|
353
|
+
rep_volume: number | null;
|
|
354
|
+
/** Canonical key since #16304; rep_whales is its deprecated spelling, emitted beside it with the same value. */
|
|
355
|
+
rep_large_trades: number | null;
|
|
356
|
+
rep_whales: number | null;
|
|
312
357
|
};
|
|
313
358
|
export type ExploreMarket = {
|
|
314
359
|
id: string;
|
|
@@ -316,57 +361,67 @@ export type ExploreMarket = {
|
|
|
316
361
|
/** Non-empty market title. */
|
|
317
362
|
title: string;
|
|
318
363
|
/** Provider-native market slug. */
|
|
319
|
-
slug
|
|
364
|
+
slug: string | null;
|
|
320
365
|
/** First-party market page slug used for internal links. */
|
|
321
|
-
url_slug
|
|
322
|
-
image
|
|
323
|
-
icon
|
|
324
|
-
category
|
|
325
|
-
platform
|
|
366
|
+
url_slug: string | null;
|
|
367
|
+
image: string | null;
|
|
368
|
+
icon: string | null;
|
|
369
|
+
category: string | null;
|
|
370
|
+
platform: string | null;
|
|
326
371
|
status: "active" | "closed";
|
|
327
|
-
volume
|
|
328
|
-
liquidity
|
|
329
|
-
whale_trade_count
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
372
|
+
volume: number | null;
|
|
373
|
+
liquidity: number | null;
|
|
374
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
375
|
+
large_trade_count: number | null;
|
|
376
|
+
whale_trade_count: number | null;
|
|
377
|
+
/** Canonical key since #16304; whale_distinct_wallets is its deprecated spelling, emitted beside it with the same value. */
|
|
378
|
+
large_trade_distinct_wallets: number | null;
|
|
379
|
+
whale_distinct_wallets: number | null;
|
|
380
|
+
/** Canonical key since #16304; whale_total_usd is its deprecated spelling, emitted beside it with the same value. */
|
|
381
|
+
large_trade_total_usd: number | null;
|
|
382
|
+
whale_total_usd: number | null;
|
|
383
|
+
/** Canonical key since #16304; whale_last_trade_at is its deprecated spelling, emitted beside it with the same value. */
|
|
384
|
+
large_trade_last_at: string | null;
|
|
385
|
+
whale_last_trade_at: string | null;
|
|
386
|
+
end_date: string | null;
|
|
387
|
+
created_at: string | null;
|
|
388
|
+
outcome_yes: string | null;
|
|
336
389
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the YES outcome; null when unavailable (e.g. unsynced markets). */
|
|
337
|
-
token_id_yes
|
|
338
|
-
outcome_no
|
|
390
|
+
token_id_yes: string | null;
|
|
391
|
+
outcome_no: string | null;
|
|
339
392
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the NO outcome; null when unavailable (e.g. unsynced markets). */
|
|
340
|
-
token_id_no
|
|
341
|
-
event_slug
|
|
342
|
-
smart_score
|
|
343
|
-
smart_count
|
|
344
|
-
smart_label
|
|
393
|
+
token_id_no: string | null;
|
|
394
|
+
event_slug: string | null;
|
|
395
|
+
smart_score: number | null;
|
|
396
|
+
smart_count: number | null;
|
|
397
|
+
smart_label: string | null;
|
|
345
398
|
/** Display label for the YES/outcome_index=0 side, enriched from provider outcome metadata when available. */
|
|
346
|
-
outcome_yes_label
|
|
399
|
+
outcome_yes_label: string | null;
|
|
347
400
|
/** Display label for the NO/outcome_index=1 side, enriched from provider outcome metadata when available. */
|
|
348
|
-
outcome_no_label
|
|
401
|
+
outcome_no_label: string | null;
|
|
349
402
|
/** Provider-owned YES/outcome_index=0 identifier when available for trade-ticket wiring. */
|
|
350
|
-
outcome_yes_provider_id
|
|
403
|
+
outcome_yes_provider_id: number | null;
|
|
351
404
|
/** Provider-owned NO/outcome_index=1 identifier when available for trade-ticket wiring. */
|
|
352
|
-
outcome_no_provider_id
|
|
353
|
-
open_interest
|
|
354
|
-
oi_change_pct
|
|
355
|
-
price_points
|
|
356
|
-
no_price_points
|
|
357
|
-
last_price
|
|
358
|
-
no_last_price
|
|
359
|
-
change_pct_24h
|
|
360
|
-
no_change_pct_24h
|
|
405
|
+
outcome_no_provider_id: number | null;
|
|
406
|
+
open_interest: number | null;
|
|
407
|
+
oi_change_pct: number | null;
|
|
408
|
+
price_points: number[][] | null;
|
|
409
|
+
no_price_points: number[][] | null;
|
|
410
|
+
last_price: number | null;
|
|
411
|
+
no_last_price: number | null;
|
|
412
|
+
change_pct_24h: number | null;
|
|
413
|
+
no_change_pct_24h: number | null;
|
|
361
414
|
/** Backend-owned deterministic market discovery score used by the hot sort. */
|
|
362
|
-
discover_score
|
|
415
|
+
discover_score: number | null;
|
|
363
416
|
score_components?: {
|
|
364
|
-
volume_signal
|
|
365
|
-
whale_signal
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
417
|
+
volume_signal: number | null;
|
|
418
|
+
/** Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
419
|
+
large_trade_signal: number | null;
|
|
420
|
+
whale_signal: number | null;
|
|
421
|
+
liquidity_signal: number | null;
|
|
422
|
+
recency_signal: number | null;
|
|
423
|
+
smart_money_signal: number | null;
|
|
424
|
+
price_move_signal: number | null;
|
|
370
425
|
missing_price_penalty: number;
|
|
371
426
|
};
|
|
372
427
|
freshness?: {
|
|
@@ -390,18 +445,137 @@ export type ExportCounts = {
|
|
|
390
445
|
estimated_size_mb: number;
|
|
391
446
|
};
|
|
392
447
|
export type ExportSourceRange = {
|
|
393
|
-
first_pnl_date
|
|
394
|
-
last_pnl_date
|
|
395
|
-
latest_trade_at
|
|
396
|
-
latest_market_activity_at
|
|
448
|
+
first_pnl_date: string | null;
|
|
449
|
+
last_pnl_date: string | null;
|
|
450
|
+
latest_trade_at: string | null;
|
|
451
|
+
latest_market_activity_at: string | null;
|
|
397
452
|
};
|
|
398
453
|
export type ExportVolumeReconciliation = {
|
|
399
454
|
/** Verified full-history both-sides USD cash volume. Null without coverage; the local activity numerator may cover only a subset of history. */
|
|
400
|
-
provider_lifetime_volume
|
|
455
|
+
provider_lifetime_volume: number | null;
|
|
401
456
|
exported_activity_volume: number;
|
|
402
457
|
exported_market_cost_basis: number;
|
|
403
|
-
provider_activity_volume_gap
|
|
404
|
-
activity_volume_coverage
|
|
458
|
+
provider_activity_volume_gap: number | null;
|
|
459
|
+
activity_volume_coverage: number | null;
|
|
460
|
+
};
|
|
461
|
+
/** One sports or esports game: both sides, its schedule, its provider status and the Polymarket markets linked to it. Assembled from the same provider-first live and upcoming projections the site's boards use, with no request-time provider fan-out. */
|
|
462
|
+
export type Game = {
|
|
463
|
+
object: "game";
|
|
464
|
+
/** The game's identity, for example mlb-mil-cin-2026-06-22. The same key the live_sports_updated webhook pulse carries and the same key /api/v1/games/{event_slug} takes. */
|
|
465
|
+
event_slug: string;
|
|
466
|
+
/** The provider's Gamma gameId, as a string. Omitted when the canonical owner has no single value for this slug: the provider stamps one gameId across an event's derivative siblings, so an ambiguous read is reported as unknown rather than guessed. */
|
|
467
|
+
game_id?: string;
|
|
468
|
+
/** The canonical sport bucket, for example Soccer or Table Tennis. Omitted when neither the board scope nor the provider category names one. */
|
|
469
|
+
sport?: string;
|
|
470
|
+
/** The league tag, for example nfl or epl. Omitted for a sport served as one whole bucket with no league scope. */
|
|
471
|
+
league?: string;
|
|
472
|
+
/** The provider's event title. Omitted when the provider sent none. */
|
|
473
|
+
title?: string;
|
|
474
|
+
/** Kickoff in UTC, as the provider supplied it. Omitted when the provider published none; coverage.schedule then reads unavailable. */
|
|
475
|
+
scheduled_at?: string;
|
|
476
|
+
status: GameStatus;
|
|
477
|
+
/** Both sides, in the provider's own order. For a team league the provider lists the home side first. Empty when the provider identified neither side. */
|
|
478
|
+
competitors: GameCompetitor[];
|
|
479
|
+
/** The esports series length, for example Bo3. Omitted for everything else. */
|
|
480
|
+
series_format?: string;
|
|
481
|
+
/** Whether one of this game's markets pays on a draw. Read this instead of assuming a two-outcome moneyline. */
|
|
482
|
+
draw_offered: boolean;
|
|
483
|
+
/** Every market this read linked to the game, ordered by condition_id. */
|
|
484
|
+
markets: GameMarket[];
|
|
485
|
+
freshness: GameFreshness;
|
|
486
|
+
coverage: GameCoverage;
|
|
487
|
+
/** The game's page on 0xinsider. */
|
|
488
|
+
url: string;
|
|
489
|
+
};
|
|
490
|
+
/** One side of the game. */
|
|
491
|
+
export type GameCompetitor = {
|
|
492
|
+
/** The competitor's name as the provider gives it. */
|
|
493
|
+
name: string;
|
|
494
|
+
/** The provider's league-scoped competitor id, as a string. Omitted when the provider has not identified this side; coverage.competitors then reads labels. */
|
|
495
|
+
provider_id?: string;
|
|
496
|
+
/** Provider crest or logo URL. Omitted when there is none. */
|
|
497
|
+
logo?: string;
|
|
498
|
+
/** The provider's score for this side, verbatim. A string because the provider sends one: a set score, a map score and a run total are not all integers. Omitted when no live-score frame carries a score. */
|
|
499
|
+
score?: string;
|
|
500
|
+
/** The provider's season record for this side, for example 12-4. Omitted when the provider sent none. */
|
|
501
|
+
record?: string;
|
|
502
|
+
};
|
|
503
|
+
/** What this game's read actually supplied, so a client branches on coverage instead of on a missing key. */
|
|
504
|
+
export type GameCoverage = {
|
|
505
|
+
/** available when a live-score frame supplied this game's scores. */
|
|
506
|
+
scores: "available" | "unavailable";
|
|
507
|
+
/** provider_ids when every side carries a provider id, labels when only the provider's names identify them, unavailable when neither exists. Do not join on names when this reads labels. */
|
|
508
|
+
competitors: "provider_ids" | "labels" | "unavailable";
|
|
509
|
+
/** available when the provider supplied a kickoff. */
|
|
510
|
+
schedule: "available" | "unavailable";
|
|
511
|
+
};
|
|
512
|
+
/** How current this game's facts are. Independent per source: the board half that produced the game, and the live-score frame that produced its scores. */
|
|
513
|
+
export type GameFreshness = {
|
|
514
|
+
/** Which board half produced this game. */
|
|
515
|
+
source: "live" | "upcoming";
|
|
516
|
+
/** Whether that half returned a truthful source body for this read. */
|
|
517
|
+
source_status: "ok" | "unavailable";
|
|
518
|
+
/** Whether that half had a source body at all. not_applicable means the sport has no configured source for that half. */
|
|
519
|
+
source_availability: "available" | "unavailable" | "not_applicable";
|
|
520
|
+
/** Freshness of the cached source body, never inferred from the response clock or the row count. */
|
|
521
|
+
source_freshness: "fresh" | "stale" | "unknown" | "not_applicable";
|
|
522
|
+
/** The source body's data vintage. Omitted when the read has no vintage anchor, which is not age zero. */
|
|
523
|
+
source_observed_at?: string;
|
|
524
|
+
/** Age of source_observed_at in seconds, capped at 600. Omitted past the cap or with no anchor. */
|
|
525
|
+
source_age_seconds?: number;
|
|
526
|
+
/** Whether a reader should be told these rows are behind. This applies the half's own servable-age bar (15 s live, 120 s upcoming), which is not the same as source_freshness: a live board whose scores are seconds old reads stale for about half of every publish cycle and is not delayed. */
|
|
527
|
+
delayed: boolean;
|
|
528
|
+
/** When this game's live-score frame was observed. Omitted when there is no frame. */
|
|
529
|
+
scores_observed_at?: string;
|
|
530
|
+
/** The provider's own frame clock. Omitted when the frame carries none. */
|
|
531
|
+
scores_source_at?: string;
|
|
532
|
+
};
|
|
533
|
+
/** One Polymarket market linked to this game. */
|
|
534
|
+
export type GameMarket = {
|
|
535
|
+
/** The mkt_-prefixed market id every other V1 response uses. */
|
|
536
|
+
id: string;
|
|
537
|
+
/** The raw provider condition id. */
|
|
538
|
+
condition_id: string;
|
|
539
|
+
/** Always polymarket. */
|
|
540
|
+
platform: string;
|
|
541
|
+
/** The provider's market slug. Omitted when the provider sent none. */
|
|
542
|
+
slug?: string;
|
|
543
|
+
/** The provider's own market type, for example moneyline or spread. Omitted when the provider sent none. Not an enum: the provider owns this vocabulary and adds to it. */
|
|
544
|
+
sports_market_type?: string;
|
|
545
|
+
/** Which side of the game this market's YES leg pays. draw is a real value: a 1X2 market's third leg is not a competitor. Omitted when the provider ids do not classify the leg, which is not the same as other. */
|
|
546
|
+
side?: "home" | "away" | "draw" | "other";
|
|
547
|
+
/** The provider's label for the YES outcome. Omitted when the provider sent none. */
|
|
548
|
+
outcome_yes?: string;
|
|
549
|
+
/** The provider's label for the NO outcome. Omitted when the provider sent none. */
|
|
550
|
+
outcome_no?: string;
|
|
551
|
+
/** Polymarket CLOB token ids in the provider's own outcome-index order. Omitted when the provider has published none for this market. */
|
|
552
|
+
outcome_token_ids?: string[];
|
|
553
|
+
};
|
|
554
|
+
/** What this deployment covers, published with every page so a client never has to guess whether an empty list means no games or no coverage. */
|
|
555
|
+
export type GamesCoverage = {
|
|
556
|
+
/** Canonical sport buckets served, sorted. */
|
|
557
|
+
sports: string[];
|
|
558
|
+
/** League tags served, sorted. */
|
|
559
|
+
leagues: string[];
|
|
560
|
+
/** Scopes whose source half was unavailable for this read, as <sport>:<half>. Empty means every scope answered. */
|
|
561
|
+
sources_unavailable: string[];
|
|
562
|
+
};
|
|
563
|
+
/** 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. */
|
|
564
|
+
export type GameStatus = {
|
|
565
|
+
/** 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. */
|
|
566
|
+
state: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
567
|
+
/** 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. */
|
|
568
|
+
match_status?: "scheduled" | "in_progress" | "halftime" | "penalty_shootout" | "delayed" | "suspended" | "final" | "final_overtime" | "final_shootout" | "awarded" | "forfeit" | "not_necessary" | "postponed" | "cancelled" | "unknown";
|
|
569
|
+
/** The provider's status string, verbatim. Omitted when the provider sent none. */
|
|
570
|
+
provider_status?: string;
|
|
571
|
+
/** The provider's period label, for example Q3, End Q2 or T5. Omitted when the provider sent none. */
|
|
572
|
+
period?: string;
|
|
573
|
+
/** The game clock as the provider spells it, never reformatted. Omitted when the provider sent none. */
|
|
574
|
+
clock?: string;
|
|
575
|
+
/** The provider's own in-play flag. Omitted when no live-score frame exists, which is not the same as false. */
|
|
576
|
+
live?: boolean;
|
|
577
|
+
/** Whether the game is over. Always present. */
|
|
578
|
+
ended: boolean;
|
|
405
579
|
};
|
|
406
580
|
/** Current category evidence, independent of the global grade. Pick of the Day stamps only the served display roster; frozen entry snapshots remain unchanged. */
|
|
407
581
|
export type HolderCategoryEvidence = {
|
|
@@ -414,7 +588,7 @@ export type LargeExportPolicy = {
|
|
|
414
588
|
current_internal_route: string;
|
|
415
589
|
/** Programmatic API-key-gated export routes (submit/status/download) and supported formats (json, ndjson, csv). */
|
|
416
590
|
v1_async: {
|
|
417
|
-
/** POST route template to submit an export job. */
|
|
591
|
+
/** POST route template to submit an export job. fresh=true asks for a snapshot read after the submit instead of reusing a finished one. */
|
|
418
592
|
submit_route?: string;
|
|
419
593
|
/** GET route template to poll job status. */
|
|
420
594
|
status_route?: string;
|
|
@@ -423,7 +597,7 @@ export type LargeExportPolicy = {
|
|
|
423
597
|
/** Supported ?format= values. */
|
|
424
598
|
formats?: ("json" | "ndjson" | "csv")[];
|
|
425
599
|
/** Possible job status values. */
|
|
426
|
-
status_values?: ("queued" | "running" | "ready" | "failed")[];
|
|
600
|
+
status_values?: ("queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired")[];
|
|
427
601
|
/** How long a finished export is retained before expiry. */
|
|
428
602
|
retention?: string;
|
|
429
603
|
};
|
|
@@ -436,14 +610,14 @@ export type LargePosition = {
|
|
|
436
610
|
id: string;
|
|
437
611
|
/** Provider discriminator. Always polymarket. */
|
|
438
612
|
platform: "polymarket";
|
|
439
|
-
/** Provider currentValue in USD for the outcome named by outcome_label / token_id, and for that outcome only.
|
|
440
|
-
total_size_usd?: number
|
|
441
|
-
/** Provider unrealized mark-to-market P&L (Polymarket cashPnl) for that same one outcome.
|
|
442
|
-
position_unrealized_pnl?: number
|
|
613
|
+
/** Provider currentValue in USD for the outcome named by outcome_label / token_id, and for that outcome only. An absent key means the provider supplied no value for this leg, not a zero position. combined_value_usd carries the wallet's whole-market total. */
|
|
614
|
+
total_size_usd?: number;
|
|
615
|
+
/** Provider unrealized mark-to-market P&L (Polymarket cashPnl) for that same one outcome. An absent key means unavailable, not break-even. */
|
|
616
|
+
position_unrealized_pnl?: number;
|
|
443
617
|
/** The wallet's currentValue across every outcome it holds in this market. Equals total_size_usd unless is_two_sided is true, and is the value the feed ranked this row by. */
|
|
444
|
-
combined_value_usd?: number
|
|
618
|
+
combined_value_usd?: number;
|
|
445
619
|
/** The wallet's unrealized P&L across every outcome it holds in this market. Equals position_unrealized_pnl unless is_two_sided is true. */
|
|
446
|
-
combined_unrealized_pnl?: number
|
|
620
|
+
combined_unrealized_pnl?: number;
|
|
447
621
|
/** Whether the wallet holds shares on both outcomes of this market. */
|
|
448
622
|
is_two_sided: boolean;
|
|
449
623
|
/** Every outcome the wallet holds, primary first. holdings[0] restates the top-level per-outcome fields; a further entry is a leg those fields do not describe. No amount here is a share-proportional slice of a both-sides total. */
|
|
@@ -451,76 +625,138 @@ export type LargePosition = {
|
|
|
451
625
|
/** 0 = Yes, 1 = No. */
|
|
452
626
|
outcome_index: number;
|
|
453
627
|
/** The market's label for this outcome. */
|
|
454
|
-
outcome_label?: string
|
|
628
|
+
outcome_label?: string;
|
|
455
629
|
/** Polymarket CLOB token id for this outcome; null for an unsynced market. */
|
|
456
630
|
token_id: string | null;
|
|
457
631
|
/** Shares held on this outcome. */
|
|
458
632
|
share_count: number;
|
|
459
633
|
/** Provider average entry price for this outcome. */
|
|
460
|
-
avg_entry_price?: number
|
|
634
|
+
avg_entry_price?: number;
|
|
461
635
|
/** Provider mark price for this outcome. */
|
|
462
|
-
current_price?: number
|
|
463
|
-
/** Provider currentValue for this outcome.
|
|
464
|
-
value_usd?: number
|
|
465
|
-
/** Provider unrealized P&L for this outcome.
|
|
466
|
-
unrealized_pnl?: number
|
|
636
|
+
current_price?: number;
|
|
637
|
+
/** Provider currentValue for this outcome. An absent key means unavailable, not zero. */
|
|
638
|
+
value_usd?: number;
|
|
639
|
+
/** Provider unrealized P&L for this outcome. An absent key means unavailable, not break-even. */
|
|
640
|
+
unrealized_pnl?: number;
|
|
467
641
|
})[];
|
|
468
642
|
/** Live share count for this position. */
|
|
469
643
|
share_count: number;
|
|
470
644
|
/** Volume-weighted entry price. */
|
|
471
|
-
avg_entry_price?: number
|
|
645
|
+
avg_entry_price?: number;
|
|
472
646
|
/** Latest provider mark price for the position's token. */
|
|
473
|
-
current_price?: number
|
|
647
|
+
current_price?: number;
|
|
474
648
|
/** Backend-resolved outcome label (provider outcome, else Yes/No from the binary index). */
|
|
475
|
-
outcome_label?: string
|
|
649
|
+
outcome_label?: string;
|
|
476
650
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
477
|
-
token_id
|
|
651
|
+
token_id: string | null;
|
|
478
652
|
/** Legs collapsed into this representative row for one (wallet, event, outcome side) group. 1 means standalone. */
|
|
479
653
|
event_leg_count: number;
|
|
480
|
-
/** Sum of the collapsed sibling legs' own holding values for this (wallet, event) group; equals total_size_usd when event_leg_count = 1, and
|
|
481
|
-
event_total_value_usd?: number
|
|
654
|
+
/** Sum of the collapsed sibling legs' own holding values for this (wallet, event) group; equals total_size_usd when event_leg_count = 1, and omitted when any member's value is unknown. */
|
|
655
|
+
event_total_value_usd?: number;
|
|
482
656
|
first_seen_at: string;
|
|
483
657
|
last_updated_at: string;
|
|
484
658
|
trader: {
|
|
485
659
|
/** Prefixed ID (`trd_...`). */
|
|
486
660
|
id: string;
|
|
487
661
|
address: string;
|
|
488
|
-
username?: string
|
|
662
|
+
username?: string;
|
|
489
663
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
490
|
-
win_rate?: number
|
|
664
|
+
win_rate?: number;
|
|
491
665
|
/** Trader lifetime realized P&L across all markets. */
|
|
492
|
-
pnl?: number
|
|
493
|
-
markets_traded?: number
|
|
666
|
+
pnl?: number;
|
|
667
|
+
markets_traded?: number;
|
|
494
668
|
};
|
|
495
669
|
market: {
|
|
496
670
|
/** Prefixed ID (`mkt_...`). */
|
|
497
671
|
id: string;
|
|
498
672
|
condition_id: string;
|
|
499
|
-
title?: string
|
|
500
|
-
slug?: string
|
|
501
|
-
event_slug?: string
|
|
502
|
-
category?: string
|
|
673
|
+
title?: string;
|
|
674
|
+
slug?: string;
|
|
675
|
+
event_slug?: string;
|
|
676
|
+
category?: string;
|
|
677
|
+
};
|
|
678
|
+
};
|
|
679
|
+
export type LargeTrade = {
|
|
680
|
+
/** Prefixed ID (wt_...). */
|
|
681
|
+
id: string;
|
|
682
|
+
traded_at: string;
|
|
683
|
+
size_usd: number;
|
|
684
|
+
side: "BUY" | "SELL";
|
|
685
|
+
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, whose stored outcome_index is not trusted (a defaulted 0 for about a third of those rows; the side is unknown, not defaulted). */
|
|
686
|
+
outcome: string | null;
|
|
687
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
|
|
688
|
+
token_id: string | null;
|
|
689
|
+
price: number;
|
|
690
|
+
/** Current 0.0–1.0 normalized signal score, computed at request time from the trader's win rate today and the trade's age now. On a historical row it is today's view of the trade, not what a reader saw then; use recorded_signal_score for that. */
|
|
691
|
+
signal_score: number;
|
|
692
|
+
/** 0.0–1.0 signal score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. */
|
|
693
|
+
recorded_signal_score: number | null;
|
|
694
|
+
/** Persisted live suspicion score from the scorer. Null when the row has no persisted score. */
|
|
695
|
+
suspicion_score: number | null;
|
|
696
|
+
/** Persisted scorer track. Null when a legacy row has no stored track label. */
|
|
697
|
+
suspicion_track: "whale" | "fresh_conviction" | "sliced_position" | null;
|
|
698
|
+
/** This fill's size relative to its market: size_usd divided by a market volume figure recorded at or after the trade, so the value always falls between 0 and 1 inclusive. A $10,000 fill is 0.00005 of a $200M market and 0.125 of an $80,000 one, which size_usd alone cannot distinguish. Absent when no volume figure recorded at or after the trade is available; never 0 as a stand-in and never capped at 1, because a denominator we cannot trust publishes nothing rather than a trimmed number. A market's volume keeps growing, so the same trade reports a smaller share as the market trades on. */
|
|
699
|
+
market_volume_share?: number;
|
|
700
|
+
trader: {
|
|
701
|
+
id: string;
|
|
702
|
+
address: string;
|
|
703
|
+
username?: string;
|
|
704
|
+
/** The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade. */
|
|
705
|
+
grade?: string;
|
|
706
|
+
/** 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. */
|
|
707
|
+
grade_at_trade: "S" | "A" | "B" | "C" | "D" | "F" | null;
|
|
708
|
+
/** 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. */
|
|
709
|
+
grade_at_trade_status: "graded" | "ungraded" | "unknown";
|
|
710
|
+
};
|
|
711
|
+
market: {
|
|
712
|
+
id: string;
|
|
713
|
+
condition_id: string;
|
|
714
|
+
title: string;
|
|
715
|
+
slug?: string;
|
|
716
|
+
/** Provider-backed market_canonical category. */
|
|
717
|
+
category?: string;
|
|
718
|
+
};
|
|
719
|
+
};
|
|
720
|
+
export type LargeTradeDetail = LargeTrade & {
|
|
721
|
+
counterparty_analysis: CounterpartyAnalysis;
|
|
722
|
+
};
|
|
723
|
+
export type LargeTradeHistoryMeta = {
|
|
724
|
+
/** 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. */
|
|
725
|
+
request_id: string;
|
|
726
|
+
cached: boolean;
|
|
727
|
+
/** Cache age in seconds; the key is absent when the response was not cached. */
|
|
728
|
+
cache_age_s?: number;
|
|
729
|
+
source: {
|
|
730
|
+
kind: "local_replay";
|
|
731
|
+
table: "whale_alerts";
|
|
732
|
+
provider_fetch_at_request_time: false;
|
|
733
|
+
};
|
|
734
|
+
completeness: {
|
|
735
|
+
status: "best_effort";
|
|
736
|
+
/** Explains that local replay completeness can vary by market and time window. */
|
|
737
|
+
reason: string;
|
|
503
738
|
};
|
|
504
739
|
};
|
|
505
740
|
export type LeaderboardEntry = {
|
|
506
741
|
id: string;
|
|
507
742
|
address: string;
|
|
508
|
-
username?: string
|
|
509
|
-
grade?: string
|
|
510
|
-
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade.
|
|
743
|
+
username?: string;
|
|
744
|
+
grade?: string;
|
|
745
|
+
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
|
|
511
746
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
512
|
-
score?: number
|
|
747
|
+
score?: number;
|
|
513
748
|
/** All-time P&L in USD (total_pnl), including unrealized open positions. Kept for back-compat; prefer realized_pnl for the banked figure. */
|
|
514
|
-
pnl?: number
|
|
749
|
+
pnl?: number;
|
|
515
750
|
/** Native realized P&L plus credited maker and taker rebates in USD, with fees already included. The exact numeric value is truncated toward zero to cents before JSON conversion. Wallets without a native snapshot retain their historical stored realized P&L. Omitted when the native snapshot has no net realized value. */
|
|
516
|
-
realized_pnl?: number
|
|
751
|
+
realized_pnl?: number;
|
|
517
752
|
/** Full-history both-sides USD cash volume from a verified Polymarket user-volume observation. Omitted without coverage. */
|
|
518
|
-
volume?: number
|
|
519
|
-
markets_traded?: number
|
|
520
|
-
|
|
521
|
-
|
|
753
|
+
volume?: number;
|
|
754
|
+
markets_traded?: number;
|
|
755
|
+
/** The wallet's win rate across ALL categories, not the filtered one. ?category= decides WHICH wallets are listed (the wallet must be ranked in that category); it does not rescope this field, so a soccer-filtered list still reports each wallet's overall rate. For a per-category record use GET /api/v1/trader/{address}/categories. */
|
|
756
|
+
win_rate?: number;
|
|
757
|
+
strategy_type?: string;
|
|
522
758
|
platform: string;
|
|
523
|
-
last_active?: string
|
|
759
|
+
last_active?: string;
|
|
524
760
|
};
|
|
525
761
|
/** Provider-first bucketed OHLC price candles for a market's outcome tokens, derived from the stored token_price_snapshots series (covers open and resolved markets). */
|
|
526
762
|
export type MarketCandles = {
|
|
@@ -531,54 +767,157 @@ export type MarketCandles = {
|
|
|
531
767
|
/** One entry per present provider token (YES first, then NO); empty when no tokens have been fetched yet. */
|
|
532
768
|
outcomes: OutcomeCandles[];
|
|
533
769
|
};
|
|
770
|
+
export type MarketHolder = {
|
|
771
|
+
/** Composite `pos_<wallet>:<condition_id>:<outcome_index>`, the same id `GET /api/v1/positions` gives this leg. */
|
|
772
|
+
id: string;
|
|
773
|
+
/** `trd_`-prefixed trader id, accepted by `GET /api/v1/trader/{address}`. */
|
|
774
|
+
trader_id: string;
|
|
775
|
+
/** Lowercased proxy wallet. */
|
|
776
|
+
address: string;
|
|
777
|
+
/** Polymarket's public display name from the same holder snapshot; null for a private wallet, which the provider redacts at the source. */
|
|
778
|
+
name: string | null;
|
|
779
|
+
/** The outcome this wallet nets to. A wallet holding both outcomes is listed once, on its net side; see `other_outcome_shares`. */
|
|
780
|
+
side: "YES" | "NO";
|
|
781
|
+
/** Polymarket CLOB token id (ERC1155 asset id, decimal string) for `side`; null when the market has no stored token id. */
|
|
782
|
+
token_id: string | null;
|
|
783
|
+
/** All-time trader grade. This route lists the S/A/B cohort only, the same cohort a Pick of the Day roster lists. */
|
|
784
|
+
grade: "S" | "A" | "B" | null;
|
|
785
|
+
/** Shares held on `side`, from the complete provider scan. */
|
|
786
|
+
shares: number;
|
|
787
|
+
/** Polymarket's own currentValue for this leg, in USD. Null when the snapshot predates the value map. */
|
|
788
|
+
current_value_usd: number | null;
|
|
789
|
+
/** Shares on the other outcome when the wallet holds both. Absent when the wallet is one-sided. */
|
|
790
|
+
other_outcome_shares?: number;
|
|
791
|
+
/** The wallet's last recorded trade anywhere, null when unknown. */
|
|
792
|
+
last_traded_at: string | null;
|
|
793
|
+
/** This wallet's win rate in the market's canonical category (`market.category`): the share of its resolved markets in that category 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. */
|
|
794
|
+
category_win_rate?: number;
|
|
795
|
+
/** The two counts `category_win_rate` is the ratio of, from the same row: `wins / decided` equals the rate. Every resolved Polymarket market the wallet traded in the market's canonical category, at any position size, rebuilt daily. Present only with `category_win_rate_status` = `measured`. */
|
|
796
|
+
category_win_record?: {
|
|
797
|
+
/** Resolved markets in the category that this wallet closed with a profit. */
|
|
798
|
+
wins: number;
|
|
799
|
+
/** Resolved 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. */
|
|
800
|
+
decided: number;
|
|
801
|
+
};
|
|
802
|
+
/** For an esports market, the game `category_win_rate` and `category_win_record` were measured in: `LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`. Present only when the wallet's record in that game clears the 5-resolved-market floor, in which case the rate and record are the game's rather than the `Esports` bucket's. Absent when the rate is the bucket's (the wallet's game history is under the floor), on every non-esports market, and beside every non-measured status. Label the rate with this when present and with the market's `category` otherwise. */
|
|
803
|
+
category_win_rate_game?: string;
|
|
804
|
+
/** 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. */
|
|
805
|
+
category_win_rate_status: "measured" | "not_enough_data" | "unavailable";
|
|
806
|
+
category_evidence?: HolderCategoryEvidence;
|
|
807
|
+
/** Days since this wallet's first trade. The five badge fields are present together, only for a wallet that draws at least one badge. */
|
|
808
|
+
wallet_age_days?: number | null;
|
|
809
|
+
/** True when the wallet's first trade was under 30 days ago. */
|
|
810
|
+
is_new_wallet?: boolean;
|
|
811
|
+
/** Distinct markets the wallet has traded. */
|
|
812
|
+
markets_traded?: number | null;
|
|
813
|
+
/** True when the wallet is flagged as automated. */
|
|
814
|
+
is_bot?: boolean;
|
|
815
|
+
/** The wallet's X handle without the @, when linked. */
|
|
816
|
+
x_username?: string | null;
|
|
817
|
+
};
|
|
818
|
+
export type MarketHoldersMarket = {
|
|
819
|
+
/** `mkt_`-prefixed market id. */
|
|
820
|
+
id: string;
|
|
821
|
+
condition_id: string;
|
|
822
|
+
title: string | null;
|
|
823
|
+
slug?: string;
|
|
824
|
+
event_slug?: string;
|
|
825
|
+
/** The canonical category bucket `category_win_rate` is measured in. */
|
|
826
|
+
category: string | null;
|
|
827
|
+
outcome_yes: string | null;
|
|
828
|
+
outcome_no: string | null;
|
|
829
|
+
token_id_yes: string | null;
|
|
830
|
+
token_id_no: string | null;
|
|
831
|
+
end_date?: string;
|
|
832
|
+
/** A settled market's roster is whatever the provider still lists as open; it empties as holders redeem. */
|
|
833
|
+
status: "open" | "closed" | "resolved";
|
|
834
|
+
};
|
|
835
|
+
export type MarketHoldersScan = {
|
|
836
|
+
/** `cached`: the shared holder snapshot, at most 180 s old at compute time. `live`: the provider answered a fresh complete walk for this compute. */
|
|
837
|
+
source: "cached" | "live";
|
|
838
|
+
/** Always true on a served roster. An incomplete or unstable scan is a 503, never a partial list. */
|
|
839
|
+
complete: boolean;
|
|
840
|
+
/** When the provider walk that produced the holder population finished. */
|
|
841
|
+
fetched_at: string | null;
|
|
842
|
+
/** Every distinct wallet the complete walk saw with open shares, graded or not. The roster lists the graded S/A/B subset. */
|
|
843
|
+
wallet_count: number;
|
|
844
|
+
};
|
|
845
|
+
export type MarketHoldersSideGrades = {
|
|
846
|
+
s: number;
|
|
847
|
+
a: number;
|
|
848
|
+
b: number;
|
|
849
|
+
};
|
|
850
|
+
/** Roster totals BEFORE any `outcome` or `min_grade` filter, so a page always knows the whole market it was cut from. */
|
|
851
|
+
export type MarketHoldersTotals = {
|
|
852
|
+
/** Distinct graded wallets with net exposure; a two-sided wallet counts once. */
|
|
853
|
+
graded_count: number;
|
|
854
|
+
yes_count: number;
|
|
855
|
+
no_count: number;
|
|
856
|
+
yes_shares: number;
|
|
857
|
+
no_shares: number;
|
|
858
|
+
/** Polymarket currentValue summed over the graded wallets netting YES. */
|
|
859
|
+
yes_usd: number;
|
|
860
|
+
/** Polymarket currentValue summed over the graded wallets netting NO. */
|
|
861
|
+
no_usd: number;
|
|
862
|
+
yes_grades: MarketHoldersSideGrades;
|
|
863
|
+
no_grades: MarketHoldersSideGrades;
|
|
864
|
+
};
|
|
534
865
|
export type MarketIntel = {
|
|
535
866
|
market: {
|
|
536
867
|
id: string;
|
|
537
868
|
condition_id: string;
|
|
538
869
|
title: string;
|
|
539
|
-
slug
|
|
540
|
-
category
|
|
541
|
-
platform
|
|
870
|
+
slug: string | null;
|
|
871
|
+
category: string | null;
|
|
872
|
+
platform: string | null;
|
|
542
873
|
};
|
|
543
874
|
/** Outcome-aware flow from all tracked whale trades in the window, without a grade filter. BUY YES and SELL NO add net exposure; BUY NO and SELL YES subtract it. Gross buy/sell volumes count both outcomes. Top positions are separately graded. Direction uses unrounded net: negative is NO, otherwise YES; the zero tie-break is not conviction. Canonical; smart_money is a deprecated byte-identical alias. */
|
|
544
875
|
sharp_money: {
|
|
545
876
|
net_flow_usd: number;
|
|
546
877
|
direction: "YES" | "NO";
|
|
547
878
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
548
|
-
token_id
|
|
879
|
+
token_id: string | null;
|
|
880
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
881
|
+
large_trade_count?: number;
|
|
549
882
|
whale_trade_count: number;
|
|
550
883
|
buy_volume_usd: number;
|
|
551
884
|
sell_volume_usd: number;
|
|
552
885
|
top_positions: ({
|
|
553
886
|
id: string;
|
|
554
887
|
address: string;
|
|
555
|
-
username
|
|
556
|
-
grade
|
|
888
|
+
username: string | null;
|
|
889
|
+
grade: string | null;
|
|
557
890
|
side: "YES" | "NO";
|
|
558
891
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
559
|
-
token_id
|
|
892
|
+
token_id: string | null;
|
|
560
893
|
size_usd: number;
|
|
561
894
|
})[];
|
|
895
|
+
/** Age of the oldest stored position snapshot behind top_positions: the minimum wallet sync clock over the positions this body publishes. The roster is a stored read rather than a live one, and graded wallets sit on different sync tiers, so this names how current the whole roster is; the response is no fresher than this timestamp. Null when the roster is empty or no published position carries a sync clock. It does not date net_flow_usd, the volumes or the trade counts, which come from large-trade event times. */
|
|
896
|
+
oldest_snapshot_as_of: string | null;
|
|
562
897
|
};
|
|
563
898
|
/** Deprecated alias of sharp_money; byte-identical and retained for backward compatibility. */
|
|
564
899
|
smart_money: {
|
|
565
900
|
net_flow_usd: number;
|
|
566
901
|
direction: "YES" | "NO";
|
|
567
902
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
568
|
-
token_id
|
|
903
|
+
token_id: string | null;
|
|
904
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
905
|
+
large_trade_count?: number;
|
|
569
906
|
whale_trade_count: number;
|
|
570
907
|
buy_volume_usd: number;
|
|
571
908
|
sell_volume_usd: number;
|
|
572
909
|
top_positions: ({
|
|
573
910
|
id: string;
|
|
574
911
|
address: string;
|
|
575
|
-
username
|
|
576
|
-
grade
|
|
912
|
+
username: string | null;
|
|
913
|
+
grade: string | null;
|
|
577
914
|
side: "YES" | "NO";
|
|
578
915
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
579
|
-
token_id
|
|
916
|
+
token_id: string | null;
|
|
580
917
|
size_usd: number;
|
|
581
918
|
})[];
|
|
919
|
+
/** Age of the oldest stored position snapshot behind top_positions: the minimum wallet sync clock over the positions this body publishes. The roster is a stored read rather than a live one, and graded wallets sit on different sync tiers, so this names how current the whole roster is; the response is no fresher than this timestamp. Null when the roster is empty or no published position carries a sync clock. It does not date net_flow_usd, the volumes or the trade counts, which come from large-trade event times. */
|
|
920
|
+
oldest_snapshot_as_of: string | null;
|
|
582
921
|
};
|
|
583
922
|
timeframe: string;
|
|
584
923
|
};
|
|
@@ -586,9 +925,9 @@ export type MarketSearchResult = {
|
|
|
586
925
|
id: string;
|
|
587
926
|
condition_id: string;
|
|
588
927
|
title: string;
|
|
589
|
-
slug
|
|
590
|
-
category
|
|
591
|
-
platform
|
|
928
|
+
slug: string | null;
|
|
929
|
+
category: string | null;
|
|
930
|
+
platform: string | null;
|
|
592
931
|
status: "active" | "closed";
|
|
593
932
|
};
|
|
594
933
|
export type MarketSnapshot = {
|
|
@@ -596,45 +935,45 @@ export type MarketSnapshot = {
|
|
|
596
935
|
id: string;
|
|
597
936
|
condition_id: string;
|
|
598
937
|
provider: string;
|
|
599
|
-
title
|
|
600
|
-
slug
|
|
601
|
-
page_slug
|
|
602
|
-
event_slug
|
|
603
|
-
category
|
|
938
|
+
title: string | null;
|
|
939
|
+
slug: string | null;
|
|
940
|
+
page_slug: string | null;
|
|
941
|
+
event_slug: string | null;
|
|
942
|
+
category: string | null;
|
|
604
943
|
status: "active" | "closed";
|
|
605
|
-
description
|
|
606
|
-
image
|
|
944
|
+
description: string | null;
|
|
945
|
+
image: string | null;
|
|
607
946
|
/** 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. */
|
|
608
|
-
series_slug
|
|
609
|
-
market_type
|
|
610
|
-
market_result
|
|
611
|
-
created_at
|
|
612
|
-
end_date
|
|
613
|
-
resolved_at
|
|
947
|
+
series_slug: string | null;
|
|
948
|
+
market_type: string | null;
|
|
949
|
+
market_result: string | null;
|
|
950
|
+
created_at: string | null;
|
|
951
|
+
end_date: string | null;
|
|
952
|
+
resolved_at: string | null;
|
|
614
953
|
};
|
|
615
954
|
outcomes: ({
|
|
616
955
|
side: "yes" | "no";
|
|
617
956
|
label: string;
|
|
618
|
-
token_id?: string
|
|
619
|
-
current_price?: number
|
|
957
|
+
token_id?: string;
|
|
958
|
+
current_price?: number;
|
|
620
959
|
top_of_book: MarketSnapshotTopOfBook;
|
|
621
960
|
})[];
|
|
622
961
|
liquidity: {
|
|
623
962
|
source: string;
|
|
624
|
-
volume_usd
|
|
625
|
-
liquidity_usd
|
|
626
|
-
volume_24h_usd
|
|
963
|
+
volume_usd: number | null;
|
|
964
|
+
liquidity_usd: number | null;
|
|
965
|
+
volume_24h_usd: number | null;
|
|
627
966
|
/** Always null. Polymarket snapshot prices come from outcome top-of-book midpoints. */
|
|
628
|
-
last_price
|
|
967
|
+
last_price: number | null;
|
|
629
968
|
};
|
|
630
969
|
sports: {
|
|
631
970
|
status: "fresh" | "stale" | "not_live" | "unavailable";
|
|
632
971
|
source: string;
|
|
633
|
-
live_match_key?: string
|
|
634
|
-
live_league_key?: string
|
|
972
|
+
live_match_key?: string;
|
|
973
|
+
live_league_key?: string;
|
|
635
974
|
/** Live-score period and elapsed may be omitted when unavailable (older responses use null). A score entry may omit full_name when it equals team; fall back to team. Distinct aliases and score admission markers are preserved. */
|
|
636
|
-
live_score?: Record<string, unknown
|
|
637
|
-
reason?: string
|
|
975
|
+
live_score?: Record<string, unknown>;
|
|
976
|
+
reason?: string;
|
|
638
977
|
};
|
|
639
978
|
freshness: {
|
|
640
979
|
market_data: MarketSnapshotFreshness;
|
|
@@ -648,20 +987,20 @@ export type MarketSnapshot = {
|
|
|
648
987
|
export type MarketSnapshotFreshness = {
|
|
649
988
|
status: "fresh" | "stale" | "available" | "not_live" | "unavailable";
|
|
650
989
|
source: string;
|
|
651
|
-
as_of?: string
|
|
990
|
+
as_of?: string;
|
|
652
991
|
/** Age-relative freshness bound when known. Omitted for live_sports: its as_of records compute start, while its two-second freshness marker starts at publication. */
|
|
653
|
-
stale_after_s?: number
|
|
654
|
-
reason?: string
|
|
992
|
+
stale_after_s?: number;
|
|
993
|
+
reason?: string;
|
|
655
994
|
};
|
|
656
995
|
export type MarketSnapshotTopOfBook = {
|
|
657
996
|
status: "available" | "unavailable";
|
|
658
997
|
source: string;
|
|
659
|
-
best_bid?: number
|
|
660
|
-
best_ask?: number
|
|
661
|
-
spread_bps?: number
|
|
662
|
-
bid_depth_usdc?: number
|
|
663
|
-
ask_depth_usdc?: number
|
|
664
|
-
reason?: string
|
|
998
|
+
best_bid?: number;
|
|
999
|
+
best_ask?: number;
|
|
1000
|
+
spread_bps?: number;
|
|
1001
|
+
bid_depth_usdc?: number;
|
|
1002
|
+
ask_depth_usdc?: number;
|
|
1003
|
+
reason?: string;
|
|
665
1004
|
};
|
|
666
1005
|
/** Price and spread trust metadata returned only when GET /api/v1/market/{condition_id}/snapshot includes expand=trust. */
|
|
667
1006
|
export type MarketSnapshotTrust = {
|
|
@@ -689,21 +1028,23 @@ export type OutcomeCandles = {
|
|
|
689
1028
|
};
|
|
690
1029
|
export type PickHolder = {
|
|
691
1030
|
address: string;
|
|
692
|
-
name
|
|
1031
|
+
name: string | null;
|
|
693
1032
|
/** All-time trader grade (S, A, B, C, D, F). */
|
|
694
|
-
grade
|
|
1033
|
+
grade: string | null;
|
|
695
1034
|
/** 0xinsider profile path segment this wallet links to: `@<username>` when that username resolves to this wallet alone, otherwise the lowercase wallet. Percent-encode the part after `@` and append to `https://0xinsider.com/profile/`. Stamped at serve time; absent on a body cached before the field shipped. */
|
|
696
|
-
profile_segment?: string
|
|
1035
|
+
profile_segment?: string;
|
|
697
1036
|
shares: number;
|
|
698
|
-
/** 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): the share of the wallet's resolved markets in that category 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 resolved-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. */
|
|
699
|
-
category_win_rate?: number
|
|
700
|
-
/** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every resolved Polymarket market the wallet traded in the pick's canonical category, 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. */
|
|
1037
|
+
/** 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 resolved markets in that category 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 resolved-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. */
|
|
1038
|
+
category_win_rate?: number;
|
|
1039
|
+
/** The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every resolved Polymarket market the wallet traded in the pick's canonical category (or in its game, 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. */
|
|
701
1040
|
category_win_record?: {
|
|
702
1041
|
/** Resolved markets in the category that this wallet closed with a profit. */
|
|
703
1042
|
wins: number;
|
|
704
1043
|
/** Resolved 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. */
|
|
705
1044
|
decided: number;
|
|
706
1045
|
};
|
|
1046
|
+
/** For an esports pick, the game `category_win_rate` and `category_win_record` were measured in, by the same name the pick's `display_category` uses for it: `LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`. Present only when the wallet's record in that game clears the 5-resolved-market floor, in which case the rate and record are the game's rather than the `Esports` bucket's. Absent when the rate is the bucket's (the wallet's game history is under the floor), on every non-esports pick, beside every non-measured status, and on payloads predating the field. Label the rate with this when present and with `category` otherwise. */
|
|
1047
|
+
category_win_rate_game?: string;
|
|
707
1048
|
/** Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the resolved-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. */
|
|
708
1049
|
category_win_rate_status?: "measured" | "not_enough_data" | "unavailable";
|
|
709
1050
|
/** Days since this wallet's first trade. 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. */
|
|
@@ -722,7 +1063,7 @@ export type PickOfTheDay = {
|
|
|
722
1063
|
/** Always 'full' for an authenticated Pro key. */
|
|
723
1064
|
state: "full";
|
|
724
1065
|
/** The pick's local publication date (YYYY-MM-DD). */
|
|
725
|
-
pick_date
|
|
1066
|
+
pick_date?: string;
|
|
726
1067
|
/** Stable 1-based slot within the product day's ranked picks. */
|
|
727
1068
|
pick_rank?: number;
|
|
728
1069
|
/** The complete ranked picks for this product day, ordered by pick_rank. Thin days contain fewer items; the selector never fabricates rows. */
|
|
@@ -732,55 +1073,59 @@ export type PickOfTheDay = {
|
|
|
732
1073
|
/** Same-day picks selected but not yet released, ordered by pick_rank. Additive and optional: present only while at least one unreleased slot exists. Each slot exposes only its rank and schedule -- no market identity before release. Schedule the next read from the earliest release_at instead of polling. */
|
|
733
1074
|
scheduled_picks?: ScheduledPickSlot[];
|
|
734
1075
|
/** Human-readable matchup (e.g. "Portugal vs. Uzbekistan"). */
|
|
735
|
-
matchup
|
|
1076
|
+
matchup?: string;
|
|
736
1077
|
/** Frozen canonical calibration/report bucket (e.g. "Basketball", "MMA", or "Soccer"). Existing semantics are unchanged; presentation consumers should prefer display_category when present. */
|
|
737
|
-
category
|
|
1078
|
+
category?: string;
|
|
738
1079
|
/** Frozen public presentation category. For supported Polymarket sports this is the exact verified provider event identity: an official league (e.g. "WNBA" or "UFC"), the esports title (e.g. "CS2", "LoL", "Dota 2" or "Valorant"), or a soccer competition whose official mark we vendor (e.g. "LaLiga", "Premier League", "Serie A" or "UEFA Champions League"). Only identities with a vendored official mark are split out; every other competition keeps its canonical bucket, so "Soccer" remains a live value; otherwise it equals category. An esports pick keeps the pooled "Esports" bucket in category, so a per-title label never implies a per-title measured cohort. Additive and optional for mixed-version client compatibility. */
|
|
739
1080
|
display_category?: string;
|
|
740
1081
|
/** Provider platform (e.g. "polymarket"). */
|
|
741
|
-
platform
|
|
1082
|
+
platform?: string;
|
|
742
1083
|
/** The pick's stored release instant. Normally the current provider kickoff minus one hour; an operator may override it. The actual publish instant can trail it because of worker or claim delay. */
|
|
743
|
-
release_at
|
|
1084
|
+
release_at?: string;
|
|
744
1085
|
/** True only before the pick's stored release instant (a pre-release embargo flag); effectively always false on a served, already-published pick. To detect that the backed game has kicked off, use `game_started`. */
|
|
745
|
-
is_locked
|
|
1086
|
+
is_locked?: boolean;
|
|
746
1087
|
/** True once the backed game's kickoff has passed (kickoff <= now). When true the snapshotted pre-game price is no longer actionable. Absent for a legacy pick with no stored kickoff (treat as not-started). */
|
|
747
1088
|
game_started?: boolean;
|
|
748
1089
|
/** Settlement outcome of the backed side; 'pending' until the market resolves. */
|
|
749
|
-
outcome
|
|
1090
|
+
outcome?: "pending" | "win" | "loss" | "void";
|
|
750
1091
|
/** Pre-formatted SETTLEMENT STATUS for display: "Win" / "Loss" / "Void" / "Pending" -- the outcome enum above as a label. Convenience only; outcome is the source value. NOTE: this is the win/loss STATUS, not the backed side. The backed side is pick_outcome_label ("Belgium (-2.5)") -- a different field answering a different question. */
|
|
751
1092
|
outcome_display?: string;
|
|
752
1093
|
/** The backed side phrased as a bet: a team for a moneyline (e.g. "Portugal"), the handicap line for a spread (e.g. "Belgium (-2.5)"), or "{team} to advance" for a knockout advancement market (e.g. "Spain to advance"). */
|
|
753
|
-
pick_outcome_label
|
|
754
|
-
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the backed outcome;
|
|
755
|
-
token_id?: string
|
|
1094
|
+
pick_outcome_label?: string;
|
|
1095
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the backed outcome; omitted when unavailable (e.g. unsynced markets). */
|
|
1096
|
+
token_id?: string;
|
|
756
1097
|
/** The backed side phrased as a bet (e.g. "Portugal to win"). */
|
|
757
|
-
position
|
|
1098
|
+
position?: string;
|
|
758
1099
|
/** One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
|
|
759
|
-
side_summary
|
|
1100
|
+
side_summary?: string;
|
|
760
1101
|
/** Public V1 compatibility count of S/A smart-money wallets on the backed side. The first-party/internal current policy counts S/A/B; historical rows retain their frozen policy's count. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof. */
|
|
761
|
-
smart_wallet_count
|
|
1102
|
+
smart_wallet_count?: number;
|
|
762
1103
|
/** Best public V1-compatible S/A smart-money grade on the backed side. The first-party/internal current policy can select B, but a current B-only grade is omitted by the stable V1 adapter. Historical rows retain their frozen policy's grade. A current-day published pick with pending legacy proof, unknown-future proof, or structurally invalid current-policy proof returns 503 before this success schema is served. Resolved legacy proof remains readable on both current-day and archive/history responses. */
|
|
763
|
-
top_grade?: string
|
|
1104
|
+
top_grade?: string;
|
|
764
1105
|
/** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: category win-rate edge as a fraction (the backed-side cohort's win rate in this category minus the non-market-maker category baseline, e.g. 0.09 = +9 points), paired with category_edge_sample. */
|
|
765
|
-
category_edge_pct?: number
|
|
1106
|
+
category_edge_pct?: number;
|
|
766
1107
|
/** Deprecated (#7170): no longer populated for picks selected on/after the calibration-edge change; omitted (absent) for new picks (the field uses skip_serializing_if, so a null value is dropped from the JSON rather than serialized as null). Permanently frozen-legacy -- retained for historical picks, with no removal or replacement planned, so no v2 is implied. Historical picks may still carry a value. Legacy meaning: pooled count of resolved markets behind category_edge_pct (the headline's n). */
|
|
767
|
-
category_edge_sample?: number
|
|
1108
|
+
category_edge_sample?: number;
|
|
768
1109
|
/** Recency-weighted graded-flow magnitude in USD; omitted when <= 0. */
|
|
769
|
-
smart_usd?: number
|
|
770
|
-
/**
|
|
771
|
-
backed_price?: number
|
|
1110
|
+
smart_usd?: number;
|
|
1111
|
+
/** Frozen pre-game probability (0..1) for the backed side, written once at publication. It is the Polymarket CLOB order book midpoint at release, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price. */
|
|
1112
|
+
backed_price?: number;
|
|
772
1113
|
/** Full-only disclosure when backed_price was recovered from provider history within 30 seconds before publication. Render beside the price. Absent for ordinary publication captures and teasers; this is a historical reference, not an executed fill. */
|
|
773
1114
|
entry_price_note?: string;
|
|
774
1115
|
/** Pre-formatted backed_price as cents-on-the-dollar odds, to ONE decimal: "62.0c" / "99.9c". Never rounded to a whole cent -- a 99.9c favorite is not a 100c certainty. Convenience only; backed_price is the source value. Omitted when backed_price is. */
|
|
775
|
-
odds_display?: string
|
|
776
|
-
/**
|
|
777
|
-
|
|
778
|
-
/**
|
|
779
|
-
|
|
780
|
-
/**
|
|
781
|
-
|
|
1116
|
+
odds_display?: string;
|
|
1117
|
+
/** The flat stake the published record puts on every pick, in USD: 1000 since 2026-09-22 (it was 100 before). Present exactly when return_usd is, so a reader never has to know the stake from anywhere else. */
|
|
1118
|
+
stake_usd?: number;
|
|
1119
|
+
/** Gross return of stake_usd at the frozen midpoint price (stake_usd / backed_price). A real fill pays the ask, so an executed stake usually returns a little less. Omitted with backed_price. */
|
|
1120
|
+
return_usd?: number;
|
|
1121
|
+
/** The same return on a literal $100 (100 / backed_price), kept for compatibility: the field predates stake_usd and its name promises the $100 basis, so a client that scales it to its own stake stays right. Present exactly when return_usd is. */
|
|
1122
|
+
return_per_100?: number;
|
|
1123
|
+
/** Pre-formatted return_usd as USD with cents and thousands separators: "$1,612.90" / "$12,500.00". The GROSS return (the stake included), so it carries no sign. Convenience only; return_usd is the source value. Omitted when return_usd is. */
|
|
1124
|
+
payout_display?: string;
|
|
1125
|
+
/** Pre-formatted PROFIT on the stake -- return_usd minus stake_usd, i.e. the payout net of what you put in -- as a signed USD string: "+$612.90". Distinct from payout_display, which is gross. Omitted when return_usd is. */
|
|
1126
|
+
profit_display?: string;
|
|
782
1127
|
/** Backend-owned CLV capture disposition. "pending" means no capture decision exists yet; terminal provider or quality statuses remain distinguishable. The raw close price and timestamp are never serialized. */
|
|
783
|
-
clv_status
|
|
1128
|
+
clv_status?: string;
|
|
784
1129
|
/** Backend-owned CLV evidence basis. `frozen_displayed_entry` uses the persisted displayed entry. `historical_provider_entry` uses a known-CLOB point at or before publication. `historical_provider_price_match` requires the latest point in the prior hour to match. `historical_provider_nearby_price_match` requires a matching point within five minutes before publication. Source-null bases preserve unknown original provenance. */
|
|
785
1130
|
clv_basis?: string;
|
|
786
1131
|
/** Closing-line value toward the backed side, computed as (close / entry - 1) * 100. The basis-specific provider p entry must match the stored display; historical_provider_price_match also requires source provenance to remain null and its latest entry to be within the one-hour window at or before publication. Every basis requires a later quality-checked p close from the same series in the bounded post-entry, pre-kickoff window. Omitted when not measured. */
|
|
@@ -789,52 +1134,52 @@ export type PickOfTheDay = {
|
|
|
789
1134
|
clv_display?: string;
|
|
790
1135
|
/** Backend-owned CLV formula text with the entry probability, close probability, and rounded result. Provider timestamps remain private. */
|
|
791
1136
|
clv_explanation?: string;
|
|
792
|
-
/** Net return for the pick in the
|
|
1137
|
+
/** Net return for the pick in stake units (return_usd / stake_usd - 1); one unit is one stake_usd stake, and the figure is the same under any stake size. Omitted when the outcome is not valued. */
|
|
793
1138
|
unit_score?: number;
|
|
794
1139
|
/** Backend-formatted signed unit score, present exactly when unit_score is present. */
|
|
795
1140
|
unit_score_display?: string;
|
|
796
1141
|
/** First-party/internal backed-side sharp-money dollar consensus as a fraction 0..1: the share of current-policy sharp dollars on the backed side. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. A conviction signal, NOT a probability or expected-value claim. Frozen at generation. */
|
|
797
|
-
sharp_pct?: number
|
|
1142
|
+
sharp_pct?: number;
|
|
798
1143
|
/** Market-implied probability of the backed side as a fraction 0..1 (equals backed_price), re-exposed alongside sharp_pct for the WHY breakdown. */
|
|
799
|
-
market_pct?: number
|
|
800
|
-
/** First-party/internal consensus edge = sharp_pct - market_pct, the conviction-vs-price gap (how much more of the current-policy sharp money sits on this side than the price implies). Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. This is NOT an expected-value or guaranteed edge.
|
|
801
|
-
consensus_edge_pct?: number
|
|
1144
|
+
market_pct?: number;
|
|
1145
|
+
/** First-party/internal consensus edge = sharp_pct - market_pct, the conviction-vs-price gap (how much more of the current-policy sharp money sits on this side than the price implies). Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. This is NOT an expected-value or guaranteed edge. Omitted when either input is unavailable. */
|
|
1146
|
+
consensus_edge_pct?: number;
|
|
802
1147
|
/** First-party/internal team-directional commitment read at selection time: the fraction (0..1) of the backed side's current-policy graded sharp-money DOLLARS held by wallets read one-way rather than hedged: no opposite leg on this market worth at least 10% of the backed leg (Polymarket's own currentValue pair), and no opposing team across the game's markets where the wallet's synced legs are fresh. Current public V1 rows omit this B-inclusive read because its historical S/A equivalent is not reconstructed. A high value means the graded pile is really committed to this side; a low one means much of it is hedged or unreadable. Omitted when the read was not computed (a pick selected before the field existed, an ungroupable game, an empty graded pile, or a pile where no holder carried usable evidence) -- which is NOT the same as 0.0, a computed reading that classified holders and found none one-way. */
|
|
803
|
-
directional_confidence?: number
|
|
1148
|
+
directional_confidence?: number;
|
|
804
1149
|
/** Graded backed-side holders read as one-way-committed on this game. */
|
|
805
|
-
one_way_holder_count?: number
|
|
1150
|
+
one_way_holder_count?: number;
|
|
806
1151
|
/** Graded backed-side holders read as HEDGED across the game's markets. */
|
|
807
|
-
hedged_holder_count?: number
|
|
1152
|
+
hedged_holder_count?: number;
|
|
808
1153
|
/** The one-way holders' share of the backed-side graded dollars (the confidence's numerator). */
|
|
809
|
-
one_way_graded_usd?: number
|
|
1154
|
+
one_way_graded_usd?: number;
|
|
810
1155
|
/** Backed-side graded dollars the confidence is measured against (its denominator). */
|
|
811
|
-
total_graded_usd?: number
|
|
1156
|
+
total_graded_usd?: number;
|
|
812
1157
|
/** The qualifying category expert whose sport-specific record and real position earned this pick its top selection tier. The first-party/internal current policy admits S/A/B; public V1 exposes a compatible S/A expert and omits a current-policy B-grade expert: a candidate backed by one outranks every candidate without one. Present only on the full payload. Omitted when no wallet qualified on the backed side, on picks generated before the field existed, and on the first-party web teaser, which withholds all backed-side evidence. Frozen at SELECTION time — the wallet's position can move before the pick renders. */
|
|
813
1158
|
qualifying_expert?: {
|
|
814
1159
|
/** Wallet address of the qualifying expert. */
|
|
815
1160
|
address: string;
|
|
816
1161
|
/** Provider display name, or null for an unnamed wallet. */
|
|
817
|
-
name
|
|
1162
|
+
name: string | null;
|
|
818
1163
|
/** 0xinsider grade letter. The first-party/internal current Pick of the Day policy counts S, A, and B; public V1 exposes only the compatible S/A expert. */
|
|
819
|
-
grade
|
|
1164
|
+
grade: string | null;
|
|
820
1165
|
/** 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. */
|
|
821
1166
|
canonical_category: string;
|
|
822
1167
|
/** Share of this wallet's resolved markets in canonical_category whose realized P&L came out positive, as a 0..1 fraction. Above 0.60 by construction for a source=v1 expert; null for an expert who qualified on the category-skill v2 definition only. Deliberately NOT phrased as "closed profitable": the metric counts realized P&L above zero, so a resolved winner the wallet never redeemed sits at zero and counts against it. */
|
|
823
|
-
win_rate
|
|
1168
|
+
win_rate: number | null;
|
|
824
1169
|
/** Resolved markets in canonical_category behind win_rate. At least 10 by construction for a source=v1 expert; null with win_rate. */
|
|
825
|
-
n_resolved
|
|
1170
|
+
n_resolved: number | null;
|
|
826
1171
|
/** Current expert policy 10 does not require a category-skill v2 specialist in any sport; in every sport a specialist raises the candidate's rank tier rather than gating it. Standard specialists need a positive edge_lower_95 over enough independent events and enough net backing on the backed side; the floors are not published. Fresh healthy records below the shared model's live sample floor can qualify; stale, unknown and degraded records cannot. Historical records preserve which definition qualified the wallet: v1, the profitability rate (win_rate over n_resolved), or v2, the forward-only category-skill calibration edge (edge_lower_95 over independent_event_count). Absent on picks frozen before the v2 definition existed; read absence as v1. A Tennis pick frozen under gate policy v4 or later carries v2 only: a v1 rate stopped qualifying a tennis expert at v4. A Tennis pick frozen under an earlier policy can still carry v1 with a win rate. */
|
|
827
1172
|
source?: "v1" | "v2";
|
|
828
1173
|
/** 95% lower bound of the wallet's mean calibration edge over the market price in canonical_category, in probability units (0.08 is 8 points). Positive by construction for a v2 expert; present on a v1 expert only when the wallet also holds a live v2 row. */
|
|
829
|
-
edge_lower_95?: number
|
|
1174
|
+
edge_lower_95?: number;
|
|
830
1175
|
/** Point estimate behind edge_lower_95. */
|
|
831
|
-
edge_mean?: number
|
|
1176
|
+
edge_mean?: number;
|
|
832
1177
|
/** Independent canonical events behind the edge. At least 10 by construction for a v2 expert. */
|
|
833
|
-
independent_event_count?: number
|
|
1178
|
+
independent_event_count?: number;
|
|
834
1179
|
/** Polymarket's own currentValue for this wallet on the backed outcome, in USD, as of selection. At least 1000 by construction through gate policy v7; the standard floor is 500 from v8. From gate policy v5 the floor is read on the net: position_usd minus opposite_position_usd is at least that floor, and the pick re-verifies that net against the live holder snapshot when it is released. */
|
|
835
1180
|
position_usd: number;
|
|
836
1181
|
/** The same wallet's currentValue on the OTHER outcome of this market, in USD, as of selection. Present from gate policy v5, when the floor moved to net exposure; a wallet long both sides does not qualify. Absent on picks frozen before v5, which never read the leg. 0 is a measured one-way position, not an absence. */
|
|
837
|
-
opposite_position_usd?: number
|
|
1182
|
+
opposite_position_usd?: number;
|
|
838
1183
|
/** When the skill read model behind the evidence was last rebuilt: trader_category_stats.computed_at for a source=v1 expert, category_skill_v2_current.as_of for a source=v2 expert. */
|
|
839
1184
|
stats_computed_at: string;
|
|
840
1185
|
/** Present from expert policy 6. Current expert policy 10 retains the longshot requirement of live v2 only, with a positive lower bound over a large sample, large net backed value and no meaningful opposite value. Historical policy 6: a specialist required large net backed value, no meaningful opposite value, and either a live v2 positive lower bound over a large sample or a high v1 rate over enough resolved markets. Tennis requires v2. The floors are not published. */
|
|
@@ -843,32 +1188,32 @@ export type PickOfTheDay = {
|
|
|
843
1188
|
lane_probability?: number;
|
|
844
1189
|
/** Canonical provider probability pair branch; absent on standard experts. */
|
|
845
1190
|
lane_probability_source?: "p";
|
|
846
|
-
}
|
|
1191
|
+
};
|
|
847
1192
|
trust?: PickTrust;
|
|
848
1193
|
/** Public V1 S/A compatibility count on the backed side (equals the adapted smart_wallet_count). The first-party/internal current policy counts S/A/B. Historical rows retain their frozen policy's count. */
|
|
849
|
-
traders?: number
|
|
1194
|
+
traders?: number;
|
|
850
1195
|
/** Raw backed-side sharp-money USD frozen at generation. This is the Sharp USD value, not the recency-weighted smart_usd which decays. Omitted on current public V1 rows when the B-inclusive value has no reconstructible S/A equivalent. */
|
|
851
|
-
backed_sharp_usd?: number
|
|
1196
|
+
backed_sharp_usd?: number;
|
|
852
1197
|
/** Bounded S/A compatibility projection of the frozen sharp-money holders on the backed side. Current full payloads expose the complete S/A/B roster in display_holders; historical rows can retain their earlier frozen shape. */
|
|
853
|
-
holders?: PickHolder[]
|
|
1198
|
+
holders?: PickHolder[];
|
|
854
1199
|
/** Full-only complete provider-confirmed S/A/B holder roster for the current Pick of the Day backing policy. Omitted for teaser, no-pick, and historical rows whose frozen holder proof predates this policy. Each entry may additionally carry `category_win_rate` / `category_win_rate_status`: the wallet's win rate in the pick's canonical `category`, stamped at serve time from the current category read model (the same annotation the sports sharp-money chips carry). The bounded `holders` compatibility projection never carries these fields. */
|
|
855
|
-
display_holders?: PickHolder[]
|
|
1200
|
+
display_holders?: PickHolder[];
|
|
856
1201
|
/** Exact S/A smart-money proof count on the backed side. The current display_holders roster can be longer because it also carries B-grade smart-money holders. */
|
|
857
|
-
holder_count?: number
|
|
1202
|
+
holder_count?: number;
|
|
858
1203
|
/** Optional editorial note attached to the pick. */
|
|
859
|
-
editorial_note?: string
|
|
1204
|
+
editorial_note?: string;
|
|
860
1205
|
/** Required truthful thesis. With at least one profitable-wallet holder: Profitable wallets hold {pick_outcome_label}[, led by a grade-{top_grade} trader]. Without holder backing: 0xInsider's Pick of the Day is {pick_outcome_label}. Wallet counts are not appended. */
|
|
861
|
-
thesis
|
|
1206
|
+
thesis?: string;
|
|
862
1207
|
/** Canonical web market URL. */
|
|
863
|
-
market_url?: string
|
|
864
|
-
/** The canonical /event game-page slug (one neutral page per game)
|
|
865
|
-
event_slug?: string
|
|
866
|
-
/** Backend-resolved /event destination slug for this pick's source market;
|
|
867
|
-
event_link_slug?: string
|
|
1208
|
+
market_url?: string;
|
|
1209
|
+
/** The canonical /event game-page slug (one neutral page per game); omitted when the game has no neutral event page. */
|
|
1210
|
+
event_slug?: string;
|
|
1211
|
+
/** Backend-resolved /event destination slug for this pick's source market; its absence is an authoritative no-link decision. */
|
|
1212
|
+
event_link_slug?: string;
|
|
868
1213
|
/** Provider-first sports context for the pick's market (team logos, league branding, live score). Full-state only; omitted when the pick is not a team-sports market. */
|
|
869
1214
|
sports_context?: PickSportsContext;
|
|
870
1215
|
/** Risk disclaimer shown with every pick. */
|
|
871
|
-
disclaimer
|
|
1216
|
+
disclaimer?: string;
|
|
872
1217
|
/** Published same-day picks whose holder proof is not readable yet, ordered by pick_rank. Additive and optional: present only while at least one such pick exists. While present, `picks` carries only the proof-readable picks and `pick_count` counts them. Schedule the next read from the earliest retry_at instead of polling. The route returns 503 read_model_warming only when no published pick has readable proof. */
|
|
873
1218
|
proof_pending_picks?: ProofPendingPickSlot[];
|
|
874
1219
|
/** Frozen admission classification, full payload only. The specialist lane exempts two probability rejects and adds no rank bonus. Historical rows remain standard. */
|
|
@@ -917,30 +1262,40 @@ export type PickOfTheDayArchiveEntry = {
|
|
|
917
1262
|
/** Provider (Polymarket Gamma) market thumbnail URL (markets.image); omitted (not null) when the market has no image. Public regardless of the backed-side gate, so present for pending rows too. */
|
|
918
1263
|
image_url?: string;
|
|
919
1264
|
/** The backed side's outcome label. Omitted for a still-pending pick when the request is not from an authenticated Pro key. */
|
|
920
|
-
pick_outcome_label?: string
|
|
921
|
-
/** Best public V1-compatible S/A smart-money grade on the backed side; a current B-only grade is omitted by the stable V1 adapter, while historical rows retain their frozen policy's grade.
|
|
922
|
-
top_grade?: string
|
|
1265
|
+
pick_outcome_label?: string;
|
|
1266
|
+
/** Best public V1-compatible S/A smart-money grade on the backed side; a current B-only grade is omitted by the stable V1 adapter, while historical rows retain their frozen policy's grade. Omitted when no smart-money wallet backs the pick, when a pending legacy proof has not yet upgraded, or when the stored holder policy is unknown-future or structurally invalid. Resolved legacy history remains supported. */
|
|
1267
|
+
top_grade?: string;
|
|
923
1268
|
/** Settlement outcome of the backed side; 'pending' until the market resolves. */
|
|
924
1269
|
outcome: "pending" | "win" | "loss" | "void";
|
|
925
1270
|
/** Pre-formatted settlement status for display: "Win" / "Loss" / "Void" / "Pending" -- the outcome enum above as a label, from the same formatter the pick payload's outcome_display uses. Convenience only; outcome is the source value. */
|
|
926
1271
|
outcome_display?: string;
|
|
927
|
-
/**
|
|
1272
|
+
/** 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. */
|
|
1273
|
+
stake_usd?: number;
|
|
1274
|
+
/** Gross return of stake_usd on this resolved pick: a win returns stake_usd / backed_price, a loss returns 0, a void refunds stake_usd. A loss always returns 0 (the whole stake is lost regardless of price). The operand is published beside it as backed_price on exactly the same rows, so the entry never has to be recovered by inverting this number. Omitted (not null) only for a still-pending pick or 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. */
|
|
1275
|
+
return_usd?: number;
|
|
1276
|
+
/** The same return on a literal $100 (a win returns 100 / backed_price, a loss 0, a void 100), kept for compatibility: the field predates stake_usd and its name promises the $100 basis. Present exactly when return_usd is. */
|
|
928
1277
|
return_per_100?: number;
|
|
929
|
-
/** Pre-formatted
|
|
1278
|
+
/** 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. */
|
|
930
1279
|
payout_display?: string;
|
|
1280
|
+
/** 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. */
|
|
1281
|
+
backed_price?: number;
|
|
931
1282
|
/** Closing-line value toward the backed side, computed as (close / entry - 1) * 100. Omitted when the row is gated, ineligible, or not measured. */
|
|
932
1283
|
clv_pct?: number;
|
|
933
1284
|
/** Backend-formatted signed CLV percentage, present exactly when clv_pct is present. */
|
|
934
1285
|
clv_display?: string;
|
|
1286
|
+
/** Entry operand of clv_pct: the frozen pick probability the close is compared against. It equals backed_price, which CLV eligibility requires. Present exactly when clv_pct is. */
|
|
1287
|
+
clv_entry_price?: number;
|
|
1288
|
+
/** Close operand of clv_pct: the last valid Polymarket probability before the close bound (kickoff, or the first instant the live feed reported the game in progress when that came earlier). Present exactly when clv_pct is; the close timestamp stays private. */
|
|
1289
|
+
clv_close_price?: number;
|
|
935
1290
|
/** Whether CLV applies. A visible resolved pick published after kickoff is not_applicable. */
|
|
936
1291
|
clv_applicability?: "applicable" | "not_applicable";
|
|
937
|
-
/** Backend-owned CLV formula
|
|
1292
|
+
/** Backend-owned CLV text. A measured row names the entry, then the close, then the formula (close / entry - 1) x 100 and its rounded result; otherwise it gives the reason CLV does not apply or is unavailable. */
|
|
938
1293
|
clv_explanation?: string;
|
|
939
|
-
/** Exact backend CLV capture disposition for this visible row. Pending and terminal provider or quality statuses are distinguishable;
|
|
940
|
-
clv_status
|
|
1294
|
+
/** Exact backend CLV capture disposition for this visible row. Pending and terminal provider or quality statuses are distinguishable; capture timestamps are never serialized, while a measured row's entry and close prices are published as clv_entry_price and clv_close_price. */
|
|
1295
|
+
clv_status?: string;
|
|
941
1296
|
/** Backend-owned CLV evidence basis. Source-null price-match bases preserve unknown original provenance. `historical_provider_nearby_price_match` requires a matching Polymarket point within five minutes before publication. */
|
|
942
1297
|
clv_basis?: string;
|
|
943
|
-
/** Net return for this pick in stake units, where one unit is the
|
|
1298
|
+
/** Net return for this pick in stake units (return_usd / stake_usd - 1), where one unit is one stake_usd stake; the same figure under any stake size. Omitted when the backed side is withheld or the pick is not valued. */
|
|
944
1299
|
unit_score?: number;
|
|
945
1300
|
/** Backend-formatted signed unit score, present exactly when unit_score is present. */
|
|
946
1301
|
unit_score_display?: string;
|
|
@@ -977,9 +1332,11 @@ export type PickOfTheDayHitRate = {
|
|
|
977
1332
|
void: number;
|
|
978
1333
|
/** Number of picks still pending resolution (excluded from the hit rate). */
|
|
979
1334
|
pending: number;
|
|
980
|
-
/**
|
|
1335
|
+
/** The flat stake every money figure here assumes, in USD: 1000 since 2026-09-22 (100 before). Always present. */
|
|
1336
|
+
stake_usd?: number;
|
|
1337
|
+
/** Cumulative profit (USD) of a stake_usd-per-pick strategy over visible valued decided picks: a priced win pays stake_usd/backed_price - stake_usd, every visible loss pays -stake_usd independent of price, and a void pays 0. 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. */
|
|
981
1338
|
net_profit_usd: number;
|
|
982
|
-
/** Total staked (USD) =
|
|
1339
|
+
/** Total staked (USD) = stake_usd * count of visible valued decided picks: every visible loss plus every priced win. Void, unpriced wins, and current non-Insider rows whose price is gated are excluded. */
|
|
983
1340
|
staked_usd: number;
|
|
984
1341
|
/** Return on the staked amount as a percentage (net_profit_usd / staked_usd * 100, to 1 decimal); 0 when nothing is staked. */
|
|
985
1342
|
roi_pct: number;
|
|
@@ -1031,7 +1388,7 @@ export type PickOfTheDayHitRate = {
|
|
|
1031
1388
|
series?: {
|
|
1032
1389
|
/** The decided pick's publish date (YYYY-MM-DD). */
|
|
1033
1390
|
date: string;
|
|
1034
|
-
/** Running cumulative
|
|
1391
|
+
/** Running cumulative stake_usd-per-pick profit (USD) through this pick; valued losses and priced wins are booked, while a non-valued decided row carries profit forward unchanged. */
|
|
1035
1392
|
net_profit_usd: number;
|
|
1036
1393
|
/** Running rolling hit rate (wins / decided * 100, to 1 decimal) through this pick. */
|
|
1037
1394
|
hit_rate_pct: number;
|
|
@@ -1143,51 +1500,51 @@ export type PickOfTheDayUncommittedPayload = {
|
|
|
1143
1500
|
/** Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Team logos and league logo are provider-owned (Polymarket /teams crests for clubs, country flags for national teams and tennis players); no local derivation. */
|
|
1144
1501
|
export type PickSportsContext = {
|
|
1145
1502
|
/** League or competition display name (e.g. "Premier League"). */
|
|
1146
|
-
league_name
|
|
1503
|
+
league_name: string | null;
|
|
1147
1504
|
/** 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. */
|
|
1148
|
-
competition_label?: string
|
|
1505
|
+
competition_label?: string;
|
|
1149
1506
|
/** League logo URL (provider-owned). */
|
|
1150
|
-
league_logo
|
|
1507
|
+
league_logo: string | null;
|
|
1151
1508
|
/** The team mapped to the market's YES outcome, or the parent-event home/first team when event_matchup is true. */
|
|
1152
|
-
yes_team
|
|
1509
|
+
yes_team: PickSportsTeam;
|
|
1153
1510
|
/** The team mapped to the market's NO outcome, or the parent-event away/second team when event_matchup is true. */
|
|
1154
|
-
no_team
|
|
1155
|
-
/** Provider game identifier (Polymarket Gamma gameId); omitted when
|
|
1156
|
-
game_id?: number
|
|
1511
|
+
no_team: PickSportsTeam;
|
|
1512
|
+
/** Provider game identifier (Polymarket Gamma gameId); omitted when the provider supplies none. */
|
|
1513
|
+
game_id?: number;
|
|
1157
1514
|
/** 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. */
|
|
1158
1515
|
event_matchup: boolean;
|
|
1159
1516
|
/** Present only alongside event_matchup: the event team the binary leg is about (provider group_item_title matched to a matchup team, e.g. Belgium for "Will Belgium win?"), i.e. the winner on a Yes resolution. Omitted for teamless legs (draw, totals, prop). */
|
|
1160
1517
|
event_subject_team?: PickSportsTeam;
|
|
1161
1518
|
/** The two teams as a single whole-game label, joined "<home> – <away>" (en-dash) in provider display order (e.g. "Portugal – Uzbekistan"). Composed server-side from the provider team names (no title/slug parsing). Present when both teams resolve a name; omitted for single-subject, teamless, or non-two-team contexts. */
|
|
1162
|
-
matchup_title?: string
|
|
1519
|
+
matchup_title?: string;
|
|
1163
1520
|
};
|
|
1164
1521
|
/** A single sports team or competitor in a Pick of the Day market's sports context. Identity and score fields are provider-owned and nullable. The structured score fields (`sets`, `format`, `sets_won`) and the tennis fields (`headshot`, `tour`) are backend-owned and are OMITTED rather than null when they do not apply, so a consumer must treat an absent key and a null the same way. */
|
|
1165
1522
|
export type PickSportsTeam = {
|
|
1166
1523
|
/** Team display label as it appears on the market outcome (e.g. "Portugal"). */
|
|
1167
|
-
label
|
|
1524
|
+
label: string | null;
|
|
1168
1525
|
/** Abbreviated team label (e.g. "POR"). */
|
|
1169
|
-
short_label
|
|
1526
|
+
short_label: string | null;
|
|
1170
1527
|
/** Full team or competitor name (e.g. "Portugal national football team"). */
|
|
1171
|
-
full_name
|
|
1528
|
+
full_name: string | null;
|
|
1172
1529
|
/** Provider team identifier (Polymarket /teams id). */
|
|
1173
|
-
provider_id
|
|
1530
|
+
provider_id: number | null;
|
|
1174
1531
|
/** Team crest or flag URL. Provider-owned for most teams (Polymarket /teams crest for clubs, country flag for national teams and tennis players). A club with a vendored crest carries it instead, served same-origin as a relative path (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>` or `.png`, resolve it against this server): every NFL and WNBA team, whose provider asset is a text tile, and the soccer clubs whose provider asset is an empty object. */
|
|
1175
|
-
logo
|
|
1532
|
+
logo: string | null;
|
|
1176
1533
|
/** Team brand color as a hex string (provider-owned). */
|
|
1177
|
-
color
|
|
1534
|
+
color: string | null;
|
|
1178
1535
|
/** Win-loss record as a display string (e.g. "12-4"). */
|
|
1179
|
-
record
|
|
1536
|
+
record: string | null;
|
|
1180
1537
|
/** Live or final score as a display string when the game is in play or settled. */
|
|
1181
|
-
score
|
|
1538
|
+
score: string | null;
|
|
1182
1539
|
/** Tennis player headshot URL, served same-origin. Present only for a tennis competitor the headshot resolver matched; absent for team sports and for unmatched players, where `logo` stays the fallback. */
|
|
1183
|
-
headshot?: string
|
|
1540
|
+
headshot?: string;
|
|
1184
1541
|
/** Tennis tour this competitor belongs to. Present for every tennis entry whether or not `headshot` resolved, so a consumer can tell a tennis player with no photo from a non-tennis team. Absent for every other sport. Only `atp` and `wta` name a gender; the ITF World Tennis Tour runs men's and women's events and the provider does not say which, so `itf` means tennis with gender unknown. */
|
|
1185
1542
|
tour?: "atp" | "wta" | "itf";
|
|
1186
1543
|
/** Per-set score cells for this side, in set order. Backend-owned: render these rather than parsing `score`. Omitted entirely when the provider score is not a structured multi-set match or could not be parsed, so an absent array and an empty one carry the same meaning. */
|
|
1187
1544
|
sets?: ScoreCell[];
|
|
1188
1545
|
format?: ScoreFormat;
|
|
1189
1546
|
/** Completed sets won by this side. Present only when both sides expose the same set columns, so a partially parsed scoreline reports no tally rather than a misleading one. */
|
|
1190
|
-
sets_won?: number
|
|
1547
|
+
sets_won?: number;
|
|
1191
1548
|
};
|
|
1192
1549
|
/** Field-level trust metadata for the full Pick of the Day payload. Present on the full shape only (omitted on the teaser and the no-pick state, because whether a specialist backs the pick is itself backed-side evidence). Unlike TraderTrust it is not gated behind expand=trust: it carries one member on an endpoint that returns a single object per day. */
|
|
1193
1550
|
export type PickTrust = {
|
|
@@ -1199,7 +1556,10 @@ export type PlatformCapabilities = {
|
|
|
1199
1556
|
pnl: PlatformCapabilityStatus;
|
|
1200
1557
|
strategy: PlatformCapabilityStatus;
|
|
1201
1558
|
timeline: PlatformCapabilityStatus;
|
|
1559
|
+
/** The large-trade feed. Canonical key since #16304; whale_signal is its deprecated spelling, emitted beside it with the same value. */
|
|
1560
|
+
large_trades: PlatformCapabilityStatus;
|
|
1202
1561
|
whale_signal: PlatformCapabilityStatus;
|
|
1562
|
+
suspicious_trades: PlatformCapabilityStatus;
|
|
1203
1563
|
insider_radar: PlatformCapabilityStatus;
|
|
1204
1564
|
market_snapshot: PlatformCapabilityStatus;
|
|
1205
1565
|
};
|
|
@@ -1219,33 +1579,33 @@ export type Position = {
|
|
|
1219
1579
|
/** Binary outcome side. Non-binary positions are not surfaced on V1. */
|
|
1220
1580
|
side: "YES" | "NO";
|
|
1221
1581
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1222
|
-
token_id
|
|
1582
|
+
token_id: string | null;
|
|
1223
1583
|
/** Live share count from the wallet_positions mirror. */
|
|
1224
1584
|
shares: number;
|
|
1225
1585
|
/** Volume-weighted entry price for this leg. */
|
|
1226
|
-
avg_price?: number
|
|
1586
|
+
avg_price?: number;
|
|
1227
1587
|
/** Current mark-to-market value in USD (always non-null on V1 — pre-reconcile rows are excluded). */
|
|
1228
1588
|
current_value_usd: number;
|
|
1229
|
-
initial_value_usd?: number
|
|
1589
|
+
initial_value_usd?: number;
|
|
1230
1590
|
/** Unrealized P&L for the open position (Polymarket `cashPnl`). */
|
|
1231
|
-
cash_pnl?: number
|
|
1591
|
+
cash_pnl?: number;
|
|
1232
1592
|
/** Closed-leg P&L rolled up (Polymarket `realizedPnl`). */
|
|
1233
|
-
realized_pnl?: number
|
|
1593
|
+
realized_pnl?: number;
|
|
1234
1594
|
/** Max updated_at across mirror legs for this pair. */
|
|
1235
|
-
last_reconciled_at?: string
|
|
1595
|
+
last_reconciled_at?: string;
|
|
1236
1596
|
/** Backend-computed staleness bucket derived from last_reconciled_at. */
|
|
1237
1597
|
freshness: "fresh" | "refreshing" | "stale" | "unknown";
|
|
1238
1598
|
trader: {
|
|
1239
1599
|
/** Prefixed ID (`trd_...`). */
|
|
1240
1600
|
id: string;
|
|
1241
1601
|
address: string;
|
|
1242
|
-
username?: string
|
|
1602
|
+
username?: string;
|
|
1243
1603
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1244
1604
|
/** Percentage 0-100. */
|
|
1245
|
-
win_rate?: number
|
|
1246
|
-
pnl?: number
|
|
1247
|
-
markets?: number
|
|
1248
|
-
wallet_age_days?: number
|
|
1605
|
+
win_rate?: number;
|
|
1606
|
+
pnl?: number;
|
|
1607
|
+
markets?: number;
|
|
1608
|
+
wallet_age_days?: number;
|
|
1249
1609
|
/** True when 0xinsider first recorded the wallet within the new-wallet threshold (30 days). This public V1 field is first-seen recency, not the wallet's on-chain age. */
|
|
1250
1610
|
is_new_wallet: boolean;
|
|
1251
1611
|
};
|
|
@@ -1254,13 +1614,13 @@ export type Position = {
|
|
|
1254
1614
|
id: string;
|
|
1255
1615
|
condition_id: string;
|
|
1256
1616
|
title: string;
|
|
1257
|
-
slug?: string
|
|
1258
|
-
event_slug?: string
|
|
1617
|
+
slug?: string;
|
|
1618
|
+
event_slug?: string;
|
|
1259
1619
|
/** Provider-backed market_canonical category. */
|
|
1260
|
-
category?: string
|
|
1620
|
+
category?: string;
|
|
1261
1621
|
/** Provider-reported outcome label (e.g. team name for sports). Separate from `side` because provider labels can diverge from the binary Yes/No axis. */
|
|
1262
|
-
outcome_label?: string
|
|
1263
|
-
end_date?: string
|
|
1622
|
+
outcome_label?: string;
|
|
1623
|
+
end_date?: string;
|
|
1264
1624
|
};
|
|
1265
1625
|
};
|
|
1266
1626
|
export type PositionTimelineEvent = {
|
|
@@ -1272,7 +1632,7 @@ export type PositionTimelineEvent = {
|
|
|
1272
1632
|
action: "buy" | "sell";
|
|
1273
1633
|
outcome_side: "yes" | "no";
|
|
1274
1634
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for this outcome; null when unavailable (e.g. unsynced markets). */
|
|
1275
|
-
token_id
|
|
1635
|
+
token_id: string | null;
|
|
1276
1636
|
/** Signed share delta (+ on buy, − on sell). */
|
|
1277
1637
|
amount_delta: number;
|
|
1278
1638
|
/** Fill price in USDC per share, in [0,1]. */
|
|
@@ -1307,6 +1667,193 @@ export type PotdEntryAuthorization = {
|
|
|
1307
1667
|
/** Original provider kickoff ceiling. Never extended on retry. */
|
|
1308
1668
|
expires_at: string;
|
|
1309
1669
|
};
|
|
1670
|
+
/** One ranked pre-game sports market where graded sharp money is piled on one side, with required-status shadow category evidence from partial forward-observed Polymarket fills. */
|
|
1671
|
+
export type PreGameSide = {
|
|
1672
|
+
/** The side profitable wallets hold, as a provider-backed display label. Canonical spelling of piled_side (#16310), same value: when provider group context is unavailable it may remain a bare Yes/No/Over/Under, so do not use it alone as participant identity. */
|
|
1673
|
+
side: string | null;
|
|
1674
|
+
/** UTC time at which the snapshot that ranked this row was computed. Canonical spelling of signal_created_at (#16310), same value. */
|
|
1675
|
+
ranked_at: string;
|
|
1676
|
+
/** Grade-weighted holders times the share of their money on the side: (5*s + 4*a + 3*b) * sharp_pct. Canonical spelling of conviction_score (#16310), same value. */
|
|
1677
|
+
backing_score: number;
|
|
1678
|
+
/** Signed share of graded money on the side, (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (side-yes positive, side-no negative). Canonical spelling of smart_score (#16309, #16310), same value. */
|
|
1679
|
+
side_share: number | null;
|
|
1680
|
+
/** Polymarket condition id. */
|
|
1681
|
+
condition_id: string;
|
|
1682
|
+
/** UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. Deprecated (#16310): `ranked_at` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1683
|
+
signal_created_at: string;
|
|
1684
|
+
/** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
|
|
1685
|
+
token_id: string | null;
|
|
1686
|
+
/** Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping. */
|
|
1687
|
+
category: string | null;
|
|
1688
|
+
/** Raw provider category as stored (e.g. NBA, EPL). */
|
|
1689
|
+
raw_category: string | null;
|
|
1690
|
+
title: string | null;
|
|
1691
|
+
event_slug: string | null;
|
|
1692
|
+
/** Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started. */
|
|
1693
|
+
game_start_time: string | null;
|
|
1694
|
+
/** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1695
|
+
piled_side: string | null;
|
|
1696
|
+
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1697
|
+
piled_outcome_index: number;
|
|
1698
|
+
/** Piled-side dollar concentration backed_usd / (yes_usd + no_usd), in (0.5, 1] for a real pile; null when there is no sharp USD. */
|
|
1699
|
+
sharp_pct: number | null;
|
|
1700
|
+
/** Raw piled-side sharp-money USD. */
|
|
1701
|
+
backed_sharp_usd: number;
|
|
1702
|
+
/** S-grade graded holders on the piled side. */
|
|
1703
|
+
s_count: number;
|
|
1704
|
+
/** A-grade graded holders on the piled side. */
|
|
1705
|
+
a_count: number;
|
|
1706
|
+
/** B-grade graded holders on the piled side. */
|
|
1707
|
+
b_count: number;
|
|
1708
|
+
/** Piled-side graded holder count (s_count + a_count + b_count). */
|
|
1709
|
+
graded_holders: number;
|
|
1710
|
+
/** Best grade present on the piled side; null when none. */
|
|
1711
|
+
top_grade: "S" | "A" | "B" | null;
|
|
1712
|
+
/** Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1713
|
+
smart_score: number | null;
|
|
1714
|
+
/** Market volume (USD). */
|
|
1715
|
+
volume: number | null;
|
|
1716
|
+
/** Aggregate recent flow direction on the market; null when unavailable. */
|
|
1717
|
+
net_side: "BUY" | "SELL" | null;
|
|
1718
|
+
/** Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1719
|
+
conviction_score: number;
|
|
1720
|
+
/** Piled-side graded holders read one-way: their fresh open legs across the signal game's markets (cross-market within the one game; moneyline+spread family only) all back the same team, or, when the market's holder scan was complete, Polymarket's currentValue shows no opposite leg on this market worth 10% of the backed leg and no fresh leg opposes it. Null when the directional read was not computed (no groupable game, no holder-level data on this ranking path, or the enrichment read failed) or classified nobody. */
|
|
1721
|
+
one_way_holder_count: number | null;
|
|
1722
|
+
/** Piled-side graded holders classified HEDGED across the game by fresh legs (they back two or more distinct teams). A wallet long both outcomes of this market is not one-way and not counted here. Null when the directional read was not computed or classified nobody. */
|
|
1723
|
+
hedged_holder_count: number | null;
|
|
1724
|
+
/** Piled-side graded USD held by one-way wallets (share-weighted allocation of backed_sharp_usd). Null when the directional read was not computed or classified nobody. */
|
|
1725
|
+
one_way_graded_usd: number | null;
|
|
1726
|
+
/** One-way fraction of the piled graded dollars, in [0, 1] -- the metric orthogonal to sharp_pct. Stale, unknown, hedged, and two-sided dollars dilute it toward zero (conservative). Null when the directional read was not computed or classified nobody. */
|
|
1727
|
+
directional_confidence: number | null;
|
|
1728
|
+
/** The ranking key, descending: conviction_score * (1 + 0.25 * directional_confidence). Equals conviction_score when the directional read is null/zero, so signals without the read rank exactly as before. */
|
|
1729
|
+
directional_rank_score: number;
|
|
1730
|
+
category_skill: PreGameSideCategorySkill;
|
|
1731
|
+
/** 1-based rank within the (min_grade-filtered) ranked result. */
|
|
1732
|
+
rank: number;
|
|
1733
|
+
};
|
|
1734
|
+
/** Shadow-only category evidence over the full uncapped piled-side S/A/B holder allocation. It never changes signal membership, ordering, routing, or sizing. */
|
|
1735
|
+
export type PreGameSideCategorySkill = {
|
|
1736
|
+
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
1737
|
+
model_version: string;
|
|
1738
|
+
taxonomy_version: string | null;
|
|
1739
|
+
platform: "polymarket";
|
|
1740
|
+
scope: "observed_goldsky_primary_taker_fill";
|
|
1741
|
+
source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
|
|
1742
|
+
observation_started_at: string;
|
|
1743
|
+
as_of: string;
|
|
1744
|
+
canonical_category: string | null;
|
|
1745
|
+
eligible_holders: number;
|
|
1746
|
+
covered_holders: number;
|
|
1747
|
+
backed_sharp_usd: number | null;
|
|
1748
|
+
covered_backed_usd: number | null;
|
|
1749
|
+
coverage_pct: number | null;
|
|
1750
|
+
weighted_edge_mean: number | null;
|
|
1751
|
+
weighted_holder_lower_mean: number | null;
|
|
1752
|
+
specialist_backed_usd: number | null;
|
|
1753
|
+
specialist_backed_usd_pct: number | null;
|
|
1754
|
+
largest_holder_backed_usd_pct: number | null;
|
|
1755
|
+
minimum_holder_event_count: number | null;
|
|
1756
|
+
};
|
|
1757
|
+
/** Per-sport accountable funnel for the full observation snapshot, returned on every page. */
|
|
1758
|
+
export type PreGameSideFunnelReport = {
|
|
1759
|
+
sports: PreGameSideSportFunnelReport[];
|
|
1760
|
+
};
|
|
1761
|
+
/** One explicitly observation-only holder-pile measurement. It is evidence for cohort evaluation, not an execution instruction, and is isolated from the funded sports-edge-signals route. */
|
|
1762
|
+
export type PreGameSideObservation = {
|
|
1763
|
+
/** The side profitable wallets hold, as a provider-backed display label. Canonical spelling of piled_side (#16310), same value: when provider group context is unavailable it may remain a bare Yes/No/Over/Under, so do not use it alone as participant identity. */
|
|
1764
|
+
side: string | null;
|
|
1765
|
+
/** Grade-weighted holder-pile score before directional enrichment. Canonical spelling of conviction_score (#16310), same value. */
|
|
1766
|
+
backing_score: number;
|
|
1767
|
+
/** Signed share of graded money on the side, in [-1, 1]. Canonical spelling of smart_score (#16309, #16310), same value. */
|
|
1768
|
+
side_share: number;
|
|
1769
|
+
/** Raw Polymarket condition id. */
|
|
1770
|
+
condition_id: string;
|
|
1771
|
+
/** Provider-backed Polymarket CLOB token id for the piled outcome. Rows without a verified token terminate before emission. */
|
|
1772
|
+
token_id: string;
|
|
1773
|
+
/** Canonical sport bucket. */
|
|
1774
|
+
category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1775
|
+
/** Raw provider category as stored. */
|
|
1776
|
+
raw_category: string | null;
|
|
1777
|
+
/** Provider-backed market title. */
|
|
1778
|
+
title: string;
|
|
1779
|
+
event_slug: string | null;
|
|
1780
|
+
/** Provider event id when available. */
|
|
1781
|
+
event_id: string | null;
|
|
1782
|
+
/** Provider parent-event id used as the first event-cap identity when available. */
|
|
1783
|
+
parent_event_id: string | null;
|
|
1784
|
+
/** Provider-backed kickoff time in UTC. */
|
|
1785
|
+
game_start_time: string;
|
|
1786
|
+
/** UTC instant when this row finished provider/holder evaluation. */
|
|
1787
|
+
observed_at: string;
|
|
1788
|
+
/** 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. */
|
|
1789
|
+
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
1790
|
+
/** Always true. This row must not be routed to an order executor. */
|
|
1791
|
+
observation_only: true;
|
|
1792
|
+
/** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. Deprecated (#16310): `side` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1793
|
+
piled_side: string | null;
|
|
1794
|
+
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1795
|
+
piled_outcome_index: 0 | 1;
|
|
1796
|
+
/** Provider-backed implied price for the piled outcome at observation time. */
|
|
1797
|
+
backed_price: number;
|
|
1798
|
+
/** Piled-side graded-holder dollar concentration. */
|
|
1799
|
+
sharp_pct: number;
|
|
1800
|
+
/** Raw graded-holder USD on the piled outcome. */
|
|
1801
|
+
backed_sharp_usd: number;
|
|
1802
|
+
s_count: number;
|
|
1803
|
+
a_count: number;
|
|
1804
|
+
b_count: number;
|
|
1805
|
+
/** Piled-side S/A/B holder count. */
|
|
1806
|
+
graded_holders: number;
|
|
1807
|
+
top_grade: "S" | "A" | "B";
|
|
1808
|
+
/** Canonical signed holder-pile score. Deprecated (#16310): `side_share` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1809
|
+
smart_score: number;
|
|
1810
|
+
/** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
|
|
1811
|
+
volume: number;
|
|
1812
|
+
/** Grade-weighted holder-pile score before directional enrichment. Deprecated (#16310): `backing_score` is the canonical spelling and carries the same value; this key stays on the wire. */
|
|
1813
|
+
conviction_score: number;
|
|
1814
|
+
/** Whether the provider holder page came from the shared cache or a live provider read. */
|
|
1815
|
+
provider_read_source: "cached" | "live";
|
|
1816
|
+
/** True only when neither provider outcome holder page hit the top-100 scan bound. False means the pile is a positive lower bound and cannot satisfy a future capital-promotion gate. */
|
|
1817
|
+
holder_scan_complete: boolean;
|
|
1818
|
+
/** 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. */
|
|
1819
|
+
holder_snapshot_at: string | null;
|
|
1820
|
+
/** 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. */
|
|
1821
|
+
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
1822
|
+
one_way_holder_count: number | null;
|
|
1823
|
+
hedged_holder_count: number | null;
|
|
1824
|
+
one_way_graded_usd: number | null;
|
|
1825
|
+
directional_confidence: number | null;
|
|
1826
|
+
/** Default cohort ordering key: conviction_score * (1 + 0.25 * directional_confidence), or conviction_score when confidence is null. */
|
|
1827
|
+
directional_rank_score: number;
|
|
1828
|
+
/** 1-based rank within this observation cohort and snapshot. */
|
|
1829
|
+
rank: number;
|
|
1830
|
+
};
|
|
1831
|
+
/** Closed 25-value terminal-reason vocabulary for the accountable sports-edge observation funnel. capacity_limited is intentional bounded provider-work admission and does not itself set the snapshot degraded. board_source_unavailable is a completed board-source failure; board_deadline_unavailable means live-board work missed either an internal configured-scope deadline or the outer fair-wave deadline; both classify only already-started rows, so for the upcoming source read funnel.sports[].board_upcoming_status instead; provider_unavailable is reserved for an attempted holder-provider failure; holder_deadline_unavailable is holder cache/provider absolute-deadline exhaustion. */
|
|
1832
|
+
export type PreGameSideObservationTerminalReason = "outside_horizon" | "resolved" | "provider_closed" | "provider_excluded" | "invalid_market" | "missing_token" | "missing_stored_market" | "not_provider_live" | "board_source_unavailable" | "board_deadline_unavailable" | "primary_slate_candidate" | "zero_indexed_holder_research" | "capacity_limited" | "provider_unavailable" | "holder_deadline_unavailable" | "holder_computation_unavailable" | "holder_scan_incomplete" | "no_current_graded_holder" | "split_holder_pile" | "price_unavailable" | "wider_holder_emitted" | "in_play_emitted" | "in_play_stale_observed" | "in_play_directional_unavailable" | "internal_unclassified";
|
|
1833
|
+
/** Independent sports-board supply plus stored-universe terminal accounting for one canonical sport. */
|
|
1834
|
+
export type PreGameSideSportFunnelReport = {
|
|
1835
|
+
sport: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1836
|
+
/** Unique condition ids independently visible on the provider-first sports board. */
|
|
1837
|
+
board_input: number;
|
|
1838
|
+
/** Whether the always-applicable live-board source completed as available. False can mean a completed source failure (board_source_unavailable) or live-board work missing an internal configured-scope deadline or the outer fair-wave deadline (board_deadline_unavailable); inspect terminals to distinguish them. */
|
|
1839
|
+
board_live_available: boolean;
|
|
1840
|
+
/** Whether a provider-backed upcoming-board source is configured and applicable for this sport. False means not applicable, not provider failure. */
|
|
1841
|
+
board_upcoming_configured: boolean;
|
|
1842
|
+
/** Whether every configured upcoming-board scope completed as available. False with board_upcoming_configured=false means not applicable. When board_upcoming_configured is true and this flag is false, read board_upcoming_status for the cause (it reads unknown, i.e. no recorded cause, only on a snapshot cached before that field existed, which self-clears within one TTL): the board_source_unavailable and board_deadline_unavailable terminals are assigned only to already-started rows (the live half) and are structurally 0 for the upcoming source, so they never explain this flag. */
|
|
1843
|
+
board_upcoming_available: boolean;
|
|
1844
|
+
/** Why the upcoming-board source is (un)available. Board supply is one canonical-sport union: the bare category owns live truth and every configured composed league scope contributes upcoming rows; folded leagues without a configured board (currently NCAAB and CFL) are not in the upcoming union. available: every configured scope completed truthfully (a successful empty schedule still counts). capacity_limited: provider pagination or a configured upcoming cache published an intentionally bounded complete-event prefix; those rows are excluded from diagnostic-universe input and must not be treated as a complete upcoming universe. Cache-bound prefixes are limited to 3,000 rows or an exact 5,000,000-byte final envelope. source_unavailable: composition failed before a truthful union; resolved scope readers turn half failures into cold_unavailable, so fresh producers are whole-union identity reconciliation or a registry contract failure and carry zero rows. cold_unavailable: every scope completed but at least one reported its upcoming half unavailable because no servable entry was inside the stale-serve bound and the background warm did not land in time; it is not by itself proof of a provider outage. deadline_unavailable: an internal configured-scope deadline or the outer bounded fair wave expired. An internal deadline may retain healthy bare-category or sibling-scope rows; the outer wave records zero rows. These upcoming fields do not describe league live-membership availability. If the bare-category live scope fails, all live rows are dropped even when a league scope completed, because the bare category is the sole live-truth owner. not_configured: no upcoming scope applies to the sport. unknown: exactly one cause -- a snapshot cached before this field existed whose legacy flags recorded an unavailable-but-configured half without saying why. Every freshly computed snapshot reports a concrete status, and a legacy available or not-configured row is reconstructed exactly, so unknown self-clears within one TTL. board_upcoming_available is exactly board_upcoming_status == available. */
|
|
1845
|
+
board_upcoming_status: "unknown" | "not_configured" | "available" | "capacity_limited" | "source_unavailable" | "cold_unavailable" | "deadline_unavailable";
|
|
1846
|
+
/** Configured upcoming scopes that did not complete as available. Values are category, a provider league tag slug (nfl, cfb, nba, wnba, nhl, mls, valorant, league-of-legends, counter-strike-2, or dota-2), registry when the compiled scope/projection contract drifted, union when cross-scope identity reconciliation failed, or wave when the outer fair-wave deadline expired before scope-level evidence returned. Empty means no unavailable upcoming scope was identified; this includes healthy/not-configured rows and a legacy cached row. Observation league scopes are upcoming-only and perform no live-membership read. */
|
|
1847
|
+
board_upcoming_unavailable_scopes: ("category" | "nfl" | "cfb" | "nba" | "wnba" | "nhl" | "mls" | "valorant" | "league-of-legends" | "counter-strike-2" | "dota-2" | "registry" | "union" | "wave")[];
|
|
1848
|
+
/** Stored-universe rows plus provider-board rows missing from storage. */
|
|
1849
|
+
input: number;
|
|
1850
|
+
/** Sparse counts over the closed 25-value terminal vocabulary: outside_horizon, resolved, provider_closed, provider_excluded, invalid_market, missing_token, missing_stored_market, not_provider_live, board_source_unavailable, board_deadline_unavailable, primary_slate_candidate, zero_indexed_holder_research, capacity_limited, provider_unavailable, holder_deadline_unavailable, holder_computation_unavailable, holder_scan_incomplete, no_current_graded_holder, split_holder_pile, price_unavailable, wider_holder_emitted, in_play_emitted, in_play_stale_observed, in_play_directional_unavailable, or internal_unclassified. primary_slate_candidate means exact admission by the funded route's raw shared signals query before provider/holder enrichment; recent-flow rows rejected by its event, bucket, or total caps remain eligible for wider_holder measurement. capacity_limited is intentional bounded provider-work admission, is fully accounted here, and does not itself set degraded=true. board_source_unavailable means a completed board source was unavailable; board_deadline_unavailable means live-board work missed either an internal configured-scope deadline or the outer fair-wave deadline; provider_unavailable means an attempted holder-provider read failed; holder_deadline_unavailable means holder cache/provider work missed the absolute request deadline; holder_computation_unavailable means post-holder provider or DB-backed price/metadata evaluation was unavailable. */
|
|
1851
|
+
terminals: Record<string, number>;
|
|
1852
|
+
/** Sum of every sparse terminal count. */
|
|
1853
|
+
terminal_total: number;
|
|
1854
|
+
/** True exactly when input equals terminal_total. */
|
|
1855
|
+
reconciled: boolean;
|
|
1856
|
+
};
|
|
1310
1857
|
/** One PUBLISHED same-day pick whose holder proof is not readable yet: its stable slot rank, the release and kickoff instants, and the instant before which a retry cannot succeed. Every item in `picks` carries its full required shape, so a pick that cannot meet it is listed here instead of being served with missing fields or a synthetic zero. */
|
|
1311
1858
|
export type ProofPendingPickSlot = {
|
|
1312
1859
|
/** Stable 1-based slot within the product day's ranked picks. The pick keeps this rank once its proof is readable and it moves into `picks`. */
|
|
@@ -1318,78 +1865,80 @@ export type ProofPendingPickSlot = {
|
|
|
1318
1865
|
/** Recommended next read: 30 seconds ahead while pre-game proof is warming, one hour ahead for a post-kickoff pending legacy row that only settlement can make readable. Schedule against it instead of polling. */
|
|
1319
1866
|
retry_at: string;
|
|
1320
1867
|
};
|
|
1321
|
-
export type RadarFlag = {
|
|
1322
|
-
/** Prefixed ID (rf_...). */
|
|
1323
|
-
id: string;
|
|
1324
|
-
/** Stored score that met the live flag threshold. */
|
|
1325
|
-
suspicion_score: number;
|
|
1326
|
-
/** The live scorer persists one threshold class. */
|
|
1327
|
-
severity: "flag";
|
|
1328
|
-
trader: {
|
|
1329
|
-
id: string;
|
|
1330
|
-
address: string;
|
|
1331
|
-
username?: string | null;
|
|
1332
|
-
};
|
|
1333
|
-
market: {
|
|
1334
|
-
id: string;
|
|
1335
|
-
condition_id: string;
|
|
1336
|
-
/** Canonical market question when available. */
|
|
1337
|
-
title: string | null;
|
|
1338
|
-
};
|
|
1339
|
-
scores: {
|
|
1340
|
-
/** Null because the live scorer does not record this component. */
|
|
1341
|
-
timing?: number | null;
|
|
1342
|
-
/** Null because the live scorer does not record this component. */
|
|
1343
|
-
edge?: number | null;
|
|
1344
|
-
/** Numeric evidence.size when recorded; otherwise null. */
|
|
1345
|
-
size?: number | null;
|
|
1346
|
-
/** Numeric evidence.fresh when recorded; otherwise null. */
|
|
1347
|
-
fresh_wallet?: number | null;
|
|
1348
|
-
};
|
|
1349
|
-
/** Stored whale_alerts.suspicion_signals JSON from the scorer. */
|
|
1350
|
-
evidence: unknown;
|
|
1351
|
-
/** Stored trade timestamp. */
|
|
1352
|
-
created_at: string;
|
|
1353
|
-
};
|
|
1354
1868
|
export type ReportPayload = {
|
|
1355
|
-
total_whale_trades
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1869
|
+
/** Canonical key since #16304; total_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
1870
|
+
total_large_trades: number | null;
|
|
1871
|
+
total_whale_trades: number | null;
|
|
1872
|
+
/** Canonical key since #16304; total_whale_volume is its deprecated spelling, emitted beside it with the same value. */
|
|
1873
|
+
total_large_trade_volume: number | null;
|
|
1874
|
+
total_whale_volume: number | null;
|
|
1875
|
+
biggest_trade_size: number | null;
|
|
1876
|
+
active_traders: number | null;
|
|
1877
|
+
/** Canonical key since #16304; top_whale_trades is its deprecated spelling, emitted beside it with the same value. */
|
|
1878
|
+
top_large_trades: ({
|
|
1879
|
+
/** Provider outcome label for the traded side. */
|
|
1880
|
+
outcome: string | null;
|
|
1881
|
+
/** Trade direction (BUY or SELL), not the outcome side. */
|
|
1882
|
+
side: string | null;
|
|
1883
|
+
/** Market title. */
|
|
1884
|
+
title: string | null;
|
|
1885
|
+
/** Trade size in USD. */
|
|
1886
|
+
size: number | null;
|
|
1887
|
+
/** Trade price in provider [0, 1] units. */
|
|
1888
|
+
price: number | null;
|
|
1889
|
+
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets). */
|
|
1890
|
+
token_id: string | null;
|
|
1891
|
+
/** Whale trade id. */
|
|
1892
|
+
id: number | null;
|
|
1893
|
+
/** Trade timestamp (UTC). */
|
|
1894
|
+
trade_time: string | null;
|
|
1895
|
+
/** Provider market category. */
|
|
1896
|
+
market_category: string | null;
|
|
1897
|
+
/** Venue: polymarket. */
|
|
1898
|
+
platform: string | null;
|
|
1899
|
+
/** Trader display name, when known. */
|
|
1900
|
+
name: string | null;
|
|
1901
|
+
/** Trader pseudonym, when no display name is known. */
|
|
1902
|
+
pseudonym: string | null;
|
|
1903
|
+
/** Trader grade (S-F) at snapshot time. */
|
|
1904
|
+
trader_grade: string | null;
|
|
1905
|
+
})[] | null;
|
|
1906
|
+
top_whale_trades: ({
|
|
1360
1907
|
/** Provider outcome label for the traded side. */
|
|
1361
|
-
outcome
|
|
1908
|
+
outcome: string | null;
|
|
1362
1909
|
/** Trade direction (BUY or SELL), not the outcome side. */
|
|
1363
|
-
side
|
|
1910
|
+
side: string | null;
|
|
1364
1911
|
/** Market title. */
|
|
1365
|
-
title
|
|
1912
|
+
title: string | null;
|
|
1366
1913
|
/** Trade size in USD. */
|
|
1367
|
-
size
|
|
1914
|
+
size: number | null;
|
|
1368
1915
|
/** Trade price in provider [0, 1] units. */
|
|
1369
|
-
price
|
|
1916
|
+
price: number | null;
|
|
1370
1917
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets). */
|
|
1371
|
-
token_id
|
|
1918
|
+
token_id: string | null;
|
|
1372
1919
|
/** Whale trade id. */
|
|
1373
|
-
id
|
|
1920
|
+
id: number | null;
|
|
1374
1921
|
/** Trade timestamp (UTC). */
|
|
1375
|
-
trade_time
|
|
1922
|
+
trade_time: string | null;
|
|
1376
1923
|
/** Provider market category. */
|
|
1377
|
-
market_category
|
|
1924
|
+
market_category: string | null;
|
|
1378
1925
|
/** Venue: polymarket. */
|
|
1379
|
-
platform
|
|
1926
|
+
platform: string | null;
|
|
1380
1927
|
/** Trader display name, when known. */
|
|
1381
|
-
name
|
|
1928
|
+
name: string | null;
|
|
1382
1929
|
/** Trader pseudonym, when no display name is known. */
|
|
1383
|
-
pseudonym
|
|
1930
|
+
pseudonym: string | null;
|
|
1384
1931
|
/** Trader grade (S-F) at snapshot time. */
|
|
1385
|
-
trader_grade
|
|
1932
|
+
trader_grade: string | null;
|
|
1386
1933
|
})[] | null;
|
|
1387
|
-
categories
|
|
1388
|
-
|
|
1934
|
+
categories: Record<string, unknown>[] | null;
|
|
1935
|
+
/** 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. */
|
|
1936
|
+
grade_distribution: Record<string, unknown>[] | null;
|
|
1389
1937
|
};
|
|
1390
1938
|
export type ReportReconciliation = {
|
|
1391
1939
|
volume_kind: "local_whale_activity_volume";
|
|
1392
|
-
|
|
1940
|
+
/** Where the whale volume in this report is read from: the column name `whale_alerts.usdc_notional_num`, followed in parentheses by the reconciliation note the server attaches to it. The server has always sent the note with the name, so this is not a bare constant; match on the prefix, not the whole string. */
|
|
1941
|
+
whale_volume_source: string;
|
|
1393
1942
|
notes: string;
|
|
1394
1943
|
};
|
|
1395
1944
|
export type ReportSnapshot = {
|
|
@@ -1407,17 +1956,17 @@ export type ReportSourceRange = {
|
|
|
1407
1956
|
timezone: "UTC";
|
|
1408
1957
|
};
|
|
1409
1958
|
export type ResponseMeta = {
|
|
1410
|
-
/** Unique request ID (req_ prefix). */
|
|
1959
|
+
/** 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. */
|
|
1411
1960
|
request_id: string;
|
|
1412
1961
|
cached: boolean;
|
|
1413
1962
|
/** Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL. */
|
|
1414
|
-
cache_age_s?: number
|
|
1963
|
+
cache_age_s?: number;
|
|
1415
1964
|
/** Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price. */
|
|
1416
1965
|
cost: number;
|
|
1417
1966
|
/** Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking. */
|
|
1418
|
-
ranking_generation?: number
|
|
1967
|
+
ranking_generation?: number;
|
|
1419
1968
|
/** Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order. */
|
|
1420
|
-
ranking_as_of?: string
|
|
1969
|
+
ranking_as_of?: string;
|
|
1421
1970
|
/** Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a smart-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read. */
|
|
1422
1971
|
directional_source?: "live" | "degraded";
|
|
1423
1972
|
/** Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a smart-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade. */
|
|
@@ -1476,7 +2025,9 @@ export type SmartMoneyFlowMarket = {
|
|
|
1476
2025
|
net_flow_usd: number;
|
|
1477
2026
|
direction: "YES" | "NO";
|
|
1478
2027
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1479
|
-
token_id
|
|
2028
|
+
token_id: string | null;
|
|
2029
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
2030
|
+
large_trade_count?: number;
|
|
1480
2031
|
whale_trade_count: number;
|
|
1481
2032
|
buy_volume_usd: number;
|
|
1482
2033
|
sell_volume_usd: number;
|
|
@@ -1486,7 +2037,9 @@ export type SmartMoneyFlowMarket = {
|
|
|
1486
2037
|
net_flow_usd: number;
|
|
1487
2038
|
direction: "YES" | "NO";
|
|
1488
2039
|
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the net-flow direction outcome; null when unavailable (e.g. unsynced markets). */
|
|
1489
|
-
token_id
|
|
2040
|
+
token_id: string | null;
|
|
2041
|
+
/** Canonical key since #16304 (Polymarket's noun is large trade); whale_trade_count is its deprecated spelling, emitted beside it with the same value. */
|
|
2042
|
+
large_trade_count?: number;
|
|
1490
2043
|
whale_trade_count: number;
|
|
1491
2044
|
buy_volume_usd: number;
|
|
1492
2045
|
sell_volume_usd: number;
|
|
@@ -1494,225 +2047,98 @@ export type SmartMoneyFlowMarket = {
|
|
|
1494
2047
|
timeframe: string;
|
|
1495
2048
|
};
|
|
1496
2049
|
export type SnapshotCompleteness = {
|
|
2050
|
+
/** complete only on a final body (snapshot.status final). partial for a live range and for a closed range whose body was read before final_after; reason says which. empty when the range has no whale activity. */
|
|
1497
2051
|
status: "complete" | "partial" | "empty";
|
|
1498
2052
|
reason: string;
|
|
1499
2053
|
expected_days: number;
|
|
2054
|
+
/** Canonical key since #16304; covered_days_with_whale_activity is its deprecated spelling, emitted beside it with the same value. */
|
|
2055
|
+
covered_days_with_large_trade_activity?: number;
|
|
1500
2056
|
covered_days_with_whale_activity: number;
|
|
1501
2057
|
};
|
|
1502
2058
|
export type SnapshotState = {
|
|
1503
|
-
/** Immutable content version for
|
|
2059
|
+
/** Immutable content version for a durable report identity; 0 for an ephemeral explicit weekly from/to range. */
|
|
1504
2060
|
version: number;
|
|
2061
|
+
/** durable for canonical daily, ISO-week, and monthly snapshot identities; ephemeral for explicit weekly from/to ranges, which are recomputed within a bounded 31-day window and never persisted. */
|
|
2062
|
+
storage: "durable" | "ephemeral";
|
|
2063
|
+
/** final only for a body whose source read started at or after final_after (the UTC close of the range plus the whale-trade ingestion budget). rolling for a live range and for a closed range still inside that budget: such a body refreshes every five minutes, is rebuilt once after final_after, and is then frozen. Before 2026-09-22 a closed range read final from the calendar alone, even for a body built before the range ended (#16225). */
|
|
1505
2064
|
status: "final" | "rolling";
|
|
1506
2065
|
generated_at: string;
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
/**
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
/**
|
|
1514
|
-
|
|
1515
|
-
/** Raw Polymarket condition id. */
|
|
1516
|
-
condition_id: string;
|
|
1517
|
-
/** Provider-backed Polymarket CLOB token id for the piled outcome. Rows without a verified token terminate before emission. */
|
|
1518
|
-
token_id: string;
|
|
1519
|
-
/** Canonical sport bucket. */
|
|
1520
|
-
category: "Basketball" | "Football" | "Baseball" | "Hockey" | "MMA" | "Boxing" | "Soccer" | "Cricket" | "Golf" | "Tennis" | "Esports" | "Racing" | "Table Tennis" | "Pickleball";
|
|
1521
|
-
/** Raw provider category as stored. */
|
|
1522
|
-
raw_category: string | null;
|
|
1523
|
-
/** Provider-backed market title. */
|
|
1524
|
-
title: string;
|
|
1525
|
-
event_slug: string | null;
|
|
1526
|
-
/** Provider event id when available. */
|
|
1527
|
-
event_id: string | null;
|
|
1528
|
-
/** Provider parent-event id used as the first event-cap identity when available. */
|
|
1529
|
-
parent_event_id: string | null;
|
|
1530
|
-
/** Provider-backed kickoff time in UTC. */
|
|
1531
|
-
game_start_time: string;
|
|
1532
|
-
/** UTC instant when this row finished provider/holder evaluation. */
|
|
1533
|
-
observed_at: string;
|
|
1534
|
-
/** 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. */
|
|
1535
|
-
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
1536
|
-
/** Always true. This row must not be routed to an order executor. */
|
|
1537
|
-
observation_only: true;
|
|
1538
|
-
/** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. */
|
|
1539
|
-
piled_side: string | null;
|
|
1540
|
-
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1541
|
-
piled_outcome_index: 0 | 1;
|
|
1542
|
-
/** Provider-backed implied price for the piled outcome at observation time. */
|
|
1543
|
-
backed_price: number;
|
|
1544
|
-
/** Piled-side graded-holder dollar concentration. */
|
|
1545
|
-
sharp_pct: number;
|
|
1546
|
-
/** Raw graded-holder USD on the piled outcome. */
|
|
1547
|
-
backed_sharp_usd: number;
|
|
1548
|
-
s_count: number;
|
|
1549
|
-
a_count: number;
|
|
1550
|
-
b_count: number;
|
|
1551
|
-
/** Piled-side S/A/B holder count. */
|
|
1552
|
-
graded_holders: number;
|
|
1553
|
-
top_grade: "S" | "A" | "B";
|
|
1554
|
-
/** Canonical signed holder-pile score. */
|
|
1555
|
-
smart_score: number;
|
|
1556
|
-
/** Strictly positive stored market volume in USD. Missing, zero, or non-finite volume terminates as invalid_market and is never emitted as an observation. */
|
|
1557
|
-
volume: number;
|
|
1558
|
-
/** Grade-weighted holder-pile score before directional enrichment. */
|
|
1559
|
-
conviction_score: number;
|
|
1560
|
-
/** Whether the provider holder page came from the shared cache or a live provider read. */
|
|
1561
|
-
provider_read_source: "cached" | "live";
|
|
1562
|
-
/** True only when neither provider outcome holder page hit the top-100 scan bound. False means the pile is a positive lower bound and cannot satisfy a future capital-promotion gate. */
|
|
1563
|
-
holder_scan_complete: boolean;
|
|
1564
|
-
/** 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. */
|
|
1565
|
-
holder_snapshot_at: string | null;
|
|
1566
|
-
/** 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. */
|
|
1567
|
-
directional_status: "available" | "unknown_ungrouped" | "unknown_stale" | "unavailable";
|
|
1568
|
-
one_way_holder_count: number | null;
|
|
1569
|
-
hedged_holder_count: number | null;
|
|
1570
|
-
one_way_graded_usd: number | null;
|
|
1571
|
-
directional_confidence: number | null;
|
|
1572
|
-
/** Default cohort ordering key: conviction_score * (1 + 0.25 * directional_confidence), or conviction_score when confidence is null. */
|
|
1573
|
-
directional_rank_score: number;
|
|
1574
|
-
/** 1-based rank within this observation cohort and snapshot. */
|
|
1575
|
-
rank: number;
|
|
1576
|
-
};
|
|
1577
|
-
/** Closed 25-value terminal-reason vocabulary for the accountable sports-edge observation funnel. capacity_limited is intentional bounded provider-work admission and does not itself set the snapshot degraded. board_source_unavailable is a completed board-source failure; board_deadline_unavailable means live-board work missed either an internal configured-scope deadline or the outer fair-wave deadline; both classify only already-started rows, so for the upcoming source read funnel.sports[].board_upcoming_status instead; provider_unavailable is reserved for an attempted holder-provider failure; holder_deadline_unavailable is holder cache/provider absolute-deadline exhaustion. */
|
|
1578
|
-
export type SportsEdgeObservationTerminalReason = "outside_horizon" | "resolved" | "provider_closed" | "provider_excluded" | "invalid_market" | "missing_token" | "missing_stored_market" | "not_provider_live" | "board_source_unavailable" | "board_deadline_unavailable" | "primary_slate_candidate" | "zero_indexed_holder_research" | "capacity_limited" | "provider_unavailable" | "holder_deadline_unavailable" | "holder_computation_unavailable" | "holder_scan_incomplete" | "no_current_graded_holder" | "split_holder_pile" | "price_unavailable" | "wider_holder_emitted" | "in_play_emitted" | "in_play_stale_observed" | "in_play_directional_unavailable" | "internal_unclassified";
|
|
1579
|
-
/** One ranked pre-game sports market where graded sharp money is piled on one side, with required-status shadow category evidence from partial forward-observed Polymarket fills. */
|
|
1580
|
-
export type SportsEdgeSignal = {
|
|
1581
|
-
/** Polymarket condition id. */
|
|
1582
|
-
condition_id: string;
|
|
1583
|
-
/** UTC time at which the immutable signal snapshot was computed. Every row from one snapshot shares this value; it is not provider market creation time and is not rewritten at request time. */
|
|
1584
|
-
signal_created_at: string;
|
|
1585
|
-
/** Polymarket CLOB token id (ERC1155 asset id, decimal string) for the PILED outcome; null when unavailable. */
|
|
1586
|
-
token_id?: string | null;
|
|
1587
|
-
/** Canonical sport bucket (e.g. Basketball, Tennis); null when the raw category has no canonical mapping. */
|
|
1588
|
-
category?: string | null;
|
|
1589
|
-
/** Raw provider category as stored (e.g. NBA, EPL). */
|
|
1590
|
-
raw_category?: string | null;
|
|
1591
|
-
title?: string | null;
|
|
1592
|
-
event_slug?: string | null;
|
|
1593
|
-
/** Kickoff (UTC). In the future at SNAPSHOT time and within the requested horizon; because the response is served from a shared snapshot cached up to the ~180s TTL, a served kickoff can be up to ~180s in the past relative to the response time. Not a live guarantee that the game has not yet started. */
|
|
1594
|
-
game_start_time?: string | null;
|
|
1595
|
-
/** Nullable provider-backed piled-outcome display label. When provider group context is unavailable, it may remain a bare Yes/No/Over/Under; do not use it alone as participant identity. */
|
|
1596
|
-
piled_side?: string | null;
|
|
1597
|
-
/** Provider binary-column selector: 0 selects outcome_yes/token_id_yes; 1 selects outcome_no/token_id_no. It does not identify home/away or a participant. Use piled_side together with title/event context for display. */
|
|
1598
|
-
piled_outcome_index: number;
|
|
1599
|
-
/** Piled-side dollar concentration backed_usd / (yes_usd + no_usd), in (0.5, 1] for a real pile; null when there is no sharp USD. */
|
|
1600
|
-
sharp_pct?: number | null;
|
|
1601
|
-
/** Raw piled-side sharp-money USD. */
|
|
1602
|
-
backed_sharp_usd: number;
|
|
1603
|
-
/** S-grade graded holders on the piled side. */
|
|
1604
|
-
s_count: number;
|
|
1605
|
-
/** A-grade graded holders on the piled side. */
|
|
1606
|
-
a_count: number;
|
|
1607
|
-
/** B-grade graded holders on the piled side. */
|
|
1608
|
-
b_count: number;
|
|
1609
|
-
/** Piled-side graded holder count (s_count + a_count + b_count). */
|
|
1610
|
-
graded_holders: number;
|
|
1611
|
-
/** Best grade present on the piled side; null when none. */
|
|
1612
|
-
top_grade?: "S" | "A" | "B";
|
|
1613
|
-
/** Canonical sharp-money score (yes_usd - no_usd)/(yes_usd + no_usd) in [-1, 1] (piled-yes positive, piled-no negative); a lower-order ranking tiebreak (after directional_rank_score and conviction_score). */
|
|
1614
|
-
smart_score?: number | null;
|
|
1615
|
-
/** Market volume (USD). */
|
|
1616
|
-
volume?: number | null;
|
|
1617
|
-
/** Aggregate recent flow direction on the market; null when unavailable. */
|
|
1618
|
-
net_side?: "BUY" | "SELL";
|
|
1619
|
-
/** Grade-weighted pile score (5*s + 4*a + 3*b) * sharp_pct; the raw conviction input to the ranking (see directional_rank_score). */
|
|
1620
|
-
conviction_score: number;
|
|
1621
|
-
/** Piled-side graded holders read one-way: their fresh open legs across the signal game's markets (cross-market within the one game; moneyline+spread family only) all back the same team, or, when the market's holder scan was complete, Polymarket's currentValue shows no opposite leg on this market worth 10% of the backed leg and no fresh leg opposes it. Null when the directional read was not computed (no groupable game, no holder-level data on this ranking path, or the enrichment read failed) or classified nobody. */
|
|
1622
|
-
one_way_holder_count?: number | null;
|
|
1623
|
-
/** Piled-side graded holders classified HEDGED across the game by fresh legs (they back two or more distinct teams). A wallet long both outcomes of this market is not one-way and not counted here. Null when the directional read was not computed or classified nobody. */
|
|
1624
|
-
hedged_holder_count?: number | null;
|
|
1625
|
-
/** Piled-side graded USD held by one-way wallets (share-weighted allocation of backed_sharp_usd). Null when the directional read was not computed or classified nobody. */
|
|
1626
|
-
one_way_graded_usd?: number | null;
|
|
1627
|
-
/** One-way fraction of the piled graded dollars, in [0, 1] -- the metric orthogonal to sharp_pct. Stale, unknown, hedged, and two-sided dollars dilute it toward zero (conservative). Null when the directional read was not computed or classified nobody. */
|
|
1628
|
-
directional_confidence?: number | null;
|
|
1629
|
-
/** The ranking key, descending: conviction_score * (1 + 0.25 * directional_confidence). Equals conviction_score when the directional read is null/zero, so signals without the read rank exactly as before. */
|
|
1630
|
-
directional_rank_score: number;
|
|
1631
|
-
category_skill: SportsEdgeSignalCategorySkill;
|
|
1632
|
-
/** 1-based rank within the (min_grade-filtered) ranked result. */
|
|
1633
|
-
rank: number;
|
|
1634
|
-
};
|
|
1635
|
-
/** Shadow-only category evidence over the full uncapped piled-side S/A/B holder allocation. It never changes signal membership, ordering, routing, or sizing. */
|
|
1636
|
-
export type SportsEdgeSignalCategorySkill = {
|
|
1637
|
-
status: "live" | "insufficient" | "stale" | "unknown" | "degraded";
|
|
1638
|
-
model_version: string;
|
|
1639
|
-
taxonomy_version: string | null;
|
|
1640
|
-
platform: "polymarket";
|
|
1641
|
-
scope: "observed_goldsky_primary_taker_fill";
|
|
1642
|
-
source_coverage: "partial_whale_threshold_fills" | "graded_wallet_fills";
|
|
1643
|
-
observation_started_at: string;
|
|
1644
|
-
as_of: string;
|
|
1645
|
-
canonical_category: string | null;
|
|
1646
|
-
eligible_holders: number;
|
|
1647
|
-
covered_holders: number;
|
|
1648
|
-
backed_sharp_usd: number | null;
|
|
1649
|
-
covered_backed_usd: number | null;
|
|
1650
|
-
coverage_pct: number | null;
|
|
1651
|
-
weighted_edge_mean: number | null;
|
|
1652
|
-
weighted_holder_lower_mean: number | null;
|
|
1653
|
-
specialist_backed_usd: number | null;
|
|
1654
|
-
specialist_backed_usd_pct: number | null;
|
|
1655
|
-
largest_holder_backed_usd_pct: number | null;
|
|
1656
|
-
minimum_holder_event_count: number | null;
|
|
2066
|
+
/** For a rolling body, the UTC date on which a final body can first be built (the date of final_after); null once final. */
|
|
2067
|
+
mutable_until: string | null;
|
|
2068
|
+
/** Whether the source range has ended on the UTC calendar. Closing is not finality: a closed range is rolling until final_after. */
|
|
2069
|
+
period_closed: boolean;
|
|
2070
|
+
/** The instant a source read must start at or after to produce a final body: the range's UTC close plus 7,530 s, the whale-trade ingestion budget (p95 block lag gate plus the projection retry budget). */
|
|
2071
|
+
final_after: string;
|
|
2072
|
+
/** When this body's source read started, the clock finality is judged on. null for a body stored before that clock was recorded. */
|
|
2073
|
+
source_read_started_at: string | null;
|
|
1657
2074
|
};
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
/**
|
|
1662
|
-
|
|
1663
|
-
/**
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
2075
|
+
export type SuspiciousTrade = {
|
|
2076
|
+
/** Prefixed ID (rf_...). */
|
|
2077
|
+
id: string;
|
|
2078
|
+
/** Stored score that met the live flag threshold. */
|
|
2079
|
+
suspicion_score: number;
|
|
2080
|
+
/** The live scorer persists one threshold class. */
|
|
2081
|
+
severity: "flag";
|
|
2082
|
+
trader: {
|
|
2083
|
+
id: string;
|
|
2084
|
+
address: string;
|
|
2085
|
+
username: string | null;
|
|
2086
|
+
};
|
|
2087
|
+
market: {
|
|
2088
|
+
id: string;
|
|
2089
|
+
condition_id: string;
|
|
2090
|
+
/** Canonical market question when available. */
|
|
2091
|
+
title: string | null;
|
|
2092
|
+
};
|
|
2093
|
+
scores: {
|
|
2094
|
+
/** Null because the live scorer does not record this component. */
|
|
2095
|
+
timing: number | null;
|
|
2096
|
+
/** Null because the live scorer does not record this component. */
|
|
2097
|
+
edge: number | null;
|
|
2098
|
+
/** Numeric evidence.size when recorded; otherwise null. */
|
|
2099
|
+
size: number | null;
|
|
2100
|
+
/** Numeric evidence.fresh when recorded; otherwise null. */
|
|
2101
|
+
fresh_wallet: number | null;
|
|
2102
|
+
};
|
|
2103
|
+
/** Stored whale_alerts.suspicion_signals JSON from the scorer. */
|
|
2104
|
+
evidence: unknown;
|
|
2105
|
+
/** Stored trade timestamp. */
|
|
2106
|
+
created_at: string;
|
|
1681
2107
|
};
|
|
1682
2108
|
export type Trader = {
|
|
1683
2109
|
/** Prefixed ID (trd_...). */
|
|
1684
2110
|
id: string;
|
|
1685
2111
|
address: string;
|
|
1686
|
-
username?: string
|
|
2112
|
+
username?: string;
|
|
1687
2113
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1688
|
-
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade.
|
|
2114
|
+
/** Hot-streak tier (trailing-7d cross-sectional percentile); a separate axis from the all-time grade. Omitted when there is no recent activity. */
|
|
1689
2115
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
1690
|
-
score?: number
|
|
1691
|
-
rank?: number
|
|
2116
|
+
score?: number;
|
|
2117
|
+
rank?: number;
|
|
1692
2118
|
pnl: {
|
|
1693
|
-
total?: number
|
|
2119
|
+
total?: number;
|
|
1694
2120
|
/** For pnl.realized, expand=trust marks a matching native accounting snapshot as computed: native Polymarket realized P&L plus credited maker and taker rebates, with fees already included. The exact numeric value is truncated toward zero to cents before conversion to a JSON number. Without a matching native accounting snapshot, pnl.realized is omitted and its trust metadata is unavailable. Raw total P&L is never substituted for realized P&L. */
|
|
1695
|
-
realized?: number
|
|
1696
|
-
unrealized?: number
|
|
1697
|
-
/** DEPRECATED,
|
|
1698
|
-
last_7d?: number
|
|
1699
|
-
/** DEPRECATED,
|
|
1700
|
-
last_30d?: number
|
|
2121
|
+
realized?: number;
|
|
2122
|
+
unrealized?: number;
|
|
2123
|
+
/** DEPRECATED, never sent. The local pnl_7d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native weekly window from GET /api/trader/{address}/profile-summary instead. */
|
|
2124
|
+
last_7d?: number;
|
|
2125
|
+
/** DEPRECATED, never sent. The local pnl_30d rollup over-counted P&L (#5416 class) and is no longer emitted. Read the provider-native monthly window from GET /api/trader/{address}/profile-summary instead. */
|
|
2126
|
+
last_30d?: number;
|
|
1701
2127
|
};
|
|
1702
2128
|
stats: {
|
|
1703
|
-
markets_traded?: number
|
|
1704
|
-
win_rate?: number
|
|
1705
|
-
daily_win_rate?: number
|
|
2129
|
+
markets_traded?: number;
|
|
2130
|
+
win_rate?: number;
|
|
2131
|
+
daily_win_rate?: number;
|
|
1706
2132
|
/** Full-history both-sides USD cash volume from Polymarket user-volume. Omitted without a verified observation; never leaderboard shares. Volume freshness is unknown in this DTO and does not use synced_at. */
|
|
1707
|
-
total_volume?: number
|
|
2133
|
+
total_volume?: number;
|
|
1708
2134
|
};
|
|
1709
2135
|
strategy?: {
|
|
1710
2136
|
strategy_type?: string;
|
|
1711
|
-
description?: string
|
|
1712
|
-
confidence?: number
|
|
1713
|
-
}
|
|
1714
|
-
/** Per-category performance breakdown (expand=categories or expand[]=categories). Omitted unless expanded. Object keyed by category name; each value is the precomputed trader_rankings.category_ranks payload (rank, total_in_category, total_pnl, scaled_total_pnl, n_markets, wins, losses, win_rate; scaled_total_pnl is a legacy alias that currently equals total_pnl). Pass-through DB JSON: keys and value shape are DB-owned, so the inner shape is intentionally unconstrained and may carry additional compatibility fields. */
|
|
1715
|
-
category_strengths?: Record<string, unknown
|
|
2137
|
+
description?: string;
|
|
2138
|
+
confidence?: number;
|
|
2139
|
+
};
|
|
2140
|
+
/** Per-category performance breakdown (expand=categories or expand[]=categories). Omitted unless expanded. Object keyed by category name; each value is the precomputed trader_rankings.category_ranks payload (rank, total_in_category, total_pnl, scaled_total_pnl, n_markets, wins, losses, win_rate; scaled_total_pnl is a legacy alias that currently equals total_pnl). BASIS: the calibration sample, which admits a position only above a 20 USD notional floor and with a chosen-side entry price strictly inside (0,1), because the ranks and the calibration edge derived from it depend on both rules. That is a different sample from GET /api/v1/trader/{address}/categories, which counts every settled market at any size, and the two differ in both directions. Measured on production 2026-09-22 over the 122,497 wallet-category pairs with at least 20 decided markets on both bases: the floored rate was higher in 56.5% of pairs, lower in 34.5% and equal in 9.0%, median +0.6 points, p10 -4.6, p90 +9.8, and 14.0% of pairs differ by 10 points or more. The difference is not only small positions: on a 1-in-250 wallet sample the same day, admitted markets won 56.6% while markets dropped by the notional floor alone won 45.2% and markets dropped by the entry-price rule alone won 48.7%. n_markets counts every admitted market including the ones that resolved at exactly zero P&L, so it is not the denominator of win_rate: it differed from wins + losses in 15.8% of pairs with at least 5 decided markets. The two tables also run on different clocks, this one updated incrementally and that route rebuilt daily, so a same-day read can differ on timing alone. Use this for rank context and that route for the wallet's plain record. Pass-through DB JSON: keys and value shape are DB-owned, so the inner shape is intentionally unconstrained and may carry additional compatibility fields. */
|
|
2141
|
+
category_strengths?: Record<string, unknown>;
|
|
1716
2142
|
/** Curated advanced risk/performance metrics (expand=quant_metrics or expand[]=quant_metrics). Omitted unless expanded and backed by a computed row strictly under six hours old; a missing row, NULL computed_at, or age of exactly six hours or more is stale and omitted. Provider-input changes may intentionally lag inside the bounded six-hour window. When present, all listed fields are present (each is a number or null); null means insufficient trade history and must not be treated as 0. The fixed field shape is unchanged. */
|
|
1717
2143
|
quant_metrics?: {
|
|
1718
2144
|
/** Composite skill score, 0-100. smart_score = clamp(0, 100, 30*sharpe_percentile_fraction + 20*profit_factor_percentile_fraction + 20*edge_consistency_percentile_fraction + 10*min(1, return_on_capital/2) + 10*equity_smoothness + 10*(1 - min(1, asset_concentration))). Higher is better. null when insufficient history. */
|
|
@@ -1733,17 +2159,45 @@ export type Trader = {
|
|
|
1733
2159
|
pf_percentile: number | null;
|
|
1734
2160
|
/** Cross-sectional percentile rank of edge consistency versus all traders, 0-100. null when insufficient history. */
|
|
1735
2161
|
consistency_percentile: number | null;
|
|
1736
|
-
}
|
|
1737
|
-
last_active?: string
|
|
1738
|
-
synced_at?: string
|
|
2162
|
+
};
|
|
2163
|
+
last_active?: string;
|
|
2164
|
+
synced_at?: string;
|
|
1739
2165
|
/** synced, unknown, or pending. */
|
|
1740
|
-
sync_status?: string
|
|
2166
|
+
sync_status?: string;
|
|
1741
2167
|
/** Field-level trust metadata. Present only when expand=trust or expand[]=trust is requested. */
|
|
1742
2168
|
trust?: TraderTrust;
|
|
1743
2169
|
/** 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. */
|
|
1744
2170
|
category_records?: CategorySkillV2[];
|
|
1745
2171
|
category_skill_model?: CategorySkillModelReadiness;
|
|
1746
2172
|
};
|
|
2173
|
+
export type TraderCategoryRecord = {
|
|
2174
|
+
/** Canonical category bucket, for example Soccer, Esports, Tennis. Esports is one bucket, and the Esports record carries its per-game records in games. */
|
|
2175
|
+
category: string;
|
|
2176
|
+
/** Markets in this category the wallet closed with a profit. */
|
|
2177
|
+
wins: number;
|
|
2178
|
+
/** Markets it closed with a profit or a loss. A market that resolved at exactly zero P&L is in neither count, so this is not the wallet's market count in the category. */
|
|
2179
|
+
decided: number;
|
|
2180
|
+
/** wins / decided in [0,1], truncated to four decimals. Null when status is not_enough_data. */
|
|
2181
|
+
win_rate: number | null;
|
|
2182
|
+
/** measured: decided cleared min_decided_for_win_rate and win_rate carries the rate. not_enough_data: the counts are real but the sample is under the floor, so no percent is published. A failed read is an error response, never a status value. */
|
|
2183
|
+
status: "measured" | "not_enough_data";
|
|
2184
|
+
/** The wallet's record per esports title, busiest first. Present only on the Esports record, and only when the wallet has a settled market in at least one title; absent on every other category and on an Esports record whose markets are all in series that are not games (skin-price indices, streamer props) or carry no series. Absent means no per-game record, the same rule as an absent category. Each entry's decided is a subset of the Esports record's, read in the same statement from the same daily rebuild. */
|
|
2185
|
+
games?: TraderEsportsGameRecord[];
|
|
2186
|
+
};
|
|
2187
|
+
export type TraderCategoryRecords = {
|
|
2188
|
+
/** Prefixed trader id (trd_<wallet>). */
|
|
2189
|
+
id: string;
|
|
2190
|
+
/** Resolved wallet address, lowercased. */
|
|
2191
|
+
address: string;
|
|
2192
|
+
/** Which sample the counts come from: every settled market in the category, at any position size. category_strengths on the trader endpoint reads the floored calibration sample instead, so the two differ in both directions: measured on production 2026-09-22 over the 122,497 wallet-category pairs with at least 20 decided markets on both bases, the floored rate was higher in 56.5% of pairs and lower in 34.5%, median +0.6 points, p10 -4.6, p90 +9.8, with 14.0% of pairs 10 points apart or more. Neither corrects the other. */
|
|
2193
|
+
basis: "settled_markets_all_sizes";
|
|
2194
|
+
/** Decided markets a category needs before win_rate is served. Published so a caller can apply its own sample rule to the raw counts. */
|
|
2195
|
+
min_decided_for_win_rate: number;
|
|
2196
|
+
/** When the served records were last rebuilt (RFC3339, Z): the newest stamp among every row served, game rows included, which the daily rebuild writes in one transaction. Null when the wallet has no record at all. */
|
|
2197
|
+
computed_at: string | null;
|
|
2198
|
+
/** One entry per canonical category with at least one decided market, ordered by decided descending then category. A category with no decided market is omitted. The Esports entry carries its per-game records in games. */
|
|
2199
|
+
records: TraderCategoryRecord[];
|
|
2200
|
+
};
|
|
1747
2201
|
export type TraderContext = {
|
|
1748
2202
|
trader: Trader;
|
|
1749
2203
|
/** 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. */
|
|
@@ -1769,9 +2223,9 @@ export type TraderContext = {
|
|
|
1769
2223
|
/** Win rate as a percentage (0-100): resolved_wins over resolved_decided. A resolved market that settled at exactly zero realized P&L (a void, a refund, a fully hedged position) is neither a win nor a loss and is not in the denominator, the same rule the leaderboard applies; null when no resolved market was decided. */
|
|
1770
2224
|
resolved_win_rate: number | null;
|
|
1771
2225
|
/** Resolved markets that settled at positive realized P&L: the win-rate numerator. Additive; null only on a summary cached before the field existed. */
|
|
1772
|
-
resolved_wins
|
|
2226
|
+
resolved_wins: number | null;
|
|
1773
2227
|
/** Resolved markets that settled 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. */
|
|
1774
|
-
resolved_decided
|
|
2228
|
+
resolved_decided: number | null;
|
|
1775
2229
|
/** 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. */
|
|
1776
2230
|
as_of: string | null;
|
|
1777
2231
|
};
|
|
@@ -1780,16 +2234,62 @@ export type TraderContext = {
|
|
|
1780
2234
|
/** Human-readable statement of the point-in-time snapshot semantics (data_as_of is the open-position clock -- the latest /positions snapshot, else the last completed sync; the snapshot advances only open positions, so resolved counts and win rate date to the last full sync; native realized P&L follows its accounting snapshot -- not a live feed; re-fetch for fresher data). */
|
|
1781
2235
|
freshness_note: string;
|
|
1782
2236
|
};
|
|
2237
|
+
export type TraderEsportsGameRecord = {
|
|
2238
|
+
/** The game, by the same name every holder chip carries in category_win_rate_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. Match a chip to this row by string equality. */
|
|
2239
|
+
game: string;
|
|
2240
|
+
/** The Polymarket series slug the record is keyed on: league-of-legends, counter-strike, dota-2, valorant, call-of-duty, honor-of-kings, mobile-legends-bang-bang, overwatch, rainbow-six-siege, rocket-league or starcraft-2. The stable key; game is the label. */
|
|
2241
|
+
series_slug: string;
|
|
2242
|
+
/** Markets in this game the wallet closed with a profit. */
|
|
2243
|
+
wins: number;
|
|
2244
|
+
/** Markets in this game it closed with a profit or a loss. A subset of the parent Esports record's decided: the two are read from the same daily rebuild. */
|
|
2245
|
+
decided: number;
|
|
2246
|
+
/** wins / decided in [0,1], truncated to four decimals. Null when status is not_enough_data. */
|
|
2247
|
+
win_rate: number | null;
|
|
2248
|
+
/** The same rule as the parent record: measured when decided cleared min_decided_for_win_rate, not_enough_data when the counts are real but the sample is under the floor. A chip on a market in this game shows this row's rate when it is measured and the Esports bucket's otherwise. */
|
|
2249
|
+
status: "measured" | "not_enough_data";
|
|
2250
|
+
};
|
|
1783
2251
|
export type TraderExportJob = {
|
|
1784
2252
|
object: "trader_export_job";
|
|
1785
2253
|
data: {
|
|
1786
2254
|
job_id: number;
|
|
1787
|
-
|
|
2255
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2256
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
|
|
1788
2257
|
format: "json" | "ndjson" | "csv";
|
|
1789
|
-
total_trades
|
|
1790
|
-
processed_trades
|
|
1791
|
-
file_size
|
|
1792
|
-
error
|
|
2258
|
+
total_trades: number | null;
|
|
2259
|
+
processed_trades: number | null;
|
|
2260
|
+
file_size: number | null;
|
|
2261
|
+
error: string | null;
|
|
2262
|
+
/** True when status never changes again (ready, failed, expired). Stop polling. */
|
|
2263
|
+
terminal: boolean;
|
|
2264
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2265
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2266
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
|
|
2267
|
+
poll_after_s?: number;
|
|
2268
|
+
created_at: string;
|
|
2269
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2270
|
+
started_at: string | null;
|
|
2271
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2272
|
+
ready_at: string | null;
|
|
2273
|
+
failed_at: string | null;
|
|
2274
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2275
|
+
expires_at: string;
|
|
2276
|
+
/** When the job became expired; null until then. */
|
|
2277
|
+
expired_at: string | null;
|
|
2278
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2279
|
+
data_as_of: string | null;
|
|
2280
|
+
/** Worker claims so far. */
|
|
2281
|
+
attempt: number;
|
|
2282
|
+
/** The job fails when attempt reaches this. */
|
|
2283
|
+
max_attempts: number;
|
|
2284
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2285
|
+
artifact?: {
|
|
2286
|
+
/** The storage ETag of the object. */
|
|
2287
|
+
etag: string | null;
|
|
2288
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2289
|
+
compressed_size_bytes: number | null;
|
|
2290
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2291
|
+
content_encoding: "gzip";
|
|
2292
|
+
};
|
|
1793
2293
|
};
|
|
1794
2294
|
meta: ResponseMeta;
|
|
1795
2295
|
};
|
|
@@ -1802,29 +2302,54 @@ export type TraderExportSnapshot = {
|
|
|
1802
2302
|
counts: ExportCounts;
|
|
1803
2303
|
large_export_policy: LargeExportPolicy;
|
|
1804
2304
|
};
|
|
2305
|
+
/** A trader's daily P&L object. `id` is always present. The five sections -- `entries`, `stats`, `monthly`, `year_totals`, `drawdown` -- are present unless the request's `sections` parameter excluded them, so a request that sends no `sections` always carries all five. An excluded section is absent from the object, never null and never an empty array. */
|
|
1805
2306
|
export type TraderPnl = {
|
|
1806
2307
|
/** Prefixed trader ID (`trd_...`). */
|
|
1807
2308
|
id: string;
|
|
1808
|
-
/**
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
2309
|
+
/** Representation parameters applied to this body. Present only when the request sent `from`, `to` or `sections`; omitted otherwise, which is what keeps a no-parameter response identical to the one this route served before the parameters existed. */
|
|
2310
|
+
view?: {
|
|
2311
|
+
/** Inclusive UTC lower bound applied to the daily series; null when the request left the series unbounded below. */
|
|
2312
|
+
from: string | null;
|
|
2313
|
+
/** Inclusive UTC upper bound applied to the daily series; null when the request left the series unbounded above. */
|
|
2314
|
+
to: string | null;
|
|
2315
|
+
/** Sections this body carries, in the order the object publishes them, whatever order the query listed. */
|
|
2316
|
+
sections: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
2317
|
+
/** Points in the full stored daily series, before the window. Compare with entries_in_window to tell a clipped chart from a wallet that really has that many days. */
|
|
2318
|
+
entries_total: number;
|
|
2319
|
+
/** Points of the daily series inside the window. Equal to entries_total when no bound narrowed it, and reported whether or not entries was among the requested sections. */
|
|
2320
|
+
entries_in_window: number;
|
|
2321
|
+
/** The last daily point strictly before `from`: the cumulative baseline the window was cut away from. null when the request set no lower bound, or when the window starts at or before the first stored point and the slice already begins at the start of the history. Cumulative values in `entries` and `drawdown` are never rebased to the window, so this is the figure to subtract for a window-relative change. */
|
|
2322
|
+
anchor: {
|
|
2323
|
+
date: string;
|
|
2324
|
+
/** Cumulative profit carried into the window; null when the stored point has none, the same nullability entries[].cumulative_profit has. */
|
|
2325
|
+
cumulative_profit: number | null;
|
|
2326
|
+
/** Cumulative total P&L carried into the window; null on the same terms. */
|
|
2327
|
+
total_pnl: number | null;
|
|
2328
|
+
/** Underwater value at the anchor date; null when that date has no drawdown point, which happens exactly when its cumulative_profit is null. The running peak behind the window is cumulative_profit minus drawdown (drawdown is zero or negative). */
|
|
2329
|
+
drawdown: number | null;
|
|
2330
|
+
} | null;
|
|
2331
|
+
};
|
|
2332
|
+
/** RFC3339 served-freshness clock for this trader's PnL history = traders.daily_pnl_recomputed_at, when the daily_pnl read model this response is served from was last rebuilt; null when it has never been recomputed for the trader. Always present, so read it as a value that can be null rather than a key that can be missing. */
|
|
2333
|
+
freshness_at: string | null;
|
|
2334
|
+
/** Daily cumulative-P&L series (oldest-first). Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. cumulative_profit and total_pnl stay cumulative from the start of the stored history, so a clipped slice keeps the same economic meaning; view.anchor carries the point before the window. */
|
|
2335
|
+
entries?: {
|
|
1812
2336
|
date: string;
|
|
1813
|
-
markets_traded?: number
|
|
1814
|
-
total_volume?: number
|
|
1815
|
-
cumulative_profit?: number
|
|
1816
|
-
total_pnl?: number
|
|
2337
|
+
markets_traded?: number;
|
|
2338
|
+
total_volume?: number;
|
|
2339
|
+
cumulative_profit?: number;
|
|
2340
|
+
total_pnl?: number;
|
|
1817
2341
|
daily_change: number;
|
|
1818
|
-
}
|
|
1819
|
-
stats
|
|
2342
|
+
}[];
|
|
2343
|
+
/** 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. */
|
|
2344
|
+
stats?: {
|
|
1820
2345
|
all: {
|
|
1821
2346
|
current: number;
|
|
1822
2347
|
change: number;
|
|
1823
2348
|
change_pct: number;
|
|
1824
2349
|
best_day: number;
|
|
1825
|
-
best_day_date?: string
|
|
2350
|
+
best_day_date?: string;
|
|
1826
2351
|
worst_day: number;
|
|
1827
|
-
worst_day_date?: string
|
|
2352
|
+
worst_day_date?: string;
|
|
1828
2353
|
win_days: number;
|
|
1829
2354
|
loss_days: number;
|
|
1830
2355
|
avg_day: number;
|
|
@@ -1835,9 +2360,9 @@ export type TraderPnl = {
|
|
|
1835
2360
|
change: number;
|
|
1836
2361
|
change_pct: number;
|
|
1837
2362
|
best_day: number;
|
|
1838
|
-
best_day_date?: string
|
|
2363
|
+
best_day_date?: string;
|
|
1839
2364
|
worst_day: number;
|
|
1840
|
-
worst_day_date?: string
|
|
2365
|
+
worst_day_date?: string;
|
|
1841
2366
|
win_days: number;
|
|
1842
2367
|
loss_days: number;
|
|
1843
2368
|
avg_day: number;
|
|
@@ -1848,9 +2373,9 @@ export type TraderPnl = {
|
|
|
1848
2373
|
change: number;
|
|
1849
2374
|
change_pct: number;
|
|
1850
2375
|
best_day: number;
|
|
1851
|
-
best_day_date?: string
|
|
2376
|
+
best_day_date?: string;
|
|
1852
2377
|
worst_day: number;
|
|
1853
|
-
worst_day_date?: string
|
|
2378
|
+
worst_day_date?: string;
|
|
1854
2379
|
win_days: number;
|
|
1855
2380
|
loss_days: number;
|
|
1856
2381
|
avg_day: number;
|
|
@@ -1861,29 +2386,29 @@ export type TraderPnl = {
|
|
|
1861
2386
|
change: number;
|
|
1862
2387
|
change_pct: number;
|
|
1863
2388
|
best_day: number;
|
|
1864
|
-
best_day_date?: string
|
|
2389
|
+
best_day_date?: string;
|
|
1865
2390
|
worst_day: number;
|
|
1866
|
-
worst_day_date?: string
|
|
2391
|
+
worst_day_date?: string;
|
|
1867
2392
|
win_days: number;
|
|
1868
2393
|
loss_days: number;
|
|
1869
2394
|
avg_day: number;
|
|
1870
2395
|
rebase_anchor: number;
|
|
1871
2396
|
};
|
|
1872
2397
|
};
|
|
1873
|
-
/** Per-month P&L aggregation. */
|
|
1874
|
-
monthly
|
|
2398
|
+
/** 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. */
|
|
2399
|
+
monthly?: {
|
|
1875
2400
|
year: number;
|
|
1876
2401
|
month: number;
|
|
1877
2402
|
pnl: number;
|
|
1878
2403
|
markets_traded: number;
|
|
1879
2404
|
}[];
|
|
1880
|
-
/** Per-year P&L totals (ascending by year). */
|
|
1881
|
-
year_totals
|
|
2405
|
+
/** 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`. */
|
|
2406
|
+
year_totals?: {
|
|
1882
2407
|
year: number;
|
|
1883
2408
|
pnl: number;
|
|
1884
2409
|
}[];
|
|
1885
|
-
/** Underwater (drawdown) series. */
|
|
1886
|
-
drawdown
|
|
2410
|
+
/** Underwater (drawdown) series. Present unless the request's `sections` excluded it, and clipped to `from`/`to` when either is set. The running peak behind each point is the full-history peak, so a clipped slice is not rebased; view.anchor.drawdown carries the value at the point before the window. */
|
|
2411
|
+
drawdown?: {
|
|
1887
2412
|
date: string;
|
|
1888
2413
|
cumulative_profit: number;
|
|
1889
2414
|
drawdown: number;
|
|
@@ -1917,10 +2442,10 @@ export type TrendingWallet = {
|
|
|
1917
2442
|
address: string;
|
|
1918
2443
|
/** 1-based rank within the full ranked set (stable across pages). */
|
|
1919
2444
|
rank: number;
|
|
1920
|
-
username?: string
|
|
2445
|
+
username?: string;
|
|
1921
2446
|
/** Official Polymarket avatar URL (profileImage). */
|
|
1922
|
-
profile_image_url?: string
|
|
1923
|
-
/** Real provider platform; surfaced, never coerced. Polymarket
|
|
2447
|
+
profile_image_url?: string;
|
|
2448
|
+
/** Real provider platform; surfaced, never coerced. Polymarket only. */
|
|
1924
2449
|
platform: "polymarket";
|
|
1925
2450
|
/** Polymarket weekly/monthly P&L for the wallet in USD, taken from Polymarket's canonical leaderboard (data-api.polymarket.com/v1/leaderboard?timePeriod=week|month&orderBy=PNL). This is the ranking axis and the rows are returned in Polymarket's by-PNL order; it is the provider's number, not a locally summed realized-leaf total. */
|
|
1926
2451
|
trending_pnl_usd: number;
|
|
@@ -1933,11 +2458,11 @@ export type TrendingWallet = {
|
|
|
1933
2458
|
window_trade_days: number;
|
|
1934
2459
|
/** 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 resolved-market track record 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). */
|
|
1935
2460
|
grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
1936
|
-
/** Hot-streak tier (trailing-7d cross-sectional percentile).
|
|
2461
|
+
/** Hot-streak tier (trailing-7d cross-sectional percentile). Omitted when there is no recent activity. */
|
|
1937
2462
|
streak_tier?: "hot" | "rising" | "neutral" | "cooling" | "cold";
|
|
1938
|
-
all_time_pnl_usd?: number
|
|
1939
|
-
all_time_score?: number
|
|
1940
|
-
last_synced?: string
|
|
2463
|
+
all_time_pnl_usd?: number;
|
|
2464
|
+
all_time_score?: number;
|
|
2465
|
+
last_synced?: string;
|
|
1941
2466
|
/** Shape-only daily P&L sparkline across the window, derived from Polymarket's documented user-pnl cumulative curve (GET /v2/user-pnl) converted to per-day deltas. It conveys the trend of the curve only and is NOT guaranteed to sum to trending_pnl_usd, which is the canonical leaderboard total. */
|
|
1942
2467
|
daily_pnl_series: {
|
|
1943
2468
|
date: string;
|
|
@@ -1947,13 +2472,13 @@ export type TrendingWallet = {
|
|
|
1947
2472
|
/** Whether the described value or result set is complete for its stated contract. */
|
|
1948
2473
|
export type TrustCompleteness = {
|
|
1949
2474
|
status: "complete" | "partial" | "not_computed" | "not_applicable" | "unavailable";
|
|
1950
|
-
detail?: string
|
|
2475
|
+
detail?: string;
|
|
1951
2476
|
};
|
|
1952
2477
|
/** Freshness metadata for a trust-critical value. This is separate from transport cache fields in ResponseMeta. */
|
|
1953
2478
|
export type TrustFreshness = {
|
|
1954
2479
|
status: "fresh" | "refreshing" | "stale" | "not_live" | "unknown" | "unavailable";
|
|
1955
|
-
as_of?: string
|
|
1956
|
-
max_age_s?: number
|
|
2480
|
+
as_of?: string;
|
|
2481
|
+
max_age_s?: number;
|
|
1957
2482
|
};
|
|
1958
2483
|
/** Shared source/freshness/reconciliation/completeness metadata for public API values that may be cached, stale, partial, computed, or provider-unavailable. Unavailable provider values must be represented with explicit metadata instead of fabricated zeros or empty arrays. */
|
|
1959
2484
|
export type TrustMetadata = {
|
|
@@ -1965,7 +2490,7 @@ export type TrustMetadata = {
|
|
|
1965
2490
|
/** How provider-owned facts were reconciled with stored/read-model values. */
|
|
1966
2491
|
export type TrustReconciliation = {
|
|
1967
2492
|
status: "provider_backed" | "db_mirror" | "computed" | "partial" | "not_applicable" | "unavailable";
|
|
1968
|
-
detail?: string
|
|
2493
|
+
detail?: string;
|
|
1969
2494
|
};
|
|
1970
2495
|
/** Source metadata for a trust-critical value. Providers and DB/read models own business truth; clients should not infer missing provider facts from titles, slugs, zeros, or empty arrays. */
|
|
1971
2496
|
export type TrustSource = {
|
|
@@ -1973,7 +2498,7 @@ export type TrustSource = {
|
|
|
1973
2498
|
/** Provider, table/read-model, cache, or service that owns the value. */
|
|
1974
2499
|
owner: string;
|
|
1975
2500
|
/** Provider field, DB column, or computed field name when applicable. */
|
|
1976
|
-
field?: string
|
|
2501
|
+
field?: string;
|
|
1977
2502
|
};
|
|
1978
2503
|
export type UpdateWebhookRequest = {
|
|
1979
2504
|
name?: string;
|
|
@@ -2000,6 +2525,24 @@ export type Usage = {
|
|
|
2000
2525
|
reset_at: number;
|
|
2001
2526
|
window_seconds: number;
|
|
2002
2527
|
};
|
|
2528
|
+
/** The monthly request quota (#16111): where the account stands against the requests Pro includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
|
|
2529
|
+
monthly_quota: {
|
|
2530
|
+
/** Admitted requests so far this UTC calendar month. */
|
|
2531
|
+
used: number;
|
|
2532
|
+
/** Requests Pro includes per UTC calendar month. */
|
|
2533
|
+
limit: number;
|
|
2534
|
+
remaining: number;
|
|
2535
|
+
/** Unix seconds: the first instant of the next UTC calendar month. */
|
|
2536
|
+
reset_at: number;
|
|
2537
|
+
/** Unix seconds: from when request limit + 1 is refused for an account the quota binds. */
|
|
2538
|
+
enforced_from: number;
|
|
2539
|
+
/** Whether requests over this account's ceiling are refused right now: false before enforced_from and for an admin account. */
|
|
2540
|
+
binding: boolean;
|
|
2541
|
+
/** Pay as you go is on: requests over the quota keep answering and bill on a monthly invoice, up to ceiling. */
|
|
2542
|
+
pay_as_you_go: boolean;
|
|
2543
|
+
/** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or 1,000,000 with pay as you go on. null for an admin account, which no number stops. Additive since 2026-09-22. */
|
|
2544
|
+
ceiling: number | null;
|
|
2545
|
+
} | null;
|
|
2003
2546
|
};
|
|
2004
2547
|
meta: ResponseMeta;
|
|
2005
2548
|
};
|
|
@@ -2026,6 +2569,8 @@ export type WebhookDelivery = {
|
|
|
2026
2569
|
delivered_at?: string;
|
|
2027
2570
|
/** When the next delivery attempt is due, for a delivery whose status is pending or retry. null while an attempt is in flight (processing) and once the delivery is terminal (delivered or dead_letter). */
|
|
2028
2571
|
next_attempt_at: string | null;
|
|
2572
|
+
/** Why next_attempt_at was scheduled: receiver_retry_after for an accepted Retry-After on a 408, 429, or 5xx response; transient_failure for a network or ordinary transient retry; permanent_or_auth_failure for another non-2xx response; manual_redelivery or configuration_changed for those queue actions. null while an attempt is in flight or once the delivery is terminal. */
|
|
2573
|
+
retry_schedule_reason: "receiver_retry_after" | "transient_failure" | "permanent_or_auth_failure" | "manual_redelivery" | "configuration_changed" | null;
|
|
2029
2574
|
created_at: string;
|
|
2030
2575
|
};
|
|
2031
2576
|
export type WebhookEndpoint = {
|
|
@@ -2035,17 +2580,18 @@ export type WebhookEndpoint = {
|
|
|
2035
2580
|
url: string;
|
|
2036
2581
|
event_types: WebhookEventType[];
|
|
2037
2582
|
status: WebhookStatus;
|
|
2038
|
-
verified_at
|
|
2583
|
+
verified_at: string | null;
|
|
2039
2584
|
verification_token_expires_at: string;
|
|
2040
2585
|
failure_count: number;
|
|
2041
2586
|
created_at: string;
|
|
2042
2587
|
updated_at: string;
|
|
2043
2588
|
retry_policy: WebhookRetryPolicy;
|
|
2044
|
-
|
|
2589
|
+
secret_rotation: WebhookSecretRotation;
|
|
2590
|
+
/** Returned only on create, immediate rotate-secret, staged rotate-secret/prepare, or staged rotate-secret/activate. Never returned by list, get, update, delete, verify, or retire. */
|
|
2045
2591
|
signing_secret?: string;
|
|
2046
2592
|
verification?: WebhookVerification;
|
|
2047
2593
|
};
|
|
2048
|
-
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (whale_trades_inserted, wallet_grade_changed, insider_radar_flag_raised, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. */
|
|
2594
|
+
/** Self-describing entry in the webhook event catalog: the event type a subscriber lists in event_types, when it fires, the data payload shape, and whether it currently fires (active) or is reserved (dormant, subscribable but not yet delivered). Pro-only event types (whale_trades_inserted, wallet_grade_changed, suspicious_trade_flagged, insider_radar_flag_raised, smart_money_flow_detected) only deliver to API keys on an active Pro subscription. suspicious_trade_flagged and insider_radar_flag_raised are two spellings of one event: either one subscribes, and an endpoint receives deliveries under the spelling it registered. */
|
|
2049
2595
|
export type WebhookEventDescriptor = {
|
|
2050
2596
|
id: WebhookEventType;
|
|
2051
2597
|
/** One-line description of when the event fires. */
|
|
@@ -2055,7 +2601,7 @@ export type WebhookEventDescriptor = {
|
|
|
2055
2601
|
/** active: the event has a firing producer callsite. dormant: advertised and subscribable, but does not yet enqueue any delivery. */
|
|
2056
2602
|
status: "active" | "dormant";
|
|
2057
2603
|
};
|
|
2058
|
-
export type WebhookEventType = "whale_trades_inserted" | "live_sports_updated" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "insider_radar_flag_raised" | "smart_money_flow_detected";
|
|
2604
|
+
export type WebhookEventType = "whale_trades_inserted" | "live_sports_updated" | "whale_trader_synced" | "large_positions_updated" | "wallet_grade_changed" | "suspicious_trade_flagged" | "insider_radar_flag_raised" | "smart_money_flow_detected";
|
|
2059
2605
|
export type WebhookRetryPolicy = {
|
|
2060
2606
|
max_attempts: 8;
|
|
2061
2607
|
terminal_status: "dead_letter";
|
|
@@ -2064,74 +2610,25 @@ export type WebhookRetryPolicy = {
|
|
|
2064
2610
|
/** Consecutive failed attempts, across all of this endpoint's deliveries, after which the endpoint is disabled and its queued deliveries are dead-lettered. Any successful attempt resets the count. */
|
|
2065
2611
|
disable_after_consecutive_failures: 8;
|
|
2066
2612
|
};
|
|
2613
|
+
export type WebhookSecretRotation = {
|
|
2614
|
+
/** idle when no staged rotation exists, pending after prepare, and overlap after activate while both signing secrets are accepted. */
|
|
2615
|
+
status: "idle" | "pending" | "overlap";
|
|
2616
|
+
/** When the previous signing secret stops being emitted and accepted. null outside the overlap phase. */
|
|
2617
|
+
overlap_expires_at: string | null;
|
|
2618
|
+
};
|
|
2067
2619
|
export type WebhookStatus = "pending_verification" | "active" | "disabled";
|
|
2068
2620
|
export type WebhookVerification = {
|
|
2069
2621
|
/** One-time verification token returned only on create or URL change. Pass it to POST /api/v1/webhooks/{id}/verify, which activates the endpoint only when the destination also answers the signed webhook.verification challenge with a 2xx. */
|
|
2070
2622
|
token: string;
|
|
2071
2623
|
expires_at: string;
|
|
2072
2624
|
};
|
|
2073
|
-
export type WhaleTrade = {
|
|
2074
|
-
/** Prefixed ID (wt_...). */
|
|
2075
|
-
id: string;
|
|
2076
|
-
traded_at: string;
|
|
2077
|
-
size_usd: number;
|
|
2078
|
-
side: "BUY" | "SELL";
|
|
2079
|
-
/** Traded outcome label (e.g. "Yes"/"No"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, whose stored outcome_index is not trusted (a defaulted 0 for about a third of those rows; the side is unknown, not defaulted). */
|
|
2080
|
-
outcome?: string | null;
|
|
2081
|
-
/** The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z, where the traded side is unknown. */
|
|
2082
|
-
token_id?: string | null;
|
|
2083
|
-
price: number;
|
|
2084
|
-
/** Current 0.0–1.0 normalized signal score. This value can change as scoring context changes. */
|
|
2085
|
-
signal_score: number;
|
|
2086
|
-
/** 0.0–1.0 signal score written once when the trade row is inserted. Available for new rows after this field launched; legacy rows return null. If a trade is added later, its time-sensitive recorded score reflects that delay. */
|
|
2087
|
-
recorded_signal_score: number | null;
|
|
2088
|
-
/** Persisted live suspicion score from the scorer. Null when the row has no persisted score. */
|
|
2089
|
-
suspicion_score: number | null;
|
|
2090
|
-
/** Persisted scorer track. Null when a legacy row has no stored track label. */
|
|
2091
|
-
suspicion_track: "whale" | "fresh_conviction" | "sliced_position";
|
|
2092
|
-
/** This fill's size relative to its market: size_usd divided by the market's volume at the moment the trade was inserted. A $10,000 fill is 0.00005 of a $200M market and 0.125 of an $80,000 one, which size_usd alone cannot distinguish. Absent when the market carried no volume figure and on rows written before 2026-09-16; never 0 as a stand-in. Not capped at 1: a fill larger than the stored trailing volume is real, and that is the most significant case. */
|
|
2093
|
-
market_volume_share?: number;
|
|
2094
|
-
trader: {
|
|
2095
|
-
id: string;
|
|
2096
|
-
address: string;
|
|
2097
|
-
username?: string | null;
|
|
2098
|
-
grade?: string | null;
|
|
2099
|
-
};
|
|
2100
|
-
market: {
|
|
2101
|
-
id: string;
|
|
2102
|
-
condition_id: string;
|
|
2103
|
-
title: string;
|
|
2104
|
-
slug?: string | null;
|
|
2105
|
-
/** Provider-backed market_canonical category. */
|
|
2106
|
-
category?: string | null;
|
|
2107
|
-
};
|
|
2108
|
-
};
|
|
2109
|
-
export type WhaleTradeDetail = WhaleTrade & {
|
|
2110
|
-
counterparty_analysis: CounterpartyAnalysis;
|
|
2111
|
-
};
|
|
2112
|
-
export type WhaleTradeHistoryMeta = {
|
|
2113
|
-
/** Unique request ID (req_ prefix). */
|
|
2114
|
-
request_id: string;
|
|
2115
|
-
cached: boolean;
|
|
2116
|
-
/** Cache age in seconds, null if not cached. */
|
|
2117
|
-
cache_age_s?: number | null;
|
|
2118
|
-
source: {
|
|
2119
|
-
kind: "local_replay";
|
|
2120
|
-
table: "whale_alerts";
|
|
2121
|
-
provider_fetch_at_request_time: false;
|
|
2122
|
-
};
|
|
2123
|
-
completeness: {
|
|
2124
|
-
status: "best_effort";
|
|
2125
|
-
/** Explains that local replay completeness can vary by market and time window. */
|
|
2126
|
-
reason: string;
|
|
2127
|
-
};
|
|
2128
|
-
};
|
|
2129
2625
|
/**
|
|
2130
2626
|
* The `data` payload each operation answers with: what
|
|
2131
2627
|
* `ApiClient.call<T>` resolves to, and the default `T` of every
|
|
2132
2628
|
* convenience method.
|
|
2133
2629
|
*/
|
|
2134
2630
|
export interface OperationData {
|
|
2631
|
+
activateWebhookSecret: WebhookEndpoint;
|
|
2135
2632
|
batchGetMarketIntel: BatchMarketIntelItem[];
|
|
2136
2633
|
batchGetTraders: BatchTraderItem[];
|
|
2137
2634
|
createMcpJsonRpcResponse: {
|
|
@@ -2150,17 +2647,27 @@ export interface OperationData {
|
|
|
2150
2647
|
user_id: number;
|
|
2151
2648
|
credential_id: number;
|
|
2152
2649
|
credential_kind: "api_key" | "oauth_grant";
|
|
2650
|
+
/** The credential is currently valid; revoked, expired or unknown credentials are rejected. */
|
|
2651
|
+
credential_status: "active";
|
|
2652
|
+
entitlement: {
|
|
2653
|
+
paid_data_access: "active" | "lapsed";
|
|
2654
|
+
/** When paid data access is lapsed, the caller should renew the subscription; otherwise null. */
|
|
2655
|
+
recovery_action: "renew_subscription" | null;
|
|
2656
|
+
};
|
|
2153
2657
|
/** Approved OAuth scopes; null for full developer-key access. */
|
|
2154
2658
|
scopes: string[] | null;
|
|
2155
2659
|
};
|
|
2156
2660
|
getApiDiscovery: ApiDiscovery;
|
|
2157
2661
|
getDailyReportSnapshot: ReportSnapshot;
|
|
2158
2662
|
getEventReplaySince: EventReplayEvent[];
|
|
2663
|
+
getGame: Game;
|
|
2159
2664
|
getHealth: {
|
|
2160
2665
|
status?: "ok" | "degraded" | "down" | "maintenance";
|
|
2161
2666
|
db?: boolean;
|
|
2162
2667
|
cache?: boolean;
|
|
2163
2668
|
subsystems?: {
|
|
2669
|
+
/** Whether the webhook outbox schema validated on this probe. false lowers status to degraded. true during a maintenance window, when nothing is probed. */
|
|
2670
|
+
webhook_compatibility: boolean;
|
|
2164
2671
|
/** Public-safe aggregate status for expected background job successful-completion heartbeats. Does not expose Redis keys, job names, raw errors, provider payloads, wallet addresses, or condition IDs. */
|
|
2165
2672
|
background_jobs: {
|
|
2166
2673
|
status: "ok" | "degraded" | "down" | "not_checked";
|
|
@@ -2176,9 +2683,11 @@ export interface OperationData {
|
|
|
2176
2683
|
};
|
|
2177
2684
|
};
|
|
2178
2685
|
};
|
|
2179
|
-
getInsiderRadarFlag:
|
|
2686
|
+
getInsiderRadarFlag: SuspiciousTrade;
|
|
2687
|
+
getLargeTrade: LargeTradeDetail;
|
|
2180
2688
|
getMarketCandles: MarketCandles;
|
|
2181
2689
|
getMarketContextMarkdown: string;
|
|
2690
|
+
getMarketHolders: MarketHolder[];
|
|
2182
2691
|
getMarketIntel: MarketIntel;
|
|
2183
2692
|
getMarketSnapshot: MarketSnapshot;
|
|
2184
2693
|
getMonthlyReportSnapshot: ReportSnapshot;
|
|
@@ -2190,18 +2699,52 @@ export interface OperationData {
|
|
|
2190
2699
|
getPositionTimelineById: PositionTimelineEvent[];
|
|
2191
2700
|
getReports: ReportSnapshot;
|
|
2192
2701
|
getStream: string;
|
|
2702
|
+
getSuspiciousTrade: SuspiciousTrade;
|
|
2193
2703
|
getTrader: Trader;
|
|
2704
|
+
getTraderCategoryRecords: TraderCategoryRecords;
|
|
2194
2705
|
getTraderContext: TraderContext;
|
|
2195
2706
|
getTraderContextMarkdown: string;
|
|
2196
2707
|
getTraderExportSnapshot: TraderExportSnapshot;
|
|
2197
2708
|
getTraderExportStatus: {
|
|
2198
2709
|
job_id: number;
|
|
2199
|
-
|
|
2710
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2711
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
|
|
2200
2712
|
format: "json" | "ndjson" | "csv";
|
|
2201
|
-
total_trades
|
|
2202
|
-
processed_trades
|
|
2203
|
-
file_size
|
|
2204
|
-
error
|
|
2713
|
+
total_trades: number | null;
|
|
2714
|
+
processed_trades: number | null;
|
|
2715
|
+
file_size: number | null;
|
|
2716
|
+
error: string | null;
|
|
2717
|
+
/** True when status never changes again (ready, failed, expired). Stop polling. */
|
|
2718
|
+
terminal: boolean;
|
|
2719
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2720
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2721
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
|
|
2722
|
+
poll_after_s?: number;
|
|
2723
|
+
created_at: string;
|
|
2724
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2725
|
+
started_at: string | null;
|
|
2726
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2727
|
+
ready_at: string | null;
|
|
2728
|
+
failed_at: string | null;
|
|
2729
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2730
|
+
expires_at: string;
|
|
2731
|
+
/** When the job became expired; null until then. */
|
|
2732
|
+
expired_at: string | null;
|
|
2733
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2734
|
+
data_as_of: string | null;
|
|
2735
|
+
/** Worker claims so far. */
|
|
2736
|
+
attempt: number;
|
|
2737
|
+
/** The job fails when attempt reaches this. */
|
|
2738
|
+
max_attempts: number;
|
|
2739
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2740
|
+
artifact?: {
|
|
2741
|
+
/** The storage ETag of the object. */
|
|
2742
|
+
etag: string | null;
|
|
2743
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2744
|
+
compressed_size_bytes: number | null;
|
|
2745
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2746
|
+
content_encoding: "gzip";
|
|
2747
|
+
};
|
|
2205
2748
|
};
|
|
2206
2749
|
getTraderPnl: TraderPnl;
|
|
2207
2750
|
getUsage: {
|
|
@@ -2220,51 +2763,109 @@ export interface OperationData {
|
|
|
2220
2763
|
reset_at: number;
|
|
2221
2764
|
window_seconds: number;
|
|
2222
2765
|
};
|
|
2766
|
+
/** The monthly request quota (#16111): where the account stands against the requests Pro includes per UTC calendar month. Reading it here spends nothing. null only when the month's count could not be read for this response. */
|
|
2767
|
+
monthly_quota: {
|
|
2768
|
+
/** Admitted requests so far this UTC calendar month. */
|
|
2769
|
+
used: number;
|
|
2770
|
+
/** Requests Pro includes per UTC calendar month. */
|
|
2771
|
+
limit: number;
|
|
2772
|
+
remaining: number;
|
|
2773
|
+
/** Unix seconds: the first instant of the next UTC calendar month. */
|
|
2774
|
+
reset_at: number;
|
|
2775
|
+
/** Unix seconds: from when request limit + 1 is refused for an account the quota binds. */
|
|
2776
|
+
enforced_from: number;
|
|
2777
|
+
/** Whether requests over this account's ceiling are refused right now: false before enforced_from and for an admin account. */
|
|
2778
|
+
binding: boolean;
|
|
2779
|
+
/** Pay as you go is on: requests over the quota keep answering and bill on a monthly invoice, up to ceiling. */
|
|
2780
|
+
pay_as_you_go: boolean;
|
|
2781
|
+
/** The most requests this account is admitted in a UTC calendar month once enforcement has begun: limit, or 1,000,000 with pay as you go on. null for an admin account, which no number stops. Additive since 2026-09-22. */
|
|
2782
|
+
ceiling: number | null;
|
|
2783
|
+
} | null;
|
|
2223
2784
|
};
|
|
2224
2785
|
getWebhook: WebhookEndpoint;
|
|
2225
2786
|
getWeeklyReportSnapshot: ReportSnapshot;
|
|
2226
|
-
getWhaleTrade:
|
|
2227
|
-
|
|
2787
|
+
getWhaleTrade: LargeTradeDetail;
|
|
2788
|
+
listGames: Game[];
|
|
2789
|
+
listInsiderRadar: SuspiciousTrade[];
|
|
2228
2790
|
listLargePositions: LargePosition[];
|
|
2791
|
+
listLargeTradeCounterpartyExecutions: CounterpartyAnalysis;
|
|
2792
|
+
listLargeTradeCounterpartyMakers: CounterpartyMakerPage;
|
|
2793
|
+
listLargeTradeHistory: LargeTrade[];
|
|
2794
|
+
listLargeTrades: LargeTrade[];
|
|
2229
2795
|
listLeaderboard: LeaderboardEntry[];
|
|
2230
2796
|
listPositions: Position[];
|
|
2797
|
+
listPreGameSideObservations: PreGameSideObservation[];
|
|
2798
|
+
listPreGameSides: PreGameSide[];
|
|
2231
2799
|
listSharpMoneyFlows: SmartMoneyFlowMarket[];
|
|
2232
2800
|
listSmartMoneyFlows: SmartMoneyFlowMarket[];
|
|
2233
|
-
listSportsEdgeObservations:
|
|
2234
|
-
listSportsEdgeSignals:
|
|
2801
|
+
listSportsEdgeObservations: PreGameSideObservation[];
|
|
2802
|
+
listSportsEdgeSignals: PreGameSide[];
|
|
2803
|
+
listSuspiciousTrades: SuspiciousTrade[];
|
|
2235
2804
|
listTrendingWallets: TrendingWallet[];
|
|
2236
2805
|
listWebhookDeliveries: WebhookDelivery[];
|
|
2237
2806
|
listWebhookEvents: WebhookEventDescriptor[];
|
|
2238
2807
|
listWebhooks: WebhookEndpoint[];
|
|
2239
2808
|
listWhaleTradeCounterpartyExecutions: CounterpartyAnalysis;
|
|
2240
2809
|
listWhaleTradeCounterpartyMakers: CounterpartyMakerPage;
|
|
2241
|
-
listWhaleTradeHistory:
|
|
2242
|
-
listWhaleTrades:
|
|
2243
|
-
|
|
2810
|
+
listWhaleTradeHistory: LargeTrade[];
|
|
2811
|
+
listWhaleTrades: LargeTrade[];
|
|
2812
|
+
prepareWebhookSecret: WebhookEndpoint;
|
|
2244
2813
|
redeliverWebhookDelivery: WebhookDelivery;
|
|
2814
|
+
registerAgent: AgentRegistration;
|
|
2815
|
+
retireWebhookSecret: WebhookEndpoint;
|
|
2245
2816
|
rotateWebhookSecret: WebhookEndpoint;
|
|
2246
2817
|
searchContent: ContentSearchResult[];
|
|
2247
2818
|
searchMarkets: MarketSearchResult[];
|
|
2248
2819
|
submitTraderExport: {
|
|
2249
2820
|
job_id: number;
|
|
2250
|
-
|
|
2821
|
+
/** queued: accepted, not started. running: the worker is streaming rows. reconcile_required: the upload finished but the storage completion answer was lost; the hourly reconciler reads the object back and moves the job to ready or failed, and expires_at bounds the wait. ready: downloadable until expires_at. failed: terminal; error says why; submit a new export. expired: the retention window passed; the file is retired, the download route answers 410, submit a new export. A job that has not reached ready by expires_at reads failed with error 'export expired before completion'. failed and expired rows stay readable for 48 hours, then the job answers 404. */
|
|
2822
|
+
status: "queued" | "running" | "ready" | "failed" | "reconcile_required" | "expired";
|
|
2251
2823
|
format: "json" | "ndjson" | "csv";
|
|
2252
|
-
total_trades
|
|
2253
|
-
processed_trades
|
|
2254
|
-
file_size
|
|
2255
|
-
error
|
|
2824
|
+
total_trades: number | null;
|
|
2825
|
+
processed_trades: number | null;
|
|
2826
|
+
file_size: number | null;
|
|
2827
|
+
error: string | null;
|
|
2828
|
+
/** True when status never changes again (ready, failed, expired). Stop polling. */
|
|
2829
|
+
terminal: boolean;
|
|
2830
|
+
/** What to do next: poll the status route after poll_after_s, follow the download route, or submit a new export. Published beside status so a status value added later does not strand a client. */
|
|
2831
|
+
next_action: "poll" | "download" | "resubmit";
|
|
2832
|
+
/** Seconds to wait before polling again. Absent when terminal. 5 while queued or running; 300 while reconcile_required, the cadence that state can change at. */
|
|
2833
|
+
poll_after_s?: number;
|
|
2834
|
+
created_at: string;
|
|
2835
|
+
/** When the worker last claimed the job; null while queued. */
|
|
2836
|
+
started_at: string | null;
|
|
2837
|
+
/** When the file became downloadable. null before ready, and on jobs finalized before this field existed. */
|
|
2838
|
+
ready_at: string | null;
|
|
2839
|
+
failed_at: string | null;
|
|
2840
|
+
/** The retention window: 24 hours from submit. A ready file downloads until this instant; a job that has not reached ready by it fails. A reused job (200 on submit) keeps its original window. */
|
|
2841
|
+
expires_at: string;
|
|
2842
|
+
/** When the job became expired; null until then. */
|
|
2843
|
+
expired_at: string | null;
|
|
2844
|
+
/** What the file is a snapshot of: the trader's served-data clock (the latest position refresh, else the last completed sync) when the file was written; the same value as export_metadata.data_as_of inside the file. null until the file is written, or when the trader had neither. Read this, not ready_at, to decide whether a reused job is fresh enough; submit with fresh=true for a newer snapshot. */
|
|
2845
|
+
data_as_of: string | null;
|
|
2846
|
+
/** Worker claims so far. */
|
|
2847
|
+
attempt: number;
|
|
2848
|
+
/** The job fails when attempt reaches this. */
|
|
2849
|
+
max_attempts: number;
|
|
2850
|
+
/** Present only while status is ready: the stored object's identity, so a client can check the download it receives. */
|
|
2851
|
+
artifact?: {
|
|
2852
|
+
/** The storage ETag of the object. */
|
|
2853
|
+
etag: string | null;
|
|
2854
|
+
/** Bytes on the wire (gzip); file_size is the decompressed size. */
|
|
2855
|
+
compressed_size_bytes: number | null;
|
|
2856
|
+
content_type: "application/json" | "application/x-ndjson" | "text/csv";
|
|
2857
|
+
content_encoding: "gzip";
|
|
2858
|
+
};
|
|
2256
2859
|
};
|
|
2257
2860
|
updateWebhook: WebhookEndpoint;
|
|
2258
2861
|
verifyWebhook: WebhookEndpoint;
|
|
2259
2862
|
}
|
|
2260
2863
|
/** Each operation's documented query parameters. */
|
|
2261
2864
|
export interface OperationQuery {
|
|
2865
|
+
activateWebhookSecret: Record<string, never>;
|
|
2262
2866
|
batchGetMarketIntel: Record<string, never>;
|
|
2263
2867
|
batchGetTraders: Record<string, never>;
|
|
2264
|
-
createMcpJsonRpcResponse:
|
|
2265
|
-
/** Legacy API-key query parameter for exact /api/v1/mcp only. Every other protected V1 route rejects it. Prefer Authorization: Bearer <token> or the stdio package because URL secrets are easier to leak through logs and history. The retirement date is unknown until external URL-only client compatibility is checked. */
|
|
2266
|
-
token?: string;
|
|
2267
|
-
};
|
|
2868
|
+
createMcpJsonRpcResponse: Record<string, never>;
|
|
2268
2869
|
createWebhook: Record<string, never>;
|
|
2269
2870
|
deleteWebhook: Record<string, never>;
|
|
2270
2871
|
exploreMarkets: {
|
|
@@ -2290,22 +2891,44 @@ export interface OperationQuery {
|
|
|
2290
2891
|
date: string;
|
|
2291
2892
|
};
|
|
2292
2893
|
getEventReplaySince: {
|
|
2293
|
-
/** Opaque event replay cursor returned as next_cursor by a prior response. The cursor maps to whale_alerts.id
|
|
2894
|
+
/** Opaque event replay cursor returned as next_cursor by a prior response. The cursor maps to the global (whale_alerts.inserted_xid, whale_alerts.id) commit-order position, is valid across backend replicas, and is bound to the filter set the walk ran with (trader, condition_id, min_grade, min_size): presenting it under different filters answers 400 bad_request with error.reason cursor_expired, and the walk restarts without a cursor. Cursors issued before 2026-09-22 (id-only) stay accepted and are bound to no filters. Omit to fetch the latest durable public suffix. */
|
|
2294
2895
|
cursor?: string;
|
|
2295
2896
|
/** Maximum durable public whale-trade events to return. */
|
|
2296
2897
|
limit?: number;
|
|
2898
|
+
/** Only this wallet's trades: a wallet address, trd_-prefixed trader id or username resolved against the traders table. Bound to the cursor: a cursor issued under other filters answers 400 with error.reason cursor_expired. An unknown trader matches nothing and the walk still advances. */
|
|
2899
|
+
trader?: string;
|
|
2900
|
+
/** Only trades on this market: the raw provider condition_id or its mkt_-prefixed id. Bound to the cursor. */
|
|
2901
|
+
condition_id?: string;
|
|
2902
|
+
/** Only trades by wallets at this grade or better (S best), read from the wallet's newest ranking at request time; a wallet with no grade never passes. Bound to the cursor. */
|
|
2903
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2904
|
+
/** Only trades of at least this size in USD (compared in cents). Bound to the cursor. */
|
|
2905
|
+
min_size?: number;
|
|
2906
|
+
/** Repeatable. trade adds the public trade read to every event (the object GET /api/v1/whale-trades/{id} returns for it), from one query per page, so a page of 100 events needs no per-event detail request. Not bound to the cursor: switch it on or off mid-walk. */
|
|
2907
|
+
expand?: "trade"[];
|
|
2297
2908
|
};
|
|
2909
|
+
getGame: Record<string, never>;
|
|
2298
2910
|
getHealth: Record<string, never>;
|
|
2299
2911
|
getInsiderRadarFlag: Record<string, never>;
|
|
2912
|
+
getLargeTrade: Record<string, never>;
|
|
2300
2913
|
getMarketCandles: {
|
|
2301
2914
|
/** Bucketing granularity. 1d aggregates by UTC calendar day, 1w by ISO week (Monday 00:00 UTC start). Defaults to 1d. */
|
|
2302
2915
|
resolution?: "1d" | "1w";
|
|
2303
|
-
/** Exclusive lower bound as a unix timestamp in seconds; points at or before this timestamp are omitted (the underlying daily snapshot read filters bucket_start > from). Note: for resolution=1w a surviving mid-week point can yield a weekly candle whose t (Monday 00:00 UTC) precedes from. */
|
|
2916
|
+
/** Exclusive lower bound as a URL-decoded unix timestamp in seconds; points at or before this timestamp are omitted (the underlying daily snapshot read filters bucket_start > from). If to is also present, from must be less than or equal to to. Note: for resolution=1w a surviving mid-week point can yield a weekly candle whose t (Monday 00:00 UTC) precedes from. */
|
|
2304
2917
|
from?: number;
|
|
2305
|
-
/** Inclusive upper bound as a unix timestamp in seconds; points after this timestamp are omitted. */
|
|
2918
|
+
/** Inclusive upper bound as a URL-decoded unix timestamp in seconds; points after this timestamp are omitted. If from is also present, from must be less than or equal to to. */
|
|
2306
2919
|
to?: number;
|
|
2307
2920
|
};
|
|
2308
2921
|
getMarketContextMarkdown: Record<string, never>;
|
|
2922
|
+
getMarketHolders: {
|
|
2923
|
+
/** Keep holders netting one side. `all` (default) lists both. */
|
|
2924
|
+
outcome?: "yes" | "no" | "all";
|
|
2925
|
+
/** Narrow within the graded cohort: `S` keeps S, `A` keeps S and A, `B` (default) keeps S, A and B. `C`, `D` and `F` are rejected with 400: the route lists the S/A/B cohort only. The cohort is the wallet's current grade (`traders.latest_grade`), so no value here reaches a C, D, F or ungraded holder; those are counted only in `scan.wallet_count`. `min_grade=D` on GET /api/v1/positions does return C and D, which is one of the three reasons the two routes' counts differ for the same market. */
|
|
2926
|
+
min_grade?: "S" | "A" | "B";
|
|
2927
|
+
/** Maximum holders per page. */
|
|
2928
|
+
limit?: number;
|
|
2929
|
+
/** Opaque pagination cursor from the previous response's next_cursor. It encodes a page of one shared roster, so it stays valid across the roster's refresh, but a page read after a refresh can repeat or skip a holder. */
|
|
2930
|
+
cursor?: string;
|
|
2931
|
+
};
|
|
2309
2932
|
getMarketIntel: {
|
|
2310
2933
|
/** Lookback window for whale flow aggregation. */
|
|
2311
2934
|
timeframe?: "1h" | "4h" | "24h" | "7d";
|
|
@@ -2343,7 +2966,7 @@ export interface OperationQuery {
|
|
|
2343
2966
|
getReports: {
|
|
2344
2967
|
/** Report granularity selector. */
|
|
2345
2968
|
granularity: "daily" | "weekly" | "monthly";
|
|
2346
|
-
/** Period token for the granularity. daily: UTC date YYYY-MM-DD. weekly: ISO week YYYY-WW, or a from,to YYYY-MM-DD pair. monthly: UTC month YYYY-MM. */
|
|
2969
|
+
/** Period token for the granularity. daily: UTC date YYYY-MM-DD. weekly: ISO week YYYY-WW for a durable canonical snapshot, or a from,to YYYY-MM-DD pair for an exact ephemeral range limited to 31 inclusive UTC days. A wider explicit range returns 400 invalid_query. monthly: UTC month YYYY-MM. */
|
|
2347
2970
|
period: string;
|
|
2348
2971
|
};
|
|
2349
2972
|
getStream: {
|
|
@@ -2358,12 +2981,17 @@ export interface OperationQuery {
|
|
|
2358
2981
|
/** Optional per-connection subscribe-time filter. A frame passes only when it carries a grade field whose grade is better-or-equal to this minimum (S is best). Frames that carry no grade field (every frame except wallet_grade_changed) are EXCLUDED while this is set. An invalid grade returns HTTP 400. Combines with event and condition_id as a logical AND; an absent param adds no constraint. */
|
|
2359
2982
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2360
2983
|
};
|
|
2984
|
+
getSuspiciousTrade: Record<string, never>;
|
|
2361
2985
|
getTrader: {
|
|
2362
2986
|
/** Backward-compatible alias for expand. Repeatable: strategy, categories, quant_metrics, trust. */
|
|
2363
2987
|
"expand[]"?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
2364
2988
|
/** Include heavy fields and trust metadata. Repeatable: strategy, categories, quant_metrics, trust. */
|
|
2365
2989
|
expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
2366
2990
|
};
|
|
2991
|
+
getTraderCategoryRecords: {
|
|
2992
|
+
/** 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 value that matches no record answers 200 with an empty records array, never 404. */
|
|
2993
|
+
category?: string;
|
|
2994
|
+
};
|
|
2367
2995
|
getTraderContext: Record<string, never>;
|
|
2368
2996
|
getTraderContextMarkdown: Record<string, never>;
|
|
2369
2997
|
getTraderExportSnapshot: Record<string, never>;
|
|
@@ -2371,18 +2999,43 @@ export interface OperationQuery {
|
|
|
2371
2999
|
/** Export job id returned by the submit route. */
|
|
2372
3000
|
job_id: number;
|
|
2373
3001
|
};
|
|
2374
|
-
getTraderPnl:
|
|
3002
|
+
getTraderPnl: {
|
|
3003
|
+
/** Inclusive UTC calendar-date lower bound in YYYY-MM-DD form for the daily series (entries and drawdown). Omit for the whole stored history. A value that is not a calendar date, or a from later than to, returns 400 bad_request with error.param from. Does not change stats, monthly or year_totals, which stay defined over the full history. */
|
|
3004
|
+
from?: string;
|
|
3005
|
+
/** Inclusive UTC calendar-date upper bound in YYYY-MM-DD form for the daily series (entries and drawdown). Omit for the whole stored history. A value that is not a calendar date returns 400 bad_request with error.param to. Does not change stats, monthly or year_totals. */
|
|
3006
|
+
to?: string;
|
|
3007
|
+
/** Which sections of the object to return. Repeatable and comma-separated: entries, stats, monthly, year_totals, drawdown. Omit it, or send it empty, for all five. A section left out is absent from data. An unrecognized name returns 400 bad_request with error.param sections rather than being ignored, so a typo cannot look like a successful request that silently dropped the section you came for. */
|
|
3008
|
+
sections?: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
3009
|
+
/** Backward-compatible bracket alias for sections, for clients that emit array keys. Repeatable and comma-separated: entries, stats, monthly, year_totals, drawdown. */
|
|
3010
|
+
"sections[]"?: ("entries" | "stats" | "monthly" | "year_totals" | "drawdown")[];
|
|
3011
|
+
};
|
|
2375
3012
|
getUsage: Record<string, never>;
|
|
2376
3013
|
getWebhook: Record<string, never>;
|
|
2377
3014
|
getWeeklyReportSnapshot: {
|
|
2378
|
-
/** UTC source-range start in YYYY-MM-DD format; required with to. */
|
|
3015
|
+
/** UTC source-range start in YYYY-MM-DD format; required with to. Together with to, selects an exact ephemeral range of at most 31 inclusive UTC days. */
|
|
2379
3016
|
from?: string;
|
|
2380
|
-
/** UTC source-range end in YYYY-MM-DD format; required with from. */
|
|
3017
|
+
/** UTC source-range end in YYYY-MM-DD format; required with from. Together with from, selects an exact ephemeral range of at most 31 inclusive UTC days. */
|
|
2381
3018
|
to?: string;
|
|
2382
|
-
/** ISO week selector in YYYY-WW format; alternative to from/to. */
|
|
3019
|
+
/** ISO week selector in YYYY-WW format; alternative to from/to. Selects a durable canonical snapshot. */
|
|
2383
3020
|
week?: string;
|
|
2384
3021
|
};
|
|
2385
3022
|
getWhaleTrade: Record<string, never>;
|
|
3023
|
+
listGames: {
|
|
3024
|
+
/** Canonical sport bucket, case-insensitive, with - and _ read as a space: table-tennis and Table Tennis are the same bucket. Omit for every covered sport. A bucket this deployment does not serve returns an empty page. */
|
|
3025
|
+
sport?: string;
|
|
3026
|
+
/** League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2. Omit for every league inside the selected sports. */
|
|
3027
|
+
league?: string;
|
|
3028
|
+
/** Keep only games in this state. A value outside the enum returns an empty page. */
|
|
3029
|
+
status?: "scheduled" | "live" | "paused" | "ended" | "postponed" | "cancelled" | "suspended" | "delayed" | "unknown";
|
|
3030
|
+
/** RFC 3339 instant. Keep only games whose kickoff is at or after it. Games with no published kickoff are excluded whenever either bound is set. */
|
|
3031
|
+
starts_after?: string;
|
|
3032
|
+
/** RFC 3339 instant. Keep only games whose kickoff is at or before it. Must be at or after starts_after. */
|
|
3033
|
+
starts_before?: string;
|
|
3034
|
+
/** Page size. */
|
|
3035
|
+
limit?: number;
|
|
3036
|
+
/** Opaque gms_v1_ cursor from next_cursor. It pins the page position (kickoff and event_slug), not a snapshot: the catalog is live, so a game added or removed between pages moves with it. A cursor this endpoint did not issue returns 400 with error.param=cursor. */
|
|
3037
|
+
cursor?: string;
|
|
3038
|
+
};
|
|
2386
3039
|
listInsiderRadar: {
|
|
2387
3040
|
/** Maximum number of radar flags to return. */
|
|
2388
3041
|
limit?: number;
|
|
@@ -2392,13 +3045,15 @@ export interface OperationQuery {
|
|
|
2392
3045
|
min_suspicion?: number;
|
|
2393
3046
|
/** Compatible filter. flag selects live threshold crossings. watch returns no rows because no live watch policy exists. */
|
|
2394
3047
|
severity?: "flag" | "watch";
|
|
3048
|
+
/** Pagination mode. live (default) keeps the 120-second response cache; stable pins the walk to one published scoring generation and binds the cursor to the limit and filters. */
|
|
3049
|
+
mode?: "live" | "stable";
|
|
2395
3050
|
};
|
|
2396
3051
|
listLargePositions: {
|
|
2397
3052
|
/** Maximum number of large positions to return. */
|
|
2398
3053
|
limit?: number;
|
|
2399
3054
|
/** Opaque pagination cursor from a previous response. */
|
|
2400
3055
|
cursor?: string;
|
|
2401
|
-
/** Minimum position value in USD. */
|
|
3056
|
+
/** Minimum position value in USD. Raises the feed's own floor of 50,000 USD; a smaller value does not lower it. */
|
|
2402
3057
|
min_size?: number;
|
|
2403
3058
|
/** 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. */
|
|
2404
3059
|
category?: string;
|
|
@@ -2407,6 +3062,60 @@ export interface OperationQuery {
|
|
|
2407
3062
|
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id (round-trips a value from a list response). Polymarket-only; an unknown id returns []. */
|
|
2408
3063
|
condition_id?: string;
|
|
2409
3064
|
};
|
|
3065
|
+
listLargeTradeCounterpartyExecutions: {
|
|
3066
|
+
/** Counterparty snapshot ID from the large trade detail response. */
|
|
3067
|
+
snapshot_id: string;
|
|
3068
|
+
/** Opaque cursor from the previous response's next_cursor. */
|
|
3069
|
+
cursor?: string;
|
|
3070
|
+
/** Maximum number of counterparty execution rows to return. */
|
|
3071
|
+
limit?: number;
|
|
3072
|
+
};
|
|
3073
|
+
listLargeTradeCounterpartyMakers: {
|
|
3074
|
+
/** Counterparty snapshot ID from the large trade detail response. */
|
|
3075
|
+
snapshot_id: string;
|
|
3076
|
+
/** Opaque cursor from the previous response's next_cursor. */
|
|
3077
|
+
cursor?: string;
|
|
3078
|
+
/** Maximum number of maker rows to return. */
|
|
3079
|
+
limit?: number;
|
|
3080
|
+
};
|
|
3081
|
+
listLargeTradeHistory: {
|
|
3082
|
+
/** Maximum number of historical large trades to return. */
|
|
3083
|
+
limit?: number;
|
|
3084
|
+
/** Pagination cursor from previous response's next_cursor. Prefix: wth_. URL-encode when replaying as a query parameter. */
|
|
3085
|
+
cursor?: string;
|
|
3086
|
+
/** Minimum trade size in USD. The capture floor was 3,000 USD before 2026-07-06 and 10,000 USD from then (1,000 USD in earnings markets), so 10000 gives one size rule across the whole archive. */
|
|
3087
|
+
min_size?: number;
|
|
3088
|
+
/** Exact raw provider condition_id. Unknown markets return an empty list. */
|
|
3089
|
+
condition_id?: string;
|
|
3090
|
+
/** Trader wallet address, timestamp-suffixed wallet alias, username, or trd_-prefixed trader ID, resolved against the traders table. Unknown traders return an empty list. */
|
|
3091
|
+
trader?: string;
|
|
3092
|
+
/** 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. */
|
|
3093
|
+
category?: string;
|
|
3094
|
+
/** 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. */
|
|
3095
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3096
|
+
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
3097
|
+
suspicious_only?: boolean;
|
|
3098
|
+
/** Filter by whale_alerts.platform. all is equivalent to omitted. */
|
|
3099
|
+
platform?: "polymarket" | "all";
|
|
3100
|
+
/** Inclusive RFC3339 lower bound on whale_alerts.traded_at. */
|
|
3101
|
+
from?: string;
|
|
3102
|
+
/** Exclusive RFC3339 upper bound on whale_alerts.traded_at. Must be after from when both are present. */
|
|
3103
|
+
to?: string;
|
|
3104
|
+
};
|
|
3105
|
+
listLargeTrades: {
|
|
3106
|
+
/** Maximum number of recent large trades to return. */
|
|
3107
|
+
limit?: number;
|
|
3108
|
+
/** Pagination cursor from previous response's next_cursor. */
|
|
3109
|
+
cursor?: string;
|
|
3110
|
+
/** Minimum trade size in USD. */
|
|
3111
|
+
min_size?: number;
|
|
3112
|
+
/** 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. */
|
|
3113
|
+
category?: string;
|
|
3114
|
+
/** Minimum trader grade. */
|
|
3115
|
+
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
3116
|
+
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
3117
|
+
suspicious_only?: boolean;
|
|
3118
|
+
};
|
|
2410
3119
|
listLeaderboard: {
|
|
2411
3120
|
/** Maximum number of ranked traders to return. */
|
|
2412
3121
|
limit?: number;
|
|
@@ -2422,21 +3131,49 @@ export interface OperationQuery {
|
|
|
2422
3131
|
limit?: number;
|
|
2423
3132
|
/** Pagination cursor from previous response's next_cursor. */
|
|
2424
3133
|
cursor?: string;
|
|
2425
|
-
/** Minimum current position value in USD. */
|
|
3134
|
+
/** 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. */
|
|
2426
3135
|
min_size?: number;
|
|
2427
3136
|
/** Exact match against provider-backed market_canonical.category. */
|
|
2428
3137
|
category?: string;
|
|
3138
|
+
/** Scope to one market. Accepts the raw provider condition_id or the mkt_-prefixed market id emitted by V1 responses. Combine with min_size=0 for every reconciled position in that market; an unknown id returns []. */
|
|
3139
|
+
condition_id?: string;
|
|
3140
|
+
/** 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. */
|
|
3141
|
+
wallet?: string[];
|
|
3142
|
+
/** Backward-compatible bracket alias for wallet. Repeatable; same values and limits. */
|
|
3143
|
+
"wallet[]"?: string[];
|
|
2429
3144
|
/** Minimum trader grade allowlist. `A` matches S and A; `B` matches S, A, B; etc. */
|
|
2430
3145
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2431
3146
|
/** Filter by the binary outcome side. `yes` maps to outcome_index=0, `no` to outcome_index=1. */
|
|
2432
3147
|
side?: "yes" | "no";
|
|
2433
3148
|
};
|
|
3149
|
+
listPreGameSideObservations: {
|
|
3150
|
+
/** Observation cohort. wider_holder measures pre-game holder piles outside the funded route's exact raw signals admission. in_play admits only provider-confirmed live games and excludes stale or unavailable provider live-board, holder, or directional evidence. emerging_pile is a post-compute wider_holder projection for finite sharp_pct in [0.75, 0.85) with holder_scan_complete=true and a kickoff after its pinned projection cutoff; it overlaps wider_holder, is not an independent denominator, and is not arrival history. */
|
|
3151
|
+
cohort: "wider_holder" | "in_play" | "emerging_pile";
|
|
3152
|
+
/** Optional canonical sport bucket. Omitted or blank selects all registered sports. Raw provider categories resolve through the canonical taxonomy, including table-tennis or table tennis to Table Tennis and pickleball to Pickleball; a non-sport category returns an empty list. */
|
|
3153
|
+
category?: string;
|
|
3154
|
+
/** Page size. */
|
|
3155
|
+
limit?: number;
|
|
3156
|
+
/** Server-authenticated opaque seo_v2_ cursor from next_cursor. Pins snapshot_as_of, cohort, rank, and condition_id; pre-deploy unsigned seo_ cursors are rejected, so clients must request the first page after this contract ships; emerging_pile cursors also pin the first-page projection_now cutoff so kickoff filtering cannot renumber continuation pages. Client edits fail closed; it cannot cross cohorts; a refreshed snapshot invalidates it with 400. */
|
|
3157
|
+
cursor?: string;
|
|
3158
|
+
};
|
|
3159
|
+
listPreGameSides: {
|
|
3160
|
+
/** Optional canonical sport bucket filter (e.g. Basketball, Tennis, Soccer). A raw provider value (NBA) resolves to its canonical bucket. A non-sport category returns an empty list. */
|
|
3161
|
+
category?: string;
|
|
3162
|
+
/** Page size. */
|
|
3163
|
+
limit?: number;
|
|
3164
|
+
/** Opaque cursor from a previous response's next_cursor. Encodes the snapshot anchor plus the last row's directional_rank_score, conviction_score, smart_score and condition_id. A cursor from an expired snapshot returns 400. */
|
|
3165
|
+
cursor?: string;
|
|
3166
|
+
/** Kickoff ceiling in hours from now; the floor is now (only games not yet started). Clamped to 1..48. */
|
|
3167
|
+
horizon_hours?: number;
|
|
3168
|
+
/** Minimum trader grade required on the piled side. Only S, A, B are accepted (the piled-side grade distribution is S/A/B only; C, D, F return 400). Default B means at least one S/A/B holder is piled; S requires an S holder, A requires an S or A holder. */
|
|
3169
|
+
min_grade?: "S" | "A" | "B";
|
|
3170
|
+
};
|
|
2434
3171
|
listSharpMoneyFlows: {
|
|
2435
3172
|
/** Lookback window for grade-filtered whale flow aggregation. */
|
|
2436
3173
|
timeframe?: "1h" | "4h" | "24h" | "7d";
|
|
2437
3174
|
/** Page size. */
|
|
2438
3175
|
limit?: number;
|
|
2439
|
-
/** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp plus the last row's absolute net flow and condition_id. */
|
|
3176
|
+
/** 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. */
|
|
2440
3177
|
cursor?: string;
|
|
2441
3178
|
/** 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. */
|
|
2442
3179
|
category?: string;
|
|
@@ -2452,7 +3189,7 @@ export interface OperationQuery {
|
|
|
2452
3189
|
timeframe?: "1h" | "4h" | "24h" | "7d";
|
|
2453
3190
|
/** Page size. */
|
|
2454
3191
|
limit?: number;
|
|
2455
|
-
/** Opaque cursor from previous response's next_cursor. Encodes the first-page as_of timestamp plus the last row's absolute net flow and condition_id. */
|
|
3192
|
+
/** 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. */
|
|
2456
3193
|
cursor?: string;
|
|
2457
3194
|
/** 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. */
|
|
2458
3195
|
category?: string;
|
|
@@ -2485,10 +3222,22 @@ export interface OperationQuery {
|
|
|
2485
3222
|
/** Minimum trader grade required on the piled side. Only S, A, B are accepted (the piled-side grade distribution is S/A/B only; C, D, F return 400). Default B means at least one S/A/B holder is piled; S requires an S holder, A requires an S or A holder. */
|
|
2486
3223
|
min_grade?: "S" | "A" | "B";
|
|
2487
3224
|
};
|
|
3225
|
+
listSuspiciousTrades: {
|
|
3226
|
+
/** Maximum number of suspicious trades to return. */
|
|
3227
|
+
limit?: number;
|
|
3228
|
+
/** Pagination cursor from previous response. */
|
|
3229
|
+
cursor?: string;
|
|
3230
|
+
/** Minimum suspicion score (0-100). The live flag floor of 60 also applies. */
|
|
3231
|
+
min_suspicion?: number;
|
|
3232
|
+
/** Compatible filter. flag selects live threshold crossings. watch returns no rows because no live watch policy exists. */
|
|
3233
|
+
severity?: "flag" | "watch";
|
|
3234
|
+
/** Pagination mode. live (default) keeps the 120-second response cache; stable pins the walk to one published scoring generation and binds the cursor to the limit and filters. */
|
|
3235
|
+
mode?: "live" | "stable";
|
|
3236
|
+
};
|
|
2488
3237
|
listTrendingWallets: {
|
|
2489
3238
|
/** Polymarket's weekly leaderboard caps the ranked set at 50 wallets; requests above 50 still return at most 50. */
|
|
2490
3239
|
limit?: number;
|
|
2491
|
-
/** Opaque pagination cursor from a previous response. */
|
|
3240
|
+
/** Opaque pagination cursor from a previous response, bound to its effective limit, window and ranked-board generation. A changed board or request scope returns error.reason=cursor_expired; legacy page-only cursors must restart from page one. */
|
|
2492
3241
|
cursor?: string;
|
|
2493
3242
|
/** Trailing window. */
|
|
2494
3243
|
window?: "7d" | "30d";
|
|
@@ -2496,7 +3245,7 @@ export interface OperationQuery {
|
|
|
2496
3245
|
listWebhookDeliveries: {
|
|
2497
3246
|
/** Opaque pagination cursor returned as next_cursor by a prior response. Omit to fetch the newest page. */
|
|
2498
3247
|
cursor?: string;
|
|
2499
|
-
/** Maximum delivery rows to return per page. */
|
|
3248
|
+
/** Maximum delivery rows to return per page. Out-of-range values are clamped to 1..100. */
|
|
2500
3249
|
limit?: number;
|
|
2501
3250
|
};
|
|
2502
3251
|
listWebhookEvents: Record<string, never>;
|
|
@@ -2550,16 +3299,15 @@ export interface OperationQuery {
|
|
|
2550
3299
|
min_size?: number;
|
|
2551
3300
|
/** 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. */
|
|
2552
3301
|
category?: string;
|
|
2553
|
-
/** Minimum trader grade. */
|
|
3302
|
+
/** Minimum trader grade as of today (trader.grade). A means S or A, B means S, A or B. */
|
|
2554
3303
|
min_grade?: "S" | "A" | "B" | "C" | "D" | "F";
|
|
2555
3304
|
/** When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination. */
|
|
2556
3305
|
suspicious_only?: boolean;
|
|
2557
3306
|
};
|
|
2558
|
-
|
|
2559
|
-
/** Legacy API-key query parameter for exact /api/v1/mcp only. Every other protected V1 route rejects it. Same contract as POST. */
|
|
2560
|
-
token?: string;
|
|
2561
|
-
};
|
|
3307
|
+
prepareWebhookSecret: Record<string, never>;
|
|
2562
3308
|
redeliverWebhookDelivery: Record<string, never>;
|
|
3309
|
+
registerAgent: Record<string, never>;
|
|
3310
|
+
retireWebhookSecret: Record<string, never>;
|
|
2563
3311
|
rotateWebhookSecret: Record<string, never>;
|
|
2564
3312
|
searchContent: {
|
|
2565
3313
|
/** Search query. Must be 1-256 characters before whitespace trimming and non-empty after trimming. */
|
|
@@ -2582,8 +3330,772 @@ export interface OperationQuery {
|
|
|
2582
3330
|
submitTraderExport: {
|
|
2583
3331
|
/** Output serialization. json = full envelope document (default); ndjson = full envelope as line 1 then one trade object per line; csv = flat trades rows only. */
|
|
2584
3332
|
format?: "json" | "ndjson" | "csv";
|
|
3333
|
+
/** true: do not reuse a finished, running or reconciling job; only a queued job is reused, so the file is a snapshot read after this submit. Consumes quota when nothing is queued. Default false. */
|
|
3334
|
+
fresh?: boolean;
|
|
2585
3335
|
};
|
|
2586
3336
|
updateWebhook: Record<string, never>;
|
|
2587
3337
|
verifyWebhook: Record<string, never>;
|
|
2588
3338
|
}
|
|
3339
|
+
/** Each operation's path parameters; `Record<string, never>` when the path has none. */
|
|
3340
|
+
export interface OperationPath {
|
|
3341
|
+
activateWebhookSecret: {
|
|
3342
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3343
|
+
id: number;
|
|
3344
|
+
};
|
|
3345
|
+
batchGetMarketIntel: Record<string, never>;
|
|
3346
|
+
batchGetTraders: Record<string, never>;
|
|
3347
|
+
createMcpJsonRpcResponse: Record<string, never>;
|
|
3348
|
+
createWebhook: Record<string, never>;
|
|
3349
|
+
deleteWebhook: {
|
|
3350
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3351
|
+
id: number;
|
|
3352
|
+
};
|
|
3353
|
+
exploreMarkets: Record<string, never>;
|
|
3354
|
+
getAccountIdentity: Record<string, never>;
|
|
3355
|
+
getApiDiscovery: Record<string, never>;
|
|
3356
|
+
getDailyReportSnapshot: Record<string, never>;
|
|
3357
|
+
getEventReplaySince: Record<string, never>;
|
|
3358
|
+
getGame: {
|
|
3359
|
+
/** The game's event slug, for example nfl-buf-nyj-2026-09-22. Matched case-insensitively. */
|
|
3360
|
+
event_slug: string;
|
|
3361
|
+
};
|
|
3362
|
+
getHealth: Record<string, never>;
|
|
3363
|
+
getInsiderRadarFlag: {
|
|
3364
|
+
/** Raw whale_alerts.id or rf_-prefixed radar flag id. */
|
|
3365
|
+
id: string;
|
|
3366
|
+
};
|
|
3367
|
+
getLargeTrade: {
|
|
3368
|
+
/** Raw whale_alerts.id or wt_-prefixed large trade id. */
|
|
3369
|
+
id: string;
|
|
3370
|
+
};
|
|
3371
|
+
getMarketCandles: {
|
|
3372
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or /api/v1/markets/explore, or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
3373
|
+
condition_id: string;
|
|
3374
|
+
};
|
|
3375
|
+
getMarketContextMarkdown: {
|
|
3376
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or /api/v1/markets/explore, or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
3377
|
+
condition_id: string;
|
|
3378
|
+
};
|
|
3379
|
+
getMarketHolders: {
|
|
3380
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
3381
|
+
condition_id: string;
|
|
3382
|
+
};
|
|
3383
|
+
getMarketIntel: {
|
|
3384
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
3385
|
+
condition_id: string;
|
|
3386
|
+
};
|
|
3387
|
+
getMarketSnapshot: {
|
|
3388
|
+
/** Market condition ID. Accepts the raw provider-backed condition_id returned by /api/v1/markets/search or /api/v1/markets/explore, or the mkt_-prefixed market.id emitted by V1 responses. */
|
|
3389
|
+
condition_id: string;
|
|
3390
|
+
};
|
|
3391
|
+
getMonthlyReportSnapshot: Record<string, never>;
|
|
3392
|
+
getPickOfTheDay: Record<string, never>;
|
|
3393
|
+
getPickOfTheDayArchive: Record<string, never>;
|
|
3394
|
+
getPickOfTheDayLedger: Record<string, never>;
|
|
3395
|
+
getPlatforms: Record<string, never>;
|
|
3396
|
+
getPositionTimeline: {
|
|
3397
|
+
/** Trader identity: 0x... wallet address, username, trd_-prefixed trader id, bare integer traders.id, or @username. Resolved with precedence @username -> wallet -> trd_ -> integer -> username (a leading @ forces a username lookup, for all-digit usernames); wallet matching is case-insensitive. */
|
|
3398
|
+
address: string;
|
|
3399
|
+
};
|
|
3400
|
+
getPositionTimelineById: {
|
|
3401
|
+
/** Trader identity: 0x... wallet address, username, trd_-prefixed trader id, bare integer traders.id, or @username. Resolved with precedence @username -> wallet -> trd_ -> integer -> username (a leading @ forces a username lookup, for all-digit usernames). Unknown identities return 404. */
|
|
3402
|
+
trader: string;
|
|
3403
|
+
};
|
|
3404
|
+
getReports: Record<string, never>;
|
|
3405
|
+
getStream: Record<string, never>;
|
|
3406
|
+
getSuspiciousTrade: {
|
|
3407
|
+
/** Raw whale_alerts.id or rf_-prefixed suspicious trade id. */
|
|
3408
|
+
id: string;
|
|
3409
|
+
};
|
|
3410
|
+
getTrader: {
|
|
3411
|
+
/** Ethereum wallet address (0x...), known trader username, or trd_-prefixed trader ID emitted by this API. */
|
|
3412
|
+
address: string;
|
|
3413
|
+
};
|
|
3414
|
+
getTraderCategoryRecords: {
|
|
3415
|
+
/** Wallet address (0x...), username, or trd_-prefixed trader id. */
|
|
3416
|
+
address: string;
|
|
3417
|
+
};
|
|
3418
|
+
getTraderContext: {
|
|
3419
|
+
/** Ethereum wallet address (0x...), known trader username, or trd_-prefixed trader ID emitted by this API. */
|
|
3420
|
+
address: string;
|
|
3421
|
+
};
|
|
3422
|
+
getTraderContextMarkdown: {
|
|
3423
|
+
/** Ethereum wallet address (0x...), known trader username, or trd_-prefixed trader ID emitted by this API. */
|
|
3424
|
+
address: string;
|
|
3425
|
+
};
|
|
3426
|
+
getTraderExportSnapshot: {
|
|
3427
|
+
/** Trader wallet address (0x...), known trader username-style lookup, or trd_-prefixed trader ID emitted by this API. Bare integer database IDs are not accepted. */
|
|
3428
|
+
address: string;
|
|
3429
|
+
};
|
|
3430
|
+
getTraderExportStatus: {
|
|
3431
|
+
/** Trader wallet address (0x...), known trader username-style lookup, or trd_-prefixed trader ID emitted by this API. */
|
|
3432
|
+
address: string;
|
|
3433
|
+
};
|
|
3434
|
+
getTraderPnl: {
|
|
3435
|
+
/** Wallet address (0x...), username, or trd_-prefixed trader id. */
|
|
3436
|
+
address: string;
|
|
3437
|
+
};
|
|
3438
|
+
getUsage: Record<string, never>;
|
|
3439
|
+
getWebhook: {
|
|
3440
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3441
|
+
id: number;
|
|
3442
|
+
};
|
|
3443
|
+
getWeeklyReportSnapshot: Record<string, never>;
|
|
3444
|
+
getWhaleTrade: {
|
|
3445
|
+
/** Raw whale_alerts.id or wt_-prefixed whale trade id. */
|
|
3446
|
+
id: string;
|
|
3447
|
+
};
|
|
3448
|
+
listGames: Record<string, never>;
|
|
3449
|
+
listInsiderRadar: Record<string, never>;
|
|
3450
|
+
listLargePositions: Record<string, never>;
|
|
3451
|
+
listLargeTradeCounterpartyExecutions: {
|
|
3452
|
+
/** Large trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3453
|
+
id: string;
|
|
3454
|
+
};
|
|
3455
|
+
listLargeTradeCounterpartyMakers: {
|
|
3456
|
+
/** Large trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3457
|
+
id: string;
|
|
3458
|
+
/** Counterparty execution ID from the parent response. */
|
|
3459
|
+
execution_id: string;
|
|
3460
|
+
};
|
|
3461
|
+
listLargeTradeHistory: Record<string, never>;
|
|
3462
|
+
listLargeTrades: Record<string, never>;
|
|
3463
|
+
listLeaderboard: Record<string, never>;
|
|
3464
|
+
listPositions: Record<string, never>;
|
|
3465
|
+
listPreGameSideObservations: Record<string, never>;
|
|
3466
|
+
listPreGameSides: Record<string, never>;
|
|
3467
|
+
listSharpMoneyFlows: Record<string, never>;
|
|
3468
|
+
listSmartMoneyFlows: Record<string, never>;
|
|
3469
|
+
listSportsEdgeObservations: Record<string, never>;
|
|
3470
|
+
listSportsEdgeSignals: Record<string, never>;
|
|
3471
|
+
listSuspiciousTrades: Record<string, never>;
|
|
3472
|
+
listTrendingWallets: Record<string, never>;
|
|
3473
|
+
listWebhookDeliveries: {
|
|
3474
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3475
|
+
id: number;
|
|
3476
|
+
};
|
|
3477
|
+
listWebhookEvents: Record<string, never>;
|
|
3478
|
+
listWebhooks: Record<string, never>;
|
|
3479
|
+
listWhaleTradeCounterpartyExecutions: {
|
|
3480
|
+
/** Whale trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3481
|
+
id: string;
|
|
3482
|
+
};
|
|
3483
|
+
listWhaleTradeCounterpartyMakers: {
|
|
3484
|
+
/** Whale trade ID. Accepts wt_-prefixed or raw whale_alerts.id. */
|
|
3485
|
+
id: string;
|
|
3486
|
+
/** Counterparty execution ID from the parent response. */
|
|
3487
|
+
execution_id: string;
|
|
3488
|
+
};
|
|
3489
|
+
listWhaleTradeHistory: Record<string, never>;
|
|
3490
|
+
listWhaleTrades: Record<string, never>;
|
|
3491
|
+
prepareWebhookSecret: {
|
|
3492
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3493
|
+
id: number;
|
|
3494
|
+
};
|
|
3495
|
+
redeliverWebhookDelivery: {
|
|
3496
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3497
|
+
id: number;
|
|
3498
|
+
/** Delivery id from GET /api/v1/webhooks/{id}/deliveries. It must belong to the webhook endpoint named by id. */
|
|
3499
|
+
delivery_id: number;
|
|
3500
|
+
};
|
|
3501
|
+
registerAgent: Record<string, never>;
|
|
3502
|
+
retireWebhookSecret: {
|
|
3503
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3504
|
+
id: number;
|
|
3505
|
+
};
|
|
3506
|
+
rotateWebhookSecret: {
|
|
3507
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3508
|
+
id: number;
|
|
3509
|
+
};
|
|
3510
|
+
searchContent: Record<string, never>;
|
|
3511
|
+
searchMarkets: Record<string, never>;
|
|
3512
|
+
submitTraderExport: {
|
|
3513
|
+
/** Trader wallet address (0x...), known trader username-style lookup, or trd_-prefixed trader ID emitted by this API. */
|
|
3514
|
+
address: string;
|
|
3515
|
+
};
|
|
3516
|
+
updateWebhook: {
|
|
3517
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3518
|
+
id: number;
|
|
3519
|
+
};
|
|
3520
|
+
verifyWebhook: {
|
|
3521
|
+
/** Webhook endpoint id owned by the authenticated API key user. */
|
|
3522
|
+
id: number;
|
|
3523
|
+
};
|
|
3524
|
+
}
|
|
3525
|
+
/** Each operation's JSON request body; `never` when it takes none. */
|
|
3526
|
+
export interface OperationBody {
|
|
3527
|
+
activateWebhookSecret: never;
|
|
3528
|
+
batchGetMarketIntel: {
|
|
3529
|
+
/** Market condition IDs to resolve in input order. */
|
|
3530
|
+
condition_ids: string[];
|
|
3531
|
+
/** Lookback window used for flow and trade-count context. */
|
|
3532
|
+
timeframe?: "1h" | "4h" | "24h" | "7d";
|
|
3533
|
+
};
|
|
3534
|
+
batchGetTraders: {
|
|
3535
|
+
/** Trader identities to resolve in input order. */
|
|
3536
|
+
traders: string[];
|
|
3537
|
+
/** Shared expand flags applied to every trader item. */
|
|
3538
|
+
expand?: ("strategy" | "categories" | "quant_metrics" | "trust")[];
|
|
3539
|
+
};
|
|
3540
|
+
createMcpJsonRpcResponse: {
|
|
3541
|
+
/** JSON-RPC protocol version; this server accepts 2.0. */
|
|
3542
|
+
jsonrpc: "2.0";
|
|
3543
|
+
/** Request identifier echoed exactly in one JSON-RPC response; supported notifications omit it and receive an empty HTTP 202. */
|
|
3544
|
+
id?: string | number | null;
|
|
3545
|
+
/** MCP method to invoke. */
|
|
3546
|
+
method: "initialize" | "notifications/initialized" | "notifications/cancelled" | "ping" | "tools/list" | "tools/call";
|
|
3547
|
+
/** Method-specific MCP parameters. */
|
|
3548
|
+
params?: Record<string, unknown>;
|
|
3549
|
+
};
|
|
3550
|
+
createWebhook: CreateWebhookRequest;
|
|
3551
|
+
deleteWebhook: never;
|
|
3552
|
+
exploreMarkets: never;
|
|
3553
|
+
getAccountIdentity: never;
|
|
3554
|
+
getApiDiscovery: never;
|
|
3555
|
+
getDailyReportSnapshot: never;
|
|
3556
|
+
getEventReplaySince: never;
|
|
3557
|
+
getGame: never;
|
|
3558
|
+
getHealth: never;
|
|
3559
|
+
getInsiderRadarFlag: never;
|
|
3560
|
+
getLargeTrade: never;
|
|
3561
|
+
getMarketCandles: never;
|
|
3562
|
+
getMarketContextMarkdown: never;
|
|
3563
|
+
getMarketHolders: never;
|
|
3564
|
+
getMarketIntel: never;
|
|
3565
|
+
getMarketSnapshot: never;
|
|
3566
|
+
getMonthlyReportSnapshot: never;
|
|
3567
|
+
getPickOfTheDay: never;
|
|
3568
|
+
getPickOfTheDayArchive: never;
|
|
3569
|
+
getPickOfTheDayLedger: never;
|
|
3570
|
+
getPlatforms: never;
|
|
3571
|
+
getPositionTimeline: never;
|
|
3572
|
+
getPositionTimelineById: never;
|
|
3573
|
+
getReports: never;
|
|
3574
|
+
getStream: never;
|
|
3575
|
+
getSuspiciousTrade: never;
|
|
3576
|
+
getTrader: never;
|
|
3577
|
+
getTraderCategoryRecords: never;
|
|
3578
|
+
getTraderContext: never;
|
|
3579
|
+
getTraderContextMarkdown: never;
|
|
3580
|
+
getTraderExportSnapshot: never;
|
|
3581
|
+
getTraderExportStatus: never;
|
|
3582
|
+
getTraderPnl: never;
|
|
3583
|
+
getUsage: never;
|
|
3584
|
+
getWebhook: never;
|
|
3585
|
+
getWeeklyReportSnapshot: never;
|
|
3586
|
+
getWhaleTrade: never;
|
|
3587
|
+
listGames: never;
|
|
3588
|
+
listInsiderRadar: never;
|
|
3589
|
+
listLargePositions: never;
|
|
3590
|
+
listLargeTradeCounterpartyExecutions: never;
|
|
3591
|
+
listLargeTradeCounterpartyMakers: never;
|
|
3592
|
+
listLargeTradeHistory: never;
|
|
3593
|
+
listLargeTrades: never;
|
|
3594
|
+
listLeaderboard: never;
|
|
3595
|
+
listPositions: never;
|
|
3596
|
+
listPreGameSideObservations: never;
|
|
3597
|
+
listPreGameSides: never;
|
|
3598
|
+
listSharpMoneyFlows: never;
|
|
3599
|
+
listSmartMoneyFlows: never;
|
|
3600
|
+
listSportsEdgeObservations: never;
|
|
3601
|
+
listSportsEdgeSignals: never;
|
|
3602
|
+
listSuspiciousTrades: never;
|
|
3603
|
+
listTrendingWallets: never;
|
|
3604
|
+
listWebhookDeliveries: never;
|
|
3605
|
+
listWebhookEvents: never;
|
|
3606
|
+
listWebhooks: never;
|
|
3607
|
+
listWhaleTradeCounterpartyExecutions: never;
|
|
3608
|
+
listWhaleTradeCounterpartyMakers: never;
|
|
3609
|
+
listWhaleTradeHistory: never;
|
|
3610
|
+
listWhaleTrades: never;
|
|
3611
|
+
prepareWebhookSecret: never;
|
|
3612
|
+
redeliverWebhookDelivery: never;
|
|
3613
|
+
registerAgent: never;
|
|
3614
|
+
retireWebhookSecret: never;
|
|
3615
|
+
rotateWebhookSecret: never;
|
|
3616
|
+
searchContent: never;
|
|
3617
|
+
searchMarkets: never;
|
|
3618
|
+
submitTraderExport: never;
|
|
3619
|
+
updateWebhook: UpdateWebhookRequest;
|
|
3620
|
+
verifyWebhook: VerifyWebhookRequest;
|
|
3621
|
+
}
|
|
3622
|
+
/**
|
|
3623
|
+
* The whole 200 body of each operation: the envelope with its own `object`
|
|
3624
|
+
* literal, `meta` type and top-level fields, `data` as `OperationData[id]`;
|
|
3625
|
+
* `string` for a text body. What `ApiClient.call(id)` resolves to.
|
|
3626
|
+
*/
|
|
3627
|
+
export interface OperationResponse {
|
|
3628
|
+
activateWebhookSecret: {
|
|
3629
|
+
object: "webhook";
|
|
3630
|
+
data: OperationData["activateWebhookSecret"];
|
|
3631
|
+
meta: ResponseMeta;
|
|
3632
|
+
};
|
|
3633
|
+
batchGetMarketIntel: {
|
|
3634
|
+
object: "market_intel_batch";
|
|
3635
|
+
data: OperationData["batchGetMarketIntel"];
|
|
3636
|
+
meta: BatchResponseMeta;
|
|
3637
|
+
};
|
|
3638
|
+
batchGetTraders: {
|
|
3639
|
+
object: "trader_batch";
|
|
3640
|
+
data: OperationData["batchGetTraders"];
|
|
3641
|
+
meta: BatchResponseMeta;
|
|
3642
|
+
};
|
|
3643
|
+
createMcpJsonRpcResponse: {
|
|
3644
|
+
jsonrpc: "2.0";
|
|
3645
|
+
id: string | number | null;
|
|
3646
|
+
result?: Record<string, unknown>;
|
|
3647
|
+
error?: {
|
|
3648
|
+
code: number;
|
|
3649
|
+
message: string;
|
|
3650
|
+
};
|
|
3651
|
+
};
|
|
3652
|
+
createWebhook: {
|
|
3653
|
+
object: "webhook";
|
|
3654
|
+
data: OperationData["createWebhook"];
|
|
3655
|
+
meta: ResponseMeta;
|
|
3656
|
+
};
|
|
3657
|
+
deleteWebhook: {
|
|
3658
|
+
object: "webhook";
|
|
3659
|
+
data: OperationData["deleteWebhook"];
|
|
3660
|
+
meta: ResponseMeta;
|
|
3661
|
+
};
|
|
3662
|
+
exploreMarkets: {
|
|
3663
|
+
object: "list";
|
|
3664
|
+
data: OperationData["exploreMarkets"];
|
|
3665
|
+
has_more: boolean;
|
|
3666
|
+
next_cursor?: string;
|
|
3667
|
+
/** Total matching visible entries after grouping. Present on the first page and omitted on cursor pages. */
|
|
3668
|
+
total?: number;
|
|
3669
|
+
facets: ExploreFacets;
|
|
3670
|
+
meta: ResponseMeta;
|
|
3671
|
+
/** When this response body was computed. Present whenever the body came from, or was just written to, the 60s explore cache. Pair it with fresh_for_seconds to derive how much longer the body may be reused: fresh_for_seconds - age(computed_at). Excluded from the ETag validator, so a body recomputed with identical data keeps its validator. */
|
|
3672
|
+
computed_at?: string;
|
|
3673
|
+
/** How long the body computed at computed_at is good for, in seconds. Deliberately not pre-subtracted: a cached body cannot carry a number that changes while it sits in the cache. Excluded from the ETag validator. */
|
|
3674
|
+
fresh_for_seconds?: number;
|
|
3675
|
+
};
|
|
3676
|
+
getAccountIdentity: AccountIdentity;
|
|
3677
|
+
getApiDiscovery: {
|
|
3678
|
+
object: "api_discovery";
|
|
3679
|
+
data: OperationData["getApiDiscovery"];
|
|
3680
|
+
meta: ResponseMeta;
|
|
3681
|
+
};
|
|
3682
|
+
getDailyReportSnapshot: {
|
|
3683
|
+
object: "report_snapshot";
|
|
3684
|
+
data: OperationData["getDailyReportSnapshot"];
|
|
3685
|
+
meta: ResponseMeta;
|
|
3686
|
+
};
|
|
3687
|
+
getEventReplaySince: {
|
|
3688
|
+
object: "event_replay";
|
|
3689
|
+
data: OperationData["getEventReplaySince"];
|
|
3690
|
+
has_more: boolean;
|
|
3691
|
+
next_cursor: string;
|
|
3692
|
+
meta: EventReplayMeta;
|
|
3693
|
+
};
|
|
3694
|
+
getGame: {
|
|
3695
|
+
object: "game";
|
|
3696
|
+
data: OperationData["getGame"];
|
|
3697
|
+
/** When this read assembled the catalog. Per-source vintage is on freshness. */
|
|
3698
|
+
as_of: string;
|
|
3699
|
+
meta: ResponseMeta;
|
|
3700
|
+
};
|
|
3701
|
+
getHealth: {
|
|
3702
|
+
object: "health";
|
|
3703
|
+
data: OperationData["getHealth"];
|
|
3704
|
+
meta: ResponseMeta;
|
|
3705
|
+
};
|
|
3706
|
+
getInsiderRadarFlag: {
|
|
3707
|
+
object: "radar_flag";
|
|
3708
|
+
data: OperationData["getInsiderRadarFlag"];
|
|
3709
|
+
meta: ResponseMeta;
|
|
3710
|
+
};
|
|
3711
|
+
getLargeTrade: {
|
|
3712
|
+
object: "large_trade";
|
|
3713
|
+
data: OperationData["getLargeTrade"];
|
|
3714
|
+
meta: ResponseMeta;
|
|
3715
|
+
};
|
|
3716
|
+
getMarketCandles: {
|
|
3717
|
+
object: "market_candles";
|
|
3718
|
+
data: OperationData["getMarketCandles"];
|
|
3719
|
+
meta: ResponseMeta;
|
|
3720
|
+
};
|
|
3721
|
+
getMarketContextMarkdown: string;
|
|
3722
|
+
getMarketHolders: {
|
|
3723
|
+
object: "list";
|
|
3724
|
+
data: OperationData["getMarketHolders"];
|
|
3725
|
+
has_more: boolean;
|
|
3726
|
+
/** Absent on the last page. */
|
|
3727
|
+
next_cursor?: string;
|
|
3728
|
+
/** Holders matching the request's `outcome` and `min_grade` filters across every page. */
|
|
3729
|
+
total?: number;
|
|
3730
|
+
market: MarketHoldersMarket;
|
|
3731
|
+
scan: MarketHoldersScan;
|
|
3732
|
+
totals: MarketHoldersTotals;
|
|
3733
|
+
meta: ResponseMeta;
|
|
3734
|
+
};
|
|
3735
|
+
getMarketIntel: {
|
|
3736
|
+
object: "market_intel";
|
|
3737
|
+
data: OperationData["getMarketIntel"];
|
|
3738
|
+
meta: ResponseMeta;
|
|
3739
|
+
};
|
|
3740
|
+
getMarketSnapshot: {
|
|
3741
|
+
object: "market_snapshot";
|
|
3742
|
+
data: OperationData["getMarketSnapshot"];
|
|
3743
|
+
meta: ResponseMeta;
|
|
3744
|
+
};
|
|
3745
|
+
getMonthlyReportSnapshot: {
|
|
3746
|
+
object: "report_snapshot";
|
|
3747
|
+
data: OperationData["getMonthlyReportSnapshot"];
|
|
3748
|
+
meta: ResponseMeta;
|
|
3749
|
+
};
|
|
3750
|
+
getPickOfTheDay: {
|
|
3751
|
+
object: "pick_of_the_day";
|
|
3752
|
+
data: OperationData["getPickOfTheDay"];
|
|
3753
|
+
meta: ResponseMeta;
|
|
3754
|
+
};
|
|
3755
|
+
getPickOfTheDayArchive: {
|
|
3756
|
+
object: "pick_of_the_day_archive";
|
|
3757
|
+
data: OperationData["getPickOfTheDayArchive"];
|
|
3758
|
+
meta: ResponseMeta;
|
|
3759
|
+
};
|
|
3760
|
+
getPickOfTheDayLedger: {
|
|
3761
|
+
object: "pick_of_the_day_ledger";
|
|
3762
|
+
data: OperationData["getPickOfTheDayLedger"];
|
|
3763
|
+
meta: ResponseMeta;
|
|
3764
|
+
};
|
|
3765
|
+
getPlatforms: {
|
|
3766
|
+
object: "platforms";
|
|
3767
|
+
data: OperationData["getPlatforms"];
|
|
3768
|
+
meta: ResponseMeta;
|
|
3769
|
+
};
|
|
3770
|
+
getPositionTimeline: {
|
|
3771
|
+
object: "list";
|
|
3772
|
+
data: OperationData["getPositionTimeline"];
|
|
3773
|
+
has_more: boolean;
|
|
3774
|
+
next_cursor?: string;
|
|
3775
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3776
|
+
total?: number;
|
|
3777
|
+
meta: ResponseMeta;
|
|
3778
|
+
};
|
|
3779
|
+
getPositionTimelineById: {
|
|
3780
|
+
object: "list";
|
|
3781
|
+
data: OperationData["getPositionTimelineById"];
|
|
3782
|
+
has_more: boolean;
|
|
3783
|
+
next_cursor?: string;
|
|
3784
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3785
|
+
total?: number;
|
|
3786
|
+
meta: ResponseMeta;
|
|
3787
|
+
};
|
|
3788
|
+
getReports: {
|
|
3789
|
+
object: "report_snapshot";
|
|
3790
|
+
data: OperationData["getReports"];
|
|
3791
|
+
meta: ResponseMeta;
|
|
3792
|
+
};
|
|
3793
|
+
getStream: string;
|
|
3794
|
+
getSuspiciousTrade: {
|
|
3795
|
+
object: "suspicious_trade";
|
|
3796
|
+
data: OperationData["getSuspiciousTrade"];
|
|
3797
|
+
meta: ResponseMeta;
|
|
3798
|
+
};
|
|
3799
|
+
getTrader: {
|
|
3800
|
+
object: "trader";
|
|
3801
|
+
data: OperationData["getTrader"];
|
|
3802
|
+
meta: ResponseMeta;
|
|
3803
|
+
};
|
|
3804
|
+
getTraderCategoryRecords: {
|
|
3805
|
+
object: "trader_category_records";
|
|
3806
|
+
data: OperationData["getTraderCategoryRecords"];
|
|
3807
|
+
meta: ResponseMeta;
|
|
3808
|
+
};
|
|
3809
|
+
getTraderContext: {
|
|
3810
|
+
object: "trader_context";
|
|
3811
|
+
data: OperationData["getTraderContext"];
|
|
3812
|
+
meta: ResponseMeta;
|
|
3813
|
+
};
|
|
3814
|
+
getTraderContextMarkdown: string;
|
|
3815
|
+
getTraderExportSnapshot: {
|
|
3816
|
+
object: "trader_export_snapshot";
|
|
3817
|
+
data: OperationData["getTraderExportSnapshot"];
|
|
3818
|
+
meta: ResponseMeta;
|
|
3819
|
+
};
|
|
3820
|
+
getTraderExportStatus: TraderExportJob;
|
|
3821
|
+
getTraderPnl: {
|
|
3822
|
+
object: "trader_pnl";
|
|
3823
|
+
data: OperationData["getTraderPnl"];
|
|
3824
|
+
meta: ResponseMeta;
|
|
3825
|
+
};
|
|
3826
|
+
getUsage: Usage;
|
|
3827
|
+
getWebhook: {
|
|
3828
|
+
object: "webhook";
|
|
3829
|
+
data: OperationData["getWebhook"];
|
|
3830
|
+
meta: ResponseMeta;
|
|
3831
|
+
};
|
|
3832
|
+
getWeeklyReportSnapshot: {
|
|
3833
|
+
object: "report_snapshot";
|
|
3834
|
+
data: OperationData["getWeeklyReportSnapshot"];
|
|
3835
|
+
meta: ResponseMeta;
|
|
3836
|
+
};
|
|
3837
|
+
getWhaleTrade: {
|
|
3838
|
+
object: "whale_trade";
|
|
3839
|
+
data: OperationData["getWhaleTrade"];
|
|
3840
|
+
meta: ResponseMeta;
|
|
3841
|
+
};
|
|
3842
|
+
listGames: {
|
|
3843
|
+
object: "list";
|
|
3844
|
+
data: OperationData["listGames"];
|
|
3845
|
+
has_more: boolean;
|
|
3846
|
+
/** Pass as cursor for the next page. Present only when has_more is true. */
|
|
3847
|
+
next_cursor?: string;
|
|
3848
|
+
/** When this read assembled the catalog. Per-source vintage is on each game's freshness. */
|
|
3849
|
+
as_of: string;
|
|
3850
|
+
coverage: GamesCoverage;
|
|
3851
|
+
meta: ResponseMeta;
|
|
3852
|
+
};
|
|
3853
|
+
listInsiderRadar: {
|
|
3854
|
+
object: "list";
|
|
3855
|
+
data: OperationData["listInsiderRadar"];
|
|
3856
|
+
has_more: boolean;
|
|
3857
|
+
next_cursor?: string;
|
|
3858
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3859
|
+
total?: number;
|
|
3860
|
+
meta: ResponseMeta;
|
|
3861
|
+
};
|
|
3862
|
+
listLargePositions: {
|
|
3863
|
+
object: "list";
|
|
3864
|
+
data: OperationData["listLargePositions"];
|
|
3865
|
+
has_more: boolean;
|
|
3866
|
+
/** Opaque cursor for the next page; absent on the last page. */
|
|
3867
|
+
next_cursor?: string;
|
|
3868
|
+
/** Total ranked rows when the read model exposes a count; may be absent. */
|
|
3869
|
+
total?: number;
|
|
3870
|
+
meta: ResponseMeta;
|
|
3871
|
+
};
|
|
3872
|
+
listLargeTradeCounterpartyExecutions: {
|
|
3873
|
+
object: "counterparty_analysis";
|
|
3874
|
+
data: OperationData["listLargeTradeCounterpartyExecutions"];
|
|
3875
|
+
meta: ResponseMeta;
|
|
3876
|
+
};
|
|
3877
|
+
listLargeTradeCounterpartyMakers: {
|
|
3878
|
+
object: "counterparty_maker_page";
|
|
3879
|
+
data: OperationData["listLargeTradeCounterpartyMakers"];
|
|
3880
|
+
meta: ResponseMeta;
|
|
3881
|
+
};
|
|
3882
|
+
listLargeTradeHistory: {
|
|
3883
|
+
object: "list";
|
|
3884
|
+
data: OperationData["listLargeTradeHistory"];
|
|
3885
|
+
has_more: boolean;
|
|
3886
|
+
next_cursor?: string;
|
|
3887
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3888
|
+
total?: number;
|
|
3889
|
+
meta: LargeTradeHistoryMeta;
|
|
3890
|
+
};
|
|
3891
|
+
listLargeTrades: {
|
|
3892
|
+
object: "list";
|
|
3893
|
+
data: OperationData["listLargeTrades"];
|
|
3894
|
+
has_more: boolean;
|
|
3895
|
+
next_cursor?: string;
|
|
3896
|
+
/** Total matching rows when the read model exposes a count; absent (or null) when it does not. */
|
|
3897
|
+
total?: number;
|
|
3898
|
+
meta: ResponseMeta;
|
|
3899
|
+
};
|
|
3900
|
+
listLeaderboard: {
|
|
3901
|
+
object: "list";
|
|
3902
|
+
data: OperationData["listLeaderboard"];
|
|
3903
|
+
has_more: boolean;
|
|
3904
|
+
next_cursor?: string;
|
|
3905
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3906
|
+
total?: number;
|
|
3907
|
+
meta: ResponseMeta;
|
|
3908
|
+
};
|
|
3909
|
+
listPositions: {
|
|
3910
|
+
object: "list";
|
|
3911
|
+
data: OperationData["listPositions"];
|
|
3912
|
+
has_more: boolean;
|
|
3913
|
+
next_cursor?: string;
|
|
3914
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3915
|
+
total?: number;
|
|
3916
|
+
meta: ResponseMeta;
|
|
3917
|
+
};
|
|
3918
|
+
listPreGameSideObservations: {
|
|
3919
|
+
object: "list";
|
|
3920
|
+
data: OperationData["listPreGameSideObservations"];
|
|
3921
|
+
has_more: boolean;
|
|
3922
|
+
next_cursor?: string;
|
|
3923
|
+
/** Completion time of the shared observation snapshot pinned by the cursor. */
|
|
3924
|
+
snapshot_as_of: string;
|
|
3925
|
+
/** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Intentional bounded capacity_limited rows remain fully accounted in the funnel and do not by themselves set this field. */
|
|
3926
|
+
degraded: boolean;
|
|
3927
|
+
funnel: PreGameSideFunnelReport;
|
|
3928
|
+
meta: ResponseMeta;
|
|
3929
|
+
};
|
|
3930
|
+
listPreGameSides: {
|
|
3931
|
+
object: "list";
|
|
3932
|
+
data: OperationData["listPreGameSides"];
|
|
3933
|
+
has_more: boolean;
|
|
3934
|
+
next_cursor?: string;
|
|
3935
|
+
total?: number;
|
|
3936
|
+
meta: ResponseMeta;
|
|
3937
|
+
};
|
|
3938
|
+
listSharpMoneyFlows: {
|
|
3939
|
+
object: "list";
|
|
3940
|
+
data: OperationData["listSharpMoneyFlows"];
|
|
3941
|
+
has_more: boolean;
|
|
3942
|
+
next_cursor?: string;
|
|
3943
|
+
total?: number;
|
|
3944
|
+
meta: ResponseMeta;
|
|
3945
|
+
};
|
|
3946
|
+
listSmartMoneyFlows: {
|
|
3947
|
+
object: "list";
|
|
3948
|
+
data: OperationData["listSmartMoneyFlows"];
|
|
3949
|
+
has_more: boolean;
|
|
3950
|
+
next_cursor?: string;
|
|
3951
|
+
total?: number;
|
|
3952
|
+
meta: ResponseMeta;
|
|
3953
|
+
};
|
|
3954
|
+
listSportsEdgeObservations: {
|
|
3955
|
+
object: "list";
|
|
3956
|
+
data: OperationData["listSportsEdgeObservations"];
|
|
3957
|
+
has_more: boolean;
|
|
3958
|
+
next_cursor?: string;
|
|
3959
|
+
/** Completion time of the shared observation snapshot pinned by the cursor. */
|
|
3960
|
+
snapshot_as_of: string;
|
|
3961
|
+
/** True when an operational failure or unknown provider-board, holder, directional, reconciliation, or internal completeness state made this snapshot partial. This is snapshot-wide and can retain degradation that the funnel's one-terminal-per-input accounting cannot represent. Intentional bounded capacity_limited rows remain fully accounted in the funnel and do not by themselves set this field. */
|
|
3962
|
+
degraded: boolean;
|
|
3963
|
+
funnel: PreGameSideFunnelReport;
|
|
3964
|
+
meta: ResponseMeta;
|
|
3965
|
+
};
|
|
3966
|
+
listSportsEdgeSignals: {
|
|
3967
|
+
object: "list";
|
|
3968
|
+
data: OperationData["listSportsEdgeSignals"];
|
|
3969
|
+
has_more: boolean;
|
|
3970
|
+
next_cursor?: string;
|
|
3971
|
+
total?: number;
|
|
3972
|
+
meta: ResponseMeta;
|
|
3973
|
+
};
|
|
3974
|
+
listSuspiciousTrades: {
|
|
3975
|
+
object: "list";
|
|
3976
|
+
data: OperationData["listSuspiciousTrades"];
|
|
3977
|
+
has_more: boolean;
|
|
3978
|
+
next_cursor?: string;
|
|
3979
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
3980
|
+
total?: number;
|
|
3981
|
+
meta: ResponseMeta;
|
|
3982
|
+
};
|
|
3983
|
+
listTrendingWallets: {
|
|
3984
|
+
object: "list";
|
|
3985
|
+
data: OperationData["listTrendingWallets"];
|
|
3986
|
+
has_more: boolean;
|
|
3987
|
+
/** Opaque cursor for the next page; absent on the last page. */
|
|
3988
|
+
next_cursor?: string;
|
|
3989
|
+
/** Total ranked rows when the read model exposes a count; may be absent. */
|
|
3990
|
+
total?: number;
|
|
3991
|
+
meta: ResponseMeta;
|
|
3992
|
+
};
|
|
3993
|
+
listWebhookDeliveries: {
|
|
3994
|
+
object: "list";
|
|
3995
|
+
data: OperationData["listWebhookDeliveries"];
|
|
3996
|
+
has_more: boolean;
|
|
3997
|
+
next_cursor?: string;
|
|
3998
|
+
total?: number;
|
|
3999
|
+
meta: ResponseMeta;
|
|
4000
|
+
};
|
|
4001
|
+
listWebhookEvents: {
|
|
4002
|
+
object: "list";
|
|
4003
|
+
data: OperationData["listWebhookEvents"];
|
|
4004
|
+
has_more: boolean;
|
|
4005
|
+
next_cursor?: string;
|
|
4006
|
+
total?: number;
|
|
4007
|
+
meta: ResponseMeta;
|
|
4008
|
+
};
|
|
4009
|
+
listWebhooks: {
|
|
4010
|
+
object: "list";
|
|
4011
|
+
data: OperationData["listWebhooks"];
|
|
4012
|
+
has_more: boolean;
|
|
4013
|
+
next_cursor?: string;
|
|
4014
|
+
total?: number;
|
|
4015
|
+
meta: ResponseMeta;
|
|
4016
|
+
};
|
|
4017
|
+
listWhaleTradeCounterpartyExecutions: {
|
|
4018
|
+
object: "counterparty_analysis";
|
|
4019
|
+
data: OperationData["listWhaleTradeCounterpartyExecutions"];
|
|
4020
|
+
meta: ResponseMeta;
|
|
4021
|
+
};
|
|
4022
|
+
listWhaleTradeCounterpartyMakers: {
|
|
4023
|
+
object: "counterparty_maker_page";
|
|
4024
|
+
data: OperationData["listWhaleTradeCounterpartyMakers"];
|
|
4025
|
+
meta: ResponseMeta;
|
|
4026
|
+
};
|
|
4027
|
+
listWhaleTradeHistory: {
|
|
4028
|
+
object: "list";
|
|
4029
|
+
data: OperationData["listWhaleTradeHistory"];
|
|
4030
|
+
has_more: boolean;
|
|
4031
|
+
next_cursor?: string;
|
|
4032
|
+
/** Total matching rows when the read model exposes a count; absent (or null) when it does not. */
|
|
4033
|
+
total?: number;
|
|
4034
|
+
meta: LargeTradeHistoryMeta;
|
|
4035
|
+
};
|
|
4036
|
+
listWhaleTrades: {
|
|
4037
|
+
object: "list";
|
|
4038
|
+
data: OperationData["listWhaleTrades"];
|
|
4039
|
+
has_more: boolean;
|
|
4040
|
+
next_cursor?: string;
|
|
4041
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
4042
|
+
total?: number;
|
|
4043
|
+
meta: ResponseMeta;
|
|
4044
|
+
};
|
|
4045
|
+
prepareWebhookSecret: {
|
|
4046
|
+
object: "webhook";
|
|
4047
|
+
data: OperationData["prepareWebhookSecret"];
|
|
4048
|
+
meta: ResponseMeta;
|
|
4049
|
+
};
|
|
4050
|
+
redeliverWebhookDelivery: {
|
|
4051
|
+
object: "webhook_delivery";
|
|
4052
|
+
data: OperationData["redeliverWebhookDelivery"];
|
|
4053
|
+
meta: ResponseMeta;
|
|
4054
|
+
};
|
|
4055
|
+
registerAgent: {
|
|
4056
|
+
object: "agent_registration";
|
|
4057
|
+
data: OperationData["registerAgent"];
|
|
4058
|
+
meta: ResponseMeta;
|
|
4059
|
+
};
|
|
4060
|
+
retireWebhookSecret: {
|
|
4061
|
+
object: "webhook";
|
|
4062
|
+
data: OperationData["retireWebhookSecret"];
|
|
4063
|
+
meta: ResponseMeta;
|
|
4064
|
+
};
|
|
4065
|
+
rotateWebhookSecret: {
|
|
4066
|
+
object: "webhook";
|
|
4067
|
+
data: OperationData["rotateWebhookSecret"];
|
|
4068
|
+
meta: ResponseMeta;
|
|
4069
|
+
};
|
|
4070
|
+
searchContent: {
|
|
4071
|
+
object: "list";
|
|
4072
|
+
data: OperationData["searchContent"];
|
|
4073
|
+
has_more: false;
|
|
4074
|
+
/** Omitted because content search is a bounded one-page result. */
|
|
4075
|
+
next_cursor?: string;
|
|
4076
|
+
/** Absent because content search is a bounded relevance result and does not run a count query. */
|
|
4077
|
+
total?: number;
|
|
4078
|
+
meta: ResponseMeta;
|
|
4079
|
+
};
|
|
4080
|
+
searchMarkets: {
|
|
4081
|
+
object: "list";
|
|
4082
|
+
data: OperationData["searchMarkets"];
|
|
4083
|
+
has_more: boolean;
|
|
4084
|
+
next_cursor?: string;
|
|
4085
|
+
/** Total matching rows when the read model exposes a count; the key is absent when it does not. */
|
|
4086
|
+
total?: number;
|
|
4087
|
+
meta: ResponseMeta;
|
|
4088
|
+
};
|
|
4089
|
+
submitTraderExport: TraderExportJob;
|
|
4090
|
+
updateWebhook: {
|
|
4091
|
+
object: "webhook";
|
|
4092
|
+
data: OperationData["updateWebhook"];
|
|
4093
|
+
meta: ResponseMeta;
|
|
4094
|
+
};
|
|
4095
|
+
verifyWebhook: {
|
|
4096
|
+
object: "webhook";
|
|
4097
|
+
data: OperationData["verifyWebhook"];
|
|
4098
|
+
meta: ResponseMeta;
|
|
4099
|
+
};
|
|
4100
|
+
}
|
|
2589
4101
|
//# sourceMappingURL=schema.d.ts.map
|