Skip to content

Introduction

Therminal provides programmatic access to Kalshi temperature prediction market data and NWS weather observations through a unified REST API.

https://api.mostlyright.xyz

All endpoints return JSON by default. Add ?format=csv or ?format=parquet for bulk downloads. All timestamps are UTC unless a tz parameter is specified.

FormatMax rowsNotes
JSON50,000Paginated via ?limit= and ?offset= (default 1000, max 10000 per page)
CSV500,000Full result set, no pagination
Parquet500,000Full result set, no pagination

For 1-minute ASOS data, 500K rows covers ~347 days for a single station. Use ?format=parquet for bulk ML/analytics workloads.

ConceptDescription
SeriesA temperature metric for a location (e.g., KXHIGHNY = NYC daily high)
EventA specific date’s prediction (e.g., KXHIGHNY-26MAR20 = NYC high on March 20)
MarketA strike within an event (e.g., KXHIGHNY-26MAR20-T50 = “Will NYC high exceed 50°F?”)
CandleOHLCV price data at 1-minute intervals. Prices are in cents (0–100).
StationA 3–4 letter NWS weather station code (e.g., NYC, LAX, ORD)
DatasetLatencySource
Candles (recent 14 days)~5 minutesKalshi API → Supabase
Candles (historical)~1 hourR2 parquets via DuckDB
Observations (recent 14 days)~5 secondsAWC → Supabase
Observations (historical)~1 hourR2 parquets via DuckDB
Observations (1-minute ASOS)Historical onlyNCEI DSI-6406 (2000–2026)
Climate reports~24 hoursIEM → Supabase
Terminal window
pip install therminal-py

The Python SDK (v1.0.7) provides domain-split clients, a config file, and WeatherLive for real-time METAR observations from AWC with schema-identical output to historical data.

from therminal.weather import WeatherHistory, WeatherLive
weather = WeatherHistory() # Historical (via API)
live = WeatherLive() # Real-time (via AWC)
current = live.current(["NYC", "ATL"]) # Same Observation type