Google Maps · Leads by Category & City avatar

Google Maps · Leads by Category & City

Pricing

from $1.05 / 1,000 place with emails

Go to Apify Store
Google Maps · Leads by Category & City

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

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 goalSuggested setup
Local outbound / SDRBuild a city list for one tradeCategory + 1–3 cities, website crawl on
Agency / lead genSame trade across several marketsCategory + city list, 20–40 places per city
Franchise / network scoutSee who already operates in a cityOne category, raise places per city toward 80
Market researchCount shops and who publishes a siteOverview 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

  1. Open the Actor in Apify Console.
  2. Choose a Business category (or type any Maps query, e.g. plombier).
  3. Paste cities, one per row. Paris, Lyon and Marseille become one search per arrondissement (Maps would otherwise repeat downtown). Free plan: 20 / run.
  4. Keep Find email, phone and socials on the website on. First runs: 20 places per city. Free plan: 20 / run.
  5. Click Start. Open the Dataset while it fills.

Ready-made examples (published tasks)

These live in the Examples tab:

ExampleBest for
Plumbers in LyonHome services, first city
Dentists in ParisHealth / local CRM
Restaurants in BordeauxHospitality outbound
Hair salons in MarseilleBeauty leads, CRM view

What it extracts

CategoryFields
SearchsearchQuery, searchCategory, searchCity, rankInResults
IdentityplaceName, category
AddressfullAddress, streetAddress, postalCode, city
Contactphone, phoneSource, website, email, emailSource
SocialfacebookUrl, instagramUrl, linkedinUrl, tiktokUrl, youtubeUrl, twitterUrl, whatsappUrl
MapsmapsUrl, latitude, longitude, plusCode
Extrarating, 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

FieldWhat it does
businessCategoryPreset trade (plumber, dentist, restaurant, …).
customCategoryOptional. Overrides the preset. Any Maps query. No prefill.
citiesOne city per row. Paris, Lyon, Marseille → arrondissements unless you turn that off.
splitLargeCitiesDefault on. One Maps search per arrondissement on those three cities.
maxPlacesPerCityScroll depth per Maps area (1–80, default 20).
enrichFromWebsitePublished 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

  1. Build one Maps search per city: category + city.
  2. Open Google Maps (country inferred from the cities; France if unclear) — default 8 searches at once.
  3. Scroll the sidebar up to maxPlacesPerCity (max 80).
  4. If website crawl is on, fetch published email, missing phone, and social URLs.
  5. Places still without email but with a Facebook page go to Facebook Pages · Email, Phone & Website (needs Full permissions).
  6. 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.

EventFree / 1kBronzeSilverGoldPlatinumDiamond
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 / GBsamesamesamesamesame
ScenarioApprox. 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.

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 email means none was published. We never guess contact@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-leads
npm install
npm test
apify 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.