Blog·Craft·

95 million front doors

GET /address takes a US address as one string and returns whether it exists in official government records, plus the standardized parts.

Pass the address the way a form gave it to you.

GET /address/152 200th Avenue, Ellsworth MN
{
  "address": "152 200th Avenue, Ellsworth, MN 56129",
  "valid": true,
  "registered": true,
  "number": "152",
  "street": "200th Avenue",
  "unit": null,
  "city": "Ellsworth",
  "district": "27105",
  "district_name": "Nobles",
  "state": "MN",
  "state_name": "Minnesota",
  "postal": "56129",
  "country": "US",
  "country_name": "United States",
  "latitude": 43.506772,
  "longitude": -96.073118
}

valid is whether the string parses as a US address. registered is whether that address exists in official government records, about 90 million points. The rest of the bag is the standardized line, the county, the ZIP, and the registry coordinates. Junk still returns 200 with valid false. A well-formed address the records do not cover leaves registered null.

Two fields, two questions

A signup form that only asks "does this look like an address" lets through streets that were never built. registered is the second check, the one that matches what 911 systems already keep. Units pass through. registered reflects the building.

Try it

Hit /address with a house you can see on a map. Then hit it with one you made up. The records already knew.