UTC --:--:--
Docs·API reference·Observations

Push station observations into the assimilation window

Operators with their own weather stations (anemometer at the kite school, snow probe at the resort, river-gauge) can blend their observations into the engine's short-horizon forecast. Where station coverage and quality allow, this can improve skill in the 0–6h window, where local data often adds signal over global NWP.

Station registry is available on every plan (register, list, update). Submitting readings (POST /v1/observations) requires Pro plan and above. Observations are tenant-private: submitted readings can improve scoring for nearby spots in YOUR tenant's traffic; they never blend into the public catalog.

Why submit observations

Global numerical weather prediction (Open-Meteo, Stormglass, and on Pro/Scale a premium partner model) resolves at ~10km. A kite school's apparent wind at the launch can differ from the model grid cell by several knots in either direction. Assimilation narrows that gap using optimal interpolation (3DVAR-style) over a 0-6h window. Your readings nudge the forecast toward locally observed conditions; the further away the forecast horizon, the less your reading affects it. This is distinct from the engine's own ground-truth corrections (METAR, CMEMS wave, buoy observations, tide-gauge observation, river discharge, satellite snow and the lightning strike network), which, where those sources are available, validate the forecast against public observation networks rather than your private station.

Register a station

POSThttps://api.goable.io/v1/observations/stations
{
 "name": "Tarifa Balneario anemometer",
 "point": { lat: 36.013, lng: -5.604 },
 "altitudeM": 3,
 "variables": ["wind_speed_kn", "wind_dir_deg"], // which readings this station can report
 "stationClass": "verified",
 "notes": "Davis Vantage Pro 2, 10m above ground"
}

variables is required (≥1) and drawn from a fixed enum: wind_speed_kn, wind_dir_deg, wave_height_m, temp_c, sea_surface_temp_c, pressure_hpa, precip_mm. Wind speed is knots, not m/s. There's no gust variable. stationClass is one of verified / unflagged / flagged_low_quality (defaults to unflagged). Returns a station id. List your stations with GET /v1/observations/stations; update metadata with PATCH /v1/observations/stations/:id.

Push an observation

POSThttps://api.goable.io/v1/observations

Submits a batch of readings (1-1,000) for one station in a single call. Each reading is its own { observedAt, variable, value } entry, not one object with every variable inline:

{
 "stationId": "3fa2c1d0-...-uuid",
 "observations": [
   { "observedAt": "2026-07-04T14:00:00Z", "variable": "wind_speed_kn", "value": 15.9 },
   { "observedAt": "2026-07-04T14:00:00Z", "variable": "wind_dir_deg", "value": 285 }
 ]
}

Returns 202 immediately (with the accepted count). The observation enters a buffer + is assimilated into scores in the 0-6h forecast window; influence decays exponentially with staleness and forecast horizon.

Assimilation window

Observations only affect forecasts in the 0–6h horizon. Beyond 6h the atmospheric error covariance decay drops their influence weight to zero; at that horizon the global model dominates anyway. Stale observations (>1h old at assimilation time) are downweighted exponentially.

Quality control

Each reading can carry an optional per-item qualityFlag, the same three-value enum as the station's stationClass: verified, unflagged, or flagged_low_quality. Mark a reading flagged_low_quality (sensor malfunction, calibration drift, etc.) to fence it off from assimilation without losing the time series entirely.