Historical Daily API

This API returns daily historical weather data from our network of over 120,000 stations as well as re-analysis data. This is daily historical data, and a request will return data from data sources within ~1...

API Guide

Historical Daily API

This API returns daily historical weather data from our network of over 120,000 stations as well as re-analysis data. This is daily historical data, and a request will return data from data sources within ~15km of the requested point.

This API returns daily data. For hourly historical data, see the Hourly Historical Weather API.

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

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

*For convenience, up to 1 year of data can be requested per API request. However, requests that exceed 15 days will count as multiple requests against the plan daily quota. Example: 364 days = 25 requests, 30 days = 2 requests, etc.

Frequently Asked Questions

What data sources are used in the Historical Weather API?

Historical weather responses are built from a multi-source dataset that can include station observations, RTMA, radar, satellite precipitation estimates, ERA5, CAMS, GHCN, and other global sources. The exact mix depends on location, time, and source availability.

Read help article

Why does historical data sometimes change?

Historical records can be revised as higher-quality source data arrives after the first response. We recommend checking `revision_status` and `revision_version`, and retrieving updated data if your analysis requires research-quality values. For most users, "interim" data is adequate.

Read help article

How does Weatherbit combine multiple historical data sources?

We prefer nearby ground-truth station data when it is available and high quality, then blend in other datasets to improve spatial completeness and reduce gaps. As station distance or quality changes, the source selection can shift accordingly.

Read help article

What spatial resolution should I expect from historical data?

Historical weather coverage typically ranges from about 1 to 13 km, depending on nearby stations and the source mix available for that location.

Read help article

When is data valid, and how are accumulated values computed?

Unless a field is documented otherwise, values are valid at the timestamp shown in the response. Accumulated fields such as precipitation and snowfall represent the aggregate for the interval from that timestamp, to the next timestamp. The same applies to averages, max/mins, etc.

Read help article

What does the `solar_rad` field represent?

The solar radiation field is an estimated surface solar flux value that accounts for cloud cover, surface albedo, and atmospheric effects. Alternatively, GHI/DNI/DHI values are clear-sky values which do not account for these.

Read help article

Why do large historical requests need to be broken into smaller calls?

Historical API access is designed around chunked retrieval, so larger time ranges should be split into smaller windows such as monthly requests. This is expected behavior and is how bulk retrieval is meant to be handled.

Read help article

Request Parameters

Field Optional/Required Type Data Type Description
lat Optional query number Latitude component of location.
lon Optional query number Longitude component of location.
city Optional query string City search.. Example - &city=Raleigh,NC or &city=Berlin,DE or city=Paris&country=FR
postal_code Optional query string Postal Code. Example: 28546
country Optional query string Country Code (2 letter) - to be used with postal_code.
station Optional query string Station Call ID.
start_date Required query string Start Date (YYYY-MM-DD or YYYY-MM-DD:HH).
end_date Required query string End Date (YYYY-MM-DD or YYYY-MM-DD:HH).
units Optional query string Convert to units. Default Metric. Options (I = Imperial, M = Metric, S = Scientific) Options: S, I, M
lang Optional query string Language (Default: English) See language field description Options: ar, az, be, bg, bs, ca, cs, de, fi, fr, el, es, et, hr, hu, id, it, is, kw, nb, nl, pl, pt, ro, ru, sk, sl, sr, sv, tr, uk, zh, zh-tw
key Required query string Your registered API key.

* One of the following location methods is required: lat/lon (recommended), city,ST + country, postal_code + country or station ID .

Example Requests

Geolocation options: lat/lon (recommended), city, postal_code and country or station ID [Use with Caution]

Enter API key

lat/lon (recommended)

https://api.weatherbit.io/v2.0/history/daily?start_date=2026-06-08&end_date=2026-06-13&key=API_KEY&lat=35.7796&lon=-78.6382
curl -s "https://api.weatherbit.io/v2.0/history/daily?start_date=2026-06-08&end_date=2026-06-13&key=API_KEY&lat=35.7796&lon=-78.6382"
require 'uri'
require 'net/http'
require 'json'

