Google Maps Scraper - Leads, Emails & Reviews avatar

Google Maps Scraper - Leads, Emails & Reviews

Pricing

from $0.39 / 1,000 business records

Go to Apify Store
Google Maps Scraper - Leads, Emails & Reviews

Google Maps Scraper - Leads, Emails & Reviews

Find businesses on Google Maps by type and location. Get names, addresses, phone numbers, websites, ratings and review counts where available. Export to CSV, Excel or JSON, or use the API. Duplicate listings are removed, and incomplete or blocked searches are reported. No Google API key needed.

Pricing

from $0.39 / 1,000 business records

Rating

0.0

(0)

Developer

Lasse

Lasse

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Categories

Share

Scrape Google Maps businesses into clean, automation-ready data without depending on a Google Maps API key.

Search by business type and location, radius, bounding box, custom GeoJSON Polygon/MultiPolygon, Place ID or Maps URL. Get phones, websites, ratings, coordinates and other core business fields, then optionally add rich place profiles, public website emails and social links, sorted review samples and photo URLs. Results can be inspected through focused Dataset views, exported to CSV/Excel/JSON, or consumed through the Apify API.

The Actor is designed for workflows where silent gaps are expensive: blocked, failed, skipped, unsupported and partial work stays explicit instead of being presented as an empty success.

Why use this Google Maps scraper?

  • Fast HTTP-first collection with a real browser fallback. Normal runs use the lightweight path; the Actor can switch to bounded browser acquisition when the HTTP path cannot complete reliably.
  • Adaptive coverage for dense areas. When one map viewport is genuinely saturated and the requested result cap is still unmet, the Actor can subdivide the working area under hard limits instead of silently stopping at a single-view ceiling.
  • Exact custom-area result fences. Search a GeoJSON Polygon or MultiPolygon for sales territories, neighborhoods, franchise areas, delivery zones or irregular research areas. Observed businesses outside the shape are excluded before persistence and billing; polygon membership is not guessed when coordinates are unavailable.
  • Rich place data without a separate profile event. Optional place profiles can include hours, popular times, amenities, review distribution, description, price range, menu URL, owner fields, timezone, structured address parts and image/photo URLs when Google exposes them.
  • Website contacts in the same run. Optionally check listed business websites for public emails, phones and social profiles.
  • Google-native review ordering. Optional reviews can be requested as most relevant, newest, highest-rated or lowest-rated, with bounded work and explicit coverage.
  • Cleaner output. Duplicate place identities are merged, and deterministic filters can exclude unwanted businesses before optional enrichment work is spent where practical.
  • Focused Output views. Switch between business, lead-generation, place-detail, contact, review, coverage/diagnostic and source-reference views without changing the underlying Dataset records.
  • Explicit coverage and diagnostics. A blocked website, unsupported enrichment or partial source response never silently becomes a successful empty result.
  • Built for automation. Use Console, schedules, API clients, MCP or downstream Dataset integrations.

How much does it cost to scrape Google Maps?

The current rates are always shown in the Actor's Pricing tab. This Actor uses pay-per-event billing with three data events:

EventCharged when
business-scrapedOne validated unique Google Maps business row has been persisted
contact-enrichedWebsite enrichment produced at least one public email, phone number or social profile for that persisted business
review-scrapedOne optional Google Maps review has been persisted

Rich place-profile data and photo-reference metadata are included in the business-row event; they do not have separate profile or photo events. Duplicate rows, malformed rows, blocked or failed searches with no emitted business, out-of-polygon rows, and unsuccessful contact/review checks do not create the corresponding data event.

Use Maximum businesses, review limits and Apify's maximum-cost-per-run control to bound a job. See the Pricing tab for the authoritative current rates for your plan.

Quick start

