Frost Dates & Planting Zone API

Keyless REST API · USDA hardiness zones + NOAA frost normals · no auth required

← Back to the free lookup tool

Turn a US ZIP or address into its USDA plant-hardiness zone, average last-spring / first-fall frost dates, frost-free growing-season length, and a vegetable planting calendar. All data is public-domain (USDA + NOAA); every response carries a source + honest confidence label.

Base & auth

All endpoints are GET, return JSON, and send permissive CORS. No API key when called directly. A metered plan with support is planned; today it is free and keyless.

Endpoints

GET/frost-dates?zip=20500

Also: /frost-dates?address=1600 Pennsylvania Ave NW, Washington DC

ParamNotes
zipUS ZIP (provide this OR address)
addressAny US address / "City, ST" — geocoded via the US Census geocoder

Example response

{
  "zip": "20500",
  "hardinessZone": "8a",
  "zoneTempRangeF": "10 to 15",
  "location": { "lat": 38.8948, "lon": -77.0361 },
  "frost": {
    "frostFree": false,
    "growingSeasonDays": 241,
    "station": "WASHINGTON REAGAN AP, VA US",
    "distanceMi": 3.2,
    "confidence": "high",
    "lastSpringFrost": { "mmdd": "03-24", "monthDay": "March 24" },
    "firstFallFrost":  { "mmdd": "11-18", "monthDay": "November 18" },
    "thresholds": {
      "hardFreeze28F": { "lastSpring": {"monthDay":"March 12"}, "firstFall": {"monthDay":"December 3"} },
      "freeze32F":     { "lastSpring": {"monthDay":"March 24"}, "firstFall": {"monthDay":"November 18"} },
      "lightFrost36F": { "lastSpring": {"monthDay":"April 3"},  "firstFall": {"monthDay":"November 6"} }
    }
  },
  "sources": { "hardinessZone": "2023 USDA PHZM via PRISM / Oregon State", "frostDates": "NOAA/NCEI 1991–2020 Climate Normals" }
}

GET/planting-calendar?zip=20500&crop=tomato

Omit crop for the full-garden calendar (all 27 vegetables).

ParamNotes
zip / addressLocation (one required)
cropOptional crop key — e.g. tomato, peas, kale
yearOptional reference year for the returned dates (default: current)

Example response (crop=tomato)

{
  "location": { "zip":"20500", "hardinessZone":"8a", "lastSpringFrost":"03/24", "growingSeasonDays":241 },
  "calendar": {
    "crop": "tomato", "name": "Tomatoes", "category": "warm-season", "frostTender": true,
    "schedule": [
      { "action":"Start seeds indoors", "date":"2026-02-10", "monthDay":"February 10", "relativeTo":"last spring frost", "offsetWeeks":-6 },
      { "action":"Transplant outdoors", "date":"2026-03-31", "monthDay":"March 31",    "relativeTo":"last spring frost", "offsetWeeks":1 }
    ]
  }
}

GET/health · /api

Discovery document + liveness check. Lists endpoints, coverage counts, and data sources.

Errors

StatusMeaning
400Missing/invalid params (e.g. no zip or address; unknown crop)
404Address could not be geocoded to a US ZIP
422ZIP resolved but is outside the US dataset (non-US / invalid)
405Non-GET method

Coverage & honesty

~40,500 US ZIP codes carry a 2023 USDA hardiness zone; ~99% also carry NOAA frost dates from the nearest station with published freeze normals. Confidence is high (≤10 mi), medium (≤30 mi), low (≤60 mi), or very-low (>60 mi, e.g. remote Alaska / mountainous Hawaii). Tropical/subtropical ZIPs (zone 11+) are labeled frost-free instead of being given a meaningless winter date. Values are 1991–2020 averages, not forecasts.

Data sources (all public domain)

Machine-readable spec

The full API is described in OpenAPI 3.1 — import it into Postman, Insomnia, or a client generator, or hand it to an agent. The response schemas in it were generated from real responses this API actually returned, not written by hand, so they describe what you will receive rather than what someone intended you to receive.

https://garden-frost-planting-api.netlify.app/openapi.json