WhatsMy.Zone Climate Lookup API

Coordinate-based global hardiness zone and frost-date API for horticulture, agtech, and plant-commerce. A successful lookup returns a USDA-style hardiness zone, 30-year average annual extreme minimum temperature, last spring freeze, first autumn freeze, frost-safe season length, frost-regime classifications, and source metadata.

The current public response contract is API version 5.0. It uses Global Hardiness & Freeze-Safe Data for 1996-2025, last updated 2026-04-28.

Use Cases

The API is designed for plant-care applications, nursery tools, e-commerce garden stores, landscape planning, localized growing guides, planting-window recommendations, and weather-aware shipping decisions for freeze-sensitive products like plants, food, cosmetics, chemicals, medications, and other products.

agtech horticulture hardiness-zone frost-dates geospatial climate-data gardening landscape-design

Choose an Access Path

For direct WhatsMy.Zone access, create or sign in to an account at the Account Dashboard. The dashboard lets you create API keys, review usage, choose a plan, and add allowed-domain or allowed-IP restrictions. Copy the generated key and send it in the x-api-key request header.

If you already use RapidAPI, you can subscribe through the RapidAPI marketplace listing instead. RapidAPI uses its own X-RapidAPI-Key header and gateway endpoint, so you do not need a direct WhatsMy.Zone API key for RapidAPI calls.

Getting Coordinates

The lookup requires decimal latitude and longitude. For most integrations, geocode the customer's city, postal code, address, store location, farm, or shipping destination before calling the API. Common sources include your existing checkout/shipping address data, a maps or geocoding provider, GPS coordinates from a mobile app, or coordinates copied from a mapping tool.

Coordinate format: Send decimal degrees, for example lat=40.7128 and lon=-74.0060. Latitude must be between -90 and 90; longitude must be between -180 and 180. Do not send degrees/minutes/seconds text.

Use enough precision for the decision you are making. City or postal-code centroids are usually enough for broad zone and freeze-window estimates. Address-level or GPS coordinates are better for local shipping-risk checks, farms, nurseries, or customers near mountains, coasts, valleys, or zone boundaries. For privacy, avoid storing full addresses if your integration only needs coordinates.

Endpoint

GET https://whatsmy.zone/api/api-zone.php

Authentication

Direct production requests to https://whatsmy.zone/api/api-zone.php must pass a WhatsMy.Zone API key in the x-api-key request header. Get that key from the Account Dashboard. URL credential parameters are retired and rejected because URLs can appear in logs, analytics, and browser history.

Security requirement: Keep backend keys private. When a key is embedded in browser JavaScript or widget HTML, apply allowed-domain restrictions in the account dashboard. Apply allowed-IP restrictions to backend keys where appropriate.

A small anonymous allowance may be available for evaluation: up to 10 lookups per IP per week with a slower throttle. It is not a production plan. Third-party browser integrations must use a restricted API key.

Marketplace Access

The API is also available through the RapidAPI marketplace. RapidAPI subscribers authenticate with RapidAPI's standard X-RapidAPI-Key header and use the RapidAPI gateway endpoint /rapidapi-zone.php. Do not send a direct WhatsMy.Zone API key to the RapidAPI endpoint.

RapidAPI plans mirror the public self-service quotas: BASIC includes 100 requests per month, PRO includes 1,100, ULTRA includes 2,500, and MEGA includes 15,000. Higher-volume, dedicated infrastructure, custom rate-limit, or negotiated service-term requests should use the contact page.

Browser & Server Security

  • Browser apps and widgets — Add allowed domains for any site where your key is embedded. Enter the complete website origin, such as https://example.com. HTTP and HTTPS are treated as separate origins. Widget embed keys remain visible to the embedding page by design, so domain restrictions are required.
  • Server-to-server calls — Use the x-api-key header from your backend. If you set allowed IPs, requests without a browser origin must come from one of those IP addresses.
  • URL key parameters — Credentials in URL query parameters are rejected because URLs can appear in logs, analytics, and browser history. Send API keys only with the x-api-key header.
  • Map tiles — Tile files are protected from direct hotlinking. Use the official widgets for embedded maps; they request signed tile access for authorized domains automatically.

Quickstart

First create or copy a direct API key in the Account Dashboard. Then replace YOUR_API_KEY with that value before running these examples. Do not include the key in the URL.

Try the API in Postman

Fork the public WhatsMy.Zone collection into your Postman workspace, store your API key in Postman Local Vault as wmz-api-key, and send the included climate lookup request.

cURL

curl -H "x-api-key: YOUR_API_KEY" "https://whatsmy.zone/api/api-zone.php?lat=40.7128&lon=-74.0060"

JavaScript

const response = await fetch( "https://whatsmy.zone/api/api-zone.php?lat=40.7128&lon=-74.0060", { headers: { "x-api-key": "YOUR_API_KEY" } } ); if (!response.ok) { throw new Error(`WhatsMy.Zone API returned ${response.status}`); } const climate = await response.json(); console.log(climate.zone, climate.last_freeze_day, climate.first_freeze_day);

