Prediction-market data API/v1

One API for every prediction market.

Kalshi, Polymarket, Hyperliquid and six more venues in one schema: the full catalog, live quotes and fees, events, settlement rules and cross-venue identity. Over REST, or typed SDKs for TypeScript, Python and Go.

$ npm install @predictorsdk/client

Free: every endpoint, 1,000 requests a month, no card.

venues send0.42, written nine ways

  • Kalshi"0.4200"
  • Polymarket"[\"0.42\", \"0.58\"]"
  • Predict0.42
  • SX.Bet"42000000000000000000"
  • Hyperliquid"0.42"
  • AlphaArcade420000
  • ProphetX138
  • Limitless[42, 58]
  • Pred"42"

price

0.42

scale

probability_0_1

  • 9 venues: Kalshi, Polymarket, Predict, SX.Bet, Hyperliquid, AlphaArcade, ProphetX, Limitless, Pred

Dollar strings, JSON inside a string, 10^20 fixed point, cents, American odds: market detail returns every quote as a 0–1 probability, with bid, ask and last where the venue has them.

docs

Nine venues, one catalog

525,662 markets in GET /v1/markets on Oct 12, 2026

  • Kalshi

    117,145

    markets

  • Polymarket

    371,592

    markets

  • Predict

    16,152

    markets

  • SX.Bet

    11,370

    markets

  • Hyperliquid

    284

    markets

  • AlphaArcade

    1,659

    markets

  • ProphetX

    1,428

    markets

  • Limitless

    603

    markets

  • Pred

    5,429

    markets

01/catalog

Not just sports.

Politics, economics, crypto, finance, technology, weather and culture: every venue's markets in one row shape, filterable by provider and category. A cursor stays bound to one immutable snapshot, so pages never shift under you.

GET /v1/markets?category=politicspagination.total 58,069
  • Will the Democratic party win the House in 2028?

    kalshi:CONTROLH-2028-D

  • Will Trump recognize Somaliland before 2027?

    polymarket:1029715

  • Will the Democratic Party control the Senate after the 2026 Midterm elections?

    predict:12140

  • Presidential Election Winner 2028

    alpha-arcade:01K0HQDM64MEEWPTRWQ60HMTH8

Rows are examples from several venues. One request walks the venues in a fixed order, so add &provider= to start on one. Counts as of Oct 12, 2026.

02/market detail

Quotes you can reason about.

GET /v1/markets/{market_id} reads the venue live on every request and labels what it read: whether the book is tradeable, what the venue's timestamp measures, how fees are charged, and null wherever the venue doesn't say.

GET /v1/markets/kalshi:CHINAUSGDP-30200 · trimmed
{
"id": "kalshi:CHINAUSGDP-30",
"provider": "kalshi",
"title": "Will China overtake US GDP by 2030?",
"status": "open",
"outcomes": [
{ "name": "Yes", "price": 0.145, "bid": 0.13, "ask": 0.16 },
{ "name": "No", "price": 0.855, "bid": 0.84, "ask": 0.87 }
],
"pricing": {
1"availability": "live",
"source": "market_record",
"as_of": "2026-04-09T09:18:12.024186Z",
2"as_of_kind": "record_static",
"observed_at": "2026-10-12T17:42:57.523Z"
},
3"volume_24h_usd": null,
"volume_24h_contracts": 5.39,
"trading_fees": {
"availability": "published",
"taker": {
4"model": "quadratic",
"rate": 0.07,
"exponent": 1
},
"maker": {
"model": "none",
"rate": 0
}
}
}
  1. 1

    Tradeable, not just priced

    live means a two-sided book the venue treats as quoted. A lone side, a mark with no book behind it, or a book wider than the venue's own spread rule reads indicative instead.

  2. 2

    Timestamps say what they measure

    Kalshi's as_of is a record write that never moves while the market trades: six months old on this live book. record_static tells you to bound observed_at, when we read it, instead.

  3. 3

    Null, never a guess

    Kalshi counts contracts, not dollars, so the USD fields stay null and the contract counts sit beside them. Nothing is converted at a price we would have to invent.

  4. 4

    Fees as a formula

    fee = rate × contracts × P × (1 − P), per leg, from the series record — and Kalshi's per-event overrides when one is in force.

