Product
Live data Historical data Chrome extension
Asset classes
Weather Prediction markets Financial data soon
Docs
Quickstart API reference
Company
About Our mission

Fundamental data
for prediction markets

The real-world data that moves prediction-market prices, from official public sources. Research it in our Python & TypeScript SDK (access by request), or read it live on any contract page with the free Chrome extension.

Chrome extension
research.py
1from mostlyright import weather
2
3# live obs + settlement join, cached locally
4df = weather.pairs("KNYC", "2025-01-06", "2025-01-09")
1import { dataset } from "mostlyright";
2
3// live obs + settlement join, cached locally
4const rows = await dataset("KNYC", "2025-01-06", "2025-01-09");
// free chrome extension

Live data, directly where you trade

The extension reads the contract you're on and pulls the data that decides it onto the page: the live number, the record behind it, and the model's call. No tabs, no account, no API key.

kalshi.com / markets / KXHIGHNY
Highest temperature in New York today?
Climate and Weather · Daily Temperature

Live preview · free on Kalshi and Polymarket · drag the timeline to scrub the trajectory

// python-first sdk

Built for quants, ML pipelines,
and AI agents

Research any market in four lines: call research() and get a schema-versioned table of exactly what a contract settles on. It won't hand a backtest data that didn't exist yet, so your results never train on the future. Python first, TypeScript at parity.

research.py
1from mostlyright import weather
2from mostlyright.markets.catalog import kalshi_nhigh
3
4# 1. what does the contract settle on?
5c = kalshi_nhigh.resolve("KHIGHNYC", date(2025, 1, 15))
6# 2. pull the data that decides it.
7df = weather.pairs(c.settlement_station, "2025-01-15", "2025-01-15")
8print(df.obs_high_f[0])
1import { dataset } from "mostlyright";
2import { kalshiSettlementFor } from "@mostlyrightmd/markets";
3
4// 1. what does the contract settle on?
5const c = kalshiSettlementFor("KHIGHNYC", "2025-01-15");
6// 2. pull the data that decides it.
7const rows = await dataset(c.settlementStation, "2025-01-15", "2025-01-15");
8console.log(rows[0].obs_high_f);
// what you can pull

Weather today. Every market next.

Live or historical, one research() call returns the same schema from the same sources. What you backtest is exactly what you'd trade live, never a value from the future.

Live data

Real-time METAR and multi-model forecasts. Fetch the current reading, the trajectory to settlement, and the model that's calling it.

METAR · forecasts
Historical data

Decades of climate and station archive, plus deterministic settlement backtests, cached byte-for-byte on first call, so re-runs never drift.

cache → parquet / json
// coverage

Resolved to the exact settlement station

Every weather market settles on a specific station. We map the contract to its ICAO and pull the data that station reports. US extremes in °F, international in °C.

contract → settlement station
KXHIGHNY KNYC New York · °F 81°
KXHIGHAUS KAUS Austin · °F 88°
KXHIGHMIA KMIA Miami · °F 90°
HIGH-LDN EGLC London · °C 17°
HIGH-TOK RJTT Tokyo · °C 24°
HIGH-PAR LFPG Paris · °C 19°
date str · LST settlement date
station str resolved NWS / ICAO code
cli_high_f number official CLI daily high
obs_high_f number observed high (fused)
obs_high_at str · ISO timestamp of the high
fcst_high_f number model forecast high
market_close_utc str · ISO contract close instant

Every response carries a stable schema.*.v1 URI and a source identity, so a train/infer mismatch fails loudly instead of corrupting a model.

// why mostlyright

Research-grade
by construction

Runs in your runtime

Direct calls to public APIs (NOAA, NWS, IEM, Kalshi, Polymarket) from your own runtime, with an optional local cache.

Schema-versioned

Every response stamps a schema.*.v1 URI. Outputs validate against JSON-Schema shapes, ready to drop into MCP tools or function-call returns unchanged.

Local-first cache

First call writes parquet (Python) or a JSON envelope (Node) to ~/.mostlyright. Byte-stable across runs, giving deterministic backtests.

Py ↔ TS parity

The same research() shape in both runtimes, byte-equivalent on the canonical parity fixtures. Use whichever your stack prefers.

Live = historical

The same research() call shapes a live reading and a decade of archive into one identical table. Backtest on exactly what you'll trade, down to the column.

CSP-clean in the browser

No eval, no remote code. Runs in browser service workers and Web Workers, on edge runtimes, and as a single-tag IIFE. Core stays under 25 KB gzipped.

0+
forecast models, leakage-safe
0+
settlement stations (US + intl)
0
runtimes: Python & TypeScript
0
lookahead leaks, by construction
// early access

Research your first market in four lines.

The SDK is available by request. Tell us what you are building.

Read the docs
// request access

Request early access

Mostly Right is currently available by request. Tell us a bit about you and what you are building, and we will be in touch.

I'm a

One email from the team. No spam.