Google Maps Business Scraper avatar

Google Maps Business Scraper

Pricing

Pay per event

Go to Apify Store
Google Maps Business Scraper

Google Maps Business Scraper

Extract business details from Google Maps by search query: name, address, phone, website, rating, hours, coordinates, and optionally email addresses. Pay only for records you receive ($0.003/result).

Pricing

Pay per event

Rating

0.0

(0)

Developer

Meridian Corp

Meridian Corp

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

4 days ago

Last modified

Categories

Share

Extract structured business data from Google Maps by search query. Get name, address, phone, website, coordinates, ratings, hours, and optionally email addresses — all in one clean JSON dataset.

Pay-per-result pricing: $0.003 per business record. You pay only for what you actually receive. No monthly fees, no subscriptions.

Verified working on live Google Maps as of 2026-04-21. Tested across EN/DE/CS/ES/FR queries.


What does this actor extract?

Each business record contains the following fields:

FieldTypeDescription
placeIdstringGoogle Place ID — stable unique identifier
namestringBusiness name as shown on Google Maps
categorystringPrimary business category (e.g. "Coffee shop")
addressstringFull formatted address
latfloatLatitude (WGS84)
lonfloatLongitude (WGS84)
phonestringPhone number as displayed on Maps
websitestringBusiness website URL
emailstringContact email — extracted from website when includeEmails=true
ratingfloatStar rating (1.0 – 5.0)
reviewsCountintegerTotal number of Google reviews
priceLevelstringPrice indicator: €, €€, €€€, or €€€€
hoursarrayOpening hours by day of week
photosarrayPhoto URLs from Google Maps CDN — when includePhotos=true
searchQuerystringThe input query that produced this result
urlstringFull Google Maps URL for this listing
scrapedAtdatetimeISO 8601 UTC timestamp

Fields that Google Maps does not show for a given listing are returned as null rather than omitted. Your downstream code does not need to guard against missing keys.


Use cases

B2B lead generation

Find businesses in a specific niche and city, export to CSV, load into your CRM. Enable includeEmails=true to get direct contact addresses alongside phone numbers.

Example: "personal trainers London" — 500 results with emails costs approximately $1.50 + $0.75 for emails (if ~50% have extractable addresses) = $2.25 total.

Market research and competitive mapping

Map all competitors in your category within a metro area. Use rating, review count, price level, and hours data to understand market positioning without manual research.

Example: "italian restaurants Munich" at 1,000 results costs $3.00. You get coordinates, ratings, and review counts for the full competitive landscape.

Directory and aggregator sites

Populate local business directories, neighbourhood guides, or niche aggregator sites. The placeId field gives you a stable unique key for deduplication across repeated runs.

Example: building a directory of 10,000 businesses across 20 cities costs $30. Incremental weekly updates scrape only changed queries.

Local SEO analytics

Audit local search visibility. Track which businesses appear for a given query, their ranking positions, rating trends, and category distribution over time.


How it works

  1. You provide a list of search queries (e.g. ["dentists Berlin", "coffee shops Prague"]).
  2. The actor opens Google Maps in a headless browser and runs each query.
  3. It scrolls the results list to load up to your maxResultsPerQuery limit.
  4. For each business, it visits the detail panel and extracts all available fields.
  5. If includeEmails=true, it additionally visits each business website and scans contact pages for email addresses.
  6. Results are pushed to the Apify dataset in real time as they are scraped — you do not wait for the full run to finish.

Typical performance:

  • 100 businesses per query: 3–5 minutes
  • 1,000 businesses per query: 30–50 minutes
  • Email extraction adds approximately 1–3 seconds per business with a website

With default concurrency=5, scraping 20 businesses typically takes 2–3 minutes. Higher concurrency (10–15) can speed this up further but uses more memory. We recommend 5 for reliability. Each worker uses approximately 150 MB RAM at peak.

The actor uses Apify Residential proxies by default to maintain a stable success rate against Google Maps geo-restrictions. You can override this with your own proxies via proxyConfiguration.


Input configuration

Parameters

ParameterTypeDefaultDescription
searchQueriesarray of stringsrequiredSearch phrases to run. Max 100 queries per run.
maxResultsPerQueryinteger100Businesses to scrape per query. Range: 1–1000.
languagestringENMaps interface language. Options: EN, CS, DE, ES, FR.
includeEmailsbooleanfalseVisit each website and extract contact emails.
includePhotosbooleanfalseCollect photo URLs from Google Maps listings.
concurrencyinteger5Parallel workers per query. Higher = faster, more memory. Max 20.
proxyConfigurationobjectApify ResidentialProxy settings.

Example: simple single query

{
"searchQueries": ["coffee shops Berlin"],
"maxResultsPerQuery": 100,
"language": "EN"
}

Example: multi-region sweep

{
"searchQueries": [
"dentists Prague",
"dentists Brno",
"dentists Ostrava"
],
"maxResultsPerQuery": 500,
"language": "CS"
}

Example: lead generation with emails

