When to use this skill
When the user asks what the temperature, precipitation, or snowfall was at a specific weather station on a specific date — "How cold did it get in Fairbanks last January?" or "Did it snow in Buffalo the first week of 2024?" — reach for the NCEI Data Access API. It serves historical daily observations from NOAA's Global Historical Climatology Network, covering over 100,000 stations worldwide including obscure cooperative observer posts that most weather APIs ignore. This is observational archives, not forecasts or current conditions. For climate normals or sub-daily precipitation, the same API accepts other dataset values but this skill focuses on daily-summaries.
Your best first call
curl "https://www.ncei.noaa.gov/access/services/data/v1?dataset=daily-summaries&stations=USC00200230&startDate=2024-01-01&endDate=2024-01-07&dataTypes=TMAX,TMIN,PRCP&format=json"
No auth. No key. Always include dataset=daily-summaries (required — the API returns empty silence without it), stations (a GHCN station ID), a date range, and format=json (the default is CSV). Narrow dataTypes to only the variables you need: TMAX, TMIN for temperature, PRCP for precipitation, SNOW for snowfall.
The key fields an agent uses:
DATE — observation date
STATION — GHCN station ID matching the request
TMAX, TMIN — daily high and low temperature (tenths of degrees Celsius by default)
PRCP — precipitation (tenths of millimeters by default)
SNOW — snowfall in millimeters (only present when requested)
Station IDs carry meaning: USW prefix marks NWS/WBAN first-order stations (airports, automated sensors, consistent reporting), while USC marks cooperative observers (volunteers, manual gauges, possible data gaps).
Fallbacks (when the best call isn't enough)
- 15-minute precipitation → change
dataset from daily-summaries to precipitation-15min. Same endpoint, finer time resolution for hydrology questions.
- Climate normals (30-year averages) → change
dataset to normals-monthly or normals-daily. Use when the user asks "what's typical for this time of year" rather than "what happened on this date".
Pitfalls
- Default values are in tenths.
TMIN of -106 means -10.6 C, not -106 C. PRCP of 23 means 2.3 mm. Pass units=metric to get human-scale values, or divide by 10 — there is no third option.
- JSON values are space-padded strings, not numbers.
" -106" requires trimming whitespace and parsing as an integer before dividing. Using the raw string as a float will throw a parsing error.
- The default format is CSV, not JSON. Omit
format=json and you get CSV regardless of Accept headers. This is unusual — most APIs default to JSON.
dataset is required with no default. The API returns an empty response with no error message when omitted. The silence is misleading; always pass dataset=daily-summaries.
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 default values are in tenths of degrees and millimeters unless you pass units=metric.
SKILL.md source (frontmatter + body)
---
name: access-at
description: When the user asks what the temperature, precipitation, or snowfall was at a weather station on a specific date — historical daily observations from NOAA's GHCN network — reach for the NCEI Data Access API. Unauthenticated GET, but values default to tenths of degrees and millimeters.
---
## When to use this skill
When the user asks what the temperature, precipitation, or snowfall was at a specific weather station on a specific date — "How cold did it get in Fairbanks last January?" or "Did it snow in Buffalo the first week of 2024?" — reach for the NCEI Data Access API. It serves historical daily observations from NOAA's Global Historical Climatology Network, covering over 100,000 stations worldwide including obscure cooperative observer posts that most weather APIs ignore. This is observational archives, not forecasts or current conditions. For climate normals or sub-daily precipitation, the same API accepts other `dataset` values but this skill focuses on `daily-summaries`.
## Your best first call
```bash
curl "https://www.ncei.noaa.gov/access/services/data/v1?dataset=daily-summaries&stations=USC00200230&startDate=2024-01-01&endDate=2024-01-07&dataTypes=TMAX,TMIN,PRCP&format=json"
```
No auth. No key. Always include `dataset=daily-summaries` (required — the API returns empty silence without it), `stations` (a GHCN station ID), a date range, and `format=json` (the default is CSV). Narrow `dataTypes` to only the variables you need: `TMAX`, `TMIN` for temperature, `PRCP` for precipitation, `SNOW` for snowfall.
The key fields an agent uses:
- `DATE` — observation date
- `STATION` — GHCN station ID matching the request
- `TMAX`, `TMIN` — daily high and low temperature (tenths of degrees Celsius by default)
- `PRCP` — precipitation (tenths of millimeters by default)
- `SNOW` — snowfall in millimeters (only present when requested)
Station IDs carry meaning: `USW` prefix marks NWS/WBAN first-order stations (airports, automated sensors, consistent reporting), while `USC` marks cooperative observers (volunteers, manual gauges, possible data gaps).
## Fallbacks (when the best call isn't enough)
- **15-minute precipitation** → change `dataset` from `daily-summaries` to `precipitation-15min`. Same endpoint, finer time resolution for hydrology questions.
- **Climate normals (30-year averages)** → change `dataset` to `normals-monthly` or `normals-daily`. Use when the user asks "what's typical for this time of year" rather than "what happened on this date".
## Pitfalls
- **Default values are in tenths.** `TMIN` of `-106` means -10.6 C, not -106 C. `PRCP` of `23` means 2.3 mm. Pass `units=metric` to get human-scale values, or divide by 10 — there is no third option.
- **JSON values are space-padded strings, not numbers.** `" -106"` requires trimming whitespace and parsing as an integer before dividing. Using the raw string as a float will throw a parsing error.
- **The default format is CSV, not JSON.** Omit `format=json` and you get CSV regardless of `Accept` headers. This is unusual — most APIs default to JSON.
- **`dataset` is required with no default.** The API returns an empty response with no error message when omitted. The silence is misleading; always pass `dataset=daily-summaries`.
## 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 default values are in tenths of degrees and millimeters unless you pass units=metric.