Events and Pools
Intotes organizes predictions into a two-level hierarchy: Events contain one or more Pools, and each Pool contains binary markets. This page explains both concepts and how they relate.
Eventsβ
An Event is the top-level container. It represents a real-world occurrence that users can predict on β a football match, a crypto price target, a political election, etc.
Key fieldsβ
| Field | Type | Description |
|---|---|---|
id | integer | Unique identifier. |
name | string | Display name (English). |
name_ru | string | Display name (Russian). |
tags | string[] | Categorization tags (e.g. ["football", "premier-league"]). |
image_url | string | null | Cover image for the event card. |
versus_images | string[] | Two participant icon URLs (sport events). |
versus_names | string[] | Two participant names (sport events). |
has_draw | boolean | Whether a draw outcome exists (sport events with three-way markets). |
status | string | Computed lifecycle state β see below. |
is_active | boolean | When false, the event is hidden from feeds, search, and direct links. The creator can still see it in "my events". |
is_loop_event | boolean | Whether the event recreates itself on a recurring schedule (e.g., crypto price cycles). |
main_pool_id | integer | null | The pool displayed in the event feed card β see below. |
created_at | timestamp | When the event was created. |
closed_at | timestamp | null | When the event was closed. Null while still active. |
Event statusβ
Status is a computed field derived from the event's pools:
| Status | Meaning |
|---|---|
"new" | The event has not started yet. All pools are still before their live_at time. |
"started" | At least one pool has started but the event has not been closed. |
"paid" | The event is closed and all payouts have been settled (closed_at is set). |
Loop eventsβ
A loop event is an event that automatically recreates itself on a fixed interval. This is used for recurring crypto price predictions (e.g., "Will ETH be above $3,500 in 1 hour?").
Loop-specific fields:
| Field | Description |
|---|---|
loop_interval_minutes | Time between cycle recreations (e.g., 60 for hourly). |
next_recreate_at | When the current cycle ends and a new one is created. |
loop_template_event_id | ID of the original template event that stores the configuration. |
When a loop cycle closes, the system resolves all positions, then creates a fresh event from the template with updated parameters (base price, probabilities, token IDs).
Additional fieldsβ
fixture_id/fixture_sportβ Link to an external sports data provider (API-Sports) for live score updates.polymarket_event_urlβ URL/slug used to fetch and sync odds from Polymarket.pinned_until/pin_orderβ Controls pinning the event to the top of the feed.
Poolsβ
A Pool is a question within an event. Each pool contains one or more binary markets (YES/NO outcomes).
For example, a football match event might have three pools:
- "Match winner" (with markets for Team A, Draw, Team B)
- "Total goals over 2.5"
- "Both teams to score"
Key fieldsβ
| Field | Type | Description |
|---|---|---|
id | integer | Unique identifier. |
name | string | The question text (English). |
name_ru | string | The question text (Russian). |
rules | string | Description of how the winning outcome is determined. |
won_side | integer | null | Index of the winning market after resolution. Null while unresolved. |
finish_at | timestamp | null | Deadline after which no more orders can be placed. If null, the pool closes only via manual action. |
live_at | timestamp | null | When the pool goes live and trading opens. |
margin | integer | Total margin for the pool (in cents). |
score | string | null | Current score for live sport events (e.g., "2-1"). |
Computed fields (not stored in DB)β
sides/sides_ruβ Market names extracted from the pool's markets.volumesβ Trading volume per market.totalPoolβ Sum of all market volumes.
The main_pool_id conceptβ
Every event has an optional main_pool_id that points to one of its pools. This is the pool whose markets are displayed on the event card in the feed. When a user sees an event in the list, the probabilities, prices, and volumes shown come from this main pool.
If main_pool_id is not set, the frontend typically uses the first pool.
Pool metadataβ
Each pool can carry a metadata JSON object with additional configuration. This is especially important for event creation and loop events.
Core metadata fieldsβ
| Field | Description |
|---|---|
market_names | Custom names for each market (e.g., ["Will PSG win?", "Will match end in a draw?"]). |
market_names_ru | Russian versions of market names. |
market_probabilities | Initial probabilities (0-1) for each market, used instead of volumes. |
market_images | Image URL for each market. |
market_yes_names / market_no_names | Custom YES/NO outcome labels per market (e.g., "Above $100k" / "Below $100k"). |
LMSR configurationβ
| Field | Description |
|---|---|
lmsr_b_kopecks | Per-pool LMSR liquidity parameter b in cents. Determines how much prices move per trade. If not set, the global default is used. |
Polymarket syncβ
| Field | Description |
|---|---|
polymarket_token_ids | Array of Polymarket CLOB token IDs mapped to each market, used for real-time price syncing via WebSocket. |
Crypto asset trackingβ
| Field | Description |
|---|---|
asset_symbol | Tracked asset symbol (e.g., "BTCUSDT"). |
asset_base_price | The "price to beat" set at event creation. |
asset_close_price | The asset price at the moment the cycle was closed. |
Loop cycle fieldsβ
When closing a loop cycle, the system writes next_* fields onto the template pool to configure the upcoming cycle:
next_asset_base_priceβ Base price for the new cycle.next_market_probabilitiesβ Initial probabilities for the new cycle's markets.next_market_names,next_market_names_ru,next_market_imagesβ Structure of the next cycle's markets.next_polymarket_token_idsβ Token IDs for the next cycle.
These are read by the recreation worker and applied to the newly created pool.
Relationshipsβ
Event (1)
βββ Pool (1..N)
β βββ Market (1..N) β binary YES/NO outcomes
β βββ metadata β configuration, probabilities, asset tracking
βββ main_pool_id βββββββββ one of the Pools above
An event always has at least one pool, and each pool always has at least one market. The typical structure for a sport event with a draw option is one pool with three markets (Team A wins, Draw, Team B wins).