Event detail: every venue's prices
One event with every venue market, every outcome's quote, how outcomes match across venues, and the price gap for each matched outcome.
When to use it
- Show Kalshi and Polymarket prices for the same answer side by side.
- Get each outcome's
idfor price history and itsstreamids for the WebSocket. - Read the cross-venue
spreadsfor one event.
How to read it
markets[]has one entry per venue listing.markets[].outcomes[]are the answers on that venue.- Each outcome's
quotehas the price (probability), bid and ask, andfreshness. Quotes come from the venue's live feed when TPM has it (source: "live"), otherwise from the latest poll. - Outcomes with the same
match.group_idare the same answer on different venues. spreads[]gives, per matched outcome (outcome_keyequalsmatch.key), the cheapest venue to buy Yes, the best venue to sell it, and thegapbetween them.- Before treating two prices as one bet, check
comparisonandmatch.contract_compatibility. Onlyverifiedmeans a person checked the rules match.
Gaps are gross
gap is sell bid minus buy ask, before fees and order-book depth. A positive gap is a lead to check, not guaranteed profit.
/api/public/v1/events/{slug}API key requiredGet one event
The sample is trimmed to one outcome per venue; the real response lists every outcome.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
| slug | path | string | Yes | — | Event slug from /events. |
Request
curl -s 'https://api.thepredictionmarkets.com/api/public/v1/events/democratic-presidential-nominee-2028' \
-H 'X-API-Key: tpm_demo_key_authorized_2026'Response
Example 200 response. Values are illustrative and change over time.
{
"data": {
"id": "4d633d66-f3da-4f36-b04c-ce41b26bb13a",
"slug": "democratic-presidential-nominee-2028",
"title": "Democratic Presidential Nominee 2028",
"question": "Democratic Presidential Nominee 2028",
"category": "politics",
"status": "active",
"end_date": "2028-11-07T00:00:00Z",
"resolution": {
"outcome": null,
"summary": "Resolves Yes if the named individual wins and accepts the 2028 Democratic nomination for U.S. president.",
"resolved_at": null
},
"comparison": "comparable",
"volume": 1540934033.49,
"venues": [
"kalshi",
"polymarket"
],
"markets": [
{
"venue": "kalshi",
"market_id": "KXPRESNOMD-28",
"title": "Democratic Presidential Nominee 2028",
"url": "https://kalshi.com/markets/kxpresnomd",
"status": "active",
"event_slug": "democratic-presidential-nominee-2028",
"volume": 244696381.96,
"liquidity": null,
"end_date": "2028-11-07T00:00:00Z",
"last_seen_at": "2026-10-21T08:24:28Z",
"outcome_count": 41,
"outcomes": [
{
"id": "5c66f06e-dcac-44fa-93af-ba710d2a9ed2",
"title": "Gavin Newsom",
"contract_id": "KXPRESNOMD-28-GN",
"status": "active",
"volume": 11138438.36,
"probability_change_24h": null,
"quote": {
"probability": 0.16,
"best_bid": 0.16,
"best_ask": 0.17,
"spread": 0.01,
"source": "live",
"observed_at": "2026-10-21T08:38:56Z",
"age_seconds": 3,
"freshness": "live"
},
"stream": {
"provider": "kalshi",
"market_id": "KXPRESNOMD-28-GN",
"outcome_id": "yes"
},
"match": {
"group_id": "b5f0c3d2-6a1e-5f7b-9c2d-1e8a4f3b7d60",
"key": "candidate:gnew",
"state": "AUTO_MATCHED",
"contract_compatibility": "unverified"
}
}
],
"rules": null
},
{
"venue": "polymarket",
"market_id": "democratic-presidential-nominee-2028",
"title": "Democratic Presidential Nominee 2028",
"url": "https://polymarket.com/event/democratic-presidential-nominee-2028",
"status": "active",
"event_slug": "democratic-presidential-nominee-2028",
"volume": 1296237651.53,
"liquidity": 74355239.4,
"end_date": "2028-11-07T00:00:00Z",
"last_seen_at": "2026-10-21T08:37:22Z",
"outcome_count": 128,
"outcomes": [
{
"id": "e11fcb39-5832-455d-97df-7d25816b33f3",
"title": "Gavin Newsom",
"contract_id": "0x0f49db97f71c68b1e42a6d16e3de93d85dbf7d4148e3f018eb79e88554be9f75",
"status": "active",
"volume": 28018699.72,
"probability_change_24h": null,
"quote": {
"probability": 0.1635,
"best_bid": 0.163,
"best_ask": 0.164,
"spread": 0.001,
"source": "snapshot",
"observed_at": "2026-10-21T08:37:22Z",
"age_seconds": 94,
"freshness": "fresh"
},
"stream": {
"provider": "polymarket",
"market_id": "0x0f49db97f71c68b1e42a6d16e3de93d85dbf7d4148e3f018eb79e88554be9f75",
"outcome_id": "54533043819946592547517511176940999955633860128497669742211153063842200957669"
},
"match": {
"group_id": "b5f0c3d2-6a1e-5f7b-9c2d-1e8a4f3b7d60",
"key": "candidate:gnew",
"state": "AUTO_MATCHED",
"contract_compatibility": "unverified"
}
}
],
"rules": null
}
],
"spreads": [
{
"outcome_key": "candidate:acor",
"gap": 0.024,
"buy": {
"venue": "kalshi",
"price": 0.14
},
"sell": {
"venue": "polymarket",
"price": 0.164
}
},
{
"outcome_key": "candidate:gnew",
"gap": -0.004,
"buy": {
"venue": "polymarket",
"price": 0.164
},
"sell": {
"venue": "kalshi",
"price": 0.16
}
}
],
"web_url": "https://thepredictionmarkets.com/odds/democratic-presidential-nominee-2028"
}
}Response fields
| Field | Type | Description |
|---|---|---|
| id, slug, title | string | Event identity, as in /events. |
| question | string | null | The question in full, when it differs from the title. |
| category, status, end_date | string | null | As in /events. |
| resolution | object | {outcome, summary, resolved_at}. summary describes how it settles; outcome is set once resolved. |
| comparison | string | null | verified: venues list the same bet. comparable: similar, check the rules. Absent for one venue. |
| volume | number | null | Total volume across venues, US dollars. |
| venues | string[] | Venues listing it. |
| markets[] | Market[] | One per venue listing; fields as in markets. |
| markets[].outcomes[].id | string | TPM outcome id. Stable; use it for /history?outcome_id=. |
| markets[].outcomes[].title | string | The answer this outcome represents, e.g. Gavin Newsom or Yes. |
| markets[].outcomes[].contract_id | string | null | The venue's tradable contract: a Kalshi market ticker or a Polymarket condition id. Use it with /prices. |
| markets[].outcomes[].status | string | null | Venue status of the contract, e.g. active. |
| markets[].outcomes[].volume | number | null | Traded volume in US dollars, as the venue reports it. |
| markets[].outcomes[].probability_change_24h | number | null | Change in probability over 24 hours, when known. |
| markets[].outcomes[].quote.probability | number | null | The displayed price as a probability from 0 to 1, using the venue's own display rule. 0.16 means a 16% implied chance. |
| markets[].outcomes[].quote.best_bid | number | null | Highest price someone will pay for Yes right now. |
| markets[].outcomes[].quote.best_ask | number | null | Lowest price someone will sell Yes for right now. |
| markets[].outcomes[].quote.spread | number | null | best_ask - best_bid on this venue (not the cross-venue gap). |
| markets[].outcomes[].quote.source | "live" | "snapshot" | live: from the venue's WebSocket feed. snapshot: from TPM's REST poll of the venue. |
| markets[].outcomes[].quote.observed_at | string | null | When this price was last known to be current (UTC). |
| markets[].outcomes[].quote.age_seconds | integer | null | Seconds since observed_at. |
| markets[].outcomes[].quote.freshness | string | live, fresh, aging, stale or unknown. See freshness. |
| markets[].outcomes[].stream | object | null | {provider, market_id, outcome_id}: send these to subscribe on the WebSocket. |
| markets[].outcomes[].match.group_id | string | null | Outcomes with the same group_id on different venues are the same answer. |
| markets[].outcomes[].match.key | string | null | Readable outcome key, e.g. candidate:gnew or binary:yes. Joins with spreads[].outcome_key. |
| markets[].outcomes[].match.state | string | null | How the link was made, e.g. AUTO_MATCHED or MANUAL. |
| markets[].outcomes[].match.contract_compatibility | string | null | verified only when a person checked that both venues settle the same way; otherwise unverified. |
| spreads[].outcome_key | string | The matched outcome (match.key). |
| spreads[].gap | number | null | Sell bid minus buy ask across venues. Gross: before fees and depth. |
| spreads[].buy | {venue, price} | null | Cheapest venue to buy Yes (its ask). |
| spreads[].sell | {venue, price} | null | Best venue to sell Yes (its bid). |
| web_url | string | The event page on thepredictionmarkets.com. |
Errors
| HTTP | Code | When |
|---|---|---|
| 404 | not_found.event | No event has this slug. |
| 401 | auth.missing_key | No X-API-Key header was sent. |
| 401 | auth.invalid_key | The key is wrong or was revoked. |
| 429 | rate_limit.per_second | Too many requests this second. Wait for Retry-After. |
{
"error": {
"code": "not_found.event",
"message": "Event not found",
"request_id": "0f8969a6-0968-4d7c-9cbb-de379e8c19c4"
}
}All codes are listed on the errors page.
Try it
Runs a live request from your browser. Pre-filled with the shared demo key (5 requests per second for everyone); paste your own key for steadier results.
Press Send to run this request.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.