> ## Documentation Index
> Fetch the complete documentation index at: https://docs.predictiondata.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Top of Book

> Kalshi best bid/ask snapshots

## Overview

Best bid and ask price and size for each market at every tick. Each row represents the top-of-book state at the time of capture. Available as both **CSV** (gzip-compressed) and **Parquet** (zstd-compressed).

## Columns

| <div style={{minWidth: '240px'}}>Column</div> | CSV type | Parquet type                 | Description                                          |
| --------------------------------------------- | -------- | ---------------------------- | ---------------------------------------------------- |
| `exchange`                                    | string   | string                       | Always `kalshi`                                      |
| `ticker`                                      | string   | string                       | Market ticker                                        |
| `local_timestamp`                             | integer  | int64                        | Capture timestamp (nanoseconds since epoch)          |
| `exchange_timestamp`                          | string   | timestamp\_micros (nullable) | Exchange timestamp (RFC 3339, microsecond precision) |
| `bid_price`                                   | decimal  | float64 (nullable)           | Best bid price                                       |
| `bid_size`                                    | decimal  | float64 (nullable)           | Best bid size                                        |
| `ask_price`                                   | decimal  | float64 (nullable)           | Best ask price                                       |
| `ask_size`                                    | decimal  | float64 (nullable)           | Best ask size                                        |

## Fetching Data

Use the `path` from the [list response](/datasets/kalshi/available-files#finding-exports-for-a-ticker). The download endpoint returns a **302 redirect** to a signed URL; follow it with `curl -L` or equivalent.

<CodeGroup>
  ```python Python theme={null}
  import requests

  def download_top_of_book(path, api_key):
      url = f"https://api.predictiondata.dev/v2/datasets{path}"
      headers = {"x-auth-token": api_key}

      response = requests.get(url, headers=headers, allow_redirects=True)
      response.raise_for_status()

      filename = path.split("/")[-1]
      with open(filename, "wb") as f:
          f.write(response.content)

      print(f"Downloaded to {filename}")

  if __name__ == "__main__":
      api_key = "YOUR_API_KEY"
      path = "/kalshi/KXSB-26-NE/top-of-book/2026-02-03.csv.gz"

      download_top_of_book(path, api_key)
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');
  const fs = require('fs');

  async function downloadTopOfBook(path, apiKey) {
      const url = `https://api.predictiondata.dev/v2/datasets${path}`;

      const response = await axios.get(url, {
          headers: { 'x-auth-token': apiKey },
          responseType: 'arraybuffer'
      });

      const filename = path.split('/').pop();
      fs.writeFileSync(filename, response.data);
      console.log(`Downloaded to ${filename}`);
  }

  (async () => {
      const apiKey = "YOUR_API_KEY";
      const path = "/kalshi/KXSB-26-NE/top-of-book/2026-02-03.csv.gz";

      try {
          await downloadTopOfBook(path, apiKey);
      } catch (error) {
          console.error("Error downloading data:", error.message);
      }
  })();
  ```

  ```bash cURL theme={null}
  curl -L -H "x-auth-token: YOUR_API_KEY" \
    "https://api.predictiondata.dev/v2/datasets/kalshi/KXSB-26-NE/top-of-book/2026-02-03.csv.gz" \
    --output top-of-book.csv.gz
  ```
</CodeGroup>

## Notes

* The orderbook is the **YES orderbook**. Bids are the raw YES bids from Kalshi. Asks are calculated by taking `1 - price` of the NO bids. If you need the raw, unconverted data, contact [calder@predictiondata.dev](mailto:calder@predictiondata.dev).
* Prices and quantities are rounded to 4 decimal places.
* `local_timestamp` is nanoseconds since Unix epoch (when our servers captured the message).
* `exchange_timestamp` is when the event occurred on Kalshi. In CSV it is an RFC 3339 string; in Parquet it is stored as `TimestampMicros`.
* Each export covers one UTC day (00:00:00 to 23:59:59).
