# Polymarket Scraper | $1 / 1k | Fast & Reliable (`fatihtahta/polymarket-scraper-ppe`) Actor

Get live prediction market data from Polymarket with tickers, categories, prices, and volume metrics. $2 per 1000 results. Fast, reliable, and structured for analysis. Ideal for traders, researchers, and data teams.

- **URL**: https://apify.com/fatihtahta/polymarket-scraper-ppe.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 44 total users, 3 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.99 / 1,000 results

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/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 | Fast & Reliable

### Overview

Polymarket is a prediction market where traders price real-world outcomes in real time. This actor collects structured market records from Polymarket search results, category pages, and individual event pages so you can monitor prices, liquidity, volume, and market context without manual browsing.

Use it for active market discovery, resolved market research, category tracking, event-level analysis, dashboards, alerts, and downstream modeling.

### What You Can Scrape

- Search queries such as `bitcoin`, `US election`, or `NBA Finals`
- Polymarket search URLs such as `https://polymarket.com/?_q=bitcoin`
- Topic and category URLs such as `https://polymarket.com/predictions/iran`, `https://polymarket.com/crypto`, `https://polymarket.com/politics`, or `https://polymarket.com/sports/live`
- Event URLs such as `https://polymarket.com/event/when-will-bitcoin-hit-150k`

Search and category runs save one record per active or resolved market, depending on your status filter. Exact topic queries and `/predictions/...` URLs use Polymarket's topic feed first; if a query does not match a topic feed, the actor falls back to keyword search. Event URL runs also include a recent trade snapshot when Polymarket provides it. If multiple inputs discover the same market in one run, the actor saves it once so the dataset stays clean and pay-per-event charging does not double-count the same market.

### Input Parameters

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `startUrls` | array of strings | Polymarket search, category, sports category, or event URLs to scrape. | - |
| `queries` | array of strings | Search phrases used to discover matching Polymarket events and markets. | - |
| `status` | string | Market lifecycle filter: `active` or `resolved`. | `active` |
| `sortBy` | string | Sort order for discovery: `volume_24hr`, `volume`, `liquidity`, `start_date`, `ending_soon`, or `competitive`. | `volume_24hr` |
| `frequency` | string | Volume window for volume-based sorting: `all`, `daily`, `weekly`, or `monthly`. | `all` |
| `limit` | integer | Maximum number of market records to save. | `50000` |
| `proxyConfiguration` | object | Connection settings. Apify Residential proxy is preselected for stable runs. | Apify Residential proxy |

### Example Inputs

Search by query:

```json
{
  "queries": ["bitcoin"],
  "status": "active",
  "sortBy": "volume_24hr",
  "frequency": "daily",
  "limit": 100
}
```

Scrape a category URL:

```json
{
  "startUrls": ["https://polymarket.com/crypto"],
  "status": "active",
  "sortBy": "volume_24hr",
  "frequency": "daily",
  "limit": 100
}
```

Scrape an event URL:

```json
{
  "startUrls": ["https://polymarket.com/event/when-will-bitcoin-hit-150k"],
  "limit": 100
}
```

### Example Output

