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). |
units
|
Optional | query | string | Convert to units. Default Metric See units field description |
series_year
|
Optional | query | string | Series year for calculation. 2020 for 1991-2020. 2010 for 1981-2010. |
key
|
Required | query | string | Your registered API key. |
Example Request
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)
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 |
|
| 403 | Unauthorized/No Access for current plan level |
|
| 429 | Daily or Velocity limit exceeded See rate limit guidance. |
|
| 500 | Internal 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) |