> ## 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.

# Event mapping

> How each upstream exchange schema maps to OpenPX Event.

*A grouping of related markets — one Kalshi event\_ticker or one Polymarket event slug.*

Every field is one of three entry types — **direct** (taken from upstream), **synthetic** (computed by OpenPX), or **omitted** (not exposed upstream).

## Coverage

| Exchange   | Direct | Synthetic | Omitted |
| ---------- | ------ | --------- | ------- |
| kalshi     | 7      | 1         | 6       |
| polymarket | 12     | 2         | 0       |

## Field crosswalk

| Unified field        | Type                | kalshi source                  | polymarket source           | Notes                                                                                                                                                                                                   |
| -------------------- | ------------------- | ------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ticker`             | string              | `EventData.event_ticker`       | `Event.slug`                | **kalshi:** Native Kalshi event ticker. **polymarket:** Polymarket event slug; numeric id lives in `numeric_id`.                                                                                        |
| `numeric_id`         | string?             | *omitted*                      | `Event.id`                  | **kalshi:** Kalshi has no separate numeric event id. **polymarket:** Polymarket numeric event id.                                                                                                       |
| `title`              | string              | `EventData.title`              | `Event.title`               | **kalshi:** Kalshi event title. **polymarket:** Polymarket event title.                                                                                                                                 |
| `description`        | string?             | `EventData.sub_title`          | `Event.description`         | **kalshi:** Kalshi `sub_title` carries the disambiguating prose; empty strings become null. **polymarket:** Polymarket event description.                                                               |
| `category`           | string?             | *omitted*                      | `Event.category`            | **kalshi:** Kalshi events have no category; the category lives on the parent Series. **polymarket:** Polymarket event category.                                                                         |
| `series_ticker`      | string?             | `EventData.series_ticker`      | *synthetic*                 | **kalshi:** Native Kalshi series ticker. **polymarket:** Read from the embedded `series[0].ticker` (falls back to `series[0].slug`).                                                                    |
| `market_tickers`     | array               | *synthetic*                    | *synthetic*                 | **kalshi:** Read from the nested `markets[*].ticker` when `with_nested_markets=true`. **polymarket:** Read from the embedded `markets[*].slug`.                                                         |
| `status`             | string?             | *omitted*                      | `Event.closed`              | **kalshi:** Kalshi has no event-level status; lifecycle is per-market. **polymarket:** Derived `closed`/`open` string from the boolean `closed` flag.                                                   |
| `start_ts`           | string? (date-time) | *omitted*                      | `Event.startDate`           | **kalshi:** Kalshi events expose only `strike_date`, no separate start. **polymarket:** ISO 8601 string parsed to UTC.                                                                                  |
| `end_ts`             | string? (date-time) | `EventData.strike_date`        | `Event.endDate`             | **kalshi:** Kalshi `strike_date` is the resolution time. **polymarket:** ISO 8601 string parsed to UTC.                                                                                                 |
| `last_updated_ts`    | string? (date-time) | `EventData.last_updated_ts`    | `Event.updatedAt`           | **kalshi:** RFC3339 string parsed to UTC. **polymarket:** ISO 8601 string parsed to UTC.                                                                                                                |
| `volume`             | number? (double)    | *omitted*                      | `Event.volume`              | **kalshi:** Kalshi does not aggregate volume at the event level. **polymarket:** Polymarket event lifetime volume in USD.                                                                               |
| `open_interest`      | number? (double)    | *omitted*                      | `openInterest` *(spec gap)* | **kalshi:** Kalshi does not aggregate open interest at the event level. **polymarket:** Spec gap: live event payloads return a flat `openInterest`, but the gamma OpenAPI types only `openInterestAmm`. |
| `mutually_exclusive` | boolean?            | `EventData.mutually_exclusive` | `Event.negRisk`             | **kalshi:** True when only one child market resolves YES (e.g. races). **polymarket:** `negRisk` flag carries the same semantics for pick-one-of-N events.                                              |

## Source specs

* **kalshi** · [`schema/upstream/kalshi.openapi.yaml`](https://github.com/openpx-trade/openpx/blob/main/schema/upstream/kalshi.openapi.yaml)
* **polymarket** · [`schema/upstream/polymarket-gamma.openapi.yaml`](https://github.com/openpx-trade/openpx/blob/main/schema/upstream/polymarket-gamma.openapi.yaml)

> Tables are auto-generated from `schema/mappings/`. CI fails if any `direct` ref no longer resolves in the cached upstream spec; the daily upstream-refresh PR surfaces drift here.
