# Polymarket Scraper — Odds, Volume, Events & Price History (`tidyfeed/polymarket-scraper`) Actor

Open Polymarket prediction markets as a table: question, current odds, 24h and total volume, liquidity, resolution date and link, one row per market. Or one row per event with its leading option, or daily price history per outcome. Filter by keyword, tag, volume or links. Public API, no login.

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

## Pricing

from $1.40 / 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 — Odds, Volume, Events & Price History

**What does the crowd think will happen, how sure is it, and how much money says so?**

Every open market on Polymarket as a table you can sort: the question, the current odds as a percentage, how the odds moved in the last day and week, 24-hour and all-time volume, liquidity, when it resolves and a link. Or one row per event — the question page that groups related markets — with the option the crowd currently favours. Or the daily closing price of every outcome, for charts and backtests.

Filter by keyword, by Polymarket tag, by a volume floor, or hand it specific links. No login. No API key. No wallet. No proxies.

***

### Three modes

**Markets — one row per market.** The default. "Will X happen?" with its Yes price as a percentage, volume, liquidity and resolution date. Multi-option events (nominees, price ranges, dates) appear as one row per option with the parent event named.

**Events — one row per event.** The page you see on polymarket.com: title, category, how many markets it holds, which option leads and by how much, total and 24-hour volume, liquidity, open interest, comments.

**History — one row per day per outcome.** Daily closing prices for each outcome token of the markets in scope, for the last week, the last month or the market's whole life.

***

### What you get

#### Markets

**The question** — `question`, `eventTitle`, `option` (for multi-option events), `outcomes`, `tags`, `resolutionSource`, `description` (optional)

**The odds** — `prices` (per outcome, 0–1), `probabilityPercent` (first outcome, usually Yes), `lastTradePrice`, `bestBid`, `bestAsk`, `spread`, `priceChange24h` and `priceChange1w` (percentage points)

**The money** — `volumeTotal`, `volume24h`, `volume1w`, `volume1m`, `liquidity` (all USD)

**Timing and state** — `status` (`open`, `paused`, `closed`, `resolved`), `resolvedOutcome`, `startDate`, `endDate`, `daysToResolution`, `acceptingOrders`, `negRisk`

**Identifiers** — `marketUrl`, `eventSlug`, `marketSlug`, `marketId`, `conditionId`, `clobTokenIds`, `imageUrl`, `createdAt`, `updatedAt`

#### Events

`title`, `category`, `tags`, `marketsCount`, `openMarketsCount`, `leadingOption`, `leadingProbabilityPercent`, `volumeTotal`, `volume24h`, `volume1w`, `liquidity`, `openInterest`, `commentCount`, `status`, `startDate`, `endDate`, `daysToResolution`, `negRisk`, `eventUrl`, `eventSlug`, `eventId`, `imageUrl`, `createdAt`, `updatedAt`, `description` (optional)

#### History

`question`, `option`, `outcome`, `date`, `timestamp`, `price`, `probabilityPercent`, `marketUrl`, `marketSlug`, `eventSlug`, `clobTokenId`

***

### Typical uses

- **A daily odds sheet.** Markets mode, sorted by 24h volume, on a schedule — what the market is arguing about today and where the odds moved.
- **Track one question over time.** History mode on the event link, whole life — a chart-ready series per outcome.
- **Research a topic.** Keyword `fed rate` or tag `crypto`, all statuses — every market ever listed on it, with resolved outcomes for the closed ones.
- **Feed a model or an agent.** Clean numbers, no strings to parse: prices are numbers, volumes are USD, dates are ISO.

***

### Input

| Field | What it does |
|---|---|
| `mode` | `markets` (default), `events` or `history`. |
| `status` | `open` (default), `closed` or `all`. |
| `sortBy` | `volume24h` (default), `volume`, `liquidity`, `endingSoon`, `newest`. |
| `searchQuery` | Keyword, through Polymarket's own search. At most 100 events per query. |
| `tag` | A tag slug from the site's URLs: `politics`, `crypto`, `sports`, `business`, `science`, `culture`, `tech`, `world`. |
| `urls` | Event or market links to read exactly. Overrides keyword, tag and sort. |
| `minVolume` | Skip markets below this all-time volume in USD. |
| `maxItems` | Cap on rows returned, and on what you are billed. Default 100, up to 5,000. |
| `includeDescription` | Adds the full resolution rules as a column. |
| `historyRange` | `1w`, `1m` (default) or `max`. History mode only. |

***

### What it costs

**$2.00 per 1,000 markets**, **$5.00 per 1,000 events**, **$1.00 per 1,000 price-history rows**, plus $0.005 per run. Apify's Starter, Scale and Business plans get 10%, 20% and 30% off.

