Product
Live data Historical data Chrome extension
Datasets
Weather Markets
Docs
Quickstart API reference
Company
About Our mission

Historical data, timing included.

See what was available at the time, not only what a source says today. Historical rows include their source and availability timestamps. Training tables also include the decision cutoff. Live methods return the same core fields.

timing included source-stamped inputs same core fields in live rows
// shipping example · weather
weather.training-table.py
1from datetime import date
2from mostlyright import weather
3
4# official outcome + observed features, joined as-of time
5table = weather.training_table(
6    "KNYC", date(2025, 1, 6), date(2025, 1, 12)
7)

See history as it was known then

Historical reads return source and availability times. Training tables add cutoff fields. Live methods return the same core fields.

Visible cutoffs

Build a view from information available by the research cutoff, not later revisions.

Explicit provenance

Rows include their source and available timing fields. Training tables add decision and knowable-at cutoffs.

Reproducible cache

Pin normalized inputs locally so the same research window can produce the same rows.

Matching historical and live fields

Historical and live methods use the same parser and core fields.

Pin the inputs behind the result

Historical calls fetch and normalize upstream sources in your own runtime. They can write a parquet or JSON cache under ~/.mostlyright/cache/ (Python) or ~/.mostlyright/cache-ts/ (Node), so a later rerun does not silently change the inputs underneath the result.

Cutoff-aware: only information available by the decision time enters the view.
Source-stamped: every row keeps the feed that produced it.
Live-compatible: the corresponding live method returns the same core fields.
weather example · ~/.mostlyright/cache
# weather · shipping example
cache/
├─ weather/NYC/2025-01.parquet
├─ weather/AUS/2025-01.parquet
└─ _manifest.json       # contract + source ids

# pin a single source (provenance)
train = weather.observations("KNYC", ..., source="iem")
validate_dataframe(train, "schema.observation.v1")

What historical reads handle for you

Concern Hand-rolled scrapers Mostly Right
Reproducibility drifts with live endpoints byte-stable cache
Schema validation ad-hoc per source schema.*.v1 + validator
Training / live match silent corruption fails loudly on mismatch
Python ↔ TypeScript two codebases cross-SDK schema tests

Build on history without rebuilding for live data.

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.