# Polymarket Scraper: Prediction Market Odds & Prices (`tidyharvest/polymarket-scraper`) Actor

Live Polymarket odds by keyword, tag or URL: outcome prices and probabilities, 24h/total volume, liquidity, end date, resolution and winner, optional price history and a free order book. Searches keep only markets matching every word. No key. $1.20 per 1,000 markets.

- **URL**: https://apify.com/tidyharvest/polymarket-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (community)
- **Categories:** News, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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: Prediction Market Odds & Prices

Get **live Polymarket odds** for any topic. Search prediction markets by **keyword, tag or URL**, filter by **open / resolved, volume, liquidity and end date**, and get clean rows with every **outcome price and implied probability, 24h and total volume, liquidity, end date, resolution status, winning outcome, event and URL**. Optional **price history** per outcome and a free **order-book snapshot**. **$1.20 per 1,000 markets** (less on paid plans), no API key, no login, no wallet.

The numbers are Polymarket's own public market data, so they match polymarket.com. Read-only: it never trades.

Also want Kalshi? See the sibling [Kalshi Scraper](https://apify.com/tidyharvest/kalshi-scraper): same filters and output style, so you can compare odds across both exchanges.

### What you can do with it

- **Track odds on what you care about:** elections, Fed decisions, crypto prices, sports, AI, geopolitics. Run it hourly or daily and chart probabilities over time.
- **Find the busiest markets:** sort the whole exchange by 24h volume or liquidity, or list what resolves this week.
- **Research and backtesting:** pull resolved markets with their winning outcome and full price history to study how well the crowd forecast.
- **Arbitrage and cross-market checks:** compare Polymarket prices with Kalshi, sportsbooks or your own model; the order book shows real bid/ask depth.
- **Feeds for dashboards, newsletters, bots and AI agents:** one tidy JSON row per market, ready for Sheets, a database or an LLM.

### How to use it

1. Type **search keywords** (e.g. `fed rates`), or a **tag** (`politics`, `crypto`, `sports`...), or paste **Polymarket URLs**. Leave all empty to browse the whole exchange.
2. Pick **status** (open, closed, both), **sort**, and optional minimum volume / liquidity and end-date range.
3. Turn on **price history** or the **order book** if you need them, then click **Start**. Download JSON, CSV or Excel, or connect to Sheets, Zapier or an API.

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keyword searches, same as polymarket.com search. One per line. |
| `tag` | Polymarket tag slug or name: `politics`, `crypto`, `sports`, `economy`, `elections`, `tech`... |
| `urls` | Event or market URLs (`https://polymarket.com/event/...`) or bare slugs. Returns open and resolved markets unless `status` is set. |
| `status` | `open` (default), `closed` (resolved) or `all`. |
| `sortBy` | `volume24hr` (default), `volume`, `liquidity`, `endingSoon`, `newest`. |
| `minVolume` / `minVolume24h` / `minLiquidity` | Minimums in USD. |
| `endDateFrom` / `endDateTo` | Market end (resolution) date window. |
| `excludeKeywords` | Drop markets mentioning these words (before billing), e.g. `up or down`. |
| `includePriceHistory` | Adds `priceHistory` to each outcome. Window `historyInterval` (`1h`...`1w`, `1m`, `max`), spacing `historyFidelityMinutes` (default 60), cap `maxHistoryPointsPerOutcome` (default 200). |
| `includeOrderBook` | Adds a live order-book snapshot to each outcome of open markets (`orderBookDepth` levels, default 10). Free. |
| `maxItems` | Cap on markets per run (default 50, up to 10,000). Also caps your cost. |

Example:

```json
{ "searchQueries": ["fed rates"], "status": "open", "sortBy": "volume", "minLiquidity": 10000, "includePriceHistory": true, "historyInterval": "1w", "historyFidelityMinutes": 1440, "maxItems": 20 }
```

### Output

One item per market:

```json
{
  "marketId": "574073",
  "question": "Will there be no change in Fed interest rates after the October 2026 meeting?",
  "slug": "will-there-be-no-change-in-fed-interest-rates-after-the-october-2026-meeting",
  "url": "https://polymarket.com/event/fed-decision-in-october/will-there-be-no-change-in-fed-interest-rates-after-the-october-2026-meeting",
  "eventId": "27824", "eventTitle": "Fed Decision in October?", "eventSlug": "fed-decision-in-october",
  "groupItemTitle": "No change",
  "outcomes": [
    {"name": "Yes", "price": 0.715, "probabilityPct": 71.5, "tokenId": "1043...",
     "priceHistory": [{"t": "2026-10-14T00:00:00Z", "p": 0.70}, {"t": "2026-10-15T00:00:00Z", "p": 0.715}],
     "orderBook": {"bestBid": 0.71, "bestAsk": 0.72, "bids": [{"price": 0.71, "size": 5120.0}], "asks": [{"price": 0.72, "size": 3300.5}], "bidDepthTotal": 98000.1, "askDepthTotal": 87000.4, "timestamp": "2026-10-15T23:00:00Z"}},
    {"name": "No", "price": 0.285, "probabilityPct": 28.5, "tokenId": "8813..."}
  ],
  "yesPrice": 0.715,
  "lastTradePrice": 0.72, "bestBid": 0.71, "bestAsk": 0.72, "spread": 0.01,
  "oneHourPriceChange": 0.005, "oneDayPriceChange": -0.02, "oneWeekPriceChange": 0.04,
  "volume": 1066306.28, "volume24h": 85210.5, "volume1w": 410000.0, "volume1m": 900000.0,
  "liquidity": 256211.45, "openInterest": 1200000.0,
  "startDate": "2026-06-17T19:03:23Z", "endDate": "2026-10-28T00:00:00Z", "createdAt": "2026-06-17T19:03:24Z", "closedTime": null,
  "active": true, "closed": false, "acceptingOrders": true,
  "resolutionStatus": null, "winningOutcome": null,
  "negRisk": true, "category": null, "tags": ["Economy", "Fed Rates"],
  "description": "This market will resolve to \"Yes\" if ...",
  "resolutionSource": "https://www.federalreserve.gov/...",
  "conditionId": "0x...", "image": "https://polymarket-upload.s3...png",
  "scrapedAt": "2026-10-15T23:00:00Z",
  "source": "Polymarket",
  "input": "search: fed rates"
}
```

- `price` is the outcome's last price in USDC (0 to 1), which is also the market's implied probability; `probabilityPct` is the same as a percent.
- For resolved markets `winningOutcome` is the outcome that settled at ~$1, and `resolutionStatus` is Polymarket's UMA status (`resolved`, `proposed`...).
- Multi-outcome events (e.g. "Who will win the election?") are returned as one market per candidate, each with its `groupItemTitle` and shared `eventTitle`.

### Pricing

Pay per result, with lower prices on paid Apify plans:

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Market (`market-scraped`) | $1.20 / 1,000 | $1.10 / 1,000 | $1.00 / 1,000 | $0.90 / 1,000 |
| Price point (`price-point`, only with price history on) | $0.15 / 1,000 | $0.14 / 1,000 | $0.12 / 1,000 | $0.10 / 1,000 |

Order-book snapshots are **free**. Filters and `maxItems` apply before you are charged. Example: 100 open markets with a week of hourly history on both outcomes (~336 points each) on the free plan is about $0.12 + $5.04; switch to daily points (`historyFidelityMinutes: 1440`) and it drops to about $0.12 + $0.21. A run that finds nothing fails instead of silently returning an empty dataset.

### Limits and notes

- Data is Polymarket's public market data, read through its documented, keyless APIs. Polymarket throttles each IP (e.g. 300 requests / 10 s on market listings, 1,000 / 10 s on price history); this actor makes requests one at a time and stays well under those limits.
- Keyword searches return the best matches first (up to a few hundred markets per search), then apply your filters and sort.
- Prices update constantly; each row has `scrapedAt`. Volumes and liquidity are in USD (USDC).
- `liquidity` and 24h volume are not reported for long-closed markets.
- This actor reads market data only. It does not place trades, connect a wallet or read anyone's positions.

Data source: Polymarket's public market data. Each row links back to its market page. This actor is not affiliated with or endorsed by Polymarket. Nothing here is financial advice.

# Actor input Schema

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

Find markets by keyword, the same search as on polymarket.com (e.g. `fed rates`, `bitcoin`, `election`). One search per line. Empty = browse all markets (optionally by tag).

## `matchAllWords` (type: `boolean`):

Keep only markets whose question, event title or outcome contains every word of your search (any case; `rates` also matches `rate`). Polymarket's own search also returns loose matches: `taylor swift` brings NFL players named Swift or Taylor. Turn off to get the site's full result list.

## `tag` (type: `string`):

Only markets with this Polymarket tag, by slug or name: `politics`, `crypto`, `sports`, `economy`, `elections`, `tech`, `geopolitics`, `ai`... Works for browsing and narrows keyword searches.

## `urls` (type: `array`):

Specific events or markets: `https://polymarket.com/event/<event-slug>` (all its markets), `.../event/<event>/<market-slug>` (one market), or a bare slug. Open and resolved markets are both returned (Status `closed` keeps only resolved ones).

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

Open markets, closed (resolved) markets, or both.

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

Order of results. For keyword searches the best matches are fetched first, then sorted.

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

Skip markets with less lifetime trading volume.

## `minVolume24h` (type: `integer`):

Skip markets with less trading volume in the last 24 hours.

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

Skip thin markets with less liquidity on the order book.

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

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

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

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

## `excludeKeywords` (type: `array`):

Drop markets whose question, event or description mentions any of these (applied before billing). E.g. `up or down` to skip 15-minute crypto markets.

## `includePriceHistory` (type: `boolean`):

Add a price (probability) time series to each outcome from Polymarket's CLOB. Billed per price point (see Pricing).

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

How far back the price history goes.

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

Spacing between price points in minutes (60 = hourly, 1440 = daily).

## `maxHistoryPointsPerOutcome` (type: `integer`):

Keep only the most recent N points per outcome. Caps the price-point cost.

## `includeOrderBook` (type: `boolean`):

Add a live order-book snapshot (best bid/ask, top levels, total depth) to each outcome of open markets. No extra charge.

## `orderBookDepth` (type: `integer`):

How many bid and ask levels to keep per outcome.

## `maxItems` (type: `integer`):

Cap on markets per run (shared across searches/URLs). Also caps your cost.

## Actor input object example

```json
{
  "searchQueries": [
    "fed rates"
  ],
  "matchAllWords": true,
  "status": "open",
  "sortBy": "volume24hr",
  "includePriceHistory": false,
  "historyInterval": "1w",
  "historyFidelityMinutes": 60,
  "maxHistoryPointsPerOutcome": 200,
  "includeOrderBook": false,
  "orderBookDepth": 10,
  "maxItems": 20
}
```

# Actor output Schema

## `markets` (type: `string`):

Polymarket prediction markets with outcome prices, volume, liquidity and status, one item per market.

# 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 = {
    "searchQueries": [
        "fed rates"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/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 = {
    "searchQueries": ["fed rates"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/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 '{
  "searchQueries": [
    "fed rates"
  ],
  "maxItems": 20
}' |
apify call tidyharvest/polymarket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyharvest/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/oja5c05tIjpDZiPn1/builds/uo1ogcxlfBVWK4rwK/openapi.json
