Prediction Markets Scraper - MCP Server avatar

Prediction Markets Scraper - MCP Server

Pricing

from $2.00 / 1,000 prediction market data

Go to Apify Store
Prediction Markets Scraper - MCP Server

Prediction Markets Scraper - MCP Server

Scrape live prediction market events, prices, and liquidity across 13 exchanges: Polymarket, Kalshi, Limitless, Metaculus, Smarkets, and more

Pricing

from $2.00 / 1,000 prediction market data

Rating

0.0

(0)

Developer

Jan Turoň

Jan Turoň

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Share

Prediction Markets Scraper — MCP Server

One actor. Every market. AI-ready.

Scrape live prediction market events, prices, and liquidity across 13 exchanges — Polymarket, Kalshi, Limitless, Metaculus, Smarkets, and more — powered by the pmxtjs unified API.

Runs as an Apify actor for scheduled scraping and one-off runs. Because Apify connects native MCP integration, the data this actor collects is immediately consumable by AI agents like Claude and Cursor — no extra server required.


Supported Exchanges

ExchangeRegionType
PolymarketGlobalCrypto
Polymarket USUSRegulated
KalshiUSRegulated (CFTC)
Kalshi DemoUSDemo
LimitlessGlobalCrypto
MetaculusGlobalForecasting
SmarketsEuropeExchange
MyriadGlobalCrypto
ProbableGlobalCrypto
OpinionGlobalSocial
HyperliquidGlobalDeFi
Gemini TitanUSRegulated
SuiBetsGlobalCrypto

Apify Platform Capabilities

Running this as an Apify Actor gives you the full Apify infrastructure stack on top of the scraping logic:

  • Scheduled runs — trigger on any cron schedule (hourly snapshots, daily digests, weekly archives) via the Apify Console or API.
  • Webhooks — fire a POST to any endpoint when a run finishes, enabling downstream pipelines (Slack alerts, database writes, further actors).
  • Dataset storage — all output lands in a structured Apify Dataset, queryable via REST API, exportable as JSON/CSV/XLSX, and viewable in the Console.
  • Key-value store — the actor writes a run summary (record count, exchanges queried, finish time) to the default KV store after each run.
  • Apify API — call the actor programmatically from any language, pass input overrides per run, and read results back without ever touching the Console.
  • Actor-to-actor chaining — pipe this actor's dataset output directly into downstream actors (e.g. an LLM summariser, a notifier, a database sync actor) using Apify's dataset getItems API or the Actor.metamorph() pattern.
  • MCP integration — Apify's native Model Context Protocol support lets Claude, Cursor, and other AI agents call this actor as a tool directly from the chat — no extra server or wrapper needed.
  • Monitoring & alerts — set run-failure notifications and memory/timeout limits in the Console.
  • Proxy support — plug in Apify's residential or datacenter proxies if any exchange starts rate-limiting headless requests.

Pricing

This actor uses pay-per-event billing — you only pay for what you actually scrape.

EventPriceWhen charged
actor-start$0.01Once per run, before any fetching
prediction-market-event$0.002Per event scraped and saved to the dataset

Example costs:

RunRecordsCost
50 events from 1 exchange50~$0.11
150 events from 3 exchanges150~$0.31
500 events, deduped cross-venue500~$1.01

The actor respects your maxTotalChargeUsd budget — if the limit is reached mid-run, it saves whatever was collected and exits cleanly without losing partial results.

Prices are set in the Publication tab of the Apify Console. The events emitted by the code are actor-start and prediction-market-event.


Input

Configure the actor in Apify Console or pass a JSON input file:

{
"exchanges": ["Polymarket", "Kalshi", "Limitless"],
"query": "US election 2026",
"limit": 100,
"status": "active",
"category": "politics",
"tags": ["US", "election"],
"minVolume": 50000,
"minLiquidity": 10000,
"includeOutcomes": true,
"includeSourceMetadata": false,
"crossVenueDedup": true,
"outputFormat": "events"
}

Input Parameters

