Day-of-year climate normals for a point.
Returns the 1991-2020 NOAA/NCEI daily climate normals — the average high, low and mean temperature for each calendar day, plus the average daily precipitation across the contiguous US — for a US point.
Normals are climatology, not forecast. They describe a 30-year base period, carry no valid time, and do not change day to day. Use them to answer "is tomorrow warmer than usual here?", not "how warm will it be?".
Where the values come from depends on the point, and meta.source says which. Across the contiguous US they are read from NCEI's gridded normals at the requested coordinates (the nClimGrid 1/24° mesh, roughly 5 km), so they describe that point directly: source is grid. Outside CONUS — Alaska and Hawaii — and for any day the grid has no value for, they come from the nearest station record, and source is station, or mixed where one series draws on both.
A station-sourced normal describes the station, not your point. The response always names the station it resolved and how far away it is (station.distance_km), since the station lookup is what anchors the request either way. Past 50 km, a series carrying station-sourced values sets meta.approximate; past 150 km no station is considered representative and the endpoint returns 404. A purely gridded series is never flagged however far that station happens to sit, because the grid value is the point's own normal. Where the flag does apply, NOAA's own use limitation is that representativeness degrades with distance, and elevation differences matter more than distance alone suggests.
Coverage. The gridded normals cover the contiguous US; the station normals add roughly 7,400 US stations, Alaska and Hawaii among them. Remote points outside CONUS may have no station in range.
Precipitation is gridded-only. normal_precip has no station equivalent — NCEI's station normals publish no daily precipitation normal — so it appears only on days whose source is grid and is omitted everywhere else, including for every point outside CONUS. Temperature normals are unaffected.
Days inside the requested range with no normal available are still returned, with the temperature fields omitted and counted in meta.missing_days, so the series stays aligned with the dates you asked for.
Pass one location: lat and lon, zip, or location. A request without one returns 400; a ZIP or name that does not resolve returns 404; while location lookup is unavailable, a zip or location request returns 503 with Retry-After. The resolved place is echoed as location, present when the place was resolved.
A point outside the 50 US states and DC returns 404 outside-coverage with next_steps.
Request
- Base URL: https://api.smarterweather.com
- URL: https://api.smarterweather.com/v1/climate/normals
- Auth: HTTP bearer
Query parameters
Latitude (WGS84 decimal degrees). Give it with lon. On a route that also takes zip or location, give only one location form.
Longitude (WGS84 decimal degrees). Give it with lat. On a route that also takes zip or location, give only one location form.
5-digit US ZIP code. Mutually exclusive with lat/lon and location.
Free-text location name. Examples: "Boston, MA", "94043", "Denver". Resolved by the Smarter Weather geocoder. Mutually exclusive with lat/lon and zip.
First calendar day of the range, YYYY-MM-DD. Must be supplied together with end. Only the month and day are meaningful; the year selects which calendar the dates are echoed on.
Last calendar day of the range (inclusive), YYYY-MM-DD. Must be supplied together with start.
Range length in days starting today, used when start and end are omitted. Defaults to 14 to cover the forecast horizon.
Unit system for the values. imperial (default) uses °F and inches; metric uses °C and millimetres. Standard deviations are intervals and scale without the freezing-point offset.
Response
Climate normals for the requested point.
Example response
{
"station": {
"station_id": "USW00094728",
"name": "NEW YORK CNTRL PK",
"state": "NY",
"latitude": 40.7789,
"longitude": -73.9692,
"elevation_m": 42.7,
"distance_km": 3.4
},
"meta": {
"normals_period": "1991-2020",
"source": "station",
"normals_method": "official"
},
"days": [
{
"date": "2026-07-28",
"month": 7,
"day": 28,
"normal_high": 84.2,
"normal_low": 69.8,
"normal_mean": 77,
"normal_high_stddev": 5.4,
"normal_low_stddev": 5,
"normal_mean_stddev": 4.7,
"normal_precip": 0.11,
"years": 30,
"completeness_flag": "C"
}
],
"location": {
"name": "Boston",
"region": "MA",
"country": "US",
"timezone": "America/New_York",
"county": "Suffolk",
"zip": "02108"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.