Python

import requests response = requests.get( "https://whatsmy.zone/api/api-zone.php", params={"lat": 40.7128, "lon": -74.0060}, headers={"x-api-key": "YOUR_API_KEY"}, timeout=10, ) response.raise_for_status() climate = response.json() print(climate["zone"], climate["last_freeze_day"], climate["first_freeze_day"])

Request Parameters

Name Location Required Description
lat Query Yes Latitude in decimal degrees from -90 to 90.
lon Query Yes Longitude in decimal degrees from -180 to 180.
x-api-key Header Production API key for authenticated integrations. Never place credentials in a URL.

Response Format

A successful land lookup returns a JSON object like this. Freeze-day values are day-of-year numbers. Anonymous-only fields such as anonymous and calls_remaining are omitted when a valid API key is used.

{ "api_version": "5.0", "lat": 40.7128, "lon": -74.006, "temp_f": 3.9, "zone": "7a", "source": { "provider": "ECMWF (ERA5) & Copernicus (GLO-90 DEM)", "dataset_name": "Global Hardiness & Freeze-Safe Data", "standard": "USDA 30-Year Normal + 90/10 Percentile Freeze Dates", "years": "1996-2025", "last_update": "2026-04-28" }, "last_freeze_day": 103, "first_freeze_day": 312, "safe_days": 209, "frost_regime": "seasonal" }

Conservative Frost-Safe Window

The seasonal frost dates are designed as a safer planning guide rather than a risky average. last_freeze_day uses the 90th percentile of annual last spring-freeze dates, while first_freeze_day uses the 10th percentile of annual first autumn-freeze dates. The safe_days value is the window between those two conservative boundaries.

In practical terms, the spring boundary is later than a typical last-freeze date and the autumn boundary is earlier than a typical first-freeze date. This intentionally leaves a safety margin for planning sensitive plantings, harvests, and shipments. It reduces risk but is not a local forecast or a guarantee against unusual weather or microclimate effects.

Response Fields

  • api_version — API response version, currently 5.0.
  • lat / lon — The returned coordinate values used for the lookup.
  • temp_f — 30-year average annual extreme minimum temperature in Fahrenheit, rounded to one decimal place.
  • zone — USDA-style hardiness zone calculated from temp_f.
  • source — Data provider, dataset, standard, year range, and last update metadata.
  • last_freeze_day / first_freeze_day — Conservative 90th-percentile spring and 10th-percentile autumn freeze boundaries as day-of-year values for seasonal climates.
  • safe_days — Number of frost-safe growing days between the last spring freeze and first autumn freeze.
  • frost_regime — Overall frost classification such as seasonal, tropical, permafrost, irregular, or occasional.
  • anonymous / calls_remaining — Returned only for anonymous requests to show free-call status.

Status Codes & Errors

Status Meaning
200 OK Request succeeded. Coordinates without a dataset cell return a JSON message beginning with NoData.
400 Bad Request Coordinates are missing or invalid, or a retired URL credential parameter was supplied.
401 Unauthorized The supplied API key is invalid.
403 Forbidden The key is inactive or suspended, a domain or IP restriction rejected the request, or the anonymous evaluation policy rejected it.
429 Too Many Requests The monthly quota or per-request interval was exceeded. Interval responses include retry_after.

Usage Limits

Authenticated keys default to a minimum interval of one second between requests from the same device unless a custom key setting applies. Current own-domain plans are Free with 100 API calls per month, Starter with 1,100 calls, Growth with 2,500 calls, Business with 15,000 calls, and Enterprise with negotiated limits. Check the Account Dashboard for current pricing, usage, and key-specific restrictions. RapidAPI marketplace plans are billed and enforced by RapidAPI, with the same public monthly quota levels.

Machine-Readable Contract

The canonical OpenAPI 3.1 specification is published at a stable URL for API tools, documentation imports, and directory listings. Its URL remains stable while the info.version field records the response contract version.

A RapidAPI-specific OpenAPI 3.0 specification is also published for the marketplace gateway endpoint. It describes RapidAPI authentication and /rapidapi-zone.php; the canonical direct API contract remains /openapi.yaml.

Versioning & Changelog

Current contract: 5.0. Backward-compatible documentation additions and clarifications retain the current response version. Breaking request or response changes require a documented migration path and an updated contract version.

  • 2026-06-04 — Published the RapidAPI marketplace listing with a dedicated gateway endpoint and RapidAPI-specific OpenAPI import file.
  • 2026-06-02 — Published the canonical OpenAPI 3.1 contract and expanded developer quickstarts.
  • 2026-06-01 — Completed header-only credential transport. Retired URL API key parameters now return 400 Bad Request.
  • 2026-04-28 — Updated Global Hardiness & Freeze-Safe Data for the 1996-2025 climate period.

Support & Policies

For integration questions, contact [email protected] or use the contact page. Use of the API is governed by the Terms & Conditions and Privacy Policy. Review the methodology page before using climate results in customer-facing recommendations.