Polymarket Markets & Events Scraper

Export public Polymarket markets, outcome prices, volume, liquidity, tags, and event context. Filter records and download CSV, Excel, or JSON, or use the API.

Data fields

FieldTypeDescription
marketIdstringPublic market identifier.
conditionIdstring | nullMarket condition identifier when supplied.
questionstringPublic market question or title.
slugstring | nullHuman-readable market identifier when supplied.
urlstring | nullPublic market URL assembled from event and market slugs.
eventIdstring | nullIdentifier of the first associated event, when available.
eventTitlestring | nullTitle of the first associated event, when available.
eventSlugstring | nullSlug of the first associated event, when available.

Input preview

querySearch query
statusMarket status
maxItemsMaximum markets
sortBySort by
categoryOrTagCategory or tag
minVolumeMinimum volume

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Export public Polymarket markets and event context as structured JSON, CSV, or Excel. Collect questions, outcome prices, volume, liquidity, dates, categories, and tags for research or a downstream data pipeline.

This is a snapshot exporter, not a trading bot, price-history service, or recommendation engine. One dataset row represents one market; event fields describe its first associated event.

Input recipes

Start with a small unfiltered sample. Paste this JSON into the Actor input, run it, then open the dataset to inspect and export the results.

{
  "status": "active",
  "maxItems": 10,
  "sortBy": "volume",
  "includeRaw": false
}

Example output

Illustrative, shortened record—not live market data. Actual records include all fields listed below.

{
  "marketId": "example-market",
  "question": "Example market question?",
  "status": "active",
  "outcomes": [
    {
      "name": "Yes",
      "price": 0.6,
      "tokenId": null
    },
    {
      "name": "No",
      "price": 0.4,
      "tokenId": null
    }
  ],
  "bestOutcome": "Yes",
  "volume": 12500,
  "liquidity": 3500,
  "eventTitle": "Example event",
  "category": null,
  "tags": [],
  "fetchedAt": "2026-08-31T00:00:00.000Z"
}

What data does it export?

  • Market identifiers, question, description, public URL, and status.
  • Outcome names, quoted prices, and public token identifiers.
  • Volume, 24-hour volume, and liquidity when supplied.
  • Associated event context, dates, categories, tags, and resolution-source text.

Who is it for?

  • Researchers: build market snapshots for comparative analysis.
  • Data teams: load public market records into spreadsheets or databases.
  • Monitoring workflows: schedule repeated snapshots and compare records by marketId downstream.
  • AI-assisted research: retrieve source-linked records without treating market prices as established facts.

Input settings

Setting JSON key Type / default What it does
Search query query string / not set Optional text to match in market question, slug, description, or event title.
Market status status string / "active" Which markets to fetch. Values: active, closed, all.
Maximum markets maxItems integer / 25 Maximum number of market records to save. Minimum 1; maximum 10000.
Sort by sortBy string / "volume" Sort the collected sample, not the full Polymarket catalog: volume, liquidity, newest, or closingSoon. Values: volume, liquidity, newest, closingSoon.
Category or tag categoryOrTag string / not set Optional category/tag filter.
Minimum volume minVolume number / not set Only keep markets with at least this volume. Minimum 0.
Minimum liquidity minLiquidity number / not set Only keep markets with at least this liquidity. Minimum 0.
Include raw API response includeRaw boolean / false Include the raw Polymarket API object on each dataset item.

Filtering and coverage limits

query is a case-insensitive text match over the collected market question, slug, description, and event context. categoryOrTag matches category, tags, and event title/slug; it is not an exact category-ID selector.

sortBy orders the collected sample after filtering. It does not guarantee the highest-volume or soonest-closing markets across all of Polymarket. The current collection is bounded to 2,500 source records per open/closed group, so restrictive filters or a large maxItems can return fewer matches than requested. With status: "all", open markets are considered before closed markets; a small limit can fill before closed markets are reached.

Missing numeric and optional text values are null; missing arrays are empty. bestOutcome only names the outcome with the highest available quoted price. This Actor does not provide historical odds, order books, wallet positions, trade execution, or predictions. Public source availability and field values can change.

Tips and run summary

Start with maxItems: 10 and no text filter. Add one filter at a time after inspecting the returned data. A zero-result run can be valid: remove restrictive filters and inspect the RUN-SUMMARY key-value record for the saved count, pages checked, and applied input.

For monitoring, schedule the same input and store dated snapshots externally; the Actor does not calculate changes between runs. Use only public data you are permitted to process. This tool is not affiliated with Polymarket.

API usage

Use your Apify API token through the APIFY_TOKEN environment variable. Node.js and Python examples wait for the run and read its first dataset page; paginate the dataset for larger exports.

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/polymarket-markets-events-scraper').call({
  "status": "active",
  "maxItems": 10,
  "sortBy": "volume",
  "includeRaw": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import json
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = json.loads('''{
  "status": "active",
  "maxItems": 10,
  "sortBy": "volume",
  "includeRaw": false
}''')
run = client.actor("fetch_cat/polymarket-markets-events-scraper").call(run_input=run_input)
print(client.dataset(run["defaultDatasetId"]).list_items().items)

cURL

Save the quickstart JSON as input.json. This request starts a run asynchronously; use its returned run ID to check completion and its defaultDatasetId to retrieve results.

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~polymarket-markets-events-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @input.json

MCP and AI agents

Use the official Apify MCP server, not a separate custom server. The focused URL below selects this Actor. Authenticate with Apify when your client prompts you; configuration syntax and OAuth support depend on the client.

Claude Code

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/polymarket-markets-events-scraper"

HTTP-capable MCP client configuration

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/polymarket-markets-events-scraper"
    }
  }
}

Example prompt: "Export up to 10 active Polymarket markets. Show their questions, outcome prices, volume, liquidity, and source URLs; label missing values and do not treat prices as predictions."

Use the same input keys as the input table. Review the returned source URLs and any error or availability fields before using results in an automated summary.

Support

If a run fails or output looks wrong, open an issue from the Actor page. Include the Apify run ID or run URL, non-sensitive input JSON, expected output, actual output, and one reproducible public URL (or the exact search input). Do not share tokens, cookies, passwords, or private data.

Common questions

Questions and answers reused from the canonical actor README.

Does it return live trading signals?

No. It returns public market records observed during collection. Quoted prices are not guarantees or recommendations.

Why did my query return no markets?

It may have no match inside the bounded collected sample. Test without text/category filters and inspect RUN-SUMMARY; do not interpret an empty dataset as proof that the market does not exist.

Does it require a Polymarket account?

No Polymarket login or wallet is used for this public-data export. Calling the Actor through Apify API still requires your Apify token.

Can I export to CSV or call an API?

Yes. Use the dataset export controls or Apify Dataset API. JSON retains nested outcomes; choose and flatten fields as needed for a spreadsheet.