{
  "openapi": "3.1.0",
  "info": {
    "title": "Climate Normals API",
    "version": "1.0.0",
    "description": "NOAA 1991-2020 climate normals for 15,616 US stations: typical highs, lows, rain, snow and degree days by month.\n\nWhat 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.",
    "contact": {
      "name": "Data and APIs",
      "url": "https://dataandapis.com/contact"
    },
    "termsOfService": "https://dataandapis.com/terms-of-service",
    "license": {
      "name": "Data and APIs Terms of Service",
      "url": "https://dataandapis.com/terms-of-service"
    },
    "x-logo": {
      "url": "https://dataandapis.com/images/climate-normals.webp"
    }
  },
  "externalDocs": {
    "description": "Documentation, live tester and pricing",
    "url": "https://dataandapis.com/apis/climate-normals"
  },
  "servers": [
    {
      "url": "https://api-climate-normals.dataandapis.com"
    }
  ],
  "tags": [
    {
      "name": "Data",
      "description": "Climate Normals API belongs to the Data category of the Data and APIs catalog."
    }
  ],
  "paths": {
    "/v1/climate": {
      "get": {
        "operationId": "climateAtCoordinates",
        "summary": "Climate At Coordinates",
        "description": "Climate At Coordinates endpoint of the Climate Normals API. Costs 1 token per call.",
        "externalDocs": {
          "url": "https://dataandapis.com/apis/climate-normals/climate-at-coordinates"
        },
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "40.7128"
          },
          {
            "name": "lon",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "-74.0060"
          },
          {
            "name": "month",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "1"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "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
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Subscription past due; the response carries a payment_url"
          },
          "429": {
            "description": "Monthly token allowance exhausted"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/rankings": {
      "get": {
        "operationId": "climateRankings",
        "summary": "Climate Rankings",
        "description": "Climate Rankings endpoint of the Climate Normals API. Costs 1 token per call.",
        "externalDocs": {
          "url": "https://dataandapis.com/apis/climate-normals/climate-rankings"
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "25"
          },
          {
            "name": "metric",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "annual_snow"
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "desc"
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "CO"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "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
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Subscription past due; the response carries a payment_url"
          },
          "429": {
            "description": "Monthly token allowance exhausted"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/sources": {
      "get": {
        "operationId": "dataSources",
        "summary": "Data Sources",
        "description": "Data Sources endpoint of the Climate Normals API. Costs 1 token per call.",
        "externalDocs": {
          "url": "https://dataandapis.com/apis/climate-normals/data-sources"
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "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"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Subscription past due; the response carries a payment_url"
          },
          "429": {
            "description": "Monthly token allowance exhausted"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/stations/{id}": {
      "get": {
        "operationId": "getStationNormals",
        "summary": "Get Station Normals",
        "description": "Get Station Normals endpoint of the Climate Normals API. Costs 1 token per call.",
        "externalDocs": {
          "url": "https://dataandapis.com/apis/climate-normals/get-station-normals"
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "USW00023174"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "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
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Subscription past due; the response carries a payment_url"
          },
          "429": {
            "description": "Monthly token allowance exhausted"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/stations": {
      "get": {
        "operationId": "searchStations",
        "summary": "Search Stations",
        "description": "Search Stations endpoint of the Climate Normals API. Costs 1 token per call.",
        "externalDocs": {
          "url": "https://dataandapis.com/apis/climate-normals/search-stations"
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "20"
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "DENVER"
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "example": "CO"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "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
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Subscription past due; the response carries a payment_url"
          },
          "429": {
            "description": "Monthly token allowance exhausted"
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Api-Key",
        "description": "Create a free key at https://dataandapis.com/sign-up. 500 tokens a month on the Free plan; this API costs 1 token per call."
      }
    }
  },
  "security": [
    {
      "ApiKey": []
    }
  ]
}