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.
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.
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.
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.
pointsare[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_tsfor the title-anchored default window (a “2:25–2:30PM ET” market opens at the title’s start). fillsis the trader’s complete fill set, always present, each carryingtoken_sideandoutcome.
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.
(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.
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.
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.