```json
{
  "source": "polymarket",
  "record_type": "market",
  "market_id": "573655",
  "event_id": "36173",
  "url": "https://polymarket.com/event/when-will-bitcoin-hit-150k",
  "question": "Will Bitcoin hit $150k by June 30, 2026?",
  "event_title": "When will Bitcoin hit $150k?",
  "market_status": "active",
  "source_context": {
    "seed_type": "search_query",
    "seed_value": "bitcoin",
    "search_query": "bitcoin",
    "input_type": "search",
    "page_index": 1,
    "status_filter": "active"
  },
  "event": {
    "id": "36173",
    "title": "When will Bitcoin hit $150k?",
    "slug": "when-will-bitcoin-hit-150k",
    "description": "When will Bitcoin hit $150k",
    "timestamps": {
      "start_date": "2025-08-07T16:32:57.401533Z",
      "updated_at": "2026-05-19T21:36:11.190006Z"
    },
    "metrics": {
      "volume": 18360481.244939998,
      "open_interest": 560747.9081219999,
      "liquidity": 49842.41715,
      "volume_24h": 5821943.554085
    },
    "flags": {
      "active": true,
      "closed": false
    },
    "tags": [
      {
        "id": "235",
        "label": "Bitcoin",
        "slug": "bitcoin"
      },
      {
        "id": "21",
        "label": "Crypto",
        "slug": "crypto"
      }
    ]
  },
  "market": {
    "id": "573655",
    "question": "Will Bitcoin hit $150k by June 30, 2026?",
    "slug": "will-bitcoin-hit-150k-by-june-30-2026",
    "condition_id": "0xa0f4c4924ea1a8b410b4ce821c2a9955fad21a1b19bdcfde90816732278b3dd5",
    "outcomes": [
      {
        "name": "Yes",
        "price": 0.0135
      },
      {
        "name": "No",
        "price": 0.9865
      }
    ],
    "pricing": {
      "last_trade_price": 0.014,
      "best_ask": 0.014,
      "best_bid": 0.013,
      "favorite_outcome": "No",
      "favorite_price": 0.9865,
      "spread": 0.001
    },
    "timestamps": {
      "start_date": "2025-08-07T16:29:22.979697Z",
      "end_date": "2026-07-01T04:00:00Z"
    },
    "metrics": {
      "volume": 15734008.014241
    },
    "flags": {
      "active": true,
      "closed": false
    },
    "rules": {
      "description": "This market resolves based on whether the specified Bitcoin price threshold is reached before the listed deadline."
    }
  }
}
```

Event URL records use the same market shape and include `trade_history` when recent trade data is available.

### Output Notes

- `source` identifies the platform. The input path is stored in `source_context.input_type`.
- `source_context` contains provenance such as seed type, seed value, page index, category, search query, and status filter.
- `url` is the usable Polymarket event URL for the market record.
- `event` contains event-level metadata, timestamps, media, metrics, flags, tags, and source-specific attributes.
- `market` contains market-level IDs, question text, outcomes, pricing, timestamps, metrics, flags, rules, resolution data, trading settings, and source-specific attributes.
- `market.outcomes` pairs each outcome name with its current price for easier downstream use.
- Duplicate market IDs are skipped within a run, even when multiple inputs overlap.
- Debug, retry, and diagnostic information is not mixed into the default dataset.

### Notes & Limitations

- Polymarket data changes quickly; repeated runs can produce different prices, volumes, or trade history.
- Event pages can contain fewer markets than your requested `limit`.
- Trade snapshots are best-effort and only included for event URL inputs.
- Review Polymarket's terms of service and applicable local rules before redistributing or commercializing data.

### Support

Questions or custom needs? Open an issue on the actor page in Apify Console.

# Actor input Schema

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

Paste one or more Polymarket URLs. Search, predictions, and category URLs discover matching markets, while event URLs focus the run on markets connected to a specific event.

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

Enter one or more phrases, such as market topics, teams, assets, people, or events. Exact topic-style queries use Polymarket's topic feed first; broader phrases fall back to keyword search.

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

Select active markets for current pricing and volume signals, or resolved markets for historical outcome research.

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

Choose how matching markets are ordered before records are saved. Activity-based sorting is useful for monitoring momentum, while date-based sorting is useful for newly listed or soon-ending markets.

## `frequency` (type: `string`):

Select the activity window used by volume-based sorting. Shorter windows highlight recent movement; longer windows favor markets with sustained interest.

## `limit` (type: `integer`):

Stop the run after this many market records have been saved. Lower limits are useful for quick tests; higher limits collect a larger market dataset.

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

Choose a proxy configuration when you need more controlled connection behavior. Leave the default in place unless your workflow requires a different network setup.

## Actor input object example

```json
{
  "startUrls": [
    "https://polymarket.com/?_q=new+york"
  ],
  "status": "active",
  "sortBy": "volume_24hr",
  "frequency": "all",
  "limit": 50000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        "https://polymarket.com/?_q=new+york"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/polymarket-scraper-ppe").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 = { "startUrls": ["https://polymarket.com/?_q=new+york"] }

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/polymarket-scraper-ppe").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 '{
  "startUrls": [
    "https://polymarket.com/?_q=new+york"
  ]
}' |
apify call fatihtahta/polymarket-scraper-ppe --silent --output-dataset

```

## MCP server setup

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

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/cHDzCloxRuE1jFshe/builds/kelS1Fb4jjRORVNa8/openapi.json
