Last updated
Send the coordinate to a lookup API that maps it to a zone. A single HTTP GET to
https://coords.zone/api/v1/zone
with lat
and lng
query parameters returns the USDA
hardiness zone for that point — for example, latitude 42.36, longitude −71.06 (Boston,
Massachusetts) is USDA zone 6b. No API key is required to try it.
curl "https://coords.zone/api/v1/zone?lat=42.36&lng=-71.06"
{
"lat": 42.36,
"lng": -71.06,
"usda_zone": "6b",
"local_zone": null
}
usda_zone
is the USDA zone, from 1a
(coldest) to 13b
(warmest). local_zone
is the equivalent in the country's own
hardiness system when it has one — it is null
in the United
States, because the USDA scale already is
the local system. See
hardiness zones outside the US
for coordinates where it is populated.
You can run that curl
without signing up. Unauthenticated
requests are capped at 100 per month per IP address; an
API key
raises that to 1 000 per month at no cost.
It is a plain GET returning JSON, so there is no SDK to install.
const res = await fetch(
"https://coords.zone/api/v1/zone?lat=42.36&lng=-71.06"
);
const { usda_zone } = await res.json();
console.log(usda_zone); // "6b"
import requests
r = requests.get(
"https://coords.zone/api/v1/zone",
params={"lat": 42.36, "lng": -71.06},
)
print(r.json()["usda_zone"]) # 6b
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://coords.zone/api/v1/zone?lat=42.36&lng=-71.06"
A USDA hardiness zone describes the average annual extreme minimum temperature at a location — the coldest night of a typical winter, averaged over 30 years. It is a measure of winter cold only. It says nothing about summer heat, rainfall, humidity, or soil, which is why two places in the same zone can still suit very different plants.
Each numbered zone spans 10 °F (5.6 °C), and the a
and b
halves split
that into 5 °F (2.8 °C) bands. Zone 6b, from the example above, means the coldest night of
an average winter falls between −5 °F and 0 °F (−20.6 °C and −17.8 °C).
| Zone | Average annual minimum (°F) | Average annual minimum (°C) |
|---|---|---|
| 5a | −20 to −15 | −28.9 to −26.1 |
| 5b | −15 to −10 | −26.1 to −23.3 |
| 6a | −10 to −5 | −23.3 to −20.6 |
| 6b | −5 to 0 | −20.6 to −17.8 |
| 7a | 0 to 5 | −17.8 to −15.0 |
| 7b | 5 to 10 | −15.0 to −12.2 |
The full scale runs 1a (below −60 °F / −51.1 °C) to 13b (above 65 °F / 18.3 °C) on the same 5 °F step.
If you want the number the classification came from rather than the label,
/api/v1/climate
returns it directly:
curl "https://coords.zone/api/v1/climate?lat=42.36&lng=-71.06"
{
"lat": 42.36,
"lng": -71.06,
"min_temp": -19.3,
"min_temp_f": -2.7,
"max_temp": 23.2,
"max_temp_f": 73.8,
"frost_last_doy": 95,
"frost_first_doy": 313
}
min_temp_f
is −2.7 °F — inside the −5 °F to 0 °F band, which is how the same coordinate
classifies as 6b. The USDA scale is defined in Fahrenheit, so both units are returned:
min_temp
and max_temp
are °C, min_temp_f
and max_temp_f
are °F.
Zones are computed from ERA5-Land, the highest-resolution reanalysis in ECMWF's ERA5 family, over decades of winter records rather than a single cold year. Coverage is global and land-based, so the same call works for a coordinate in any country — not just the United States. It rests on the same climate measure the official USDA map does, but it is computed independently and is not a reproduction of that map.
We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
© 2026 coords.zone