Ag-Weather Forecast API
Agriculture-focused forecast API with weather and soil-related fields used for field operations and crop planning.
Includes evapotranspiration and other ag-relevant metrics.
- Forecast fields tailored for agriculture applications.
- 8-day ag-focused weather context.
- Supports model inputs and farm operations.
Frequently Asked Questions
How is reference evapotranspiration calculated?
Our API uses an updated Penman-Monteith calculation based on the FAO56 methodology, with improvements that better estimate ET0 in hot and humid conditions.
Allen et al. (1998), FAO Irrigation and Drainage Paper No. 56Request Parameters
| Field | Optional/Required | Type | Data Type | Description |
|---|---|---|---|---|
lat
|
Required | query | number | Latitude component of location. |
lon
|
Required | query | number | Longitude component of location. |
units
|
Optional | query | string | Convert to units. Default Metric. Options (I = Imperial, M = Metric, S = Scientific) |
key
|
Required | query | string | Your registered API key. |
Example Request
Enter API key
lat/lon (recommended)
https://api.weatherbit.io/v2.0/forecast/agweather?key=API_KEY&lat=35.7796&lon=-78.6382
curl -s "https://api.weatherbit.io/v2.0/forecast/agweather?key=API_KEY&lat=35.7796&lon=-78.6382"
require 'uri'
require 'net/http'
require 'json'
uri = URI("https://api.weatherbit.io/v2.0/forecast/agweather?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/forecast/agweather?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_forecast(lat='35.7796', lon='-78.6382', days=8, source='agweather', tp='daily').get()
print(response)
Estimated quota: 1 requeststandard
Example Response HTTP 200
{
"data": [
{
"bulk_soil_density": 1370,
"dlwrf_avg": 328.156,
"dlwrf_max": 361.75,
"dlwrf_net": 164.078,
"dswrf_avg": 342.077,
"dswrf_max": 894,
"dswrf_net": -117.22,
"evapotranspiration": 3.958,
"pop": 0,
"precip": 0,
"pres_avg": 988.938,
"skin_temp_avg": 19,
"skin_temp_max": 25.9,
"skin_temp_min": 12.8,
"soilm_0_10cm": 27.249,
"soilm_100_200cm": 319.824,
"soilm_10_40cm": 84.045,
"soilm_40_100cm": 173.071,
"soilt_0_10cm": 18.5,
"soilt_100_200cm": 8.4,
"soilt_10_40cm": 13.7,
"soilt_40_100cm": 10.9,
"specific_humidity": 0.0087213516235352,
"temp_2m_avg": 21.3,
"v_soilm_0_10cm": 0.272,
"v_soilm_100_200cm": 0.32,
"v_soilm_10_40cm": 0.28,
"v_soilm_40_100cm": 0.288,
"valid_date": "2026-06-02",
"wind_10m_spd_avg": 3.483
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 328.594,
"dlwrf_max": 346.25,
"dlwrf_net": 164.297,
"dswrf_avg": 332.407,
"dswrf_max": 872,
"dswrf_net": -114.177,
"evapotranspiration": 4.191,
"pop": 0,
"precip": 0,
"pres_avg": 987.938,
"skin_temp_avg": 18.4,
"skin_temp_max": 25.4,
"skin_temp_min": 12.6,
"soilm_0_10cm": 25.842,
"soilm_100_200cm": 318.97,
"soilm_10_40cm": 82.581,
"soilm_40_100cm": 170.325,
"soilt_0_10cm": 17.8,
"soilt_100_200cm": 8.4,
"soilt_10_40cm": 13.8,
"soilt_40_100cm": 10.9,
"specific_humidity": 0.0089244842529297,
"temp_2m_avg": 21.5,
"v_soilm_0_10cm": 0.258,
"v_soilm_100_200cm": 0.319,
"v_soilm_10_40cm": 0.275,
"v_soilm_40_100cm": 0.284,
"valid_date": "2026-06-03",
"wind_10m_spd_avg": 4.094
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 356.688,
"dlwrf_max": 390.5,
"dlwrf_net": 178.344,
"dswrf_avg": 253.668,
"dswrf_max": 643,
"dswrf_net": -105.378,
"evapotranspiration": 4.487,
"pop": 20,
"precip": 0.1,
"pres_avg": 981.063,
"skin_temp_avg": 19.6,
"skin_temp_max": 26.6,
"skin_temp_min": 14.3,
"soilm_0_10cm": 24.971,
"soilm_100_200cm": 318.848,
"soilm_10_40cm": 81.116,
"soilm_40_100cm": 167.651,
"soilt_0_10cm": 17.9,
"soilt_100_200cm": 8.5,
"soilt_10_40cm": 13.8,
"soilt_40_100cm": 11,
"specific_humidity": 0.011224746704102,
"temp_2m_avg": 23.3,
"v_soilm_0_10cm": 0.25,
"v_soilm_100_200cm": 0.319,
"v_soilm_10_40cm": 0.27,
"v_soilm_40_100cm": 0.279,
"valid_date": "2026-06-04",
"wind_10m_spd_avg": 4.337
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 391.469,
"dlwrf_max": 413.5,
"dlwrf_net": 195.734,
"dswrf_avg": 164.085,
"dswrf_max": 389.5,
"dswrf_net": -92.019,
"evapotranspiration": 3.98,
"pop": 70,
"precip": 6.8,
"pres_avg": 974.688,
"skin_temp_avg": 21.1,
"skin_temp_max": 25.3,
"skin_temp_min": 18.3,
"soilm_0_10cm": 27.969,
"soilm_100_200cm": 317.871,
"soilm_10_40cm": 80.603,
"soilm_40_100cm": 166.333,
"soilt_0_10cm": 19.3,
"soilt_100_200cm": 8.6,
"soilt_10_40cm": 13.9,
"soilt_40_100cm": 11.1,
"specific_humidity": 0.014275550842285,
"temp_2m_avg": 23.9,
"v_soilm_0_10cm": 0.28,
"v_soilm_100_200cm": 0.318,
"v_soilm_10_40cm": 0.269,
"v_soilm_40_100cm": 0.277,
"valid_date": "2026-06-05",
"wind_10m_spd_avg": 4.463
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 390.281,
"dlwrf_max": 410.5,
"dlwrf_net": 195.141,
"dswrf_avg": 240.477,
"dswrf_max": 816,
"dswrf_net": -91.707,
"evapotranspiration": 3.639,
"pop": 85,
"precip": 15,
"pres_avg": 973.063,
"skin_temp_avg": 20.7,
"skin_temp_max": 26.7,
"skin_temp_min": 17.4,
"soilm_0_10cm": 30.942,
"soilm_100_200cm": 317.871,
"soilm_10_40cm": 84.86,
"soilm_40_100cm": 165.601,
"soilt_0_10cm": 19.3,
"soilt_100_200cm": 8.6,
"soilt_10_40cm": 14,
"soilt_40_100cm": 11.1,
"specific_humidity": 0.012678146362305,
"temp_2m_avg": 24.5,
"v_soilm_0_10cm": 0.309,
"v_soilm_100_200cm": 0.318,
"v_soilm_10_40cm": 0.283,
"v_soilm_40_100cm": 0.276,
"valid_date": "2026-06-06",
"wind_10m_spd_avg": 3.097
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 342.094,
"dlwrf_max": 366,
"dlwrf_net": 171.047,
"dswrf_avg": 350.523,
"dswrf_max": 906,
"dswrf_net": -119.928,
"evapotranspiration": 2.589,
"pop": 0,
"precip": 0,
"pres_avg": 977.625,
"skin_temp_avg": 21.4,
"skin_temp_max": 31.9,
"skin_temp_min": 13.3,
"soilm_0_10cm": 28.351,
"soilm_100_200cm": 317.017,
"soilm_10_40cm": 85.162,
"soilm_40_100cm": 164.282,
"soilt_0_10cm": 19.1,
"soilt_100_200cm": 8.6,
"soilt_10_40cm": 14.1,
"soilt_40_100cm": 11.4,
"specific_humidity": 0.011048316955566,
"temp_2m_avg": 23.4,
"v_soilm_0_10cm": 0.284,
"v_soilm_100_200cm": 0.317,
"v_soilm_10_40cm": 0.284,
"v_soilm_40_100cm": 0.274,
"valid_date": "2026-06-07",
"wind_10m_spd_avg": 3.246
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 351.5,
"dlwrf_max": 370.75,
"dlwrf_net": 175.75,
"dswrf_avg": 346.993,
"dswrf_max": 894.5,
"dswrf_net": -119.517,
"evapotranspiration": 2.687,
"pop": 30,
"precip": 1.4,
"pres_avg": 982.313,
"skin_temp_avg": 21.8,
"skin_temp_max": 28.8,
"skin_temp_min": 14.9,
"soilm_0_10cm": 26.88,
"soilm_100_200cm": 316.895,
"soilm_10_40cm": 83.167,
"soilm_40_100cm": 162.396,
"soilt_0_10cm": 19.9,
"soilt_100_200cm": 8.7,
"soilt_10_40cm": 14.2,
"soilt_40_100cm": 11.4,
"specific_humidity": 0.01219654083252,
"temp_2m_avg": 21.3,
"v_soilm_0_10cm": 0.269,
"v_soilm_100_200cm": 0.317,
"v_soilm_10_40cm": 0.277,
"v_soilm_40_100cm": 0.271,
"valid_date": "2026-06-08",
"wind_10m_spd_avg": 3.182
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 353.531,
"dlwrf_max": 376.5,
"dlwrf_net": 176.766,
"dswrf_avg": 347.813,
"dswrf_max": 894.5,
"dswrf_net": -119.846,
"evapotranspiration": 2.152,
"pop": 15,
"precip": 0.6,
"pres_avg": 983.25,
"skin_temp_avg": 22.7,
"skin_temp_max": 32.2,
"skin_temp_min": 15.1,
"soilm_0_10cm": 25.705,
"soilm_100_200cm": 316.162,
"soilm_10_40cm": 81.235,
"soilm_40_100cm": 160.254,
"soilt_0_10cm": 20.3,
"soilt_100_200cm": 8.9,
"soilt_10_40cm": 14.4,
"soilt_40_100cm": 11.5,
"specific_humidity": 0.012125968933105,
"temp_2m_avg": 22,
"v_soilm_0_10cm": 0.257,
"v_soilm_100_200cm": 0.316,
"v_soilm_10_40cm": 0.271,
"v_soilm_40_100cm": 0.267,
"valid_date": "2026-06-09",
"wind_10m_spd_avg": 1.634
},
{
"bulk_soil_density": 1370,
"dlwrf_avg": 367.929,
"dlwrf_max": 385.25,
"dlwrf_net": 183.964,
"dswrf_avg": 386.9,
"dswrf_max": 887.5,
"dswrf_net": -130.193,
"evapotranspiration": 2.416,
"pop": 0,
"precip": 0,
"pres_avg": 981,
"skin_temp_avg": 25,
"skin_temp_max": 31.8,
"skin_temp_min": 16.6,
"soilm_0_10cm": 24.782,
"soilm_100_200cm": 315.918,
"soilm_10_40cm": 79.677,
"soilm_40_100cm": 158.182,
"soilt_0_10cm": 21.3,
"soilt_100_200cm": 8.9,
"soilt_10_40cm": 14.4,
"soilt_40_100cm": 11.6,
"specific_humidity": 0.013023376464844,
"temp_2m_avg": 23.6,
"v_soilm_0_10cm": 0.248,
"v_soilm_100_200cm": 0.316,
"v_soilm_10_40cm": 0.266,
"v_soilm_40_100cm": 0.264,
"valid_date": "2026-06-10",
"wind_10m_spd_avg": 2.178
}
],
"lat": 41.8781,
"lon": -93.0977
}
HTTP Statuses
| Code | Description | Example |
|---|---|---|
| 200 | An AGWeather Forecast 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 |
data
|
array<ForecastAGObj> | |
data[].bulk_soil_density
|
number | Bulk Soil Density |
data[].dlwrf_avg
|
number | Average Downward Longwave Radiation Flux (W/m^2) |
data[].dlwrf_max
|
number | Maximum Downward Longwave Radiation Flux (W/m^2) |
data[].dlwrf_net
|
number | Net Downward Longwave Radiation Flux (W/m^2) |
data[].dswrf_avg
|
number | Average Downward Shortwave Radiation Flux (W/m^2) |
data[].dswrf_max
|
number | Maximum Downward Shortwave Radiation Flux (W/m^2) |
data[].dswrf_net
|
number | Net Downward Shortwave Radiation Flux (W/m^2) |
data[].evapotranspiration
|
number | Evapotranspiration (default mm) |
data[].precip
|
number | Accumulated liquid equivalent precipitation (default mm) |
data[].pop
|
number | Probability of Precipitation (%) |
data[].pres_avg
|
number | Average Pressure (default mb) |
data[].revision_status
|
string | Data revision status (interim or final). interim = Data subject to change. |
data[].revision_version
|
string | Final data revision version. |
data[].skin_temp_avg
|
number | Average Skin (Surface) Temperature (default Celsius) |
data[].skin_temp_max
|
number | Maximum Skin (Surface) Temperature (default Celsius) |
data[].skin_temp_min
|
number | Minimum Skin (Surface) Temperature (default Celsius) |
data[].soilm_0_10cm
|
number | Soil Moisture (0-10cm depth) (default mm) |
data[].soilm_100_200cm
|
number | Soil Moisture (100-200cm depth) (default mm) |
data[].soilm_10_40cm
|
number | Soil Moisture (10-40cm depth) (default mm) |
data[].soilm_40_100cm
|
number | Soil Moisture (40-100cm depth) (default mm) |
data[].soilt_0_10cm
|
number | Soil Temperature (0-10cm depth) (default Celsius) |
data[].soilt_100_200cm
|
number | Soil Temperature (100-200cm depth) (default Celsius) |
data[].soilt_10_40cm
|
number | Soil Temperature (10-40cm depth) (default Celsius) |
data[].soilt_40_100cm
|
number | Soil Temperature (40-100cm depth) (default Celsius) |
data[].specific_humidity
|
number | Specific Humidity (kg/kg) |
data[].temp_2m_avg
|
number | Average Temperature at 2 meters (default Celsius) |
data[].v_soilm_0_10cm
|
number | Volumetric Soil Moisture (0-10cm depth) (fraction) |
data[].v_soilm_100_200cm
|
number | Volumetric Soil Moisture (100-200cm depth) (fraction) |
data[].v_soilm_10_40cm
|
number | Volumetric Soil Moisture (10-40cm depth) (fraction) |
data[].v_soilm_40_100cm
|
number | Volumetric Soil Moisture (40-100cm depth) (fraction) |
data[].valid_date
|
string | Valid Date |
data[].wind_10m_spd_avg
|
number | Average Wind Speed at 10 meters (default m/s) |