Google Maps Leads Scraper avatar

Google Maps Leads Scraper

Pricing

from $1.10 / 1,000 places

Go to Apify Store
Google Maps Leads Scraper

Google Maps Leads Scraper

Google Maps scraper for leads: export businesses by keyword and city with phone, website, address, rating, hours, and optional emails and social links from their websites. No login.

Pricing

from $1.10 / 1,000 places

Rating

0.0

(0)

Developer

Keklik Technologies

Keklik Technologies

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Google Maps Leads Scraper lets you scrape businesses from Google Maps by keyword and location and export them as leads to JSON, CSV or Excel: name, category, address, phone, website, rating, review count, opening hours, coordinates and Place ID, plus, if you turn them on, emails and social profiles from each business's website, the review breakdown per star, and the latest reviews. Type "dentist" and "Marseille, France", press Start, and get every dentist in the city. No Google account, no login and no API key are needed.

What data can you extract from Google Maps?

Each place becomes one row with up to 53 fields:

GroupFields
BusinessName, main category and all categories, description, owner name, claimed profile flag, temporarily or permanently closed flags
ContactPhone (as shown and in international format), website, order-online links, reservation link
LocationFull address, street, city, postal code, state or region, country code, neighborhood, latitude and longitude, time zone
ReputationStar rating, number of reviews, link to the reviews
Hours and attributesOpening hours per day, the About tab (accessibility, payments, amenities, service options...), main photo and photo count
IDsPlace ID, CID, Knowledge Graph ID, Google Maps link
Place details (optional)Reviews per star (1 to 5), review keywords with counts, delivery and takeout hours, plus code
Emails and social profiles (optional)Emails and phone numbers found on the website; Facebook, Instagram, LinkedIn, X, TikTok, YouTube and Pinterest profiles
Reviews (optional)The place's latest reviews: stars, text, date, owner response, reviewer
Run detailsThe search term and location the place was found with, its rank, the input, and when it was scraped

Use cases

  • Lead generation: build lists of local businesses (dentists, plumbers, restaurants, agencies) with phone numbers, websites and emails for sales outreach.
  • Web design and marketing agencies: find businesses without a website, with a low rating, or with an unclaimed profile.
  • Market research: count and map every business of a type in a city, with ratings and review counts, to size a market or find gaps.
  • Competitor analysis: compare competitors' ratings, reviews, hours and services across locations.
  • Local SEO: check categories, claimed status and review counts for the businesses that rank in your area.
  • Data enrichment: get Place IDs, coordinates and opening hours for a list of places.

How to scrape Google Maps

  1. Open Google Maps Leads Scraper in Apify Console and go to the Input tab.
  2. In Search terms, type what you are looking for, one per line: dentist, italian restaurant, plumber.
  3. In Locations, type where, one per line: Marseille, France, Brooklyn, NY, 75011 Paris.
  4. Optionally set Max places per search, filters such as Min rating or Website, and the extras: Place details, Emails and social profiles from websites, Reviews per place.
  5. Click Start and watch the places appear in the Output tab.
  6. Download the data as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

Input

