Introduction
Therminal provides programmatic access to Kalshi temperature prediction market data and NWS weather observations through a unified REST API.
Base URL
Section titled “Base URL”https://api.mostlyright.xyzAll endpoints return JSON by default. Add ?format=csv or ?format=parquet for bulk downloads. All timestamps are UTC unless a tz parameter is specified.
Response limits
Section titled “Response limits”| Format | Max rows | Notes |
|---|---|---|
| JSON | 50,000 | Paginated via ?limit= and ?offset= (default 1000, max 10000 per page) |
| CSV | 500,000 | Full result set, no pagination |
| Parquet | 500,000 | Full 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.
Key concepts
Section titled “Key concepts”| Concept | Description |
|---|---|
| Series | A temperature metric for a location (e.g., KXHIGHNY = NYC daily high) |
| Event | A specific date’s prediction (e.g., KXHIGHNY-26MAR20 = NYC high on March 20) |
| Market | A strike within an event (e.g., KXHIGHNY-26MAR20-T50 = “Will NYC high exceed 50°F?”) |
| Candle | OHLCV price data at 1-minute intervals. Prices are in cents (0–100). |
| Station | A 3–4 letter NWS weather station code (e.g., NYC, LAX, ORD) |
Data freshness
Section titled “Data freshness”| Dataset | Latency | Source |
|---|---|---|
| Candles (recent 14 days) | ~5 minutes | Kalshi API → Supabase |
| Candles (historical) | ~1 hour | R2 parquets via DuckDB |
| Observations (recent 14 days) | ~5 seconds | AWC → Supabase |
| Observations (historical) | ~1 hour | R2 parquets via DuckDB |
| Observations (1-minute ASOS) | Historical only | NCEI DSI-6406 (2000–2026) |
| Climate reports | ~24 hours | IEM → Supabase |
Python SDK
Section titled “Python SDK”pip install therminal-pyThe 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 typeFull documentation
Section titled “Full documentation”- API Reference — All endpoints with interactive playground
- Python SDK — Domain clients, WeatherLive, config, ML features
- Data Sources — Where the data comes from
- Rate Limits & Errors — Error codes and rate limiting