Google Maps Business & Contact Scraper avatar

Google Maps Business & Contact Scraper

Pricing

from $3.50 / 1,000 results

Go to Apify Store
Google Maps Business & Contact Scraper

Google Maps Business & Contact Scraper

Extract businesses from Google Maps by search term and location: name, address, phone, website, emails, social_links, rating, review_count, hours and coordinates. Emails and social profiles cost nothing extra. Export JSON, CSV or Excel.

Pricing

from $3.50 / 1,000 results

Rating

0.0

(0)

Developer

herus13

herus13

Maintained by Community

Actor stats

2

Bookmarked

519

Total users

146

Monthly active users

3 days ago

Last modified

Share

The Google Maps Scraper extracts businesses from Google Maps by search term and location — name, address, phone, website, emails, social links, rating, review count, opening hours and coordinates, 24 fields in every row. Emails and social profiles are part of the result price, not an add-on.

What you get

One dataset row per business, ready to export as JSON, CSV or Excel.

{
"place_id": "ChIJb5gBC-u0RIYRHkntaUcdJGs",
"name": "ATX Family Dental",
"address": "1700 S 1st St, Austin, TX 78704, United States",
"phone": "+1 512-717-3147",
"website": "https://www.atxfamilydental.com/",
"emails": ["info@atxfamilydental.com"],
"rating": 4.9,
"review_count": 802,
"categories": ["Dentist", "Cosmetic dentist"],
"latitude": 30.2482229,
"longitude": -97.7559705
}

A full row also carries email_type, has_contact_form, hours, google_maps_url, social_links, reviews, images, neighborhood, timezone, country_code, business_photo, open_status, price_level, popular_times and scraped_at.

What it costs

EventFreeBronzeSilverGold+
result (apify-default-dataset-item)$0.009$0.007$0.005$0.0035
Actor Start (apify-actor-start)$0.01$0.01$0.01$0.01

You pay per business returned, and that one price already covers emails, social profiles, reviews and photos — there is no add-on event and no subscription. A thousand businesses with emails is about $9.02 on the Free tier and about $3.52 on Gold, including the one-off start charge at the default 2 GB of memory. The residential proxy the run needs is included too.

Input

FieldTypeRequiredDefaultWhat it does
searchStringsArrayarrayyes—What to look for on Google Maps. Add one search term per entry, for example dentist, plumber or coffee shop. Every term is searched inside the place given in locationQuery, and every business found becomes one row. Required.
locationQuerystringno—Where to search, written the way you would type it into Google Maps: Austin, TX, New York, USA, London, UK, or a whole country. Leave empty to let each search term carry its own location.
maxCrawledPlacesPerSearchintegerno100Most businesses to return for each search term, from 1 to 500, counted after your filters. Default 100. The run keeps searching until it has this many matches or Google has no more results. Google shows about 120 businesses for a single map view, so a strict filter can return fewer — turn on geo_split to search a wider area.
maxCrawledPlacesintegerno0Most businesses the whole run returns across all search terms together, counted after your filters. Default 0, which means no ceiling. You pay per business returned, so this caps your bill: 20 terms at 100 results each is 2,000 rows. The ceiling is shared out across your search terms, so every term gets a share instead of the first one using it all; a term that finds nothing hands its share back to the others.
languagestringno"en"Language of the Google Maps results and of the text inside each row. Default en. Supported codes: en, es, fr, de, it, pt, ja, ko, zh-CN, zh-TW, ar, hi, ru, nl, pl, tr, vi, th, id.
scrapeContactsbooleannotrueLook up each business site and add the email addresses and social profile links it publishes to the row, as emails, email_type and social_links, plus has_contact_form when the site takes messages through a form instead of showing an address. Default true. These fields are part of the result price, so leaving this on costs nothing extra.
scrapeSocialMediaProfilesobjectno{"facebooks": true, "instagrams": true, "youtubes": true, "tiktoks": true, "twitters": true, "linkedins": true}Which social networks to collect from each business site. Default {"facebooks": true, "instagrams": true, "youtubes": true, "tiktoks": true, "twitters": true, "linkedins": true}; set a key to false to leave that network out. Has no effect while scrapeContacts is off.
scrapePlaceDetailPagebooleannofalseAlso open each business's own Google Maps page to fill in hours, price_level and any phone or site the search results left blank. Default false, because it makes a run noticeably longer. Emails and social profiles arrive without it.
maxReviewsintegerno0How many reviews to attach to each business, from 0 to 500. Default 0, which leaves reviews out. A business page carries roughly the first 8, so larger numbers return what that page holds. For a full review history use the Google Maps Reviews Scraper instead.
reviewsSortstringno"newest"Which reviews you get when maxReviews is above 0: newest for the most recent first, mostRelevant for Google's own ranking, highestRating for the best first, lowestRating for the worst first. Default newest.
maxImagesintegerno0How many photo URLs to attach to each business, from 0 to 50. Default 0, which leaves images out.
placeMinimumStarsstringno""Keep only businesses rated at or above this many stars: 1, 2, 3, 4 or 4.5. Leave empty, the default, to keep every rating including businesses with no rating yet. Businesses this filter leaves out are not returned, not charged, and do not count toward your limits.
skipClosedPlacesbooleannotrueLeave out businesses Google marks as permanently closed, so you do not pay for dead leads. Businesses this filter leaves out are not returned, not charged, and do not count toward your limits. Default true.
websitestringno"allPlaces"Filter on whether the business has its own website: allPlaces keeps every business, withWebsite keeps only those that have one, withoutWebsite keeps only those that do not. A Facebook, Instagram, X, LinkedIn, YouTube or TikTok page is not a website: it arrives in social_links and the business counts as having no website. Businesses this filter leaves out are not returned, not charged, and do not count toward your limits. Default allPlaces.
geo_splitbooleannofalseCover a large area by splitting it into a grid and searching each cell, which gets you past the roughly 120 businesses Google returns for one map view. Default false. Turn it on for anything wider than a single city.
geo_split_max_cellsintegerno100Upper bound on how many grid cells geo_split may use, from 1 to 500. Default 100. A wider area uses bigger cells to stay inside this bound.
max_requests_per_minuteintegerno60Ceiling on how many requests the run sends per minute, from 10 to 120. Default 60. Lower it to be gentler on a long run, raise it to finish sooner.
max_concurrencyintegerno10How many businesses are enriched at the same time, from 1 to 10. Default 10. Lower it for a gentler run; max_requests_per_minute still caps how fast requests go out.
request_delayintegerno0Extra seconds to wait between requests, on top of the per-minute ceiling. Default 0, which adds no wait at all.
cache_providerstringno"memory"Where the run keeps the business data it has already collected, so the same place is not collected twice: memory for the run's own memory, file for the run's disk, apify for an Apify key-value store. Default memory.
cache_ttl_secondsintegerno86400How long kept business data stays usable before it is collected again, in seconds, from 60 to 604800 (seven days). Default 86400, which is 24 hours.
proxyUrlsarrayno—Leave empty and the run uses a residential proxy that is included in the price of the run. To route through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port. Works with DataImpulse, Bright Data, Oxylabs, Smartproxy or any provider that issues URLs. When you set this, only these URLs are used.

