Google Maps Business Scraper avatar

Google Maps Business Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Google Maps Business Scraper

Google Maps Business Scraper

Finds businesses Google's English-only search misses -- term expansion into Malay, Chinese, Japanese, German, Spanish, Portuguese, French, verified with real sweeps in five markets. Also fast, cheap, reliable: plain HTTP, no browser, resumable sweeps, proxy rotation, degraded-session detection.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Savefy

Savefy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Google Maps Business Scraper finds businesses that Google's English-only search misses. An optional local-language expansion feature widens a single search term into its equivalents across seven other languages — Malay, Chinese, Japanese, German, Spanish, Portuguese, French — and every one of them was verified with a real sweep through this Actor before shipping, not just machine-translated and hoped for. In our own testing — one small sweep, three business types (bakery, pharmacy, gym), Tokyo only — roughly 3 in 10 unique results found via the Japanese terms weren't reachable through the bare English word at all. That's an observation from that one run, not a general performance claim; your mileage will vary by language, city, and business type. Useful, but not required either way — your own term list always works just as well.

It also pulls business data directly from Google Maps' own search endpoint over plain HTTP — no browser, no Google API key — which keeps it fast and cheap to run at scale. The sweep is built for reliability over long runs: it resumes from where a previous run left off instead of restarting from zero, and it rotates to a fresh proxy session for every search term. It also catches something most scrapers miss: Google's session warm-up can fail silently, returning a "successful" run that's quietly stripped of review counts and other fields. This Actor detects that pattern automatically and retries on a fresh session before it reaches your dataset.

Built on the Apify platform, so you get scheduled runs, API/webhook access to results, dataset export (JSON/CSV/Excel), and proxy rotation without managing any of that yourself.

Why use Google Maps Business Scraper?

  • Finds what English misses. Local-language term expansion across 8 languages (English, Malay, Chinese, Japanese, German, Spanish, Portuguese, French), each verified with a real sweep before shipping — not machine-translated and hoped for.
  • No API key, no billing surprises. This hits the same endpoint the Google Maps website itself uses, not the paid Places API.
  • Resumable by design. Every (term, tile) pair swept is remembered. Re-run with the same terms/area/spacing and already-covered ground is skipped, not re-fetched — a run that gets interrupted or migrated loses nothing.
  • Built for wide sweeps, not single lookups. Give it a metro area and a dozen search-term variants and it tiles the whole area, subdividing only where results are actually dense — not a fixed grid burning requests on empty countryside.
  • Niche-agnostic. No hardcoded categories, no per-industry logic. Works the same for sports facilities, restaurants, repair shops, or anything else you can describe as a search term.

