> Full docs in one file: https://kacdata.com/llms-full.txt

# API Reference

Source: https://kacdata.com/docs/api-reference

> Historical Kalshi data downloads as daily Parquet files.

Base API Endpoint: **https://api.kacdata.com/v1**

## V1 Parquet API

`https://api.kacdata.com/v1/kalshi/{data_type}/{YYYY}/{MM}/{DD}/{symbol}.parquet`

Returns one market's historical data for one data type and UTC date as a Parquet file. `symbol` is the Kalshi `market_ticker` for `l2`, `trades` and `ticker`, and `markets_lifecycle` for `lifecycle` (one file per day with every market).

See [historical data details](https://kacdata.com/docs/historical-data-details/kalshi) for availability and [data schemas](https://kacdata.com/docs/schemas/overview) for file contents.

Authenticate with your API key in the `api_key` request header.

### Path parameters

All path parameters are required.

| Name | Type | Description |
| --- | --- | --- |
| `data_type` | string | [`l2`](https://kacdata.com/docs/schemas/l2), [`trades`](https://kacdata.com/docs/schemas/trades), [`ticker`](https://kacdata.com/docs/schemas/ticker) or [`lifecycle`](https://kacdata.com/docs/schemas/lifecycle). |
| `YYYY/MM/DD` | string | Valid UTC date with a four-digit year and two-digit month and day, e.g. `2026/10/15`. |
| `symbol` | string | Kalshi `market_ticker`, or `markets_lifecycle` for `lifecycle`. Tickers are case-sensitive. |

Free accounts can download data older than 3 weeks (21 days). Data from the last 3 weeks needs Plus.

### Example

Request one market's L2 data:

```text
https://api.kacdata.com/v1/kalshi/l2/2026/10/15/KXBTC15M-26OCT150930-30.parquet
```

Request one day of lifecycle messages:

```text
https://api.kacdata.com/v1/kalshi/lifecycle/2026/10/15/markets_lifecycle.parquet
```

### Response

A successful request returns `200 OK` with a Parquet file and consumes one download quota unit. Repeated downloads consume quota again.

Unavailable files return `404 Not Found` and do not consume quota. A `404` for `trades` on a day the market has L2 data means it had no trades that day.

The endpoint returns the complete file; byte-range requests are not supported.

## Errors

| Status | Meaning |
| --- | --- |
| `401 Unauthorized` | The API key is missing, invalid, or expired. |
| `403 Forbidden` | The account is blocked from downloading, or a free account requested data from the last 3 weeks. |
| `404 Not Found` | The path or parameters are invalid, or the requested file is unavailable. |
| `429 Too Many Requests` | The account's download quota has been used up. |

Error responses generally contain a JSON `error` field and may include a `message`. A free account requesting data from the last 3 weeks receives `403 Forbidden`:

```json
{
  "error": "Data from the last 3 weeks is not included in the free tier. Please upgrade at https://kacdata.com/pricing"
}
```

When a free account has insufficient download quota, the API returns `429 Too Many Requests`:

```json
{
  "error": "You have used up all your free download quota. Please upgrade at https://kacdata.com/pricing",
  "message": "You have used up all your free download quota. Please upgrade at https://kacdata.com/pricing"
}
```

Paid accounts with insufficient download quota receive `429 Too Many Requests`:

```json
{
  "error": "Too Many Requests",
  "message": "Download quota has been used up."
}
```
