Geocode an address
GET /v1/geocode
| Parameter | Default | Description |
|---|---|---|
q | Required | Nonblank address text, at most 256 bytes. URL-encode the value. |
limit | 5 | Maximum number of results, from 1 to 20. |
Example request
curl 'https://geo.mke.dev/v1/geocode?q=1421+n+humboldt+ave&limit=1'
Open this request on this server.
Matching normalizes capitalization, punctuation, directions, street-type aliases, and numeric or spelled ordinal street names. City, state, ZIP code, and unit constraints are respected when supplied. Address points take precedence over parcel and street-range fallbacks.
Small street-name typos or omitted components can receive lower confidence. A different house number or explicitly conflicting direction is not substituted. A conflicting street type may be corrected for an exact street-name match with a house number, after strict matches are exhausted. For example, 1421 N Humboldt Blvd resolves to 1421 N Humboldt Ave in the county data.
Reverse geocode a coordinate
GET /v1/reverse
| Parameter | Default | Description |
|---|---|---|
lat | Required | Finite WGS84 latitude, from -90 to 90. |
lon | Required | Finite WGS84 longitude, from -180 to 180. |
limit | 1 | Maximum number of results, from 1 to 20. |
radius | 100 | Nearby-search radius in meters, from 1 to 1000. |
Example request
curl 'https://geo.mke.dev/v1/reverse?lat=43.05&lon=-87.90&radius=100'
Open this request on this server.
Lookup uses the first available tier:
- Address points inside a containing building.
- Address points associated with a containing parcel, or a representative point inside the parcel.
- Nearby address points within the search radius.
- A projection onto a nearby street centerline, without inventing a house number.
The radius limits nearby fallbacks, not addresses associated with a containing building or parcel. Results within the selected tier are ordered by confidence and distance; a larger limit does not add lower-accuracy tiers. Reverse results include distance_m, the distance in meters from the input coordinate to the returned point.
Response format
Successful geocoding requests return HTTP 200 with Content-Type: application/geo+json and a GeoJSON FeatureCollection. Coordinates are WGS84 in [longitude, latitude] order.
Example feature collection
The parcel identifier below is illustrative; results depend on the loaded data snapshot.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-87.8985732478243, 43.0486198314883]
},
"properties": {
"label": "1421 N HUMBOLDT AVE, Milwaukee, WI 53202",
"house_number": "1421",
"street": "N HUMBOLDT AVE",
"city": "Milwaukee",
"state": "WI",
"postcode": "53202",
"taxkey": "example-parcel-id",
"accuracy": "address_point",
"confidence": 1.0
}
}
]
}
Every feature includes the properties shown above. Missing source text is an empty string; house_number is null for unnumbered street or parcel results. An additional unit property appears when present. Separate units remain separate results; duplicate records for the same address are deduplicated.
| Accuracy | Meaning |
|---|---|
address_point | County address-point coordinates, including points found through building or parcel containment. |
parcel | Representative interior point of a parcel, not a surveyed address point. |
street_interpolated | Estimated location along a street centerline using address ranges. |
street | Representative street location or nearest centerline projection, not a precise address. |
confidence is a ranking heuristic, not a calibrated probability or the county locator's score. Interpolated results do not establish that an address or building exists. This API covers Milwaukee County; it is not a nationwide address, intersection, or point-of-interest search service.
No match
No match is a successful HTTP 200 response with an empty feature list:
{"type":"FeatureCollection","features":[]}
Errors and HTTP methods
Use GET with query parameters. HEAD is also supported and returns no response body. Error responses use Content-Type: application/json.
400 Bad Request: missing, invalid, duplicate, or unknown query parameters.404 Not Found: unknown route.405 Method Not Allowed: unsupported HTTP method.500 Internal Server Error: geocoding failed.
Example: a request with limit=0 returns HTTP 400:
{"error":"limit must be between 1 and 20"}
Health check
GET /health returns HTTP 200 with Content-Type: application/json once the local indexes are ready:
{"status":"ok"}