How to use Google Maps Business Scraper

  1. Open the Input tab and add one or more Search terms — different phrasings/languages of the same thing find different businesses, so a handful of variants beats one "perfect" term.
  2. Set a Center point + radius, or an explicit Bounding box for more control over the exact area.
  3. Leave Tile spacing, Max subdivision depth, and Max pages per tile at their defaults for a first run — they control the coverage-vs-request-count tradeoff, and defaults are a reasonable starting point.
  4. Turn on Apify Proxy (on by default, residential recommended) — Google rate-limits aggressively by IP, and this Actor rotates proxy sessions per search term to spread load across a long sweep.
  5. Run it. Check the Output tab, or pull results via the API/dataset export once it finishes (or partway through — items land in the dataset as they're found, not just at the end).

Input

FieldDescription
searchTermsThe terms to sweep, e.g. ["bakery", "coffee shop"]. Required.
boundingBoxExplicit {north, south, east, west} area. Takes precedence over center+radius if both are set.
centerLat / centerLng / radiusKmSimpler alternative to a bounding box — a square area around a point.
tileSpacingKmDistance between tile centers. Smaller = finer coverage, more requests.
maxTileDepthHow many times a saturated tile can split into 4 half-spacing tiles.
maxPagesPerTilePage cap per (term, tile), 20 results/page.
requestDelaySecsPoliteness delay between requests.
countryCode / languageCodeGoogle's gl/hl parameters.
expandTerms / expansionLanguages / customTermsOptional: expands each term into local-language equivalents (English, Malay, Chinese, Japanese, German, Spanish, Portuguese, French) plus business-noun suffixes (centre, court, club, …).
proxyConfigurationApify Proxy settings. Strongly recommended for anything beyond a small test.

See the Input tab for full descriptions, defaults, and validation.

Output

One dataset item per business found. Example:

{
"name": "Sunrise Bakery",
"place_id": "ChIJ...",
"feature_id": "0x89c259a...:0x...",
"latitude": 40.7484,
"longitude": -73.9857,
"rating": 4.6,
"review_count": 312,
"website": "https://example.com",
"website_host": "example.com",
"phone": "+12125551234",
"neighbourhood": "Midtown Manhattan",
"full_address": "123 Example Ave, New York, NY 10001, USA",
"categories": ["Bakery", "Cafe"],
"gcids": [],
"found_via": "bakery"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Data fields

FieldMeaning
name, full_address, neighbourhoodBusiness identity and location
latitude, longitudeCoordinates
rating, review_countGoogle's rating and review count, when available
categoriesGoogle's own display-label categories for the business
gcidsGoogle's internal category slugs — usually empty; only served to a logged-in session, which this Actor doesn't use
website, website_host, phoneContact info, when listed
place_id, feature_idGoogle's stable identifiers for the business
found_viaWhich of your search terms surfaced this row. Provenance only — not a quality or category signal, since the same business can be found by several terms

Cost estimation

Cost scales with tiles × terms × pages, and with whether a tile saturates and subdivides. A calibration run — a handful of terms, maxTileDepth: 0, coarse spacing — costs a few dozen requests and a couple of minutes of compute. A full metro sweep with subdivision enabled can run into the thousands of requests; run a maxTileDepth: 0 pass first to see which terms actually saturate before turning subdivision on for those specifically. Term expansion (expandTerms) can multiply your term count 10-40x — check the run log's up-front cost estimate before letting a large expansion run unattended.

Tips

  • Start with maxTileDepth: 0 and coarse tileSpacingKm to see which terms saturate before spending requests on subdivision.
  • Vocabulary — more search term variants, including local-language ones — matters more than finer tiling for coverage. A few extra terms often find more than halving the tile spacing does.
  • If you turn on expandTerms, also turn on proxyConfiguration (on by default) — expansion multiplies request volume, and Google throttles a single un-rotated IP fast under that load.
  • If a run needs to resume cleanly after being stopped, just re-run with the exact same searchTerms, area, and tileSpacingKm — already-swept tiles are skipped automatically.

FAQ

Is this legal? This Actor queries a public endpoint the Google Maps website itself uses, over plain HTTP with no authentication bypass. You're responsible for complying with Google's Terms of Service and applicable law in how you use the results.

Why are gcids almost always empty? Google only returns its internal category slugs to a logged-in session. This Actor deliberately doesn't authenticate as a Google account to fetch them — categories (the display-label field, populated on essentially every row) is the reliable classification signal instead.

Some businesses are missing review counts / categories entirely. This usually means a cookie/session issue on Google's side for that request, not a bug in field parsing — the Actor detects this pattern (a session whose first tile comes back with businesses but no review counts at all) and automatically rotates to a fresh session and retries. If it still happens on isolated tiles, re-running (it resumes, not restarts) usually picks them up on a different session.

Which languages does term expansion support? English, Malay, Chinese, Japanese, German, Spanish, Portuguese, and French — each verified with a real sweep through this Actor (not just machine-translated) before shipping. Languages without empirical verification aren't included, on the theory that a wrong translation is a silent, undiagnosable zero-result search — worse than no coverage at all.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.