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. - 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.
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 | storm-events |
| 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, 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 |
GOES ABI CONUS imagery
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.
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.
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.
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.