ParameterTypeDefaultDescription
exchangesstring[][Polymarket, Kalshi, Limitless]Exchanges to query
querystringKeyword / natural-language search. Omit for top events by volume.
limitnumber50Max results per exchange (1–1000)
statusstringactiveactive | inactive | closed | all
categorystringCategory filter (e.g. politics, crypto, sports)
tagsstring[]Tag filter — returns events matching ANY tag
minVolumenumber0Minimum total traded volume (USD)
minLiquiditynumber0Minimum market liquidity (USD)
includeOutcomesbooleantrueInclude full outcomes array (for multi-outcome markets)
includeSourceMetadatabooleanfalseAttach raw venue-specific metadata to each event
crossVenueDedupbooleanfalseMerge same-event records from different exchanges
outputFormatstringeventsevents | markets | flat (see below)

Output Formats

events — One record per event, markets nested

{
"id": "...",
"title": "Will Trump nominate Kevin Warsh as Fed Chair?",
"sourceExchange": "Polymarket",
"volume": 4820000,
"volume24h": 130000,
"category": "politics",
"tags": ["US", "Fed", "economy"],
"markets": [
{
"marketId": "...",
"title": "Kevin Warsh",
"yes": { "price": 0.72, "priceChange24h": -0.03 },
"no": { "price": 0.28, "priceChange24h": 0.03 },
"liquidity": 920000,
"volume": 4820000,
"resolutionDate": "2026-01-31T00:00:00Z",
"status": "active"
}
],
"scrapedAt": "2026-06-02T10:00:00Z"
}

markets — One record per market, event info flattened

{
"marketId": "...",
"eventTitle": "Will Trump nominate Kevin Warsh as Fed Chair?",
"title": "Kevin Warsh",
"yes": { "price": 0.72 },
"no": { "price": 0.28 },
"volume": 4820000,
"liquidity": 920000,
"resolutionDate": "2026-01-31T00:00:00Z",
"sourceExchange": "Polymarket",
"scrapedAt": "2026-06-02T10:00:00Z"
}

flat — One record per outcome (Yes / No / multi-outcome)

Best for price comparison, arbitrage detection, and time-series storage.

{
"eventTitle": "Will Trump nominate Kevin Warsh as Fed Chair?",
"marketTitle": "Kevin Warsh",
"outcomeLabel": "Yes",
"price": 0.72,
"priceChange24h": -0.03,
"volume": 4820000,
"liquidity": 920000,
"resolutionDate": "2026-01-31T00:00:00Z",
"status": "active",
"sourceExchange": "Polymarket",
"url": "https://polymarket.com/...",
"scrapedAt": "2026-06-02T10:00:00Z"
}

All prices are normalized to 0.0–1.0 (implied probability) regardless of venue.


Under the Hood

This actor is built on pmxtjs, the TypeScript SDK of the PMXT unified prediction market API — think of it as the ccxt for prediction markets.

Core Data Flow

fetchEvents(params) ← pmxtjs Exchange class
UnifiedEvent[] ← normalized, cross-exchange schema
┌───┴──────────────────────────┐
filter (volume, liquidity)
dedup (crossVenueDedup)
└───────────────┬──────────────┘
Apify Dataset
(events | markets | flat)

Data Model

UnifiedEvent
├─ id, title, description, slug
├─ url, image, category, tags[]
├─ volume, volume24h
├─ sourceExchange
└─ markets: UnifiedMarket[]
├─ marketId, title, description
├─ resolutionDate, status
├─ volume, volume24h, liquidity, openInterest
├─ yes: MarketOutcome { price, priceChange24h }
├─ no: MarketOutcome { price, priceChange24h }
└─ outcomes: MarketOutcome[] ← multi-outcome markets

fetchEvents Parameters (pmxtjs)

The actor maps its input directly to pmxtjs fetchEvents params:

await api.fetchEvents({
query: 'Who will be Fed Chair?', // natural-language search
limit: 50, // max results
status: 'active', // active | inactive | closed
category: 'politics',
tags: ['US', 'Fed'],
// plus: offset, cursor, sort, eventId, slug, series
});