Exchange data API for 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.
Contract exchanges quote prices in cents, sportsbooks quote odds, and every venue names the same game differently. PreciseAPI puts them on one event id and one price format, so a single query compares them all.
- Contracts as odds. Kalshi, Polymarket, Polymarket US and Fanatics Markets prices arrive as American, decimal or probability — your choice per request.
- Same ids as sportsbooks. Exchange prices share event and outcome ids with the rest of the 36-source feed, so no fuzzy matching on team names.
- Liquidity included. Every exchange price carries the available liquidity, so a price is never shown without its depth.
- Live over WebSocket. Subscribe to a league and receive price changes from every venue as they happen, with sequence numbers for gap detection.
An exchange data API earns its place when your tool needs more than one venue. Kalshi, Polymarket and the sportsbooks each have their own API, authentication, naming and price format, and the same game appears under different titles on each. Before you can compare a contract with a sportsbook line, you have to find it, match it to the right game and side, and put both on one scale.
PreciseAPI does that matching for you. Contract exchanges and betting exchanges arrive in the same event and outcome structure as 23 sportsbooks, converted to American odds, decimal odds or probability. This page covers how that data is shaped, a working comparison in Python, which plan fits which kind of tool, and the details that trip up cross-venue comparisons.
What exchange trading tools need
The tools built on this data fall into a few groups:
- Comparison dashboards that show a contract price next to sportsbook odds for the same game.
- Gap scanners that flag contracts priced away from a de-vigged sharp sportsbook reference.
- Trading tools and bots that use sportsbook prices as a reference while placing orders through the venue's own API.
- Research on how contract prices track, lead or lag the sportsbook market.
All of them need the same inputs: every venue's price on one scale, the size behind each price, a reference from sharp books, and ids that say two prices belong to the same outcome. Instead of a Kalshi data API, a Polymarket client and a sportsbook feed stitched together by team name, you make one request to an exchange data API that has already done the matching.
How the exchange data API is shaped
The feed carries the contract exchanges Kalshi (kalshi), Polymarket (polymarket), Polymarket US (polymarket_us) and Fanatics Markets (fanatics_markets), and the betting exchanges Novig, ProphetX and 4CX. All of them have type: "exchange" on /v1/sportsbooks, and the contract exchanges carry the prediction tag. GET /v1/sportsbooks?type=exchange is free and shows which leagues each venue is pricing right now.
Contract data arrives as ordinary outcomes. For Kalshi and Polymarket that means game-winner contracts under moneyline and over/under contracts under total. Player props come from sportsbooks and DFS apps, not from these venues. Each venue outcome carries liquidity, the size in USD available at the quoted price, and both sides of a contract come back as two outcomes, so the overround is the sum of the two price values when you request format=probability.
A cross-venue comparison in Python
This pulls NBA moneylines from the four contract exchanges and Pinnacle, skips thin quotes, and prints each contract against Pinnacle's no-vig probability:
from preciseapi import PreciseAPI
client = PreciseAPI() # reads PRECISEAPI_KEY
VENUES = ["kalshi", "polymarket", "polymarket_us", "fanatics_markets"]
REFERENCE = "pinnacle"
MIN_LIQUIDITY = 500 # USD at the quoted price
res = client.odds(league="nba", markets=["moneyline"], books=VENUES + [REFERENCE], format="probability")
for event in res.data:
by_book = {b["id"]: b["markets"][0] for b in event["bookmakers"] if b["markets"]}
ref = by_book.get(REFERENCE)
if not ref:
continue
total = sum(o["price"] for o in ref["outcomes"])
fair = {o["side"]: o["price"] / total for o in ref["outcomes"]}
for venue in VENUES:
for o in by_book.get(venue, {}).get("outcomes", []):
if o.get("liquidity", 0) < MIN_LIQUIDITY or o["side"] not in fair:
continue
gap = (fair[o["side"]] - o["price"]) * 100
print(f'{event["away"]["abbr"]} @ {event["home"]["abbr"]} {venue} {o["name"]}: '
f'{o["price"]:.3f} vs fair {fair[o["side"]]:.3f} ({gap:+.1f} pts, ${o["liquidity"]:,.0f})')
The output describes prices at one moment. A gap can come from fees, a stale side, different settlement rules or a reference that is itself an estimate, so treat it as a data view rather than a signal. The Kalshi and Polymarket odds guide adds fee functions, tick rounding and a Node.js version.
Which plan fits
Every paid plan includes the exchange data API. What changes is how often you can refresh and whether you get prices during games:
| Tool | Plan | Why |
|---|---|---|
| Pre-game dashboard refreshed every minute or two | Edge, $49.99 | 150,000 credits; /v1/odds costs 2 per call |
| Pre-game scanner polling every few seconds | Sharp, $199.99 | Unlimited credits, 1,200 requests a minute |
| Trading tool that follows contracts during games | Syndicate, $249.99 | In-play prices and the WebSocket stream |
A contract on a game in progress is an in-play price, so it follows the same plan rule as sportsbook odds: on Edge and Sharp the game leaves odds responses when it starts. On Syndicate the stream sends each venue's changes, including new liquidity at an unchanged price, with a sequence number on every message. The odds API pricing page has the full comparison.
Details that trip up cross-venue comparisons
- Fees aren't in the price. PreciseAPI returns the quoted price. Apply each venue's current fee schedule in your own code, with a function you can update.
- Probabilities carry rounding. A 42-cent contract can come back as
0.4202. Round Kalshi and Polymarket probabilities to the venue's tick if you need the original quote. - "No" isn't always the other team. On a soccer winner contract, "No" on the home team covers both the away team and the draw. Compare all three outcomes.
- Polymarket and Polymarket US are separate. They are different order books with different source ids. Treat them as two venues.
- Settlement rules differ. Overtime, postponements and void rules can differ from a sportsbook's. Read each venue's rules before treating two prices as the same bet.
- Liquidity is the top of the book. It tells you what could trade at the quoted price, not the price of the next dollar, and the feed doesn't carry full order book depth. Check the venue's own order book before acting on a size larger than
liquidity; the exchange liquidity glossary entry explains how to read it. - Arbitrage needs your own math. The REST API has no arbitrage endpoint. Compute it from
/v1/oddsor/v1/best-lines, or use the MCPfind_arbitragetool, and expect fees and moving prices to close most apparent gaps. The arbitrage API page and arbitrage calculator show the method.
Related pages
The exchange odds API page summarizes the feed. Source pages for the Kalshi sports API, Polymarket sports odds API, Polymarket US odds API and Fanatics Markets odds API describe what each venue lists. The betting exchanges vs sportsbooks post compares how exchanges and sportsbooks price games, and the betting exchange odds API post covers Novig, ProphetX and 4CX. The implied probability calculator converts single prices by hand.
Frequently asked questions
Which exchanges does the exchange data API cover?
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, alongside any sportsbook.
Do prices include Kalshi or Polymarket fees?
No. Prices are the quoted market prices. Fees depend on each venue's schedule and sometimes on the order, so apply them in your own code.
Can I place trades through PreciseAPI?
No. PreciseAPI is a data provider only: it doesn't place orders, hold funds or take bets. Trading tools send orders through each venue's own API under that venue's terms.
Does Kalshi or Polymarket data include player props?
No. For Kalshi and Polymarket the feed carries game-winner contracts as moneylines and over/under contracts as totals. Player props come from sportsbooks and DFS apps.
Contracts on the same scale as odds
A contract exchange quotes a contract that pays $1 if an outcome happens, so a price of 62 cents implies a 62% chance. The API converts every contract price to the format you ask for, American, decimal or probability, so Kalshi, Polymarket and a sportsbook sit in one column without conversion code of your own. Use format=probability to compare venues on the scale traders already use.
Reading depth correctly
Exchange prices come with the liquidity resting at that price. A price with a few dollars behind it says much less than one with thousands, so show the size next to the quote, or leave out prices below a size you choose. Sportsbook prices carry no size: they are good up to each book's own limit.
Example request
GET /v1/odds?league=nfl&markets=moneyline&books=kalshi,polymarket,novig,pinnacle&format=probability
Endpoints
- GET /v1/odds: Get odds
- WebSocket stream: snapshots and deltas over one connection
Products
- Game odds API: Betting odds API for moneylines, spreads and totals from 36 sources, for every period, plus alternate lines and team totals in one normalized schema.
- Live odds API: Live odds API with in-play prices pushed in under 500 ms over WebSocket on Syndicate, plus live scores, the game clock and automatic suspension of stale prices.
- 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.
- 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.
Related reading
- 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.
- 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.
More use cases
- 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.
- DFS & pick'em tools: An odds API for DFS and pick’em tools: PrizePicks, Underdog, Sleeper and Pick6 lines next to sharp sportsbook props on one player id, to find the best picks.
Looking for a specific league or book? See the odds API directory, or compare plans.