Climate Normals API
DataMAINTAINED1 token / call

Climate Normals API

NOAA 1991-2020 climate normals for 15,616 US stations: typical highs, lows, rain, snow and degree days by month

What the weather is NORMALLY like, anywhere in the US: NOAA''s official 30-year climate normals (1991-2020) for 15,616 weather stations, 187,392 monthly records. For any coordinate, the climate endpoint finds the nearest station with full temperature normals and returns the month-by-month story β€” average highs and lows, diurnal range, precipitation and rainy days, snowfall, freeze days, 90-degree days, heating and cooling degree days. Drop a pin on Manhattan and get Central Park (8 km away): 39.5F January highs, 84.9F July, 29.8 inches of annual snow. Ask Phoenix in July: 106.5F average highs and 30.8 days over 90. Rankings answer the fun and the practical alike β€” the snowiest place in America is Crater Lake at 463 inches a year, the driest is Death Valley at 2. Every station also carries annual aggregates: average temperature, total precipitation and snowfall, degree days, hottest/coldest/wettest month. Built for travel planning, real estate, HVAC and solar sizing, agriculture, insurance and any product that answers what is it like there? Public-domain NOAA data, self-hosted β€” no third-party calls at request time.

Every call needs an X-Api-Key header. A free key includes 500 tokens a month, no card required. 1 token per call, so the free plan covers about 500 calls a month.

No credit card requiredAccess to 125+ APIsCancel anytime
response.json
{
  "ok": true,
  "query": {
    "lat": 40.7128,
    "lon": -74.006
  },
  "distance_km": 8.1,
  "station": {
    "id": "USW00094728",
    "name": "NEW YORK CNTRL PK TWR",
    "state": "NY",
    "latitude": 40.78,
    "longitude": -73.97,
    "elevation_m": 39.6,
    "annual": {
      "avg_temp_f": 55.8,
      "avg_high_f": 62.6,
      "avg_low_f": 48.9,
      "precipitation_in": 49.5,
      "snowfall_in": 29.8,
      "heating_degree_days": 4553.4,
      "cooling_degree_days": 1221.5,
      "hottest_month": 7,
      "coldest_month": 1,
      "wettest_month": 7
    }
  },
  "monthly": [
    {
      "month": 1,
      "avg_temp_f": 33.7,
      "avg_high_f": 39.5,
      "avg_low_f": 27.9,
      "diurnal_range_f": 11.5,
      "precipitation_in": 3.64,
      "precip_days": 10.8,
      "rainy_days": 2.5,
      "snowfall_in": 8.8,
      "freeze_days": 20.5,
      "hot_days": 0,
      "ice_days": 7.4,
      "heating_degree_days": 970.1,
      "cooling_degree_days": 0
    }
  ]
}
Production Ready
Battle-tested infrastructure with a 99.9% uptime SLA. Rate limits are generous, responses are consistent.
Simple Integration
Standard REST + JSON. Works with any HTTP client. Copy-ready code snippets in 4 languages.
One Key, 125+ APIs
Your DataAndAPIs subscription unlocks every API on the platform β€” anime, finance, sports, and more.

Use cases for Climate Normals API

  • Show what the weather is usually like in a month for a destination, event date or relocation guide.

  • Estimate heating and cooling needs for a building from degree days at the nearest station.

  • Compare cities by rainy days, snowfall or 90-degree days for travel and real-estate content.

  • Give forecasts context by showing the normal alongside the current reading.

Climate Normals API endpoints

Every endpoint with its parameters and a real example response.

GETClimate At Coordinates

https://api-climate-normals.dataandapis.com/v1/climate

Query parameters

ParameterExample
lat40.7128Required
lon-74.0060Required
month1Optional

Example request

curl "https://api-climate-normals.dataandapis.com/v1/climate?lat=40.7128&lon=-74.0060&month=1" \
  -H "X-Api-Key: YOUR_API_KEY"
