# Polymarket Scraper - Odds, Volume & Order Books (`crawloop/polymarket-scraper`) Actor

Scrape Polymarket prediction markets for odds, 24h volume, liquidity, order books, trades, and wallets. Unofficial Polymarket API alternative - no login. Export JSON for Python, Node.js, and MCP.

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

## Pricing

from $1.19 / 1,000 result rows

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Polymarket Scraper — Prediction Market Odds, Volume & Order Books

> Unofficial community Actor. Not affiliated with Polymarket.

**Polymarket scraper** for prediction-market **odds**, **24h volume**, **liquidity**, **order books**, **trades**, and **wallets** across politics, sports, crypto, and elections. It reads the public Gamma, CLOB, and Data APIs — no login, no wallet, no browser — so you can **scrape Polymarket with Python or Node.js**, call it from **MCP** / AI assistants, or treat it as a **Polymarket API alternative**. Export the dataset as JSON, CSV, or Excel.

### Related suite

| Actor | Role |
| --- | --- |
| Polymarket Scraper ◄── you are here | Prediction-market odds, books, trades, wallets |
| [PrizePicks Player Props Scraper](https://apify.com/crawloop/prizepicks-player-props-scraper) | DFS player-prop lines |
| [Betr Picks Scraper](https://apify.com/crawloop/betr-picks-scraper) | Betr pick'em board |
| [DraftKings Pick6 Scraper](https://apify.com/crawloop/draftkings-pick6-scraper) | Pick6 player props |
| [Underdog Props Scraper](https://apify.com/crawloop/underdog-fantasy-player-props-scraper-real-time-lines-odds) | Underdog fantasy lines |
| [DFS Multi-Source Props Scraper](https://apify.com/crawloop/dfs-multi-source-props-scraper) | Cross-platform prop comparison |

**Suite next step:** after sports markets on Polymarket, run [DFS Multi-Source Props Scraper](https://apify.com/crawloop/dfs-multi-source-props-scraper) for the same slate on PrizePicks / Underdog / Pick6.

> **Disclaimer:** This Actor is provided **for informational and research purposes only**. It does not provide trading or betting advice. You are responsible for complying with applicable laws and platform terms. No warranty as to accuracy or continued availability.

### When to use

- Snapshot **active Polymarket markets** (politics, sports, crypto, elections) with prices and volume
- Resolve **event URLs or slugs** into structured odds rows
- Pull **CLOB order books** (bids, asks, spread, mid) for market-making or alerts
- Stream **recent trades** or filter whale fills by notional
- Read a **wallet’s positions / PnL** or the public **trader leaderboard**
- Archive **price history** and **resolved markets** for research

**When not to use:** placing or cancelling orders (this Actor is read-only). For DFS player props rather than prediction markets, use the suite Actors above.

### Key features

- **Zero-config default** — top active markets by 24h volume
- **URL + slug input** — paste event links or slugs
- **Category shortcuts** — politics, sports, crypto, nba, nfl, elections, …
- **Twelve modes** — markets, events, search, orderbook, trades, tags, sports, prices\_history, holders, wallet, leaderboard, auto
- **Sports live flag + score** when Gamma provides them
- **HTTP-only** — public APIs, proxy optional
- **Normalized rows** with a `kind` discriminator for mixed exports

### Input

| Field | Description | Default |
| --- | --- | --- |
| `mode` | `markets` / `events` / `search` / `orderbook` / `trades` / `tags` / `sports` / `prices_history` / `holders` / `wallet` / `leaderboard` / `auto` | `markets` |
| `startUrls` | Event/market URLs, slugs, or `0x` wallets | — |
| `queries` | Slugs or keywords. Empty = bulk list | — |
| `category` | Tag shortcut (`politics`, `sports`, `crypto`, …) | — |
| `tagId` | Raw Gamma tag ID | — |
| `status` | `active` / `closed` / `all` | `active` |
| `itemType` | `markets` or `events` grain | `markets` |
| `sortBy` | `volume24hr`, `volume`, `liquidity`, dates | `volume24hr` |
| `maxItems` | Dataset cap | `100` |
| `minVolume24h` / `minLiquidity` / `minTotalVolume` | USD filters | `0` |
| `explodeOutcomes` | One row per Yes/No (or team) | `false` |
| `includeOrderBook` | Attach CLOB books to market rows | `false` |
| `walletAddress` | Proxy wallet for `wallet` mode | — |
| `proxyConfiguration` | Optional; default off | off |

#### Example — top active markets

```json
{
  "mode": "markets",
  "maxItems": 100,
  "sortBy": "volume24hr"
}
```

#### Example — politics markets with a volume floor

```json
{
  "mode": "markets",
  "category": "politics",
  "minVolume24h": 1000,
  "maxItems": 50
}
```

#### Example — event URL

```json
{
  "mode": "auto",
  "startUrls": [
    { "url": "https://polymarket.com/event/fed-decision-in-october" }
  ]
}
```

#### Example — order book

```json
{
  "mode": "orderbook",
  "queries": ["fed-decision-in-october"],
  "orderBookDepth": 20
}
```

#### Example — whale trades

```json
{
  "mode": "trades",
  "maxItems": 100,
  "minTradeSize": 10000
}
```

#### Example — wallet positions

```json
{
  "mode": "wallet",
  "walletAddress": "0x56687bf447db6ffa42ffe2204a05edaa20f55839",
  "includeTrades": true,
  "maxItems": 50
}
```

### Output

Every row has `kind` plus `scrapedAt`. Market rows include:

| Field | Description |
| --- | --- |
| `kind` | `market` / `event` / `outcome` / `orderbook` / `trade` / `holder` / `position` / `tag` / `sport` / `price_point` / `leaderboard` |
| `question` / `title` / `slug` / `url` | Identity and event link |
| `primaryPrice` / `yesPrice` / `noPrice` / `outcomes` | Implied probabilities (0–1); `yesPrice` only when the outcome is Yes/Up |
| `bestBid` / `bestAsk` / `spread` / `lastTradePrice` | CLOB top of book |
| `volume` / `volume24hr` / `liquidity` | USD volume and depth |
| `category` / `tags` | Gamma labels |
| `live` / `score` | Sports in-play fields when present |
| `conditionId` / `clobTokenIds` | On-chain / CLOB identifiers |
| `endDate` / `closed` / `active` | Status and schedule |

#### Sample market row

```json
{
  "kind": "market",
  "question": "Will Bitcoin reach $100K by December 31?",
  "slug": "will-bitcoin-reach-100k-by-december-31",
  "url": "https://polymarket.com/event/will-bitcoin-reach-100k-by-december-31",
  "category": "Crypto",
  "yesPrice": 0.62,
  "noPrice": 0.38,
  "volume24hr": 1250000.5,
  "liquidity": 480000.0,
  "bestAsk": 0.63,
  "spread": 0.01,
  "active": true,
  "closed": false,
  "endDate": "2026-12-31T00:00:00Z"
}
```

### Use cases

- **Odds dashboards** — scheduled snapshots of top markets by 24h volume
- **Sports screens** — live flag, score, and moneyline prices
- **Research / backtests** — closed markets + price history
- **Whale watch** — trades filtered by notional
- **Copy-trade research** — leaderboard wallets → positions
- **Alerts** — poll a slug and diff `yesPrice` / `volume24hr`

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/polymarket-scraper').call({
  mode: 'markets',
  category: 'politics',
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/polymarket-scraper").call(run_input={
    "mode": "search",
    "queries": ["trump"],
    "maxItems": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("question") or item.get("title"), item.get("yesPrice"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~polymarket-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"markets","category":"sports","maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID / name.

Example prompts:

- "Run Polymarket Scraper for the top 20 active politics markets and return question, yesPrice, and volume24hr as JSON"
- "Scrape the Polymarket event URL I paste and summarize outcomes, liquidity, and end date"
- "Chain Polymarket Scraper sports markets then DFS Multi-Source Props Scraper for the same NBA slate"

### FAQ

**Is this a Polymarket API alternative?**\
Yes for **read-only** public data: markets, events, books, trades, holders, wallets, and leaderboard. Trading (place/cancel) is out of scope.

**How do I scrape Polymarket with Python?**\
Call `crawloop/polymarket-scraper` via the Apify Python client (example above). Default `mode: markets` returns the top active markets by 24h volume as JSON.

**Can I get Polymarket order book data?**\
Yes — `mode: orderbook` with a slug or event URL, or set `includeOrderBook: true` on market rows.

**Do I need an API key or wallet?**\
No. Gamma, public CLOB reads, and the Data API do not require credentials.

**Do I need a proxy?**\
Usually no. Enable Apify Proxy only if you hit rate limits on large crawls.

**How do I scrape one event?**\
Paste the event URL in `startUrls`, or put the slug in `queries`.

**How are prices quoted?**\
Outcome prices are probabilities in `0–1` (e.g. `0.62` = 62¢ / 62%).

**Can I get resolved / historical markets?**\
Set `status: closed` and optionally `mode: prices_history` with a slug.

**What is `kind`?**\
A discriminator so mixed runs (markets + trades, or exploded outcomes) stay filterable in one dataset.

### Related Actors

| Actor | Role |
| --- | --- |
| [PrizePicks Player Props Scraper](https://apify.com/crawloop/prizepicks-player-props-scraper) | PrizePicks lines |
| [DFS Multi-Source Props Scraper](https://apify.com/crawloop/dfs-multi-source-props-scraper) | Multi-book DFS comparison |
| [FotMob Scraper](https://apify.com/crawloop/fotmob-scraper) | Scores, fixtures, match stats |

# Actor input Schema

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

What to collect. auto picks from URLs / queries / wallet. Default markets = top active prediction markets by 24h volume.

## `startUrls` (type: `array`):

Event or market page URLs, slugs, or 0x wallet / condition IDs. Example: https://polymarket.com/event/fed-decision-in-october

## `queries` (type: `array`):

Market/event slugs or keywords (e.g. trump, btc-updown-5m). Empty in markets mode = bulk top markets.

## `category` (type: `string`):

Shortcut for a Polymarket tag: politics, sports, crypto, elections, nba, nfl, soccer, finance, weather, ai, …

## `tagId` (type: `integer`):

Raw Gamma tag ID if you need a tag outside the category shortcuts. Use tags mode to discover IDs.

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

Active (open) is the default. Closed returns resolved markets.

## `itemType` (type: `string`):

markets = one row per tradable question. events = one row per event group (e.g. election winner basket).

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

Gamma sort field for bulk market/event lists.

## `ascending` (type: `boolean`):

Default false = highest volume / newest first.

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

Hard cap on dataset rows. 0 = generous internal cap (not unlimited).

## `minVolume24h` (type: `number`):

Drop thin markets below this 24h traded volume.

## `minLiquidity` (type: `number`):

Drop markets with resting CLOB liquidity below this.

## `minTotalVolume` (type: `number`):

Drop markets with lifetime volume below this.

## `minTradeSize` (type: `number`):

Trades mode: keep fills with size × price at least this (whale filter).

## `explodeOutcomes` (type: `boolean`):

Split Yes/No (or team) outcomes into separate rows.

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

Fetch CLOB bids/asks for each market (slower). Use orderbook mode for book-only rows.

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

How many bid/ask levels to keep. 0 = full book.

## `onlyLive` (type: `boolean`):

Keep events/markets where live=true (in-play).

## `sportsCatalog` (type: `boolean`):

In sports mode with empty queries, output the league catalog instead of sports events.

## `walletAddress` (type: `string`):

Polymarket proxy wallet (0x…) for wallet mode — positions and optional trades.

## `includeTrades` (type: `boolean`):

Wallet mode: also pull recent fills for that address.

## `priceInterval` (type: `string`):

CLOB prices-history interval.

## `priceFidelity` (type: `integer`):

CLOB history fidelity (minutes). Higher = coarser.

## `leaderboardPeriod` (type: `string`):

Time window for trader rankings: today, this week, this month, or all time.

## `leaderboardOrderBy` (type: `string`):

Rank traders by profit/loss or by traded volume.

## `leaderboardCategory` (type: `string`):

Market category for the trader leaderboard (OVERALL or a vertical such as POLITICS / SPORTS).

## `requestDelaySecs` (type: `number`):

Throttle between public API calls.

## `proxyConfiguration` (type: `object`):

Optional. Polymarket Gamma, CLOB, and Data APIs are public — proxy is rarely needed.

## Actor input object example

```json
{
  "mode": "markets",
  "startUrls": [],
  "queries": [],
  "category": "",
  "tagId": 0,
  "status": "active",
  "itemType": "markets",
  "sortBy": "volume24hr",
  "ascending": false,
  "maxItems": 100,
  "minVolume24h": 0,
  "minLiquidity": 0,
  "minTotalVolume": 0,
  "minTradeSize": 0,
  "explodeOutcomes": false,
  "includeOrderBook": false,
  "orderBookDepth": 10,
  "onlyLive": false,
  "sportsCatalog": false,
  "walletAddress": "",
  "includeTrades": false,
  "priceInterval": "1d",
  "priceFidelity": 60,
  "leaderboardPeriod": "MONTH",
  "leaderboardOrderBy": "PNL",
  "leaderboardCategory": "OVERALL",
  "requestDelaySecs": 0.05,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items.

# 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("crawloop/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("crawloop/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 crawloop/polymarket-scraper --silent --output-dataset

```

## MCP server setup

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