UTC --:--:--
Score

Validate conditions at a chosen spot.

Turn a chosen place and time window into an explainable suitability verdict. Hand the engine an activity, a location and a window, and get back a 0-100 score, a plain verdict, the per-dimension drivers behind it and a confidence block. This is the endpoint that decides whether tomorrow's session opens or closes.

01
The result

Score, verdict, confidence, drivers

A worked call for a kitesurf weekend at a chosen spot. The engine scores six physics dimensions independently against the kitesurfing profile's scoring curves, then folds them into the 0-100 verdict the booking flow consumes. You read the score, the verdict, the confidence, and the drivers behind them.

Request
POST /v1/score
{
 activity: "kitesurfing",
 location: { lat: 36.0133, lng: -5.6044 },
 window: {
 from: "2026-08-28T10:00Z",
 to: "2026-08-28T16:00Z"
 }
}
skill-weighted provider fetch
6 dimensions evaluated independently
hard gates checked · none triggered
verdict + confidence · ~180ms p50
Response · per-dimension breakdownscore 87 · excellent
  1. Wind speed22 kt @ 270°
    Cross-onshore, ideal for intermediate kitesurfing
    94
  2. Wind gust factor1.18 (low)
    Steady wind, gust just 18% above mean
    91
  3. Wave height1.5 m, period 10s
    Manageable chop for intermediates, not flat-water
    78
  4. Air temperature22 °C apparent
    Comfortable session-length window
    88
  5. Lightning proximityCAPE 280 J/kg
    No convective activity in 50km radius
    100
  6. Visibility25 km
    Clear sightlines, no fog
    96
Reading the result · Wind is the dominant favorable signal (94): 22kt cross-onshore is textbook intermediate kitesurfing. Wave height (78) is the lowest per-dim because Balneario carries chop at this swell direction; some riders prefer it, and the profile curve says workable. Lightning gate at 100 means no convective threat. The fold: 0.4×94 + 0.2×91 + 0.15×78 + 0.1×88 + 0.1×100 + 0.05×96 ≈ 87. Verdict cutoffs come from the catalog's verdict_buckets, not hard-coded: kitesurfing's "excellent" band is 86 to 100, one point above the fold.
02
The decision

The decision it drives

A verdict is only useful if it settles a decision. One score endpoint drives three operator workflows: holding or releasing a booking, opening or closing a school for the day, and calling go/no-go on each day of an itinerary.

FareHarbor · Bookeo · Checkfront

Booking hold

Validate booking-flow conditions before the customer pays.

1 spot · 3-day window · single score
The customer is about to confirm a kitesurf school slot for Saturday. The engine returns 'favorable' or 'unsafe' with the full breakdown, and the booking flow auto-cancels-and-refunds when conditions degrade. Reduces no-show and bad-experience cost on the operator side.
Vertical PMS for kite/sail/dive schools

School open or close

The daily open-or-close decision for the school.

10-20 spot polling · daily cron · multi-window
School director checks tomorrow's conditions at 18:00 the night before, decides which spots to open. Replaces 'check the forecast app' with one structured call per spot. Operator confidence is the value, not the score number itself.
Adventure travel, expedition planners

Itinerary go/no-go

Per-day go/no-go on a multi-day itinerary.

5-15 spots · 7-day window · weekly batch
Guide planning a kite safari from Tarifa to Essaouira: scores each candidate beach for each day of the trip, surfaces the optimal route. Replaces an analyst with five browser tabs.
03
Why trust it

Physics, live observations, provenance

The verdict is not one model's opinion. Every coefficient traces to a peer-reviewed formula, forecasts are cross-checked against live observations, and each score ships with the provenance to audit it. Machine learning only tunes provider weights and calibration curves; it never overrides the physics.

Physics first

25+ peer-reviewed formulas do the work. The verdict you read has a paper trail back to oceanography and atmospheric-science journals.

Live observations

Provider forecasts are cross-checked against real METAR, buoy, satellite and lightning-strike observations, so the score reflects what is actually happening, not one feed's guess.

Provenance

