Agronomy Forecast - Growing Conditions & Soil Status
## Agronomy Forecast
Agronomy Forecast
Point forecast of growing conditions and soil status, tuned for turfgrass and general agricultural use.
Always returns exactly 384 hourly timestamps (one per hour, starting at the current top
of the hour), for CONUS and non-CONUS locations alike - the array shape is always the
same. What backs each hour differs by field and by location; see the per-field notes
below and metadata on the actual response for exactly where real data ends at the
location you queried. The endpoint picks the best available source automatically;
there is no parameter to select it.
Use vars to request a subset of fields, and start_hour/end_hour (1-384) to request
a sub-range - same conventions as /forecast/point/. Use turf_type (cool or warm,
default cool) to control which optimal-temperature curve grow_score is computed against -
same parameter and same curve /agronomy/gdd/ uses for its own daily grow_score.
Fields
| Field | Description |
|---|---|
dew_prob | Dew formation probability (0-100) |
shaded_dew | Dew formation probability for shaded turf (smoothed, holds moisture longer) |
frost_prob | Frost probability (0-100) |
shaded_frost | Frost probability for shaded turf (smoothed) |
canopy | Canopy water content (kg/m^2), CONUS near-term only, from the high-resolution short-range model |
soilt | Soil temperature of the 0-5 cm (top 2 in) layer: cooler than 5 cm on clear nights, warmer at midday. CONUS near-term blends the high-resolution short-range model, calibrated against in-ground sensors, with global model guidance; global model guidance beyond that and worldwide |
soilt_5cm | Soil temperature at 5 cm (2 in), same sources, calibrated against in-ground 5 cm sensors |
soilt_10cm | Soil temperature at 10 cm (4 in), same sources, calibrated against in-ground 10 cm sensors |
et_rate | Evapotranspiration rate, real ASCE-EWRI hourly throughout |
tmp_2m | 2-meter air temperature |
rh | Relative humidity (0-100) |
soilm | Soil moisture, volumetric percent 0-100, CONUS near-term at 5 cm from the high-resolution short-range model, top 10 cm layer from global model guidance beyond that and worldwide |
low_cloud | Low-layer cloud cover (0-100), CONUS near-term from the high-resolution short-range model, global model guidance beyond that and worldwide |
mid_cloud | Mid-layer cloud cover (0-100), CONUS near-term from the high-resolution short-range model, global model guidance beyond that and worldwide |
high_cloud | High-layer cloud cover (0-100), CONUS near-term from the high-resolution short-range model, global model guidance beyond that and worldwide |
dswrf | Downward solar radiation, W/m^2, CONUS from the blended forecast through 180 hours, global model guidance beyond that and worldwide |
grow_score | Proprietary growing-conditions index (0-100), computed per hour from real tmp_2m; depends on turf_type |
Every field is linearly interpolated for any gap inside real coverage, so a lower-cadence
source (e.g. a 3-hourly global-model reading) never shows up as null in between.
soilm, canopy, dswrf, low_cloud, mid_cloud, and high_cloud never extend past
their own last real reading once real coverage ends - every other field instead holds
the last real value for the remaining hours. Check metadata on the actual response for
exactly where real coverage ends per field at the location you queried, rather than
assuming a fixed hour - it varies by location and by which upstream models are covering
that point at request time.
daily_average collapses each field to one value per calendar day: a mean of that
day's hourly values, except et_rate, which is a rate and so is summed to a daily
total instead (matching how ET is normally reported, e.g. inches/day). For the
first day only, that et_rate total also includes hours already elapsed today
(from local midnight through now), so it reflects the true full-day figure even
partway through the day, not just the hours still ahead in the hourly array.
Frost outlook
- One entry per night (local date of the morning it ends), CONUS only; null outside the high-resolution grid or before the fields are published for the served run, an empty list where no night is covered
frost_probability: chance of visible frost on open ground at some point of the night, the night's peak of the hourly frost probabilitycoverage: the expected share of the surrounding 5-10 km with frost (none,low_spots_only,scattered,widespread) withpercentand its range (percent_p10topercent_p90) and aconfidence(high,medium,low). "Scattered, low confidence, range 0-95%" reads as "scattered frost possible, could be widespread or none"intensity: where frost forms,light,moderate,heavyorkilling_freeze, with itsconfidenceground_minandshelter_min: the night's minimum on open ground (frost forms there) and in the air at 5 ft, as p10/p50/p90; the p10-p90 range holds about 80% of nightsfreeze_probabilityandhard_freeze_probability: chance the air at 5 ft reaches 32F and 28F- Temperatures in F (english) or C (metric)
Units
Set units=metric for Celsius and mm. Default is units=english (deg F, inches).
Example Requests
# CONUS point (English units, default)
GET /agronomy/forecast/?lat=33.47&lon=-82.01
# Metric units
GET /agronomy/forecast/?lat=51.5&lon=-0.13&units=metricToken-based authentication with required prefix "Token"
In: header
Query Parameters
Ending forecast hour (1-384). Must be provided together with start_hour.
Latitude in decimal degrees (-90 to 90).
floatLongitude in decimal degrees (-180 to 180).
floatStarting forecast hour (1-384). Must be provided together with end_hour.
Turf species type. Selects the temperature optimum used for the growing-condition index. cool (default): cool-season grasses (Kentucky bluegrass, fescue, ryegrass, bentgrass). Peak growth at 68°F (20°C). warm: warm-season grasses (bermudagrass, zoysia, St. Augustine). Peak growth at 88°F (31°C).
"cool"Value in
- "cool"
- "warm"
Unit system for returned values. English (default): °F, inches. Metric: °C, mm.
"english"Value in
- "english"
- "metric"
Optional: comma-separated list of fields to return. Omit for all fields. Valid values: dew_prob, shaded_dew, frost_prob, shaded_frost, canopy, soilt, soilt_5cm, soilt_10cm, et_rate, tmp_2m, rh, soilm.
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/agronomy/forecast/?end_hour=384&lat=33.4735&lon=-82.0105&start_hour=1&turf_type=cool&units=english&vars=dew_prob"{ "timestamps": [ "2026-06-05T00:00:00Z", "2026-06-05T01:00:00Z", "...382 more" ], "data": { "dew_prob": [ 72.5, 68, "..." ], "shaded_dew": [ 72.5, 70.3, "..." ], "frost_prob": [ 0, 0, "..." ], "shaded_frost": [ 0, 0, "..." ], "canopy": [ 0.05, 0.04, "..." ], "soilt": [ 66.1, 65.3, "..." ], "soilt_5cm": [ 68.4, 68.1, "..." ], "soilt_10cm": [ 69.2, 69, "..." ], "et_rate": [ 0.012, 0.014, "..." ], "tmp_2m": [ 72.4, 71.8, "..." ], "rh": [ 82, 84.5, "..." ], "soilm": [ 28, 28, "...", null, null ], "low_cloud": [ 20, 35, "..." ], "mid_cloud": [ 10, 15, "..." ], "high_cloud": [ 5, 8, "..." ], "dswrf": [ 0, 45, "..." ], "grow_score": [ 88.4, 90.1, "..." ] }, "daily_average": { "days": [ "2026-06-05", "...15 more" ], "data": { "dew_prob": [ 70.25, "..." ], "shaded_dew": [ 71.4, "..." ], "frost_prob": [ 0, "..." ], "shaded_frost": [ 0, "..." ], "canopy": [ 0.045, "..." ], "soilt": [ 68, "..." ], "soilt_5cm": [ 68.25, "..." ], "soilt_10cm": [ 68.9, "..." ], "et_rate": [ 0.21, "..." ], "tmp_2m": [ 72.1, "..." ], "rh": [ 83.25, "..." ], "soilm": [ 28, "...", null ], "low_cloud": [ 27.5, "..." ], "mid_cloud": [ 12.5, "..." ], "high_cloud": [ 6.5, "..." ], "dswrf": [ 22, "..." ], "grow_score": [ 89.2, "..." ] } }, "metadata": { "soilm": "No data available beyond the near-term forecast window for this location." }, "lat": 33.4735, "lon": -82.0105, "units": "english"}
