Kalshi API endpoint
Returns settled Kalshi historical market rows. `tickers`, `event_ticker`, and `series_ticker` are mutually exclusive. The `mve_filter` enum accepts `exclude`.
/kalshi/historical/marketsPath parameters:
Query parameters:
limit: optional rows to return. Defaults to 25, maximum 1000.cursor: optional pagination cursor from a previous Kalshi response.tickers: optional comma-separated Kalshi market tickers. Mutually exclusive with event_ticker and series_ticker.event_ticker: optional Kalshi event ticker filter. Mutually exclusive with tickers and series_ticker.series_ticker: optional Kalshi series ticker filter. Mutually exclusive with tickers and event_ticker.mve_filter: optional multivariate event filter. Allowed value: exclude.Notable response behavior:
mve_filter, or invalid limits return invalid-parameter errors before upstream IO.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| ticker | 20 | “KXMVECROSSCATEGORY-SHARD1-S20260F85A417E0F-1DE4C7D4E5C” and 19 other values |
| event_ticker | 20 | “KXMVECROSSCATEGORY-SHARD1-S20260F85A417E0F” and 16 other values |
| title | 20 | “yes Marton Fucsovics,yes Ariel Frutos Alonso / Santino Nune…” and 19 other values |
| sub_title | 20 | “yes Marton Fucsovics,yes Ariel Frutos Alonso / Santino Nune…” and 19 other values |
| status | 20 | finalized in all 20 |
| market_type | 20 | binary in all 20 |
| open_time | 20 | 2026-08-13 |
| close_time | 20 | 2026-08-13 |
| expiration_time | 20 | 2026-08-13 to 2026-08-30 |
| last_price | 20 | 0 to 1, median 0.02 |
| previous_price | 20 | 0 |
| yes_bid | 20 | 0 |
| yes_ask | 20 | 1 |
| no_bid | 20 | 0 |
| no_ask | 20 | 1 |
| volume | 20 | 2.09 to 1,162.79, median 204.01 |
| volume_24h | 20 | 0 |
| open_interest | 20 | 0 |
| result | 20 | no (16), yes (4) |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| limit | integer | No | Rows to return, default 25, max 1000 | ||
| cursor | string | No | Pagination cursor from a previous Kalshi response | ||
| tickers | string | No | Comma-separated Kalshi market tickers. Mutually exclusive with event_ticker and series_ticker. | ||
| event_ticker | string | No | Kalshi event ticker filter. Mutually exclusive with tickers and series_ticker. | ||
| series_ticker | string | No | Kalshi series ticker filter. Mutually exclusive with tickers and event_ticker. | ||
| mve_filter | string | No | Multivariate event filter Allowed values: exclude. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/kalshi/historical/markets?limit=10&mve_filter=exclude" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"limit": 2,
"cursor": "next",
"markets": [
{
"ticker": "KXMVECROSSCATEGORY-S2026144E784A147-ED367B84557",
"event_ticker": "KXMVECROSSCATEGORY-S2026144E784A147",
"title": "yes Yes,yes MIN Wild",
"status": "finalized",
"last_price": 0.259,
"volume": 183,
"result": "no"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/kalshi.historicalMarketsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | kalshi.HistoricalMarketsResponse | No | ||||
| data.cursor | string | No | Cursor to pass in the next request to get the following page. Omitted when Kalshi returns none. | |||
| 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 markets requested per page. | ||
| data.markets | array | No | Historical Kalshi markets on this page. | |||
| data.markets[].close_time | string | No | 2099-08-01T04:59:00Z | Time trading closes, in UTC (RFC 3339). | ||
| data.markets[].event_ticker | string | No | KXELONMARS-99 | Ticker of the event the market belongs to. | ||
| data.markets[].expiration_time | string | No | 2099-08-08T15:00:00Z | Time the market expires, in UTC (RFC 3339). | ||
| data.markets[].last_price | number | No | 0.08 | Price of the most recent trade, in US dollars per contract. | ||
| data.markets[].liquidity | number | No | 0 | Market liquidity, in US dollars. | ||
| data.markets[].market_type | string | No | binary | Market type, such as `binary`. | ||
| data.markets[].no_ask | number | No | 0.92 | Lowest price asked for a No contract, in US dollars. | ||
| data.markets[].no_bid | number | No | 0.9 | Highest price offered for a No contract, in US dollars. | ||
| data.markets[].open_interest | number | No | 32773.57 | Number of contracts currently open in the market. | ||
| data.markets[].open_time | string | No | 2025-08-28T20:45:00Z | Time trading opened, in UTC (RFC 3339). | ||
| data.markets[].previous_price | number | No | 0.1 | Earlier reference price of the market, in US dollars per contract. | ||
| data.markets[].response_price_unit | string | No | usd_cent | Price unit label Kalshi attaches to the market, such as `usd_cent`. | ||
| data.markets[].result | string | No | Outcome the market settled on. Empty or omitted until it settles. | |||
| data.markets[].rules_primary | string | No | Primary rules text that governs how the market settles. | |||
| data.markets[].status | string | No | active | Market status as Kalshi reports it, such as `active`. | ||
| data.markets[].sub_title | string | No | Mars | Short label of the outcome the market covers, shown under the title. | ||
| data.markets[].ticker | string | No | KXELONMARS-99 | Kalshi ticker that identifies the market. | ||
| data.markets[].title | string | No | Will Elon Musk visit Mars before Aug 1, 2099? | Market title as shown on Kalshi. | ||
| data.markets[].volume | number | No | 94840.88 | Total number of contracts traded in the market. | ||
| data.markets[].volume_24h | number | No | 16 | Number of contracts traded in the last 24 hours. | ||
| data.markets[].yes_ask | number | No | 0.1 | Lowest price asked for a Yes contract, in US dollars. | ||
| data.markets[].yes_bid | number | No | 0.08 | Highest price offered for a Yes contract, in US dollars. | ||
| data.source_url | string | No | https://external-api.kalshi.com/trade-api/v2/historical/markets?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/historical/markets?limit=10&mve_filter=exclude" \
-H "x-api-key: $CRAWLORA_API_KEY"