# Polymarket Scraper - Odds, Volume & Liquidity (`goat255/polymarket-scraper`) Actor

Collect prediction market data with one clean row per market. Every row has the current odds for each outcome, implied probability, total and 24 hour volume, liquidity, spread and price movement.

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

## Pricing

$2.00 / 1,000 market scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Collect prediction market data with one clean row per market: the current odds for every outcome, volume, liquidity and price movement. No login and no API key.

### What it does

- **Odds for every outcome**, paired with the outcome name and its implied probability, so a row is readable without lining up two separate lists.
- **Leading outcome** picked out for you, with its price.
- **Order book snapshot** - best bid, best ask and the spread.
- **Volume over four windows** - total, 24 hours, one week and one month, plus liquidity.
- **Price movement** over one hour, 24 hours, one week and one month.
- **Days to close** worked out from the end date, so you can find markets about to resolve.
- **Filters** for keywords, minimum volume and minimum liquidity.

Odds move constantly, so schedule the run to build a history of how a market shifted.

Common uses: tracking sentiment on an event over time, research and analysis, building an odds dataset, monitoring markets about to resolve, and comparing implied probabilities against other sources.

### Input

| Field | Type | Description |
|---|---|---|
| `status` | string | `open`, `closed` or `all`. |
| `sort` | string | `volume`, `volume24h`, `liquidity`, `newest`, `ending_soonest`, `competitive`. |
| `keywords` | array | Only markets mentioning one of these words. |
| `minVolumeUsd` | integer | Only markets that have traded at least this much. |
| `minLiquidityUsd` | integer | Only markets with at least this much liquidity. |
| `activeOnly` | boolean | Skip markets that are not trading. Default true. |
| `groupByEvent` | boolean | Walk by event instead of by market. |
| `maxResults` | integer | Total cap. Default 500, up to 20000. |
| `proxyConfiguration` | object | Optional. Enable to spread requests across IPs. |

#### Example input

```json
{
  "status": "open",
  "sort": "volume24h",
  "keywords": ["election", "bitcoin"],
  "minVolumeUsd": 1000000,
  "maxResults": 1000
}
```

### Output

Each item is one market.

```json
{
  "id": "500001",
  "question": "Will the example event happen by the end of the year?",
  "slug": "will-the-example-event-happen",
  "event": "Example Event Group",
  "eventSlug": "example-event-group",
  "outcomes": [
    { "outcome": "Yes", "price": 0.4095, "impliedProbability": 0.4095 },
    { "outcome": "No", "price": 0.5905, "impliedProbability": 0.5905 }
  ],
  "topOutcome": "No",
  "topOutcomePrice": 0.5905,
  "lastTradePrice": 0.409,
  "bestBid": 0.409,
  "bestAsk": 0.41,
  "spread": 0.001,
  "volume": 159206438.42,
  "volume24h": 1584220.15,
  "volume1wk": 9930411.02,
  "volume1mo": 41220933.87,
  "liquidity": 6765642.38,
  "priceChange1h": 0.002,
  "priceChange24h": -0.011,
  "priceChange1wk": 0.043,
  "priceChange1mo": 0.087,
  "isActive": true,
  "isClosed": false,
  "acceptingOrders": true,
  "startDate": "2025-07-02T22:26:52Z",
  "endDate": "2026-07-20T00:00:00Z",
  "daysToClose": 1,
  "description": "The rules the market resolves by.",
  "resolutionSource": null,
  "imageUrl": "https://example.com/market.png",
  "url": "https://polymarket.com/event/example-event-group"
}
```

Prices are the market's own odds, between 0 and 1, so `0.5905` means the market is pricing that outcome at about 59 percent.

### Notes

- No login and no API key. Pick a status and run.
- Markets that are not trading carry outcome names but no prices. They are skipped by default; set `activeOnly` to false to include them.
- Both `slug` and `eventSlug` are returned raw alongside the link, so you can build any other address shape you need without running the scrape again.
- `groupByEvent` is the mode to use when you want every market under a large event rather than the biggest markets overall.
- Results are deduplicated, so a market seen twice while paging is delivered once and charged once.

To improve our actors we collect anonymized usage telemetry (run stats and input patterns). No personal account data is collected.

# Actor input Schema

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

Which markets to collect.

## `sort` (type: `string`):

How to order results.

## `keywords` (type: `array`):

Optional. Only return markets whose question, event or description contains one of these words.

## `minVolumeUsd` (type: `integer`):

Only markets that have traded at least this much in total.

## `minLiquidityUsd` (type: `integer`):

Only markets with at least this much liquidity.

## `activeOnly` (type: `boolean`):

Markets that are not trading carry outcome names but no prices. Leave this on to skip them.

## `groupByEvent` (type: `boolean`):

Collect markets through the events that group them. Useful when you want every market belonging to a big event rather than the highest volume markets overall.

## `maxResults` (type: `integer`):

Total cap for the run.

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

Optional. Enable to spread requests across IP addresses.

## Actor input object example

```json
{
  "status": "open",
  "sort": "volume",
  "keywords": [
    "election",
    "bitcoin"
  ],
  "activeOnly": true,
  "groupByEvent": false,
  "maxResults": 500
}
```

# Actor output Schema

## `markets` (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("goat255/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("goat255/polymarket-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 goat255/polymarket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=goat255/polymarket-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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