Setup is the same as the terminal guide: one
Authorization header, { data, meta } envelopes, chain = evm:<id> or solana. The sd() helper below is the one defined there.Find wallets worth tracking
The discovery entry point is a token, not a wallet: every trader you want to follow is printing on some market. Two rankings, same shape:GET /v1/token/top-traderswithtimeframe=allis the lifetime leaderboard of a token: realized PnL, win rate over closed positions, current bag and its unrealized PnL,isDev/isSniper/isProTraderbadges on every row.- The same endpoint with
timeframe=1h→30d, orGET /v1/pool/top-tradersfor a single market, ranks by net flow over the window: who is printing right now.
discover.ts
/v1/token/trades and the trades stream carries maker with the same badges, so “track this wallet” belongs on every trade row of your terminal.
Who is behind the address
Two calls turn an address into a person, or a red flag:GET /v1/wallet/profileresolves the identity: display name, ENS / Basename / .sol, avatar, bio, social accounts with follower counts, the pro-trader flag, andlinkedWallets, other addresses of the same person from our identity graph of 7.6M+ labeled wallets. A KOL tracker is this one endpoint.GET /v1/wallet/fundinganswers where the wallet’s first funds came from: funder address, timestamp, amount, andfunderTagwhen the funder is a known entity (exchange, bridge). A fresh wallet funded by another tracked wallet minutes before a launch is a signal; the insider and sybil heuristics start here.
The dashboard
Four calls render the whole trader page, and they are independent: fire them together and render each pane as its data lands, so one slow pane never blanks the page.dashboard.ts
503 on one pane carries Retry-After: the snapshot behind it is being recomputed, so retry that pane alone after the delay while the rest of the page is already on screen. 5xx responses are never billed.
- Headline tiles:
positions.meta.summarycarries the wallet-level totals (totalValueUsd,realizedPnlUsd,unrealizedPnlUsd,totalPnlUsd,positions), computed over every position whatever the page. WithincludeNativeandincludeStablesthe total is the real account value, native coin and stablecoins read on-chain at request time. - Win rate and cadence:
pnl.data.summaryhasrealizedPnlUsd,winRate,trades,wins,losses;pnl.data.historyis the realized PnL series for the bar chart, daily buckets on30dandall, hourly on1dand7d. Omitchainto combine every EVM chain in one figure. - Equity curve:
equity.data.pointsis the{ at, valueUsd }series behind the portfolio chart,currentValueUsdthe latest mark. - Open positions: every row has the current bag (
amount,amountUsd),entryPriceUsdvscurrentPriceUsd, realized + unrealized PnL, andholdingSince, which resets when the wallet fully exits and re-enters: the honest “holding for 3d” display. - Closed positions: the realized track record, sortable by PnL, with
realizedPnlPercent(realized over total bought) per token. Across positions and closed-positions the realized PnL of a token is counted exactly once, so the two tables never double-count.
The activity feed
GET /v1/wallet/swaps is built for the feed: one row per transaction, whatever the route did. sent is what the swap took from the wallet and received what it delivered, read from end to end: a USELESS to USDC sale routed through SOL reads as USELESS sent, USDC received, and the assets the route only passes through do not appear. Every asset carries its symbol and decimals, route lists every leg with its pool and venue, and on Solana each swap carries router (Jupiter, OKX DEX, DFlow, Titan, null for a direct swap), so a row renders as “swapped 14.55 USELESS for 3.42 USDC via DFlow” with no extra lookup.
There is no wallet-scoped stream channel, and the pagination is designed so you do not need one: cursors are exact keyset, they never skip or repeat a transaction. The lossless live pattern is a short poll that walks until it meets a row it has seen:
activity-poll.ts
GET /v1/wallet/trades: multihop-deduplicated so volumes are never doubled, routing hops excluded by default, isWash flagged on Solana. /v1/wallet/transfers adds deposits and withdrawals with counterparties, which is how a feed distinguishes “sold” from “moved to another wallet”.
Track a fleet
A tracker follows N wallets, and N single calls do not scale. Every wallet endpoint has aPOST batch twin taking up to 20 {chain, wallet} items, chains mixed freely (omit chain on a hex address to combine all its EVM chains), per-item error slots so one wallet never fails the others, billed per wallet: positions, PnL, closed positions, profile, trades, swaps, funding.
The fleet overview (one leaderboard row per tracked wallet) is two batch calls. A positions slot is { data, summary, hasMore }, exactly the body of the single GET; a PnL slot is { data }, and period applies to the whole call:
fleet.ts
The copy-trade check
The question a copy-trader asks is not “what does this wallet hold”, it is “is this wallet still in the token I copied”.tokens= scopes both position endpoints to specific tokens, one call, no paging:
/v1/wallet/closed-positions?tokens=MINT for the exit and its realized PnL. Between the two, the answer is always exactly one call away.
What a tracker costs
A 15s activity poll is 4 credits per minute per watched wallet; widen the interval for the fleet, keep it tight for the wallet on screen. Only
2xx responses are billed. Plans and the full grid are on Authentication & Limits.
Ship it
The heavy machinery came with the endpoints: PnL folds over every trade of the wallet, multihop dedup so volumes are never doubled, route netting for readable feeds, an identity graph of 7.6M+ wallets, funding lineage, exact keyset pagination. Your tracker is the UI on top.Build a Trading Terminal
The token side of the product: discovery, chart, tape, panels.
Get a key
Create an account, add a card to unlock 100,000 free credits, and create your key in the portal.