ActorStack.dev

How to extract every business Google Maps publishes in an area

A walkthrough of the two-pass approach: classify the area first so you know what it costs, then extract only the tiles that need it.

By Oswaldo Carabano9 min read

Short answer

Google caps any single Maps query at about 200 results, so extracting every business in an area is a tiling problem rather than a pagination one. The approach is two passes: a census that classifies one request per 1-degree cell as dense, border, foreign, exhausted or empty, and then a quadtree pass that splits only the saturated cells until each returns under the cap. Run the census alone with `censusOnly` to learn what an area costs before spending anything — Venezuela is 180 cells, classified in 172 requests in about 20 seconds, and showed that only 11.7% of the country needed deeper work.

Key points

  • A single Maps query returns about 200 results at most, so the whole approach is tiling rather than paging.
  • Pass 1 is one request per 1-degree cell and classifies each as dense, border, foreign, exhausted or empty.
  • Pass 2 splits only the saturated cells into four and retries, level by level, until every tile is under the saturation threshold.
  • Search terms barely overlap — 5.5% measured across 30 of them — so each additional term is close to a full extra pass in time and cost.
  • A residential proxy is required, not recommended: Google returned HTTP 302 to Apify's own IP ranges when measured on 3 September 2026.
On this page8 sections

“All the restaurants in Miami” sounds like one query. It is not, and understanding why is most of what it takes to run this well.

It is a tiling problem, not a pagination problem

Google caps any single Maps query at about 200 results. That limit is on the query rather than on a page, so paging, offsetting or re-asking does not get past it. The only thing that returns more businesses is asking about a smaller area — why the cap works that way.

So the algorithm is: split the map into tiles, and split again wherever a tile comes back full, until every tile returns under the cap.

Step 1 — run the census first

censusOnly: true runs one request per 1-degree cell and extracts no businesses at all. It tells you which parts of the area are dense, which are empty, which are already exhausted and which belong to a neighbouring country.

Step 2 — choose search terms, carefully

Terms go in the country's language: English in the US and Canada, Spanish elsewhere. And they barely overlap — measured at 5.5% across 30 of them — so each term you add is close to a full extra pass in both time and cost rather than a marginal addition.

Two terms is roughly twice the run. That is the single biggest lever on what a job costs.

Step 3 — set the area and the brakes

country supplies a bounding box, the country bias and the language. bbox overrides the box so you can do one city or one batch of a large country. Two independent brakes stop a run: maxPlaces caps delivered businesses and requestBudget caps requests. Whichever is reached first ends the run, and the summary says which it was.

Step 4 — run the extraction

input.json — Miami restaurants, capped
{
  "country": "US",
  "categories": ["restaurant"],
  "bbox": { "lat_min": 25.70, "lng_min": -80.32, "lat_max": 25.85, "lng_max": -80.13 },
  "maxPlaces": 1000
}

A residential proxy is a requirement rather than a tuning option: Google returned HTTP 302 to Apify's own IP ranges when measured on 3 September 2026, so a direct run from the platform returns nothing at all.

Reading the output

One row per business, deduplicated by feature_id across runs as well as within one. Name, address, coordinates and place_id are at 100% in every market measured; phone, hours, rating and website vary enormously by market and vertical — 96.7% in Toronto, 41.4% in a remote region.

Then read RUN_SUMMARY, because the row count cannot tell you whether the area was actually covered — the four fields that can.

What a run costs

$0.001 per delivered business on the Free plan, $0.0008 on Bronze, $0.0006 on Silver and $0.0005 on Gold and above. Phone, opening hours, website, rating, categories and coordinates are included at that price — there are no add-on charges for applying a filter or pulling place details, and the tiling overhead is absorbed rather than billed. Failed tiles are never charged.

Four mistakes that waste a run

Skipping the census. It costs almost nothing and it is the only way to know what the real run costs before starting it.

Adding search terms casually. At 5.5% overlap, each one is close to a whole extra pass.

Trying a whole country in one run. It does not fit in the run time limit. Batch it with a bbox and a requestBudget each — batches are resumable and re-running a finished one spends almost nothing.

Reading the row count as coverage. A truncated census still returns rows. The run summary is what says whether they cover the area.

Frequently asked questions

Why can't I just page past 200 results?
Because Google caps a single Maps query at roughly 200 results regardless of how you ask. Getting the whole area means splitting it geographically until each piece returns fewer than the cap, which is a different algorithm from pagination.
How do I find out what an area costs before running it?
Run `censusOnly`. It is one request per 1-degree cell and produces a classification of the area rather than any business data. Venezuela is 180 cells, classified in 172 requests in about 20 seconds, and showed only 11.7% needed deeper work.
Do I need a Google API key?
No API key, no login, no cookies and no browser. You do need a residential proxy: Google returned HTTP 302 to Apify's own IP ranges when measured on 3 September 2026, so a direct run from the platform returns nothing.
Can I scrape a whole country in one run?
Not in one run, because of the run time limit rather than the cost. Run the census, then run extraction in batches with a `requestBudget` and a `bbox` each. Batches are resumable: a second run of the same Venezuelan census needed 8 requests instead of 180.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Operator claimchecked 9 Sept 2026
    Google Maps Business Scraper — Actor README and input schemaActorStack / Apify Store
  2. Platform docschecked 9 Sept 2026
    Nearby Search (New) — Places APIGoogle Maps Platform
  3. Site declarationchecked 9 Sept 2026
    google.com/robots.txtGoogle
Overhead view of a suburban neighbourhood, showing house plots and the street grid between them.
Google MapsExplainer

The 200-result cap

The cap is per query, not per page, so the answer is geographic rather than paginated. What saturation means, why the threshold is 190, and how deep the splitting goes.

6 min
Paper receipts and printed documents arranged on a desk beside office stationery.
Google MapsExplainer

API versus scraping

Google's own API is the right tool for looking up a place. It is a different proposition when the question is every business in a region, and the difference is structural rather than about price alone.

6 min
Overhead view of a suburban neighbourhood, showing house plots and the street grid between them.
Google MapsMeasured

The census pass

The first pass extracts no businesses at all. It tells you which parts of an area are dense, which belong to a neighbouring country and which are empty — before you spend anything.

6 min