Encontré un par de formas de hacer esto con API basadas en web. Creo que el Servicio Postal de EE. UU. Sería el más preciso, ya que los códigos postales son lo suyo, pero Ziptastic parece mucho más fácil.
Uso de la API HTTP / XML del servicio postal de EE. UU.
De acuerdo con esta página del sitio web del Servicio Postal de EE. UU. Que documenta su API web basada en XML , específicamente la Sección 4.0 (página 22) de este documento PDF , tienen una URL donde puede enviar una solicitud XML que contiene un código postal de 5 dígitos y responda con un documento XML que contenga la ciudad y el estado correspondientes.
De acuerdo con su documentación, esto es lo que enviaría:
http://SERVERNAME/ShippingAPITest.dll?API=CityStateLookup&XML=<CityStateLookupRequest%20USERID="xxxxxxx"><ZipCode ID= "0"><Zip5>90210</Zip5></ZipCode></CityStateLookupRequest>
Y esto es lo que recibirías de vuelta:
<?xml version="1.0"?>
<CityStateLookupResponse>
<ZipCode ID="0">
<Zip5>90210</Zip5>
<City>BEVERLY HILLS</City>
<State>CA</State>
</ZipCode>
</CityStateLookupResponse>
USPS no requiere que se registre con ellos antes de poder utilizar la API, pero, por lo que pude ver, no hay ningún cargo para el acceso. Por cierto, su API tiene algunas otras características: puede realizar la estandarización de direcciones y la búsqueda de códigos postales, así como todo el conjunto de seguimiento, envío, etiquetas, etc.
Usando la API Ziptastic HTTP / JSON ( ya no es compatible )
Actualización: a partir del 13 de agosto de 2017, Ziptastic ahora es una API paga y se puede encontrar aquí
Este es un servicio bastante nuevo, pero de acuerdo con su documentación, parece que todo lo que necesita hacer es enviar una solicitud GET a http://ziptasticapi.com , así:
GET http://ziptasticapi.com/48867
Y devolverán un objeto JSON en la línea de:
{"country": "US", "state": "MI", "city": "OWOSSO"}
De hecho, funciona. Puede probar esto desde una línea de comando haciendo algo como:
curl http://ziptasticapi.com/48867
geocoder.cit.api.here.com/6.2/geocode.json?PostalCode=2400&country=Denmark&app_id={APP_ID}&app_code={APP_CODE}&gen=9
(puede proporcionar las partes de la dirección )