Growing Degree Days (GDD) Forecast

## Growing Degree Days

Growing Degree Days

Returns daily growing degree days (GDD) at four base temperatures, with running cumulative totals, and a growing-condition index. Coverage is up to 15 days ahead everywhere the underlying global model has data.

GDD Bases

FieldBaseUse Case
gdd32 / cum_gdd3232 deg F (0 deg C)General biological heat accumulation
gdd50 / cum_gdd5050 deg F (10 deg C)Turfgrass and warm-season weed germination threshold
gdd10c / cum_gdd10c10 deg C (50 deg F)Same threshold as gdd50, Celsius output
gdd0c / cum_gdd0c0 deg C (32 deg F)Same threshold as gdd32, Celsius output

Season-to-Date Baseline

For CONUS locations, the cum_gdd* fields continue from a real season-to-date total (January 1 through yesterday) instead of starting at zero on the first forecast day. That baseline is echoed back in historical, including a historical.daily array with one entry per calendar day since January 1. Locations outside CONUS coverage don't get a historical block, and their cum_gdd* fields start from the first forecast day.

Forecast Band and Confidence

Each day carries cum_*_low / cum_*_high band edges around the cum_gdd* totals, plus confidence_* scores. The band is the season-to-date baseline plus a running sum of each forecast day's GDD at the mean temperature minus (low) or plus (high) half the ensemble P10-P90 temperature spread. It is a sum of per-day bounds, not a percentile of season totals.

Ensemble spread is only available on a grid covering roughly the contiguous US plus a margin. Outside it, low == high == cum_gdd*. A zero-width band means no spread data, not a certain forecast, and confidence on those days is 45 or lower. With ensemble spread, confidence tops out at 75. The four confidence_* fields currently always carry the same value.

Custom Base Temperature

Pass base_temperature (with base_unit, default f) to get GDD at any base, not just the four fixed ones. Adds gdd_custom/cum_gdd_custom to each day. The custom cumulative total always starts from the first forecast day. It does not include a historical baseline, since the historical dataset only pre-computes the four fixed bases.

Growing-Condition Index

grow_score (0-100) reflects how close the day's mean temperature is to the optimum for the selected turf type. 90+ is near-ideal, 60-89 is good, 30-59 is moderate stress, and below 30 is significant heat, cold, or drought limitation. Always this field name, regardless of turf_type.

Pass turf_type=warm for bermudagrass, zoysia, or St. Augustine. This shifts the optimum from 68°F (20°C) to 88°F (31°C). GDD values themselves do not change with turf_type.

Example Requests

# Cool-season (default)
GET /agronomy/gdd/?lat=33.47&lon=-82.01

# Warm-season turf
GET /agronomy/gdd/?lat=33.47&lon=-82.01&turf_type=warm

# Custom base temperature (45 deg F)
GET /agronomy/gdd/?lat=33.47&lon=-82.01&base_temperature=45&base_unit=f
GET
/agronomy/gdd/

Authorization

Authorization<token>

Token-based authentication with required prefix "Token"

In: header

Query Parameters

base_temperature?number

Optional custom GDD base temperature. When set, the response adds a gdd_custom/cum_gdd_custom pair to each day alongside the four standard bases. Must be paired with base_unit.

Formatfloat
base_unit?string

Unit of base_temperature. Defaults to 'f'.

Default"f"

Value in

  • "c"
  • "f"
lat*number

Latitude in decimal degrees (-90 to 90).

Formatfloat
lon*number

Longitude in decimal degrees (-180 to 180).

Formatfloat
turf_type?string

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).

Default"cool"

Value in

  • "cool"
  • "warm"

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/agronomy/gdd/?base_temperature=40&lat=33.4735&lon=-82.0105&turf_type=cool"

{  "lat": 33.4735,  "lon": -82.0105,  "days": 2,  "daily": [    {      "date": "2026-06-07",      "tmax_f": 88,      "tmin_f": 68,      "tmean_f": 78,      "gdd32": 46,      "gdd50": 28,      "gdd10c": 15.6,      "gdd0c": 25.6,      "cum_gdd32": 5067.4,      "cum_gdd50": 2869.2,      "cum_gdd10c": 1594,      "cum_gdd0c": 2815.3,      "cum_32_low": 5064.4,      "cum_32_high": 5070.4,      "cum_50_low": 2866.2,      "cum_50_high": 2872.2,      "cum_10c_low": 1592.3,      "cum_10c_high": 1595.6,      "cum_0c_low": 2813.6,      "cum_0c_high": 2816.9,      "confidence_32": 62,      "confidence_50": 62,      "confidence_10c": 62,      "confidence_0c": 62,      "grow_score": 71.2    },    {      "date": "2026-06-08",      "tmax_f": 91,      "tmin_f": 71,      "tmean_f": 81,      "gdd32": 49,      "gdd50": 31,      "gdd10c": 17.2,      "gdd0c": 27.2,      "cum_gdd32": 5116.4,      "cum_gdd50": 2900.2,      "cum_gdd10c": 1611.2,      "cum_gdd0c": 2842.5,      "cum_32_low": 5109.4,      "cum_32_high": 5123.4,      "cum_50_low": 2893.2,      "cum_50_high": 2907.2,      "cum_10c_low": 1607.3,      "cum_10c_high": 1615.1,      "cum_0c_low": 2838.6,      "cum_0c_high": 2846.4,      "confidence_32": 58,      "confidence_50": 58,      "confidence_10c": 58,      "confidence_0c": 58,      "grow_score": 42.3    }  ],  "historical": {    "season_start": "2026-01-01",    "through_date": "2026-06-06",    "n_days": 157,    "cum_32": 5021.4,    "cum_50": 2841.2,    "cum_10c": 1578.4,    "cum_0c": 2789.7,    "source": "prism",    "daily": [      {        "date": "2026-01-01",        "gdd32": 0,        "gdd50": 0,        "gdd10c": 0,        "gdd0c": 0,        "cum_gdd32": 0,        "cum_gdd50": 0,        "cum_gdd10c": 0,        "cum_gdd0c": 0      },      {        "date": "2026-06-06",        "gdd32": 41.2,        "gdd50": 23.2,        "gdd10c": 12.9,        "gdd0c": 22.9,        "cum_gdd32": 5021.4,        "cum_gdd50": 2841.2,        "cum_gdd10c": 1578.4,        "cum_gdd0c": 2789.7      }    ],    "daily_through_date": "2026-06-04"  }}

On this page