Getting started

From sign-up to your first frame in five minutes

ArcoDataHub serves analysis-ready, cloud-optimized datasets (Zarr, COG, GeoParquet) that update live, some every five minutes. You stream the slice you need over HTTPS, you never download an archive unless you want one.

1

Create an account

Register, then confirm the link we email you.

2

Subscribe to a dataset

Pick one in the catalogue and press Subscribe. Access is granted immediately.

3

Get your credentials

Your username and access key are on My Requests. Keep the key out of code and notebooks.

01Open a dataset in Python

Everything below assumes xarray with the Zarr engine. Credentials come from environment variables so the same code runs on your laptop, in a notebook and in a job.

bash
pip install xarray "zarr>=3" dask aiohttp
export ARCODATAHUB_USERNAME=your_username
export ARCODATAHUB_ACCESS_KEY=your_access_key
python
import os, aiohttp, xarray as xr

auth = (os.environ["ARCODATAHUB_USERNAME"], os.environ["ARCODATAHUB_ACCESS_KEY"])
ds = xr.open_zarr(
    "https://api.arcodatahub.com/S3/italian-radar-dpc-vmi.zarr",
    storage_options={"client_kwargs": {"auth": aiohttp.BasicAuth(*auth)}},
)

# the newest time step that contains data
frame = ds["vmi"].sel(time=ds.attrs["last_valid"])
frame.plot()

Look timestamps up, never compute them. Live datasets pre-allocate their time axis years ahead, so most of it is empty, and the spacing changed over the life of some archives (the Italian radar products moved from a 10-minute to a 5-minute cadence in July 2018). Select with .sel(time=…) or ds.indexes["time"].get_loc(…); the last_valid attribute is the end of the real data. Every dataset page has a ready-made notebook that does this for you.

02Other ways in

Same URL, same credentials. Choose the tool you already use.

GDAL 3.11 or newer reads the stores directly, sharded ones included. One time step becomes a GeoTIFF in about a second, and QGIS opens the same URL through its Zarr driver. GDAL addresses the time axis by position, so first ask the time-index API which position a timestamp has; it takes the same credentials.

bash
export GDAL_HTTP_USERPWD="$ARCODATAHUB_USERNAME:$ARCODATAHUB_ACCESS_KEY"
STORE='ZARR:"/vsicurl/https://api.arcodatahub.com/S3/italian-radar-dpc-vmi.zarr"'   # keep both kinds of quotes

# position of 2026-09-10 15:00 UTC on the time axis
IDX=$(curl -s -u "$GDAL_HTTP_USERPWD" \
  "https://arcodatahub.com/datasets/api/time-index/italian-radar-dpc-vmi.zarr/?t=2026-09-10T15:00" | jq .index)

gdalmdiminfo "$STORE"                                   # structure, attributes, last_valid
gdalmdimtranslate "$STORE" vmi_20260910T1500.tif -array "name=vmi,view=[$IDX,:,:]"

The API answers with the exact position, or 404 with the nearest positions on either side when the timestamp is not on the axis; add method=nearest to snap. Several t= parameters can be passed at once.

The gateway serves objects, not listings, so S3 sync tools cannot walk a store on their own. Every store publishes a keys.txt manifest instead, refreshed nightly, that lists every object it contains. Fetch it, then hand it to the tool you prefer.

bash
B=https://api.arcodatahub.com/S3/italian-radar-dpc-vmi.zarr
curl -u "$ARCODATAHUB_USERNAME:$ARCODATAHUB_ACCESS_KEY" -O "$B/keys.txt"

# whole archive with rclone (parallel, resumable)
rclone copy --files-from keys.txt --no-traverse --transfers 4 \
  --header "Authorization: Basic $(printf '%s:%s' "$ARCODATAHUB_USERNAME" "$ARCODATAHUB_ACCESS_KEY" | base64)" \
  ":http,url=\"$B/\":" ./italian-radar-dpc-vmi.zarr

# or with wget
sed "s|^|$B/|" keys.txt | wget -x -nH --cut-dirs=2 --user "$ARCODATAHUB_USERNAME" --password "$ARCODATAHUB_ACCESS_KEY" -i -

For a period, filter the manifest first. On the sharded stores one shard is one day, numbered from the start of the series, so a range of shard numbers is a range of days. Keep the metadata lines so the copy still opens.

bash
grep -vE '^vmi/c/' keys.txt > period.txt                         # metadata and coordinates
grep -E  '^vmi/c/(30[0-9][0-9])/' keys.txt >> period.txt          # shards 3000 to 3099

In Python, ds.sel(time=slice("2026-08-01", "2026-08-31")).to_zarr("vmi-aug.zarr", zarr_format=2) does the same by date; a Zarr v2 target keeps the original compression.

Every dataset is a STAC collection with its extent, grid and variables. Browse at catalog.arcodatahub.com or query the API; note that /collections is paginated, follow the next link.

python
from pystac_client import Client

cat = Client.open("https://stac.arcodatahub.com")
for c in cat.get_collections():
    print(c.id, c.extent.temporal.intervals[0][1])

03Good to know

  • One chunk is one time step. Read along time in the shape the store is chunked; the dataset page shows the chunking. S3 sync tools need the store's keys.txt, see “Download an archive”.
  • Don't reduce the whole cube. A mean over eight years of radar reads terabytes. Subset first, or ask us for a precomputed product.
  • Special values are documented in the store. Read the variable's comment attribute before masking; fill values differ between products.
  • Fair use. Access is monitored. If you plan a large pull, tell us first and we will help you do it efficiently.
  • Keys are personal. Never commit them; regenerate from your profile if one leaks.
  • Cite the dataset. Each collection carries its license and attribution in the STAC record and in the store attributes.

Where next

Questions, a dataset you'd like to see, or a large project to plan: write to us at the registration address.