Revenue-based pricing  ·  Our fee is half the savings we project

Ellipse Automation
All posts
databuild-logautomation

The Google Maps 500-Result Limit, and How We Mapped Italy Anyway

·Etienne Chanut

Google Maps hard-caps every search at roughly 500 results. No matter how many matching businesses actually sit inside that radius, the API stops handing results back at the ceiling, silently, with nothing in the response flagging the cut. Build a national database without designing around the Google Maps 500-result limit and you lose most of the country without knowing it.

We ran into this building for a hospitality data company that needed every hotel-type business in Italy in one database, not a sample: the product depended on completeness. A single search per city gets nowhere close: Rome and Milan alone have more hotels, hostels, and B&Bs than the cap allows. We've built database infrastructure under this kind of constraint across a few verticals now, more of it is in case studies.

The short version

  • Google Maps hard-caps every search at roughly 500 results with no warning, which would have silently dropped most of Rome, Milan, and every other dense Italian city from a flat per-city search.
  • We tiled Italy into 6,667 seed cells, ran 171,033 searches across 19 keywords, and auto-subdivided the 32,206 cells that hit the cap until none did.
  • Dedup on Google's place_id collapsed 32.6 million raw result rows into roughly 825,000 unique places, then we validated that count against an independently predicted total per province.
  • Maps alone still wasn't a complete database, so we merged in booking-platform, review-platform, and government registry data on top of the scrape.

Working Around the Google Maps 500-Result Limit

The fix is a six-stage pipeline: tile, subdivide on cap, dedup, enrich separately, validate the total, merge outside sources. Each stage exists because the one before it can fail quietly. The cap itself is bounded and known; what's dangerous is not knowing exactly where you hit it.

How we mapped every hotel-type business in Italy

01

Tile the grid

~1km cells, one search per cell per keyword, checkpointed and resumable

02

Auto-subdivide on cap

any cell that hits ~500 results splits into 4 smaller cells, recursively

03

Dedup on place_id

overlapping cells cost zero accuracy once results collapse to Google's own ID

04

Enrich, separately

emails, decision-makers, and verification run only after dedup is final

05

Validate the count

compare totals against an independently predicted universe per province

06

Merge outside sources

booking platform, review platform, government registries, niche local sites

Tiling the Country and Catching the Cap

We started from 6,667 seed cells, each roughly 1km wide, tiling Italy's populated areas rather than its raw landmass. Cross each cell with the initial 12-keyword search set and you get one row in a resumable queue. Every row is an independent, checkpointed unit: a crash mid-run costs exactly one cell's worth of work, never the whole run.

Cap detection runs on every completed cell: if a cell comes back at or near 500 results, it's almost certainly hiding more, so it splits into 4 smaller cells and each of those gets searched again. This repeats recursively until a cell returns comfortably under the cap. Across the full run, 32,206 cells hit the cap and got subdivided, concentrated exactly where you'd expect: Rome, Milan, and the other dense cities.

Overlap between neighboring cells is intentional, not a flaw to fix. The same hotel can turn up in two or three adjacent cells' results, and that's fine: the next stage exists specifically to collapse it back down.

Dedup First, Enrich Second

Every result carries Google's own place_id, so dedup is a straightforward collapse on that field. Across the full run, that collapsed about 32.6 million raw result rows into roughly 825,000+ unique places, using 171,033 searches across 19 keywords in total.

How the search count grew from 80,000 seed rows to 171,033

The initial 12-keyword search set crossed against 6,667 seed cells produced about 80,000 queue rows. Cap-triggered subdivision, splitting every cell that hit the ~500 ceiling into 4 smaller cells, brought completed queries to 138,827. Partway through the run we widened the keyword list to 19 terms, adding categories the first pass had missed.

Coverage got checked at the administrative level too: all 7,896 of Italy's comuni, the country's actual municipality count, had at least one search run against them.

Enrichment (email finding, decision-maker matching, verification) runs strictly after extraction and dedup are complete, never bundled into the same job.

Watch out

