Documentation Index
Fetch the complete documentation index at: https://polynode.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Query parameters
Time window the scores were computed against. One of:
7d, 14d, 30d, 60d, 90d, 180d. Scores are precomputed for all six periods so any choice is sub-second.Field to sort by. One of:
backtest_copy_pnl_usdc, actual_pnl_usdc, slippage_amount_usdc, slippage_cost_rate_pct, trade_count.asc or desc. Wallets with null slippage_cost_rate_pct (when abs(actual_pnl) < 1) always sort last regardless of direction.Max results to return. 1 to 1000.
Skip the first N results. Useful for paginating beyond
limit.Filter out wallets with fewer than N fills in the window. Useful to drop sample-too-small noise.
When
true, drops wallets where slippage_cost_rate_pct > 15. The leader-selection power filter.Response shape
| Field | Type | Description |
|---|---|---|
period | string | Echo of the requested period |
sort_by | string | Echo of the sort field |
order | string | Echo of the sort direction |
filters | object | {min_trade_count, exclude_toxic} echo |
total_in_pool | int | Total wallets in your pool |
scored | int | Wallets with a score for this period |
filtered_in | int | Wallets that passed the min_trade_count + exclude_toxic filters |
pending | int | Wallets in your pool with no score yet (newly added or queued for next refresh) |
errored | int | Wallets whose last refresh attempt failed (typically heavy whales hitting timeout on long windows) |
offset | int | Echo |
limit | int | Echo |
last_refresh | int (unix) | null | When the last full refresh cycle completed |
results | array | Top N matching rows after filters and sort |
errored_sample | array | Up to 10 errored wallets with their last-error message — only present when errored > 0 |
pending_sample | array | Up to 10 pending wallet addresses — only present when pending > 0 |
Per-result row
| Field | Type | Description |
|---|---|---|
local_rank | int | 1-indexed rank within your pool (after offset) |
wallet | string | Lowercased address |
actual_pnl_usdc | number | Cashflow PnL over the period |
backtest_copy_pnl_usdc | number | Same walk with 2% slippage |
slippage_amount_usdc | number | Dollar friction the copier eats |
slippage_cost_rate_pct | number | null | Friction as % of actual PnL (null when |actual| < $1) |
toxic_for_copying | bool | true when rate > 15% |
trade_count | int | Number of fills in the window |
partial | bool | true if the underlying walk hit the per-wallet 180s budget |
computed_at | int (unix) | When this specific score was last refreshed — surface this in your UI as freshness signal |
Example: top 3 by actual_pnl_usdc desc
200 OK):
Example: leader screening — best non-toxic, min volume
200 OK):
min_trade_count: 1000) and aren’t already flagged toxic.
Example: pagination (offset)
local_rank: 11, 12, 13 — i.e. ranks within your pool start at offset + 1. The default sort is backtest_copy_pnl_usdc desc.
Errors
400 Invalid period:
400 Invalid sort_by:
400 Invalid order:
/v2/copy-pnl/* family.
Notes
- Sub-second. All scores are precomputed and served from cache. Even a 1000-wallet pool with all six periods scored returns in under 100ms.
pendinganderroredaren’t included inresults. Usepending_sampleanderrored_sampleto identify which specific wallets need attention. Theerrored_sampleincludes the upstream error message — typicallytimeout_180sfor the heaviest whales on long windows.computed_atper row. Use this to render “as of X minutes ago” in your UI. Newly-added wallets (via on-add freshening) typically have acomputed_atwithin ~30s of the add. Periodic refresh updates it once per chunk slot.last_refreshat top level. When the most recent full refresh cycle completed. Individual wallets may have been refreshed earlier or later within the cycle — use the per-rowcomputed_atfield for exact freshness.- Sort ties + nulls. When two wallets share the exact sort_by value, secondary order is undefined. Wallets with
nullslippage_cost_rate_pctalways sort last when sorting on that field.