You pay for rows delivered. A keyword that matches nothing, a link that does not exist, or a filter that removes everything costs nothing.

***

### How it works

Polymarket's website is a front end on two public JSON APIs — one for markets, events, tags and search, one for price history per outcome token. Both answer without an account, a key or a wallet. This actor reads them, turns Polymarket's string-encoded arrays and decimal strings into real numbers, attaches each market to its parent event so tags and links are right, and hands back a flat table. No HTML is parsed and no browser is launched, so a redesign of the site does not break it.

***

### Honest limits

- **Prices are a snapshot at run time.** Odds move by the minute; the `updatedAt` column says when Polymarket last touched the row. Schedule the run if you want the curve.
- **`probabilityPercent` is the first outcome's price.** For a Yes/No market that is Yes. For a market with other outcome names (`Lions` / `Bills`) look at `outcomes` and `prices` side by side.
- **Keyword search returns at most 100 events**, the same limit the site has. `status` says so when it hits. Use a tag or a volume floor for broad topics.
- **Tags belong to events.** In plain markets mode (no keyword, no tag, no link) the `tags` column can be empty because Polymarket's market list does not carry them; use events mode or a tag filter when you need categories.
- **History is daily closes from Polymarket's order book**, one point per day per outcome. Markets without trades on a day have no point for that day. Very new markets may return no history yet; `status` counts those.
- **History grows fast, so `maxItems` is a hard stop.** An event link covers every option in that event, and each option costs one row per day per outcome — a 50-option election over a month is thousands of rows. The run stops at `maxItems`, keeps each outcome's series whole, and `status` says how many markets it got through. Link a single market, or raise the cap deliberately.
- **Closed markets show `resolvedOutcome` only when Polymarket has settled the payout** (one outcome priced at 1). A market that has ended but not yet settled shows `closed` with no outcome.
- **Polymarket restricts access from some countries** (HTTP 451). Apify's servers are not affected; a local run from a restricted region will be.

***

### Scheduling

Odds change daily. Schedule markets mode on your filters and each run adds a dated snapshot; schedule history mode weekly on the events you follow and you keep the full series without gaps.

***

### Legal

This actor reads only Polymarket's public APIs, the same ones its website calls for any visitor, without authentication. It requires no account and bypasses no access control. Market data is public information about a public marketplace; the actor returns no user or wallet data. You remain responsible for how you use the exported data, including any local rules on prediction markets.

***

Questions, or a market that behaves oddly? Open an issue on the actor — issues are read and answered.

# Actor input Schema

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

"Markets" gives one row per market with its current odds, volume and liquidity. "Events" gives one row per event (a question page that can hold several markets) with its leading option. "History" gives one row per day per outcome — the daily closing price of each market in scope.

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

"Open" is what is trading now. "Closed" is what has finished, with the resolved outcome where Polymarket has settled it. "All" is both.

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

Which markets come first when the cap cuts the list. "24h volume" is what is hot today; "Total volume" is the big markets; "Liquidity" is where orders are deep; "Ending soon" is what resolves next; "Newest" is what was just listed.

## `searchQuery` (type: `string`):

Only markets whose event matches this keyword, through the same search the Polymarket site uses — e.g. "bitcoin", "fed rate", "election". Search returns at most 100 events. Leave empty to list everything.

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

A Polymarket tag slug as it appears in the site's URLs: politics, crypto, sports, business, science, culture, tech, world … Leave empty for all tags.

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

Event or market pages to read exactly: https://polymarket.com/event/<event> or https://polymarket.com/event/<event>/<market>. A bare event slug works too. When given, keyword, tag and sort are ignored and only these pages are read.

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

Skip markets whose all-time volume is below this. 0 for no floor. 10000 removes most of the long tail.

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

Cap on rows returned, and on what you are charged. In history mode one market gives one row per day per outcome, so an event with many options reaches this cap quickly — raise it for a longer or wider history. Polymarket lists thousands of open markets; the default 100 covers the ones that matter today.

## `includeDescription` (type: `boolean`):

Adds a description column with the market's or event's resolution text. Off by default to keep spreadsheets readable.

## `historyRange` (type: `string`):

How far back the daily prices go: last week, last month, or the market's whole life.

## Actor input object example

```json
{
  "mode": "markets",
  "status": "open",
  "sortBy": "volume24h",
  "searchQuery": "bitcoin",
  "tag": "politics",
  "urls": [
    "https://polymarket.com/event/democratic-presidential-nominee-2028"
  ],
  "minVolume": 0,
  "maxItems": 100,
  "includeDescription": false,
  "historyRange": "1m"
}
```

# Actor output Schema

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

No description

## `rowsCsv` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyfeed/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("tidyfeed/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 '{}' |
apify call tidyfeed/polymarket-scraper --silent --output-dataset

```

## MCP server setup

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