Exchange odds API
Exchange odds API: Kalshi, Polymarket, Novig, ProphetX and 4CX prices in the same formats as sportsbook odds, with liquidity, on one event id.
Exchanges are often the sharpest price on the board. PreciseAPI converts their contract prices to the same odds format as sportsbooks, with available liquidity.
- Kalshi, Polymarket, Polymarket US, Fanatics Markets
- Exchanges: Novig, ProphetX, 4CX
- Contract prices converted to odds and probability
- Liquidity on every exchange price
Contract exchanges and betting exchanges now price many of the same games as sportsbooks, often at a tighter number, but each venue has its own API, its own market names and its own price units. An exchange odds API is useful when it removes those differences: every venue's price on the same event id, in the format you choose, with the size available at that price. PreciseAPI does this for 7 venues, in the same response shape as 23 sportsbooks.
This page covers the response fields, the venues in the feed, how contract prices and liquidity should be read, what it costs, and how the feed compares with connecting to each venue yourself.
What the exchange odds API returns
Venues come through the same endpoints as sportsbooks. Name them in books on /v1/odds, add a sportsbook or two as a reference, and pick a format. Probability is the natural one for comparing contracts with odds.
curl "https://api.preciseapi.com/v1/odds?league=nba&markets=moneyline&books=kalshi,polymarket_us,prophetx,fanduel&format=probability" \
-H "Authorization: Bearer $PRECISEAPI_KEY"
A trimmed response, showing one venue:
{
"data": [{
"id": "evt_1iazqk4srnb",
"league": "nba",
"status": "scheduled",
"home": { "id": "nba_phx", "name": "Phoenix Suns", "abbr": "PHX" },
"away": { "id": "nba_sas", "name": "San Antonio Spurs", "abbr": "SAS" },
"bookmakers": [{
"id": "kalshi",
"name": "Kalshi",
"type": "exchange",
"markets": [{
"id": "mkt_1dougx7qnw5",
"key": "moneyline",
"period": "full_game",
"outcomes": [
{ "id": "sel_2d3ja0zugwd", "name": "Phoenix Suns", "side": "home", "price": 0.6198, "liquidity": 4180 },
{ "id": "sel_1pojklgy6cc", "name": "San Antonio Spurs", "side": "away", "price": 0.3953, "liquidity": 2655 }
],
"suspended": false
}]
}]
}],
"meta": { "count": 1, "format": "probability", "credits_used": 2 }
}
Venues have type: "exchange" in the bookmaker block, and every outcome carries liquidity, the size in USD available at that price. The outcome ids are the same ones the sportsbooks in the response use, so a Kalshi contract and a FanDuel moneyline for the same side share an id. Outcomes with no liquidity behind them are left out rather than shown at a price nobody can trade.
Contracts are filed under the same market keys as sportsbook bets. A contract on the game winner comes back as moneyline, and contracts on a margin or a combined score come back as spread or total with their point, so they group with sportsbook markets at the same number without any mapping of your own.
Venues in the feed
| Venue | Kind | Page |
|---|---|---|
| Kalshi | Contract exchange | Kalshi sports API |
| Polymarket | Contract exchange | Polymarket sports odds API |
| Polymarket US | Contract exchange | Polymarket US odds API |
| Fanatics Markets | Contract exchange | Fanatics Markets odds API |
| Novig | Betting exchange | Novig API |
| ProphetX | Betting exchange | ProphetX API |
| 4CX | Betting exchange | 4CX odds API |
Coverage differs by venue and league. The free GET /v1/sportsbooks?type=exchange call lists each venue's status and the leagues it is pricing right now; a venue that doesn't list a market simply doesn't appear in that market's bookmakers. The contract exchanges also carry the prediction tag in that list, so your code can tell them apart from the betting exchanges. Betfair Exchange, Smarkets, Matchbook, SX Bet and Sporttrade aren't in the feed.
Contract prices on the odds scale
On Kalshi, Polymarket and the other contract exchanges, a price is the cost of buying one side of a contract that pays $1, and each side has its own buy price, so the two sides add up to a little over 1, much like a sportsbook's overround. Prices are normalized internally and converted on the way out, so a 62-cent contract can come back as 0.6198 rather than 0.62; round to the venue's tick if you need the exact cent. Quoted contract prices don't include venue fees, which differ by venue and change over time, so apply your own fee rules before comparing a contract with a sportsbook price.
Liquidity and thin markets
A price with a few dollars behind it says much less than one with thousands, which is why the feed returns exchange liquidity data on every venue outcome rather than the price alone. A common pattern is to drop venue prices below a size you choose, then set what remains against a sharp sportsbook:
const MIN_SIZE = 500; // USD available at the price
for (const event of data) {
for (const book of event.bookmakers) {
const ml = book.markets.find((m) => m.key === 'moneyline');
const home = ml?.outcomes.find((o) => o.side === 'home');
if (!home || (book.type === 'exchange' && (home.liquidity ?? 0) < MIN_SIZE)) continue;
console.log(event.home.abbr, book.id, home.price, home.liquidity ?? 'sportsbook');
}
}
Sportsbook prices carry no size: they are good up to each book's own limits. When you use an exchange odds API as a reference for fair prices, size is the filter that keeps a single small order from moving your model. The exchange liquidity glossary entry explains how to read depth and why thin prices mislead.
Plans, credits and live prices
The exchange odds API is on every paid plan. A /v1/odds call costs 2 credits for up to 200 events, and Edge includes 150,000 credits a month; Sharp and Syndicate are unlimited. /v1/best-lines (3 credits) includes betting exchanges and contract exchanges when it picks the best price per outcome, so a venue can be the best number on a side; it compares quoted prices, before fees. Prices for games in progress and the WebSocket stream are on Syndicate. Venue prices can move with every trade, and the stream sends each change with its new liquidity, so a screen or a quoting tool always shows the current size. See odds API pricing.
Betting exchange API vs. connecting to each venue
Every venue publishes its own API, and connecting to one is not hard. The work is everything after: each venue names games and contracts its own way, contract exchanges such as Kalshi and Polymarket quote cents while betting exchanges quote odds, and none of them share ids with the sportsbooks you want to compare against. A single betting exchange API that already maps every venue onto the same event and outcome ids removes that layer.
Among data providers, as checked in October 2026: The Odds API carries Kalshi, Polymarket, Novig, ProphetX, BetOpenly, Betfair Exchange, Matchbook and Smarkets, with exchange updates every 20 seconds pre-match and 10 seconds in-play. Unabated carries Kalshi, Polymarket, NoVig and ProphetX with top-of-book liquidity, from $799 a month. OpticOdds lists a longer set, including Betfair, SX Bet and Sporttrade, with pricing by quote. If you need one of the venues we don't carry, one of those may suit you better. The OpticOdds alternative and Unabated API alternative pages have the details.
What people build with exchange odds API data
- Tools that put Kalshi and Polymarket odds next to sportsbook lines: exchange data API.
- Trading and market-making desks that weigh each quote by its size: odds API for sportsbooks.
- Screens with a column per venue: real-time odds screen.
- Models that use liquid exchange prices as a market reference: sports betting model data.
For the engineering detail, read Kalshi and Polymarket odds, betting exchanges vs sportsbooks and the betting exchange odds API post. Sportsbook game lines are covered by the betting odds API.
Frequently asked questions
Does the exchange odds API include Kalshi and Polymarket?
Yes: the contract exchanges Kalshi, Polymarket, Polymarket US and Fanatics Markets, plus the betting exchanges Novig, ProphetX and 4CX. Request them by source id in books, such as books=kalshi,polymarket,pinnacle.
Can I place trades through the API?
No. PreciseAPI is a data provider only. It reads prices and liquidity from each venue; orders and accounts stay with the venue.
Are venue fees included in the prices?
No. Prices are the quoted market, not any account's trading cost. Fee rules differ by venue and change, so apply them in your own code before comparing.
Which leagues do the exchanges cover?
It varies by venue and changes through the year. GET /v1/sportsbooks?type=exchange is free and lists the leagues each venue is pricing right now.
Venues in the feed
The feed covers the contract exchanges Kalshi, Polymarket, Polymarket US and Fanatics Markets, which trade event contracts, and the exchanges Novig, ProphetX and 4CX, where users trade with each other. Request them by source id in books, for example books=kalshi,polymarket,pinnacle, and they come back in the same event and outcome structure as sportsbooks.
Prices, probability and depth
A contract that pays $1 and trades at 62 cents implies a 62% chance. The API also converts each contract to American or decimal odds, so a venue sits in the same column as a sportsbook. Every exchange price includes the liquidity available at it. Show it next to the quote, because a thin market can post a price that a few dollars would move.
Example request
GET /v1/odds?league=nfl&books=kalshi,polymarket,novig,pinnacle&markets=moneyline
Endpoint
- GET /v1/odds: Get odds
What teams build with it
- Exchange trading tools: An exchange data API for trading tools: Kalshi, Polymarket and Novig prices next to sportsbook odds on one event id, with liquidity, in one format.
- Sports apps & scoreboards: An odds API for betting apps and sports apps: real-time odds, live scores and deep links to each sportsbook, in the format your users read.
- Odds screens: Build a real-time odds screen: every book’s price side by side, the best line highlighted and updates in under a second, from one normalized odds API.
- Odds alerts & notifications: An odds API for Discord bots and alerts: signed webhooks on line moves, or a WebSocket feed for steam and best-price logic, so your bot posts the move as it happens.
Related reading
- Kalshi and Polymarket Odds: How to Convert Contract Prices: Turn Kalshi and Polymarket contract prices into probabilities, American and decimal odds, adjust for fees and liquidity, and map contracts onto sportsbook markets in code.
- Betting Exchange Odds API: Prices, Liquidity and Normalization: How betting exchange and contract exchange prices are normalized into a sportsbook schema, what the liquidity field means, how to handle commission, and liquidity-aware best prices in code.
- Betting Exchanges vs Sportsbooks (Prices, Fees and Liquidity): How exchange contracts map to betting odds, how exchange fees and spreads compare with sportsbook vig, why liquidity matters, and when exchange prices are sharp.
More products
- DFS pick'em API: DFS pick’em API with real-time PrizePicks, Underdog, Sleeper, Dabble, Betr Picks and Pick6 lines, goblin and demon variants, next to sportsbook props.
- Best lines API: Odds comparison API that returns the best price for every outcome across every sportsbook, exchange and DFS app in one call, with the books that offer it.
- Arbitrage API: Arbitrage API data: the best price on every side at identical lines across sportsbooks and exchanges, plus an MCP tool that finds arbs with stakes.
- Positive EV API: Positive EV API data: every book’s price next to the no-vig fair line from the market consensus or a sharp book like Pinnacle, ranked by edge.
Responses use the same event, market and outcome ids as every other endpoint. Prices are American odds by default, with format=decimal and format=probability for the other two, and a market whose source has stopped reporting is flagged suspended instead of being shown as live.
Every source and league is on the coverage page, and what each request costs is on the pricing page.