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 articleWhy 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 articleHow 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 articleWhat 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 articleWhen 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 articleWhat 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 articleWhy 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 articleRequest 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) |
lang
|
Optional | query | string | Language (Default: English) See language field description |
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
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)
Example Response HTTP 200
{
"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 |
|
| 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 |
|---|---|---|
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) |