Score historical climatology
Run the same scoring engine against the last 30+ years of reanalysis. Returns score distributions + exceedance probabilities, the statistical view on "how often is Tarifa kitable in May, really?".
Pro plan and above. Backed by ERA5 reanalysis (atmospheric from 1940, marine from 1979). The distribution shape is intended to support parametric-underwriting research, which is a research direction with qualified partners, not a live automated pricing product.
What it returns
Not a single score, a distribution. For each granularity bucket (month, day-of-year, daypart) the response returns: percentiles (p10/p25/p50/p75/p90), exceedance probabilities by verdict band (excellent / favorable / fair / marginal / poor / not_feasible / unsafe), and the sample size that backs the distribution.
Request
{
"activity": "kitesurfing",
"location": { lat: 36.013, lng: -5.604 },
"yearsRange": { "from": 2006, "to": 2026 },
"granularity": "daypart",
"selector": { "month": 5, "daypart": "afternoon" }
}yearsRange.from is capped at 1940 (ERA5 atmospheric floor). selector fields are only read when relevant to the chosen granularity, e.g. daypart needs a selector.daypart, day-of-year needs a selector.dayOfYear. Optional failOnMarineGap makes marine-dependent activities error instead of silently degrading when CMEMS coverage is missing for the window.
Historical scoring runs entirely on ERA5 reanalysis; it does not use the live-forecast consensus (Open-Meteo, Stormglass + a premium partner model) or the real-observation corrections (METAR, CMEMS wave validation, lightning strikes) that a live /v1/score call applies. Those are real-time signals with no retrospective equivalent; ERA5 is already the observation-assimilated ground truth for the past.
Granularity
month: one distribution per month (12 entries) over the requested year range. week: 52 entries. day-of-year: 365 entries (heavy; use for high-fidelity underwriting-research pricing work). daypart: combine with daypart: "morning" | "midday" | "afternoon" | "evening" to restrict the window.
Caching
Historical responses are tenant-agnostic: same (activity, location, granularity, yearsBack) yields the same distribution. The engine caches with a long TTL, so popular spots return in <50ms. First call for a new location pays the ERA5 fetch (~5s); subsequent calls are cached.
Errors
402 PAYMENT_REQUIRED: Free or Starter plan. 404 ACTIVITY_NOT_FOUND: activity slug not in catalog. 503 ARCHIVE_UNAVAILABLE: no ERA5 historical provider is configured on this deployment.