uri = URI("https://api.weatherbit.io/v2.0/history/daily?start_date=2026-06-08&end_date=2026-06-13&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/history/daily?start_date=2026-06-08&end_date=2026-06-13&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_history(lat='35.7796', lon='-78.6382', start_date='2026-06-08', end_date='2026-06-13', tp='daily').get()
print(response)
Estimated quota: 1 requeststandard

Example Response HTTP 200

Loading weather demo...
{
  "city_id": "4487042",
  "city_name": "Raleigh",
  "country_code": "US",
  "data": [
    {
      "clouds": 57,
      "datetime": "2026-05-27",
      "dewpt": 21.6,
      "dhi": 56,
      "dni": 441,
      "ghi": 354,
      "max_dhi": 124,
      "max_dni": 932,
      "max_ghi": 1017,
      "max_temp": 30.4,
      "max_temp_ts": 1779912000,
      "max_uv": 8.3,
      "max_wind_dir": 230,
      "max_wind_spd": 4.8,
      "max_wind_spd_ts": 1779897600,
      "min_temp": 21.9,
      "min_temp_ts": 1779876000,
      "precip": 0.5,
      "precip_gpm": 0.5,
      "pres": 1005,
      "revision_status": "interim",
      "revision_version": "0.0",
      "rh": 82,
      "slp": 1016,
      "snow": 0,
      "snow_depth": 0,
      "solar_rad": 282,
      "t_dhi": 1333,
      "t_dni": 10587,
      "t_ghi": 8505,
      "t_solar_rad": 6762,
      "temp": 25.2,
      "ts": 1779854400,
      "wind_dir": 230,
      "wind_gust_spd": 10,
      "wind_spd": 3.2
    },
    {
      "clouds": 28,
      "datetime": "2026-05-28",
      "dewpt": 19.3,
      "dhi": 56,
      "dni": 442,
      "ghi": 355,
      "max_dhi": 124,
      "max_dni": 931,
      "max_ghi": 1017,
      "max_temp": 31.5,
      "max_temp_ts": 1780002000,
      "max_uv": 8.6,
      "max_wind_dir": 218,
      "max_wind_spd": 3.6,
      "max_wind_spd_ts": 1779984000,
      "min_temp": 22.2,
      "min_temp_ts": 1779951600,
      "precip": 0,
      "precip_gpm": 0,
      "pres": 1001,
      "revision_status": "interim",
      "revision_version": "0.0",
      "rh": 69,
      "slp": 1013,
      "snow": 0,
      "snow_depth": 0,
      "solar_rad": 349,
      "t_dhi": 1335,
      "t_dni": 10598,
      "t_ghi": 8518,
      "t_solar_rad": 8371,
      "temp": 26.2,
      "ts": 1779940800,
      "wind_dir": 218,
      "wind_gust_spd": 6.8,
      "wind_spd": 2.2
    },
    {
      "clouds": 11,
      "datetime": "2026-05-29",
      "dewpt": 14.4,
      "dhi": 56,
      "dni": 442,
      "ghi": 355,
      "max_dhi": 124,
      "max_dni": 931,
      "max_ghi": 1018,
      "max_temp": 29.3,
      "max_temp_ts": 1780084800,
      "max_uv": 10.5,
      "max_wind_dir": 148,
      "max_wind_spd": 3.6,
      "max_wind_spd_ts": 1780095600,
      "min_temp": 16.7,
      "min_temp_ts": 1780048800,
      "precip": 0,
      "precip_gpm": 0,
      "pres": 1004,
      "revision_status": "interim",
      "revision_version": "0.0",
      "rh": 59,
      "slp": 1015,
      "snow": 0,
      "snow_depth": 0,
      "solar_rad": 355,
      "t_dhi": 1336,
      "t_dni": 10609,
      "t_ghi": 8531,
      "t_solar_rad": 8530,
      "temp": 23.3,
      "ts": 1780027200,
      "wind_dir": 148,
      "wind_gust_spd": 6,
      "wind_spd": 1.7
    },
    {
      "clouds": 27,
      "datetime": "2026-05-30",
      "dewpt": 13.6,
      "dhi": 56,
      "dni": 442,
      "ghi": 356,
      "max_dhi": 124,
      "max_dni": 931,
      "max_ghi": 1018,
      "max_temp": 31.1,
      "max_temp_ts": 1780167600,
      "max_uv": 10.6,
      "max_wind_dir": 162,
      "max_wind_spd": 5.6,
      "max_wind_spd_ts": 1780196400,
      "min_temp": 20.7,
      "min_temp_ts": 1780131600,
      "precip": 0,
      "precip_gpm": 0,
      "pres": 1000,
      "revision_status": "interim",
      "revision_version": "0.0",
      "rh": 55,
      "slp": 1012,
      "snow": 0,
      "snow_depth": 0,
      "solar_rad": 339,
      "t_dhi": 1337,
      "t_dni": 10619,
      "t_ghi": 8543,
      "t_solar_rad": 8131,
      "temp": 25.2,
      "ts": 1780113600,
      "wind_dir": 162,
      "wind_gust_spd": 10.4,
      "wind_spd": 2.8
    },
    {
      "clouds": 19,
      "datetime": "2026-05-31",
      "dewpt": 11.1,
      "dhi": 56,
      "dni": 443,
      "ghi": 356,
      "max_dhi": 124,
      "max_dni": 931,
      "max_ghi": 1018,
      "max_temp": 25.9,
      "max_temp_ts": 1780257600,
      "max_uv": 11,
      "max_wind_dir": 132,
      "max_wind_spd": 5.6,
      "max_wind_spd_ts": 1780200000,
      "min_temp": 12.6,
      "min_temp_ts": 1780221600,
      "precip": 0,
      "precip_gpm": 0,
      "pres": 1006,
      "revision_status": "interim",
      "revision_version": "0.0",
      "rh": 58,
      "slp": 1018,
      "snow": 0,
      "snow_depth": 0,
      "solar_rad": 356,
      "t_dhi": 1338,
      "t_dni": 10629,
      "t_ghi": 8555,
      "t_solar_rad": 8548,
      "temp": 20.2,
      "ts": 1780200000,
      "wind_dir": 132,
      "wind_gust_spd": 9.6,
      "wind_spd": 2.1
    }
  ],
  "lat": 35.7721,
  "lon": -78.63861,
  "sources": [
    "imerg",
    "era5",
    "sat",
    "radar",
    "snodas"
  ],
  "state_code": "NC",
  "station_id": "723060-13722",
  "timezone": "America/New_York"
}

HTTP Statuses

Code Description Example
200 An Historical Day 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
city_name string Nearest city name
state_code string State abbreviation
country_code string Country abbreviation
timezone string Local IANA time zone
lat number Latitude
lon number Longitude
city_id string Nearest city ID
sources array<string> List of data sources used in response
station_id string [DEPRECATED] Deprecated - use 'sources'
data array<HistoryDayObj>
data[].datetime string Date in format "YYYY-MM-DD". All datetime is in (UTC)
data[].ts integer Unix timestamp of datetime (Midnight UTC)
data[].revision_status string Data revision status (interim or final). interim = Data subject to change.
data[].revision_version string Final data revision version.
data[].slp number Average sea level pressure (mb)
data[].pres number Average pressure (mb)
data[].rh number Average relative humidity as a percentage (%)
data[].dewpt number Average dewpoint - Default (C)
data[].temp number Average temperature - Default (C)
data[].max_temp number Max temperature - Default (C)
data[].max_temp_ts number Time of max memperature - Unix Timestamp
data[].min_temp number Min temperature - Default (C)
data[].min_temp_ts number Time of max temperature - unix timestamp
data[].wind_spd number Average 10m wind speed - default (m/s)
data[].wind_dir integer Average 10m wind direction (degrees) - Degrees clockwise from 0 = North
data[].wind_gust_spd number 10m wind gust speed - default (m/s)
data[].max_wind_spd number Max 2min 10m Wind Speed - default (m/s)
data[].max_wind_dir integer Direction of 10m wind at time of max 2min wind (degrees) - Degrees clockwise from 0 = North
data[].max_wind_spd_ts number Time of max 2min 10m wind - unix timestamp
data[].clouds integer Average cloud cover (%)
data[].ghi integer Average hourly global horizontal solar irradiance (W/m^2)
data[].t_ghi integer Total global horizontal solar irradiance (W/m^2)
data[].dni integer Average direct normal solar irradiance (W/m^2)
data[].t_dni integer Total direct normal solar irradiance (W/m^2)
data[].dhi integer Average diffuse horizontal solar irradiance (W/m^2)
data[].max_ghi integer Maximum global horizontal solar irradiance (W/m^2)
data[].max_dni integer Maximum direct normal solar irradiance (W/m^2)
data[].max_dhi integer Maximum diffuse horizontal solar irradiance (W/m^2)
data[].t_dhi integer Total diffuse horizontal solar irradiance (W/m^2)
data[].solar_rad integer Average solar radiation (W/m^2)
data[].t_solar_rad integer Total solar radiation (W/m^2)
data[].max_uv number Max UV Index (0-11+)
data[].precip number Liquid equivalent precipitation - default (mm)
data[].precip_gpm number [DEPRECATED] Deprecated - use 'precip'
data[].snow number Snowfall - default (mm)
data[].snow_depth ['number', 'null'] Snow Depth - default (mm)