Google Maps Scraper: Leads with Phones, Emails & Socials
Pricing
$3.00 / 1,000 place scrapeds
Google Maps Scraper: Leads with Phones, Emails & Socials
Extract businesses from Google Maps for lead generation: name, category, full address, phone, website, rating, reviews count, opening hours, coordinates, place ID — plus emails and social profiles from each website. Fast HTTP, no browser, pay per place.
Pricing
$3.00 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
Torix
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Google Maps Scraper — Business Leads with Phones, Emails & Socials
Extract businesses from Google Maps by keyword and location and get a clean lead list:
name, category (all categories), full address + street / city / ZIP / state / country, phone (local & international), website, rating, reviews count, price level, opening hours, coordinates, time zone, photo, claimed-by-owner flag, place ID, CID and Google Maps link.
Turn on "Find emails & social profiles" and every business website is visited to add emails, extra phones and Facebook / Instagram / LinkedIn / X / YouTube / TikTok — no extra charge.
How to run it in 3 steps
- Add your input. In Search terms paste what you look for, plus a city in Locations — e.g.
dentist+Austin, TX. The form is already filled with a working example, so you can skip this step for a first try. - Press Start. The prefilled run returns 30 places in about 4 s and costs about $0.090. Set Max results (cost cap) to cap the cost of bigger runs; you only pay for places actually delivered.
- Get the data. Open the Output tab and export JSON, CSV or Excel — or run it from the API, Make, Zapier, n8n or an AI agent (see below).
Features
- HTTP only, no browser: reads Google Maps' own JSON (no browser) — 20 complete places per request.
- Lead-ready: contacts from websites in the same run (in a test, 125 of 210 dentists & plumbers websites had an email).
- Term × location grid:
["dentist", "orthodontist"] × ["Austin, TX", "Denver, CO"]= 4 searches; duplicates across searches are removed. - Pay per place: $3 per 1,000 places. Filtered or duplicate places are free.
Use cases
- Local lead generation for agencies, SaaS and B2B sales (dentists, lawyers, contractors, restaurants…).
- Market & competitor research: density, ratings and categories by city.
- Data enrichment: phones, websites and socials for a list of business types.
Input
{"searchTerms": ["plumber", "dentist"],"locations": ["Austin, TX", "Denver, CO"],"maxPlacesPerSearch": 100,"scrapeContacts": true,"minRating": 4}
Output
Real output (default input)
First 2 of 30 records from a run with the prefilled input (3.6 s on a test machine; long values shortened here):
[{"title": "ATX Family Dental","category": "Dentist","categories": ["Dentist","Cosmetic dentist","Dental clinic"],"address": "1700 S 1st St, Austin, TX 78704, United States","street": "1700 S 1st St","city": "Austin","postalCode": "78704","state": "Texas","countryCode": "US","neighborhood": "Bouldin Creek","lat": 30.2482229,"lng": -97.75597049999999,"rating": 4.9,"reviewsCount": 915,"priceLevel": null,"phone": "+1 512-717-3147","phoneInternational": "+15127173147","website": "https://www.atxfamilydental.com/","description": null,"openingHours": [{"day": "Monday","hours": "8 AM–5 PM"},{"day": "Tuesday","hours": "8 AM–5 PM"},{"day": "Wednesday","hours": "8 AM–5 PM"}],"timezone": "America/Chicago","imageUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLf9YE2Bdc3RGh7j_-C22ozd1gxM9meDSVHwinM9s90aKHrkkbJND_Tg40n1G9qKjZgzi8GhZHyoMcMjioCGHRyU8za44…","claimedByOwner": true,"businessStatus": null,"placeId": "ChIJb5gBC-u0RIYRHkntaUcdJGs","cid": "7720327853776914718","fid": "0x8644b4eb0b01986f:0x6b241d4769ed491e","kgId": "/g/11cn2mvqwc","url": "https://www.google.com/maps/place/?q=place_id:ChIJb5gBC-u0RIYRHkntaUcdJGs","searchQuery": "dentist in Austin, TX","rank": 1,"scrapedAt": "2026-10-15T12:14:05.256Z"},{"title": "Breeze Dental","category": "Dentist","categories": ["Dentist","Cosmetic dentist","Dental clinic"],"address": "1601 S Lamar Blvd, Austin, TX 78704, United States","street": "1601 S Lamar Blvd","city": "Austin","postalCode": "78704","state": "Texas","countryCode": "US","neighborhood": "Zilker","lat": 30.2512668,"lng": -97.76482299999999,"rating": 4.8,"reviewsCount": 1001,"priceLevel": null,"phone": "+1 512-745-8825","phoneInternational": "+15127458825","website": "https://www.breezeoralcare.com/?utm_campaign=gmb","description": null,"openingHours": [{"day": "Monday","hours": "7 AM–4 PM"},{"day": "Tuesday","hours": "7 AM–4 PM"},{"day": "Wednesday","hours": "7 AM–4 PM"}],"timezone": "America/Chicago","imageUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLcz09P_HtShLU4hHyTsdCTqMqZ9-_prTwOGBg8nZO6EXepLMppAJ57vnXk-2XzaLIjgs7pldi_6ZTBxng2DIXVWcfGhN…","claimedByOwner": true,"businessStatus": null,"placeId": "ChIJrTahjN-0RIYRchMKUA6urbg","cid": "13307483850445296498","fid": "0x8644b4df8ca136ad:0xb8adae0e500a1372","kgId": "/g/11gtyt3hnm","url": "https://www.google.com/maps/place/?q=place_id:ChIJrTahjN-0RIYRchMKUA6urbg","searchQuery": "dentist in Austin, TX","rank": 2,"scrapedAt": "2026-10-15T12:14:05.257Z"}]
{"title": "Treaty Oak Dental","category": "Dentist","categories": ["Dentist", "Cosmetic dentist", "Dental clinic"],"address": "2905 San Gabriel St #202, Austin, TX 78705, United States","city": "Austin","postalCode": "78705","state": "Texas","countryCode": "US","lat": 30.2978463,"lng": -97.7472476,"rating": 4.8,"reviewsCount": 171,"phone": "+1 512-478-4411","phoneInternational": "+15124784411","website": "https://treatyoakdental.com/","openingHours": [{ "day": "Monday", "hours": "8 AM–5 PM" }],"placeId": "ChIJRRBY-XS1RIYRIsb3UXu9kfw","url": "https://www.google.com/maps/place/?q=place_id:ChIJRRBY-XS1RIYRIsb3UXu9kfw","emails": ["info@treatyoakdental.com"],"facebook": "https://facebook.com/treatyoakdental","searchQuery": "dentist in Austin, TX","rank": 8}
Pricing
- $3.00 per 1,000 places ($0.003 per place).
- The prefilled input returns 30 places → $0.09.
- Example: 1,000 places → $3.00; 10,000 → $30.00. Set Max results (cost cap) to limit any run.
- Filtered or duplicate places are free.
- Your Apify spending limit is respected exactly: the actor stops charging and finishes cleanly when it is reached. Apify platform usage (compute, proxy) is included in the price.
Use with AI agents (MCP), LangChain, RAG & the API
This actor is a ready-made tool for AI agents: an LLM can call it, wait for the run and read clean JSON back.
MCP server (Claude Desktop, Claude Code, Cursor, VS Code, any MCP client) — add Apify's hosted MCP server with this actor enabled as a tool:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=torix33/google-maps-scraper","headers": { "Authorization": "Bearer <APIFY_TOKEN>" }}}}
LangChain / LangGraph (pip install langchain-apify, set APIFY_API_TOKEN):
import jsonfrom langchain_apify import ApifyActorsTool, ApifyWrapperfrom langchain_core.documents import Document# 1) give the actor to an agent as a tooltool = ApifyActorsTool("torix33/google-maps-scraper")# 2) or load results as Documents for a RAG indexloader = ApifyWrapper().call_actor(actor_id="torix33/google-maps-scraper",run_input={"searchTerms": ["plumber", "dentist"], "locations": ["Austin, TX", "Denver, CO"], "maxPlacesPerSearch": 100, "scrapeContacts": True, "minRating": 4},dataset_mapping_function=lambda item: Document(page_content=json.dumps(item, ensure_ascii=False), metadata={"url": item.get("url")}),)docs = loader.load()
REST API — one synchronous call, dataset items in the response:
curl -X POST "https://api.apify.com/v2/acts/torix33~google-maps-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"searchTerms": ["plumber", "dentist"], "locations": ["Austin, TX", "Denver, CO"], "maxPlacesPerSearch": 100, "scrapeContacts": true, "minRating": 4}'
Also works with the Apify Python/JS clients, Make, Zapier, n8n, Google Sheets, webhooks and schedules. Export as JSON, CSV, Excel, XML or RSS.
RAG tip: A local-SEO or sales agent can call it with a term × city grid and immediately work with phone, emails, rating and reviewsCount.
Tips
- Google Maps shows about 200 places per search. For whole cities, search by district or ZIP code.
- Reviews text is not included (counts and ratings are).
Limitations
- Google Maps returns at most ~200 places per search — split a city by district or ZIP code to cover it.
- Ratings and review counts only, no review texts.
- Emails and social profiles come from the business website (
scrapeContacts), so places without a website have none. - Some business websites are down or block bots, so contacts can be missing for a few places (audit: 1–2 of 5 sites in 2 of 10 runs). The place itself is still returned; contacts are not charged separately.
- If Google Maps does not recognize a location (typos it cannot fix), it silently searches elsewhere. The run then warns in its status message ("none of the places is in …") — check the spelling, or use a city + country or a ZIP code.
- The actor reads Google Maps' internal response format; if Google changes it, fields can be missing until an update.
FAQ
Does it extract emails?
Yes. With scrapeContacts the actor visits each business website and adds emails and social profiles.
Why do I get ~200 places per search? That is Google Maps' own limit. Search by district or ZIP code to cover a whole city.
Does it return review texts? No — rating and review counts only.