REST API
The Python package is a wrapper around a plain HTTP API. Use it directly from
MATLAB, R, curl, or anything else that speaks HTTP.
Base URL: https://weather-data-gui.up.railway.app
No authentication is required.
Endpoints
Method |
Path |
Purpose |
|---|---|---|
GET |
|
liveness check |
GET |
|
pipeline health |
GET |
|
full catalog (cached 30 min) |
GET |
|
force a catalog rebuild |
GET |
|
download whole files |
GET |
|
states and ISO zones with bounding boxes |
GET |
|
download cropped by region and/or time |
GET |
|
event animation (supports range requests) |
GET |
|
zone coverage map PNG |
GET |
|
which Drive folders are in use |
GET |
|
raw filenames in a folder |
/api/catalog
curl https://weather-data-gui.up.railway.app/api/catalog
{
"era5_na": {"quarters": ["2026-Q3"], "file_ids": {}},
"hrrr_forecast": {"cycles": ["2026-07-22T12Z"], "file_ids": {}},
"hrrr_history_current": {"days": ["2026-07-21"], "file_ids": {}},
"hrrr_history_archive": {"months": [], "file_ids": {}},
"hrrr_history_hourly_current": {"days": ["2026-07-21"], "file_ids": {}},
"hrrr_history_hourly_archive": {"months": ["2026-06", "2014-12"], "file_ids": {}},
"noaa_forecast_recent": {"cycles": ["2026-07-22T12Z"], "file_ids": {}},
"noaa_forecast_archive": {"cycles": ["2026-07-06T18Z"], "file_ids": {}},
"era5_tx": {"quarters": [], "file_ids": {}}
}
The list key differs per source — quarters, months, days, or cycles.
/api/download
Parameter |
Required |
Description |
|---|---|---|
|
yes |
catalog source key, e.g. |
|
yes |
comma-separated date keys |
One date returns the file itself; several return a ZIP bundle.
curl -OJ "https://weather-data-gui.up.railway.app/api/download\
?source=noaa_forecast_recent&dates=2026-07-22T12Z"
/api/download/region
Parameter |
Required |
Description |
|---|---|---|
|
yes |
catalog source key |
|
yes |
comma-separated date keys |
|
with |
|
|
one of |
comma-separated postal codes or ISO zone ids |
|
one of |
|
|
no |
ISO datetime, e.g. |
|
no |
ISO datetime |
Exactly one of region_ids / bbox must be given. One date returns a .pww;
several return a ZIP of .pww files.
curl -OJ "https://weather-data-gui.up.railway.app/api/download/region\
?source=noaa_forecast_recent&dates=2026-07-22T12Z\
®ion_layer=states®ion_ids=TX\
&time_start=2026-07-22T12:00:00&time_end=2026-07-22T18:00:00"
Times are UTC and both bounds are inclusive. Either may be omitted to leave that side open.
/api/extreme/video
Parameter |
Required |
Description |
|---|---|---|
|
yes |
event key, e.g. |
Returns video/mp4. Honours HTTP range requests, replying 206 Partial Content with a Content-Range header, so a player fetches only what it needs:
curl -H "Range: bytes=0-1048575" \
"https://weather-data-gui.up.railway.app/api/extreme/video\
?key=2021-02-14_Winter_Storm_Uri_Texas" -o part.mp4
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 0-1048575/26188969
Content-Type: video/mp4
Each response is capped at 4 MB regardless of the range asked for; request more
to continue. A request with no Range header returns the whole file with 200.
A malformed or past-the-end range returns 416.
/api/extreme/coverage
Parameter |
Required |
Description |
|---|---|---|
|
yes |
ISO zone name, e.g. |
Returns image/png. Both extreme endpoints are cached for a day.
/api/regions
{
"states": [{"id": "TX", "name": "Texas", "layer": "states",
"bbox": [36.5, -106.6, 25.8, -93.5]}],
"iso": [{"id": "ERCOT", "name": "ERCOT", "layer": "iso",
"bbox": [36.5, -106.6, 25.8, -93.5]}]
}
bbox is [lat_max, lon_min, lat_min, lon_max].
Status codes
Code |
Meaning |
What to do |
|---|---|---|
400 |
bad parameters |
check bbox ordering, ISO date format, layer name |
404 |
no file for that source and date |
list the catalog first |
413 |
area too large to crop server-side |
shrink the area, or download whole and crop locally |
502 |
processing failed |
retry; report if it persists |
503 |
download queue full |
honour |
A 413 body carries a hint:
{"detail": {
"detail": "Requested area exceeds server memory limit for HRRR monthly archives.",
"sdk_hint": "Use: client.hrrr.download_region(months=[...], bbox=(...), dest='./data/')"
}}
Rate limiting
There is no request-count limit, but heavy endpoints run behind bounded queues —
a few requests run concurrently, the rest wait, and once the queue is full the
server replies 503 with Retry-After rather than accepting work it cannot
finish. Honour that header. The Python client does this for you.
Debug endpoints
When data does not appear, these show what the server actually sees:
curl https://weather-data-gui.up.railway.app/api/debug/folders
curl "https://weather-data-gui.up.railway.app/api/debug/folder?folder_id=<id>&limit=20"
The first lists the resolved Drive folder ids; the second lists real filenames in one. Together they distinguish a permissions problem from a filename-pattern problem.
Warning
The files array from /api/debug/folder ends with a sentinel entry that
is not a file:
{"folder_id": "1kAOe...", "files": [
{"name": "Forecast_NorthAmerica_Run2026-07-22T12Z.pww", "id": "1ACp..."},
{"_total_count": "2594"}
]}
It carries the folder’s true size, which is useful — but it has no name key,
so code that does entry["name"] over the whole array raises KeyError. Filter
on "name" in entry.