Climate Normals API

Climate normals endpoint returning long-range averages for weather fields at global scale.

API Guide

Climate Normals API

Climate normals endpoint returning long-range averages for weather fields at global scale.

This API returns 30 year historical climate normals ranging from hourly to monthly intervals. The data is derived from the ERA-5 9KM Re-analysis. With this API you can retrieve temporal averages for data from the past 30 years for fields including temperature, dew point, wind speed, precipitation, and snowfall. The spatial resolution of the data returned by the API is 9 kilometers. Users may choose either the default 2020 series (1991-2020 calculation), or the 2010 series (1981-2010 calculation).

In order to utilize this API, you must provide the start day, and end day in MM-DD format. Ie. 02-04 = February, 4th.

The following per API request limitations apply (See: pricing):

  • *Plus / Business / Enterprise plans: 5 days of data per API request.
  • Other plan(s): No access

Calls to this API count as multiple historical requests. The quota deducted from the plan allowance is equal to the number 5 day periods between the requested start/end periods. For example, a request for 366 days = 74 requests against the plan quotas.

Request Parameters

Field Optional/Required Type Data Type Description
lat Required query number Latitude component of location.
lon Required query number Longitude component of location.
start_day Required query string Start Day (MM-DD).
end_day Required query string End Day (MM-DD).
tp Optional query string Time period of calculation (daily, monthly, or hourly). Options: daily, hourly, monthly
units Optional query string Convert to units. Default Metric See units field description Options: S, I, M
series_year Optional query string Series year for calculation. 2020 for 1991-2020. 2010 for 1981-2010. Options: 2010, 2020
key Required query string Your registered API key.

Example Request

Geolocation options: lat/lon (recommended)

Enter API key

lat/lon (recommended)

https://api.weatherbit.io/v2.0/normals?start_day=01-01&end_day=02-01&key=API_KEY&lat=35.7796&lon=-78.6382
curl -s "https://api.weatherbit.io/v2.0/normals?start_day=01-01&end_day=02-01&key=API_KEY&lat=35.7796&lon=-78.6382"
require 'uri'
require 'net/http'
require 'json'

uri = URI("https://api.weatherbit.io/v2.0/normals?start_day=01-01&end_day=02-01&key=API_KEY&lat=35.7796&lon=-78.6382")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
request = Net::HTTP::Get.new(uri)
response = http.request(request)
json = JSON.parse(response.body)
puts JSON.pretty_generate(json)
const https = require("https");

https.get("https://api.weatherbit.io/v2.0/normals?start_day=01-01&end_day=02-01&key=API_KEY&lat=35.7796&lon=-78.6382", (res) => {
  let raw = "";
  res.on("data", (chunk) => { raw += chunk; });
  res.on("end", () => {
    const json = JSON.parse(raw);
    console.log(JSON.stringify(json, null, 2));
  });
}).on("error", (err) => {
  console.error(err.message);
});
# pip install python-weatherbit
# https://pypi.org/project/pyweatherbit/

from weatherbit.api import Api

api = Api("YOUR_API_KEY")
response = api.get_normals(lat='35.7796', lon='-78.6382', start_day='01-01', end_day='02-01', tp='daily').get()
print(response)
Estimated quota: 1 requeststandard

Example Response HTTP 200

