Prediction Markets API - Kalshi & Polymarket Odds, MCP
Pricing
from $0.70 / 1,000 results
Prediction Markets API - Kalshi & Polymarket Odds, MCP
Read prediction-market odds from the official public APIs of Polymarket and Kalshi in one flat schema. One row per market: question, YES/NO price, implied probability, volume, 24h volume, liquidity, open interest (Kalshi), close time, status, category and link. Search by text or get the top markets
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
Martin Petrov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Security
Limited permissionsShare
Prediction-market data is split across venues with different schemas. Polymarket (Gamma API) and Kalshi (trade API) name, price and measure their markets differently, and most tools on the store cover only one venue each. This actor reads both official public APIs and returns one flat JSON row per market: question, YES/NO price, implied probability, volume, liquidity, close time, status, category and link. It can also pair the same question on both venues and report the price gap, and it can run as a monitor that outputs only new or moved markets.
No API key, no login, no proxies. It uses an honest User-Agent, polite pacing and retries with backoff on HTTP 429/5xx. It is usable from AI agents via MCP.
What you get
- Top markets by volume, or a text search ("bitcoin", "election", "fed rates").
- Filters: venues, open/closed/all, category, minimum volume, maximum results (up to 2000).
- Cross-venue matching (
matchAcrossVenues): Kalshi and Polymarket markets about the same question are paired by title similarity. Matched rows carrymatchedVenue,matchedMarketId,matchedYesPrice,matchScoreandpriceGapPts(absolute YES probability difference in percentage points). Matching is a text heuristic, so checkmatchedQuestionbefore you trade on a gap. - Only-new mode (
monitorId) for price-move alerts.
Quick start (Apify API)
curl -X POST "https://api.apify.com/v2/acts/martin10291~prediction-markets-kalshi-polymarket/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"query": "bitcoin", "venues": ["polymarket", "kalshi"], "maxResults": 50}'
Use from AI agents (MCP)
Add the Apify MCP server and expose this actor as a tool:
https://mcp.apify.com?tools=martin10291/prediction-markets-kalshi-polymarket
Then ask your agent, for example: "What are the current odds that the Fed cuts rates, on Kalshi and Polymarket, and where do they disagree?" The agent calls the actor with query: "fed rates" and reads impliedProbabilityPct and priceGapPts.
Input
| Field | Type | Default | Meaning |
|---|---|---|---|
query | string | empty | Search text. Empty = top markets by volume. |
venues | array | polymarket, kalshi | Venues to read. |
status | open / closed / all | open | Market status. |
category | string | empty | Keep markets whose category or tag contains this text. |
minVolume | number | 0 | Minimum total volume in USD. |
maxResults | integer | 50 | Rows in total (max 2000), highest volume first, shared fairly between venues. |
matchAcrossVenues | boolean | true | Pair the same question on both venues and add priceGapPts. |
monitorId | string | empty | Turns on only-new mode (see below). |
minPriceMovePts | number | 5 | Only-new mode: minimum YES move in points to output a known market again. |
Output example
{"venue": "polymarket","marketId": "561251","eventId": "31552","eventTitle": "Presidential Election Winner 2028","question": "Will Bernie Sanders win the 2028 Democratic presidential nomination?","outcomes": ["Yes", "No"],"yesPrice": 0.0065,"noPrice": 0.9935,"impliedProbabilityPct": 0.65,"volume": 12345678.9,"volume24h": 10234.5,"liquidity": 456789.1,"openInterest": null,"closeTime": "2028-11-08T04:59:00Z","status": "open","category": "Politics","url": "https://polymarket.com/event/democratic-presidential-nominee-2028","matchedVenue": "kalshi","matchedMarketId": "KXPRESNOMD-28-BS","matchedQuestion": "Will Bernie Sanders be the Democratic Presidential nominee in 2028?","matchedYesPrice": 0.005,"matchScore": 0.857,"priceGapPts": 0.15,"fetchedAt": "2026-11-05T08:03:35Z"}
Prices are between 0 and 1 (0.65 = 65 percent). yesPrice is the first outcome's price; for Polymarket markets with other outcome labels see outcomes. Kalshi prices are the last traded price (midpoint of bid and ask if there was no trade). openInterest is available for Kalshi only. Kalshi volume is in contracts, which settle at 1 USD, so it is comparable to Polymarket USD volume.
Only-new mode
Set monitorId (for example daily-election). The actor stores the last seen YES price per market in a named key-value store prediction-markets-<monitorId>. The first run outputs everything with changeType: "new". Later runs output only markets that are new (new) or whose YES price moved at least minPriceMovePts points (moved, with previousYesPrice and priceChangePts). Schedule it hourly or daily and connect a webhook.
FAQ
Do I need API keys? No. Only public market data endpoints are used.
How fast is it? The default run (50 markets, both venues) takes about 30 seconds, because the Kalshi list is not sorted by volume and the actor reads all open Kalshi events at a polite pace.
Can I trade with it? No. It only reads data. This is not financial advice, and prices can change between the API call and your decision.
Why is a market not matched? Matching needs similar wording and the same numbers (years, thresholds) on both sides. Many questions exist on one venue only.
What if one venue is down? The other venue's rows are still returned and RUN_SUMMARY.lastError names the failure.
Run summary: the key-value record RUN_SUMMARY holds itemsOut, perVenue, matchedPairs, lastError and durationSec.