Prediction Markets Scraper - Polymarket, Kalshi, Limitless
Pricing
from $1.10 / 1,000 result items
Prediction Markets Scraper - Polymarket, Kalshi, Limitless
Scrape live prediction market events, prices, and liquidity across 13 exchanges: Polymarket, Kalshi, Limitless, Metaculus, Smarkets, and more
Pricing
from $1.10 / 1,000 result items
Rating
0.0
(0)
Developer
Jan Turoň
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
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-dataset-row billing — you only pay for the records actually delivered.
| Event | When charged |
|---|---|
prediction-market-event | Per row pushed to the dataset |
Volume discounts — the per-row price drops automatically with your Apify plan:
| Apify plan (discount tier) | Price per row | Per 1,000 rows | Discount |
|---|---|---|---|
| Free | $0.0020 | $2.00 | — |
| Starter (Bronze) | $0.0017 | $1.70 | 15% |
| Scale (Silver) | $0.0014 | $1.40 | 30% |
| Business (Gold) | $0.0011 | $1.10 | 45% |
The number of rows depends on outputFormat:
outputFormat | Rows per scraped event |
|---|---|
events (default) | 1 row per event |
markets | 1 row per market (multiple per event) |
flat | 1 row per outcome (Yes / No / multi-outcome) |
Example costs (events format):
| Run | Rows | Free | Business (Gold) |
|---|---|---|---|
| 50 events from 1 exchange | 50 | ~$0.10 | ~$0.055 |
| 150 events from 3 exchanges | 150 | ~$0.30 | ~$0.165 |
| 500 events, deduped cross-venue | 500 | ~$1.00 | ~$0.55 |
The actor respects your maxTotalChargeUsd budget — if the limit is reached, it delivers however many rows fit within budget and exits cleanly without losing partial results.
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