Google Maps Scraper - Business Contacts & Ratings avatar

Google Maps Scraper - Business Contacts & Ratings

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Google Maps Scraper - Business Contacts & Ratings

Google Maps Scraper - Business Contacts & Ratings

Find public Google Maps businesses with contact details, ratings and rule-based lead scores. Exclude existing place URLs or IDs before extracting results.

Pricing

from $8.00 / 1,000 results

Rating

5.0

(1)

Developer

Ben

Ben

Maintained by Community

Actor stats

1

Bookmarked

173

Total users

38

Monthly active users

15 days ago

Last modified

Share

Google Maps Business Scraper: contacts, ratings and exclusions

Export public Google Maps business records from a keyword and location, or from exact place URLs. Collect names, source links, ratings and available contact fields; exclude places already in your directory before opening their details. Download JSON, CSV or Excel, or use the dataset through Apify's API.

For a local business directory: collect available phone numbers and websites, with place IDs for repeat imports. Email discovery and complete review histories are separate workflows. Free-plan result events cost $10 per 1,000 businesses, plus the start event; optional fields depend on source availability.

Quick start

Start with a tested example for coffee-shop leads with exclusions:

Open the example and choose Try for free to copy its input into your account. Check the input and set a maximum run charge before starting; Actor fees still follow the pricing below. When the run finishes, open the run's dataset and select the Overview view and download JSON for nested fields or CSV/Excel for a table.

Your goalInput to use
Discover businessesmode: search, a query and a location
Refresh known placesmode: direct_urls with long Maps place URLs
Skip existing recordsexcludePlaceIds or resolved excludePlaceUrls

The real output example shows the record shape. The Python workflow saves your own export to a local JSON file with a $0.10 maximum Actor charge.

Input

{
"mode": "search",
"query": "coffee shops",
"location": "Berlin, Germany",
"excludePlaceIds": [
"ChIJZav11dlPqEcRjMLT3Jov_wA"
],
"maxResults": 2,
"includePhotos": false,
"includeReviews": false,
"includeLeadScore": true
}

Use the Berlin example to inspect a small search with an existing Place ID excluded. The result cap limits candidates, so rating, review-count and website filters can reduce the final export. Search ranking and visible results can change between observations.

InputMeaning
modesearch or direct_urls.
query, locationTerms sent to Google Maps; these are not a strict geographic boundary.
startUrlsLong https://www.google.com/maps/place/ URLs for direct mode.
maxResultsA 1–500 candidate cap, not guaranteed output. Start with two or three.
minRating, minReviewsReject records below the threshold or missing the required value.
websiteFilterany, has_website or no_website, based on the extracted website field.
excludePlaceIdsStandard Place IDs, numeric CIDs or hex feature IDs already in your collection.
excludePlaceUrlsResolved long Maps URLs to exclude. Expand shortened links first.
includeLeadScoreAdd the rule-based score described below.
includePhotosRequest available photo URLs, up to 50; off in the small example.
includeReviews, maxReviewsRequest visible review data, with a cap of 1–100; off in the example.

Exclusions work in both search and direct modes before detail extraction. Excluded places do not create rows or result charges. Search can continue past excluded links when more candidates are available. Direct inputs deduplicate place identities and respect the result cap.

A missing extracted website means this observation did not provide one. It does not establish that the business has no website anywhere. Google may display nearby businesses or omit contact fields; inspect the source URL before using an observation for a business decision.

Example output

One complete record from a verified September 9, 2026 cloud run. Values and public media URLs can change or expire; this is a dated sample.

{
"name": "Fauve Coffee Berlin",
"rating": 4.7,
"review_count": 169,
"address": "Neue Schönhauser Str. 8, 10178 Berlin, Germany",
"categories": [
"Coffee roastery"
],
"has_hours": false,
"plus_code": "GCF3+VJ Berlin, Germany",
"url": "https://www.google.com/maps/place/Fauve+Coffee+Berlin/data=!4m7!3m6!1s0x47a8513742002d9d:0x53cb78e07f1c4f26!8m2!3d52.5247417!4d13.404067!16s%2Fg%2F11s5wzp9md!19sChIJnS0AQjdRqEcRJk8cf-B4y1M",
"lead_score": 40
}

Output fields

Each dataset item describes one observed business. Fields depend on what its public page exposes and which options you enabled.

FieldInterpretation
name, urlBusiness name and the Google Maps source link.
address, phone, websiteAvailable published contact information; website redirects are unwrapped.
rating, review_countThe source rating and review count at observation time.
categories, price_levelAvailable category labels and source price indicator.
has_hours, open_nowHours information found by the parser and current opening status when available.
plus_codeSource Plus Code when exposed.
photo_count, photos, reviewsOptional source fields; limits do not guarantee that many items.
lead_scoreA rule-based indicator from the fields actually extracted.

