Google Maps Scraper - Business Contacts & Ratings avatar

Google Maps Scraper - Business Contacts & Ratings

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Google Maps Scraper - Business Contacts & Ratings

Google Maps Scraper - Business Contacts & Ratings

Returns Google Maps places for any search and location: name, phone, website, address parts, coordinates, rating, review count, opening hours, categories, place id and a lead score. Reads past Google's 200-place list by searching the map in tiles. No browser, no login; filters cost nothing extra.

Pricing

from $8.00 / 1,000 results

Rating

5.0

(1)

Developer

Ben

Ben

Maintained by Community

Actor stats

1

Bookmarked

179

Total users

37

Monthly active users

12 days ago

Last modified

Share

📍 Google Maps Scraper: Business Contacts, Ratings and Leads

Returns the places Google Maps shows for a search: name, phone, website, address in parts, coordinates, rating, number of reviews, opening hours, categories, place id and a lead score. Give it "dentist" and "Austin, TX" and you get the dentists of Austin, thousands if you want them, without a Google login or API key. It reads past the roughly 200 places one Google list holds and keeps to the boundary of the city, district or state you name.

Price: until October 18, 2026 $10.00 per 1,000 places on the Apify Free plan; from October 19 $1.50 per 1,000 ($1.20 from Gold up). Filters, full details and reviews cost nothing extra, and a place that a filter drops is not charged. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

🔎 What is the Google Maps Scraper?

It calls the data requests Google Maps' own pages make, so no browser runs. A run of ten places takes about five seconds at 512 MB of memory; 260 dentists inside the city limits of Pasadena took 27 seconds.

One Google list ends after about 120 to 240 places. For more, the Actor searches the map of your location tile by tile, cuts every crowded tile into four and saves each place once. A map tile is a rectangle and a city is not, so the location is also looked up in OpenStreetMap: tiles outside the boundary are not searched and places outside it are not saved. A search for restaurants in Los Angeles returned 4,000 places in about two minutes from our own server, none of them from Pasadena, Glendale or Long Beach next door; 16 places on the city line carry a neighbouring town in their address.

What data does it extract?

  • Business: name, main category and all categories, description, price range, whether Google marks it permanently closed
  • Contact: phone in local and international format, website and its domain
  • Address: full address, street, neighborhood, city, state, postal code, country code, plus code
  • Position: latitude, longitude, time zone
  • Reputation: rating, number of reviews, lead score from 0 to 100
  • Opening hours: one entry per weekday
  • "About" tab: service options, accessibility, payments, parking and the other groups Google lists
  • Identifiers: place id, CID, feature id, Knowledge Graph id, Google Maps link
  • Media: main photo, number of photos, photo links on request
  • With full details: the number of 1, 2, 3, 4 and 5 star reviews and up to eight reviews with author, rating, text and date

What users of Google Maps scrapers report, and what this Actor does

The issue pages of the five most used Google Maps Actors on Apify were read on October 4, 2026:

Reported thereHere
"Wrong city", "results outside of my search", "gave Queensland and it is doing all of Australia"Places are kept to the boundary OpenStreetMap has for your location. Every row also carries city, state, postal code and country code
"ReviewCount always zero", "review count is not included"Google sends some answers without review counts. The Actor notices and asks again; in a test run of 260 places every rated place had its count
"Number of results less than expected", "the number of results is 500"Up to 20,000 places per search. The status message says whether Google has more or the map is read to its end
"Run consumed full credit balance", "kept running with max items set", charges for filtersA limit is exact, a place is saved once, a run stops at its maximum charge, and filtered places cost nothing
"Can I run multiple cities in one run?"queries and locations are lists; each query is searched in each location
"How can I exclude previous scrapings?"onlyNew with a monitor name, or excludePlaceIds
"Excel file has only true and false statements"Attributes are lists of what the place has, opening hours one entry per weekday

⬇️ Input

