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/clientFree: 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.
docsNine 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.
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.
{"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
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
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
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
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.
kalshi KXNFLGAME-26OCT15SEADEN-DEN ──┐kalshi KXNFLGAME-26OCT15SEADEN-SEA ──┤polymarket 4212356 ──┤predict 1966227 ──┤sxbet 0x9228…b384 ──┼──▶ nfl-sea-den-2026-10-15prophetx 1700008795:219 ──┤ moneyline|full|winnerpred 0x9cad…:0x… ──┤ winner:sea · winner:denlimitless seahawks-vs-broncos-… ──┘
7 venues · 75 matched submarkets on this game · each venue keeps its own ids
| venue | tie | overtime | push |
|---|---|---|---|
| kalshi | half_payout | included | not_applicable |
| polymarket | half_payout | included | not_applicable |
| predict | half_payout | included | not_applicable |
| limitless | half_payout | included | not_applicable |
| pred | half_payout | unknown | not_applicable |
| prophetx | void | included | not_applicable |
| sxbet | void | included | not_applicable |
| comparison | different | unverified | equivalent |
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.
| league | Kalshi | Polymarket | Predict | SX.Bet | Hyperliquid | AlphaArcade | ProphetX | Limitless | Pred |
|---|---|---|---|---|---|---|---|---|---|
| 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.
Catalog
- GET/v1/marketsEvery market from all nine venues in one row shape, in every category. Filter by provider and category; cursors stay bound to one immutable snapshot, so pages never shift under you.
providercategorylimitcursor - GET/v1/categoriesThe ten canonical categories the catalog files markets under.
- GET/v1/plansThe plan catalog: allowances, rate limits and overage. No key required.
Market data
- GET/v1/markets/{market_id}One market read live from its venue: outcomes with bid, ask and last, liquidity and volume where published, trading fees, and what every timestamp means.
provider - GET/v1/events/{event_id}An event and its nested markets on any venue. A Kalshi sports ticker fans out to every sibling series in one call.
provider
Matching
- GET/v1/matching-markets/sportsCanonical NBA, WNBA, NHL, MLB and NFL events with every venue's matched markets, submarket keys, and the tie, overtime and push rules behind them.
leaguescheduled_dateparticipantinclude_submarketsinclude_rulesinclude_settled - GET/v1/matching-markets/sports/lookupThe canonical event behind any venue's market id, slug, event id or outcome token, up to 100 at a time.
event_idsource_id
Wallets & prices
- GET/v1/polymarket/wallet/positionsOpen Polymarket positions for a wallet, by proxy address or username.
addressusernamelimitcursor - GET/v1/polymarket/walletA Polymarket wallet's public profile, from a proxy or signer address.
addressusername - GET/v1/crypto-prices/binancePer-second Binance prices for any pair, newest first, through a time range.
currencystart_timeend_timecursor
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";23const client = new PredictorSDKClient({ token: "YOUR_API_KEY" });45// Every venue's economics markets, in one row shape.6const page = await client.getMarkets({ category: "economics", limit: 5 });78// A row id is "{provider}:{native_id}", so it pipes straight into detail.9const market = await client.getMarket({ marketId: page.data[0].id });1011console.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.