Skip to main content

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.

Unified prediction market model.

Coverage

ExchangeSourcedSyntheticOmitted
kalshi22825
polymarket321310
Sourced — value copied or transformed from a documented upstream field.
Synthetic — computed by OpenPX, not present upstream.
Omitted — upstream does not expose this concept.

Field crosswalk

Unified fieldTypekalshi sourcepolymarket sourceTransformNotes
idstringMarket.ticker (string)Market.conditionId (string)directpolymarket: 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_idstringcomputed{exchange}:{id}computed{exchange}:{id}syntheticComposite primary key, never sourced from upstream.
exchangestringcomputed — literal exchange identifier (“kalshi” or “polymarket”)computed — literal exchange identifier (“kalshi” or “polymarket”)synthetic
native_numeric_idstring?not exposedMarket.id (string)directkalshi: Kalshi has no separate numeric id surface.
group_idstring?Market.event_ticker (string)not exposeddirectpolymarket: Derived from the embedded events relation in the gamma response, not a flat field.
event_idstring?computed — canonical OpenPX event grouping computed at parse timecomputed — canonical OpenPX event grouping computed at parse timesynthetic
titlestringcomputed{yes_sub_title} | {no_sub_title}Market.question (string)synthetic / directkalshi: Composed from the spec-canonical short titles for each side of the binary contract. The deprecated title field is ignored.
questionstring?not exposedMarket.question (string)directkalshi: Kalshi does not expose a question form distinct from title.
descriptionstringMarket.rules_primary (string)Market.description (string)direct
rulesstring?Market.rules_secondary (string)not exposeddirect
slugstring?not exposedMarket.slug (string)direct
image_urlstring?not exposedMarket.image (string)direct
icon_urlstring?not exposedMarket.icon (string)direct
statusMarketStatusMarket.status (string)Market.active (boolean)enum_remapkalshi: 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_typeMarketTypeMarket.market_type (string)Market.marketType (string)enum_remapkalshi: binary | scalar → MarketType::Binary / MarketType::Scalar
accepting_ordersbooleancomputed — derived from status (accepts orders only when status is “active”)Market.acceptingOrders (boolean)synthetic / direct
can_close_earlyboolean?Market.can_close_early (boolean)not exposeddirect
resultstring?Market.result (string)not exposeddirectpolymarket: Polymarket markets settle on-chain; resolution surface is different.
open_timestring? (date-time)Market.open_time (string (date-time))Market.startDate (string (date-time)), fallback Market.startDateIsoparse_datetime / first_non_null
close_timestring? (date-time)Market.close_time (string (date-time))Market.endDate (string (date-time)), fallback Market.endDateIsoparse_datetime / first_non_null
created_atstring? (date-time)Market.created_time (string (date-time))Market.createdAt (string (date-time))parse_datetime
settlement_timestring? (date-time)Market.settlement_ts (string (date-time))not exposedparse_datetime
best_bidnumber? (double)Market.yes_bid_dollars (FixedPointDollars)Market.bestBid (number)fixed_point_dollars / directpolymarket: Polymarket already in [0,1] decimal.
best_asknumber? (double)Market.yes_ask_dollars (FixedPointDollars)Market.bestAsk (number)fixed_point_dollars / direct
last_trade_pricenumber? (double)Market.last_price_dollars (FixedPointDollars)Market.lastTradePrice (number)fixed_point_dollars / direct
previous_pricenumber? (double)Market.previous_price_dollars (FixedPointDollars)not exposedfixed_point_dollars
spreadnumber? (double)computed — best_ask - best_bid (computed)Market.spread (number)synthetic / direct
price_change_1hnumber? (double)not exposedMarket.oneHourPriceChange (number)direct
price_change_1dnumber? (double)not exposedMarket.oneDayPriceChange (number)direct
price_change_1wknumber? (double)not exposedMarket.oneWeekPriceChange (number)direct
price_change_1monumber? (double)not exposedMarket.oneMonthPriceChange (number)direct
tick_sizenumber? (double)not exposedMarket.orderPriceMinTickSize (number)directkalshi: Kalshi tick_size field is deprecated; tick info is in price_level_structure.
min_order_sizenumber? (double)not exposedMarket.orderMinSize (number)direct
price_level_structurestring?Market.price_level_structure (string)not exposeddirect
volumenumber (double)Market.volume_fp (FixedPointCount)Market.volumeNum (number)fixed_point_count / direct
volume_24hnumber? (double)Market.volume_24h_fp (FixedPointCount)Market.volume24hr (number)fixed_point_count / direct
volume_1wknumber? (double)not exposedMarket.volume1wk (number)direct
volume_1monumber? (double)not exposedMarket.volume1mo (number)direct
liquiditynumber? (double)not exposedMarket.liquidityNum (number)directkalshi: Kalshi’s liquidity_dollars field is deprecated and always returns “0.0000”.
open_interestnumber? (double)Market.open_interest_fp (FixedPointCount)not exposedfixed_point_count
notional_valuenumber? (double)Market.notional_value_dollars (FixedPointDollars)not exposedfixed_point_dollars
settlement_valuenumber? (double)Market.settlement_value_dollars (FixedPointDollars)not exposedfixed_point_dollars
outcomesarraycomputed — 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_pricesobjectcomputed{outcome → price} map computed from best_bid/best_askcomputed{outcome → price} map computed from best_bid/best_asksynthetic
outcome_tokensarraynot exposedcomputed — parsed from clobTokenIds JSON-encoded stringsynthetic
token_id_yesstring?not exposedcomputed — first element of parsed clobTokenIdssynthetic
token_id_nostring?not exposedcomputed — second element of parsed clobTokenIdssynthetic
condition_idstring?not exposedMarket.conditionId (string)direct
question_idstring?not exposedMarket.questionID (string)direct
neg_riskboolean?not exposedcomputed — read from gamma /markets response field negRisksyntheticpolymarket: 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_idstring?not exposedcomputed — read from gamma /markets response field negRiskMarketIDsyntheticpolymarket: Spec gap (2026-04-29): same pattern as neg_risk. Live API includes this field on Market; spec does not yet.
chain_idstring?not exposedcomputed — hardcoded “137” (Polygon mainnet)synthetic
denomination_tokenstring?not exposedMarket.denominationToken (string)direct
maker_fee_bpsnumber? (double)not exposedcomputed — parsed from feeSchedule.rate (replaces deprecated makerBaseFee)synthetic
taker_fee_bpsnumber? (double)not exposedcomputed — parsed from feeSchedule.rate (replaces deprecated takerBaseFee)synthetic

Source specs

Tables are auto-generated from schema/mappings/. CI fails on unresolved $refs and on type mismatches for transform: direct. Drift in upstream specs surfaces here on the daily refresh PR.