The ecmwf-opendata package handles the naming convention and downloads for you, the simplest route for most users. A set of Jupyter notebooks demonstrates it.
from ecmwf.opendata import Client
client = Client(source="ecmwf")
client.retrieve(
stream="oper", type="fc", param="2t",
step=24, target="2t-step24.grib2",
) |
You can browse the list of files directly at data.ecmwf.int/ .
Files follow one pattern. Replace [ROOT] with a location from Where to get it on the overview page, and set stream, type, step and the run time from the What's available table.
[ROOT]/[yyyymmdd]/[HH]z/ifs/[resol]/[stream]/[yyyymmdd][HH]0000-[step][U]-[stream]-[type].[format] |
For example, all parameters at step 24h from the 00 UTC high-resolution (0.25°) forecast of 12 May 2026:
wget [ROOT]/20260512/00z/ifs/0p25/oper/20260512000000-24h-oper-fc.grib2 |
Ensemble forecast (all 50 members), step 24h, 00 UTC:
Wave forecast, step 6h, 00 UTC:
Ensemble probability, steps up to 240h, 00 UTC (note
Tropical-cyclone tracks (BUFR), 00 UTC, step 360h:
|
Each GRIB file has a matching index file: swap the 1. Download the index and find the record for 2m temperature (
2. Use its
The offsets change every run, so recompute them each time. Multipart byte ranges are not supported by all servers. |