No API key Public-domain data CORS enabled
Base URL is this site's origin. All endpoints are GET and return JSON with permissive CORS. A metered plan is planned; today it is free and keyless.
GET /typical-weather
Returns the normal weather for a US location and month (or the whole year).
Query parameters
| Param | Notes |
|---|---|
zip | 5-digit US ZIP. Use this or address. |
address | Street address or City, ST. Geocoded via the US Census (keyless); falls back to a city index. |
month | Optional. Month name (January), abbreviation (Jan), or number 1–12. Omit for the whole-year table. |
date | Optional. YYYY-MM-DD or MM-DD; resolved to that date's month (monthly resolution). Takes precedence over month. |
Example — one month by city
curl "https://SITE/typical-weather?address=Denver,%20CO&month=January"
{
"query": { "zip": "80202", "month": 1, "monthName": "January", "address": "Denver, CO" },
"location": { "zip": "80202", "lat": 39.7491, "lon": -104.9899 },
"station": { "name": "DENVER WATER DEPT, CO US", "distanceMi": 1.6, "elevationFt": 5210 },
"confidence": "high",
"confidenceNote": "Nearest normals station is 2 mi away — high confidence.",
"normals": {
"month": 1, "monthName": "January",
"avgHighF": 48.5, "avgLowF": 21.3, "avgMeanF": 34.9,
"avgPrecipIn": 0.43, "avgSnowIn": 5.5
},
"summary": "January in Denver, CO is typically chilly — highs around 49°F and lows near 21°F. Expect about 0.4 in of precipitation across the month, including roughly 5.5 in of snow.",
"source": "NOAA/NCEI 1991–2020 U.S. Climate Normals (monthly)",
"normalsPeriod": "1991–2020",
"disclaimer": "Normals are 30-year averages (1991–2020). Any individual year can differ..."
}
Example — whole year (best time to visit)
curl "https://SITE/typical-weather?zip=33139"
Returns months (an array of 12 monthly normals) and yearSummary with warmestMonth, coolestMonth, wettestMonth, and driestMonth.
Response fields
| Field | Meaning |
|---|---|
normals.avgHighF / avgLowF / avgMeanF | Normal daily max / min / mean temperature (°F) for the month. |
normals.avgPrecipIn | Normal total monthly precipitation (inches). null if the nearest station has no precip normal. |
normals.avgSnowIn | Normal total monthly snowfall (inches), or null. |
station + confidence | Nearest NOAA normals station, distance in miles, and an honest confidence tier (high <12 mi, medium <30, low <60, very-low ≥60). |
Status codes
200 | OK. |
400 | Missing zip/address, or an unparseable month/date. |
404 | Address could not be geocoded to a US ZIP. |
422 | ZIP is not in the US climate-normals dataset (non-US / PO-box-only / invalid). Never a silent wrong value. |
GET /health
Service metadata + dataset coverage (ZIP and station counts). Also at /api.
Data & license
NOAA/NCEI 1991–2020 U.S. Climate Normals (monthly) + U.S. Census ZCTA centroids — both public domain (U.S. Government works). Normals are 30-year averages, not forecasts.
Machine-readable spec
The full API is described in OpenAPI 3.1 — import it into Postman, Insomnia, or a client generator, or hand it to an agent. The response schemas in it were generated from real responses this API actually returned, not written by hand, so they describe what you will receive rather than what someone intended you to receive.
https://typical-weather-api.netlify.app/openapi.json