Kalshi API endpoint
Lists Kalshi events, up to `limit` rows (default 25, max 200), continued with `cursor`. Filter by `series_ticker`, `category`, `status` (`open`, `closed` or `settled`), `min_close_ts` and `min_updated_ts`. `with_nested_markets` adds each event's markets. Each event has its ticker, title, category and strike period. A `cursor` is returned when more rows exist.
/kalshi/eventsPath parameters: none.
Query parameters:
limit: optional integer. Default: 25; maximum: 200.cursor: optional pagination cursor from a previous Kalshi response.series_ticker: optional Kalshi series ticker filter.category: optional Kalshi category filter.status: optional event status filter. Allowed values: open, closed, settled.with_nested_markets: optional boolean. Includes nested market rows when supported upstream.with_milestones: optional boolean. Passes through Kalshi's milestone expansion request; milestone fields are not currently normalized.min_close_ts: optional minimum event close Unix timestamp in seconds.min_updated_ts: optional minimum event update Unix timestamp in seconds.Notable response behavior:
data.cursor is present when Kalshi returns a next-page cursor.status, min_close_ts, or min_updated_ts values return invalid-parameter errors before upstream IO.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| event_ticker | 20 | “KXELONMARS-99” and 19 other values |
| series_ticker | 20 | “KXELONMARS” and 18 other values |
| title | 20 | “Will Elon Musk visit Mars in his lifetime?” and 19 other values |
| sub_title | 20 | “Before 2099” and 11 other values |
| category | 20 | Elections (7), Politics (4), Science and Technology (3) and 3 more |
| last_updated | 20 | 2026-08-27 to 2026-10-09 |
| mutually_exclusive | 10 | true in 10 of 10 |
| collateral_return_type | 10 | MECNET in all 10 |
| strike_period | 1 | “custom” |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| limit | integer | No | Rows to return, default 25, max 200 | ||
| cursor | string | No | Pagination cursor from a previous Kalshi response | ||
| series_ticker | string | No | Kalshi series ticker filter | ||
| category | string | No | Kalshi category filter | ||
| status | string | No | Event status filter Allowed values: open, closed, settled. | ||
| with_nested_markets | boolean | No | Include nested market rows when supported upstream | ||
| with_milestones | boolean | No | Include event milestones when supported upstream | ||
| min_close_ts | integer | No | Minimum event close Unix timestamp in seconds | ||
| min_updated_ts | integer | No | Minimum event update Unix timestamp in seconds | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/kalshi/events?limit=10&status=open&with_nested_markets=true&with_milestones=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"limit": 3,
"cursor": "next",
"source_url": "https://external-api.kalshi.com/trade-api/v2/events?limit=3",
"fetched_at": "2026-06-07T14:00:00Z",
"events": [
{
"event_ticker": "KXELONMARS-99",
"series_ticker": "KXELONMARS",
"title": "Will Elon Musk visit Mars in his lifetime?",
"sub_title": "Before 2099",
"category": "World"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/kalshi.eventsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | kalshi.EventsResponse | No | ||||
| data.cursor | string | No | Cursor to pass in the next request to get the following page. Omitted when Kalshi returns none. | |||
| data.events | array | No | Kalshi events on this page. | |||
| data.events[].available_on_brokers | boolean | No | false | Whether the event's markets can be traded through Kalshi's broker partners. | ||
| data.events[].category | string | No | World | Kalshi category of the event, such as `World`. | ||
| data.events[].collateral_return_type | string | No | MECNET | Collateral return type Kalshi assigns to the event, such as `MECNET`. | ||
| data.events[].event_ticker | string | No | KXELONMARS-99 | Kalshi ticker that identifies the event. | ||
| data.events[].last_updated | string | No | 2026-05-10T00:33:53Z | Time the event was last updated, in UTC (RFC 3339). | ||
| data.events[].markets | array | No | Markets that belong to the event. Omitted when the response does not include them. | |||
| data.events[].markets[].close_time | string | No | 2099-08-01T04:59:00Z | Time trading closes, in UTC (RFC 3339). | ||
| data.events[].markets[].event_ticker | string | No | KXELONMARS-99 | Ticker of the event the market belongs to. | ||
| data.events[].markets[].expiration_time | string | No | 2099-08-08T15:00:00Z | Time the market expires, in UTC (RFC 3339). | ||
| data.events[].markets[].last_price | number | No | 0.08 | Price of the most recent trade, in US dollars per contract. | ||
| data.events[].markets[].liquidity | number | No | 0 | Market liquidity, in US dollars. | ||
| data.events[].markets[].market_type | string | No | binary | Market type, such as `binary`. | ||
| data.events[].markets[].no_ask | number | No | 0.92 | Lowest price asked for a No contract, in US dollars. | ||
| data.events[].markets[].no_bid | number | No | 0.9 | Highest price offered for a No contract, in US dollars. | ||
| data.events[].markets[].open_interest | number | No | 32773.57 | Number of contracts currently open in the market. | ||
| data.events[].markets[].open_time | string | No | 2025-08-28T20:45:00Z | Time trading opened, in UTC (RFC 3339). | ||
| data.events[].markets[].previous_price | number | No | 0.1 | Earlier reference price of the market, in US dollars per contract. | ||
| data.events[].markets[].response_price_unit | string | No | usd_cent | Price unit label Kalshi attaches to the market, such as `usd_cent`. | ||
| data.events[].markets[].result | string | No | Outcome the market settled on. Empty or omitted until it settles. | |||
| data.events[].markets[].rules_primary | string | No | Primary rules text that governs how the market settles. | |||
| data.events[].markets[].status | string | No | active | Market status as Kalshi reports it, such as `active`. | ||
| data.events[].markets[].sub_title | string | No | Mars | Short label of the outcome the market covers, shown under the title. | ||
| data.events[].markets[].ticker | string | No | KXELONMARS-99 | Kalshi ticker that identifies the market. | ||
| data.events[].markets[].title | string | No | Will Elon Musk visit Mars before Aug 1, 2099? | Market title as shown on Kalshi. | ||
| data.events[].markets[].volume | number | No | 94840.88 | Total number of contracts traded in the market. | ||
| data.events[].markets[].volume_24h | number | No | 16 | Number of contracts traded in the last 24 hours. | ||
| data.events[].markets[].yes_ask | number | No | 0.1 | Lowest price asked for a Yes contract, in US dollars. | ||
| data.events[].markets[].yes_bid | number | No | 0.08 | Highest price offered for a Yes contract, in US dollars. | ||
| data.events[].mutually_exclusive | boolean | No | false | Whether at most one market in the event can resolve to Yes. | ||
| data.events[].series_ticker | string | No | KXELONMARS | Ticker of the series the event belongs to. | ||
| data.events[].strike_period | string | No | Strike period of the event, as Kalshi labels it. | |||
| data.events[].sub_title | string | No | Before 2099 | Short qualifier shown under the event title, such as a date or deadline. | ||
| data.events[].title | string | No | Will Elon Musk visit Mars in his lifetime? | Event title as shown on Kalshi. | ||
| data.fetched_at | string | No | 2026-06-07T14:00:00Z | Time the data was fetched, in UTC (RFC 3339). | ||
| data.limit | integer | No | 25 | Number of events requested per page. | ||
| data.source_url | string | No | https://external-api.kalshi.com/trade-api/v2/events?limit=25 | URL the data was read from. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/kalshi/events?limit=10&status=open&with_nested_markets=true&with_milestones=true" \
-H "x-api-key: $CRAWLORA_API_KEY"