For a normal local lead search:

  1. Enter Business type or search term.
  2. Enter Location.
  3. Set Maximum businesses.
  4. Turn on only the enrichment you need.
  5. Click Start.
  6. Open the Google Maps businesses Dataset view and export or consume the rows.
{
"search": "real estate agency",
"location": "London, UK",
"maxBusinesses": 20
}

maxBusinesses is a hard result cap, not a guarantee that Google Maps will expose that many matching businesses.

What data does it return?

Each unique business is persisted as one versioned Dataset row. Common fields include:

FieldDescription
titleBusiness name
categoryName / categoriesPrimary and additional observed categories
addressBusiness address
phonePhone listed on Google Maps
websiteWebsite link listed on Google Maps
rating / reviewCountObserved rating and review count
coordinatesLatitude and longitude
mapsUrl / placeIdGoogle Maps identity fields when observed
businessStatusOpen / temporarily closed / permanently closed when observed
contactsOptional public website emails, phones and social URLs
profileOptional richer place-profile data
reviewsOptional bounded review records in the selected Google-native order
coverageExplicit enrichment status and limitations
provenanceSearch leg, rank and source context
diagnosticsExplicit acquisition, parsing or coverage diagnostics

A missing website means only that the checked Google Maps source did not establish a website link. It does not prove that the business has no website elsewhere.

Output views

The original Dataset JSON remains one business record per persisted place, including nested enrichment, coverage and provenance data. The Output tab provides focused views over those same records:

  • Google Maps businesses — common business fields and high-level coverage;
  • Lead generation — website, phones, public emails, socials and contact coverage;
  • Place details — rich profile fields such as hours, popular times, review distribution, amenities and photo URLs;
  • Website contacts — contact values plus checked/contact-page URLs and coverage state;
  • Google Maps reviews — one transformed table row per returned review;
  • Coverage & diagnostics — explicit enrichment states, reasons and diagnostics;
  • Source references — IDs, provenance, source URLs, coverage and diagnostics.

The review view uses a presentation transform only. It does not change the persisted JSON or duplicate review billing.

Find business emails and social profiles

Enable Find website emails and social links to enrich businesses that have a listed website.

The Actor checks the homepage and up to two likely same-site contact pages. It can surface public:

  • email addresses;
  • phone numbers;
  • Facebook, Instagram and LinkedIn profiles;
  • X/Twitter, YouTube and TikTok profiles.

Multiple sites are processed with bounded concurrency. Website admission follows Maximum businesses up to the Actor's 5,000-business run cap, while the contact phase remains time- and budget-bounded.

The Actor does not submit forms, log in, solve CAPTCHAs or run an unrestricted website crawl. Emails are observed public data and are not verified for deliverability. Common placeholder and asset false positives are filtered, and contact values from unrelated off-site redirects are not attributed to the Maps business.

A contact-enriched event is charged only when the persisted row actually contains a contact value produced by this enrichment.

Rich Google Maps place profiles

Enable Enrich place profiles for richer data when the source exposes it. Depending on the business, observed profile fields can include:

  • opening hours and popular times;
  • additional categories and amenities / service attributes;
  • rating, review count and observed 1–5 star review distribution;
  • description and owner fields;
  • price range, menu URL, plus code and timezone;
  • structured address parts;
  • thumbnail, image URLs and bounded photo URLs.

Profile enrichment follows Maximum businesses automatically up to 500 profiles per run. It is included in the business-scraped event rather than billed as a separate profile result.

Google Maps response formats can change, so profile coverage is explicit. A failed or unsupported profile request is not represented as a successful empty profile.

Scrape and sort Google Maps reviews

Enable Enrich reviews to return bounded Google Maps review samples.

Review records can include observed author information, rating, text, language, publication time, relative time, owner reply and review photos. Review text is normalized to plain-text line breaks where Google uses presentation-only <br> markers.

Choose Review order according to the job:

ValueUse case
MOST_RELEVANTGoogle's relevance ordering; backward-compatible default
NEWESTRecent customer feedback and reputation workflows
HIGHEST_RATINGPositive-review / testimonial research
LOWEST_RATINGComplaint and pain-point research

