Asking a user to type their city and state when they've already typed a ZIP code is busywork. A postal code already implies the place — you just need to resolve it.
Look up a postal code
The path is /postal/{country}/{code} — an ISO alpha-2 country code and the postal/ZIP code:
curl https://countries.dev/postal/US/90210[
{
"countryCode": "US",
"postalCode": "90210",
"placeName": "Beverly Hills",
"admin1": { "name": "California", "code": "CA" },
"admin2": { "name": "Los Angeles", "code": "037" },
"latitude": 34.0901,
"longitude": -118.4065,
"accuracy": 4
}
]Autofill a checkout
Resolve the city and state the moment someone finishes the ZIP field:
const [place] = await fetch(`https://countries.dev/postal/US/${zip}`).then((r) => r.json());
if (place) {
cityInput.value = place.placeName;
stateInput.value = place.admin1.name;
}Coverage
Postal data comes from GeoNames, which covers roughly 120 countries — strong for the US, UK, Germany, France, Japan and most of Europe, thinner or absent for a few (Ireland and Israel, for example). Check which countries are covered:
curl https://countries.dev/postal/countriesA code with no match returns a 404, so treat that as "unknown postal code" rather than an error.
Browse and search every code on the postal code API page, or read the docs.
Written by
Dov Azencot
At
Wed Jun 24 2026