Google Maps Scraper | Skips Leads You Already Have
Pricing
from $1.50 / 1,000 place scrapeds
Google Maps Scraper | Skips Leads You Already Have
Scrape Google Maps business listings by search query: name, category, address, phone, website, rating, review count, hours, coordinates. No login, no email guessing. Pay only per place delivered. Works in Claude, ChatGPT & any MCP agent.
Pricing
from $1.50 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Search Google Maps the way you would in the app (dentist in Austin, TX, plumbers in Chicago) and get one row per business: name, category, address, phone, website, star rating, today's opening hours, coordinates and a Google Maps link. Run the same search again later and, with cross run deduplication on (the default), you get and pay for only businesses you have not received before. No Google login and no Places API key.
Why choose this actor?
- A call list in seconds. In our test on 2 October,
dentist in Austin, TXreturned 20 dentists in 5.3 seconds, every one with a phone number, a website, a rating and coordinates. - Never pay twice for the same business. With
deduplicateAcrossRunson, the actor remembers every place it has delivered to your account. Running the same Austin dentist search a second time returned 20 different dentists, none from the first run, and charged only for those. - From $1.50 per 1,000 places. One charge per place delivered, plus $0.005 per run. Duplicates, places skipped by deduplication, rate limited pages and empty searches are never charged.
Part of The Mine Works Leads and business directories family: B2B Leads Finder, Skip Trace Lookup, Google Maps Email Scraper, JustDial Scraper, 2GIS Places Scraper, IndiaMART Scraper.
Try it in one minute
Paste this into the JSON tab of the input page and press Start:
{"query": "dentist","location": "Austin, TX","maxResults": 10}
You get 10 Austin dentists with phone, website, rating and address in a few seconds.
Give the search in one of two ways: query plus an optional location, which the actor joins as "dentist in Austin, TX", or a list of full search strings in searchQueries (plumbers in Chicago, dentists in Mumbai), which replaces query and location when both are given. maxResults caps each search separately.
Apify's free plan includes $5 of credit every month, which covers about 1,900 places at this actor's Free plan price ($0.0025 a place plus the $0.005 start fee, in runs of 100 places).
Copy to your AI assistant
themineworks/google-maps-search-scraper on Apify. Searches Google Maps and returns one row per business with place_id, name, category, address, phone, website, rating, opening_hours (the run day only), latitude, longitude, google_maps_url and query_used, skipping places already delivered to your account in earlier runs. Call ApifyClient("TOKEN").actor("themineworks/google-maps-search-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give either query (string, e.g. "dentist") with optional location (e.g. "Austin, TX"), or searchQueries (string[] of full searches, e.g. ["plumbers in Chicago"]). Optional: maxResults (per search, 1 to 200, default 5), language (default "en"), deduplicateAcrossRuns (default true; set false for a full snapshot), proxyConfig (default Apify datacenter proxy). Rows with _type "summary" or "info" are run reports and never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~google-maps-search-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Up to 13 business fields per place:
place_id,name,category,address,phone,website,rating,opening_hours,latitude,longitude,google_maps_url,query_usedandscraped_at. A field Google does not show for a place is left out of the row. - Cross run deduplication, on by default. Delivered place IDs are stored in a key-value store named
gmaps-seen-placesin your own Apify account. Later runs skip them and move further down Google's results to fillmaxResultswith new places. - Bulk searches.
searchQueriesruns many searches in one run, each capped bymaxResults, and every row carriesquery_usedso merged results stay traceable. - Up to 200 places per search, read 20 at a time from the same results service the Google Maps website uses. A search stops when Google has no more results or two pages in a row add nothing new.
- Datacenter proxy, plain requests. No browser and no residential proxy: each page of 20 places is one request through Apify's datacenter proxy.
How to use it
Basic: one category in one city
{"query": "dentist","location": "Austin, TX","maxResults": 50}
A category across a metro, in one run
{"searchQueries": ["plumber in Austin, TX","plumber in Round Rock, TX","plumber in Cedar Park, TX"],"maxResults": 40}
Up to 40 places per search, 120 in total. A business that shows up in two searches is delivered and charged once.
Weekly list of businesses you have not seen yet
{"query": "coffee shop","location": "Brooklyn, NY","maxResults": 60,"deduplicateAcrossRuns": true}
Save it as a task and schedule it weekly (for example 0 8 * * 1). The first run delivers the first 60 places Google shows. Later runs skip every place your account already received and deliver the next ones, including businesses that appeared on Google Maps since the last run. Each run pays only for what it delivers.
Agency prospecting: businesses without a website
{"searchQueries": ["roofing contractor in Phoenix, AZ", "landscaper in Phoenix, AZ"],"maxResults": 100}
Filter the rows to those with a phone and no website: a ready list for web design and marketing agencies. Rows with a website can go to Contact Details Scraper for emails.
A full snapshot, ignoring earlier runs
{"query": "boulangerie","location": "Paris, France","language": "fr","maxResults": 50,"deduplicateAcrossRuns": false}
With deduplication off, every run returns the top results again, which is what you want for a one off market map. language changes the language of category names and hours labels.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
query | string | none (form prefill: coffee shops) | What to search for, such as dentist or plumbers. |
location | string | none (form prefill: Austin, TX) | City or area, added to query as "query in location". Leave empty to search query as written. |
searchQueries | array of strings | none (form prefill: plumbers in Chicago, dentists in Mumbai) | Full search strings for bulk runs. When given, query and location are ignored. |
maxResults | integer (1 to 200) | 5 | Most places per search, not per run: 5 with three searches can return up to 15. |
language | string | en | Google Maps interface language code, such as en, es, fr or hi. Changes category names and hours labels. |
skipClosedBusinesses | boolean | true | Meant to skip permanently closed places. Google's compact search results do not include a business status, so this setting currently has no effect. |
deduplicateAcrossRuns | boolean | true | Skip places delivered to your account in earlier runs of this actor, whatever the search. Turn off for a full snapshot. |
proxyConfig | object | Apify datacenter proxy | The proxy for Google requests. The default works; you do not need residential proxies. |
About the deduplication memory. It is one list per Apify account for this actor, shared by every search and every task with deduplication on, and it does not expire. A coffee shop delivered by a "cafe" search will be skipped by a later "coffee shop" search. To start fresh, delete the key-value store named gmaps-seen-places under Storage in Apify Console, or set deduplicateAcrossRuns to false for that run.
Run options. The default memory is 512 MB and the default timeout is 600 seconds. Each page of 20 places takes about a second plus a short pause, so even 200 places per search finish well inside the timeout.
What data do you get?
One row per business.
The business: place_id (Google's place identifier), name, category (Google's primary category, such as Dentist or Cafe), rating (average stars).
Contact: phone (as Google shows it, such as (512) 717-3147) and website, when the business lists them. In our samples, 43 of 45 places had a phone and all 45 had a website; expect fewer for trades and small shops.
Location: address (without the business name in front), latitude, longitude and google_maps_url (a stable maps?cid= link).
Hours: opening_hours holds the hours Google shows for the day of the run only, keyed by the day name, for example Friday with a range such as 8 AM to 4 PM, or Closed, or Open 24 hours. It is not a full week.
Run fields: query_used (the search that produced the row), scraped_at, and charged. Ignore charged: it is written before billing happens, so it reads false on every row even when the place was charged. The run's summary row and the Apify run page show what was charged.
Google's compact search results carry no review count, no business status and no email addresses, so the actor does not return them.
Each run ends with a _type: "summary" row (places_scraped, charged_for, charge_failures, scraped_at) and a _type: "info" row. Neither is charged. Skip rows that have a _type field when you load places.
Stable fields for automations
These 10 fields were present in every place we sampled (45 places from three runs on 9 September and 2 October):
| Field | What it holds |
|---|---|
place_id | Google place identifier; the deduplication key |
name | Business name |
category | Primary Google category |
address | Street address |
rating | Average star rating |
latitude | Latitude |
longitude | Longitude |
google_maps_url | Google Maps link for the place |
query_used | The search that produced the row |
scraped_at | ISO timestamp when the row was captured |
We will not rename these fields. New fields may be added over time; existing ones keep their names.
Output examples
Real rows from our runs.
A dentist from the 2 October test (dentist in Austin, TX), closed on the day of the run:
{"place_id": "0x8644caf5781a8bef:0x951c772526d1a7e8","name": "Austin Dental Center, PC","category": "Dentist","address": "2304 Hancock Dr #1, Austin, TX 78756","phone": "(512) 233-6645","website": "https://www.smileaustin.com/?utm_source=google&utm_medium=organic&utm_campaign=gbp&utm_content=website","rating": 4.8,"opening_hours": { "Friday": "Closed" },"latitude": 30.3243224,"longitude": -97.7424001,"google_maps_url": "https://www.google.com/maps?cid=10744593812447930344","query_used": "dentist in Austin, TX","scraped_at": "2026-10-02T15:31:43.348Z","charged": false}
A cafe from a 9 September run on Apify (coffee shops in Austin, TX), open around the clock:
{"place_id": "0x8644b501711ea8ed:0xe0ff9456d3a1189a","name": "Bennu Coffee on Congress","category": "Cafe","address": "515 S Congress Ave, Austin, TX 78704","phone": "(512) 448-3919","website": "http://www.bennucoffee.com/","rating": 4.5,"opening_hours": { "Wednesday": "Open 24 hours" },"latitude": 30.256082099999997,"longitude": -97.7462348,"google_maps_url": "https://www.google.com/maps?cid=16212840284195723418","query_used": "coffee shops in Austin, TX","scraped_at": "2026-09-09T09:53:53.856Z","charged": false}
That 9 September run charged 5 places while every row still read "charged": false, which is why the field should be ignored.
The summary row that ends a run (never charged):
{"_type": "summary","places_scraped": 20,"charged_for": 0,"charge_failures": 0,"scraped_at": "2026-10-02T15:31:26.940Z"}
charged_for is 0 here only because this was a local test; on Apify it counts the places charged.
Pricing
Pay per event: you pay for each place delivered to your dataset, plus a small start fee per run.
| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
place-scraped, per place | $0.0025 | $0.002 | $0.00175 | $0.0015 |
place-scraped, per 1,000 places | $2.50 | $2.00 | $1.75 | $1.50 |
apify-actor-start, per run | $0.005 per GB of run memory, minimum one event | same | same | same |
The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run uses, with a minimum of one event. This actor runs on 512 MB by default, so a default run pays one event: $0.005.
Worked examples. 50 dentists in one city: $0.125 plus $0.005 on the Free plan, or $0.075 plus $0.005 on Gold. Three suburbs with 40 places each (120 places): $0.30 plus $0.005 on Free. A weekly deduplicated run that finds 12 new places pays for 12.
Never charged: a place already delivered in the same run, places skipped because your account received them in an earlier run, rate limited or empty pages, a run with no search, and the summary and info rows. A run that delivers nothing pays only the start fee.
There is no scheduled price change for this actor. The Pricing tab on this page always shows the rate for your own plan; if it and this table ever differ, the Pricing tab is right.
FAQ
Where does the data come from? From Google Maps search results, read through the same results service the Google Maps website loads, 20 places per request, without a browser.
How many places can I get?
Up to 200 per search and as many searches as you list in searchQueries. Google stops returning results for a search at some point; the actor ends that search when a page comes back empty or two pages in a row add nothing new.
Do I need a Google account or a Places API key? No. You need only an Apify account. There is no Google billing account and no quota to manage.
Which proxy does it use? Apify's datacenter proxy by default, included in your Apify plan. If Google rate limits a page, it is retried, and a page that stays blocked is skipped without charge.
How does deduplication across runs work?
Each delivered place_id is saved in a key-value store named gmaps-seen-places in your Apify account. With deduplicateAcrossRuns on (the default), later runs skip those places and read further into Google's results to fill maxResults. The memory covers all searches and tasks of this actor in your account and does not expire; delete the store to reset it.
Are email addresses included?
No. Google Maps does not publish them, and the actor does not guess them. Use the website with Contact Details Scraper, or use Google Maps Email Scraper, which adds verified emails to Maps results.
Why is there no review count or full week of hours? Google's compact search results do not include a review count, and they include only the current day's hours.
Can I skip permanently closed businesses?
Not at the moment. skipClosedBusinesses is accepted, but the search results carry no business status, so nothing is skipped.
Can I search in other countries and languages?
Yes. Put the place in the search (boulangerie in Lyon, France) and set language for category names and hours labels.
Can I run it on a schedule?
Yes. Save your input as a task, then in Apify Console go to Schedules, Create new, and pick a time or a cron expression such as 0 8 * * 1. With deduplication on, each run delivers and charges only places your account has not received before.
How do I export the data?
From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. Drop the rows that have a _type field if you want places only.
Can I use it from Claude, ChatGPT or another AI assistant?
- Connector URL:
https://mcp.apify.com/?tools=themineworks/google-maps-search-scraper. - Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http google-maps-search-scraper "https://mcp.apify.com/?tools=themineworks/google-maps-search-scraper".
Is it legal to scrape Google Maps? The actor collects public business listings that anyone can see on Google Maps without logging in. Listings describe businesses, but a sole trader's phone number can be personal data, so you are responsible for how you use it, including Google's terms, data protection laws such as GDPR and CCPA, and do not call or do not email rules for marketing. This is general information, not legal advice.
Integrations
- Google Sheets: export a run to a sheet, or use Apify's Google Sheets integration to append each week's new places.
- Make, Zapier and n8n: use the Apify app or node to start a run and push new places to a CRM such as HubSpot or Pipedrive.
- Webhooks: have Apify call your URL when a run succeeds, then read the dataset.
- API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. The "Copy to your AI assistant" block above has the exact call.
- MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code can call the actor as a tool through
https://mcp.apify.com.
More from The Mine Works
Leads and business directories
- B2B Leads Finder
- Skip Trace Lookup
- Google Maps Email Scraper
- JustDial Scraper
- 2GIS Places Scraper
- IndiaMART Scraper
- Yandex Maps Scraper
- Contact Details Scraper
- US Business Registry
- Yellow Pages Scraper
- Lead Generation MCP
- Google Maps Reviews Scraper
Social media and video
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a search that returns fewer places than Google Maps shows, or need a field we do not return yet? Open an issue on the Issues tab of this page with your input and the run ID, and we will reply there. To ask for a new data source, email dmineworks@gmail.com.
Google Maps Scraper turns a search into a list of businesses with phone, website, rating and location, and on repeat runs charges only for places you have not received before.

