Global geocoders work fine in Mexico — right up until someone official asks which neighborhood. If you run KYC, benefits distribution, regulated coverage zones or census-linked analytics in Mexico, the administrative unit that matters is not the neighborhood string your geocoder returns. It's the colonia as defined by the electoral authority's official polygons (INE), the city block (manzana) and census unit (AGEB) as defined by the national statistics institute (INEGI), and the postal code as defined by SEPOMEX. Those units have IDs, sources and legal standing. A commercial map label has none of the three.
That mismatch is invisible until it isn't: a bank's file reviewer rejects the address because the colonia doesn't match the official registry; a government integration asks for a cvegeo your stack has never heard of; your census join fails because there's nothing to join on.
One call, every official layer
curl "https://api.tlaloc.sh/mx/v1/geo/geocode?address=Av+Paseo+de+la+Reforma+222,+06600+CDMX" \
-H "Authorization: Bearer tlmx_..."
Real response (July 2026), trimmed to what a global geocoder can't give you:
{
"candidates": [{
"lat": 19.4281814, "lng": -99.1617836,
"matched": {"method": "rooftop", "cp_match": 1, "col_match": 1},
"numeracion": {"in_range": true, "interpolated": false},
"marco": {
"colonia": {"nombre": "JUAREZ", "fuente": "ine_bgd"},
"manzana": {"cvegeo": "0901500010803008"},
"ageb": {"cvegeo": "0901500010803", "ambito": "Urbana"},
"municipio": {"nombre": "Cuauhtémoc", "cvegeo": "09015"}
}
}]
}
Three things to notice:
- Provenance is a field.
colonia.fuente: "ine_bgd"means the colonia comes from the INE's official polygon layer — you can put that in an audit trail. - The match method is auditable.
method: "rooftop"withinterpolated: falsetells you the point resolved against an actual parcel with that street number, not a guess along the street. When the engine does interpolate, it says so. cvegeois the foreign key to Mexico's public data. Every INEGI dataset — census, marginalization indexes, economic units — joins on it.neighborhood: "Juárez"joins with nothing.
There's also a reverse endpoint (GET /v1/geo/reverse?lat=..&lng=..) that maps a GPS point to the full framework for 0.02 u, and a batch endpoint for backfills.
Honest numbers, because this is a data product
Median geocoding error is ~14–17 meters; roughly 68–71% of addresses land within 50 m (clean hold-out — real-world messy input can be worse). We publish that instead of claiming "rooftop accuracy" across the board because assigning the correct colonia, block and AGEB doesn't require survey-grade precision — those units are tens to hundreds of meters across — and because you'll find out the truth in your first integration anyway. If you need 2-meter precision, use a surveyor. If you need the official unit, this is built for exactly that.
And when you don't need official units — dropping pins, autocomplete, routing — use a global geocoder. It's cheaper and better at the generic case. This API exists for the queries where "close enough" has no legal meaning.
Privacy: addresses are never stored
Queried addresses are not logged and not cached. In KYC and government work the address is the personal data; every vendor you send it to becomes another processor in your data map. Here it's processed and discarded — store the returned keys (cvegeo, colonia, CP), not the address, and your own database gets cleaner too.
Pricing and quickstart
Prepaid, per query, no subscription (1 unit = $1 MXN ≈ USD 0.05): geocode 0.05 u · reverse 0.02 u · postal-code polygon 0.01 u.
- Create an account, issue a
tlmx_key. GET /v1/geo/geocode?address=...withAuthorization: Bearer tlmx_....- Or skip the code: there's a live playground on the service page, and the same capability is exposed to AI assistants as MCP tools (
geocodificar_direccion,consultar_marco_geografico) athttps://api.tlaloc.sh/mx/mcp— see Tlaloc's MCP server.
Full docs: api.tlaloc.sh/mx/docs · geo service page.