Google Maps Scraper
Pricing
from $0.80 / 1,000 place results
Google Maps Scraper
Scrape Google Maps for local business leads: phone, website, emails, social profiles, ratings, and reviews. No API key, no login. Batch keywords Γ locations in one run, with email and social extraction from each business website.
Pricing
from $0.80 / 1,000 place results
Rating
0.0
(0)
Developer
mick_
Maintained by CommunityActor stats
0
Bookmarked
49
Total users
3
Monthly active users
4 days ago
Last modified
Categories
Share
Google Maps Scraper: Places, Reviews & Business Leads
Scrape Google Maps for local business leads: name, phone, website, emails, social profiles, rating, and reviews for every place. No API keys. No login. Fast, cheap, and reliable. Search "dentists in Austin" or "plumbers in 50 cities" and get a contact-ready lead list. Built for B2B lead generation, local SEO research, competitor intelligence, and AI agents.
$0.80 per 1,000 places, and you only pay for data you actually receive. Batch keywords Γ locations in one run, global deduplication, and LinkedIn lead enrichment built in.
What it does
This actor extracts structured business data from Google Maps' public search pages. It supports single searches, massive batch searches across many keywords and locations in one run, direct place URL ingestion, and GeoJSON polygon targeting. Output is flat JSON, ready to feed into your CRM, lead-gen pipeline, or AI agent.
Key data extracted:
- Business name, address, categories, star rating, coordinates,
placeId+googleCid, place and Street View URLs, closed flags. This is the fast default run, read straight off the search results - Phone, website, day-by-day opening hours, review count, and photos. These live in each place's own data, so they come with
enrichDetails: true(billed as the detail upgrade) - Price level (
$to$$$$) when Google shows it - Review text + star rating (optional, off by default): up to 8 of Google's most relevant reviews per place
- Light review sentiment: positive / neutral / negative counts (no LLM cost)
- Email + social profile enrichment (optional): pulled from the place's website
- LinkedIn search URL (optional): pairs perfectly with labrat011/linkedin-jobs-scraper for full B2B lead pipelines
- Google
placeId+googleCidfor cross-referencing with the Places API
Why this scraper
| This actor | |
|---|---|
| Price per 1k places (base) | $0.80 in event charges, plus Apify platform usage at cost |
| Price per 1k reviews | $0.40 |
| Upgrades you did not receive | Never charged: the detail and lead events fire only when the page yielded the data |
| Batch keywords Γ locations | β Native Cartesian product, searches run in parallel |
| Global deduplication | β
By placeId + googleCid across the whole run |
| GeoJSON input | β Point + Polygon |
| Email + social enrichment | β
Optional ($1.50/1k leads) |
| LinkedIn integration | β Ready-to-use search URL, free |
| Output views | overview (places), leads, reviews |
| MCP-ready for AI agents | β Works with Apify's hosted MCP server, no setup |
Use cases
π― Lead Generation
Turn Google Maps into a prospect pipeline:
- Find every dentist, coffee shop, plumber, or SaaS company in your target city
- Extract emails and social profile links from their websites (optional)
- Qualify by rating and review count
- Auto-generate LinkedIn search URLs for decision-maker research
- Feed into HubSpot, Salesforce, Clay, or any CRM via Apify integrations
π Local SEO Research
- Audit every competitor in a geographic area
- Compare ratings, review counts, and category saturation
- Track which businesses dominate the local pack for a given keyword
- Spot gaps and opportunities in underserved neighborhoods
π Competitor Intelligence
- Snapshot entire categories (e.g. "all yoga studios in Austin")
- Monitor reviews and sentiment over time (re-run weekly)
- Identify newcomers, closures, and rating trends
- Export to BI tools for dashboarding
π€ AI Agent Integration (MCP)
Use this actor as a live data source for AI agents:
- Ask Claude, GPT, or any MCP-compatible agent to search Google Maps in real time
- Build grounded RAG pipelines with current business data
- Let agents pull restaurant hours, phone numbers, or reviews on demand
- No authentication required, works out of the box with Apify's hosted MCP server
π Market Research
- Study category density across cities and countries
- Analyze price level distributions, rating distributions, category taxonomies
- Extract phone numbers and websites for outbound campaigns
Key features
- No API key, login, or cookies: scrapes public pages only
- Fast by default: 500 places in about 4 minutes, roughly 8 minutes per 1,000, with batch searches running in parallel
- Batch search: cross-multiply keywords Γ locations in one run
- Direct place URL ingestion: skip search, feed your existing list
- Custom GeoJSON: Point or Polygon for precise area targeting
- Global deduplication: by
placeIdandgoogleCidacross the entire run - Review sentiment: rating-based positive/neutral/negative counts (zero LLM cost)
- Contact enrichment: email + social profile scraping from place websites (optional)
- LinkedIn integration: auto-generated LinkedIn search URL per result (optional, free)
- Output views:
places,reviews,leadspresets for clean downstream use - Rating + closed-status filters: drop low-quality or inactive places
- Residential proxy rotation: fresh IP on 429/403 to survive blocks
- Resume on migration: Apify state survives actor migrations mid-run
- MCP-ready: works as an AI agent tool via Apify's hosted MCP server
Output format
Places view (default run)
A default run reads the search results page only. It is fast and cheap, and each record looks like this:
{"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4","googleCid": "0x89c25855c6480299:0x55194eb0b1bb2a3c","name": "Blue Bottle Coffee","address": "2001 E Cesar Chavez St","categories": ["Coffee shop"],"categoryMain": "Coffee shop","rating": 4.6,"latitude": 30.2592,"longitude": -97.7242,"placeUrl": "https://www.google.com/maps/place/Blue+Bottle+Coffee/data=...","streetViewUrl": "https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=30.2592,-97.7242","permanentlyClosed": false,"temporarilyClosed": false,"searchKeywords": "coffee shops","searchLocation": "Austin, TX","scrapedAt": "2026-04-22T18:34:00+00:00"}
phone, website, openingHours, thumbnailUrl, and images are present but empty on a default run, because Google only renders them on the place's own page.
Places view with enrichDetails: true
Set enrichDetails: true (and optionally maxReviewsPerPlace) and the actor reads each place's own data, which fills in the contact, hours, and review count fields:
{"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4","googleCid": "0x89c25855c6480299:0x55194eb0b1bb2a3c","name": "Blue Bottle Coffee","address": "2001 E Cesar Chavez St, Austin, TX 78702","categories": ["Coffee shop", "Cafe", "Breakfast restaurant"],"categoryMain": "Coffee shop","rating": 4.6,"reviewCount": 1287,"phone": "+1 512-524-1544","website": "https://bluebottlecoffee.com/","priceLevel": "$$","latitude": 30.2592,"longitude": -97.7242,"openingHours": {"Monday": "7:00 AM β 6:00 PM","Tuesday": "7:00 AM β 6:00 PM"},"thumbnailUrl": "https://lh5.googleusercontent.com/...","images": ["https://lh5.googleusercontent.com/..."],"placeUrl": "https://www.google.com/maps/place/Blue+Bottle+Coffee/data=...","streetViewUrl": "https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=30.2592,-97.7242","permanentlyClosed": false,"temporarilyClosed": false,"searchKeywords": "coffee shops","searchLocation": "Austin, TX","reviews": [{ "rating": 5, "text": "Amazing espresso. Friendly staff." }],"reviewSentiment": { "positive": 8, "neutral": 1, "negative": 1, "total": 10 },"scrapedAt": "2026-04-22T18:34:00+00:00"}
Not every business publishes every field. On a measured 100-place run, phone came back for about half the places, website for about six in ten, and hours for just over four in ten, so expect gaps that mirror what Google itself shows.
Leads view (contact-ready)
{"name": "Blue Bottle Coffee","categoryMain": "Coffee shop","phone": "+1 512-524-1544","website": "https://bluebottlecoffee.com/","emails": ["hello@bluebottlecoffee.com"],"socialProfiles": {"instagram": "https://instagram.com/bluebottle","facebook": "https://facebook.com/bluebottlecoffee"},"linkedinSearchUrl": "https://www.linkedin.com/search/results/companies/?keywords=Blue%20Bottle%20Coffee","address": "2001 E Cesar Chavez St, Austin, TX 78702","rating": 4.6}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
keywords | string | - | Single keyword search (e.g. coffee shops) |
location | string | - | Single location (e.g. Austin, TX) |
keywordsList | string[] | - | Batch keywords (overrides keywords) |
locationsList | string[] | - | Batch locations (overrides location) |
placeUrls | string[] | - | Skip search and scrape these Google Maps URLs directly |
customGeolocation | object | - | GeoJSON Point or Polygon for precise targeting |
language | select | en | Language of names, categories, and hours, whatever country the proxy exits in |
countryCode | select | us | Google region for search bias (ISO 3166-1 alpha-2), sent to Google as gl |
minRating | select | 0 | 0, 3, 4, 5. Drops places below this rating |
includeClosed | boolean | true | Include permanently / temporarily closed places |
maxReviewsPerPlace | integer | 0 | 0 skips reviews entirely. Returns at most 8 per place (what Google ships with the place) |
includeReviewSentiment | boolean | true | Adds positive/neutral/negative review counts |
enrichDetails | boolean | false | Read each place's own data for phone, website, opening hours, review count, and images |
enrichContacts | boolean | false | Scrape email + socials from each place's website |
enrichLinkedIn | boolean | false | Adds LinkedIn search URL per result (free) |
outputView | select | places | places, reviews, or leads |
maxResults | integer | 100 | Total cap across all searches, 1 to 10,000 |
maxResultsPerSearch | integer | 100 | Cap per keyword Γ location combo, 1 to 1,000 |
proxyConfiguration | object | RESIDENTIAL | Residential strongly recommended |
Batch search example
Scrape three categories across three cities in one run:
{"keywordsList": ["coffee shops", "coworking spaces", "yoga studios"],"locationsList": ["Austin, TX", "Dallas, TX", "Houston, TX"],"maxReviewsPerPlace": 5,"minRating": 4,"enrichLinkedIn": true,"maxResultsPerSearch": 20}
This runs 9 searches (3 Γ 3), returns up to 180 places, deduplicates by placeId + googleCid across the whole run, and tags each result with searchKeywords + searchLocation.
Lead-generation example
Find every high-rated dental practice in Dallas and extract their emails + social profiles:
{"keywords": "dentist","location": "Dallas, TX","minRating": 4,"enrichDetails": true,"enrichContacts": true,"enrichLinkedIn": true,"outputView": "leads","maxResults": 250}
Every result includes phone, website, scraped emails, Instagram/Facebook/LinkedIn URLs, and a LinkedIn company search URL. Pipe it directly into Clay, HubSpot, or your cold-email tool.
Pairs perfectly with labrat011/linkedin-jobs-scraper
Run this actor first to get a list of target companies with enrichLinkedIn: true, then feed the linkedinSearchUrl or business names into labrat011/linkedin-jobs-scraper's companyFilter field to pull current hiring managers, recruiters, and employee counts. Full B2B lead pipeline with zero browser infrastructure, at a fraction of the typical Clay / ZoomInfo cost.
Pricing (Pay-Per-Event + Usage)
Pay only for what you get. Base charge covers every place returned; optional upgrade charges fire only when you actually receive the extra data. No monthly fees. Apify compute + proxy traffic is passed through at cost on top.
| Event | Price | Triggered when |
|---|---|---|
Place result (apify-default-dataset-item) | $0.0008 ($0.80 / 1k) | Every place in the dataset: name, rating, category, address, coordinates, thumbnail, Street View URL |
Detail-enriched place (result_detail_enriched) | $0.0007 ($0.70 / 1k) | When enrichDetails: true returned a phone, website, or opening hours for the place. A place page that yields none of those is not charged, even though it was opened |
Review extracted (result_review) | $0.0004 ($0.40 / 1k) | Per review attached to a place |
Contact-enriched lead (result_lead) | $0.0015 ($1.50 / 1k) | When enrichContacts: true yielded at least one email or social profile |
LinkedIn search URL (enrichLinkedIn) | FREE | Every place when enabled |
| Street View URL | FREE | Every place with coordinates |
Actor start (apify-actor-start) | $0.005 per GB of memory | Once per run, 2 events ($0.01) at the default 2 GB |
Free Apify accounts can run this actor with every feature enabled; charges simply draw on the monthly free credit Apify gives every account, so you can try a real run before you spend anything.
Cost examples
Basic run, 1,000 places, no reviews, no enrichment:
1,000 Γ $0.0008 = $0.80 in event charges.
Apify platform usage (compute and residential proxy) is billed to you separately at cost. Across a month of measured runs it came to between $0.45 and $0.85 per 1,000 places on a basic run, so budget roughly $1.25 to $1.65 per 1,000 all-in. Residential proxy traffic is almost all of it, so the figure moves with how heavy the pages are on the day.
Full-data run, 1,000 places with detail enrichment, 5 reviews each, contact enrichment hitting 60%:
$0.80 + (1,000 Γ $0.0007) + (5,000 Γ $0.0004) + (600 Γ $0.0015)
= $0.80 + $0.70 + $2.00 + $0.90 = $4.40 in event charges.
Platform usage on a full-data run is small. Each place's data crosses the residential proxy at roughly 0.15 to 0.25 MB per place in measured US runs (about 0.6 MB in a German-language run), which came to about $2 to $3 per 1,000 places in total platform usage on top of the $4.40 above. Detail enrichment and reviews stay off by default so a basic run is as fast and cheap as possible, and you opt in only for the places where you want phone, website, hours, and reviews. Filters (minRating, includeClosed) run before enrichment, so tightening them cuts the bill directly.
MCP Integration
Use this actor as a real-time tool for AI agents, no custom MCP server needed.
- Endpoint:
https://mcp.apify.com?tools=labrat011/google-maps-scraper - Auth:
Authorization: Bearer <APIFY_TOKEN> - Transport: Streamable HTTP
- Compatible with: Claude Desktop, Cursor, VS Code, Windsurf, Warp, Gemini CLI
Claude Desktop / Cursor config:
{"mcpServers": {"google-maps-scraper": {"url": "https://mcp.apify.com?tools=labrat011/google-maps-scraper","headers": {"Authorization": "Bearer <APIFY_TOKEN>"}}}}
Once connected, your AI agent can search Google Maps by keyword + location, pull reviews, extract business contact info, and generate LinkedIn research URLs, all from a natural language prompt.
Proxy guidance
Google aggressively blocks datacenter IPs on Maps. Residential proxies are strongly recommended.
The actor defaults to Apify's RESIDENTIAL proxy group (country US). You get that default everywhere, including runs started from the API, a saved task, a schedule, or an integration, so you do not have to pass proxyConfiguration just to get a working run.
With residential proxies, the actor reliably handles runs of thousands of places. On retry, a fresh proxy IP is requested automatically so Google sees a different IP instead of the blocked one.
Timeout & memory guidance
Detail enrichment, reviews, and contact enrichment each add requests per place, so runtime scales with your result count and which upgrades you enable.
Measured at the default 2 GB, places only:
| Max results | Detail | Reviews | Measured runtime | Recommended timeout |
|---|---|---|---|---|
| 250 | false | 0 | ~1.5 min | 600 s |
| 500 | false | 0 | ~4 min | 900 s |
| 1,000 | false | 0 | ~8 min | 1800 s |
| 5,000 | false | 0 | ~40 min | 3600 s |
Turning on detail enrichment or reviews adds two light requests per place. In measured runs, 15 fully enriched places with 3 reviews each took about 2 minutes, so budget around 10x the runtimes above.
Memory: the actor defaults to 2 GB and batch searches run in parallel, scaling with memory: 1 search at 512 MB, 2 at 1 GB, 3 at 1.5 GB and above. Lowering memory does not save money on a batch run, it just makes the run longer for the same total compute, so leave it at 2 GB unless you are running a single search.
Limitations
- Google Maps caps per-area results at ~120 places. Use multiple tight locations or GeoJSON polygons to drill into dense areas
- Reviews are limited to the most relevant reviews Google ships with each place, at most 8 and usually 5. A higher
maxReviewsPerPlacereturns at most that many - Email enrichment reads the website's text,
mailto:links and Cloudflare-protected addresses, and checks the contact page when the homepage has no email. Emails that only appear in images or behind forms are not found - Results stay inside the area you searched. When nothing matches nearby, Google shows places from other regions; those are dropped and not charged. With a GeoJSON Polygon, only places inside the polygon are returned
placeUrlsaccepts full place links (from the address bar or the Share button),?cid=links andplace_id:links. A link with only a name and coordinates cannot be resolved and is skipped, not charged. The same place given twice is returned once- LinkedIn search URLs are built from business names, so accuracy depends on the name being unique (a company named "Acme" will return many false matches)
- Contact enrichment adds one request per unique website, cached within the run
- Google sometimes answers a detail request with a partial place (today's hours only, no review count, no reviews). Detail enrichment asks again once on a fresh IP and keeps the fuller answer. A place that comes back partial twice is returned as Google gave it
- Opening hours follow Google's localized format (day names match the
languagesetting)
Legality
This actor only accesses publicly visible Google Maps data, the same information any browser visitor can see. It does not bypass login walls, solve CAPTCHAs, or access private data. Web scraping of publicly available data is generally legal, as established by the hiQ Labs v. LinkedIn ruling. However:
- Always check Google's Terms of Service before using scraped data commercially
- GDPR / CCPA apply when scraping personal data. Handle emails and phone numbers responsibly
- Do not re-publish scraped content verbatim. Use it for research, enrichment, and private internal workflows
You are responsible for your own compliance.
FAQ
Do I need a Google Maps API key?
No. This actor scrapes public HTML pages and requires no Google credentials.
Will I get blocked by Google?
Not with residential proxies. Datacenter IPs get blocked within a few requests. The actor defaults to RESIDENTIAL proxy group and rotates IPs automatically on 429/403.
Why is my run returning fewer results than maxResults?
Google caps per-area results at ~120 places. To get more, use tighter locations (city neighborhoods, ZIP codes) or custom GeoJSON polygons that subdivide large areas.
How do I scrape only 5-star places?
Set minRating: 5 in your input. The actor will skip any place rated below 5 stars.
Can I use this for B2B lead generation?
Yes. Enable enrichContacts for emails + social profiles, and enrichLinkedIn for LinkedIn search URLs. Pair with labrat011/linkedin-jobs-scraper for hiring-manager / recruiter research.
What's the difference between placeId and googleCid?
placeId is Google's canonical place identifier (what the Places API uses). googleCid is an older hex-encoded ID still embedded in Google Maps URLs. Both are included for cross-referencing with other tools.
Does the actor support pagination beyond 120 results per query?
Not directly. Google enforces a hard cap. Use batch mode (keywordsList Γ locationsList) or GeoJSON tiles to cover large areas.
Why is reviewCount missing from my results?
Google often leaves the review count off Maps search result cards, so a basic run may not be able to read it. Turn on enrichDetails: true and the count comes from each place's own data. Ratings come through on every run.
When no count is available the field is left out of the record rather than set to 0. That is deliberate: a place with genuinely zero reviews and a place whose count Google does not publish are different facts, and reporting the second as zero would be wrong. If you aggregate on reviewCount, check whether the key is present rather than treating a missing value as zero.
One search in my batch found nothing. Does that kill the run?
No. In batch mode (keywordsList Γ locationsList) a search that genuinely has no matches is logged as a warning and skipped, and every place found by the other searches is still written to your dataset. The run only fails if every single search comes back empty, which points at a proxy or region block rather than an empty result set.
Can I resume a failed run?
Yes. Apify state survives actor migrations; the actor picks up where it left off. For very large runs, split across multiple smaller jobs for resilience.
Support
Open an issue on the Apify Issues tab or message me through the Apify platform.