Missing optional fields can be absent rather than null. The overview view exposes common business fields; choose JSON to retain nested photo/review data. The result link opens the source listing so you can verify an observation before enriching it or importing it into a CRM.

How the score works

The current formula gives up to 30 points for a website and phone, 25 for ratings and review counts, 20 for combined rating/review thresholds and an available price indicator, and 20 for observed hours, photos and contacts. Its current maximum is 95 within the schema's 0–100 range.

The score is not a prediction of purchase intent, revenue, business legitimacy or willingness to buy a website. Missing fields and disabled extraction options can lower it. The Actor preserves collection order; sort the output yourself if you want a score-ranked view. Comparisons are most useful when input options remain consistent.

Pricing and practical limits

Free pricing is $0.01 per exported business, or $10 per 1,000, plus $0.00005 per start event per GB, minimum one. The default is 2 GB, so a two-business run costs $0.02010 in Actor events at Free rates. Result discounts are $9/1,000 on Bronze, $8.50 on Silver, $8 on Gold, $7.50 on Platinum and $7 on Diamond. The live Store pricing panel is authoritative.

Excluded and filtered candidates do not create result events. A maximum run charge can stop exports before the result cap. Larger result sets, optional reviews/photos and slow source responses take longer; the default timeout is five minutes. Increase scope only after checking a small dataset and its run usage.

Some detail pages can be skipped when extraction fails, so a successful run alone is not proof that every requested place was returned. Review the server log, exported count and source links. Do not treat an empty or shorter export as evidence that businesses closed. Source availability and layout changes can affect future runs.

Python API workflow

Copy the first input JSON above into input.json and save this code as export.py. In a Python virtual environment, install apify-client with python -m pip install apify-client. Set APIFY_TOKEN to your own Apify token in your environment, then run python export.py. Keep the token out of source files and shared screenshots.

import json
import os
from decimal import Decimal
from pathlib import Path
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("benthepythondev/google-maps-business-scraper").call(
run_input=json.loads(Path("input.json").read_text(encoding="utf-8")),
max_total_charge_usd=Decimal("0.10"),
memory_mbytes=2048,
timeout_secs=300,
)
if not run or run["status"] != "SUCCEEDED":
raise RuntimeError(f"Inspect the run before retrying: {run and run['id']}")
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
Path("berlin-coffee-leads.json").write_text(
json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8"
)
print(f"Saved {len(rows)} records from run {run['id']}")

This starts a run in your account, waits for completion and saves berlin-coffee-leads.json. The $0.10 limit bounds Actor charges; it is not a promised bill or result count. Check the printed run ID and server log if the result is shorter than expected. If your client loses its connection, inspect the existing run in Console before starting another one. See the official Python client for other run options.

Load the JSON into your directory using the Maps url as the source reference. For subsequent searches, supply the stable Place IDs or CIDs you already hold as exclusions. Review rows with missing contact fields before enrichment. Sort by lead_score yourself if that is useful; the Actor does not reorder the dataset by score.

For recurring runs without writing a scheduler, copy a tested public Task into your account and attach an Apify Schedule to that copy. Keep its maximum-charge limit and avoid overlapping runs when using monitor state. The Python example above is also suitable for an existing scheduler; run it from the directory containing input.json and provide the token through that scheduler's secret settings.

Questions

Does it need a Google API key? No. This Actor reads public Google Maps pages through a browser.

Does a place get charged twice because I supplied two URLs? Direct mode removes duplicate place identities before export. Keep stable IDs and source links when reconciling observations across separate runs.

Will it find every business in a city? No. Google controls visible search results, and this Actor has candidate, time and spending limits.

Can I receive only new businesses automatically? Use exclusions for the IDs already in your own collection. This Actor does not maintain a persistent cross-run only-new database itself.

Are reviews and photos complete? No. Optional collections depend on what the public page exposes within the requested limits. The documented small examples focus on business contacts and exclusions.

For support, provide the run URL, input and an example of the missing or incorrect field. Keep credentials out of issue reports. Follow applicable law, privacy obligations and platform terms when collecting and using public business information.

Website Contact Extractor reads published contacts from business websites. Facebook Pages preserves organizational Page contact provenance. Each has its own input contract and pricing.

Keywords: Google Maps business scraper, place exclusions, Place IDs, business contacts, ratings, local business research, source URLs, directory enrichment, CSV export, Maps data API, rule-based lead score.