Last updated
Machine-readable spec at /openapi.yaml (OpenAPI 3.0.3 — import directly into RapidAPI, Postman, or any LLM tool), or browse the Postman collection .
/api/v1/zone
Returns the hardiness zone — and localized country zone where available — for any GPS coordinate.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| lat | query | number | required | Latitude, −90 to 90 |
| lng | query | number | required | Longitude, −180 to 180 |
Pass your API key as a Bearer token in the
Authorization
header.
Get a key at Dashboard.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://coords.zone/api/v1/zone?lat=48.14&lng=11.58"
Runs against the live API — the request above without the key, which this endpoint answers all the same.
{
"usda_zone": "7b",
"local_zone": "Z7b",
"lat": 48.14,
"lng": 11.58
}
| Field | Type | Description |
|---|---|---|
| usda_zone | string | null | USDA zone 1a–13b. Null over international waters or other areas outside coverage. |
| local_zone | string | null | Country-specific zone. Null when no local data for that country. |
| lat | number | Echo of input latitude |
| lng | number | Echo of input longitude |
| Status | Cause | Body |
|---|---|---|
| 401 | Invalid API key | {"error": "Invalid API key"} |
| 429 | Rate limit exceeded (10 req/sec, per IP unauthenticated or per key authenticated) or free tier (1 000 req/month) exceeded — unsubscribed or canceled account | {"error": "..."} |
/api/v1/country
Returns the country and its available hardiness zones for any GPS coordinate.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| lat | query | number | required | Latitude, −90 to 90 |
| lng | query | number | required | Longitude, −180 to 180 |
Pass your API key as a Bearer token in the
Authorization
header.
Get a key at Dashboard.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://coords.zone/api/v1/country?lat=48.14&lng=11.58"
Runs against the live API — the request above without the key, which this endpoint answers all the same.
{
"name": "Germany",
"iso_code": "DE",
"zones": ["Z1a", "Z1b", "Z2a", "Z2b", "Z3a", "Z3b", "Z4a", "Z4b", "Z5a", "Z5b", "Z6a", "Z6b", "Z7a", "Z7b", "Z8a", "Z8b", "Z9a", "Z9b", "Z10a", "Z10b", "Z11a", "Z11b", "Z12a", "Z12b", "Z13a", "Z13b"],
"lat": 48.14,
"lng": 11.58
}
| Field | Type | Description |
|---|---|---|
| name | string | null | Country name for the coordinate. Null outside all known countries. |
| iso_code | string | null | ISO country code (alpha-2, alpha-3 fallback). Null outside all known countries. |
| zones | array<string> | Country's local zones if it has its own system (currently: Australia, the UK, South Africa, Germany, Sweden, Norway); otherwise the full USDA range (1a–13b). |
| lat | number | Echo of input latitude |
| lng | number | Echo of input longitude |
| Status | Cause | Body |
|---|---|---|
| 401 | Invalid API key | {"error": "Invalid API key"} |
| 429 | Rate limit exceeded (10 req/sec, per IP unauthenticated or per key authenticated) or free tier (1 000 req/month) exceeded — unsubscribed or canceled account | {"error": "..."} |
/api/v1/climate
Returns the raw climate inputs behind the zone classification, for any GPS coordinate.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| lat | query | number | required | Latitude, −90 to 90 |
| lng | query | number | required | Longitude, −180 to 180 |
Pass your API key as a Bearer token in the
Authorization
header.
Get a key at Dashboard.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://coords.zone/api/v1/climate?lat=48.14&lng=11.58"
Runs against the live API — the request above without the key, which this endpoint answers all the same.
{
"min_temp": -14.5,
"min_temp_f": 5.9,
"max_temp": 19.5,
"max_temp_f": 67.1,
"frost_last_doy": 96,
"frost_first_doy": 310,
"lat": 48.14,
"lng": 11.58
}
| Field | Type | Description |
|---|---|---|
| min_temp | number | null | Average annual extreme minimum temperature (°C), the statistic USDA zones are derived from. Null over international waters or other areas outside coverage. |
| min_temp_f | number | null |
min_temp in °F.
|
| max_temp | number | null | Average warmest-month mean temperature (°C). Null outside coverage. |
| max_temp_f | number | null |
max_temp in °F.
|
| frost_last_doy | integer | null | Average day-of-year of the last spring frost, 1–365 on a non-leap numbering: 1 is Jan 1, 60 is Mar 1, 365 is Dec 31. Resolve it against a non-leap year. The value is a 30-year average, so it names no year of its own. Null outside coverage. |
| frost_first_doy | integer | null | Average day-of-year of the first autumn frost, on the same numbering. Null outside coverage. |
| lat | number | Echo of input latitude |
| lng | number | Echo of input longitude |
| Status | Cause | Body |
|---|---|---|
| 401 | Invalid API key | {"error": "Invalid API key"} |
| 429 | Rate limit exceeded (10 req/sec, per IP unauthenticated or per key authenticated) or free tier (1 000 req/month) exceeded — unsubscribed or canceled account | {"error": "..."} |
/mcp
The same three lookups as MCP tools, so an agent can call them directly. Setup instructions for Claude Code, Claude Desktop, Cursor, and other clients are on the MCP server page.
| Tier | Rate limit | Monthly quota |
|---|---|---|
| No key | 10 req / sec | 100 req / month |
| Free (API key) | 10 req / sec | 1 000 req / month |
| Paid (API key) | 10 req / sec | Unlimited |
Exceeding the rate limit or the monthly free tier quota both return 429. See
pricing
for what the paid tier costs and how it is billed.
Successful responses report where you stand in the monthly quota:
X-RateLimit-Limit
(the quota that applies, 100 without a key or 1 000 on the free tier),
X-RateLimit-Remaining
(what is left after this request), and X-RateLimit-Reset
(a Unix timestamp for when the quota resets). Paid accounts have no
ceiling, so they get none of the three. A 429
carries only X-RateLimit-Reset, the time to retry after.
The MCP endpoint does not send these headers.
Countries with their own hardiness zone system (see
local_zone
above). These are the complete value lists — the same array
/api/v1/country
returns in zones.
| Country | ISO | System | Values |
|---|---|---|---|
| Australia | AU | ANBG (7-band) | 1–7 |
| Germany | DE | Z-prefixed USDA | Z1a–Z13b |
| Norway | NO | Scandinavia (8-band) | 1–8 |
| South Africa | ZA | 5-band | 1–5 |
| Sweden | SE | Scandinavia (8-band) | 1–8 |
| United Kingdom | GB | UK hardiness (9-tier) | H7, H6, H5, H4, H3, H2, H1c, H1b, H1a |
| All other countries | — | USDA | 1a–13b |
The Scandinavian scale runs 1 (mildest) to 8 (harshest) — the opposite
direction from USDA, where higher is warmer. Germany's system is a
straight relabel of USDA, so Z7b
means exactly what USDA 7b
means; the
rest are approximations derived from the same climate data, not
licensed reproductions of each country's official system.
We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
© 2026 coords.zone