Skip to main content
Base: https://api.polytape.io/api/agent/v1 {trader} accepts a 0x wallet, a polymarket.com profile URL, or a display name.
Depth is plan-gated. Basic Intelligence reaches a trader’s 5 most-recent markets; Pro and Max reach the full record. Basic is additionally capped at 3 distinct wallets per UTC day. See Plans & limits.

GET /traders/{trader}

The career card, blending the on-chain archive with Polymarket’s own profile. Cache-Control: no-store.
polymarket.pnl is THE P/L — Polymarket’s model, realized + unrealized, full account history including pre-V2. If the upstream is down, polymarket becomes {"status": "pm_offline"}, the card still serves, and only then does it carry the archive’s realized career_pnl_usd / pnl_marked_usd as the fallback voice. card.avg_entry_price is the average cost per token across all buys — the trader’s break-even winrate, token-weighted. It is not the price they usually click. avg_win_usd / avg_loss_usd are per-resolved-market averages, and one blowup skews them.
avg_entry_price, avg_win_usd, and avg_loss_usd are absent or null until the career-stats rollup has populated a trader. Treat missing as “unavailable”, never as zero.winrate is null when nothing has resolved. An unknown-but-valid wallet returns an honest zeroed card, not a 404.
Full doctrine: Reading the numbers.

GET /traders/{trader}/top-markets

The trader’s standout markets in one scan — the whale drill-down the recency-only markets list cannot do.
Each row uses the markets-list shape below. Uncached, since open markets shift. Keep n modest on 100k-market makers — they sit near the heavy-query timeout (504 query_timeout).

GET /traders/{trader}/markets

Recency-ordered markets, one row each. Each row: condition_id, title, outcome, resolved, winner, last_traded_at, trader_last_action (BUY/SELL), last_price, fills_count, pnl_usd, open, volume_usd. Open rows also carry market_value_usd and pnl_marked_usd.
For extremes use /top-markets, never paging. This list is recency-ordered only by design — a 40,000-market bot has no “biggest win” on page one.

GET /traders/{trader}/markets/{condition_id}/summary

The computed stat block. Prefer this over raw events. No arrays.
Resolved markets are immutable and ETag’d — send If-None-Match for a 304.

GET /traders/{trader}/markets/{condition_id}

The sampled market chart in one call — no cursor, no tick flood.
  • points are [ts, last, lo, hi], UP-normalized. Draw (lo + hi) / 2 — every value is a real traded level; the server never emits a computed price.
  • Omit from_ts / to_ts for the title-anchored default window (a “2:25–2:30PM ET” market opens at the title’s start).
  • fills is the trader’s complete fill set, always present, each carrying token_side and outcome.
raw=1 returns the old verbatim contract instead: ticks: [{ts, price}] plus window / cursor / limit keyset paging. Raw ticks duplicate about 36×, so this is the export path. For a chart you want the sampled default.

GET /traders/{trader}/markets/{condition_id}/tape

The whole market as a change-compressed per-second tape in one gzipped response (Content-Encoding: gzip), uncapped — for the interactive TradingView template.
Rows are UP-normalized and emitted only when a second’s (last, lo, hi) differs from the previously emitted second. A 53-day market is roughly 27,000 rows / ~150KB gzipped, not millions. Do all bucketing and the band-mid walk client-side.
Fine for a file or a browser; too big for a chat artifact. For chat, use the sampled endpoint above with points=120.
There is no MCP tool for this endpoint — it is REST-only.

GET /traders/{trader}/pnl-series

Polymarket’s cumulative-P/L series for the career equity curve.
Drawdown is a one-line derivation the equity template does for you: dd[i] = p[i] − running_max. Degrades to {"status": "pm_offline"} if the upstream is down.

GET /traders/{trader}/fills

Cross-market fills since a timestamp — the monitoring primitive. Any wallet, no live-slot cost, freshness bounded by the archive pipeline (minutes). Each fill: {ts, condition_id, title, side, price, token_side, outcome, size_tokens, usd}. Record the last fill’s ts and pass it back as since next poll, so you only pull what is new. Poll on a minutes cadence — see Monitor a wallet.