# Polymarket Scraper: Markets, Odds, Price History and Trades (`themineworks/polymarket-scraper`) Actor

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.

- **URL**: https://apify.com/themineworks/polymarket-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** News, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 markets

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Polymarket Scraper: Markets, Odds, Price History and Trades

[![100 Polymarket markets with live odds in 3.5 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/polymarket-scraper-hero.png)](https://console.apify.com/actors/ngyazW5OtUYE75oSk/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), 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 `onlyPriceMoves` and 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.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/ngyazW5OtUYE75oSk/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Company and business data family:** [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### 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:

```json
{
  "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

```text
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, with `previous_prices`, `price_move_points` and `monitor_reason` on 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 `minTradeUsd` to 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 `OUTPUT` record 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:

```json
{
  "maxMarkets": 100
}
```

#### Several searches, tags and links at once

```json
{
  "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.

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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 of `outcomes`; 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`, `archived` or `inactive`), `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` (`moved` or `new`), `previous_prices`, `previous_price_at` and `price_move_points`.

**Price point rows (mode `priceHistory`)**

- `market_id`, `slug`, `url`, `question`, `event_title`, `timestamp`, `unix_time`, `outcome` and `price` (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_moves` or `error`), a plain `note`, and `market_id` when 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`):

```json
{
  "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):

```json
{
  "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`):

```json
{
  "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):

```json
{
  "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`):

```json
{
  "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):

```json
{
  "_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](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Bundesanzeiger Scraper](https://apify.com/themineworks/germany-bundesanzeiger-monitor?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Domain to LinkedIn URL Resolver](https://apify.com/themineworks/domain-to-linkedin-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [US Import Records](https://apify.com/themineworks/us-import-supplier-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Y Combinator Scraper](https://apify.com/themineworks/y-combinator-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Norway Company Register](https://apify.com/themineworks/norway-brreg-entity-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### 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.*

# Actor input Schema

## `mode` (type: `string`):

Markets: one row per market with its outcomes, prices, volume, liquidity, dates, tags and status. Price history: one row per price point for each selected market. Trades: one row per recent trade on each selected market.

## `searchQueries` (type: `array`):

Words to search for, the same as the search box on polymarket.com, for example "bitcoin", "fed rates" or "world cup". Each search returns its best matching markets, up to Max markets per search, tag or browse. Leave Search, Tags and Links empty to browse all markets.

## `tags` (type: `array`):

Polymarket tag slugs, for example politics, crypto, sports, economy, elections, tech or geopolitics: the last part of a category link such as polymarket.com/politics. Each tag returns its markets, up to Max markets per search, tag or browse.

## `marketUrls` (type: `array`):

Polymarket links (https://polymarket.com/event/... or .../event/<event>/<market>), market or event slugs, numeric market IDs or 0x condition IDs, up to 1,000. A market link returns that market. An event link returns the event's markets that pass the filters below.

## `status` (type: `string`):

Open: markets still trading. Closed: finished markets (with the winning outcome when resolved). All: both. Applies to search, tags, browsing and event links, not to links of single markets.

## `minVolume` (type: `integer`):

Only markets that have traded at least this many dollars in total. 0 keeps every market.

## `minLiquidity` (type: `integer`):

Only markets with at least this many dollars of liquidity in the order book. 0 keeps every market.

## `endDateFrom` (type: `string`):

Only markets whose end date is on or after this day (YYYY-MM-DD).

## `endDateTo` (type: `string`):

Only markets whose end date is on or before this day (YYYY-MM-DD).

## `sortBy` (type: `string`):

Order of the markets: most traded in the last 24 hours, most traded overall, most liquidity, ending soonest, or newest first. Searches keep their best matches and sort them this way.

## `maxMarkets` (type: `integer`):

Most markets to take from each search, each tag, or from browsing all markets. Links are not counted. From 10 to 2,000.

## `onlyPriceMoves` (type: `boolean`):

Markets mode only. Return a market only when one of its outcome prices moved at least Minimum move since the price this actor last delivered to you for the same searches, tags and links. Prices are kept in a key value store in your own Apify account. Run it on a schedule.

## `minPriceMovePoints` (type: `number`):

With the monitor on: how far an outcome price must move to be returned, in percentage points. 5 means a move from 40% to 45% or more. From 0.1 to 100.

## `monitorIncludeNew` (type: `boolean`):

With the monitor on: also return markets the monitor has not seen before (on the first run that is every market). Turn off to get only moves.

## `historyInterval` (type: `string`):

Price history mode: how far back to go. A closed market with no points in the window gets its full daily history instead.

## `historyFidelityMinutes` (type: `integer`):

Price history mode: the spacing of the points in minutes. 60 gives hourly points, 1440 daily points. From 1 to 10,080.

## `maxPointsPerMarket` (type: `integer`):

Price history mode: the most recent points kept per market. From 10 to 50,000.

## `maxTradesPerMarket` (type: `integer`):

Trades mode: the most recent trades returned per market, newest first. From 10 to 10,000.

## `minTradeUsd` (type: `integer`):

Trades mode: only trades worth at least this many dollars, for example 1000 to follow large trades. 0 keeps every trade.

## Actor input object example

```json
{
  "mode": "markets",
  "status": "open",
  "minVolume": 0,
  "minLiquidity": 0,
  "sortBy": "volume24h",
  "maxMarkets": 100,
  "onlyPriceMoves": false,
  "minPriceMovePoints": 5,
  "monitorIncludeNew": true,
  "historyInterval": "1w",
  "historyFidelityMinutes": 60,
  "maxPointsPerMarket": 500,
  "maxTradesPerMarket": 100,
  "minTradeUsd": 0
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "markets",
    "status": "open",
    "minVolume": 0,
    "minLiquidity": 0,
    "sortBy": "volume24h",
    "maxMarkets": 100,
    "onlyPriceMoves": false,
    "minPriceMovePoints": 5,
    "monitorIncludeNew": true,
    "historyInterval": "1w",
    "historyFidelityMinutes": 60,
    "maxPointsPerMarket": 500,
    "maxTradesPerMarket": 100,
    "minTradeUsd": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/polymarket-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "markets",
    "status": "open",
    "minVolume": 0,
    "minLiquidity": 0,
    "sortBy": "volume24h",
    "maxMarkets": 100,
    "onlyPriceMoves": False,
    "minPriceMovePoints": 5,
    "monitorIncludeNew": True,
    "historyInterval": "1w",
    "historyFidelityMinutes": 60,
    "maxPointsPerMarket": 500,
    "maxTradesPerMarket": 100,
    "minTradeUsd": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/polymarket-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "markets",
  "status": "open",
  "minVolume": 0,
  "minLiquidity": 0,
  "sortBy": "volume24h",
  "maxMarkets": 100,
  "onlyPriceMoves": false,
  "minPriceMovePoints": 5,
  "monitorIncludeNew": true,
  "historyInterval": "1w",
  "historyFidelityMinutes": 60,
  "maxPointsPerMarket": 500,
  "maxTradesPerMarket": 100,
  "minTradeUsd": 0
}' |
apify call themineworks/polymarket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/polymarket-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ngyazW5OtUYE75oSk/builds/KTfNIxrjXuAKpzhS5/openapi.json
