Unified prediction market model.Documentation Index
Fetch the complete documentation index at: https://docs.openpx.trade/llms.txt
Use this file to discover all available pages before exploring further.
Coverage
| Exchange | Sourced | Synthetic | Omitted |
|---|---|---|---|
| kalshi | 22 | 8 | 25 |
| polymarket | 32 | 13 | 10 |
Synthetic — computed by OpenPX, not present upstream.
Omitted — upstream does not expose this concept.
Field crosswalk
| Unified field | Type | kalshi source | polymarket source | Transform | Notes |
|---|---|---|---|---|---|
id | string | Market.ticker (string) | Market.conditionId (string) | direct | polymarket: Polymarket also exposes a numeric id; conditionId is the on-chain identifier and is what trades reference. Numeric id is mapped to native_numeric_id for callers that need REST-only deep links. |
openpx_id | string | computed — {exchange}:{id} | computed — {exchange}:{id} | synthetic | Composite primary key, never sourced from upstream. |
exchange | string | computed — literal exchange identifier (“kalshi” or “polymarket”) | computed — literal exchange identifier (“kalshi” or “polymarket”) | synthetic | |
native_numeric_id | string? | not exposed | Market.id (string) | direct | kalshi: Kalshi has no separate numeric id surface. |
group_id | string? | Market.event_ticker (string) | not exposed | direct | polymarket: Derived from the embedded events relation in the gamma response, not a flat field. |
event_id | string? | computed — canonical OpenPX event grouping computed at parse time | computed — canonical OpenPX event grouping computed at parse time | synthetic | |
title | string | computed — {yes_sub_title} | {no_sub_title} | Market.question (string) | synthetic / direct | kalshi: Composed from the spec-canonical short titles for each side of the binary contract. The deprecated title field is ignored. |
question | string? | not exposed | Market.question (string) | direct | kalshi: Kalshi does not expose a question form distinct from title. |
description | string | Market.rules_primary (string) | Market.description (string) | direct | |
rules | string? | Market.rules_secondary (string) | not exposed | direct | |
slug | string? | not exposed | Market.slug (string) | direct | |
image_url | string? | not exposed | Market.image (string) | direct | |
icon_url | string? | not exposed | Market.icon (string) | direct | |
status | MarketStatus | Market.status (string) | Market.active (boolean) | enum_remap | kalshi: Kalshi values: initialized, inactive, active, closed, determined, disputed, amended, finalized → unified MarketStatus. polymarket: Polymarket exposes active, closed, archived as booleans; combined into unified MarketStatus enum. |
market_type | MarketType | Market.market_type (string) | Market.marketType (string) | enum_remap | kalshi: binary | scalar → MarketType::Binary / MarketType::Scalar |
accepting_orders | boolean | computed — derived from status (accepts orders only when status is “active”) | Market.acceptingOrders (boolean) | synthetic / direct | |
can_close_early | boolean? | Market.can_close_early (boolean) | not exposed | direct | |
result | string? | Market.result (string) | not exposed | direct | polymarket: Polymarket markets settle on-chain; resolution surface is different. |
open_time | string? (date-time) | Market.open_time (string (date-time)) | Market.startDate (string (date-time)), fallback Market.startDateIso | parse_datetime / first_non_null | |
close_time | string? (date-time) | Market.close_time (string (date-time)) | Market.endDate (string (date-time)), fallback Market.endDateIso | parse_datetime / first_non_null | |
created_at | string? (date-time) | Market.created_time (string (date-time)) | Market.createdAt (string (date-time)) | parse_datetime | |
settlement_time | string? (date-time) | Market.settlement_ts (string (date-time)) | not exposed | parse_datetime | |
best_bid | number? (double) | Market.yes_bid_dollars (FixedPointDollars) | Market.bestBid (number) | fixed_point_dollars / direct | polymarket: Polymarket already in [0,1] decimal. |
best_ask | number? (double) | Market.yes_ask_dollars (FixedPointDollars) | Market.bestAsk (number) | fixed_point_dollars / direct | |
last_trade_price | number? (double) | Market.last_price_dollars (FixedPointDollars) | Market.lastTradePrice (number) | fixed_point_dollars / direct | |
previous_price | number? (double) | Market.previous_price_dollars (FixedPointDollars) | not exposed | fixed_point_dollars | |
spread | number? (double) | computed — best_ask - best_bid (computed) | Market.spread (number) | synthetic / direct | |
price_change_1h | number? (double) | not exposed | Market.oneHourPriceChange (number) | direct | |
price_change_1d | number? (double) | not exposed | Market.oneDayPriceChange (number) | direct | |
price_change_1wk | number? (double) | not exposed | Market.oneWeekPriceChange (number) | direct | |
price_change_1mo | number? (double) | not exposed | Market.oneMonthPriceChange (number) | direct | |
tick_size | number? (double) | not exposed | Market.orderPriceMinTickSize (number) | direct | kalshi: Kalshi tick_size field is deprecated; tick info is in price_level_structure. |
min_order_size | number? (double) | not exposed | Market.orderMinSize (number) | direct | |
price_level_structure | string? | Market.price_level_structure (string) | not exposed | direct | |
volume | number (double) | Market.volume_fp (FixedPointCount) | Market.volumeNum (number) | fixed_point_count / direct | |
volume_24h | number? (double) | Market.volume_24h_fp (FixedPointCount) | Market.volume24hr (number) | fixed_point_count / direct | |
volume_1wk | number? (double) | not exposed | Market.volume1wk (number) | direct | |
volume_1mo | number? (double) | not exposed | Market.volume1mo (number) | direct | |
liquidity | number? (double) | not exposed | Market.liquidityNum (number) | direct | kalshi: Kalshi’s liquidity_dollars field is deprecated and always returns “0.0000”. |
open_interest | number? (double) | Market.open_interest_fp (FixedPointCount) | not exposed | fixed_point_count | |
notional_value | number? (double) | Market.notional_value_dollars (FixedPointDollars) | not exposed | fixed_point_dollars | |
settlement_value | number? (double) | Market.settlement_value_dollars (FixedPointDollars) | not exposed | fixed_point_dollars | |
outcomes | array | computed — derived from market_type — Binary → [“Yes”,“No”], Scalar derived from strike fields. | computed — derived from market_type — Binary → [“Yes”,“No”], Scalar derived from strike fields. | synthetic | |
outcome_prices | object | computed — {outcome → price} map computed from best_bid/best_ask | computed — {outcome → price} map computed from best_bid/best_ask | synthetic | |
outcome_tokens | array | not exposed | computed — parsed from clobTokenIds JSON-encoded string | synthetic | |
token_id_yes | string? | not exposed | computed — first element of parsed clobTokenIds | synthetic | |
token_id_no | string? | not exposed | computed — second element of parsed clobTokenIds | synthetic | |
condition_id | string? | not exposed | Market.conditionId (string) | direct | |
question_id | string? | not exposed | Market.questionID (string) | direct | |
neg_risk | boolean? | not exposed | computed — read from gamma /markets response field negRisk | synthetic | polymarket: Spec gap (2026-04-29): the gamma OpenAPI defines negRisk only on Event, but the live /markets response includes it on each market object. Normalizer reads it directly. Re-check upstream spec on each daily refresh — when Polymarket adds it to Market properties, replace synthetic with a ref: here. |
neg_risk_market_id | string? | not exposed | computed — read from gamma /markets response field negRiskMarketID | synthetic | polymarket: Spec gap (2026-04-29): same pattern as neg_risk. Live API includes this field on Market; spec does not yet. |
chain_id | string? | not exposed | computed — hardcoded “137” (Polygon mainnet) | synthetic | |
denomination_token | string? | not exposed | Market.denominationToken (string) | direct | |
maker_fee_bps | number? (double) | not exposed | computed — parsed from feeSchedule.rate (replaces deprecated makerBaseFee) | synthetic | |
taker_fee_bps | number? (double) | not exposed | computed — parsed from feeSchedule.rate (replaces deprecated takerBaseFee) | synthetic |
Source specs
- kalshi ·
schema/upstream/kalshi.openapi.yaml - polymarket ·
schema/upstream/polymarket-gamma.openapi.yaml
Tables are auto-generated fromschema/mappings/. CI fails on unresolved $refs and on type mismatches fortransform: direct. Drift in upstream specs surfaces here on the daily refresh PR.

