Google Maps Business Scraper
Pricing
Pay per event
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
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:
| Field | Type | Description |
|---|---|---|
placeId | string | Google Place ID — stable unique identifier |
name | string | Business name as shown on Google Maps |
category | string | Primary business category (e.g. "Coffee shop") |
address | string | Full formatted address |
lat | float | Latitude (WGS84) |
lon | float | Longitude (WGS84) |
phone | string | Phone number as displayed on Maps |
website | string | Business website URL |
email | string | Contact email — extracted from website when includeEmails=true |
rating | float | Star rating (1.0 – 5.0) |
reviewsCount | integer | Total number of Google reviews |
priceLevel | string | Price indicator: €, €€, €€€, or €€€€ |
hours | array | Opening hours by day of week |
photos | array | Photo URLs from Google Maps CDN — when includePhotos=true |
searchQuery | string | The input query that produced this result |
url | string | Full Google Maps URL for this listing |
scrapedAt | datetime | ISO 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
- You provide a list of search queries (e.g.
["dentists Berlin", "coffee shops Prague"]). - The actor opens Google Maps in a headless browser and runs each query.
- It scrolls the results list to load up to your
maxResultsPerQuerylimit. - For each business, it visits the detail panel and extracts all available fields.
- If
includeEmails=true, it additionally visits each business website and scans contact pages for email addresses. - 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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQueries | array of strings | required | Search phrases to run. Max 100 queries per run. |
maxResultsPerQuery | integer | 100 | Businesses to scrape per query. Range: 1–1000. |
language | string | EN | Maps interface language. Options: EN, CS, DE, ES, FR. |
includeEmails | boolean | false | Visit each website and extract contact emails. |
includePhotos | boolean | false | Collect photo URLs from Google Maps listings. |
concurrency | integer | 5 | Parallel workers per query. Higher = faster, more memory. Max 20. |
proxyConfiguration | object | Apify Residential | Proxy 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.
| Event | Price |
|---|---|
| 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:
| Scenario | Records | Emails found | Cost |
|---|---|---|---|
| Quick test | 100 | 0 | $0.30 |
| City niche sweep | 1,000 | 0 | $3.00 |
| Lead gen with emails (30% hit rate) | 1,000 | 300 | $3.00 + $1.50 = $4.50 |
| Large directory build | 10,000 | 0 | $30.00 |
| Full outreach list with emails (40% hit rate) | 5,000 | 2,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.