Prediction Markets Feed — Polymarket, Kalshi, Manifold
Pricing
$5.00 / 1,000 market returneds
Prediction Markets Feed — Polymarket, Kalshi, Manifold
Unified, normalized live odds across prediction markets — Polymarket, Kalshi and Manifold in one schema, one call. Implied probability, spread, volume, open interest and market lifecycle. Public data: no login, no API key, no account.
Prediction Markets Feed — Polymarket · Kalshi · Manifold
One unified, normalized live odds feed across prediction-market venues. Every venue's quirks flattened into a single schema, so you compare prices instead of parsing three APIs. All public data — no login, no API key, no account.
Output (per market)
| Field | Description |
|---|---|
platform | polymarket · kalshi · manifold |
question, ticker, url | Market identity + link |
subtitle | What a YES resolves to, when a question is split across outcomes |
yesPrice, noPrice | Implied probability (0..1) |
spread | Vig / implied edge |
volume, liquidity, openInterest | Market depth |
volumeUnit, liquidityUnit | What those numbers count — see below |
closeTime, status, resolvedOutcome | Lifecycle |
Depth fields vary by venue, and we report what each one actually gives us. Kalshi publishes
no liquidity figure — it returned 0.0000 on all 803 markets sampled, including one with 167k
volume — so liquidity is null there rather than a zero that would claim a deep market has
none. Manifold has no open interest. A null here means "this venue does not publish it", never
"it is zero".
⚠️ volume is NOT the same unit on every venue — do not sum or rank across them on it. This
is the one place a unified schema can quietly mislead you, so every row now carries volumeUnit:
| venue | volumeUnit | what one unit is |
|---|---|---|
| polymarket | shares | shares traded — each settles at $0 or $1, so this is a count |
| kalshi | contracts | contracts traded — $1 of max payout each |
| manifold | play-money | mana. Not redeemable for anything. |
Polymarket and Kalshi are the same kind of unit — both count $1-max-payout claims — so those two volumes are comparable. Manifold's is not comparable to either.
⚠️ Neither is money. A market showing 178,247 has 178,247 shares traded, not $178,247: the dollars that changed hands were $107,054 in that measured case. Multiply by the average trade price to get money, and note that lifetime volume × today's price is not that number — which is why we do not compute it for you.
(Corrected 2026-08-06. This table said Polymarket was usd for a week. Gamma's volume is the
sum of trade size; measured against the venue's own trade feed over the same 24h window it matched
SUM(size) to 0.00-0.49% on three markets while SUM(price × size) was 1.1-3.3× away.)
⚠️ Each venue returns a ranked slice, not its whole catalogue. Markets per venue tops out at
500. Measured 2026-08-05:
| venue | live markets at source | max returned | share |
|---|---|---|---|
| polymarket | 2,100 | 500 | 24% |
| kalshi | 83,280 | 500 | 0.6% |
| manifold | 41,000+ | 500 | ~1% |
The ranking is by traded volume, so you get the busiest markets first — which is the point, since Kalshi's tail is overwhelmingly untraded parlay legs. But if you are building anything that needs "every market", this is not that, and the numbers above are why.
Input
{ "platforms": ["polymarket", "kalshi", "manifold"], "limit": 100 }
- platforms — which venues to include.
- limit — markets per venue, which also bounds what the run costs.
Pricing
Pay per event: $0.005 per market returned (market-returned). You only pay for rows you
actually receive; a run that returns nothing fails and charges nothing.
Use cases
Quant research, odds aggregation, probability tracking across venues, AI agents that need live market data.
What this actor does not do
Cross-venue arbitrage detection was removed rather than shipped. It matched markets by question text, and across 300 live markets from three venues that found zero pairs — venues never phrase the same question identically. Loosening the match does not fix it: the closest pairs were "Will Eric Trump win the 2028 election" against "Will Trump announce he is running", and the next Prime Minister of Ethiopia against the next Prime Minister of Romania. Any threshold loose enough to match anything matches those, and an arbitrage signal that confuses two countries costs you money.
Doing it properly needs semantic equivalence — same underlying event, same resolution criteria, same date — which is a different product, not a setting. If you want it, say so and it gets built properly.
For the developer (not shown on the Store)
Thin wrapper over the private scraper-gateway. Set Actor environment variables (secret):
SCRGW_URL, SCRGW_SECRET. Pay-per-event: market-returned ($0.005). The gateway's
/v1/predictions/arbitrage route still exists for internal use — it is simply not sold.
Deploy: apify push --force.