Pricing
from $2.00 / 1,000 result items
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 result items
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
22 days 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});