How to run it

  1. Open the actor on Apify Console and click Try for free.
  2. Put your search terms into Search Queries and a city, state or country into Location.
  3. Run it. Results stream into the dataset while the run is still going; export them as JSON, CSV or Excel, or read them from the Apify API.
{
"searchStringsArray": ["coffee shop"],
"locationQuery": "California, USA",
"maxCrawledPlacesPerSearch": 500,
"maxCrawledPlaces": 5000,
"scrapeContacts": true,
"maxReviews": 5,
"geo_split": true
}

Minimal input:

{
"searchStringsArray": ["dentist"],
"locationQuery": "Edinburgh, UK",
"maxCrawledPlaces": 5
}

Available as the MCP tool herus13--google-maps-scraper on mcp.apify.com and through the Apify API; send the same JSON.

Why this scraper

  • Contact data is included. Emails, the personal-or-generic classification in email_type, and Facebook, Instagram, LinkedIn, X, YouTube and TikTok links all arrive at the one result price. Most Google Maps scrapers bill those as extras on top of a lower headline price.
  • Twenty-four fields per business, including the ones people usually have to go back for: opening hours, price level, popular times, neighborhood, timezone and country code.
  • Whole regions, not one map view. Google itself stops at roughly 120 businesses for a single map view. Turn on geo_split and a state- or country-wide search is split into a grid and covered cell by cell.
  • Drop-in replacement. The input field names match the Google Maps actor most teams already use, so an existing configuration can be pasted in unchanged.
  • No duplicates. Rows are keyed on the Google place ID, so the same business never appears twice in one run.

Use cases

  • Local lead generation — a search term plus a location gives you a contactable list, with phone, site, emails and social profiles already on the row, rather than a list of names you then have to enrich somewhere else.
  • Sales prospecting with qualification built in — ratings, review counts and opening hours arrive in the same row as the contact details, so a list can be filtered down to businesses that are active and well reviewed before anyone picks up a phone.
  • Local SEO auditing — compare how businesses show up for a term across areas and find the ones with no site or an incomplete listing, which are exactly the openings an agency sells against.
  • Market research and territory mapping — every record carries coordinates, so results drop straight into a mapping or territory-planning tool.
  • Competitor tracking — schedule the same search weekly and watch new entrants, closures and rating movements in a territory.

FAQ

Do I need a proxy? A residential proxy is included in the price of the run. To use your own, paste gateway URLs into Your own proxy URLs. Scraping at volume? Your own DataImpulse account is cheaper per GB.

How many results can I get for one search? Google returns about 120 businesses for a single map view. Set geo_split to true and the area is split into a grid, which returns thousands of businesses across a state or country in one run. maxCrawledPlacesPerSearch still caps each search term, across every cell of the grid.

Why did I get fewer results than expected? Google ran out of businesses that match your filters. Both limits count businesses that match, so the run keeps searching past the ones a filter leaves out, and you only get fewer when the area has no more. Strict filters get there fast: with website: "withoutWebsite" often only one plumber in ten qualifies, and a business whose only site is a Facebook, Instagram or other social page counts as having no website. The run log shows, for each search term, how many businesses Google showed and how many matched. Turn on geo_split to search a wider area.

How do I get reviews? Set maxReviews above 0 and each row gains author, star rating, text, date and the owner's reply. A business page carries roughly the first 8 reviews; for a full review history use the Google Maps Reviews Scraper below.

Why are some emails missing? Not every business publishes one. Service businesses such as law firms, dentists and plumbers have far better email coverage than restaurants or retail.

Is this legal? The actor collects publicly available business information only. You remain responsible for complying with Google's terms and with the law that applies to you, and you should not collect personal data without a lawful basis for it.

  • Google Maps Reviews Scraper — every review for a place: text and English translation, star rating, photos, owner replies and reviewer details.
  • LinkedIn Profile Scraper — structured LinkedIn profiles with full experience history and optional email and phone enrichment.
  • LinkedIn Jobs Scraper — LinkedIn job listings with company enrichment, salary and recruiter information.
  • TikTok Shop Product Scraper — TikTok Shop products across 10 regions: variants, prices, seller information, ratings and sold counts.