# Sardine — Kalshi crypto settlement rates, counted > Historical settlement rates for Kalshi BTC, ETH and XRP 15-minute and hourly > binary contracts, counted from the last 60 days of settled windows and > published with the raw data, a REST API and an MCP server. Every number on > the site is a count of what happened, never a forecast, and every number we > display is logged and scored publicly against the settled result. > Licence: CC BY 4.0, credit "Sardine (sardine.info)". ## Five facts, each with its date - Kalshi settles its BTC 15-minute contracts on a 60-second average of the CF Benchmarks index, against the same average a quarter-hour earlier; Sardine shows that index live. https://sardine.info/how - Sardine's 15-minute tables pass their split-half self-check at 5.5 points (BTC), 4.8 (ETH) and 4.6 (XRP) against a 6-point limit, rebuilt on the last 60 days on 2026-10-26, shown bucket by bucket. https://sardine.info/record - Kalshi's own price is usually closer to the result than the count: Brier 0.194 (Kalshi) against 0.195 (Sardine) at ten minutes before close over 2,571 windows since 2026-09-11. https://sardine.info/record - Buying the cheaper of Kalshi and Polymarket in the last two minutes does not pay: -0.9 +- 0.8 cents a contract over 35 days and 9,354 windows, paid 3 s after the signal and after fees (2026-10-26). https://sardine.info/record ## Start here - https://sardine.info/rigged — is the 15-minute market rigged? how it settles, what the record shows - https://sardine.info/developers — the API, the MCP server, limits, licence - https://sardine.info/v1/openapi.json — the machine-readable description - https://sardine.info/record — what we said, what happened, scored ## API and MCP REST, free with signup (25 calls a day to try without a key; a free key at https://sardine.info/signup raises it to 10,000): - https://sardine.info/v1/markets — series covered and their self-check figure - https://sardine.info/v1/board?market=BTC-15M — open contracts with the count for each (Kalshi's prices are not included; read them from Kalshi's API) - https://sardine.info/v1/settlement-rate?asset=BTC&window_minutes=15&strike=79850&minutes_left=7 - https://sardine.info/v1/table?asset=BTC&window_minutes=15 — the full lookup table - https://sardine.info/v1/record — published numbers scored against settlement - https://sardine.info/v1/datasets — the CSV files - https://sardine.info/v1/backtest?market=BTC-15M&side=NO&min_gap_cents=5&min_minutes_left=2&max_minutes_left=5 — replays a rule on per-second Kalshi quotes after fees; returns results, never rows Add format=csv to any endpoint for a spreadsheet file. MCP server, local: `claude mcp add sardine -- uvx sardine-mcp` (package sardine-mcp on PyPI). Remote, streamable HTTP: https://sardine.info/mcp. Tools: list_markets, get_settlement_rate, get_live_board, get_rate_table, get_track_record, list_datasets, backtest_rule. Resource: sardine://method. Method, in one paragraph: for every settled window we record where spot sat against the strike at fixed checkpoints (seconds to close), what our published base-rate table said, and how the contract settled. Sample sizes are counted in DISTINCT SETTLED WINDOWS, never strike-rows — one hourly window quotes ~188 strikes off a single price path and they all settle together, so row counts overstate evidence by up to 93x. Updated daily (data files every 30 minutes); each page carries its "as of" date. ## Answers - [All questions](https://sardine.info/q/): 312 pages, one per (market, price bucket) and per (market, minutes left, distance band), each answering "how often did this settle Yes" with the count behind it. - [How it works](https://sardine.info/how): the method as a single diagram — spot to settled windows to volatility-scaled distance to the base-rate table, and why one BTC history serves two venues. - [The record](https://sardine.info/record): our published numbers scored against settled results — the calibration scorecard, the split-half self-check bucket by bucket, and what following every gap has paid. - [Live screen](https://sardine.info/): every open BTC 15-minute contract with history's answer for it. ## Data - [sardine_history_btc_15m.csv](https://sardine.info/data/sardine_history_btc_15m.csv): History — BTC 15 min — 49,342 rows, 9868 independent windows, 2026-07-19 to 2026-10-31. - [sardine_history_btc_hourly.csv](https://sardine.info/data/sardine_history_btc_hourly.csv): History — BTC hourly — 1,998,392 rows, 1473 independent windows, 2026-08-23 to 2026-10-31. - [sardine_published.csv](https://sardine.info/data/sardine_published.csv): Published numbers — 102,574 rows, 22910 independent windows, 2026-09-11 to 2026-10-31. - [sardine_sports_mlb.csv](https://sardine.info/data/sardine_sports_mlb.csv): Sports — MLB — 88,465 rows, ? independent windows, ? to ?. - [sardine_sports_calibration_mlb.json](https://sardine.info/data/sardine_sports_calibration_mlb.json): Calibration — MLB — 56 rows, ? independent windows, ? to ?. - [sardine_sports_ncaaf.csv](https://sardine.info/data/sardine_sports_ncaaf.csv): Sports — NCAAF — 15,153 rows, ? independent windows, ? to ?. - [sardine_sports_calibration_ncaaf.json](https://sardine.info/data/sardine_sports_calibration_ncaaf.json): Calibration — NCAAF — 82 rows, ? independent windows, ? to ?. - [sardine_sports_nba.csv](https://sardine.info/data/sardine_sports_nba.csv): Sports — WNBA and NBA Summer League — 11,158 rows, ? independent windows, ? to ?. - [sardine_sports_calibration_nba.json](https://sardine.info/data/sardine_sports_calibration_nba.json): Calibration — WNBA and NBA Summer League — 104 rows, ? independent windows, ? to ?. - [sardine_sports_nfl.csv](https://sardine.info/data/sardine_sports_nfl.csv): Sports — NFL — 6,758 rows, ? independent windows, ? to ?. - [sardine_sports_calibration_nfl.json](https://sardine.info/data/sardine_sports_calibration_nfl.json): Calibration — NFL — 63 rows, ? independent windows, ? to ?. - [baserate_tables.json](https://sardine.info/data/baserate_tables.json): The table itself — 452 rows, ? independent windows, ? to ?. - [README.md](https://sardine.info/data/README.md): README — 0 rows, ? independent windows, ? to ?. Columns, sardine_history_*.csv (one row per contract per checkpoint): window_open_utc, window_close_utc (the unit of evidence — group by it), ticker, checkpoint_seconds_left (15m: 120/300/480/720/900; hourly: 120/180/300/600/1200/1800/2700/3600), spot_at_checkpoint, strike, distance_usd, distance_pct, z (distance in standard deviations), vol_scale (so z is reproducible), sardine_p (what our table said), settled_yes (1/0). Columns, sardine_published.csv: shown_utc, ticker, checkpoint_seconds_left, sardine_p, kalshi_yes_ask, kalshi_yes_bid, fee, verdict, settled_yes. ## Reference pages - [/data/kalshi-btc-15min-base-rates](https://sardine.info/data/kalshi-btc-15min-base-rates): How often did Kalshi BTC 15-minute contracts settle Yes, by the price they traded at and the time left on the window? - [/data/kalshi-vs-polymarket-btc-15min](https://sardine.info/data/kalshi-vs-polymarket-btc-15min): How do Kalshi and Polymarket BTC 15-minute contracts differ in settlement index, tie rule, fees and window timing? - [/data/kalshi-btc-fees](https://sardine.info/data/kalshi-btc-fees): What is Kalshi's fee on a BTC contract at each price, and what win rate does it take to break even? ## Cadence - /data files and their manifest: regenerated every 30 minutes. - /q pages, sitemap.xml and this file: rebuilt daily from those same files; the build fails rather than publish a number that disagrees with /record.