Recommended: the ecmwf-opendata Python package

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",
)

Browse the files

You can browse the list of files directly at data.ecmwf.int/ .

Direct download with wget or curl

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:

wget [ROOT]/20260512/00z/ifs/0p25/enfo/20260512000000-24h-enfo-ef.grib2

Wave forecast, step 6h, 00 UTC:

wget [ROOT]/20260512/00z/ifs/0p25/wave/20260512000000-6h-wave-fc.grib2

Ensemble probability, steps up to 240h, 00 UTC (note step=240 in the name):

wget [ROOT]/20260512/00z/ifs/0p25/enfo/20260512000000-240h-enfo-ep.grib2

Tropical-cyclone tracks (BUFR), 00 UTC, step 360h:

wget [ROOT]/20260512/00z/ifs/0p25/oper/20260512000000-360h-oper-tf.bufr

Each GRIB file has a matching index file: swap the .grib2 extension for .index. The index is text, one JSON record per field, each carrying _offset and _length — the byte range of that field. Use those to fetch a single field with an HTTP byte-range request.

1. Download the index and find the record for 2m temperature ("param": "2t"):

wget [ROOT]/20260512/00z/ifs/0p25/oper/20260512000000-24h-oper-fc.index

2. Use its _offset and _length to fetch only that field from the .grib2:

wget --header="Range: bytes=${start_bytes}-${end_bytes}" \
  [ROOT]/20260512/00z/ifs/0p25/oper/20260512000000-24h-oper-fc.grib2 \
  -O 2t-step24.grib2

The offsets change every run, so recompute them each time. Multipart byte ranges are not supported by all servers.

  • No labels