FieldTypeDefaultWhat it does
querystringWhat to search for: a kind of business, a brand or a business name
locationstringCity, district, state or country to search in
queriesarraySeveral search queries for one run
locationsarraySeveral locations; each query is searched in each of them
maxResultsinteger10Places to save per search, up to 20,000
startUrlsarrayPlace links, place ids, feature ids or Google Maps search links
modestringsearchdirect_urls reads only the links and ignores the query fields
minRatingnumberOnly places with at least this rating
minReviewsintegerOnly places with at least this many reviews
websiteFilterstringanyhas_website or no_website
skipClosedPlacesbooleanfalseLeave out permanently closed places
includeReviewsbooleanfalseFull details: price range, every "About" group, star distribution, up to eight reviews. One more request per place
maxReviewsinteger10Reviews to keep per place; Google shows a visitor eight at most
includePhotosbooleanfalseAdds photos, the photo links in Google's record
includeLeadScorebooleantrueAdds lead_score
languagestringenLanguage of categories, hours and descriptions
countryCodestringusCountry Google is told the visitor is in; decides phone and address format
onlyNewbooleanfalseSkip every place an earlier run with the same monitor name saved
monitorIdstringName of that memory
excludePlaceUrlsarrayPlaces to skip, as long Google Maps links
excludePlaceIdsarrayPlaces to skip, as place ids, CIDs or feature ids
debugModebooleanfalseLogs every request with its size and time

Example input

All dentists of a city:

{
"query": "dentist",
"location": "Austin, TX",
"maxResults": 2000
}

Prospects for a web agency: well-reviewed businesses without a website, in several cities:

{
"queries": ["plumber", "electrician"],
"locations": ["Denver, CO", "Boulder, CO"],
"websiteFilter": "no_website",
"minRating": 4.5,
"minReviews": 50,
"maxResults": 200
}

Known places by link or id, with full details and reviews:

{
"mode": "direct_urls",
"startUrls": [
"https://www.google.com/maps/place/Wayfare+Tavern/data=!4m7!3m6!1s0x8085808a62f79413:0x3754c526852815b7!8m2!3d37.7921097!4d-122.3999688!16s%2Fg%2F1tzgpfsc!19sChIJE5T3YoqAhYARtxUohSbFVDc",
"ChIJLeYyO_CAhYAR6j9XsEIm3GI"
],
"includeReviews": true
}

German results in German format:

{
"query": "Zahnarzt",
"location": "Leipzig",
"language": "de",
"countryCode": "de",
"maxResults": 300
}

Input names of the most used Google Maps Actor are read as well: searchStringsArray, locationQuery, maxCrawledPlacesPerSearch, placeIds, placeMinimumStars, website, scrapePlaceDetailPage and startUrls as a list of {"url": …}.

Two tested examples you can copy into your account: Austin coffee shops and Berlin coffee shops without the places you already have.

⬆️ Output

One row per place (from a run of October 4, 2026; the attributes are shortened here):

