You Can Stop Renting Your Geocoder
Geocoding is a rental whose asset went on sale. Overture's 2026-09-23.1 release ships 474,000,000 address features, 81,455,423 places and 4,688,229 administrative divisions under open licenses. Every workflow that reaches those facts for a living, ride-share dispatch, delivery confirmation, logistics depots and CRM deduplication, still pays a per-call fee to a provider for the same class of answer.
Our position, stated so a skeptic can aim at it: for place-level and division-level geocoding, building on Overture data already beats renting, and the street-level exception has a documented workaround. Two community projects have shipped working geocoders on this data. What a per-call fee still buys is uptime capacity and a support queue, worth paying for a year while you migrate, and not a reason across ten.
The standard rebuttal: providers curate, refresh and stand behind their data, and a free table does none of that. Agreed, for house numbers on a street. For a storefront point, a city boundary or a neighborhood polygon, the question is whether free data answers the call, and the rest of this post works through where it does.
What the per-call fee actually buys
Ride-share, delivery, logistics and CRM-dedup pricing all end at the same act: matching a string to a point on Earth. That match is arithmetic against a table of facts. When a CRM asks whether 14 Rue des Lilas and 14 rue des LILAS are the same customer, the underlying work is a lookup. A commercial geocoder bundles the lookup with curation, freshness, capacity and an SLA, four real services, and the invoice does not separate them. The facts now come separately, so the bundle deserves a second read.
One of the four services is genuinely hard to replicate and the other three are work. Curation is the editorial layer that knows a gas station moved. Freshness is a live feed of the world changing. Capacity, by contrast, is machines, and a table you can query yourself removes the part of the bill that paid for the privilege of querying somebody else's.
This is not an argument that every shop should run its own geocoder next sprint. It is an argument that the facts stopped being the moat, and the rest of the invoice should be re-priced in your head accordingly.
Places and divisions are the honest offer in this release
Overture publishes its data by theme, and two of them carry a geocoder's weight right now. On release 2026-09-23.1, the places theme holds 81,455,423 records, each with names in several forms, websites, phones, an optional brand, an addresses[] that arrives as freeform text with locality, postcode, region and country fields, a taxonomy with a primary category, and a confidence value between 0 and 1. The divisions theme holds 4,688,229 features across county, locality, neighborhood, macrohood and microhood subtypes, which is the material for answering "which city, which region, which neighborhood is this".
We loaded a sample to see what answering costs. This query, run with DuckDB 1.5.6 on 2026-10-11:
INSTALL spatial; INSTALL httpfs; LOAD spatial; LOAD httpfs;
SELECT count(*)
FROM read_parquet(
's3://overturemaps-us-west-2/release/2026-09-23.1/theme=places/type=place/*.parquet',
hive_partitioning = 1)
WHERE bbox.xmin >= -121.0 AND bbox.xmax <= -119.6
AND bbox.ymin >= 38.7 AND bbox.ymax <= 39.5;
returned 28,166 places in that Tahoe bounding box in 2.77 seconds. The pruning happens on the bbox struct column before any geometry is touched, so most of the release never leaves S3. In the same sample, 896 places, 3.2 percent, carried no taxonomy.primary, a minority small enough to log quietly instead of to fear.
So the honest current offer reads like this. Forward geocode a business or a place query to a point, thresholded by confidence. Reverse geocode a coordinate to the administrative ladder. What does not resolve from Overture alone yet is the house number on a street, and that gap has a name and a size.
The addresses theme is 474 million features deep and still alpha
The addresses theme exists, and it is large: 474,000,000 features on release 2026-09-23.1. It is also marked alpha, which the Overture project means as a warning rather than a formality. Two consequences follow. The schema can still move before general availability, and the records carry no GERS IDs yet, so there is no stable key to join on. A join key is the difference between "the row changed upstream" and "our pipeline broke", and alpha data can only offer the second.
Until the theme graduates, a geocoder built on Overture answers at these two resolutions: a business to a point, a coordinate to a city or region. The street in between comes from elsewhere. The honest sell is place-level and division-level geocoding, with the street-level promise held back until the data earns it.
Two community geocoders, and what they prove and don't
The first implementation is pelias-overture, a Pelias importer in MIT-licensed Node.js that streams Overture GeoParquet into Elasticsearch through the Pelias dbclient. DuckDB does the reading, addresses with a bounding box pushed down into the query, places filtered by a minimum confidence the README sets at 0.7 by default. The design decision worth stealing is its posture toward overlap: it runs additively to OSM venues and never silently disables another source, so the Overture import becomes one more feeder into an existing geocoder rather than a replacement decision made all at once. Status: alpha, with addresses and places working end to end.
The second is overture-geocoder, Rust on Cloudflare Workers with R2 for storage and SQLite shards with FTS5 full-text search, generated from Overture's S3 parquet with DuckDB. Production coverage is divisions-first, countries through localities, served from a forward /search, a bbox-based /reverse that returns bbox-confidence estimates, and a GERS id lookup with release-pinned locators. The places v2 path is written and paused rather than shipped, a restraint worth noticing in an ecosystem that usually ships first.
That project also publishes a benchmark, geocoder-tester global city cases, and we owe you its framing before its numbers. It is that project's own harness, their test cities, their run. We have not rerun it and we are not adopting it as our result. Reported as published:
| Geocoder (their harness) | Top-1 city match | p50 latency |
|---|---|---|
| overture-geocoder | 80% | 77 ms |
| Nominatim | 67% | 65 ms |
| Photon | 67% | 479 ms |
Five limits, each with its workaround
- The addresses theme is alpha, so street-level geocoding still needs another source. Mix OpenStreetMap in for the street numbers until addresses reaches general availability, in the same additive posture pelias-overture already takes, and lean on national registries where you operate, France's Base Adresse Nationale for instance.
- Addresses carry no GERS IDs. Treat address rows as ephemeral until ids arrive: key your pipeline on your own record identity and put stable joins in place only where a stable id exists. Places already carries one, so put the stable joins there and nowhere premature.
confidenceis a per-place estimate, and the threshold is a product decision, not a property of the data. Plot the distribution for your own query mix before you pick a cutoff; pelias-overture's default of 0.7 is somebody else's decision, borrowed. Where the stakes are high, keep candidates and disagree with your own geocoder on purpose, the way the census pipeline post runs its reverse-check loop.- Reverse geocoding on places is nearest-POI, not address interpolation. The coordinate between two storefronts has no truth in this data to interpolate from. Return the divisions ladder as the administrative answer, label the place hit as the nearest business, and ship neither presented as a street address.
- Self-hosting moves the pager to you. Cache what you query twice, pin the release id in your pipeline because releases come monthly and 2026-09-23.1 will not be the schema of record forever, and keep a managed provider behind an overflow switch until your own numbers say the switch never flips.
Rent the street numbers, own the rest
If your workload is businesses and boundaries, cache the answers you query twice and start the migration on one region, the way we started on one Tahoe bounding box. If half of your traffic is house numbers, stay rented on exactly that traffic, own the rest, and read the monthly release notes watching for the day the addresses theme stops saying alpha. The wrapper around geocoding is on its way to free. The judgment about your own query mix is not, and the per-call fee was never really for the facts anyway.
AngoraTek builds data pipelines and self-hosted geospatial services, pager included. Talk to us when you want a second pair of hands deciding which parts to own.Thanks for reading this far. If this sounds like the problem you're wrestling with, tell us about it. A principal reads every message.
Start a conversation