Query every trade ever executed on Polymarket. Filter by wallet, market, time range, or minimum size. Full history with cursor pagination.
Search and filter the complete history of Polymarket trades. Every CLOB fill is indexed and enriched with market metadata. Supports filtering by wallet, market (via slug, condition ID, or token ID), time range, and minimum trade size. When no filters are provided, returns the most recent trades from the last 24 hours. Add any filter to query the full history.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.
| Parameter | Type | Required | Description |
|---|---|---|---|
wallet | string | No | Filter by wallet address (matches both maker and taker sides) |
market_slug | string | No | Filter by market slug (e.g. will-zohran-mamdani-win-the-2025-nyc-mayoral-election) |
condition_id | string | No | Filter by condition ID (0x-prefixed, 64 hex chars) |
token_id | string | No | Filter by outcome token ID |
start_time | integer | No | Unix timestamp — only return trades after this time |
end_time | integer | No | Unix timestamp — only return trades before this time |
min_total | number | No | Minimum trade size in USD |
limit | integer | No | Results per page (1-500, default 100) |
order | string | No | Sort by timestamp: desc (newest first, default) or asc (oldest first). Using asc without any filter returns an error. |
sort_by | string | No | Set to order_hash to cluster fills by order. All fills from the same limit order appear adjacent, sorted by time within each group. Groups ordered by most recent fill. Default sort is by timestamp. |
group_by | string | No | Set to order_hash to aggregate fills into one row per order. Each row contains total_amount_usd, total_shares, avg_price, fill_count, first_fill_at, last_fill_at, and tx_hashes. See Group by order below. |
pagination_key | string | No | Cursor from a previous response to fetch the next page |
market_slug — the human-readable URL slug from Polymarket (e.g. will-zohran-mamdani-win-the-2025-nyc-mayoral-election). Easiest to use.condition_id — the unique condition identifier for a market. Returns trades for all outcomes (Yes and No).token_id — the specific outcome token. Returns trades for only that outcome.wallet to find a specific wallet’s trades on a specific market.
| Field | Type | Description |
|---|---|---|
timestamp | number | Unix timestamp of the fill |
tx_hash | string | Polygon transaction hash |
order_hash | string | CLOB order hash that was filled |
maker | string | Maker wallet address |
taker | string | Taker wallet address |
token_id | string | Outcome token ID |
price | number | Fill price (0 to 1) |
amount_usd | number | Trade size in USD |
fee_usd | number | Fee paid in USD |
shares | number | Number of outcome shares traded |
side | string | Exchange role: "maker" or "taker". With wallet filter, this is the queried wallet’s role on the fill. Without wallet, always "maker" (see “Direction & side semantics” below). Always present. |
direction | string | Trader intent: "BUY" or "SELL". With wallet filter, from the queried wallet’s perspective (BUY when the wallet contributed USDC, SELL when it contributed outcome tokens). Without wallet, from the maker’s perspective. Always present. |
market | string | Market question text |
market_slug | string | Market URL slug |
outcome | string | Outcome label (e.g. “Yes”, “No”) |
condition_id | string | Market condition ID |
image | string | null | Market image URL. null for some delisted or niche markets. |
direction and side answer two different questions and are always populated:
direction ("BUY" or "SELL") — what the subject of the row did, economically. They contributed USDC and received outcome shares (BUY) or contributed outcome shares and received USDC (SELL).side ("maker" or "taker") — the subject’s role on the fill. The maker placed a resting limit order; the taker aggressed the spread.| Query | Subject of direction / side |
|---|---|
?wallet=W (with or without other filters) | The wallet W. side reflects whether W was the maker or taker on each fill. |
Any market-wide filter (no wallet): ?condition_id=…, ?token_id=…, ?market_slug=…, or no filter | The maker of each fill. On Polymarket’s CLOB the maker is always the user who signed the limit order, so direction is always a real user’s BUY/SELL. side is therefore always "maker" in this case. |
direction values — both are correct, just anchored on different parties (the queried wallet vs. the maker).
| Field | Type | Description |
|---|---|---|
count | number | Number of trades in this response |
pagination.limit | number | Requested page size |
pagination.has_more | boolean | true if more results exist beyond this page |
pagination.pagination_key | string | Pass this as pagination_key in the next request to get the next page |
side field indicates which role the wallet played.
market_slug to get all trades on a specific market across all wallets.
condition_id to get both outcomes of a market:
min_total to find trades above a USD threshold.
start_time and end_time (Unix timestamps) to query a specific window.
pagination_key from the previous response to get the next page.
sort_by=order_hash to cluster fills from the same limit order together. A single limit order can be filled across many transactions over time. This sort groups all those partial fills adjacently, sorted by timestamp within each order. Orders are ranked by their most recent fill.
Every fill is still returned individually with all fields. No data is collapsed or aggregated.
group_by=order_hash to aggregate all fills from the same limit order into a single row. Each row contains summed totals, a VWAP price, fill count, time range, and a list of transaction hashes.
| Field | Type | Description |
|---|---|---|
order_hash | string | The CLOB order hash (grouping key) |
fill_count | number | Number of individual fills aggregated into this row |
total_amount_usd | number | Sum of all fill sizes in USD |
total_shares | number | Sum of all outcome shares traded |
avg_price | number | Volume-weighted average price (total_amount_usd / total_shares) |
total_fee_usd | number | Sum of all fees in USD |
first_fill_at | number | Unix timestamp of the earliest fill |
last_fill_at | number | Unix timestamp of the most recent fill |
timestamp | number | Same as last_fill_at (for compatibility with default sort) |
tx_hashes | string[] | List of unique transaction hashes for all fills |
token_id | string | Outcome token ID |
maker | string | Maker address (from the first fill) |
side | string | Exchange role (from the first fill) |
direction | string | Trade direction (from the first fill) |
market | string | Market question text |
market_slug | string | Market URL slug |
outcome | string | Outcome label |
condition_id | string | Market condition ID |
image | string | null | Market image URL |
order=asc to get trades in chronological order. Requires at least one filter.
| Status | Response | Condition |
|---|---|---|
| 400 | {"error": "order=asc requires at least one filter (wallet, token_id, condition_id, market_slug, or start_time)."} | order=asc without any filter |
| 400 | {"error": "market_slug not found"} | Invalid or unknown market_slug |
| 400 | {"error": "condition_id not found"} | Invalid or unknown condition_id |
| 401 | {"error": "API key required. Pass via ?key= or x-api-key header."} | Missing API key |
| 403 | {"error": "V2 endpoints require a paid plan. See polynode.dev/pricing for details."} | Free tier key |
| 429 | {"error": "Rate limited. N req/s for your tier.", "retryAfterMs": ...} | Rate limited |
start_time to query further back.side field is only included when filtering by wallet. Without a wallet filter, there is no perspective to assign a side from.market, market_slug, outcome, condition_id, image) is enriched from our index. Very old or delisted markets may not have metadata.Filter by wallet address (matches both maker and taker sides)
Filter by market slug
Filter by condition ID
Filter by outcome token ID
Unix timestamp — only return trades after this time
Unix timestamp — only return trades before this time
Minimum trade size in USD
Results per page (1-500, default 100)
1 <= x <= 500Sort direction. asc requires at least one filter.
desc, asc Cursor from a previous response to fetch the next page
Trade results with pagination