{
"name": "Piccolo Forno",
"rating": 4.7,
"review_count": 2433,
"address": "725 Columbus Ave, San Francisco, CA 94133",
"phone": "(415) 757-0087",
"website": "https://piccolo-forno-sf.com/",
"categories": ["Italian restaurant"],
"has_hours": true,
"plus_code": "RH2Q+G5 San Francisco, CA",
"url": "https://www.google.com/maps/place/Piccolo+Forno/data=!4m7!3m6!1s0x808580f03b32e62d:0x62dc2642b0573fea!8m2!3d37.801362999999995!4d-122.412033!16s%2Fg%2F11bwny13gr!19sChIJLeYyO_CAhYAR6j9XsEIm3GI",
"lead_score": 90,
"place_id": "ChIJLeYyO_CAhYAR6j9XsEIm3GI",
"cid": "7123610778461487082",
"feature_id": "0x808580f03b32e62d:0x62dc2642b0573fea",
"kgmid": "/g/11bwny13gr",
"category": "Italian restaurant",
"description": "Casual neighborhood trattoria with Italian classics & espresso in colorful, contemporary quarters.",
"price": null,
"latitude": 37.801362999999995,
"longitude": -122.412033,
"neighborhood": "Russian Hill",
"street": "725 Columbus Ave",
"city": "San Francisco",
"state": "California",
"postal_code": "94133",
"country_code": "US",
"phone_international": "+1 415-757-0087",
"domain": "piccolo-forno-sf.com",
"opening_hours": [
{"day": "Monday", "hours": "11:45 AM–10 PM"},
{"day": "Tuesday", "hours": "Closed"},
{"day": "Wednesday", "hours": "11:45 AM–10 PM"},
{"day": "Thursday", "hours": "11:45 AM–10 PM"},
{"day": "Friday", "hours": "11:45 AM–10 PM"},
{"day": "Saturday", "hours": "11:45 AM–10 PM"},
{"day": "Sunday", "hours": "11:45 AM–10 PM"}
],
"timezone": "America/Los_Angeles",
"permanently_closed": false,
"image_url": "https://lh3.googleusercontent.com/grass-cs/ACvplmOaCSW_8kML8cYCAeMcJaaqLelPtrlLcRushwRCby-qGUNeiOkVXxIdYoOnCeg-rDIO3OxP9G1iWM-qiA8YfKrWyKFvrAWirwpXv3DnmBc3lxwOrokGmMrO-A93Rc5wDF9UDv371Q=w1200-h900-k-no",
"photo_count": 1877,
"attributes": {
"Accessibility": ["Wheelchair accessible entrance", "Wheelchair accessible restroom", "Wheelchair accessible seating"]
},
"query": "restaurants San Francisco, CA",
"rank": 1,
"scraped_at": "2026-10-04T16:49:33.005772+00:00"
}

This row came without full details, so price is empty and attributes has one group; with includeReviews a restaurant has its price range and 12 to 14 groups. rank is the position in Google's own list; places found on map tiles have none. With includeReviews a row also has reviews_distribution ({"1": 60, "2": 34, "3": 94, "4": 303, "5": 1942}; in a test of 60 places the five numbers added up to review_count every time) and reviews, each with author, author_url, rating, text, language, published_at, age and url. With includePhotos it has photos. The run also writes a SUMMARY record: places saved and read per search, how each search ended, and whether a boundary was applied.

💰 What a run costs

Apify planPer 1,000 places until October 18, 2026From October 19, 2026
Free$10.00$1.50
Bronze$9.00$1.40
Silver$8.50$1.30
Gold$8.00$1.20
Platinum$7.50$1.20
Diamond$7.00$1.20

Apify's standard start event ($0.00005) is the only other charge. Full details, reviews, photos, filters and the boundary are included. Not charged: a place a filter or an exclusion drops, a place outside the boundary, a place another search of the run saved, a place already delivered in only-new mode, a link without a place behind it, and a search without results.

⏱️ Measured on Apify (October 4, 2026)

RunPlacesTime
Sample input (one search)105 s
Dentists in Pasadena, CA: Google's list plus map tiles, kept to the city boundary26027 s
Bakeries in Boise, ID with full details: price range, "About" groups, star distribution, reviews6019 s
Plumbers in Denver without a website, with 4.5 stars and 50 reviews or more: all 256 plumbers inside the city were read435 s
A place link, a place id, a link by name and a search link, with full details68 s

A run of 200 coffee shops with full details that was aborted after 20 seconds and resurrected ended with 200 rows, none of them twice. All at 512 MB; the largest run used 239 MB.

🗺️ How it reads a whole city

  1. Google's own list for "query location" comes first: the most relevant places, up to about 200, each with its rank.
  2. If you asked for more, the map of the location is cut into four tiles and the same search is run in each.
  3. A tile that returns 100 or more places inside itself is cut into four again, down to tiles about 300 metres high.
  4. A place is saved once, however many tiles return it.

The status message says how each search ended: at your limit with more places on the map, or with the map read to its end.

🔔 Only new places

Turn on onlyNew and give the run a monitorId. Every place a run saves is remembered under that name, and later runs skip it. Two uses: read a large area in several runs, each continuing where the last one stopped; or, after one run that read a search to its end, put it on a schedule and get the businesses that appear later. The memory is a key-value store named google-maps-monitor in your own account; delete a record there to start over.

