API reference
List and search events
Search and filter events: real-world questions grouped across Kalshi and Polymarket. Each row has the leading outcome's price.
When to use it
- Find the
slugfor an event, then call/events/{slug}for every outcome's price. - Build a browse or search page: filter by
category,venueorclosing_within_days. - Rank events by
volume,trendingorprobability_change.
Rows only include the leading outcome. For every outcome on every venue, fetch the event detail.
GET
/api/public/v1/eventsAPI key requiredList events
Returns one page of events, sorted by trending unless you choose another sort.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
| q | query | string | No | — | Search event titles, e.g. fed rate or nba champion. |
| category | query | string | No | — | A category slug from /categories, e.g. politics. |
| venue | query | "kalshi" | "polymarket" | No | — | Only events listed on this venue. |
| status | query | string | No | active | active, trading (a venue still trades it), closed, resolved or all. |
| tag | query | string | No | — | Comma-separated topic tags. |
| closing_within_days | query | 1 | 7 | 30 | No | — | Only events closing within 1, 7 or 30 days. |
| sort | query | string | No | trending | trending, volume, probability_change, end_date or created_at. |
| order | query | "asc" | "desc" | No | desc | Sort direction. |
| limit | query | integer | No | 50 | Rows per page, 1 to 200. |
| cursor | query | string | No | — | The pagination.next_cursor from the previous page. Keep the other filters the same. See pagination. |
Request
Request
curl -s 'https://api.thepredictionmarkets.com/api/public/v1/events?q=nominee&limit=1' \
-H 'X-API-Key: tpm_demo_key_authorized_2026'Response
Example 200 response. Values are illustrative and change over time.
200 OK
{
"data": [
{
"id": "4d633d66-f3da-4f36-b04c-ce41b26bb13a",
"slug": "democratic-presidential-nominee-2028",
"title": "Democratic Presidential Nominee 2028",
"category": "politics",
"status": "active",
"trading_state": "trading",
"end_date": "2028-11-07T00:00:00Z",
"venues": [
"kalshi",
"polymarket"
],
"outcome_count": 128,
"leading_outcome": {
"title": "Alexandria Ocasio-Cortez",
"probability": 0.1645,
"change_24h": null
},
"volume": 1540934033.49,
"volume_24h": 541492.33,
"liquidity": 74355239.4,
"freshness": {
"state": "fresh",
"age_seconds": 94,
"observed_at": "2026-10-21T08:37:22Z"
},
"web_url": "https://thepredictionmarkets.com/odds/democratic-presidential-nominee-2028"
}
],
"pagination": {
"limit": 1,
"has_more": true,
"next_cursor": "eyJvIjoxfQ"
}
}Response fields
| Field | Type | Description |
|---|---|---|
| id | string | TPM event id. |
| slug | string | Readable id. Use it with /events/{slug}. |
| title | string | Event title. |
| category | string | null | Category slug. |
| status | string | null | TPM status, e.g. active or resolved. |
| trading_state | string | null | trading while a venue still trades it. |
| end_date | string | null | Scheduled close (UTC). |
| venues | string[] | Venues that list it: kalshi, polymarket or both. |
| outcome_count | integer | null | Number of outcomes. |
| leading_outcome | object | {title, probability, change_24h} of the most likely outcome. |
| volume | number | null | Total traded volume in US dollars across venues. |
| volume_24h | number | null | Volume in the last 24 hours. |
| liquidity | number | null | Order-book liquidity in US dollars. |
| freshness | object | {state, age_seconds, observed_at} for the listing data. state is fresh, aging, stale or unknown. |
| web_url | string | The event page on thepredictionmarkets.com. |
| pagination | object | {limit, has_more, next_cursor}. See pagination. |
Errors
| HTTP | Code | When |
|---|---|---|
| 400 | validation.invalid_parameter | A filter has a bad value, e.g. limit=500. |
| 400 | validation.invalid_cursor | The cursor is malformed or was made with other filters. |
| 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. |
400 validation.invalid_parameter
{
"error": {
"code": "validation.invalid_parameter",
"message": "limit: Input should be less than or equal to 200",
"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.
HTTP: —Time: —Rows: —Remaining this second: —Request: —
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.