Polymarket Trades Scraper & Whale Monitor - Wallets, Positions avatar

Polymarket Trades Scraper & Whale Monitor - Wallets, Positions

Pricing

from $2.10 / 1,000 trade returneds

Go to Apify Store
Polymarket Trades Scraper & Whale Monitor - Wallets, Positions

Polymarket Trades Scraper & Whale Monitor - Wallets, Positions

Polymarket Trades, one row per fill: time, market, outcome, side, price, shares, USD amount, wallet, tx hash, URL. Filter by market, event, wallet, side or minimum USD. Monitoring returns only trades new since the last run, for whale alerts. Also lists a wallet's open positions.

Pricing

from $2.10 / 1,000 trade returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

11 days ago

Last modified

Share

Get Polymarket trades as one clean row per trade: when it happened, the market question, the outcome (Yes, No, a team, a candidate), buy or sell, the price, the number of shares, the amount in USD, the wallet address and its public display name, the transaction hash and the market URL. Filter by market, event, wallet, side and minimum USD amount. A monitoring mode returns only the trades that are new since the previous run, so a schedule plus a minimum of $10,000 gives you whale trades as they happen. A second data type lists the open positions of any wallet.

It reads Polymarket's official public Data API v2 (data-api.polymarket.com/v2), the one Polymarket's own documentation points developers and AI agents to. No login, no API key, no wallet, no proxy. It only reads; it never places or copies an order.

Why this Actor

  • Built on Data API v2. Polymarket retires the original Data API routes (/trades, /positions without /v2) on October 24, 2026. This Actor already uses the v2 routes, which page with a cursor instead of an offset, so it is not limited to the 10,000 most recent rows.
  • A whale monitor that does not drop or repeat trades. Monitoring compares trades by identity, not by "newer than the last timestamp". Five large trades in the same second all come back; a trade that Polymarket lists a few minutes late still comes back; a trade you already received never comes back twice.
  • One Actor for the feed, a market, an event, or a wallet. Follow every $10,000+ trade on Polymarket, every trade in one market or one event, or everything a list of wallets does. Filters can be combined.
  • Wallet positions too. Set dataType to positions to get what a wallet holds right now: shares, average entry price, current price and value, realized and unrealized profit.
  • Filters are applied twice. Minimum amount, side, market and wallet are sent to Polymarket and checked again on every row, so a trade outside your filters is never returned or charged.
  • Honest empty results. An unknown market, a filter with no match, a refusal, a rate limit and a list cut off part-way each come back as a separate free row that says what happened. A value Polymarket does not give is null, never 0.

Sister Actors: Polymarket Markets Scraper & Monitor for prices, volume and newly listed markets on Polymarket, Kalshi Markets Scraper for market prices from Kalshi, and Polymarket Weather Markets for temperature markets with the weather forecast on the same row.

Input

FieldTypeDefaultWhat it does
dataTypeselecttradestrades (one row per trade) or positions (one row per open position of each wallet in wallets).
marketslist(none)Market slugs, 0x condition ids, or polymarket.com market addresses. An event address or event slug is read as the whole event. Empty = every market.
eventslist(none)Event slugs, numeric event ids, or polymarket.com/event/... addresses. Trades from every market of the event.
walletslist(none)Wallet addresses (0x + 40 hex characters) or polymarket.com/profile/0x... addresses. Empty = every wallet. Required for positions.
minUsdinteger(none; prefilled: 10000)Trades: only trades of at least this many dollars. Positions: only positions currently worth at least this much.
sideselectANYANY, BUY or SELL, from the point of view of the wallet in the row. Trades only.
tradedWithinHoursinteger(none)Trades only: stop at trades older than this many hours. Not used in monitoring mode.
maxResultsinteger1000The most rows returned and charged in one run (up to 50,000). Newest trades first.
monitoringModebooleanfalseReturn only the trades that are new since the previous run with the same filters. See below.
resetMonitoringStatebooleanfalseForget the saved starting point for these exact filters.

No field is required. With an empty input you get the 1,000 most recent trades across all of Polymarket.

Examples

Whale trades of $10,000 or more, checked on a schedule:

{ "minUsd": 10000, "monitoringMode": true }

The latest 500 trades of $1,000 or more in one market:

{ "markets": ["https://polymarket.com/event/<event-slug>/<market-slug>"], "minUsd": 1000, "maxResults": 500 }

Everything two wallets bought in the last 24 hours:

{ "wallets": ["0x1111111111111111111111111111111111111111", "0x2222222222222222222222222222222222222222"], "side": "BUY", "tradedWithinHours": 24 }

What a wallet holds now, positions worth $100 or more:

{ "dataType": "positions", "wallets": ["0x1111111111111111111111111111111111111111"], "minUsd": 100 }

Output

One row per trade (recordType: "trade"):

