Polymarket Scraper: Markets, Odds, Price History and Trades
Pricing
from $1.20 / 1,000 markets
Polymarket Scraper: Markets, Odds, Price History and Trades
Scrape Polymarket prediction markets: question, outcomes and live prices, volume, liquidity, dates, tags and status. Search, browse by tag or paste links. Also price history and recent trades, plus a monitor that returns only markets whose odds moved. No login.
Pricing
from $1.20 / 1,000 markets
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Why choose this actor?
- Every open market's odds, volume and liquidity in seconds. Our test run returned the 100 most traded open markets in 3.5 seconds from a single request, with 35 fields filled on every row: question, outcomes and prices, 24 hour and total volume, liquidity, end date, tags and event. No Polymarket account, no wallet, no API key.
- A monitor that only returns markets whose odds moved. Switch on
onlyPriceMovesand schedule it. In our test two runs 10 minutes apart on the top 200 markets returned 43 rows the second time, the ones that moved 2 points or more (the biggest move was 73 points during a live match), and held back the other 157. You pay for movers, not for the whole list again. - Price history and trades from the same actor. One more input switches to hourly or daily price points (981 points for 5 markets in 13 seconds in our test) or to recent trades with a minimum dollar size (100 trades of $1,000 or more in 14 seconds). Links that do not exist and markets with no data come back as free status rows, never charged.
Part of The Mine Works Company and business data family: Company Domain Finder, GST Taxpayer Lookup, Company KYB Resolver, SEC EDGAR Filings Scraper, EU VAT Checker (VIES), Tech Stack Detector.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns the 10 best matching open markets for a search in a few seconds:
{"searchQueries": ["fed rates"],"maxMarkets": 10}
You can pick markets four ways, and mix them in one run: search words (searchQueries, the same as the search box on polymarket.com), tag slugs (tags, such as politics, crypto or sports), links (marketUrls: event links like https://polymarket.com/event/fed-decision-in-october, market links like https://polymarket.com/event/<event>/<market>, market or event slugs, numeric market IDs or 0x condition IDs), or nothing at all, which browses every open market sorted by 24 hour volume.
On Apify's free plan every run returns the first 10 results as a preview, so you can check the data and the fields before you pay. A paid Apify plan returns every result: https://apify.com/pricing?fpr=ymnoit
Copy to your AI assistant
themineworks/polymarket-scraper on Apify. Scrapes Polymarket prediction markets from the public Polymarket APIs: one row per market with question, outcomes and prices, volume, liquidity, dates, tags and status, or price history points, or recent trades, with a monitor that returns only markets whose odds moved. Call ApifyClient("TOKEN").actor("themineworks/polymarket-scraper").call(run_input={"mode": "markets", "searchQueries": ["fed rates"], "maxMarkets": 10}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: nothing (an empty input browses the top open markets). Optional: mode ("markets", "priceHistory" or "trades", default "markets"), searchQueries, tags, marketUrls, status ("open", "closed" or "all", default "open"), minVolume, minLiquidity, endDateFrom, endDateTo, sortBy ("volume24h", "volume", "liquidity", "endingSoon", "newest", default "volume24h"), maxMarkets (default 100, 10 to 2000), onlyPriceMoves (default false), minPriceMovePoints (default 5), monitorIncludeNew (default true), historyInterval ("1h", "6h", "1d", "1w", "1m", "max", default "1w"), historyFidelityMinutes (default 60), maxPointsPerMarket (default 500), maxTradesPerMarket (default 100), minTradeUsd (default 0). Full spec: GET https://api.apify.com/v2/acts/themineworks~polymarket-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- 45 fields per market: question, rules, outcomes with their prices as a list and by name, leading outcome and its probability, best bid and ask, spread, last trade price, price change over 1 hour, 24 hours and 1 week, volume (total, 24 hours, week, month), liquidity, start, end, created and closed dates, status, winning outcome on resolved markets, tags, event title and link, condition ID and order book token IDs.
- Four ways in, one dataset: search words, tags, links and browsing, with filters for status (open, closed or all), minimum volume, minimum liquidity and an end date window, sorted by 24 hour volume, total volume, liquidity, ending soonest or newest.
- Odds move monitor for schedules: returns a market only when an outcome price moved at least
minPriceMovePoints(default 5 percentage points) since the price this actor last delivered to you, withprevious_prices,price_move_pointsandmonitor_reasonon each row. Prices are kept in a key value store in your own Apify account. - Price history: windows from the last hour to the whole life of a market, points every 1 to 10,080 minutes, up to 50,000 points per market. Each point carries the price of every outcome. Closed markets fall back to their full daily history.
- Recent trades: up to 10,000 per market, newest first, with side, outcome, price, shares, dollar value, transaction hash and the public wallet address. Set
minTradeUsdto keep only large trades. - Up to 2,000 markets per search, tag or browse and 1,000 links per run. A run summary in the
OUTPUTrecord lists every source, request and status, so an empty result always has a reason.
How to use it
Basic: the most traded open markets right now
An empty input does this. Set the number you want:
{"maxMarkets": 100}
Several searches, tags and links at once
{"searchQueries": ["bitcoin", "fed rates"],"tags": ["politics", "geopolitics"],"marketUrls": ["https://polymarket.com/event/which-party-will-win-the-house-in-2026","will-the-us-invade-iran-before-2027"],"maxMarkets": 50}
Each search and each tag gets its own budget of 50 markets. Links are not counted against it: a market link returns that market, and an event link returns the event's markets that pass your filters. A market found twice is returned once.
Job: odds move alerts on a schedule
Watch a set of markets and get a row only when the odds move. The first run returns every market (they are all new to the monitor); later runs return only the markets whose price moved at least minPriceMovePoints since the price you last received, plus markets that appeared since.
{"tags": ["politics"],"maxMarkets": 200,"onlyPriceMoves": true,"minPriceMovePoints": 5}
Scheduling tip: in Apify Console open this actor, then Schedules, then add a schedule (every 15 minutes for live events, hourly or daily for slow markets) and connect a webhook, Slack or Google Sheets integration to the run. Each row carries previous_prices, price_move_points and previous_price_at, so the alert can say "from 16.5% to 89.5% since 20:20". Set monitorIncludeNew to false if you only want moves.
Job: research an election or a policy decision with price history
Hourly prices for the last week of the markets you follow, ready for a chart or a model:
{"mode": "priceHistory","marketUrls": ["https://polymarket.com/event/fed-decision-in-october-20260617190323537","https://polymarket.com/event/brazil-presidential-election"],"historyInterval": "1w","historyFidelityMinutes": 60}
Event links expand to every open market in the event, so the Fed link above gives one history per outcome of the decision. For the whole life of a market use "historyInterval": "max" with "historyFidelityMinutes": 1440 (daily points).
Job: follow large trades
Trades of $1,000 or more on the markets you care about, newest first:
{"mode": "trades","marketUrls": ["https://polymarket.com/event/will-the-us-invade-iran-before-2027"],"maxTradesPerMarket": 200,"minTradeUsd": 1000}
Scheduling tip: run it hourly and keep only rows whose trade_time is newer than your last run, or deduplicate on transaction_hash plus token_id on your side.
Job: what resolves this month
Open markets ending in a date window, soonest first, with enough liquidity to matter:
{"sortBy": "endingSoon","endDateFrom": "2026-10-06","endDateTo": "2026-10-31","minLiquidity": 10000,"maxMarkets": 300}
Job: resolved markets and their outcomes
Closed markets with the winning outcome, for back testing or for checking how a forecast played out:
{"status": "closed","tags": ["elections"],"sortBy": "volume","maxMarkets": 500}
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
mode | string | "markets" | "markets" (one row per market), "priceHistory" (one row per price point) or "trades" (one row per trade). |
searchQueries | array of strings | none | Words to search for, like the search box on polymarket.com. Each search returns its best matching markets, up to maxMarkets. |
tags | array of strings | none | Tag slugs such as politics, crypto, sports, economy, elections, tech or geopolitics. Each tag returns up to maxMarkets markets. |
marketUrls | array of strings | none | Event or market links, market or event slugs, numeric market IDs or 0x condition IDs, up to 1,000. |
status | string | "open" | "open", "closed" or "all". Applies to search, tags, browsing and event links, not to links of single markets. |
minVolume | integer | 0 | Only markets with at least this total volume in USD. |
minLiquidity | integer | 0 | Only markets with at least this liquidity in USD. |
endDateFrom | string (date) | none | Only markets ending on or after this day (YYYY-MM-DD). |
endDateTo | string (date) | none | Only markets ending on or before this day (YYYY-MM-DD). |
sortBy | string | "volume24h" | "volume24h", "volume", "liquidity", "endingSoon" or "newest". |
maxMarkets | integer | 100 | Most markets per search, per tag, or from browsing. From 10 to 2,000. |
onlyPriceMoves | boolean | false | Markets mode: return a market only when its odds moved at least minPriceMovePoints since the price last delivered to you for the same searches, tags and links. |
minPriceMovePoints | number | 5 | Move needed, in percentage points (5 means 40% to 45%). From 0.1 to 100. |
monitorIncludeNew | boolean | true | With the monitor on, also return markets it has not seen before. |
historyInterval | string | "1w" | Price history window: "1h", "6h", "1d", "1w", "1m" or "max". |
historyFidelityMinutes | integer | 60 | Minutes between price points. From 1 to 10,080. |
maxPointsPerMarket | integer | 500 | Most recent price points kept per market. From 10 to 50,000. |
maxTradesPerMarket | integer | 100 | Most recent trades per market. From 10 to 10,000. |
minTradeUsd | integer | 0 | Trades mode: only trades worth at least this many dollars. |
The actor also reads links from startUrls (plain links or { "url": "..." } objects) or urls, and search words from search or query, if your input already uses those names.
What data do you get?
One row per market, per price point or per trade, depending on mode. Fields by group:
Market rows (mode markets)
- The market:
market_id,slug,url,question,description(the rules: how the market resolves),group_item_title(its short name inside an event, for example a candidate),image_url. - Odds:
outcomes,outcome_prices(0 to 1, in the order ofoutcomes; 0.62 means a 62% chance),prices_by_outcome,leading_outcome,leading_probability,best_bid,best_ask,spread,last_trade_price,price_change_1h,price_change_24h,price_change_1w(as fractions: 0.05 is 5 points). - Money:
volume_total,volume_24h,volume_1w,volume_1m,liquidity, all in USD. - Dates and status:
start_date,end_date,created_at,closed_time,status(open,paused,closed,archivedorinactive),active,closed,accepting_orders,resolution_status,winning_outcome(closed markets),resolution_source. - Grouping:
tags,tag_slugs,event_id,event_slug,event_title,event_url. - On chain:
condition_id,clob_token_ids(one order book token per outcome),neg_risk. - Monitor runs add
monitor_reason(movedornew),previous_prices,previous_price_atandprice_move_points.
Price point rows (mode priceHistory)
market_id,slug,url,question,event_title,timestamp,unix_time,outcomeandprice(the first outcome, usually Yes),prices_by_outcome(every outcome at that time),interval,fidelity_minutes. In a two outcome market the second price is 1 minus the first, which is how Polymarket prices pairs.
Trade rows (mode trades)
market_id,slug,url,question,event_title,trade_time,unix_time,side(BUY or SELL),outcome,outcome_index,price,shares,usd_value,transaction_hash,trader_wallet(the public wallet address),token_id. Trader names, pseudonyms, bios and profile pictures are left out on purpose.
Status rows (free)
- A link, search or tag that returns nothing, a market with no history or no trades, and a monitor run with no moves each get one row with
_type: "status",input,status(not_found,invalid_input,no_results,tag_not_found,no_matching_markets,no_history,no_trades,no_order_book,no_movesorerror), a plainnote, andmarket_idwhen it is about one market. They are never charged. Filter them out with_type.
Stable fields for automations
These fields were present in every market row of our test runs (100 open markets and a resolved one), and their names will not change:
| Field | What it is |
|---|---|
market_id | Polymarket market ID |
slug | Market slug |
url | Link to the market on polymarket.com |
question | The market question |
description | Rules: how it resolves |
outcomes | Outcome names |
outcome_prices | Price of each outcome, 0 to 1 |
prices_by_outcome | Price per outcome name |
leading_outcome | Outcome with the highest price |
leading_probability | Its price |
volume_total | Total volume, USD |
end_date | Scheduled end (ISO) |
status | open, paused, closed, archived or inactive |
tags | Tag labels |
event_title | Title of the event the market belongs to |
scraped_at | When the row was read |
On price point rows market_id, timestamp, price and prices_by_outcome are always present; on trade rows trade_time, side, outcome, price, shares, usd_value and transaction_hash are.
Output examples
Real rows from our test runs on 5 and 6 October 2026, trimmed (long rules text cut, token IDs and images removed). Wallet addresses are shortened here; the dataset has them in full.
An open market from browsing (mode markets):
{"market_id": "562802","slug": "will-the-democratic-party-control-the-house-after-the-2026-midterm-elections","url": "https://polymarket.com/event/which-party-will-win-the-house-in-2026/will-the-democratic-party-control-the-house-after-the-2026-midterm-elections","question": "Will the Democratic Party control the House after the 2026 Midterm elections?","description": "This market will resolve according to the party that wins control of the United States House of Representatives in the 2026 United States midterm election...","outcomes": ["Yes", "No"],"outcome_prices": [0.925, 0.075],"prices_by_outcome": { "Yes": 0.925, "No": 0.075 },"leading_outcome": "Yes","leading_probability": 0.925,"best_bid": 0.92,"best_ask": 0.93,"spread": 0.01,"last_trade_price": 0.92,"price_change_24h": -0.01,"volume_total": 7808267.57,"volume_24h": 216590.78,"volume_1w": 659926.32,"volume_1m": 2055159.66,"liquidity": 2074796.71,"start_date": "2025-07-11T19:50:44.885Z","end_date": "2026-11-04T04:59:00.000Z","status": "open","accepting_orders": true,"tags": ["United States", "Politics", "US Election", "Midterms", "Elections"],"event_title": "Which party will win the House in 2026?","event_url": "https://polymarket.com/event/which-party-will-win-the-house-in-2026","group_item_title": "Democratic Party","condition_id": "0xd5d9fc47718bd553592d126b1fa5e87183d27f3936975b0c04cc0f2dec1f1bb4","neg_risk": true,"scraped_at": "2026-10-05T20:17:16.937Z"}
A resolved market from a link (winning_outcome set, tags trimmed):
{"market_id": "253591","question": "Will Donald Trump win the 2024 US Presidential Election?","outcomes": ["Yes", "No"],"outcome_prices": [1, 0],"volume_total": 1531479284.5,"end_date": "2024-11-05T12:00:00.000Z","closed_time": "2024-11-06T15:17:41.000Z","status": "closed","closed": true,"resolution_status": "resolved","winning_outcome": "Yes","tags": ["Elections", "Trump", "Politics", "US Election"],"event_title": "Presidential Election Winner 2024","group_item_title": "Donald Trump"}
A monitor row: this market moved 73 points between two runs 10 minutes apart during the match (onlyPriceMoves: true, minPriceMovePoints: 2):
{"market_id": "4835307","question": "Will France win on 2026-10-05?","url": "https://polymarket.com/event/unl-fra-bel-2026-10-05/unl-fra-bel-2026-10-05-fra","outcomes": ["Yes", "No"],"outcome_prices": [0.895, 0.105],"price_change_1h": 0.54,"volume_24h": 625197.13,"liquidity": 49565.81,"status": "open","event_title": "France vs. Belgium","monitor_reason": "moved","previous_prices": [0.165, 0.835],"previous_price_at": "2026-10-05T20:20:02.931Z","price_move_points": 73,"scraped_at": "2026-10-05T20:30:12.358Z"}
A price point (mode priceHistory, hourly points over the last week):
{"market_id": "701496","slug": "will-bitcoin-reach-100000-by-december-31-2026-571-361-361","question": "Will Bitcoin reach $100,000 by December 31, 2026?","event_title": "What price will Bitcoin hit in 2026?","timestamp": "2026-10-05T20:13:19.000Z","unix_time": 1791231199,"outcome": "Yes","price": 0.355,"prices_by_outcome": { "Yes": 0.355, "No": 0.645 },"interval": "1w","fidelity_minutes": 60,"scraped_at": "2026-10-05T20:18:08.204Z"}
A trade (mode trades, minTradeUsd: 1000):
{"market_id": "665374","question": "Will the U.S. invade Iran before 2027?","trade_time": "2026-10-05T18:27:31.000Z","side": "SELL","outcome": "No","outcome_index": 1,"price": 0.84,"shares": 3414.63,"usd_value": 2868.29,"transaction_hash": "0x999d5267ed6b86e7d3d4f49979769decb9ef776e29b3fb877a66f2095f5babfc","trader_wallet": "0x0097...4a1d","scraped_at": "2026-10-05T20:18:39.979Z"}
A free status row for a link that does not exist (never charged):
{"_type": "status","input": "polymarket.com/event/not-a-real-event-zz","status": "not_found","note": "Polymarket has no market or event with this link, slug or ID. Not charged.","scraped_at": "2026-10-05T20:30:47.215Z"}
Pricing
Pay per event: you pay for the rows you receive, plus a flat $0.005 per run, whatever memory you choose. Each mode has its own row price, because a market row and a single price point are not worth the same.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
market-scraped | Once per market row stored in your dataset (mode markets) | $1.20 per 1,000 | $1.20 per 1,000 | $1.20 per 1,000 | $1.20 per 1,000 |
price-point-scraped | Once per price point row stored (mode priceHistory) | $0.20 per 1,000 | $0.20 per 1,000 | $0.20 per 1,000 | $0.20 per 1,000 |
trade-scraped | Once per trade row stored (mode trades) | $0.20 per 1,000 | $0.20 per 1,000 | $0.20 per 1,000 | $0.20 per 1,000 |
run-start | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |
The price of a single row is the price per 1,000 divided by 1,000.
Free plan runs return up to 10 results each; paid plans have no cap.
Never charged:
- status rows: links, slugs and IDs that do not exist, searches and tags with no matching market, markets with no price history or no trades, and monitor runs where nothing moved;
- markets the monitor held back because their odds did not move enough (you pay only for the rows you receive);
- a market found by two searches or tags (returned once) and a trade seen twice;
- requests Polymarket refused;
- anything past your "Max cost per run": the actor stops delivering when your limit is reached instead of sending rows for free.
FAQ
What is Polymarket and what does this actor read?
Polymarket is a prediction market where people trade on the outcome of events: elections, central bank decisions, sports, crypto prices, geopolitics. A market's price is the crowd's probability: 0.62 means 62%. The actor reads the same public data the polymarket.com website loads: market listings and search (Polymarket's gamma API), price history (its order book API) and recent trades (its data API). Nothing is bought, sold or signed.
What do I get on the free plan?
Each run on the free plan returns up to 10 results, enough to check the data and the fields. A paid Apify plan returns every result, with no cap: https://apify.com/pricing?fpr=ymnoit
Do I need a Polymarket account, a wallet or an API key?
No. These are public read endpoints. The actor never logs in, never connects a wallet and never asks for cookies or keys.
How many markets can I get?
Up to 2,000 per search, per tag or from browsing, and up to 1,000 links per run. Polymarket lists the open markets 100 per request, so 2,000 markets take 20 requests; our test read 100 markets in 3.5 seconds. Searches return the best matches first and stop when no more results match.
How fresh are the odds?
Live at the moment of the run: each row carries scraped_at, and the prices are the ones Polymarket shows at that time (the midpoint of the order book, or the last trade when the spread is wide). Price history points are as recent as the last minute Polymarket recorded.
How does the monitor decide what to return?
For each market it compares every outcome price with the price it last delivered to you for the same searches, tags, links and status, and returns the market when the largest move reaches minPriceMovePoints. The comparison is with the last delivered price, not the last run, so a slow drift of 1 point per day is reported once it adds up to your threshold. New markets are returned once (unless you switch monitorIncludeNew off) and then tracked. The prices live in a key value store named polymarket-price-monitor in your own Apify account; delete it to start over. Change the searches or tags and the monitor starts a fresh list for them.
Why does a closed market's history show daily points?
Polymarket keeps hourly and minute points only for recent windows. When a closed market has no points in the window you asked for, the actor fetches its full daily history instead and marks those rows "interval": "max".
Can I get the order book or who holds a market?
Not in this version. Rows carry the best bid, best ask, spread and last trade price, which cover most uses. We do not export holder lists or trader names: trade rows carry the public wallet address only.
Do I need to set up a proxy?
No. The actor uses Apify's datacenter proxy on its own and retries a refused request on a new IP. There is no proxy setting to choose.
What happens with a wrong link or a market with no trades?
You get one free status row saying what happened (not_found, no_trades, no_history and so on). Nothing is charged for it and the rest of the run goes on. The OUTPUT record in the run's key value store lists every source, request and status.
Which formats can I download?
JSON, CSV, Excel, XML, HTML table and RSS from the dataset page, or the same through the API. In CSV and Excel the list fields (outcomes, outcome_prices, tags) are spread over numbered columns; prices_by_outcome keeps outcome names as column names.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
- Connector URL: https://mcp.apify.com/?tools=themineworks/polymarket-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http polymarket-scraper "https://mcp.apify.com/?tools=themineworks/polymarket-scraper"
Is it legal to scrape Polymarket?
The actor only reads market data that Polymarket publishes openly to anyone, without an account. Trade rows include public blockchain wallet addresses, which some laws can treat as personal data in some contexts. You are responsible for how you use the data, for Polymarket's terms, for the rules on prediction markets where you live, and for data protection law such as GDPR and CCPA. Nothing here is financial advice.
Integrations
- Google Sheets: send each run's rows to a sheet with Apify's Google Sheets integration, for example a daily odds table.
- Make, Zapier and n8n: start the actor and read its dataset with the Apify apps and nodes, for example "odds moved 5 points, post to Slack".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset; pairs well with the monitor.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
Company and business data
- Company Domain Finder
- GST Taxpayer Lookup
- Company KYB Resolver
- SEC EDGAR Filings Scraper
- EU VAT Checker (VIES)
- Tech Stack Detector
- Bundesanzeiger Scraper
- Domain to LinkedIn URL Resolver
- World Bank Trade Scraper
- US Import Records
- Y Combinator Scraper
- Norway Company Register
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a market that should work and does not? Open an issue in the Issues tab with the link and the run ID, and we will look at it. For a new source or a field you need, email dmineworks@gmail.com.
Search, browse or paste Polymarket links and get every market's odds, volume, liquidity and dates as clean rows, with price history, large trades and an odds move monitor in the same actor.

