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')json
{
"dataset": "ecmwf-ens",
"cycle": "2026-08-04T00",
"variables": ["2t", "10u", "10v", "tp"],
"members": "all",
"steps": "0/168/3",
"area": [56, 5, 45, 20],
"format": "zarr"
}bash
isobar auth login --key $ISOBAR_KEY
isobar get --dataset era5 --var t2m,tp \
--time 1990-01-01/2025-12-31 --freq hourly \
--bbox -10,35,30,60 --format netcdf --out ./era5_eu/
# 112 TB · resumable · checksums verified per chunkLarge 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.