Prediction Market Odds API: Kalshi and Polymarket Odds
Kalshi and Polymarket APIs return contract prices, not odds. The SmartStake Odds API returns both as fee-adjusted odds in the same schema as 85+ books.

The SmartStake Odds API is a prediction market API that returns Kalshi, Polymarket and every other exchange it covers, from Polymarket US to Novig, ProphetX, STX and Betfair, as sportsbook odds: American or decimal, after the taker fee, on the same event and market keys as 85+ sportsbooks. Kalshi and Polymarket each publish a free API, but neither returns odds. They return a contract price before fees, keyed to the venue's own market ids, and the rest is your job.
That gap matters more than it looks. Set the price below to 55¢ and compare it with DraftKings at −125.
One price, two APIs
{
"ticker": "KXNFLGAME-…-DET",
"yes_bid": 54,
"yes_ask": 55
}A price per contract, before fees, keyed to the venue's own market id.
{
"event_id": "evt_01KZCTK5WDFG6R6TWYDZV61GV2",
"book": "kalshi",
"market_key": "football_moneyline",
"label": "Detroit Lions",
"side": "hometeam",
"odds": -131
}American odds after the taker fee, on the same event_id and market_key as every sportsbook.
Illustrative, not a live quote. The venue responses are abridged examples of each API's shape, and the SmartStake quote is abridged from the documented quote object. Fees use Kalshi's published 0.07 taker rate and Polymarket's 0.05 sports taker rate, each charged as rate x price x (1 minus price). Fee schedules change, so confirm them before you trade.
A 55¢ contract converts to −122, which beats −125. After Kalshi's taker fee it is −131, and DraftKings is the better price. Skip the fee and your comparison picks the wrong book.
Do Kalshi and Polymarket Have APIs?
Yes. Both venues publish APIs, and reading market data from them is free at the time of writing.
- Kalshi returns each market's bid and ask in cents, keyed to a market ticker. Placing orders needs a Kalshi account and an API key you create in it.
- Polymarket returns prices between 0 and 1 and full order books, keyed to its own market and token ids. Polymarket US, the CFTC-regulated venue for US users, runs separately with its own prices.
What neither returns is the thing a sportsbook comparison needs: an odds price you can line up against DraftKings or FanDuel. For that, three jobs sit between the venue's response and your table.
Three Jobs Between a Venue API and an Odds Comparison
1. Price to odds
A contract that pays $1 and costs $0.55 is decimal odds of 1 / 0.55 = 1.818, or −122 in American odds. That part is one line of code. The Kalshi odds converter guide and the Polymarket odds converter guide walk through it by hand.
2. Fees
Both venues charge takers the same fee shape: rate x price x (1 minus price), per contract. The rate is what differs.
| Venue | Taker rate | Fee at 55¢ | All-in cost | Odds after fee |
|---|---|---|---|---|
| Kalshi | 0.07 | 1.73¢ | 56.73¢ | −131 |
| Polymarket (sports) | 0.05 | 1.24¢ | 56.24¢ | −129 |
The fee peaks at 50¢ and shrinks toward either end, so a flat haircut is wrong at every price but one. The Polymarket vs Kalshi comparison covers why maker orders avoid most of it.
3. Matching events and markets
This is the hard part. A Kalshi ticker, a Polymarket token id and a DraftKings selection for the same Lions moneyline share no id. You map team names, start times and market types across every venue, then keep the mapping current as markets list and close. Sportsbooks are no easier: each names teams, players and markets its own way.
Pulling Prediction Market Odds with SmartStake
The SmartStake Odds API does all three jobs before the price reaches you. Every quote carries an event_id and market_key shared across books, and exchange and prediction market prices are what it costs to take the price, net of the venue's fee. The full reference is in the API docs.
Every exchange and prediction market, one schema
Kalshi and Polymarket are two of the venues on the board. Each one below is a book value, priced and keyed like any sportsbook:
| Venue | book | Price you get |
|---|---|---|
| Kalshi | kalshi | Net of the taker fee |
| Polymarket | polymarket | Net of the taker fee |
| Polymarket US | polymarket_us | Net of the taker fee |
| ProphetX | prophetx | Net of its commission on winnings |
| Novig | novig | Pregame prices carry no fee |
| STX | stx | What it costs to take the price |
| Betfair | betfair | What it costs to take the price |
The full list of sportsbooks, exchanges and prediction markets is on the coverage page.
First, confirm which books your key includes:
curl --compressed -H "Authorization: Bearer $SMARTSTAKE_API_KEY" \
"https://api.server.smartstake.ca/v1/books"
Then pull one game's moneyline from two prediction markets and two sportsbooks in one request (up to 5 events and 5 books per call):
curl --compressed -H "Authorization: Bearer $SMARTSTAKE_API_KEY" \
"https://api.server.smartstake.ca/v1/odds?event_id=evt_01KZCTK5WDFG6R6TWYDZV61GV2&book=kalshi&book=polymarket_us&book=draftkings&book=fanduel&market=football_moneyline"
Finding the best price across venues in Python
Removing the last two segments of a quote_id (side and book) gives an id every book shares for the same line. Group by it and the side, and the best price on each side falls out:
import gzip, json, os, urllib.parse, urllib.request
API = "https://api.server.smartstake.ca"
HEADERS = {
"Authorization": f"Bearer {os.environ['SMARTSTAKE_API_KEY']}",
"Accept-Encoding": "gzip",
}
BOOKS = ["kalshi", "polymarket_us", "draftkings", "fanduel"]
def get(path, params):
url = f"{API}{path}?{urllib.parse.urlencode(params)}"
with urllib.request.urlopen(urllib.request.Request(url, headers=HEADERS), timeout=30) as response:
body = response.read()
if response.headers.get("Content-Encoding") == "gzip":
body = gzip.decompress(body)
return json.loads(body)["data"]
event = get("/v1/events", {"league": "nfl"})[0]
quotes = get("/v1/odds", [("event_id", event["id"]), ("market", "football_moneyline"), ("format", "decimal")] + [("book", book) for book in BOOKS])
best = {}
for quote in quotes:
line_id = quote["quote_id"].rsplit("~", 2)[0]
key = (line_id, quote["side"])
if key not in best or float(quote["odds"]) > float(best[key]["odds"]):
best[key] = quote
for quote in best.values():
print(f'{quote["label"]:<28} {quote["book"]:<14} {float(quote["odds"]):.3f}')
Swap football_moneyline for any key from /v1/markets, or drop the market filter to compare every line the venues share.
Keeping it live
A REST call is a snapshot. To keep the comparison current, open the stream and apply each change by quote_id:
curl -N --compressed -H "Authorization: Bearer $SMARTSTAKE_API_KEY" \
"https://api.server.smartstake.ca/v1/stream/football?league=nfl&book=kalshi&book=polymarket_us&book=draftkings&book=fanduel"
Changes arrive over Server-Sent Events in 250 ms batches. Open the stream before you pull the snapshot so nothing is missed between the two; the API docs cover reconnects and board resets.
When to Use Kalshi or Polymarket Directly
The venue APIs win wherever the job is the venue itself:
- Placing orders. Trading needs the venue's own API and an account there. SmartStake reads prices; it does not place bets or trades.
- Order book depth. The venues return every resting order. A SmartStake quote is the price to take, not the full book.
- Non-sports markets. Elections, economics and weather markets live only on the venues' APIs.
- History. The SmartStake API serves the current board and its changes, not historical prices. Record the stream if you need your own history from today forward.
If you compare prices across prediction markets and sportsbooks, one feed beats five integrations. If you trade on one venue, use its API. Many builds use both. For the trading side of that comparison, Kalshi vs sportsbooks covers where each tends to post the better number, and the free prediction market converter checks a single price by hand.
FAQ
Is there a Kalshi odds API?
The SmartStake Odds API is a Kalshi odds API: it returns Kalshi prices as American or decimal odds after the taker fee, next to 85+ sportsbooks in one schema. Kalshi's own API returns contract prices in cents before fees, so you convert and fee-adjust them yourself.
Is the Kalshi API free?
Reading Kalshi market data is free. Placing orders needs a Kalshi account and an API key you create in it. The SmartStake Odds API is free while it is in early access, within its published limits.
Is the Polymarket API free?
Reading Polymarket prices and order books is free. Trading needs a funded account. Polymarket US, the CFTC-regulated venue for US users, is a separate market with its own prices.
Are the prediction market prices net of fees?
Yes. In the SmartStake Odds API, Kalshi, Polymarket and Polymarket US prices include the taker fee, so they compare directly with sportsbook odds. At a 55 cent Kalshi contract the fee is about 1.73 cents, which moves the price from −122 to −131.
Which exchanges and prediction markets does the API include?
Kalshi, Polymarket, Polymarket US, Novig, ProphetX, STX and Betfair, alongside 85+ sportsbooks in the same schema. Your key lists exactly the books it can see at /v1/books, and the full list is on the SmartStake coverage page.
Can I show these prices to users of my product?
Early access keys are for your own use. Showing prices to the members of your product needs a commercial licence, so write to SmartStake with what you are building.
Does the API include historical prediction market prices?
No. The API serves the current board and every change to it, not history. You can record the stream yourself to build your own history from the day you start.
Apply for Early Access
The SmartStake Odds API is in early access and free during it, with founder pricing when paid plans launch. Apply for early access with a few lines about what you are building.
Get the next guide in your inbox
Practical betting guides, new tools, and product updates from the SmartStake team. Unsubscribe in one click, any time.
By providing your email, you are consenting to receive communications from SmartStake. Visit our Privacy Policy for more info


