Prediction Markets Scraper - MCP Server
Pricing
from $2.00 / 1,000 prediction market data
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ň
Maintained by CommunityActor 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
| Exchange | Region | Type |
|---|---|---|
| Polymarket | Global | Crypto |
| Polymarket US | US | Regulated |
| Kalshi | US | Regulated (CFTC) |
| Kalshi Demo | US | Demo |
| Limitless | Global | Crypto |
| Metaculus | Global | Forecasting |
| Smarkets | Europe | Exchange |
| Myriad | Global | Crypto |
| Probable | Global | Crypto |
| Opinion | Global | Social |
| Hyperliquid | Global | DeFi |
| Gemini Titan | US | Regulated |
| SuiBets | Global | Crypto |
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
getItemsAPI or theActor.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.
| Event | Price | When charged |
|---|---|---|
actor-start | $0.01 | Once per run, before any fetching |
prediction-market-event | $0.002 | Per event scraped and saved to the dataset |
Example costs:
| Run | Records | Cost |
|---|---|---|
| 50 events from 1 exchange | 50 | ~$0.11 |
| 150 events from 3 exchanges | 150 | ~$0.31 |
| 500 events, deduped cross-venue | 500 | ~$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
| Parameter | Type | Default | Description |
|---|---|---|---|
exchanges | string[] | [Polymarket, Kalshi, Limitless] | Exchanges to query |
query | string | — | Keyword / natural-language search. Omit for top events by volume. |
limit | number | 50 | Max results per exchange (1–1000) |
status | string | active | active | inactive | closed | all |
category | string | — | Category filter (e.g. politics, crypto, sports) |
tags | string[] | — | Tag filter — returns events matching ANY tag |
minVolume | number | 0 | Minimum total traded volume (USD) |
minLiquidity | number | 0 | Minimum market liquidity (USD) |
includeOutcomes | boolean | true | Include full outcomes array (for multi-outcome markets) |
includeSourceMetadata | boolean | false | Attach raw venue-specific metadata to each event |
crossVenueDedup | boolean | false | Merge same-event records from different exchanges |
outputFormat | string | events | events | 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 searchlimit: 50, // max resultsstatus: 'active', // active | inactive | closedcategory: 'politics',tags: ['US', 'Fed'],// plus: offset, cursor, sort, eventId, slug, series});