Core concepts: events, markets, outcomes and venues
Prediction markets let people trade on the answer to a question. Kalshi and Polymarket name things differently; TPM gives them one vocabulary. Here is every term the API uses, explained once.
At a glance
| Term | What it is | Kalshi example | Polymarket example |
|---|---|---|---|
| Event | One real-world question, grouped across venues | TPM slug democratic-presidential-nominee-2028 | The same TPM slug |
| Venue | The exchange | kalshi | polymarket |
| Market | A venue's listing for the question (market_id) | Event ticker KXPRESNOMD-28 | Event slug democratic-presidential-nominee-2028 |
| Outcome | One possible answer (id, title) | Gavin Newsom | Gavin Newsom |
| Contract | The tradable thing behind an outcome (contract_id) | Market ticker KXPRESNOMD-28-GN | Condition id 0x0f49db97… |
| Quote | The current price of an outcome | 0.16 | 0.1635 |
Event
An event is one real-world question, such as Democratic Presidential Nominee 2028 or Fed decision in December. TPM groups each venue's listing for the same question under one event with a readable slug. Find events with /events and read one with /events/{slug}.
comparison on an event says how alike the venues' listings are: verified (the same bet) or comparable (similar; check the rules). It is absent when only one venue lists the event.
Venue
A venue is an exchange where contracts trade. v1 covers kalshi (a US-regulated exchange) and polymarket. Venue names appear as venue on markets and as provider in WebSocket ids.
Market
A market is one venue's listing for an event. Its market_id is the venue's own id: a Kalshi event ticker (KXPRESNOMD-28) or a Polymarket event slug (democratic-presidential-nominee-2028). One TPM event usually has one market per venue. List markets with /markets.
Watch the naming
Kalshi calls each tradable line a "market", and Polymarket calls its listing an "event". TPM uses market for the venue listing and contract for the tradable line, on both venues.
Outcome and contract
An outcome is one possible answer, such as Gavin Newsom, or Yes on a yes/no question. Each outcome has a stable TPM id and a contract_id: the venue's tradable contract. That is a Kalshi market ticker (KXPRESNOMD-28-GN) or a Polymarket condition id (0x0f49db97…).
Join contract_id to the venue name for bulk prices, e.g. kalshi:KXPRESNOMD-28-GN in /prices.
Quote and price
A quote is the current price of an outcome. Prices are probabilities from 0 to 1. A contract pays $1 if its answer happens, so a price of 0.16 costs 16 cents and implies a 16% chance.
probability: the price the venue displays.best_bid: the most a buyer will pay now.best_ask: the least a seller will accept now.freshness: how current the quote is. See freshness.
Cross-venue matching
TPM links the same answer across venues. Outcomes on different venues with the same match.group_id are the same answer. match.contract_compatibility is verified only when a person checked that both contracts settle the same way. Venues can word rules differently, so read both before treating two prices as one bet.
To go from a venue link or id to the other venue, use /matches.
Gap (cross-venue spread)
A gap is how much more one venue pays for Yes (its bid) than the other venue charges (its ask), in probability points. A gap of 0.024 means you could buy at 0.14 on one venue and sell at 0.164 on the other. Gaps are gross: before fees and before checking how much size the order books hold. See /spreads.
Stream ids
Every outcome carries stream: {provider, market_id, outcome_id}. These are the ids the WebSocket uses. For Kalshi they are the market ticker and yes; for Polymarket, the condition id and the CLOB token id.
Related
Build with TPM
Get your free API key
One key gives you Kalshi and Polymarket events, prices with freshness, price history, cross-venue gaps and the live quotes WebSocket.