Skip to content

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.s3 using plain HTTPS, no AWS SDK (ADR 0002). The NEXRAD Level II archive moved from noaa-nexrad-level2 to unidata-nexrad-level2 with 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 responses count is the number of matches and totalCount is dataset-wide; paginate on count. Enable Python DEBUG logging for usdata.providers.noaa.ghcnd to 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 startDate and endDate; the daily normals dataset expects them inside a placeholder year such as 2010. LCD stations use WBAN-based ids (for example 72530094846), 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, keys PRODUCT/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), and unidata-nexrad-level3 (flat keys SITE_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 direct mgg/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 discover command.

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.