← 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
| Param | Notes |
|---|---|
zip | US ZIP (provide this OR address) |
address | Any 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).
| Param | Notes |
|---|---|
zip / address | Location (one required) |
crop | Optional crop key — e.g. tomato, peas, kale |
year | Optional 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
| Status | Meaning |
|---|---|
400 | Missing/invalid params (e.g. no zip or address; unknown crop) |
404 | Address could not be geocoded to a US ZIP |
422 | ZIP resolved but is outside the US dataset (non-US / invalid) |
405 | Non-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)
- 2023 USDA Plant Hardiness Zone Map — ZIP listing via PRISM Climate Group, Oregon State University
- NOAA/NCEI 1991–2020 U.S. Climate Normals (freeze/frost normals)
- U.S. Census geocoder & 2023 ZCTA Gazetteer centroids
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