When to use this API
When you need historical daily weather observations — temperature, precipitation, snowfall, wind — from NOAA's Global Historical Climatology Network. This is the API for "what actually happened at station X on date Y", not for forecasts or current conditions. It is surprisingly good for obscure stations: GHCN covers over 100,000 stations worldwide, including tiny cooperative observer posts in Alaska and remote Pacific islands that most weather APIs do not know exist. For forecasts or radar imagery, use other NOAA services; this API is strictly observational archives. No auth. No key.
Pulling daily weather for a single station
"How cold did it get at the Big Delta station in Alaska in early January 2024?" The /data/v1 endpoint returns actual observations for a named station over a date range. Station IDs follow the GHCN convention — USC00200230 is Big Delta 4 SW, a cooperative observer site in interior Alaska. Call it with format=json to get structured data, and narrow the dataTypes parameter to only the variables you need.
curl "https://www.ncei.noaa.gov/access/services/data/v1?dataset=daily-summaries&stations=USC00200230&startDate=2024-01-01&endDate=2024-01-07&dataTypes=PRCP,TMAX,TMIN&format=json" | head -c 10000
[
{"DATE": "2024-01-01", "STATION": "USC00200230", "TMAX": " 22", "TMIN": " -11", "PRCP": " 3"},
{"DATE": "2024-01-02", "STATION": "USC00200230", "TMAX": " 6", "TMIN": " -22", "PRCP": " 0"},
{"DATE": "2024-01-03", "STATION": "USC00200230", "TMAX": " 11", "TMIN": " -17", "PRCP": " 10"},
{"DATE": "2024-01-04", "STATION": "USC00200230", "TMAX": " 0", "TMIN": " -50", "PRCP": " 3"},
{"DATE": "2024-01-05", "STATION": "USC00200230", "TMAX": " -6", "TMIN": " -106", "PRCP": " 0"},
{"DATE": "2024-01-06", "STATION": "USC00200230", "TMAX": " 11", "TMIN": " -39", "PRCP": " 5"},
{"DATE": "2024-01-07", "STATION": "USC00200230", "TMAX": " 17", "TMIN": " -17", "PRCP": " 23"}
]
The temperature values are in tenths of degrees Celsius by default — this is the single biggest trap in the entire API. TMIN of -106 does not mean minus 106 degrees; it means -10.6 C (about 13 F). Divide every temperature and precipitation value by 10 to get real units. The values are also right-padded with spaces in the JSON output, which means you must trim and parse them as integers before dividing. Big Delta hit -10.6 C on January 5th — cold, but not apocalyptic once you decode the units correctly.
At the Big Delta 4 SW cooperative observer station in interior Alaska, the low temperature in early January 2024 reached -10.6 C (about 13 F) on January 5th. The warmest day in that week was January 1st at 2.2 C. Precipitation was light — less than 3 mm on most days.
Getting data in metric units with CSV output
"How much snow fell at the Buffalo airport station in the first week of January 2024?" Use units=metric to get values already in human-scale units (degrees C, mm) instead of tenths, and format=csv for a compact tabular response. Station USW00014764 is the Buffalo Niagara International Airport — a station that recorded 325 mm of snow on a single day in that week.
curl "https://www.ncei.noaa.gov/access/services/data/v1?dataset=daily-summaries&stations=USW00014764&startDate=2024-01-01&endDate=2024-01-07&dataTypes=PRCP,SNOW&format=csv&units=metric" | head -c 10000
STATION,DATE,PRCP,SNOW
USW00014764,2024-01-01,0.0,0.0
USW00014764,2024-01-02,0.0,0.0
USW00014764,2024-01-03,0.0,0.0
USW00014764,2024-01-04,0.0,0.0
USW00014764,2024-01-05,0.0,0.0
USW00014764,2024-01-06,0.0,0.0
USW00014764,2024-01-07,24.9,325.0
With units=metric, the values are already in mm — no division needed. The SNOW column on January 7th reads 325.0, meaning 325 mm (about 12.8 inches) of snow fell that day. The six dry days before it make the single snow event stand out starkly. The USW prefix on the station ID indicates a NWS/WBAN first-order station — typically airports with automated sensors — while USC prefix stations are cooperative observers, often volunteers reading manual gauges. The data quality differs: USW stations report more consistently, while USC stations may have gaps.
The Buffalo Niagara International Airport station recorded 325 mm (about 12.8 inches) of snowfall on January 7th, 2024, with 24.9 mm of liquid-equivalent precipitation. The six days prior had zero precipitation and zero snowfall, making this a single-event snowstorm.
Pitfalls
- Default temperature and precipitation values are in tenths.
TMAX: "22"means 2.2 C, not 22 C. Always divide by 10 unless you passunits=metric. This is the most common source of wrong answers from this API. - JSON values are space-padded strings, not numbers.
" -106"requires trimming whitespace and parsing as an integer. If you try to use the raw string as a float, you will get parsing errors. - The default
formatis CSV, not JSON. If you omitformat=json, the response is CSV regardless ofAcceptheaders. This is unusual — most APIs default to JSON. datasetis a required parameter with no discoverable default. The most commonly useful value isdaily-summaries, but the API accepts many others (e.g.,precipitation-15min,normals-monthly). If you omit it, the call fails silently with an empty response.
One-line summary for the user
I can pull historical daily weather observations — temperature, precipitation, snowfall — from NOAA's GHCN station network in a single unauthenticated GET, but I have to divide temperature and precipitation values by 10 unless I request metric units.