pricing.availability
live |indicative |partial |no_quotes |unavailable
pricing.as_of_kind
quote |record_refresh |record_static |unknown
trading_fees.taker.model
quadratic |min_price |notional |none

03/sports matching

One game. Seven venues. One event id.

The same game trades under different ids, names and dates on every venue. Matching merges them into canonical events with stable submarket keys, keeps each venue's own ids, and compares the rules that decide how each contract settles.

8 listings → 1 eventmoneyline · Oct 12, 2026
kalshi KXNFLGAME-26OCT15SEADEN-DEN ──┐
kalshi KXNFLGAME-26OCT15SEADEN-SEA ──┤
polymarket 4212356 ──┤
predict 1966227 ──┤
sxbet 0x9228…b384 ──┼──▶ nfl-sea-den-2026-10-15
prophetx 1700008795:219 ──┤ moneyline|full|winner
pred 0x9cad…:0x… ──┤ winner:sea · winner:den
limitless seahawks-vs-broncos-… ──┘

7 venues · 75 matched submarkets on this game · each venue keeps its own ids

rule_comparisonsinclude_rules=true
venuetieovertimepush
kalshihalf_payoutincludednot_applicable
polymarkethalf_payoutincludednot_applicable
predicthalf_payoutincludednot_applicable
limitlesshalf_payoutincludednot_applicable
predhalf_payoutunknownnot_applicable
prophetxvoidincludednot_applicable
sxbetvoidincludednot_applicable
comparisondifferentunverifiedequivalent

settlement_equivalence: "different" · evidence on every value

Stable event ids

nfl-sea-den-2026-10-15

League, away, home and the game's date in Eastern time, so a game keeps one key whatever date each venue files it under.

Lookup by any venue id

source_id=sxbet:L19431555

Market ids, slugs, event ids and outcome tokens from every matched venue, up to 100 per request, case-insensitive.

More than moneylines

spread|half:1|spread:jax|2.5

Spreads, totals, team totals, halves and quarters, and verified player props, each with a stable submarket key.

leagueKalshiPolymarketPredictSX.BetHyperliquidAlphaArcadeProphetXLimitlessPred
NBA···
WNBA·····
NHL···
MLB···
NFL

A filled square means the venue is mapped for that league; a game carries the venues that list it. are in the catalog and market detail but not matched. Every provider-native market, matched or not, stays available in /v1/markets.

04/endpoints

The whole surface, nine venues deep.

Ten read-only endpoints, one auth header, one error shape. Every one is on the free plan.

05/sdks

Typed clients, generated from the spec.

TypeScript, Python and Go clients are generated from the OpenAPI spec, so every field above is typed the moment it ships.

1import { PredictorSDKClient } from "@predictorsdk/client";
2 
3const client = new PredictorSDKClient({ token: "YOUR_API_KEY" });
4 
5// Every venue's economics markets, in one row shape.
6const page = await client.getMarkets({ category: "economics", limit: 5 });
7 
8// A row id is "{provider}:{native_id}", so it pipes straight into detail.
9const market = await client.getMarket({ marketId: page.data[0].id });
10 
11console.log(market.title, market.outcomes[0].price, market.pricing.availability);
12// Will China overtake US GDP by 2030? 0.145 live
  • Cursors, walked for you

    for await (const m of page)

    Every paginated call returns a pager; iterate it and the client follows the cursor and keeps your filters.

  • One error shape

    { "code": "ambiguous_identifier", … }

    Stable machine-readable codes on every error. An id two venues share answers 409 with both candidates, never a guess.

  • Retries and request ids

    X-Request-Id: req_…

    Clients retry 408, 429, 5xx and dropped connections. Every response carries an X-Request-Id, and rate-limit headers say when to back off.

  • Built for agents too

    llms.txt · openapi.yaml

    The docs ship as llms.txt and the full OpenAPI spec, the same one the SDKs are generated from.

06/get started

Ship against every venue this afternoon.

The free plan covers every endpoint at 1,000 requests a month, with no card. Paid plans add throughput, not features.