Example response
{
  "ok": true,
  "query": {
    "lat": 40.7128,
    "lon": -74.006
  },
  "distance_km": 8.1,
  "station": {
    "id": "USW00094728",
    "name": "NEW YORK CNTRL PK TWR",
    "state": "NY",
    "latitude": 40.78,
    "longitude": -73.97,
    "elevation_m": 39.6,
    "annual": {
      "avg_temp_f": 55.8,
      "avg_high_f": 62.6,
      "avg_low_f": 48.9,
      "precipitation_in": 49.5,
      "snowfall_in": 29.8,
      "heating_degree_days": 4553.4,
      "cooling_degree_days": 1221.5,
      "hottest_month": 7,
      "coldest_month": 1,
      "wettest_month": 7
    }
  },
  "monthly": [
…
Show full response
{
  "ok": true,
  "query": {
    "lat": 40.7128,
    "lon": -74.006
  },
  "distance_km": 8.1,
  "station": {
    "id": "USW00094728",
    "name": "NEW YORK CNTRL PK TWR",
    "state": "NY",
    "latitude": 40.78,
    "longitude": -73.97,
    "elevation_m": 39.6,
    "annual": {
      "avg_temp_f": 55.8,
      "avg_high_f": 62.6,
      "avg_low_f": 48.9,
      "precipitation_in": 49.5,
      "snowfall_in": 29.8,
      "heating_degree_days": 4553.4,
      "cooling_degree_days": 1221.5,
      "hottest_month": 7,
      "coldest_month": 1,
      "wettest_month": 7
    }
  },
  "monthly": [
    {
      "month": 1,
      "avg_temp_f": 33.7,
      "avg_high_f": 39.5,
      "avg_low_f": 27.9,
      "diurnal_range_f": 11.5,
      "precipitation_in": 3.64,
      "precip_days": 10.8,
      "rainy_days": 2.5,
      "snowfall_in": 8.8,
      "freeze_days": 20.5,
      "hot_days": 0,
      "ice_days": 7.4,
      "heating_degree_days": 970.1,
      "cooling_degree_days": 0
    }
  ]
}

GETClimate Rankings

https://api-climate-normals.dataandapis.com/v1/rankings

Query parameters

ParameterExample
limit25Optional
metricannual_snowOptional
orderdescOptional
stateCOOptional

Example request

curl "https://api-climate-normals.dataandapis.com/v1/rankings?limit=25&metric=annual_snow&order=desc&state=CO" \
  -H "X-Api-Key: YOUR_API_KEY"
Example response
{
  "ok": true,
  "metric": "annual_snow",
  "order": "desc",
  "count": 5,
  "results": [
    {
      "id": "US1COGN0018",
      "name": "CRESTED BUTTE 6.2 N",
      "state": "CO",
      "latitude": 38.96,
      "longitude": -106.99,
      "value": 389
    },
    {
      "id": "USC00051660",
      "name": "CLIMAX",
      "state": "CO",
      "latitude": 39.37,
      "longitude": -106.19,
      "value": 294.7
    },
    {
      "id": "USC00059175",
      "name": "WINTER PARK",
      "state": "CO",
      "latitude": 39.89,
      "longitude": -105.76,
…
Show full response
{
  "ok": true,
  "metric": "annual_snow",
  "order": "desc",
  "count": 5,
  "results": [
    {
      "id": "US1COGN0018",
      "name": "CRESTED BUTTE 6.2 N",
      "state": "CO",
      "latitude": 38.96,
      "longitude": -106.99,
      "value": 389
    },
    {
      "id": "USC00051660",
      "name": "CLIMAX",
      "state": "CO",
      "latitude": 39.37,
      "longitude": -106.19,
      "value": 294.7
    },
    {
      "id": "USC00059175",
      "name": "WINTER PARK",
      "state": "CO",
      "latitude": 39.89,
      "longitude": -105.76,
      "value": 214
    },
    {
      "id": "USC00051959",
      "name": "CRESTED BUTTE",
      "state": "CO",
      "latitude": 38.87,
      "longitude": -106.98,
      "value": 203
    },
    {
      "id": "USC00051681",
      "name": "COAL CREEK CANYON",
      "state": "CO",
      "latitude": 39.9,
      "longitude": -105.38,
      "value": 194.7
    }
  ]
}

GETData Sources

https://api-climate-normals.dataandapis.com/v1/sources

This endpoint takes no parameters.

Example request

curl "https://api-climate-normals.dataandapis.com/v1/sources" \
  -H "X-Api-Key: YOUR_API_KEY"
Example response
{
  "ok": true,
  "vintage": "NOAA US Climate Normals 1991-2020",
  "count": 1,
  "sources": [
    {
      "slug": "noaa-normals",
      "name": "US Climate Normals 1991-2020 (monthly)",
      "publisher": "NOAA National Centers for Environmental Information",
      "licence": "US Government work - public domain",
      "source_url": "https://www.ncei.noaa.gov/products/land-based-station/us-climate-normals",
      "file_url": "https://www.ncei.noaa.gov/data/normals-monthly/1991-2020/archive/us-climate-normals_1991-2020_v1.0.1_monthly_multivariate_by-station_c20230404.tar.gz",
      "cadence": "decadal (next ~2031)",
      "record_count": 15616,
      "retrieved_at": "2026-09-05"
    }
  ]
}

GETGet Station Normals

https://api-climate-normals.dataandapis.com/v1/stations/{id}

Path parameters

ParameterExample
idUSW00023174Required

Example request

curl "https://api-climate-normals.dataandapis.com/v1/stations/USW00023174" \
  -H "X-Api-Key: YOUR_API_KEY"
Example response
{
  "ok": true,
  "station": {
    "id": "USW00023174",
    "name": "LOS ANGELES INTL AP",
    "state": "CA",
    "latitude": 33.94,
    "longitude": -118.39,
    "elevation_m": 29.6,
    "annual": {
      "avg_temp_f": 63.6,
      "avg_high_f": 70.6,
      "avg_low_f": 56.6,
      "precipitation_in": 12.2,
      "snowfall_in": null,
      "heating_degree_days": 1213.6,
      "cooling_degree_days": 720.4,
      "hottest_month": 8,
      "coldest_month": 12,
      "wettest_month": 2
    },
    "monthly": [
      {
        "month": 1,
        "avg_temp_f": 57.9,
        "avg_high_f": 66.3,
        "avg_low_f": 49.4,
        "diurnal_range_f": 16.9,
…
Show full response
{
  "ok": true,
  "station": {
    "id": "USW00023174",
    "name": "LOS ANGELES INTL AP",
    "state": "CA",
    "latitude": 33.94,
    "longitude": -118.39,
    "elevation_m": 29.6,
    "annual": {
      "avg_temp_f": 63.6,
      "avg_high_f": 70.6,
      "avg_low_f": 56.6,
      "precipitation_in": 12.2,
      "snowfall_in": null,
      "heating_degree_days": 1213.6,
      "cooling_degree_days": 720.4,
      "hottest_month": 8,
      "coldest_month": 12,
      "wettest_month": 2
    },
    "monthly": [
      {
        "month": 1,
        "avg_temp_f": 57.9,
        "avg_high_f": 66.3,
        "avg_low_f": 49.4,
        "diurnal_range_f": 16.9,
        "precipitation_in": 2.86,
        "precip_days": 6.1,
        "rainy_days": 2.1,
        "snowfall_in": null,
        "freeze_days": 0,
        "hot_days": 0,
        "ice_days": 0,
        "heating_degree_days": 227.4,
        "cooling_degree_days": 5.8
      },
      {
        "month": 2,
        "avg_temp_f": 57.9,
        "avg_high_f": 65.6,
        "avg_low_f": 50.1,
        "diurnal_range_f": 15.4,
        "precipitation_in": 2.99,
        "precip_days": 6.3,
        "rainy_days": 2,
        "snowfall_in": null,
        "freeze_days": 0,
        "hot_days": 0,
        "ice_days": 0,
        "heating_degree_days": 207.3,
        "cooling_degree_days": 7.1
      },
      {
        "month": 3,
        "avg_temp_f": 59.1,
        "avg_high_f": 66.1,
        "avg_low_f": 52.2,
        "diurnal_range_f": 13.9,
        "precipitation_in": 1.73,
        "precip_days": 5.6,
        "rainy_days": 1.3,
        "snowfall_in": null,
        "freeze_days": 0,
        "hot_days": 0,
        "ice_days": 0,
        "heating_degree_days": 189.8,
        "cooling_degree_days": 8.5
      }
    ]
  }
}

GETSearch Stations

https://api-climate-normals.dataandapis.com/v1/stations

Query parameters

ParameterExample
limit20Optional
qDENVEROptional
stateCOOptional

Example request

curl "https://api-climate-normals.dataandapis.com/v1/stations?limit=20&q=DENVER&state=CO" \
  -H "X-Api-Key: YOUR_API_KEY"
Example response
{
  "ok": true,
  "count": 3,
  "results": [
    {
      "id": "USW00093067",
      "name": "DENVER CENTENNIAL AP",
      "state": "CO",
      "latitude": 39.57,
      "longitude": -104.85,
      "elevation_m": 1793.1,
      "annual": {
        "avg_temp_f": 50.2,
        "avg_high_f": 63.6,
        "avg_low_f": 36.7,
        "precipitation_in": 15,
        "snowfall_in": null,
        "heating_degree_days": 6013.8,
        "cooling_degree_days": 636.1,
        "hottest_month": 7,
        "coldest_month": 12,
        "wettest_month": 8
      }
    },
    {
      "id": "USW00003017",
      "name": "DENVER INTL AP",
      "state": "CO",
…
Show full response
{
  "ok": true,
  "count": 3,
  "results": [
    {
      "id": "USW00093067",
      "name": "DENVER CENTENNIAL AP",
      "state": "CO",
      "latitude": 39.57,
      "longitude": -104.85,
      "elevation_m": 1793.1,
      "annual": {
        "avg_temp_f": 50.2,
        "avg_high_f": 63.6,
        "avg_low_f": 36.7,
        "precipitation_in": 15,
        "snowfall_in": null,
        "heating_degree_days": 6013.8,
        "cooling_degree_days": 636.1,
        "hottest_month": 7,
        "coldest_month": 12,
        "wettest_month": 8
      }
    },
    {
      "id": "USW00003017",
      "name": "DENVER INTL AP",
      "state": "CO",
      "latitude": 39.83,
      "longitude": -104.66,
      "elevation_m": 1650.2,
      "annual": {
        "avg_temp_f": 51.2,
        "avg_high_f": 65.1,
        "avg_low_f": 37.2,
        "precipitation_in": 14.5,
        "snowfall_in": null,
        "heating_degree_days": 5862,
        "cooling_degree_days": 849.5,
        "hottest_month": 7,
        "coldest_month": 12,
        "wettest_month": 5
      }
    },
    {
      "id": "USC00052223",
      "name": "DENVER WATER DEPT",
      "state": "CO",
      "latitude": 39.73,
      "longitude": -105.01,
      "elevation_m": 1593.5,
      "annual": {
        "avg_temp_f": 53.3,
        "avg_high_f": 67.6,
        "avg_low_f": 39.1,
        "precipitation_in": 15.9,
        "snowfall_in": 40.7,
        "heating_degree_days": 5261.8,
        "cooling_degree_days": 1045.2,
        "hottest_month": 7,
        "coldest_month": 12,
        "wettest_month": 5
      }
    }
  ]
}

Where the data comes from

Source
NOAA NCEI US Climate Normals 1991-2020 (public domain).
Freshness
Static decade dataset; reloaded when NOAA publishes the next normals.

One install. Every endpoint.

No proprietary SDKs needed. Any HTTP client works. Pick your language and paste.

3languages
5endpoints
RESTarchitecture
1key for all APIs
  • Fully typed responses β€” auto-completion in your IDE
  • Tracks the API in lockstep β€” new endpoints land same day
  • One key works across 125+ APIs on the platform
import axios from 'axios';

const { data } = await axios.get(
  'https://api-climate-normals.dataandapis.com/v1/climate',
  { headers: { 'X-Api-Key': process.env.API_KEY } }
);

Climate Normals API Β· X-Api-Key

Explore the endpoints

Browse request parameters and inspect live example responses.

Available Endpoints

Request Parameters

API URL

Headers

X-Api-Key

Query Parameters

lat(Required)
lon(Required)
month(Optional)
import axios from 'axios';

const url = 'https://api-climate-normals.dataandapis.com/v1/climate';
const { data } = await axios.get(url, {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' }
});

One subscription. Every API.

Tokens unlock this API and 125+ others on DataAndAPIs. Switch APIs any time β€” we promote.

FREE

$0/mo

500 tokens / month

  • Access to all APIs
  • Tokens reset monthly
  • Community support
Start free
Most Popular

STARTER

$6.99/mo

25,000 tokens / month

  • Access to all APIs
  • Tokens reset monthly
  • Email support
Subscribe

PRO

$24.99/mo

100,000 tokens / month

  • Access to all APIs
  • Tokens reset monthly
  • Priority email support
Subscribe

ULTRA

$99.99/mo

1,000,000 tokens / month

  • Access to all APIs
  • Tokens reset monthly
  • Priority support
Subscribe

Need higher volume, dedicated infra, or a custom contract? Talk to sales β†’

Questions about Climate Normals API

Ship Climate Normals API this afternoon.

500 free tokens. No card. Plus 125+ other APIs on the same key.