Markets
A Market is a binary YES/NO outcome within a pool. Each market represents a single proposition that either happens or does not. Users trade by buying or selling YES and NO shares in a market.
Market typesβ
Intotes supports two distinct market types, determined by the market_type field:
| Type | Value | Description |
|---|---|---|
| Orderbook | "orderbook" | Peer-to-peer matching. Prices are set by traders placing limit orders. The matching engine pairs buy and sell orders at compatible prices. |
| LMSR | "lmsr" | Automated Market Maker. Prices are derived from the LMSR cost function based on outstanding quantities. Every trade is against the AMM β no counterparty needed. |
Most markets on the platform use the LMSR type. Orderbook markets are used when deeper peer-to-peer price discovery is desired.
Key fieldsβ
| Field | Type | Description |
|---|---|---|
id | integer | Unique identifier. |
pool_id | integer | The pool this market belongs to. |
name | string | Display name (English), e.g., "Manchester City" or "Above $100k". |
name_ru | string | Display name (Russian). |
yes_probability | float (0-1) | Current probability of the YES outcome. Displayed on the UI and updated by workers/trades. |
market_type | string | "orderbook" or "lmsr". |
volume | integer | Total trading volume in cents (sum of all trade amounts). |
paused | boolean | When true, trading is temporarily halted. |
resolved | boolean | When true, the market has been settled. |
winning_outcome | string | null | "YES" or "NO" after resolution. Null while unresolved. |
outcome_index | integer | Position of this market within its pool (0-based). Used during resolution: YES wins only when pool.won_side == outcome_index. |
image_url | string | Optional image URL for the market. |
created_at | timestamp | When the market was created. |
Custom outcome namesβ
By default, a market's two outcomes are labeled "YES" and "NO". For clarity, markets can define custom names:
| Field | Description | Example |
|---|---|---|
yes_name | Custom label for the YES outcome. | "Above $100k" |
no_name | Custom label for the NO outcome. | "Below $100k" |
yes_name_ru | Russian label for YES. | |
no_name_ru | Russian label for NO. |
These names are displayed in the trading UI instead of generic YES/NO when present.
LMSR-specific fieldsβ
Markets with market_type: "lmsr" have additional fields that drive the AMM pricing:
| Field | Type | Description |
|---|---|---|
b | integer | null | Liquidity parameter in cents. Controls price sensitivity β higher b means prices move less per trade. Null for orderbook markets. |
q_yes | integer | Current outstanding quantity of YES shares (in cents). |
q_no | integer | Current outstanding quantity of NO shares (in cents). |
The LMSR cost function uses these values to compute prices:
C(q) = b * ln(e^(q_yes/b) + e^(q_no/b))
The YES probability at any moment is:
P(YES) = e^(q_yes/b) / (e^(q_yes/b) + e^(q_no/b))
When a user buys YES shares, q_yes increases, pushing the YES price up and the NO price down.
See LMSR AMM for the full pricing model.
Polymarket syncβ
Markets can be linked to Polymarket outcomes for real-time price synchronization:
| Field | Description |
|---|---|
polymarket_token_id | CLOB token ID of the corresponding Polymarket outcome. When set, a background worker syncs the YES probability via WebSocket. |
Market statesβ
A market progresses through several states during its lifecycle:
Activeβ
paused: false,resolved: false- Trading is open. Users can place orders and execute trades.
- Prices update with each trade (LMSR) or order match (orderbook).
Pausedβ
paused: true,resolved: false- Trading is temporarily halted (e.g., during a live sport event break or pending a result announcement).
- Existing orders remain in the book but no new trades execute.
Resolvedβ
resolved: true,winning_outcomeis set to"YES"or"NO"- The outcome is known. All positions are settled:
- Winners receive 10,000 per share (in cents).
- Losers receive 0.
- No further trading is possible.
Markets within a poolβ
A pool can contain multiple markets. For a sport event with a draw option (has_draw: true), the typical structure is:
| Market | outcome_index | Example name |
|---|---|---|
| Market 0 | 0 | "Team A wins" |
| Market 1 | 1 | "Draw" |
| Market 2 | 2 | "Team B wins" |
When the pool resolves, pool.won_side is set to the index of the winning market. For that market, YES holders win. For all other markets in the pool, NO holders win.
For a simple binary pool (e.g., "Will ETH be above $3,500?"), there is a single market where YES means the proposition is true and NO means it is false.
Base probabilityβ
Each market also tracks a base_yes_probability (not exposed in the API). This is the baseline probability around which the probability drift worker operates. The drift worker introduces small random movements to simulate market activity, but keeps yes_probability bounded around this baseline.