{
  "data": [
    {
      "day": 1,
      "dewpt": 1.1,
      "hour": null,
      "max_temp": 12.2,
      "max_wind_spd": 1.2,
      "min_temp": 2.3,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 3.95,
      "snow": 0,
      "temp": 6.7,
      "wind_dir": 266,
      "wind_spd": 0.8
    },
    {
      "day": 2,
      "dewpt": 0.6,
      "hour": null,
      "max_temp": 11.1,
      "max_wind_spd": 0.8,
      "min_temp": 2.7,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 3.43,
      "snow": 2.8,
      "temp": 6.2,
      "wind_dir": 270,
      "wind_spd": 0.6
    },
    {
      "day": 3,
      "dewpt": 1.4,
      "hour": null,
      "max_temp": 11.5,
      "max_wind_spd": 1.2,
      "min_temp": 2.3,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 5.42,
      "snow": 8.1,
      "temp": 6.2,
      "wind_dir": 270,
      "wind_spd": 0.8
    },
    {
      "day": 4,
      "dewpt": 1,
      "hour": null,
      "max_temp": 12.2,
      "max_wind_spd": 2.2,
      "min_temp": 2.7,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.37,
      "snow": 0.3,
      "temp": 6.6,
      "wind_dir": 259,
      "wind_spd": 1.5
    },
    {
      "day": 5,
      "dewpt": -0.5,
      "hour": null,
      "max_temp": 12.2,
      "max_wind_spd": 1.6,
      "min_temp": 2,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 1.03,
      "snow": 0,
      "temp": 6.3,
      "wind_dir": 262,
      "wind_spd": 1.4
    },
    {
      "day": 6,
      "dewpt": 0.1,
      "hour": null,
      "max_temp": 11.9,
      "max_wind_spd": 1.6,
      "min_temp": 2,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.28,
      "snow": 3.4,
      "temp": 6.2,
      "wind_dir": 270,
      "wind_spd": 1.1
    },
    {
      "day": 7,
      "dewpt": -0.5,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.6,
      "min_temp": 2,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.73,
      "snow": 4.8,
      "temp": 5.5,
      "wind_dir": 265,
      "wind_spd": 1.1
    },
    {
      "day": 8,
      "dewpt": -1.5,
      "hour": null,
      "max_temp": 10.4,
      "max_wind_spd": 2,
      "min_temp": 0.9,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.03,
      "snow": 0.6,
      "temp": 5,
      "wind_dir": 268,
      "wind_spd": 1.2
    },
    {
      "day": 9,
      "dewpt": -0.9,
      "hour": null,
      "max_temp": 11.1,
      "max_wind_spd": 1.2,
      "min_temp": 1.6,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 1.87,
      "snow": 2.1,
      "temp": 5.4,
      "wind_dir": 270,
      "wind_spd": 0.9
    },
    {
      "day": 10,
      "dewpt": -0.9,
      "hour": null,
      "max_temp": 11.5,
      "max_wind_spd": 0.8,
      "min_temp": 1.6,
      "min_wind_spd": 0,
      "month": 1,
      "precip": 1.76,
      "snow": 1.1,
      "temp": 5.7,
      "wind_dir": 251,
      "wind_spd": 0.5
    },
    {
      "day": 11,
      "dewpt": 0.6,
      "hour": null,
      "max_temp": 12.2,
      "max_wind_spd": 1.4,
      "min_temp": 1.6,
      "min_wind_spd": 0.6,
      "month": 1,
      "precip": 3.08,
      "snow": 0.2,
      "temp": 6.3,
      "wind_dir": 217,
      "wind_spd": 0.9
    },
    {
      "day": 12,
      "dewpt": 2.6,
      "hour": null,
      "max_temp": 13.7,
      "max_wind_spd": 1.8,
      "min_temp": 3.8,
      "min_wind_spd": 0.9,
      "month": 1,
      "precip": 3.86,
      "snow": 0.1,
      "temp": 7.9,
      "wind_dir": 238,
      "wind_spd": 1.3
    },
    {
      "day": 13,
      "dewpt": 2.7,
      "hour": null,
      "max_temp": 13.7,
      "max_wind_spd": 1.8,
      "min_temp": 3.8,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 2.1,
      "snow": 0,
      "temp": 7.9,
      "wind_dir": 258,
      "wind_spd": 1.2
    },
    {
      "day": 14,
      "dewpt": 0.6,
      "hour": null,
      "max_temp": 11.9,
      "max_wind_spd": 1.3,
      "min_temp": 2.7,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.36,
      "snow": 0,
      "temp": 6.6,
      "wind_dir": 260,
      "wind_spd": 0.9
    },
    {
      "day": 15,
      "dewpt": -1,
      "hour": null,
      "max_temp": 11.1,
      "max_wind_spd": 1.2,
      "min_temp": 1.2,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 3.23,
      "snow": 0,
      "temp": 5.4,
      "wind_dir": 269,
      "wind_spd": 0.8
    },
    {
      "day": 16,
      "dewpt": -1.7,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.2,
      "min_temp": 1.2,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 2.18,
      "snow": 0.3,
      "temp": 5.2,
      "wind_dir": 270,
      "wind_spd": 0.9
    },
    {
      "day": 17,
      "dewpt": -1.7,
      "hour": null,
      "max_temp": 10,
      "max_wind_spd": 0.9,
      "min_temp": 0.1,
      "min_wind_spd": 0,
      "month": 1,
      "precip": 4.78,
      "snow": 6.5,
      "temp": 4.7,
      "wind_dir": 249,
      "wind_spd": 0.5
    },
    {
      "day": 18,
      "dewpt": -1.3,
      "hour": null,
      "max_temp": 9.6,
      "max_wind_spd": 2,
      "min_temp": 1.2,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 2.46,
      "snow": 2.9,
      "temp": 4.7,
      "wind_dir": 270,
      "wind_spd": 1.3
    },
    {
      "day": 19,
      "dewpt": -2.6,
      "hour": null,
      "max_temp": 9.3,
      "max_wind_spd": 1.6,
      "min_temp": 0.1,
      "min_wind_spd": 0.6,
      "month": 1,
      "precip": 2.96,
      "snow": 4,
      "temp": 4,
      "wind_dir": 259,
      "wind_spd": 1
    },
    {
      "day": 20,
      "dewpt": -2.8,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.6,
      "min_temp": -0.3,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 2.59,
      "snow": 4.4,
      "temp": 4.4,
      "wind_dir": 267,
      "wind_spd": 1.2
    },
    {
      "day": 21,
      "dewpt": -3,
      "hour": null,
      "max_temp": 8.9,
      "max_wind_spd": 0.8,
      "min_temp": -0.6,
      "min_wind_spd": 0,
      "month": 1,
      "precip": 4.02,
      "snow": 1.6,
      "temp": 3.4,
      "wind_dir": 248,
      "wind_spd": 0.4
    },
    {
      "day": 22,
      "dewpt": -3.2,
      "hour": null,
      "max_temp": 8.9,
      "max_wind_spd": 0.4,
      "min_temp": -1.4,
      "min_wind_spd": 0,
      "month": 1,
      "precip": 2.28,
      "snow": 1.6,
      "temp": 3.2,
      "wind_dir": 188,
      "wind_spd": 0
    },
    {
      "day": 23,
      "dewpt": -0.4,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.3,
      "min_temp": 0.5,
      "min_wind_spd": 0,
      "month": 1,
      "precip": 5.01,
      "snow": 4.3,
      "temp": 5,
      "wind_dir": 237,
      "wind_spd": 0.7
    },
    {
      "day": 24,
      "dewpt": 0.1,
      "hour": null,
      "max_temp": 11.5,
      "max_wind_spd": 2,
      "min_temp": 2.7,
      "min_wind_spd": 1.2,
      "month": 1,
      "precip": 5.6,
      "snow": 1.2,
      "temp": 6.1,
      "wind_dir": 270,
      "wind_spd": 1.4
    },
    {
      "day": 25,
      "dewpt": -3.7,
      "hour": null,
      "max_temp": 10,
      "max_wind_spd": 1.2,
      "min_temp": -0.3,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.15,
      "snow": 11.6,
      "temp": 4.2,
      "wind_dir": 262,
      "wind_spd": 1.1
    },
    {
      "day": 26,
      "dewpt": -2.8,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.2,
      "min_temp": -1,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 1.12,
      "snow": 0.1,
      "temp": 4.3,
      "wind_dir": 268,
      "wind_spd": 0.7
    },
    {
      "day": 27,
      "dewpt": -1.5,
      "hour": null,
      "max_temp": 11.1,
      "max_wind_spd": 1.2,
      "min_temp": 0.1,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 2.35,
      "snow": 0,
      "temp": 5.1,
      "wind_dir": 270,
      "wind_spd": 0.8
    },
    {
      "day": 28,
      "dewpt": -1.1,
      "hour": null,
      "max_temp": 11.9,
      "max_wind_spd": 1.6,
      "min_temp": 1.2,
      "min_wind_spd": 0.8,
      "month": 1,
      "precip": 3.27,
      "snow": 2,
      "temp": 5.7,
      "wind_dir": 269,
      "wind_spd": 1
    },
    {
      "day": 29,
      "dewpt": -1.1,
      "hour": null,
      "max_temp": 11.5,
      "max_wind_spd": 1.3,
      "min_temp": 1.2,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 1.57,
      "snow": 2.3,
      "temp": 5.8,
      "wind_dir": 252,
      "wind_spd": 0.7
    },
    {
      "day": 30,
      "dewpt": -0.5,
      "hour": null,
      "max_temp": 11.1,
      "max_wind_spd": 1.6,
      "min_temp": 2,
      "min_wind_spd": 0.4,
      "month": 1,
      "precip": 4.07,
      "snow": 4.4,
      "temp": 5.7,
      "wind_dir": 265,
      "wind_spd": 0.8
    },
    {
      "day": 31,
      "dewpt": -3.1,
      "hour": null,
      "max_temp": 10.8,
      "max_wind_spd": 1.6,
      "min_temp": 0.5,
      "min_wind_spd": 0.6,
      "month": 1,
      "precip": 1.42,
      "snow": 0.2,
      "temp": 4.8,
      "wind_dir": 260,
      "wind_spd": 1.2
    },
    {
      "day": 1,
      "dewpt": -1.1,
      "hour": null,
      "max_temp": 12.6,
      "max_wind_spd": 1.8,
      "min_temp": 0.5,
      "min_wind_spd": 0.6,
      "month": 2,
      "precip": 1.61,
      "snow": 1,
      "temp": 5.8,
      "wind_dir": 247,
      "wind_spd": 1
    }
  ],
  "lat": 35.7796,
  "lon": -78.6382,
  "sources": [
    "era5"
  ],
  "timezone": "America/New_York"
}

