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.

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:

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:

ToolPlanWhy
Pre-game dashboard refreshed every minute or twoEdge, $49.99150,000 credits; /v1/odds costs 2 per call
Pre-game scanner polling every few secondsSharp, $199.99Unlimited credits, 1,200 requests a minute
Trading tool that follows contracts during gamesSyndicate, $249.99In-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

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

Products

Related reading

More use cases

Looking for a specific league or book? See the odds API directory, or compare plans.