Limits remain bounded:

  • default maximum reviews per business: 25;
  • hard maximum reviews per business: 50;
  • review enrichment follows Maximum businesses up to 500 businesses per run;
  • the run work plan caps total review requests and the same ordering is used across HTTP and bounded browser recovery.

Each persisted review creates one review-scraped event. Failed, blocked, skipped or empty review checks are not charged as reviews.

Search an exact GeoJSON polygon or territory

Use polygon with the normal search field to restrict emitted businesses to an irregular area. The input accepts bounded GeoJSON Polygon and MultiPolygon geometry in WGS84 coordinates.

{
"search": "restaurant",
"polygon": {
"type": "Polygon",
"coordinates": [[
[-0.20, 51.40],
[-0.05, 51.40],
[-0.05, 51.60],
[-0.20, 51.60],
[-0.20, 51.40]
]]
},
"maxBusinesses": 100,
"coverageMode": "AUTO"
}

Important polygon semantics:

  • coordinates use GeoJSON order [longitude, latitude];
  • every linear ring must be explicitly closed by repeating its first coordinate at the end;
  • holes are supported and must remain inside the outer ring;
  • MultiPolygon is supported for disconnected territories;
  • polygon input is bounded by ring/vertex limits and rejects unsupported self-intersecting rings;
  • use Polygon instead of center/radiusKm or boundingBox for the same search leg;
  • the Actor searches the polygon's bounded geographic region and then applies the exact shape as a result fence;
  • a business outside the polygon is not persisted or charged as a business result;
  • if a candidate lacks observed coordinates, the Actor does not guess that it lies inside the polygon; affected work remains explicit;
  • polygon search is bounded best-effort discovery, not a claim that every possible Google Maps business inside the shape was enumerated.

The same polygon field is also available inside individual searches[] entries.

Google Maps photo URLs

Enable Include photo references together with place-profile enrichment to return bounded observed Google-hosted photo URLs.

The Actor returns URL metadata only. It does not download image files. Photo URLs are included in the business/profile row and do not have a separate event charge.

Search modes and filters

The simplest input is one search plus one location, but the Actor also supports:

  • searches[] for up to 25 independent searches;
  • center + radiusKm for circular geography;
  • boundingBox for rectangular geography;
  • polygon for exact GeoJSON Polygon/MultiPolygon result fences;
  • up to 500 Place IDs;
  • up to 500 Google Maps place URLs.

Use exactly one acquisition family per run: search, searches[], placeIds[] or mapsUrls[]. Within one search leg, use at most one explicit geometry family: center/radius, bounding box or polygon.

Deterministic filters can include or exclude categories, require a minimum rating or review count, filter by website-link presence and exclude business statuses. Filters are applied before optional enrichment where practical.

Adaptive coverage and acquisition modes

For most users, the defaults are appropriate.

Adaptive coverage is enabled by default in this Actor. A saturated primary viewport can be split into smaller geographic cells when the requested result count is still unmet. Coverage work is bounded by hard page, cell, depth, request and time limits; the Actor does not claim complete enumeration of every business in an arbitrary area.

Automatic acquisition is also the default:

  1. use the direct HTTP path first;
  2. fall back through bounded recovery when the source response is not trustworthy enough;
  3. use browser acquisition when HTTP cannot complete the job reliably.

For explicit geometry in the browser path, the Actor preserves the centered geographic search rather than replacing it with an uncentered structured fast-path. Final merged results are re-checked against declared geometry before persistence.

Advanced users can force HTTP-only or browser-only acquisition. Browser-only mode intentionally disables Maps HTTP-dependent profile, photo and review enrichment. Website-contact enrichment is separate and may still run.

The Actor does not run unlimited retries or treat a CAPTCHA as zero results.

Coverage states and run diagnostics