{
"searchQueries": ["marketing agencies Amsterdam"],
"maxResultsPerQuery": 200,
"language": "EN",
"includeEmails": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output example

A single business record as returned in the Apify dataset:

{
"placeId": "0x47a84fd9d5f5ab65:0xff2f9adcd3c28c",
"name": "Chapter One Coffee",
"category": "Coffee shop",
"address": "Mittenwalder Str. 30, 10961 Berlin, Germany",
"lat": 52.4897848,
"lon": 13.3956902,
"phone": "+49 30 25922799",
"website": "http://www.chapter-one-coffee.com/",
"email": null,
"rating": 4.6,
"reviewsCount": 992,
"priceLevel": "€",
"hours": [
{"day": "Tuesday", "hours": "8 AM–6 PM"},
{"day": "Wednesday", "hours": "8 AM–6 PM"},
{"day": "Saturday", "hours": "9 AM–6 PM"},
{"day": "Sunday", "hours": "9 AM–6 PM"}
],
"photos": null,
"searchQuery": "coffee shops Berlin",
"url": null,
"scrapedAt": "2026-04-21T11:38:16.344659Z"
}

Pricing

This actor uses Pay-Per-Event pricing. You are charged only for results delivered.

EventPrice
Business record scraped$0.003
Email address extracted$0.005

The email charge applies only when includeEmails=true and only when an email is actually found. If a business has no website or the site does not list an email, you are not charged the email event fee.

Cost estimates:

ScenarioRecordsEmails foundCost
Quick test1000$0.30
City niche sweep1,0000$3.00
Lead gen with emails (30% hit rate)1,000300$3.00 + $1.50 = $4.50
Large directory build10,0000$30.00
Full outreach list with emails (40% hit rate)5,0002,000$15.00 + $10.00 = $25.00

Comparison to manual data collection:

A virtual assistant typically charges $0.50–$1.00 per manually researched business record. This actor delivers the same structured data at $0.003 per record — roughly 200x cheaper — and runs unattended.

The Google Maps Platform API (Places API) charges $0.017 per place detail request at standard pricing. This actor costs $0.003 per record — about 5x less — and includes fields not available via the API such as opening hours and price level in a single call.


FAQ

Is scraping Google Maps legal?

This actor collects publicly visible business information — the same data any person can see by opening Google Maps in a browser. Collecting publicly available business data is generally permissible in most jurisdictions, including the EU. However, your specific use case may have additional requirements. Consult your legal counsel if you are uncertain about your use case.

Will this get my Apify account banned?

The actor uses Apify Residential proxies by default, which rotate IP addresses and mimic normal browser behaviour. This significantly reduces the risk of blocks. Google Maps does implement anti-scraping measures that can affect success rates on some queries. We recommend using Residential proxies rather than datacenter proxies.

How accurate is the email extraction?

Email extraction works by visiting each business website and scanning the HTML of contact pages for email patterns. Accuracy depends on how the website presents its contact information. Addresses hidden behind contact forms or loaded by JavaScript after page render may not be captured. In practice, roughly 30–50% of businesses that have a website also have a findable email address. You are charged only when an email is successfully extracted.

Can I run this on a schedule?

Yes. Apify allows you to schedule any actor run via the Scheduler in your console, or via the Apify API. You can run the same queries weekly and export fresh results each time.

Why are some businesses missing phone numbers or websites?

Not every Google Maps listing is fully populated. Many small businesses have claimed their listing but not added a website or phone number. The actor returns whatever Google Maps shows — it does not fill in information that is not there.

How does this compare to the official Google Places API?

The Places API is the correct choice if you need guaranteed uptime SLAs, official Google support, or if you are building a user-facing application that must comply with Google's Terms of Service for displayed data. This actor is appropriate for research, lead generation, and data export where you own the output and are not redistributing it as a Maps-powered product.

Do you support non-English results?

Yes. The language parameter controls the Google Maps interface language, which affects business names, category labels, and address formatting. Currently supported: English (EN), Czech (CS), German (DE), Spanish (ES), French (FR).

Why are some businesses missing reviewsCount or priceLevel?

Google Maps does not display price levels for all business types — hotels and professional services often show no price indicator at all. For businesses where the data is visible on the public Maps page, we capture it reliably. If a field is null, the data was not shown on Google's interface.

Can I run this at higher concurrency for speed?

Yes. Set concurrency to 10–15 for 2–3x faster scraping of large queries. Default is 5 for reliability. Maximum is 20. Higher values use more memory — each worker requires approximately 150 MB RAM.


Limitations and disclaimers

  • Public data only. This actor collects information displayed publicly on Google Maps. It does not access private data, logged-in user content, or information behind authentication.
  • Google-imposed rate limits. Google Maps throttles automated access. The actor is built to handle this gracefully, but very large runs (10,000+ records per query) may see slower throughput during periods of heavy throttling.
  • Email extraction is best-effort. Emails embedded in images, protected by anti-spam obfuscation, or loaded dynamically may not be captured.
  • Google Maps data accuracy. Business information on Google Maps reflects what Google has indexed and what business owners have entered. Hours, phone numbers, and addresses may be outdated if the business has not updated their listing.
  • Not affiliated with Google. This actor is an independent tool and is not endorsed by or affiliated with Google LLC.
  • EU/GDPR note. Business contact information (name, address, phone, website, email) pertaining to legal entities operating as businesses is generally not considered personal data under GDPR. Individual sole traders operating under their personal name may be an exception. Review your specific data processing obligations before using email addresses for outreach.

Support

For bug reports and feature requests, use the Issues tab on this actor's Apify Store page.

For other questions: support@meridiancorp.ai

Response time: typically within 1 business day.


See ./CHANGELOG.md for version history.