Every dimension, gate and confidence factor is returned in the response, so an operator can explain any verdict to a customer.

Forecast mode · Live decision support for upcoming activity windows. For historical risk analysis and climate planning, see Underwriting and Adaptation.
04
How it works

Physics first, black-box ML last

The pipeline, layer by layer. Physics does the work; ML appears in only two places, provider skill weights and curve calibration, and never replaces it. Full detail lives in the endpoint reference.

1

Provider chain

Skill-weighted blend of Open-Meteo, Stormglass and a premium partner model (Pro/Scale), cross-checked against real METAR, CMEMS, buoy, river-discharge, satellite-snow and lightning-strike observations. Per-cell weights are recalibrated on a schedule against accrued real-world outcomes, with drift monitoring between refits (see the SPC charter).

2

Physics layer

25+ peer-reviewed formulas across 20 namespaces (wind, wave, tide, atmosphere, snow, lightning, AQI, and more).

3

Calibration

Hierarchical Bayesian shrinkage along the 5-level catalog (base, region, cluster, sub-spot). Curves tighten as cohort outcomes accumulate.

4

Hard gates

Lightning ≥0.85 or hazardous AQI forces verdict=unsafe regardless of other dimensions. Safety first.

5

Verdict + confidence

0-100 score, a plain verdict (excellent/favorable/fair/marginal/poor/not_feasible/unsafe) and a confidence block you can gate UX on.

05
Confidence

Every score carries a confidence block

The confidence detail decomposes the scalar confidence into four interpretable factors. Booking flows can gate UX decisions on the sub-factor they care about (for example, warn the user when providerSkill < 0.7 for their region).

4 sub-factors · forecast mode
{
  "session_id": "a7b2...",
  "score": 87,
  "verdict": "excellent",
  "confidence": 0.84,
  "confidenceDetail": {
    "mode": "forecast",
    "providerSkill": 0.91,
    "ensembleSpread": 0.78,
    "profileMaturity": 0.85,
    "hierarchicalCalibration": 0.95
  },
  "breakdown": [
    { "dim": "wind",     "score": 94 },
    { "dim": "wave",     "score": 78 },
    { "dim": "lightning","score": 100 }
  ],
  "alerts": [],
  "eco": { "wind_beaufort": 4, "energy_class": "moderate" }
}
06
Calibration

Close the loop with outcomes

POST /v1/score/:session_id/outcome

Booking flow reports back: did the session actually happen, was it cancelled, was the customer happy? Each outcome feeds the calibration loop. Weights are recalibrated on a schedule against accrued real-world outcomes, with drift monitoring between refits, so the verdict does not silently change under you.

The data primitive

Forecast-and-outcome pairs are what unlock the next horizons: parametric underwriting needs them, and the open research dataset publishes them with k≥10 anonymisation (CC BY 4.0).

07
Plan tiers

Calls scale with the use case

Score calls are metered per-event via Stripe. Free hard-caps at the included quota (no surprise bill). Starter and Pro overflow at the published rate. Scale runs on a contracted ceiling.

PlanIncludedOverageTypical buyer
Free1,000 calls / monthHard cap at quotaPrototype, single-spot test
Starter50,000 calls / month€1.50 per 1,000 calls over quotaSingle operator, weekend traffic
Pro500,000 calls / month€0.80 per 1,000 calls over quotaMulti-spot brand, ensemble + AI explain
ScaleUnlimitedContracted ceilingUnderwriting, climate, multi-country
08
Two decisions

One engine, two decisions

One engine for two decisions: validate a chosen spot or find the best one. Score a spot you already know. Search a region when the user has not chosen a spot yet. Same scoring curves, same hard gates, same confidence model. Two workflows, one consistent decision model.

/v1/score

Validate a spot you chose.

activity: "kitesurfing"
location: {lat:36.013, lng:-5.604}
window: {from:"…", to:"…"}
responsescore: 87 · excellent
/v1/recommend-spot

Find the best one in a region.

activity: "kitesurfing"
regionCenter: {lat:36.01, lng:-5.6}
radiusKm: 50
topK: 5
responsetop 5 ranked sub-spots