API reference
Coverage and datasets
Public reads the app uses for the data dictionary, the Data coverage page, and file totals on a series. None of these charge the download allowance.
Datasets
GET /api/v1/datasets lists the datasets with their schema, plan, and sample links. GET /api/v1/datasets/{dataset_id} is one of them. Column prose lives on the data dictionary, which is generated from the same schemas.
GET /api/v1/datasets/{dataset_id}/series is days, rows, bytes, and first and last date per series. q filters the ticker. sort is bytes (default), rows, days, series, or last_date.
Samples, no key required: /api/v1/samples/trades.csv and the same path with .parquet. The name is {dataset_id}.csv or .parquet.
Coverage by day and venue
Try it
GET /api/v1/coverage/days is what the Data coverage page shows: one entry per published UTC day, newest first, with a row for each venue (kalshi, polymarket, limitless, chainlink). days (default 30, at most 400) counts back from end_date (default: the last published day), or pass start_date.
Each venue has a status: complete (measured for at least 23 of 24 hours, at least 98% recorded, no hour missing from the raw tape), partial, not_measured (files published, recorder health not saved) or not_recorded (no files that day). hours is the % recorded in each UTC hour, null when not measured; each hour's % is its worst-hit recorder. windows lists what is missing: loss (with lost_s, markets and the longest quiet stretch), no_data, not_measured and tape_gap. The body also has now (recording state and feeds behind), published_through and the days still publishing.
curl "https://kalshieye.com/api/v1/coverage/days?days=7"Daily coverage
Try it
GET /api/v1/coverage is one row per UTC day, with files and bytes per dataset and recorder health. start_date and end_date default to the last 120 days and cap at 800. complete: false means the day is still being written.
curl "https://kalshieye.com/api/v1/coverage?start_date=2026-10-12&end_date=2026-10-18"Incidents
GET /api/v1/coverage/incidents?limit=50 lists hours where the recorder missed time, skipped messages, or dropped frames, newest first. The body also includes hours_scored, clean_hours, and clean_pct.
Series file totals
GET /api/v1/coverage/series?ids=KXBTC15M&ids=KXETH15M is the "days of files" figure on Markets and on a series page. Repeat ids. Each value has days, rows, bytes, first_date, last_date, and datasets.
Explore
GET /api/v1/explore is one row per series: title, category, frequency, market counts, and flat-file size. q and category filter. files=true (the default) keeps series that have daily files. sort is bytes, days, markets, series, or last_date.