🤖 For AI agents

Smallest useful call:

{"query": "coffee shop", "location": "Seattle, WA", "maxResults": 20}

Each row is one place with name, address, phone, website, rating, review_count, category, latitude, longitude, opening_hours and place_id. queries, locations and startUrls take several entries. A search without results returns no rows; the status message and the SUMMARY record say why. No credentials are needed.

💡 Use cases

  • 📇 Lead lists: every business of a kind in a city, with phone and website, filtered by rating or by a missing website.
  • 🗺️ Market research: how many competitors, where, with what ratings and price ranges.
  • 🏪 Directory building: names, addresses, hours and categories with stable place ids for later updates.
  • 🔁 Monitoring: new businesses in an area on a schedule, or the rating and review count of your own locations.

⚠️ Limits, stated plainly

  • Google decides what a search finds. The Actor reads what Google Maps shows a visitor. A business Google does not list for your words is not found, and very small tiles are not cut further, so the densest blocks of a large city can hold a few more places than the run returns.
  • Review lists are not available. Google shows a visitor up to eight reviews per place and asks for a signed-in account for the rest. includeReviews returns those eight and the exact star distribution.
  • Without full details some fields depend on Google. Google gives some visitors a shorter record: contact data, rating and review count are there, but no price range, one "About" group and one photo. A row without full details has what the result list carried. With includeReviews the Actor reads each place's own page through a visitor that gets the complete record.
  • No email addresses. Google Maps does not publish them. Pass the website column to the Website Contact Extractor.
  • The boundary is OpenStreetMap's, simplified to about 100 metres. A place on the city line can fall on either side.
  • A boundary needs a place name. A postcode, a street or "near Times Square" has no boundary in OpenStreetMap; the map view Google shows for it is searched instead and can include the surroundings. When OpenStreetMap and Google read a name as two different towns, Google's reading is used and no boundary is applied; the SUMMARY record says so.
  • ?cid= links are not read. Use the place link, the place id or the feature id.
  • Tested up to 5,000 places per search. Larger runs work the same way but have not been measured here.

❓ FAQ

Do I need a Google account or API key? No.

How many places can I get? As many as Google lists for the search in the location, up to 20,000 per search. For one city and one kind of business that is usually a few hundred to a few thousand.

Why did I get fewer places than I asked for? Google has no more for that search inside the boundary, or filters removed the rest. A search with filters also stops after reading 1,000 places, or ten places for every place you asked for if that is more. The status message says which.

Does it stay inside my city? Yes, when OpenStreetMap has a boundary for the name you gave. In a test, 260 of 260 dentists for "Pasadena, CA" were in Pasadena and none in South Pasadena.

Can I search several cities and several kinds of business in one run? Yes, with queries and locations. A place found by two searches is saved and charged once.

What changed for users of the earlier version? The eleven fields it returned are still there under the same names and in the same order. The run no longer opens a browser, so it needs 512 MB instead of 2 GB. maxResults is now the number of places saved per search instead of the number looked at, and place links are all read. price_level (a number of dollar signs) became price (Google's price range as text). includeReviews returns up to eight reviews with exact dates, the most Google shows a visitor.

I am switching from another Google Maps Actor. Which fields match? title is name here, totalScore is rating, reviewsCount is review_count, categoryName is category, location.lat and location.lng are latitude and longitude, placeId is place_id, fid is feature_id, additionalInfo is attributes.

How do I call it from code? With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

Is it legal? The Actor reads business listings Google Maps shows publicly. Listings of sole traders and reviews with author names are personal data: GDPR, CCPA and similar rules apply to how you store and use them, CAN-SPAM and local rules to any outreach, and Google's terms apply to you as well.

🔗 You might also like

City and region boundaries © OpenStreetMap contributors.

Keywords: google maps scraper, google maps business scraper, google maps leads, google places scraper, google maps data extractor, local business leads, google maps phone numbers, businesses without website, google maps api alternative, google maps csv export, place id, local seo data, lead generation, google maps reviews count, opening hours data, no api key