Coverage can include states such as:

  • COMPLETE
  • PARTIAL
  • BLOCKED
  • FAILED
  • SKIPPED
  • UNSUPPORTED

The RUN_SUMMARY key-value-store record reports requested and admitted work, compact geometry metadata, selected review ordering, acquisition telemetry, adaptive geographic coverage, per-event billing, cost telemetry, enrichment counts and diagnostics. Large polygon coordinate arrays are not duplicated into the run summary; it stores a bounded descriptor such as geometry type, vertex count and bounding box.

CHARGE_JOURNAL records attempted billing decisions after Dataset persistence for auditable runs.

Google Maps Scraper API

Every run can be started in Apify Console or through the Apify API.

JavaScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("overbifrost/google-maps-business-data").call({
search: "real estate agency",
location: "London, UK",
maxBusinesses: 100,
enrichContacts: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("overbifrost/google-maps-business-data").call(
run_input={
"search": "real estate agency",
"location": "London, UK",
"maxBusinesses": 100,
"enrichContacts": True,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

For REST, OpenAPI, MCP and more client examples, use the Actor's API tab.

Export Google Maps data to CSV, Excel or JSON

Results are stored in the default Apify Dataset and can be exported in standard Apify formats including CSV, Excel and JSON.

Use the focused views for human-friendly tables. Use the original JSON when you need complete nested profile, contact, review, coverage and provenance structures.

Common use cases

  • Google Maps lead generation — build prospect lists by niche and location.
  • B2B lead enrichment — add public website emails, phones and social profiles.
  • Sales territory research — search a custom Polygon/MultiPolygon and keep only observed businesses inside the declared shape.
  • Local SEO and competitor research — compare categories, ratings, review counts, review distribution and popular times.
  • Market research — compare local businesses across cities or defined map areas.
  • Reputation and review research — request newest or lowest-rated bounded review samples with owner replies/photos when observed.
  • CRM enrichment — refresh known businesses from Place IDs or Maps URLs.
  • Directory building — collect structured local-business records.
  • Automation and AI workflows — use typed Dataset metadata, focused views, API/MCP and explicit coverage states downstream.

Frequently asked questions

Do I need a Google Maps API key?

No. The Actor does not require your own Google Maps or Google Places API key.

Can this Google Maps scraper find emails?

Yes. Enable website-contact enrichment. The Actor observes public email addresses on listed business websites; it does not guess addresses or verify deliverability.

Can it scrape Google Maps reviews in newest / highest / lowest order?

Yes. Enable review enrichment and choose MOST_RELEVANT, NEWEST, HIGHEST_RATING or LOWEST_RATING. Review work remains bounded by the selected per-business limit, the business cap, the run request plan and the deadline.

Can it search a custom polygon?

Yes. Supply a WGS84 GeoJSON Polygon or MultiPolygon with [longitude, latitude] positions. The Actor searches the bounded region and excludes observed businesses outside the exact shape before persistence and business-result charging. It does not promise exhaustive enumeration of every business in the territory.

Can it return more than one Google Maps viewport?

Yes. In adaptive mode, real saturation can trigger bounded geographic subdivision when the requested result cap is still unmet.

How many businesses can one run return?

maxBusinesses has a hard maximum of 5,000. Actual results depend on what Google Maps exposes, your geography and filters, budgets, deadlines and acquisition conditions.

Does a missing website field mean the business has no website?

No. It means the checked Google Maps source did not establish a website link.

Does it download Google Maps photos?

No. Optional photo enrichment returns bounded photo-reference URLs only.

What happens if Google Maps or a business website blocks a request?

The Actor records explicit coverage and diagnostics rather than converting a blocked or failed check into an empty success.

Support

For a reproducible Actor problem, use the Actor's Issues tab and include:

  • the Apify run ID;
  • the relevant input with secrets removed;
  • the RUN_SUMMARY diagnostic code or coverage state;
  • what you expected to happen.

Do not post API tokens, passwords or other secrets in an issue.