{
"source": "polymarket-data-api",
"status": "ok",
"recordType": "trade",
"tradeId": "5f0c1d2e3a4b5c6d7e8f9a0b",
"tradedAt": "2026-10-05T14:38:55.000Z",
"marketQuestion": "Example market question?",
"outcome": "Yes",
"outcomeIndex": 0,
"side": "BUY",
"price": 0.42,
"shares": 35000,
"amountUsd": 14700,
"wallet": "0x1111111111111111111111111111111111111111",
"walletName": "example-trader",
"walletPseudonym": null,
"walletUrl": "https://polymarket.com/profile/0x1111111111111111111111111111111111111111",
"transactionHash": "0x…",
"transactionUrl": "https://polygonscan.com/tx/0x…",
"marketUrl": "https://polymarket.com/event/example-event/example-market",
"marketSlug": "example-market",
"eventSlug": "example-event",
"conditionId": "0x…",
"tokenId": "7864…",
"timestamp": 1791211135,
"scrapedAt": "2026-10-05T14:47:10.000Z"
}
  • amountUsd is shares × price, rounded to 4 decimals. It is the same number Polymarket's own minimum-amount filter uses (checked on 2026-10-05: with a $10,000 minimum, the smallest of 12,000 returned trades was exactly $10,000.00). It does not include fees: compared with the cash amount Polymarket shows in a wallet's activity for the same trade, 444 of 712 trades differed by 1% or more (up to about 5%).
  • side is from the point of view of wallet. By default Polymarket lists each fill once, on the side of the wallet that took the order.
  • tradeId is built from the transaction hash, token, wallet, side, shares, price and time. Polymarket does not publish a trade id.
  • walletName and walletPseudonym are the public display names shown on the wallet's Polymarket profile; null when the wallet has none. Wallet addresses are public on the Polygon blockchain. This Actor does not look up real names, emails or any other identity for a wallet.
  • outcome and outcomeIndex are null when Polymarket could not label the outcome; marketQuestion is null when Polymarket has not attached market details to the trade yet.

One row per position (recordType: "position"): wallet, walletName, marketQuestion, outcome, shares, avgPrice, currentPrice, currentValueUsd, entryCostUsd, realizedPnlUsd, unrealizedPnlUsd, totalPnlUsd, percentPnl, positionStatus (OPEN or REDEEMABLE: the market resolved and the tokens are still held, which includes losing sides), redeemable, mergeable, negativeRisk, marketEndDate, firstEntryAt, lastEventAt, marketUrl, marketSlug, eventSlug, eventId, conditionId, tokenId. Profit columns are Polymarket's own figures and are not recalculated.

Rows that are not data have a different status and a note in plain words. They are never charged:

statusMeaning
invalid-inputThe input was not accepted (for example a wallet that is not an address). Nothing was read.
market-not-foundPolymarket has no market or event with that slug.
no-trades-matched / no-positions-matchedPolymarket answered and nothing matches. Polymarket gives the same empty answer for a wallet address it has never seen.
baseline-recordedFirst monitoring run: the starting point was saved.
no-new-trades-since-last-runMonitoring: nothing new since the previous run.
incompletePart of the list could not be read, or more rows were ready than maxResults allows.
budget-reachedThe run hit the maximum charge you set; the remaining rows were not charged.
blocked / unreadable / disallowed-by-robotsPolymarket refused, could not be read, or its robots.txt no longer allows the route. Never reported as "no trades".

Monitoring mode

  1. The first run with a given set of filters saves a starting point and returns no trade. It is free.
  2. Each later run with the same filters returns only the matching trades that appeared since the previous run, oldest first.
  3. A run that finds nothing new returns one free no-new-trades-since-last-run row and is charged one scan check.

Details that matter:

  • Each run reads back 10 minutes before the previous run and skips the trades it has already returned, so trades that share a second, and trades that Polymarket lists late, are neither dropped nor repeated. A trade that Polymarket lists more than 10 minutes after it happened can be missed.
  • Because Polymarket's answers can be a few minutes behind (see Freshness below), the first run after the starting point can include trades from the last few minutes before it. They are trades you have not received yet.
  • If a run stops at maxResults or at your maximum charge, the trades that were not returned are not marked as returned; the next run returns them.
  • If Polymarket cannot be read, nothing is charged and the starting point does not move.
  • The memory is kept per set of filters (markets, events, wallets, minUsd, side). Changing a filter starts a new first run. maxResults is not part of it.
  • If more than 200,000 trades match between two runs (possible only without filters and with long gaps), the oldest ones are skipped and a free incomplete row says from when.

Pricing

Pay per event, no start fee:

EventFree planBronzeSilverGold and above
trade-returned (per 1,000 trade rows)$3.00$2.70$2.40$2.10
position-returned (per 1,000 position rows)$3.00$2.70$2.40$2.10
scan-checked (per 1,000 monitoring runs that found nothing new)$0.50$0.50$0.50$0.50

The first monitoring run, runs that could not read Polymarket, and all rows with a note are free.

Notes and limits

  • Freshness. Polymarket's API answers may be cached for up to 5 minutes (cache-control: max-age=300), so the newest trades can appear a few minutes late. Monitoring picks them up at the next run.
  • How far back. Polymarket serves the unfiltered feed for the current and previous month, and about three years for a market, an event or a wallet.
  • Up to 20 markets per request. Longer lists are split into several requests by the Actor; you can pass up to 100 markets, 20 events and 50 wallets.
  • Rate. The Actor sends at most about 8 requests per second; Polymarket documents 300 requests per 10 seconds for this route.
  • Wallets are addresses. Polymarket user names cannot be used as input; paste the address from the profile link.
  • Not affiliated with Polymarket. Data comes from Polymarket's public API as is.
  • Not investment advice. This Actor reports what was traded. It does not recommend any trade, and following another wallet's trades can lose money. Trading on Polymarket is restricted in some countries; check the rules that apply to you.

Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

  • Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
  • Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.