HTTP Statuses

Code Description Example
200 An Normals Data Object. -
204 No Data Found -
400 Client Error
{
  "error": "Some relevant message"
}
403 Unauthorized/No Access for current plan level
{
  "error": "Some relevant message"
}
429 Daily or Velocity limit exceeded See rate limit guidance.
{
  "error": "Rate limit exceeded.",
  "status_code": 429,
  "status_message": "Rate limit exceeded. Try again later."
}
500 Internal Server Error
{
  "error": "Server Error"
}

Return Fields

Field Data Type Description
lat number Latitude
lon number Longitude
timezone string Local IANA time zone
sources array<string> List of data sources used in response
data array<NormalsObj>
data[].day ['number', 'null'] Day number
data[].month number Month number
data[].hour ['number', 'null'] Hour number
data[].temp number Average temperature
data[].dewpt number Average dew point
data[].max_temp number Maximum temperature
data[].min_temp number Minimum temperature
data[].max_wind_spd number Maximum 10m wind speed
data[].min_wind_spd number Minimum 10m wind speed
data[].wind_spd number Average 10m wind speed
data[].wind_dir number Average 10m wind direction - Degrees clockwise from 0 = North
data[].precip number Average Liquid equivalent precipitation - Default (mm)
data[].snow number Average Snowfall - Default (mm)