Google Maps · Leads by Category & City
Pricing
from $1.05 / 1,000 place with emails
Google Maps · Leads by Category & City
Pick a trade and a list of cities. We collect matching Maps places and fill phone, website, published email and socials. Never invented. No login.
Pricing
from $1.05 / 1,000 place with emails
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Pick a trade and a list of cities. Maps returns matching places. You get one row per pin: name, address, phone, website, a published email, and social profiles from the business website when they exist.
No login. No API key. We never invent a mailbox, phone, or social URL.
Need to enrich a CRM file you already have (name + street + city)? Use Google Maps · Emails & Phones by Search instead.
Who is this for?
| You are… | Typical goal | Suggested setup |
|---|---|---|
| Local outbound / SDR | Build a city list for one trade | Category + 1–3 cities, website crawl on |
| Agency / lead gen | Same trade across several markets | Category + city list, 20–40 places per city |
| Franchise / network scout | See who already operates in a city | One category, raise places per city toward 80 |
| Market research | Count shops and who publishes a site | Overview view; email off if you only need pins |
What you get by default: name, address, Maps URL, public phone and website when Maps shows them, rating when visible. Website crawl then adds a published mailbox and socials when they exist.
When to keep website crawl on: Maps almost never shows an inbox or Instagram on the pin.
Quick start
- Open the Actor in Apify Console.
- Choose a Business category (or type any Maps query, e.g.
plombier). - Paste cities, one per row. Paris, Lyon and Marseille become one search per arrondissement (Maps would otherwise repeat downtown). Free plan: 20 / run.
- Keep Find email, phone and socials on the website on. First runs: 20 places per city. Free plan: 20 / run.
- Click Start. Open the Dataset while it fills.
Ready-made examples (published tasks)
These live in the Examples tab:
| Example | Best for |
|---|---|
| Plumbers in Lyon | Home services, first city |
| Dentists in Paris | Health / local CRM |
| Restaurants in Bordeaux | Hospitality outbound |
| Hair salons in Marseille | Beauty leads, CRM view |
What it extracts
| Category | Fields |
|---|---|
| Search | searchQuery, searchCategory, searchCity, rankInResults |
| Identity | placeName, category |
| Address | fullAddress, streetAddress, postalCode, city |
| Contact | phone, phoneSource, website, email, emailSource |
| Social | facebookUrl, instagramUrl, linkedinUrl, tiktokUrl, youtubeUrl, twitterUrl, whatsappUrl |
| Maps | mapsUrl, latitude, longitude, plusCode |
| Extra | rating, reviewCount, openingSummary, openingHoursDetailed, permanentlyClosed |
Do we need every Google Maps category?
No. Google does not publish a stable, complete list of place types, and the list changes by language and country. Maps is a search box.
This Actor ships a short list of common trades as Console shortcuts. Anything else (French plombier, cabinet dentaire, a niche, a brand) goes in Custom Maps query and is searched as you typed it.
Input
| Field | What it does |
|---|---|
businessCategory | Preset trade (plumber, dentist, restaurant, …). |
customCategory | Optional. Overrides the preset. Any Maps query. No prefill. |
cities | One city per row. Paris, Lyon, Marseille → arrondissements unless you turn that off. |
splitLargeCities | Default on. One Maps search per arrondissement on those three cities. |
maxPlacesPerCity | Scroll depth per Maps area (1–80, default 20). |
enrichFromWebsite | Published email, missing phone, socials on the business site / Facebook page (default on). |
Free plan: 20 places / run. Paid plans follow PPE / your max charge.
API-only: maxPlaces (run ceiling, 0 = no cap), mapsCountry, placeDetailScrape, searchConcurrency (default 8).
Example — plumbers in two cities
{"businessCategory": "plumber","cities": ["Lyon", "Nantes"],"maxPlacesPerCity": 20,"enrichFromWebsite": true}
Example — French query
{"businessCategory": "custom","customCategory": "plombier","cities": ["Lyon"],"maxPlacesPerCity": 40,"enrichFromWebsite": true}
Output example
{"searchQuery": "plumber Lyon","searchCategory": "plumber","searchCity": "Lyon","rankInResults": 1,"placeName": "Example Plumbing Lyon","fullAddress": "10 Rue de la République, 69001 Lyon","streetAddress": "10 Rue de la République","postalCode": "69001","city": "Lyon","phone": "04 00 00 00 00","phoneSource": "maps","website": "https://example-plombier.fr","email": "contact@example-plombier.fr","emailSource": "business-website","category": "Plumber","mapsUrl": "https://www.google.fr/maps/place/..."}
Download in JSON, CSV, Excel, or HTML from the Dataset tab.
How it works
- Build one Maps search per city: category + city.
- Open Google Maps (country inferred from the cities; France if unclear) — default 8 searches at once.
- Scroll the sidebar up to
maxPlacesPerCity(max 80). - If website crawl is on, fetch published email, missing phone, and social URLs.
- Places still without email but with a Facebook page go to Facebook Pages · Email, Phone & Website (needs Full permissions).
- Charge place-with-email, place-with-phone, or place-without-phone, then push the row.
How much does it cost to scrape Google Maps?
Same PPE as the name + address Actor. Browser compute is billed on top.
| Event | Free / 1k | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Place with email (primary, socials included) | $1.50 | $1.35 | $1.20 | $1.05 | $0.90 | $0.75 |
| Place with phone, no email | $0.50 | $0.45 | $0.40 | $0.35 | $0.30 | $0.25 |
| Place without phone | $0.20 | $0.18 | $0.16 | $0.14 | $0.12 | $0.10 |
| Actor start | $0.00005 / GB | same | same | same | same | same |
| Scenario | Approx. cost (Free PPE) |
|---|---|
| 20 places with phone only | ~$0.01 + start + compute |
| 20 places with email | ~$0.03 + start + compute |
| 1,000 places with phone | $0.50 + start + compute |
| 1,000 places with email + socials | $1.50 + start + compute |
Is scraping Google Maps free?
On the Apify Free plan you get 20 places per run. Upgrade for bulk.
Is it legal to scrape Google Maps?
This Actor only reads public Maps results, public business websites, and public Facebook pages. You must have a lawful basis (GDPR / ePrivacy) for your use case. See Apify's guide to web scraping legality.
Limits
- One trade × many cities, not a name + address match. For a known shop, use the name + address Actor.
- Up to 80 places per Maps area (city or arrondissement). Paris = 20 searches, not 20× the same downtown list.
- Empty
emailmeans none was published. We never guesscontact@domain. - Facebook nested run needs Full permissions.
FAQ
Why is email empty? We only keep an address published on the business website or Facebook page.
Why is website empty? Maps did not show a site on that pin. We open each result (list click, or the place URL if the list click misses) and wait for that pin’s Site internet chip. We never invent a URL.
Can I search outside France? Yes. Country is inferred from city names. Override with API mapsCountry.
How do I export for CRM? Dataset view Outreach / CRM.
Local development
cd google-maps-city-leadsnpm installnpm testapify run --purge --input-file=./.actor/INPUT.json
Also available
Google Maps · Emails & Phones by Search — paste name + address to match one pin.
PagesJaunes · Email & Website Scraper from URL — French directory URLs to emails, phones and SIRET.
Support
Contact corentin@outreacher.fr if you need a custom scraper or a tailored trade mapping.