Post-processed variables

Different models use different variable names, units, and conventions. To let you query many models the same way, the API exposes a set of post-processed (harmonized) variables with consistent names and units. Each model computes them from its own raw variables, so a harmonized variable is always returned in the same unit regardless of the source model.

Which models support which harmonized variables is listed in the Models availability matrix.

Variables and units

Variable Unit Description
Temperature °C 2 m air temperature
Temperature:100 °C ~100 m air temperature (where supported)
WindSpeed / WindSpeed:10 m/s 10 m wind speed (the two names are identical)
WindSpeed:100 m/s ~100 m wind speed
WindDirection / WindDirection:10 ° 10 m wind direction (meteorological, "from")
WindDirection:100 ° ~100 m wind direction
CloudCover fraction 0–1 Total cloud cover
RelativeHumidity % 2 m relative humidity
RelativeHumidity:100 % ~100 m relative humidity (MEPS only)
SolarDownwardRadiation W/m² Surface downward shortwave radiation
PressureReducedMSL Pa Mean sea-level pressure
TotalPrecipitation mm Precipitation per time step
WindGust m/s 10 m wind gust
symbol integer code Weather symbol (see below)

How each variable is derived

Below is the canonical formula for each variable. Inputs u, v are wind components, T temperatures (Kelvin unless noted), and accumulated fields are de-accumulated first (see De-accumulation). Per-model deviations are noted.

Variable Canonical formula Per-model notes
Temperature[:100] T_raw − 273.15 (K → °C) Level differs: 2 m, or ~100/120 m for :100
WindSpeed[:10/:100] sqrt(u² + v²) WindSpeed == WindSpeed:10; :100 taken at the model's ~100/120 m level
WindDirection[:10/:100] degrees(3π/2 − arctan2(v, u)) mod 360 Argument order is (northward, eastward), giving the direction the wind blows from
CloudCover model total cloud cover, ÷100 if stored as % GFS: max over isobaric levels ÷100. AROME: min(0.9·lcc + 0.6·mcc + 0.3·hcc, 100)/100. ERA5-land: not available
RelativeHumidity[:100] pass-through (×100 if a fraction) ECMWF: derived from dewpoint + temperature via the Magnus formula (below). :100 is MEPS only
SolarDownwardRadiation de-accumulate/average surface shortwave flux → rate, ÷3600 → W/m², clip ≥0, round ICON: from an average-since-model-start field. GFS: two regimes split at ref-time 2022-09-09. Not available for MESAN / AROME-HD
PressureReducedMSL pass-through mean sea-level pressure (Pa)
TotalPrecipitation de-accumulate to a rate, clip ≥0 → mm ECMWF: ×1000 (m → mm). GFS: precipitation rate × 3600. Not available for AROME-HD
WindGust pass-through gust AROME: sqrt(efg10² + nfg10²) from gust components. ECMWF: uses fg10/i10fg
symbol packed integer code from cloud, precip, temperature See Weather symbol

Wind direction convention

WindDirection = degrees(3π/2 − arctan2(v, u)) mod 360, where u is the eastward and v the northward wind component. This yields the meteorological convention — the compass direction the wind is coming from (0° = from the north, 90° = from the east).

Relative humidity from dewpoint (ECMWF)

ECMWF models have no direct RH field, so it is derived from 2 m temperature T and dewpoint Td (both in °C) with the August–Roche–Magnus approximation:

RH = 100 · exp(17.625·Td / (243.04 + Td)) / exp(17.625·T / (243.04 + T))

De-accumulation

Some raw fields (precipitation, radiation) are stored as values accumulated since the start of the forecast run, not instantaneous rates. These are converted to a per-step rate by differencing successive values and dividing by the time step:

rate(t) = (accumulated(t+1) − accumulated(t)) / (valid_time(t+1) − valid_time(t))

A few models (e.g. DWD ICON for radiation) instead store an average since model start, which is converted back to an instantaneous rate with the equivalent reverse-averaging calculation. Negative values that can arise from these operations are clipped to 0.

Weather symbol

symbol is a compact integer code that encodes cloudiness, precipitation intensity, and precipitation phase in one number:

symbol = 10000·cloud + 1000·precip + 100·phase
Component Value Condition
cloud 3 / 2 / 1 / 0 cloud fraction ≥ 0.86 / 0.38–0.86 / 0.13–0.38 / < 0.13
precip 3 / 2 / 1 / 0 precipitation (mm/h) 0.95–50 / 0.25–0.95 / 0.1–0.25 / < 0.1
phase 2 / 1 / 0 temperature < 273.65 K (snow) / 273.65–274.65 K (sleet) / else (rain)

The integer is mapped to a human-readable label. The complete code→label table is also attached to every response that includes symbol as the dataset attribute symbols_mapping (a JSON object), so you can decode it client-side. The mapping is:

Code Label Code Label Code Label
0 / 100 / 200 Sun 10000–10200 LightCloud 30000–30200 Cloud
1000 DrizzleSun 11000 DrizzleSun 31000 Drizzle
1100 LightSleetSun 11100 LightSleetSun 31100 LightSleet
1200 LightSnowSun 11200 LightSnowSun 31200 LightSnow
2000 LightRainSun 12000 LightRainSun 32000 LightRain
2100 SleetSun 12100 SleetSun 32100 Sleet
2200 SnowSun 12200 SnowSun 32200 Snow
3000 RainSun 13000 RainSun 33000 Rain
3100 HeavySleetSun 13100 HeavySleetSun 33100 HeavySleet
3200 HeavySnowSun 13200 HeavySnowSun 33200 HeavySnow
20000–20200 PartlyCloud 21000–23200 (…Sun variants)

Codes with cloud digit 0–2 carry the …Sun suffix (sun visible through cloud); cloud digit 3 (overcast) drops the suffix. Requesting symbol automatically pulls in the CloudCover, TotalPrecipitation, and Temperature it needs.