FieldWhat it does
Search termsWhat to search for, one per line. Each term is searched in every location.
LocationsWhere to search: a city, district, postal code or region. The scraper finds the area's outline and splits it into map tiles, as many as it needs, so it gets far more than the 200 places a single Google Maps search shows. Leave it empty to search the terms as typed ("pizza in Brooklyn"), which gives at most about 200 places per term.
Google Maps URLsOptional. Search URLs (https://www.google.com/maps/search/dentist/@43.29,5.37,14z) are searched over the map area they show. Place URLs, ?cid= links, maps.app.goo.gl links and Place IDs give one row each.
Max places per searchStops each search term and location pair after this many places. Leave it empty to cover the whole area.
LanguageLanguage code (en, fr, de, pt-BR...) for categories, opening hours, attributes and reviews.
Min rating, Min reviewsKeep only places rated at least 2.0+ to 4.5+, or with at least this many reviews.
Website, PhoneKeep only places with, or only places without, a website or a phone number.
Skip closed placesLeave out places marked temporarily or permanently closed.
Skip unrelated placesOn by default. Leaves out the places Google adds around the real matches once an area runs out of them, such as osteopaths in a dentist search.
Place detailsAdds reviews per star, review keywords, delivery and takeout hours and the plus code. One extra request per place.
Emails and social profiles from websitesVisits each place's website (home page and up to 3 contact, about or legal pages) for emails, phone numbers and social profiles.
Reviews per place, Reviews sortAdds up to this many reviews to each place, newest first or in another order.
Max resultsStops the whole run after this many places.
{
"searchTerms": ["dentist", "orthodontist"],
"locations": ["Marseille, France"],
"maxPlacesPerSearch": 500,
"websiteFilter": "with",
"contactDetails": true
}

Output

A shortened row from a real run:

{
"name": "Maison Charlie",
"category": "Restaurant",
"categories": ["Restaurant", "Chocolate cafe", "Coffee shop", "Espresso bar", "French restaurant", "Patisserie", "Tea house"],
"address": "38 Rue Caisserie, 13002 Marseille, France",
"street": "38 Rue Caisserie",
"city": "Marseille",
"postal_code": "13002",
"country_code": "FR",
"lat": 43.296977,
"lng": 5.367349,
"phone": "+33 4 91 52 44 82",
"phone_unformatted": "+33491524482",
"website": "https://maisoncharlie.fr/",
"rating": 4.8,
"reviews_count": 1169,
"opening_hours": [
{"day": "Monday", "hours": "8 AM–6 PM"},
{"day": "Saturday", "hours": "9 AM–4 PM"},
{"day": "Sunday", "hours": "Closed"}
],
"is_claimed": true,
"about": {"Accessibility": {"Wheelchair accessible entrance": false}},
"timezone": "Europe/Paris",
"place_id": "ChIJi_GO28PAyRIR8lA2xszYZW0",
"cid": "7882945096792297714",
"kgmid": "/g/11cjg9nkyv",
"url": "https://www.google.com/maps?cid=7882945096792297714",
"reviews_distribution": {"one_star": 10, "two_stars": 10, "three_stars": 21, "four_stars": 172, "five_stars": 956},
"review_tags": [{"tag": "focaccia", "count": 60}],
"search_term": "restaurant",
"search_location": "Marseille, France",
"rank": 2,
"scraping_time": "2026-10-16T16:02:11+00:00"
}

You can export the dataset to JSON, CSV, Excel, XML and HTML from the Output tab or through the API. The Output tab's overview table shows each place's name, category, address, phone, website, rating, review count, emails and Google Maps link.

What to know about the data

  • Coverage: one Google Maps search shows at most 200 places, and fewer the wider the map. For a location, the scraper searches the whole area first, then splits it in four and searches each quarter again wherever many matching places remain, until the tiles come back nearly empty. In our test, "dentist" in Marseille gave 871 places from 145 searches, where a single search shows 200.
  • Area edges: the area is the location's bounding box, a rectangle, so towns at its edges can appear too. Use the city or postal_code column to narrow the list down.
  • Unrelated places: when an area runs out of real matches, Google fills the list with nearby places of other kinds. Skip unrelated places keeps the places whose categories match the best results of the first search (or whose name has the search term, for brand searches such as "Starbucks").
  • Search in the local language for best results: Google matches your term against business categories. English works almost everywhere; if a search returns little, try the term in the local language (dentiste, Zahnarzt).
  • Emails come from the business's own website, not from Google. Many small businesses don't publish one, and some websites block visitors or load their content with JavaScript only, so expect emails for part of the places.
  • No duplicates: a place appears only once per run, even when several searches or tiles find it.

How much does it cost to scrape Google Maps?

Google Maps Leads Scraper uses pay-per-event pricing: you pay per place in the dataset, plus each extra you turn on.

EventFreeBronzeSilverGold
Place (every row)$3.00$2.25$1.50$1.10
Place details (when turned on)$1.50$1.50$1.10$0.80
Emails and social profiles (only places where the website gave something)$1.50$1.50$1.10$0.80
Review (each review added with Reviews per place)$0.40$0.35$0.28$0.20

Prices are per 1,000 events.

For example, 1,000 dentists with emails and social profiles cost at most $4.50 on the Free plan and $1.90 on Gold. Filters are free: you don't pay for using them, and places they remove cost nothing.

Use Max places per search and Max results to cap what a run can spend.

Integrations and API

Run Google Maps Leads Scraper from your own code with the Apify API. The Actor ID is keklik/google-maps-leads-scraper.

Python, with apify-client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("keklik/google-maps-leads-scraper").call(run_input={
"searchTerms": ["plumber"],
"locations": ["Brooklyn, NY"],
"contactDetails": True,
})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
print(place["name"], place["phone"], place["emails"])

Node.js, with apify-client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('keklik/google-maps-leads-scraper').call({
searchTerms: ['plumber'],
locations: ['Brooklyn, NY'],
contactDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

You can also:

  • Schedule runs to refresh your lead lists every week or month.
  • Use webhooks to get notified, or trigger your own pipeline, when a run finishes.
  • Connect the results to Google Sheets, HubSpot, Make, Zapier, Slack and other tools through Apify integrations.
  • Let AI agents run the scraper through the Apify MCP server, for example from Claude or Cursor.

FAQ

The scraper collects only public business information that Google Maps shows to visitors who are not logged in. Some of it can still be personal data, such as a sole trader's name, phone number or email, or reviewers' names. Personal data is protected by laws such as the GDPR in the EU, so make sure you have a lawful reason to collect and use it, especially for cold outreach. If in doubt, ask a lawyer.

Do I need a Google account or a Google Maps API key?

No. You don't need a Google account, a login, cookies or a Places API key, and there is no proxy to set up.

How many places can I get?

As many as Google Maps has for your search in the area. A single Google Maps search stops at 200 places, but the scraper splits large areas into map tiles, so a city-wide search goes well beyond that. For a whole country, list its cities or regions as locations.

Why did some inputs fail?

Inputs that fail are listed, with the reason, in the FAILED record of the run's key-value store (Storage tab), not in the dataset:

  • invalid_input: not a Google Maps search or place URL.
  • location_not_found: Google Maps doesn't know the location. Check the spelling, or add the country.
  • not_found: the place doesn't exist or was removed.
  • no_matching_places: the search found no places, or none passed your filters.
  • blocked: Google refused every attempt. Run it again later.
  • google_error: Google answered with an error the scraper doesn't recognise. Please report it.

Can I get all the reviews of the places?

Reviews per place adds a few reviews to each row. For every review, one row per review, feed the url or place_id column into Google Maps Reviews Scraper.

Are the emails verified?

No. Emails are collected from the business's own website and checked for obvious junk (image names, placeholder addresses, code libraries), but not verified with a mail server.

Support

Found a bug or need a field that isn't there? Open an issue on the Issues tab and we'll look into it. Need a scraper for another site or a custom version of this one? Get in touch through the Issues tab too.