NOAA services and research notes
These notes preserve endpoint research and dated probe results. They are not a list of implemented capabilities; use the NOAA guide and generated catalog for supported datasets.
Access notes
NOAA publishes through several unrelated systems. The ones usdata touches:
- NOAA Open Data Dissemination (NODD): bulk archives in public S3 buckets
(also mirrored to Google Cloud and Azure). Anonymous; no account needed.
Reached via
usdata.protocols.s3using plain HTTPS, no AWS SDK (ADR 0002). The NEXRAD Level II archive moved fromnoaa-nexrad-level2tounidata-nexrad-level2with the old bucket deprecated September 2025; the old name now returns Access Denied. Check the AWS Open Data registry page for a dataset before assuming a bucket name. - NCEI Access Data Service (
ncei.noaa.gov/access/services/data/v1): REST endpoint returning CSV or JSON for station datasets such as GHCN-Daily. Anonymous. It filters by explicit station ids and date range; it rejects spatial filters for daily-summaries, so a bbox query first goes to the companion search service (/access/services/search/v1/data) to find stations. In search responsescountis the number of matches andtotalCountis dataset-wide; paginate oncount. Enable Python DEBUG logging forusdata.providers.noaa.ghcndto inspect each search page's request URL, HTTP status, content type, match/result counts, new station count, and up to five station IDs. Pages yielding no new stations include at most 512 response characters. Live tests capture these diagnostics on failure and check geographic discovery separately from explicit-station downloads, so a search outage does not obscure data-service health. - ERDDAP servers (CoastWatch, PolarWatch, and others): griddap and
tabledap URLs with true server-side subsetting. Anonymous. CoastWatch SST
uses griddap CSV for
noaacwBLENDEDsstDNDaily; see the details below. Use the shared HTTP client: live probes found that the service can reject the default httpx User-Agent with HTTP 403. - ArcGIS REST feature services: the NWS Damage Assessment Toolkit serves
damage points, tracks, and areas from
services.dat.noaa.gov/arcgis/rest/services/nws_damageassessmenttoolkit/DamageViewer/FeatureServer. Anonymous. Reached viausdata.protocols.arcgis: SQLwhereclauses, envelopes, GeoJSON output, pages cut by object-id range,historicMomentreads of the archive, andqueryAttachments(ADR 0051). Failures come back as HTTP 200 with anerrorbody; see the dated probes below. - Other NCEI Access Data Service datasets (GSOM, GSOY, LCD, normals)
share the GHCN-Daily client. All require
startDateandendDate; the daily normals dataset expects them inside a placeholder year such as 2010. LCD stations use WBAN-based ids (for example72530094846), not GHCN ids. - CO-OPS Data API (
api.tidesandcurrents.noaa.gov/api/prod/): water levels, predictions, and currents by station id, product, datum, and date range; station metadata from/mdapi/prod/webapi/stations.json. Anonymous. - More NODD buckets verified anonymous:
noaa-goes16/18/19(ABI and GLM, keysPRODUCT/YYYY/DDD/HH/),noaa-mrms-pds(CONUS/PRODUCT/YYYYMMDD/),noaa-hrrr-bdp-pds,noaa-gfs-bdp-pds,noaa-nbm-grib2-pds(GRIB2 model output by cycle and forecast hour),noaa-cdr-*-pds(climate data records as daily NetCDF), andunidata-nexrad-level3(flat keysSITE_PRODUCT_YYYY_MM_DD_HH_MM_SS, site id without the leading K). - NCEI HTTPS directories: plain Apache-style listings for bulk archives
(Storm Events, IBTrACS, ERSST, OISST mirror, OCADS). The nClimDiv path
under
/pub/data/cirs/climdiv/redirects to/monitoring-content/data/us/climdiv/monthly/current/. - THREDDS at
ngdc.noaa.gov/thredds/serves ETOPO 2022 with OPeNDAP; the directmgg/global/relief/file paths I tried return 404. - Not yet located: the bulk access path for GHCN-Hourly. The product page
exists; the data directory guesses under
/oa/and/data/return 404. - OneStop catalog search and NCEI archive services: not used yet;
candidates for a future
discovercommand.
Each registry entry names the product family or service behind it as its
system, and the generated NOAA catalog groups
the implemented datasets under that heading.
Radar site metadata comes from the NCEI HOMR station list, bundled as
src/usdata/data/nexrad_sites.csv and regenerated by
scripts/build_nexrad_sites.py. HOMR lists the Norman test and research
radars (KCRI, KOUN) as NEXRAD; they are absent from the archive and are
marked type TEST so default site selection skips them.
Licensing: NOAA data is a U.S. Government work in the public domain unless a dataset page says otherwise.
Data landscape
What NOAA publishes, by domain, and which registry entries cover it. Domains with no entry yet are recorded here so they are not forgotten; an entry is added once a concrete, anonymously accessible dataset has been verified.
| Domain | What NOAA provides | Example products | Registry entries |
|---|---|---|---|
| Surface weather | Temperature, precipitation, wind, humidity, pressure, snowfall, station observations | GHCN-Daily, GHCN-Hourly, Local Climatological Data, GSOM/GSOY | ghcn-daily, gsom, gsoy, lcd, ghcn-hourly |
| Severe weather | Tornadoes, hail, damaging wind, storm events, damage reports | Storm Events Database, Storm Data, Damage Assessment Toolkit | storm-events, spc-tornado-reports, nws-vtec-events, nws-damage-surveys, nws-damage-photos |
| Weather radar | Reflectivity, radial velocity, dual-pol variables, derived products | NEXRAD Level II, NEXRAD Level III, MRMS | nexrad-level2, nexrad-level3, mrms |
| Weather satellites | Visible/IR imagery, clouds, lightning, fire, volcanic ash | GOES-R ABI, GOES GLM, POES, JPSS | goes-abi, goes-glm |
| Tropical cyclones | Best tracks, intensity, pressure, wind radii | HURDAT2, IBTrACS, HURSAT | hurdat2, ibtracs |
| Weather models | Forecasts, analyses, reanalyses | GFS, HRRR, RAP, NAM, GEFS, National Blend of Models | hrrr, gfs, rap, nbm |
| Climate | Normals, long-term records, divisional averages, indices | Climate Normals, nClimDiv, Climate Data Records | climate-normals, nclimdiv |
| Snow and ice | Snow cover and depth, sea ice concentration and extent | Sea Ice Index (NOAA@NSIDC), IMS snow cover | sea-ice-index |
| Ocean physics | SST, salinity, currents, waves, profiles | OISST, ERSST, World Ocean Database | oisst, ersst |
| Sea level and tides | Water levels, tides, currents, sea-level trends | CO-OPS NWLON, PORTS | coops-water-levels |
| Ocean chemistry | Carbon, oxygen, nutrients, pH | OCADS, SOCAT | ocads |
| Marine life and fisheries | Surveys, stock assessments, habitats, telemetry | NOAA Fisheries surveys, InPort | none yet: access is per-science-center, mostly ERDDAP and InPort |
| Satellite oceanography | SST, ocean color, winds, sea-surface height | CoastWatch, Coral Reef Watch, AVHRR Pathfinder | coastwatch-sst |
| Bathymetry and hydrography | Seafloor elevation, soundings, coastal relief | ETOPO 2022, Coastal Relief Model, hydrographic surveys | etopo |
| Coastal | Shorelines, coastal land cover, elevation, flooding | Digital Coast, C-CAP | none yet: Digital Coast is ArcGIS-served |
| Geophysics | Geomagnetism, marine geophysics | INTERMAGNET, World Magnetic Model | none yet |
| Natural hazards | Tsunamis, volcanic events, significant earthquakes | NCEI Global Historical Tsunami Database (HazEL) | tsunami-events |
| Paleoclimate | Tree rings, ice cores, sediments, corals | World Data Service for Paleoclimatology | paleo-search |
| Space weather | Solar activity, solar wind, geomagnetic indices | SWPC real-time products, DSCOVR, GOES SUVI | swpc-realtime |
| Land and environment | Vegetation, surface temperature, fire | Terrestrial Climate Data Records (NDVI, LAI) | cdr-ndvi |
NWS Damage Assessment Toolkit
Probes on 2026-09-29 against the DamageViewer FeatureServer, recorded in full in the surveys and photos guides. The findings that shaped ADR 0051:
- Three layers, 240,169 points, 12,965 lines, 11,152 polygons; each serves at
most 2000 features per request (
maxRecordCount), flags a capped page withexceededTransferLimitin Esri JSON and GeoJSON, and lists every matching object id in one answer (1.8 MB for all points). - Capabilities
Query,ChangeTracking, and an archive from 25 November 2020:historicMomentbefore it answers a count of 0, after it the layer as it stood. Repeated GeoJSON requests returned identical bytes, with anETagequal to the body's SHA-256. queryAttachmentsstops at 2000 attachments and does not flag it.TIMESTAMP 'YYYY-MM-DD HH:MM:SS.fff'literals compare to the millisecond, in UTC. The layers' advertisedtimeExtent(second century to 2029) is stale; statistics give 1855-05-22 to the present.- The Experience Builder viewer at
apps.dat.noaa.gov/StormDamage/DamageViewer/states no terms; the NWS disclaimer applies.
B='https://services.dat.noaa.gov/arcgis/rest/services/nws_damageassessmenttoolkit/DamageViewer/FeatureServer'
curl "$B?f=json" # 3 layers, capabilities Query,ChangeTracking
curl -G "$B/0/query" --data-urlencode 'where=1=1' -d returnIdsOnly=true -d f=json | wc -c # 1873070
MRMS gridded radar products
Bounded probes on 2026-09-14 listed every supported product's directory for
2024-05-06 in noaa-mrms-pds: 720 two-minute files for most products (719 for
MergedBaseReflectivityQC_00.50 and PrecipRate_00.00, 48 hourly files for
the 2-hour rotation tracks), with the per-file and per-day sizes recorded in
the dataset guide. Rotation tracks stamp
even minutes exactly (-200000); most other products carry the merge second
(-200039). Listing CONUS/<PRODUCT>/ with a / delimiter found 20201014
as the first day for rotation tracks, composite reflectivity, and MESH. The
bucket root holds ALASKA/, ANC/, CARIB/, CONUS/, CONUS_5KM/,
ConvectProb/, GUAM/, HAWAII/, ProbSevere/, and unsupported/; only
CONUS/ is served. A reproducible listing probe is:
curl --get 'https://noaa-mrms-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=CONUS/RotationTrackML30min_00.50/20240506/' \
--data-urlencode 'max-keys=1000'
The 20:00:00 rotation-track file that day was 109,540 bytes gzipped and
189,711 bytes decompressed, one PNG-packed GRIB2 message on a 7,000 × 14,000
regular grid from 55°N 230°E to 20°N 300°E; ecCodes reports its parameter as
unknown (discipline 209). The live test downloads that file, checks the gzip
and GRIB signatures, and restores it through a lockfile without relisting.
GOES ABI imagery and cloud-top products
Bounded probes on 2026-09-08 listed 192 CMIPC files in one hour for each of GOES-16/18 (2024 day 127), GOES-17 (2022 day 127), and GOES-19 (2025 day 127). A reproducible listing probe is:
curl --get 'https://noaa-goes18.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=ABI-L2-CMIPC/2024/127/12/' \
--data-urlencode 'max-keys=1000'
The small channel-6 filename was
OR_ABI-L2-CMIPC-M6C06_G18_s20241271201181_e20241271203560_c20241271204021.nc
(255,384 bytes). The live test downloads it, checks the NetCDF4/HDF5 signature,
then restores through a lockfile without relisting. Archive revisions still
correctly fail restoration if the bytes no longer match the original checksum.
Mesoscale probes on 2026-09-22 followed both listing pages under
ABI-L2-CMIPM/2024/127/22/ in noaa-goes16. This hour contains 120
channel-13 files, split between M1 and M2; the shared directory does not select
a sector. A reproducible first-page probe is:
curl --get 'https://noaa-goes16.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=ABI-L2-CMIPM/2024/127/22/' \
--data-urlencode 'max-keys=1000'
Follow NextContinuationToken with continuation-token for the remaining
objects. The first M1 channel-13 scene is
OR_ABI-L2-CMIPM1-M6C13_G16_s20241272200280_e20241272200349_c20241272200404.nc,
329,131 bytes, with a 500 × 500 grid. Its reported geographic bounds are
110.37°W–91.05°W, 29.72°N–43.40°N. The fifteen-minute example pins 15 scenes
(4,925,644 bytes), with one start in every minute and intervals of 57.1–62.9
seconds. Coordinates, projection, and metadata extent agree across these scans;
this is measured coverage for this window, not a permanent location for M1.
The live mesoscale test fetches the first scene and restores it into an empty
cache, comparing exact bytes.
Product probes on 2026-09-29 listed the top level of each bucket with a delimiter:
curl --get 'https://noaa-goes16.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'delimiter=/'
All four buckets hold the same ABI directories for these products:
CMIPC/F/M, MCMIPC/F/M, ACHAC/F/M, ACHTF/M (no CONUS), CTPC/F (no
mesoscale), and ACTPC/F/M, matching the sector column of NCEI's product type
table. ACHA2KMC/F/M exists in noaa-goes16, 18, and 19 but not in
noaa-goes17. Listing PRODUCT/2024/127/22/ in noaa-goes16 for each product
found one filename shape throughout, with the sector code after the product and
a channel only in CMIP names:
OR_ABI-L2-CMIPF-M6C01_G16_s20241272200205_e20241272209513_c20241272209574.nc
OR_ABI-L2-MCMIPC-M6_G16_s20241272201173_e20241272203551_c20241272204067.nc
OR_ABI-L2-MCMIPM1-M6_G16_s20241272200280_e20241272200350_c20241272200421.nc
OR_ABI-L2-ACHAM1-M6_G16_s20241272200280_e20241272200338_c20241272201218.nc
OR_ABI-L2-ACHTF-M6_G16_s20241272200205_e20241272209513_c20241272213066.nc
OR_ABI-L2-CTPC-M6_G16_s20241272201173_e20241272203546_c20241272206329.nc
OR_ABI-L2-ACTPM1-M6_G16_s20241272200280_e20241272200338_c20241272201009.nc
That hour held 12 files per CONUS selection, 6 per full-disk selection, and 60 per mesoscale sector, each directory in one listing page except CMIPM (1,920 files). Each mesoscale directory split evenly between M1 and M2. Sizes per file: CMIPC 2.2–63 MB, CMIPF 9.0–301 MB, CMIPM 0.20–5.0 MB, MCMIPC 55–58 MB, MCMIPF 297–312 MB, MCMIPM 4.3–4.5 MB, ACHAC 0.29 MB, ACHAF 1.5 MB, ACHAM 0.14 MB, ACHTF 28 MB, ACHTM 0.30–0.33 MB, CTPC 0.29 MB, CTPF 1.6 MB, ACTPC 0.54–0.59 MB, ACTPF 3.0–3.1 MB, ACTPM 0.09–0.10 MB. Night MCMIPM scenes were smaller, 3.0–3.8 MB in the 06:00 and 10:00 UTC hours. A reproducible probe is:
curl --get 'https://noaa-goes16.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=ABI-L2-MCMIPM/2024/127/22/' \
--data-urlencode 'max-keys=1000'
The earliest scene per product and bucket came from listing PRODUCT/ with a
delimiter for years, then the first non-2000 year for days, the first day for
hours, and the first hour with max-keys=1. GOES-16 holds each product's
earliest scene:
| Directories | GOES-16 | GOES-17 | GOES-18 | GOES-19 |
|---|---|---|---|---|
| CMIP, MCMIP | 2017 day 059 (Feb 28) | 2018 day 240 | 2022 day 131 | 2024 days 284–292 |
| ACHAC/F/M, ACTPM | 2019 day 336 (Dec 2) | 2019 day 336 | 2022 day 131 | 2024 day 289 |
| ACHTF/M, CTPC/F | 2019 day 339 (Dec 5) | 2019 day 339 | 2022 day 131 | 2024 day 289 |
| ACTPC/F | 2017 day 136 (May 16) | 2018 day 239 | 2022 day 131 | 2024 day 289 |
| ACHA2KMC/F/M | 2023 day 082 | none | 2023 day 086 | 2024 day 289 |
The first ACTPC scene, OR_ABI-L2-ACTPC-M4_G16_s20171360000221_e20171360000221_c20171360006337.nc,
is Mode 4 with equal start and end stamps. Only noaa-goes16 has a 2000/
year of placeholder scenes, under the six CMIP and MCMIP directories and ACTPC
and ACTPF; ACTPM and the height, temperature, and pressure directories have
none. GOES-16's CMIPC and ACHAC listings end at 2025 day 097. Year folders per product in noaa-goes16: ACTPC has
212 days in 2017 and every day of 2018 and 2019; ACHAC has 30 days in 2019;
MCMIPC has 293 days in 2017.
Opening one file of each product with the netcdf extra gave these main
variables and spatial_resolution attributes: MCMIP CMI_C01–CMI_C16 and
DQF_C01–DQF_C16 on a 2 km grid (500 × 500 mesoscale, 1500 × 2500 CONUS),
units 1 for channels 1–6 and K for 7–16; ACHA HT (m) at 10 km CONUS and
full disk, 4 km mesoscale (250 × 250); ACHT TEMP (K) at 2 km; CTP PRES
(hPa) at 10 km; ACTP Phase at 2 km with flag_values 0–5 for
clear_sky liquid_water super_cooled_liquid_water mixed_phase ice unknown. Every
cloud-top file also has DQF. The M1 MCMIP scene above has CMI_C13 and
DQF_C13 identical to CMI and DQF in
OR_ABI-L2-CMIPM1-M6C13_G16_s20241272200280_e20241272200349_c20241272200404.nc,
the single-channel file of the same scan. The live tests fetch that MCMIP scene
(4,505,610 bytes) and the same scan's ACTPM file (86,847 bytes), restore both
into an empty cache, and compare channel 13 between the two imagery products.
The GOES-R product pages (www.goes-r.gov/products/overview.html) state on 2026-09-29 that the site retires on 2026-09-30 and moves to nesdis.noaa.gov, so the dataset guide cites NCEI and the files instead.
GOES GLM lightning detections
Bounded probes on 2026-09-14 listed 180 GLM-L2-LCFA files in one hour for
GOES-16 (2024 day 127, hour 20), between 270,140 and 394,471 bytes each, and
confirmed GOES-19 files under the same layout (2025 day 127). A reproducible
listing probe is:
curl --get 'https://noaa-goes16.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=GLM-L2-LCFA/2024/127/20/' \
--data-urlencode 'max-keys=1000'
Filenames follow OR_GLM-L2-LCFA_G16_sYYYYDDDHHMMSSt_eYYYYDDDHHMMSSt_cYYYYDDDHHMMSSt.nc
with tenth-of-second stamps; the first file of the hour was
OR_GLM-L2-LCFA_G16_s20241272000000_e20241272000200_c20241272000213.nc
(288,572 bytes, 194 flashes, 2,725 groups, 5,692 events). Day-by-day listing of
GLM-L2-LCFA/2018/ found the earliest GOES-16 file on day 044 at 16:10 UTC
and nothing earlier. The live test downloads that first 2024 file, checks the
NetCDF4/HDF5 signature, restores through a lockfile without relisting, and
opens the flash table with the netcdf extra.
HRRR model output
Bounded listings on 2026-09-14 of hrrr.20240506/conus/ in noaa-hrrr-bdp-pds
found, for every cycle, the wrfsfcf, wrfprsf, wrfnatf, and wrfsubhf
GRIB2 files with .grib2.idx sidecars, plus BUFR sounding archives. The 00,
06, 12, and 18 UTC runs carry forecast hours 00 through 48 (49 files per
variant); every other cycle stops at 18. Subhourly files stop at 18 in all
cycles. A reproducible listing probe is:
curl --get 'https://noaa-hrrr-bdp-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=hrrr.20240506/conus/hrrr.t20z.wrfsfcf'
Sizes for the 20 UTC run on 2024-05-06: wrfsfcf00 150,114,757 bytes and
wrfsfcf01 158,293,431; wrfprsf00 408,899,120; wrfnatf00 705,956,816;
wrfsubhf01 228,194,453. The surface analysis holds 170 GRIB2 messages on a
1799 × 1059 Lambert conformal grid. The bucket's day prefixes begin at
hrrr.20140730/, whose first CONUS run is 18 UTC; alaska is the only other
domain. The live test resolves and downloads hrrr.t20z.wrfsfcf00.grib2 for
2024-05-06, restores it through a lockfile, and opens surface CAPE when the
grib extra is installed.
GFS model output
Bounded listings on 2026-09-14 of gfs.20240506/ in noaa-gfs-bdp-pds found
the four cycles 00, 06, 12, and 18, each with atmos/ and wave/
prefixes. Under atmos/, the gfs.tHHz.pgrb2.<resolution>.fNNN files exist
for 0p25, 0p50, and 1p00, beside pgrb2b (the remaining fields),
pgrb2full.0p50, .anl analysis files, .grib2.idx-style .idx sidecars,
and BUFR archives. The 0.25 degree files run hourly from f000 to f120 and
every three hours to f384 (209 files); the 0.5 and 1 degree files run every
three hours from f000 to f384 (129 files), in every cycle probed. A
reproducible listing probe is:
curl --get 'https://noaa-gfs-bdp-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=gfs.20240506/00/atmos/gfs.t00z.pgrb2.1p00.f'
Sizes for the 00 UTC run on 2024-05-06: pgrb2.1p00.f000 42,362,644 bytes
and f003 44,925,309; pgrb2.0p50.f000 150,321,638; pgrb2.0p25.f000
507,547,200 and f120 547,490,924. The 1 degree analysis holds 696 GRIB2
messages on a 360 × 181 regular grid, including surface CAPE and CIN, 0–3 km
storm-relative helicity, and mixed-layer CAPE on pressureFromGroundLayer
levels. Day prefixes begin at gfs.20210101/, but through the 06 UTC run of
2021-03-22 the cycles hold only WAFS files; the atmos/ layout with pgrb2
files begins with the 12 UTC run of 2021-03-22 (GFS v16). The live test
resolves and downloads gfs.t00z.pgrb2.1p00.f000 for 2024-05-06, restores it
through a lockfile, and opens surface CAPE when the grib extra is installed.
RAP model output
Bounded listings on 2026-09-16 of rap.20240506/ in noaa-rap-pds found,
for every cycle, the awp130pgrb, awp130bgrb, wrfprs, wrfnat,
wrfmsl, awp252pgrb, awp252bgrb, awp236pgrb, awp242, awp243,
awp200, and awip32 GRIB2 families with .grib2.idx sidecars, plus BUFR
sounding archives. The 03, 09, 15, and 21 UTC runs carry forecast hours 00
through 51 (52 files per family); every other cycle stops at 21. A
reproducible listing probe is:
curl --get 'https://noaa-rap-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=rap.20240506/rap.t20z.awp130pgrbf'
Sizes for the 20 UTC run on 2024-05-06: awp130pgrbf00 18,368,480 bytes;
awp130bgrbf00 41,103,749; wrfprsf00 228,177,374; wrfnatf00 305,421,172.
The 13 km analysis holds 355 GRIB2 messages on a 451 × 337 Lambert conformal
grid, including surface CAPE and CIN, 0–1 km and 0–3 km storm-relative
helicity, and mixed-layer and most-unstable CAPE on mb above ground layers.
The bucket's day prefixes begin at narre.20201201/; the first rap. prefix
is rap.20210222/, whose 00 UTC run holds awp130pgrbf00. The live test
lists two hours with sizes, fetches surface CAPE and 0–3 km helicity as byte
ranges, restores them through a lockfile, and opens them when the grib
extra is installed.
NBM forecast guidance
Bounded listings on 2026-09-16 of blend.20240506/ in noaa-nbm-grib2-pds
found every hourly cycle with core/, qmd/, and text/ prefixes. Under
core/, blend.tHHz.core.fFFF.<region>.grib2 files exist for the co,
ak, hi, pr, and gu regions with .grib2.idx sidecars, beginning at
f001. The CONUS files of the 00 and 12 UTC runs are hourly to 36 and
three-hourly to 192 (88 files); the 06 and 18 UTC runs add six-hourly files to
264 (100 files); the 01 and 13 UTC runs are hourly to 173 and the 07 and 19
UTC runs hourly to 152; the remaining cycles are hourly to 36 or 37,
three-hourly to about 190, and six-hourly to about 262. A reproducible
listing probe is:
curl --get 'https://noaa-nbm-grib2-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' \
--data-urlencode 'prefix=blend.20240506/20/core/blend.t20z.core.f001.'
Sizes for the 20 UTC run on 2024-05-06, forecast hour 1: co 171,059,531
bytes, ak 52,257,699, hi 6,110,448, gu 633,902. The CONUS file holds
300 GRIB2 messages on a 2345 × 1597 Lambert conformal grid at 2.54 km; index
lines carry a fourth field for ensemble standard deviations and probability
thresholds. Day prefixes begin at blend.20200518/ in a grib2/ layout of
master files; the core/ layout begins with the 12 UTC run of 2020-09-29.
The live test lists two hours with sizes, fetches the 2 m temperature message
as a byte range, restores it through a lockfile, and opens it when the grib
extra is installed.
Storm Events annual details
Bounded live probes verified on 2026-09-09 UTC (1950 archive: 10,508 bytes):
curl --fail 'https://www.ncei.noaa.gov/pub/data/swdi/stormevents/csvfiles/'
curl --fail --output /tmp/storm-1950.csv.gz \
'https://www.ncei.noaa.gov/pub/data/swdi/stormevents/csvfiles/StormEvents_details-ftp_v1.0_d1950_c20260323.csv.gz'
The filename is a probe snapshot; the adapter discovers current filenames instead of hard-coding it. The design decision records the annual-file and compression contract. The notebook downloads one 2024 archive (~13 MB compressed), then filters locally; neither the test nor example downloads all archive years.
SPC tornado reports
Probes on 2026-09-14 UTC against https://www.spc.noaa.gov/wcm/. The data
directory itself returns HTTP 403 and no index, so the adapter discovers files
from the page's links instead of a directory listing. All files answered
text/csv over anonymous HTTPS:
| File | Size | Last-Modified |
|---|---|---|
data/2025_torn.csv |
217,624 bytes | 2026-04-24 |
data/2024_torn.csv |
230,094 bytes (1,873 rows) | 2025-05-13 |
data/2023_torn.csv |
166,684 bytes | 2024-07-17 |
data/2008_torn.csv |
193,676 bytes | epoch placeholder |
data/2005-2007_torn.csv |
3,525 rows | epoch placeholder |
data/2000-2004_torn.csv |
728,228 bytes | epoch placeholder |
data/50-59_torn.csv … 90-99_torn.csv |
4,905 to 12,276 rows | epoch placeholder |
data/1950-2025_actual_tornadoes.csv |
9,023,445 bytes | 2026-04-24 |
data/1950-2025_all_tornadoes.csv |
9,219,030 bytes | 2026-04-24 |
data/1950-2025_torn.csv.zip |
2,028,149 bytes | 2026-04-24 |
Per-year files exist for 2008 onward; earlier years are only in decade and
half-decade files. 2026_torn.csv and any single-year file before 2008 return
HTTP 404. The all-years files embed the last year in their name, so
1950-2024_* disappeared when 1950-2025_* was published; per-year and decade
names are stable and their bytes change in place (the 2024 file was modified
after the 2025 file appeared, and the page prints an update date beside each
link). Every file from 1950 through 2024 shares the 29-column header from the
format specification;
the 2025 file appends edat and etime. In 2024, tz was 3 on every row,
sg was 1 on 1,791 rows and 2 on 81, one row carried -9, and mag ranged
from -9 to 4. The specification is a scanned PDF, so its column definitions
are restated in the dataset guide.
HURDAT2 best tracks
Probes on 2026-09-12 UTC listed the NHC data directory and fetched both current whole-basin files:
curl --fail 'https://www.nhc.noaa.gov/data/hurdat/'
curl --fail --output /tmp/hurdat2-atl.txt \
'https://www.nhc.noaa.gov/data/hurdat/hurdat2-1851-2025-02272026.txt'
curl --fail --output /tmp/hurdat2-nepac.txt \
'https://www.nhc.noaa.gov/data/hurdat/hurdat2-nepac-1949-2025-02272026.txt'
The data files are served as text/plain; charset=UTF-8 (the directory index
itself is HTML) and the listing keeps past revisions: 41
files on 2026-09-12, the oldest hurdat2-nepac-1949-2016-041317.txt, a revision
of 2017-04-13 covering data through the 2016 season. The current Atlantic file
was 7,082,381 bytes (2,004 storms, 55,605 track points) and the northeast
Pacific file 4,083,231 bytes (1,262 storms, 32,026 track points). Filenames are
the probe snapshot; the adapter discovers current names instead of hard-coding
them.
Naming is inconsistent in ways worth recording. The Atlantic basin token is
usually omitted (hurdat2-1851-2025-02272026.txt) but appears as atl in a few
names; the Pacific token is always nepac. Revision dates are MMDDYY in older
names and MMDDYYYY in newer ones, never YYYYMMDD, so filenames do not sort
chronologically as text; one Pacific name ends in a disambiguating a. Directory
sizes are approximate (6.8M), unlike NCEI's exact byte counts, so asset size is
left unknown. Every data line in both current files has 21 fields; revisions
published before the 2021 season omit the trailing radius of maximum wind.
Archived revisions vary more than the current pair suggests, which is worth
knowing because a lockfile pins one. Parsing all 41 listed files on 2026-09-12:
10 of them, all Atlantic, write at least one position east of Greenwich as an
unwrapped 0-360 west longitude (358.0W for 2.0E, down to 299.0W for 61.0E),
a form the current files no longer use: hurdat2-1851-2024-040425.txt rewrote
those same points with E suffixes. Two files carry an upstream typo and cannot
be parsed at all: hurdat2-1851-2024-040225.txt line 30687 drops the comma
between latitude and longitude, and hurdat2-nepac-1949-2022-042723.txt line
23724 dates a track point C0091018. Each is fixed by the next revision of the
same span, which is also the one the adapter selects. The -99 maximum-wind
sentinel is documented as a 1967 convention but appears 57 times in the current
Atlantic file, all on TD records from 1971 through 1987, and never in the
Pacific file. The design decision
records the whole-file and reader contract.
IBTrACS global best tracks
Probes on 2026-09-17 UTC listed the NCEI archive directory, its version directories, and the per-format listings, and fetched the smallest subset in each format:
BASE='https://www.ncei.noaa.gov/data/international-best-track-archive-for-climate-stewardship-ibtracs'
curl --fail "$BASE/"
curl --fail "$BASE/v04r01/access/csv/"
curl --fail --output /tmp/ibtracs-sa.csv "$BASE/v04r01/access/csv/ibtracs.SA.list.v04r01.csv"
curl --fail --output /tmp/ibtracs-sa.nc "$BASE/v04r01/access/netcdf/IBTrACS.SA.v04r01.nc"
The archive root lists three version directories, v03r09, v04r00, and
v04r01. From v4 each holds access/csv/, access/netcdf/, and
access/shapefile/, and each of those holds one file per subset: ALL,
ACTIVE, last3years, since1980, and the basins NA, EP, WP, NI,
SI, SP, and SA, named ibtracs.<subset>.list.v04r01.csv and
IBTrACS.<subset>.v04r01.nc, beside a serial-number-to-name mapping. v03r09
instead publishes one NetCDF file per storm, so the adapter refuses versions
before v4. Listings give exact byte sizes and a minute-precision modified
stamp; the stamp matched the Last-Modified header (09:02 GMT) so it is
read as UTC. On 2026-09-17 the CSVs ran from 56,442 bytes (SA) through
57,169,545 (NA) to 331,542,080 (ALL), and the NetCDF files from 688,651
(SA) to 23,379,578 (ALL); last3years was 10,426,557 bytes of CSV. The
CSV is served as text/csv and the NetCDF as application/x-netcdf; the
latter is HDF5-based NetCDF4 with storm by date_time arrays (360 time
slots) and a quadrant axis for the wind radii.
Every file carried that morning's build stamp, and v04r01/archive/ held
one tarball per format named for the build,
ibtracs_v04r01_csv_s18421025_e20260917_c20260917.tar.gz, with no earlier
builds beside it: files are rebuilt in place under unchanging names, and
superseded bytes are not kept upstream. The
change log
records twenty-three data additions and corrections between 2024-06-21 and
2026-07-31, most adding one agency's season. The s18421025 in the tarball
name and the files' time_coverage_start attribute both give 1842-10-25T03:00
as the archive's first record; the North Atlantic file begins in 1851 and the
northeast Pacific in 1876.
The CSV has 174 columns and, like ERDDAP, a units row under the header
(degrees_north, kts, mb, nmile; a single space for text columns). A
missing value is written as a single space, not an empty field, and the North
Atlantic basin and sub-basin code is the literal NA, which pandas reads as
missing by default; the reader therefore treats only a space or an empty field
as missing. Points are three-hourly (123,264 of the 124,946 consecutive steps in the
North Atlantic file), with IFLAG marking each agency's value as original (O),
interpolated (P), or otherwise filled. A basin file holds every storm that
entered the basin, whole, so the North Atlantic file also carries EP and
NI points from crossing storms. TRACK_TYPE separates main tracks from
PROVISIONAL and US-PROVISIONAL operational ones: in the last3years file
every 2023 and 2024 storm was main, 46 of 115 2025 storms were, and no 2026
storm was. In v04r00 an unnamed storm is NOT_NAMED; v04r01 writes UNNAMED.
Global Summary of the Month
Bounded live probes verified on 2026-09-08 (one airport, one month):
curl --get 'https://www.ncei.noaa.gov/access/services/data/v1' \
--data-urlencode 'dataset=global-summary-of-the-month' \
--data-urlencode 'stations=USW00013967' \
--data-urlencode 'startDate=2024-05-06' --data-urlencode 'endDate=2024-05-07' \
--data-urlencode 'dataTypes=PRCP,TAVG' --data-urlencode 'units=metric' \
--data-urlencode 'format=csv' --data-urlencode 'includeStationLocation=1'
curl --get 'https://www.ncei.noaa.gov/access/services/search/v1/data' \
--data-urlencode 'dataset=global-summary-of-the-month' \
--data-urlencode 'bbox=35.40,-97.62,35.38,-97.58' \
--data-urlencode 'startDate=2024-05-01' --data-urlencode 'endDate=2024-05-31' \
--data-urlencode 'dataTypes=PRCP,TAVG' \
--data-urlencode 'limit=1' --data-urlencode 'offset=0'
The data probe returned one 2024-05 row (91.8 mm, 21.7 °C); these are observed
values, not permanent test expectations. Search returned USW00013967, count=1,
and dataset-wide totalCount=127947; repeating with offset=1 returned no results.
Integration tests independently check geographic discovery and a manifest's
explicit-station download/locked restoration. Upstream revisions can still
change CSV bytes and correctly fail a locked restore.
Global Summary of the Year
Bounded hosted probes verified one airport/year and geographic discovery on 2026-09-09. Both a full-year request and a May 6–7 request returned the 2024 annual record. A reproducible direct probe is:
curl --get 'https://www.ncei.noaa.gov/access/services/data/v1' \
--data-urlencode 'dataset=global-summary-of-the-year' \
--data-urlencode 'stations=USW00013967' \
--data-urlencode 'startDate=2024-01-01' --data-urlencode 'endDate=2024-12-31' \
--data-urlencode 'dataTypes=PRCP,TAVG' --data-urlencode 'units=metric' \
--data-urlencode 'format=csv' --data-urlencode 'includeStationLocation=1'
The search probe used the same annual bounds, dataTypes=PRCP,TAVG,
bbox=35.40,-97.62,35.38,-97.58, limit=1, and offset=0; it found
USW00013967. The annual climate example
provides a small manifest and local CSV analysis. Live checks independently
exercise discovery and checksum-verified restoration.
U.S. Climate Normals
Hourly extension probe (2026-09-21)
The hourly dataset normals-hourly-1991-2020 supports the same anonymous
station search and CSV endpoint. A box around Will Rogers World Airport
(35.4,-97.62,35.38,-97.58 in NCEI's order) returned USW00013967 when
searched over 1991–2020. A one-day query returned 24 MM-DDTHH:MM:SS labels,
00:00 through 23:00, in local standard time. Substituting 2024 for 2020 in
the request returned identical bytes. February 28–March 1 returned 48 rows,
omitting February 29 as the
hourly documentation
specifies.
curl --get 'https://www.ncei.noaa.gov/access/services/data/v1' \
--data-urlencode 'dataset=normals-hourly-1991-2020' \
--data-urlencode 'stations=USW00013967' \
--data-urlencode 'startDate=2020-05-06' --data-urlencode 'endDate=2020-05-06' \
--data-urlencode 'dataTypes=HLY-TEMP-NORMAL' --data-urlencode 'units=metric' \
--data-urlencode 'format=csv' --data-urlencode 'includeStationLocation=1'
Repeating with units=standard confirmed all 24 Fahrenheit-to-Celsius
conversions within rounding precision. At midnight the pair was 61.0 F and
16.1 C; the day's range was 14.2–23.4 C. This probe does not establish
conversion correctness for any other hourly variable. The unchanged metric
response is tests/fixtures/hourly-normals.csv.
LCD's 72353013967 query for May 6, 2024, restricted to
HourlyDryBulbTemperature, returned 60 reports, including 24 routine FM-15
reports at :52. This is why the hourly comparison uses a stated ten-minute
nearest-normal tolerance, requests the next midnight as well, and reports
invalid values and unmatched observations.
Original period probes (2026-09-11)
Direct probes on 2026-09-11 against the Access Data Service: the search
datasets endpoint lists monthly, daily, annual/seasonal, and hourly normals
for 1991-2020, 2006-2020, and 1981-2010. Monthly and annual/seasonal requests
succeed without dates; daily requests return HTTP 400 without startDate and
endDate. The year in those dates is ignored: 2020-02-27 to 2020-03-01
returned 02-27 through 03-01 including 02-29, and a window from
2010-12-30 to 2011-01-02 returned only the header. The default is
standard units with leading spaces. units=metric converts MLY-TMAX-NORMAL,
MLY-TMIN-NORMAL, MLY-PRCP-NORMAL, DLY-TAVG-NORMAL, and ANN-TAVG-NORMAL,
but a 2026-09-11 probe of USW00013967 and USW00014739 found two data types
it handles wrongly, so the conversion cannot be assumed for an unprobed code.
MLY-TAVG-NORMAL is not converted: it returned the same space-padded
Fahrenheit value under both units=metric and units=standard (38.2 for
USW00013967 January). Derived temperature quantities are converted as if they
were absolute temperatures, applying the full (F - 32) x 5/9 offset to a
difference: USW00013967 January returned MLY-DUTR-NORMAL -5.3,
MLY-TAVG-STDDEV -16.2, and MLY-TMAX-STDDEV -15.8 under units=metric
against 22.4, 2.8, and 3.6 under units=standard, and USW00014739 returned
MLY-DUTR-NORMAL -10.2 and MLY-TAVG-STDDEV -15.5 against 13.7 and 4.1. The
true January diurnal range at USW00013967 is 22.4 F = 12.4 C, matching the
metric MLY-TMAX-NORMAL 9.6 minus MLY-TMIN-NORMAL -2.8. An unknown
dataTypes code returned an empty column rather than an error. Station search with
dataset=normals-monthly-1991-2020 found USW00013967 with or without dates.
curl --get 'https://www.ncei.noaa.gov/access/services/data/v1' \
--data-urlencode 'dataset=normals-monthly-1991-2020' \
--data-urlencode 'stations=USW00013967' \
--data-urlencode 'startDate=2020-01-01' --data-urlencode 'endDate=2020-12-31' \
--data-urlencode 'dataTypes=MLY-TMAX-NORMAL,MLY-TMIN-NORMAL,MLY-PRCP-NORMAL' \
--data-urlencode 'units=metric' --data-urlencode 'format=csv' \
--data-urlencode 'includeStationLocation=1'
The climate normals example provides a small manifest and local CSV analysis. Live checks exercise discovery, a daily window that spans February 29, and checksum-verified restoration.
CoastWatch SST
A minimal direct probe, also covered by the live integration test:
curl --fail --globoff -A 'usdata (+https://github.com/jakeryderv/usdata)' \
'https://coastwatch.noaa.gov/erddap/griddap/noaacwBLENDEDsstDNDaily.csv?analysed_sst[(2024-05-06T12:00:00Z)][(30.025):(30.075)][(-80.075):(-80.025)]'
CO-OPS observed water levels
Hosted probes on 2026-09-09 verified three records for station 8518750 over the
2024-05-06T00:00Z–00:12Z interval, changed values for English units and MSL datum, and HTTP 400 for
invalid stations/datums. Missing historical data or intervals between observations
returned HTTP 200 with the normal CSV header followed by an error message.
The adapter validates the CSV in a temporary file before replacing the destination.
Malformed, empty, and semantic-error responses raise httpx.DecodingError
(CLI exit 4); HTTP failures retain their status. allow_empty does not suppress
these fetch errors. Source revisions may invalidate exact locked restoration.
CO-OPS tide predictions
Hosted probes on 2026-09-12 verified the predictions product for station
8727520 (Cedar Key) over 2024-09-25T00:00Z–2024-09-28T00:00Z: 721 six-minute
rows with a Date Time, Prediction header, 26 hourly rows for interval=h,
and a Date Time, Prediction, Type header with H/L rows for
interval=hilo. A year of six-minute predictions returned 87,601 rows, matching
NOAA's documented one-year limit for prediction intervals other than high/low.
An invalid station returned HTTP 400 with a plain-text message and no CSV
header. Observed and predicted six-minute rows for the same request bounds
carried identical timestamps, so the two series subtract without alignment.
NEXRAD Level III products
Probes on 2026-09-14 listed the anonymous unidata-nexrad-level3 bucket with
ListObjectsV2. Keys are flat, SITE_PRODUCT_YYYY_MM_DD_HH_MM_SS, with the
three-character site prefix dropping the ICAO id's first letter. The earliest
key in the whole bucket is ABC_DAA_2020_03_30_00_02_41, and every KTLX product
probed begins on 2020-03-30 or the day after, so the archive start is a fixed
date rather than a rolling window. KTLX carried 100 distinct product codes.
Super-resolution reflectivity and velocity (N0B, N0G, and their 1, 2,
3, A, B tilt variants) begin 2022-02-18; the 256-level N0Q and N0U
end 2022-09-08; the NTV tornado vortex signature ends 2022-05-24, while
NMD mesocyclone detection and NST storm tracking continue to the probe
date. One clear-air day of KTLX N0B listed 127 objects with a 243 kB median;
NMD listed 323 objects at 150 bytes each (empty detections); EET listed 126
at 1.5 kB and NST 323 at 10 kB. On 2024-05-06 KTLX N0B listed 388 objects
across the whole day, but NMD and NST listed 47 each, all after 20:42 UTC,
so the feed capture has gaps that the continuous products do not show. A
delimiter listing on _ enumerates products and years cheaply; the adapter
lists one SITE_PRODUCT_YYYY_MM_DD_ prefix per day instead, which stays under
one page.
Local Climatological Data
Hosted probes on 2026-09-12 verified the Access Data Service dataset
local-climatological-data. The search service accepted a bbox and returned
eleven-digit station ids such as 72353013967 with per-year file names. One
day at that station returned 61 rows of 125 columns: 24 FM-15 hourly, 27
FM-16 special, 8 FM-12 synoptic, and 1 SOD daily-summary report, each
DATE in local standard time without an offset. dataTypes narrowed the
columns to the named fields plus station, date, report type, and source.
units=metric returned Celsius temperatures. The ids 13967 and
USW00013967 returned HTTP 200 with a header and no rows.
NGS emergency response imagery
Probes on 2026-09-29 UTC against the anonymous noaa-eri-pds bucket in
us-east-1, named on the NODD registry page.
The top level lists 52 event folders and three objects: an S3 browser page
(index.html) and two Parquet files, noaa_eri_pds.parquet (15 MB, a listing)
and noaa_eri_stac.parquet (16 MB, STAC items), both modified 2026-09-16. The
adapter reads neither: they need a Parquet reader, and the listing is current
without them.
curl --get 'https://noaa-eri-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' --data-urlencode 'delimiter=/'
curl --get 'https://noaa-eri-pds.s3.amazonaws.com/' \
--data-urlencode 'list-type=2' --data-urlencode 'delimiter=/' \
--data-urlencode 'prefix=2020_Nashville_Tornado/20200307a_RGB/'
curl --range 0-65535 --output /tmp/eri-head.tif \
'https://noaa-eri-pds.s3.amazonaws.com/2020_Nashville_Tornado/20200307a_RGB/20200307aC0852700w360900n.tif'
A full listing of every event prefix found 834,087 objects and about 39 TB:
268,231 GeoTIFFs (20.6 TB), 279,879 raw camera JPEGs with as many .geom
sidecars (10.2 TB, under <flight>/raw/ since 2020), 511 tar archives
(8.2 TB, under <event>/downloads/, the largest 126 GB), and per-flight VRT,
tile-index shapefile, SQLite, MRF, FlatGeobuf, checksum, and README files. One
Helene flight's README says its VRT and shapefile listed eight tiles the flight
does not hold. Events range from 61 GeoTIFFs (Joplin, 2.1 GB) to 39,432
(2023 pre-event surveys); the largest is Helene at 2.7 TB of GeoTIFFs.
Of the 268,229 GeoTIFFs outside raw/ and downloads/, 244,642 are named by
a degrees-minutes-seconds corner, 1,609 by a UTM corner (Joplin and Irene,
whose folders name zones 15 and 18, and the 2009 Nor'easter, whose folders name
none), 41 are flight mosaics named after their folder, and the rest name no
position: numbered frames of Wilma, Ernesto, Humberto, Gustav, and Ike;
obliques of Arthur, Matthew, and the Louisiana floods; Sally's near-infrared
frames; Nicole's ortho-cogs; and one Midwest-flood flight named by row and
column (mwflood-28-98.tif).
GeoTIFF headers, read with 64 KiB range requests, showed:
- The name is the tile's north-west corner. Degree tiles extend 0.0001° past it
on every side:
20200307aC0852700w360900n.tifspans 85.4501°W to 85.4249°W and 36.1249°N to 36.1501°N, 18,681 pixels square in WGS 84. Tiles are 0.0252° (90") square through 2020 and 0.0127° (45") from 2021. Some names truncate a second:20240927aC0853044w295830n.tifstarts at 85.5126°W, which is 85°30'45" plus the buffer. - UTM tiles are 2,504 to 2,600.15 m square with offsets from the name of 1.75
to 50 m, varying within a folder (Joplin's 26 May flight is offset 25.6 m in
easting and 49.9 m in northing). They have no GeoKey directory, so the file
states no coordinate system;
may24JPEGtiles_UTMZone15is the only record of the zone. - Three tiles from each of the 319 folders with corner names, and a containment check of three more in each of the 315 that can be placed, found one tile size per folder, every header within 1" plus 0.0001° (or 50 m) of its name, and every tile inside the footprint the adapter computes.
- Compression is JPEG in every folder sampled through 2020 (three bands, four
with a transparency band in 2017 to 2019), LZW in post-event folders from 2021,
and Deflate in the pre-event surveys, all four bands. Helene tiles register
their tiepoint to pixel centres (
RasterPixelIsPoint). - The 41 flight mosaics are 5 to 2,034 MB: 36 in WGS 84 at 0.00005° and five in Web Mercator (EPSG:3857) at 2.39 m; the two Web Mercator mosaics checked are BigTIFF.
Flight folder dates are local dates. The raw frames of the Texas flood flight
20250710a are all stamped 00:00 to 01:59 UTC on 11 July, and those of
20250711b and 20250712b run past midnight UTC into the next day; no frame
was stamped earlier than its folder's date.
Metadata pages probed the same day: the NODD registry entry and its
noaa-eri.yaml
("UpdateFrequency: Manually when needed"; "GeoTIFF & COG Imagery (COG Format
available for recent events)"), the NGS emergency response
page, storms.ngs.noaa.gov
and its per-event pages (ground sample distance 35 cm for Katrina and Joplin,
~15 cm for Nashville, 15 - 30 cm for Helene), and the Nashville
InPort record (acquired
2020-03-07 from 2,500 to 5,000 feet with a Trimble Digital Sensor System;
horizontal accuracy not assessed, 3 to 5 m expected in flat terrain).