Bundle enrichment into the same job as extraction and one enrichment failure can stall or corrupt data you already collected cleanly. A prospective client we later advised had hit exactly this failure on a commercial scraping tool: their national scrape kept stalling because extraction and enrichment ran as a single job, so any enrichment hiccup, a rate limit, a bad API response, took down the whole run instead of just the enrichment layer.

Validating Against a Predicted Universe

Trusting the scrape's own total is how bad coverage hides. We validated the final count against an independently predicted universe, expected business counts per province, built without reference to what the scrape itself returned. Provinces where the actual count came in far under prediction flagged which cells needed a second look.

Why Maps Alone Was Never Going to Be Complete

Google Maps under-covers some sub-verticals badly enough that Maps data alone isn't a national database, it's a partial one. Cross-checking against a booking platform's own listings put a number on the gap: about 60% of that platform's listings matched to something on Maps overall, and 85% for hotels specifically. Vacation rentals were the weak spot: about 35% of vacation rentals in dense areas had no Google Maps presence at all.

So the pipeline pulls in more than Maps: a booking platform, a review platform, regional government registries, and niche local sites. One review platform alone contributed 32,779 listings and 24,209 direct property email addresses on its own, contact volume that either becomes a list worth mailing or a pile of bounces depending on how it's handled afterward, which is the entire subject of what a million cold emails taught us.

171,033
Total searches, 19 keywords
32,206
Cells that hit the cap and split
32.6M
Raw result rows returned
825,000+
Unique places after dedup

What This Doesn't Solve

Maps data is only as fresh as Google's own index. A business that closed last month but hasn't been flagged yet still shows up as open, phone number and hours intact, with nothing hinting it's gone. The vacation-rental side showed the same gap from the other direction: properties matched cleanly to the booking and review-platform exports, complete with a working direct email and an active listing, while carrying no Google Maps presence at all.

The grid approach isn't free either: it's paid per search, and subdividing every capped cell multiplies that cost fast. It only makes sense when the job genuinely needs the whole universe, not a representative sample. Sampling a country is cheap; mapping one completely is not.

The Takeaway

If you're building a lead database that needs to be genuinely complete rather than "big enough," the 500-result cap isn't the hard part, detecting exactly where you hit it is. Tile smaller than you think you need to, subdivide anything that caps, dedup on the source's own ID rather than a fuzzy match, and never trust a single source's own total as proof of coverage. That discipline is the same one behind building a lead list that actually converts: coverage you can verify beats coverage you assume.

Key takeaways

  • Before scraping any region, test one dense city first: if your result count sits suspiciously near 500, you are being capped, not seeing the market.
  • Detecting a capped cell and auto-subdividing it into 4 smaller cells, recursively, is what recovers the businesses a flat search would silently lose.
  • Overlapping grid cells cost nothing once results are deduplicated on Google's place_id.
  • Running enrichment as a separate stage after extraction and dedup means an enrichment failure can never corrupt data already collected.
  • Even a complete Maps scrape isn't a complete database: about 35% of vacation rentals in dense areas had no Google Maps presence at all.

Common questions

How many results can a single Google Maps search return?

Google hard-caps any single Maps search at roughly 500 results, even when far more matching businesses exist in that area, and it does this silently with no error or warning.

How do you get every business in a country from Google Maps?

Tile the country into a grid of small cells, run one search per cell, and auto-subdivide any cell that hits the ~500-result cap into 4 smaller cells, recursively, until nothing caps out. Then dedup the overlapping results on Google's place_id.

Does Google Maps cover every hotel or vacation rental in a region?

No. In our Italy build, about 35% of vacation rentals in dense areas had no Google Maps presence at all, which is why we merged in booking-platform, review-platform, and government registry data on top of the Maps scrape.

Ready to see the math

Your bottom line has room. We can show you where.

Book a free 30-minute call. We'll look at your refund rate and growth trajectory, then show you the savings we'd project. No pitch deck, no commitment.

Run your numbers with us

Free 30-minute call. The math is yours to keep either way.