IsobarNWP archive

API

Ask for the slice, not the loaf

Every request is a subset: variables, levels, times, an area and optionally an ensemble member.

$ isobar get --dataset ecmwf-ens --var 2t --member all \
$ --bbox 5,45,20,56 --time 2026-08-04T00/2026-08-11T00
resolving … 51 members × 169 steps × 1 variable
subset: 4.1 GB (full cycle would be 6.4 TB)
written to 2t_ens_20260804.zarr in 38s

Endpoints

GET/v1/datasetsList datasets with extents and variables
GET/v1/datasets/{id}/cyclesAvailable cycles and their status
POST/v1/subsetCreate a subset request, returns a job
GET/v1/jobs/{id}Job status and output URLs
GET/v1/zarr/{dataset}/{path}Direct Zarr chunk access
GET/v1/grib/{dataset}/{cycle}/{field}Original GRIB2 message
POST/v1/subscriptionsWebhook on new cycle availability
GET/v1/lagCurrent ingest lag per model, unauthenticated

Examples

python
import xarray as xr

ds = xr.open_zarr(
    'https://api.de-dev-01.tabserv.link/v1/zarr/era5/single-levels',
    storage_options={'headers': {'Authorization': f'Bearer {KEY}'}},
)

# 40 years of hourly 2m temperature at one point: ~200 ms
series = ds['t2m'].sel(latitude=52.5, longitude=13.4,
                       method='nearest')
Large jobs are expected. Requests above a terabyte are queued, chunked and delivered with a manifest; they resume cleanly and verify per chunk. There is no penalty for asking for a lot — the archive exists to be read.