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
…Sunsuffix (sun visible through cloud); cloud digit 3 (overcast) drops the suffix. Requestingsymbolautomatically pulls in theCloudCover,TotalPrecipitation, andTemperatureit needs.