Google Places Scraper avatar

Google Places Scraper

Pricing

from $3.50 / 1,000 places

Go to Apify Store
Google Places Scraper

Google Places Scraper

Google Maps places scraper and Google Maps business scraper: search term + location in, places out with name, star rating, review count, category, address, opening hours, and optionally phone and website. Real browser, because Maps renders client-side. No API key. Export CSV, JSON or Excel.

Pricing

from $3.50 / 1,000 places

Rating

5.0

(1)

Developer

Flash Scrape

Flash Scrape

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

1

Monthly active users

4 days ago

Last modified

Security

Limited permissions

Share

Search Google Maps and export the businesses: name, category, rating, review count, address, hours - plus phone and website per place when Also fetch phone and website (fetchContactDetails) is on. Runs a real browser so you don't have to.

$0.005 per place on the Apify free plan ($5 per 1,000), less on paid plans. Phone and website are included in the place price, and a run that finds nothing costs nothing.

Try it: Austin dentists with phone numbers · HVAC contractor leads with phone and website

  • The feed, scrolled - ~20-30 places per search, the same set a user sees
  • Phone & website - the two fields worth money; off on the default form (faster), on in both examples above
  • Consent-wall proof - exits are pinned outside the EU so runs don't die on Google's cookie page

Quick start

Open the actor, keep the defaults, press Save & start. Then adjust the input for your own search and export CSV, JSON or Excel from the dataset tab - or call it from the API and read the dataset programmatically.

A real row

Straight from a reference run, trimmed to the highlights:

{
"name": "Thomas Dental",
"category": "Dentist",
"address": "2546 E Thomas Rd",
"rating": 4.8,
"reviews_count": 785,
"hours_summary": "Open \u00b7 Closes 6\u202fPM",
"is_open_now": true,
"maps_url": "https://www.google.com/maps/place/Thomas+Dental/data=!4m7!3m6!1s0x872b6ca2bc0f1247:0x2eb64f5293c1af02!8m2!3d33.4805563!4d-112.0260627!16s%2Fg%2F1vgx16lr!19sChIJRxIPvKJsK4cRAq_Bk1JPti4?authuser=0&hl=en&rclk=1",
"place_id": "0x872b6ca2bc0f1247:0x2eb64f5293c1af02",
"has_orders_online": false,
"raw_card_text": "Thomas Dental | Thomas Dental | 4.8 | Dentist \u00b7 \ue934 \u00b7 2546 E Thomas Rd | Open \u00b7 Closes 6\u202fPM",
"search_term": "dentist"
}

How it works

A real browser opens Maps with a US-pinned exit, runs your search, scrolls the results feed until it stops growing (~20-30 places), parses every card, and - when details are enabled - opens each place for phone and website.

Every column, with measured fill

ColumnFilled on the reference run
name100%
category100%
address100%
rating100%
reviews_count100%
hours_summary100%
is_open_now100%
maps_url100%
place_id100%
has_orders_online100%
raw_card_text100%
search_term100%
search_location100%
scraped_at100%
phoneonly with fetchContactDetails on
websiteonly with fetchContactDetails on
plus_code81%
price_level0%

Input reference

FieldTypeDefaultNotes
searchTermsarray['dentist']What to look for, e.g. ['dentist', 'plumber']. Each term is searched separately.
locationstringAustin, TXCity, region or area to search in, e.g. 'Austin, TX'. Combined with each search term as '
maxPlacesinteger60Hard cap per run. Google's feed yields roughly 20-30 places per search term before it stops loading more.
scrollDepthinteger6How many times to scroll the results list. Volume on Google Maps comes from scrolling, not pagination: a fresh
fetchContactDetailsbooleanFalsePhone number and website are NOT in the results list; getting them needs one extra page load per place, so this is slower. Contact details are included in the place price.
minRatingstring0e.g. 4.0. Blank or 0 = no filter. Places with no rating at all are treated as 0.
minReviewsinteger0Filters out places with too few reviews to judge. 0 = no filter.
onlyWithWebsitebooleanFalseRequires 'Also fetch phone and website' to be on, since the website is only visible on the place panel.
proxyConfigurationobject{'useApifyProxy': TrueRecommended. Your exit IP decides what Google shows: a European IP gets the EU cookie-consent page instead of

Pricing

Pay per result - charged only for rows delivered; the current rate is on this page's Pricing tab. Zero results cost zero, and failed fetches are never billed. Phone and website (fetchContactDetails) are included in the place price.

Use cases

  • Local lead lists - A category+city into contactable rows
  • Competitor mapping - Every rival within a search, with ratings and review counts
  • Data verification - Cross-check your CRM's local accounts against live Maps data

Honest limits

We would rather say it here than have you find out on a paid run:

  • A search yields what Maps shows (~20-30 places) - volume comes from running more searches, not deeper scrolls
  • Google intermittently serves bot checks; the run reports it honestly rather than billing air

Scheduling & integrations

Every input works identically from the API, so this actor drops into schedules and pipelines: run it on an Apify Schedule for a recurring export, point a webhook at the finished run to push rows into Slack, Google Sheets (via Zapier/Make/n8n) or your warehouse, and page through the dataset with the standard Dataset API. Saved tasks keep your configuration one click away.

FAQ

Is this against Google's ToS? It reads public pages the way a browser does. For an alternative with zero Google exposure, see local-business-leads on this account (OpenStreetMap-based).

Why a browser? Maps renders everything client-side - there is no lighter honest way.


Built by Flash Scrape - measured claims, stable columns, no API keys. Something missing? Open an issue on this actor and ask.


More from Flash Scrape

Same publisher, same rules: no API keys, pay per row, filters run before billing.