Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $0.80 / 1,000 place results

Go to Apify Store
Google Maps Scraper

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_

mick_

Maintained by Community

Actor stats

0

Bookmarked

49

Total users

3

Monthly active users

4 days ago

Last modified

Share

Google Maps Scraper logo

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 + googleCid for 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 receiveNever 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 viewsoverview (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 placeId and googleCid across 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, leads presets 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

FieldTypeDefaultDescription
keywordsstring-Single keyword search (e.g. coffee shops)
locationstring-Single location (e.g. Austin, TX)
keywordsListstring[]-Batch keywords (overrides keywords)
locationsListstring[]-Batch locations (overrides location)
placeUrlsstring[]-Skip search and scrape these Google Maps URLs directly
customGeolocationobject-GeoJSON Point or Polygon for precise targeting
languageselectenLanguage of names, categories, and hours, whatever country the proxy exits in
countryCodeselectusGoogle region for search bias (ISO 3166-1 alpha-2), sent to Google as gl
minRatingselect00, 3, 4, 5. Drops places below this rating
includeClosedbooleantrueInclude permanently / temporarily closed places
maxReviewsPerPlaceinteger00 skips reviews entirely. Returns at most 8 per place (what Google ships with the place)
includeReviewSentimentbooleantrueAdds positive/neutral/negative review counts
enrichDetailsbooleanfalseRead each place's own data for phone, website, opening hours, review count, and images
enrichContactsbooleanfalseScrape email + socials from each place's website
enrichLinkedInbooleanfalseAdds LinkedIn search URL per result (free)
outputViewselectplacesplaces, reviews, or leads
maxResultsinteger100Total cap across all searches, 1 to 10,000
maxResultsPerSearchinteger100Cap per keyword Γ— location combo, 1 to 1,000
proxyConfigurationobjectRESIDENTIALResidential 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.

EventPriceTriggered 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)FREEEvery place when enabled
Street View URLFREEEvery place with coordinates
Actor start (apify-actor-start)$0.005 per GB of memoryOnce 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 resultsDetailReviewsMeasured runtimeRecommended timeout
250false0~1.5 min600 s
500false0~4 min900 s
1,000false0~8 min1800 s
5,000false0~40 min3600 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 maxReviewsPerPlace returns 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
  • placeUrls accepts full place links (from the address bar or the Share button), ?cid= links and place_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 language setting)

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.