Google Maps Business Leads Scraper
Pricing
from $4.00 / 1,000 business results
Google Maps Business Leads Scraper
Scrape public Google Maps business data for lead generation and market research. Search by keyword or Maps URL and export names, categories, structured addresses, phones, websites, ratings, opening hours, coordinates, CIDs, Maps URLs, and result rank — up to 2,000 businesses per run.
Pricing
from $4.00 / 1,000 business results
Rating
0.0
(0)
Developer
Johnn Mottin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Find local businesses and export structured Google Maps data
Search Google Maps by keyword or public Maps search URL and collect structured public business information for lead generation, market research, competitor analysis, CRM enrichment, and location datasets.
Extract business names, categories, addresses, phone numbers, websites, ratings, opening hours, coordinates, Google Maps URLs, CIDs, result rank, and more.
No Google account. No Google Places API key.
Key features
- Search Google Maps by keyword
- Accept supported public Google Maps search URLs
- Collect up to 200 places per search query
- Collect up to 2,000 places per run
- Business names and categories
- Structured addresses
- Phone numbers and websites
- Ratings and available review counts
- Opening hours when reliably available
- Latitude and longitude
- Google Maps URLs and CIDs
- Search-result rank
- Multi-language interface support
- Built-in deduplication and quality checks
- JSON, CSV, Excel, API, and Apify integration workflows
- Pay per business record written
Unofficial community Actor. Not affiliated with or endorsed by Google. The Actor accesses public Google Maps pages and does not use a Google account, authenticated cookies, or the Google Places API.
What this Google Maps scraper does
For every search query or supported public Google Maps search URL, the Actor:
- opens the public Google Maps search page;
- handles a public consent screen when one appears;
- discovers unique
/maps/place/links; - preserves each business's position in the search results;
- opens the public business detail page;
- extracts evidenced public business information;
- applies per-query and global result limits;
- removes duplicates within each search context;
- records quality checks, retries, warnings, and stop reasons in
STATS; - writes one structured business record to the default dataset for each collected place.
The Actor can continue when Google Maps exposes valid place links even if a semantic results feed is not available.
Use cases
Google Maps lead generation
Build lists of local businesses for prospecting and CRM workflows.
Example searches:
dentists in Albany, NYroofing companies in Boston, MArestaurants in Miami, FLaccounting firms in Chicago, ILplumbers in Austin, TX
Depending on what Google Maps publicly exposes for each listing, records can include:
- business name
- category
- phone
- website
- address
- rating
- opening hours
- coordinates
- Google Maps URL
- CID
- search rank
The Actor intentionally does not collect email addresses.
Local market research
Search a city or region and build a structured dataset of businesses operating in the same market.
Use the output to analyze:
- business density
- categories
- geographic distribution
- ratings
- available websites
- available phone numbers
- local competition
Competitor research
Search business categories or branded queries and compare public listing data such as:
- categories
- ratings
- locations
- websites
- phone numbers
- result positions
CRM enrichment
Export structured public business data into:
- CRM systems
- Google Sheets
- databases
- internal applications
- automation workflows
- APIs and webhooks
Location and map datasets
Collect structured location fields such as:
- full address
- city
- state or region
- postal code
- country
- latitude
- longitude
- CID
- Google Maps URL
Input
Provide at least one non-empty searchQueries item or one valid searchUrls item.
Input fields
| Field | Type | Default | Rules |
|---|---|---|---|
searchQueries | string array | [] | Search phrases such as "dentists in Albany, NY". Blank and case-insensitive duplicate queries are removed. |
searchUrls | request-list array | [] | Accepts URL strings and { "url": "..." }. Only supported public google.com/maps/search routes are accepted. |
maxPlacesPerQuery | integer | 20 | Minimum 1, maximum 200. |
maxTotalPlaces | integer | 100 | Minimum 1, maximum 2,000. |
language | string | en | Supported: en, pt-BR, es, de, fr, it. |
proxyCountryCode | string | US | Two-letter country code, normalized to uppercase. |
includeOpeningHours | boolean | true | When false, openingHours is returned as null. |
includeContactDetails | boolean | true | When false, phone and website fields are returned as null. |
debug | boolean | false | Saves screenshots and HTML for successful pages. Error and block evidence may be stored independently. |
Example: search by keyword
{"searchQueries": ["dentists in Albany, NY"],"maxPlacesPerQuery": 5,"maxTotalPlaces": 5,"language": "en","proxyCountryCode": "US"}
The Actor converts search queries into supported public Google Maps search URLs.
Example:
https://www.google.com/maps/search/?api=1&query=<QUERY_ENCODED>
Example: search by Google Maps URL
searchUrls supports request-list objects:
{"searchUrls": [{"url": "https://www.google.com/maps/search/?api=1&query=coffee+shops+in+Austin%2C+TX"},{"url": "https://www.google.com/maps/search/plumbers+in+Denver,+CO"}],"maxTotalPlaces": 20}
Plain URL strings are also accepted.
Only supported public Google Maps search routes are allowed.
Invalid URLs are counted and ignored when another valid search query or URL exists.
Invalid overall input produces a controlled:
INPUT_ERROR
A run fails with:
ALL_QUERIES_FAILED
when no search context completes successfully.
Output
The Actor writes one dataset record per collected business.
Missing scalar fields are returned as:
null
categories is always an array.
openingHours is a normalized object when reliably extracted; otherwise it is null.
The Actor does not invent missing values.
Real output example
The following structure represents a successful public Google Maps business result:
{"name": "Dental Wellness of Albany","primaryCategory": "Dentist","categories": ["Dentist"],"address": "651 Delaware Ave, Albany, NY 12209","neighborhood": null,"city": "Albany","state": "NY","postalCode": "12209","country": "United States","countryCode": "US","phone": "+15184272447","phoneUnformatted": "+15184272447","website": "https://www.651dental.com/","rating": 4.9,"reviewCount": null,"priceLevel": null,"businessStatus": null,"openingHours": null,"latitude": 42.6350596,"longitude": -73.7950078,"placeId": null,"cid": "12250295333788525579","googleMapsUrl": "https://www.google.com/maps/place/Dental+Wellness+of+Albany/data=!4m7!3m6!1s0x89de0a7e2759f93f:0xaa01cab38417240b!8m2!3d42.6350596!4d-73.7950078!16s%2Fg%2F1tklrkb5!19sChIJP_lZJ34K3okRCyQXhLPKAao","searchQuery": "dentists in Albany, NY","searchUrl": "https://www.google.com/maps/search/?api=1&query=dentists+in+Albany%2C+NY","rank": 1,"language": "en","scrapedAt": "2026-07-25T19:36:16.370587Z"}
Output fields
| Field | Description |
|---|---|
name | Business name. |
primaryCategory | Main category shown for the business. |
categories | Available business categories. |
address | Visible full address after text cleanup. |
neighborhood | Neighborhood when evidenced, otherwise null. |
city | City when evidenced or conservatively parsed. |
state | State or region when evidenced or conservatively parsed. |
postalCode | Postal or ZIP code when evidenced or conservatively parsed. |
country | Country name when evidenced. |
countryCode | Two-letter country code when evidenced. |
phone | Normalized phone number when available. |
phoneUnformatted | Phone representation retained by the extractor. |
website | Business website with known marketing parameters removed. |
rating | Rating shown by Google Maps. |
reviewCount | Review or rating count when reliably identified, otherwise null. |
priceLevel | Price level when present, otherwise null. |
businessStatus | Public business status when present, otherwise null. |
openingHours | Structured opening hours when reliably available, otherwise null. |
latitude / longitude | Coordinates parsed from public Maps data. |
placeId | Google place identifier when explicitly evidenced, otherwise null. |
cid | Decimal Google CID extracted from a supported public Maps URL pattern. |
googleMapsUrl | Public Google Maps business URL. |
searchQuery | Original search query when query input was used. |
searchUrl | Search URL used for the record. |
rank | Position discovered within the search context. |
language | Requested interface language. |
scrapedAt | UTC timestamp of extraction. |
Dataset views
The Actor provides useful dataset views for different workflows.
Leads
Focused on:
- business name
- category
- phone
- website
- rating
- source
- rank
Map data
Focused on:
- structured address
- latitude
- longitude
- identifiers
- Google Maps URL
Full details
Includes all documented public output fields.
Structured addresses and data quality
Visible text is Unicode-normalized and leading interface glyphs are removed.
Structured address components are extracted only when they are supported by page evidence or a conservative address parser.
The search query itself is never used to invent a business address.
For example, searching:
dentists in Boston
does not cause the Actor to assume that a business is located in Boston unless the extracted business data supports that location.
Known marketing parameters are also removed from collected business website URLs.
Website URL cleanup
The Actor removes known marketing parameters such as:
utm_sourceutm_mediumutm_campaignutm_termutm_contentgclidfbclidgbraidwbraid
Unknown query parameters are preserved because they may be necessary for the business website to function.
Deduplication
Deduplication is scoped to each search context.
The same business can remain in separate searches because its query context and rank can be meaningful.
Identity evidence is checked in this order:
placeIdcid- canonical Google Maps URL
- normalized business name + address
This allows the Actor to remove repeated listings within one search while preserving useful cross-query context.
Result limits and cost control
Use:
maxPlacesPerQuery
to control how many businesses are returned from each search.
Maximum:
200
Use:
maxTotalPlaces
to control the hard dataset limit across the entire run.
Maximum:
2000
Explicit limits are recommended for predictable runs and cost control.
Search collection can stop when:
- the requested per-query limit is reached;
- the global limit is reached;
- the results stop changing;
- Google Maps exposes an end marker;
- the scroll safety limit is reached.
Stop reasons are stored in:
STATS.capReasons
Pricing
This Actor uses Pay Per Event pricing.
Current configured pricing described for this Actor is:
$0.004 per business record — approximately $4 per 1,000 businesses,
plus any Actor-start fee shown in the Pricing tab.
You pay for business records written to the dataset, rather than browser time or extraction attempts.
Before large runs, always check the Pricing tab on this Actor page because it is the authoritative source for current rates.
To control cost, set explicit:
maxPlacesPerQuerymaxTotalPlaces
limits.
Reliability and block handling
Google Maps is a dynamic web application and its public interface can change.
The Actor uses:
- bounded navigation timeouts
- bounded extraction timeouts
- fresh browser contexts for retries
- fresh proxy sessions for retries
- block and captcha detection
- controlled retry limits
- bounded screenshot and HTML evidence
- progress logs for search and detail stages
- partial and final
STATSrecords
Known suspicious or blocking signals include:
- captcha or reCAPTCHA pages
- unusual-traffic messages
- Google
/sorry/routes - account or login redirects
- search pages with no result feed, no place links, and no legitimate no-results marker
- detail pages where business identity cannot be established
The Actor does not silently treat these conditions as valid business records.
Normal successful pages are not saved unless:
{"debug": true}
Error or block evidence may be stored independently when required for diagnostics.
Empty-result protection
A run that finishes with zero collected businesses fails explicitly with:
EMPTY_RESULTS
unless every search context returned a legitimate public no-results state.
This prevents a broken selector or blocked page from being silently reported as a successful empty dataset.
STATS and health checks
The final:
STATS
key-value record includes:
- run totals
- missing-field counters
- quality alerts
- stop reasons
- per-search summaries
- retries
- block information
Quality alerts are raised when:
- more than 5% of records lack
nameorgoogleMapsUrl; - more than 30% have an address but insufficient structured address components;
- more than 20% have a rating but no
reviewCount; - more than 20% contain a detectable CID pattern but no extracted
cid.
A quality alert does not automatically mean the run failed.
It indicates that the returned dataset should be reviewed for the fields named in the warnings.
Supported languages
The Actor currently supports these interface language values:
enpt-BResdefrit
Localized interfaces can differ in labels and number formats, so some fields remain best-effort across markets.
Use:
proxyCountryCode
to select a two-letter proxy country code.
Example:
{"language": "pt-BR","proxyCountryCode": "BR"}
What the Actor intentionally does not collect
The Actor does not collect:
- email addresses
- review text
- reviewer profiles
- authenticated data
- private data
- data from logged-in Google accounts
It does not use:
- the Google Places API
- a Google account
- authenticated Google cookies
- a Google API key
It also does not bypass Google account access controls.
Known limitations
Review count is best-effort
Google Maps can expose a rating without exposing a review count in a reliably identifiable structure.
When the review count cannot be reliably determined:
reviewCount: null
is returned instead of a guessed value.
The condition is also reflected in STATS.
Opening hours are optional
Opening hours may be unavailable or may not be exposed in a reliably supported structure.
Place ID is optional
placeId may be:
null
even when a valid cid is available.
Some businesses omit public fields
Google Maps listings do not guarantee all fields.
Potentially unavailable fields include:
- phone
- website
- address components
- opening hours
- business status
- price level
- coordinates
- place ID
- review count
Missing fields are returned as null rather than invented.
Localized interfaces vary
Labels, number formats, and rendered structures can differ by language and country.
Google Maps changes over time
Public page structure, ARIA labels, and embedded data can change.
The Actor includes controlled failure and health-check behavior to make structural problems visible.
Schedule recurring Google Maps searches
The Actor can be used with Apify Schedules for recurring searches.
Example use cases:
- refresh a local lead list weekly;
- monitor a business category;
- periodically update a CRM dataset;
- repeat market research by location;
- track public listing changes downstream by comparing run outputs.
Setup
- Save your search input as an Apify Task.
- Go to Console → Schedules → Create schedule.
- Add the Task.
- Choose a recurring schedule.
- Send the resulting dataset to your preferred integration or pipeline.
Always keep explicit result limits when scheduling recurring runs.
Technical implementation
The Actor uses:
- Python
- Playwright
- Chrome
- official Apify proxy configuration
It does not use the Google Places API.
Google Maps pages are rendered through a browser because the public Maps interface is a dynamic web application.
FAQ
Do I need a Google account?
No.
The Actor accesses public Google Maps pages without logging in.
Do I need a Google Places API key?
No.
The Actor does not use the Google Places API.
Can I search by normal keywords?
Yes.
Example:
{"searchQueries": ["dentists in Albany, NY","plumbers in Austin, TX"]}
Can I pass a Google Maps search URL?
Yes.
Use searchUrls.
Example:
{"searchUrls": [{"url": "https://www.google.com/maps/search/?api=1&query=coffee+shops+in+Austin%2C+TX"}]}
Plain URL strings are also accepted.
How many businesses can I collect?
maxPlacesPerQuery supports up to:
200
places for each search context.
maxTotalPlaces supports up to:
2000
business records across the entire run.
Actual available results depend on what the public Google Maps search interface exposes.
Does it collect phone numbers?
Yes, when the business publicly exposes a phone number and contact details are enabled.
Does it collect business websites?
Yes, when a website is publicly exposed and contact details are enabled.
Does it collect email addresses?
No.
The Actor intentionally does not collect email addresses.
Does it collect Google Maps reviews?
It can return the available listing rating and best-effort review count.
It does not collect review text or reviewer profiles.
Why is reviewCount sometimes null?
Google Maps can display a rating while not exposing a review count in a reliably identifiable structure.
The Actor returns null instead of guessing.
Does it return coordinates?
Yes, when coordinates can be parsed from public Maps data.
Output fields include:
latitudelongitude
Does it return Google CID?
Yes, when a supported public Maps URL pattern exposes it.
Can I disable contact details?
Yes.
Set:
{"includeContactDetails": false}
Phone and website fields will then be returned as null.
Can I disable opening-hours extraction?
Yes.
Set:
{"includeOpeningHours": false}
Can I schedule recurring runs?
Yes.
Use Apify Tasks and Schedules and keep explicit result and cost limits.
Is this public data?
The Actor extracts information displayed on public Google Maps pages without logging in.
You remain responsible for complying with applicable laws, provider terms, and your own data-use obligations.
Is this affiliated with Google?
No.
This is an unofficial community Actor and is not affiliated with or endorsed by Google.
Part of the JM Forge suite
Also from the same developer:
-
Consulta CNPJ Brasil e Empresas por CNAE — Look up Brazilian companies by CNPJ in bulk or find companies by CNAE, state, and city using public registry data.
-
Company Tech Stack Monitor — Change Events + Firmographics — Monitor company domains for technology-stack changes, including tools adopted or removed and email-provider switches.
-
ATS Hiring Signals — Greenhouse, Lever & Ashby — Monitor recent public job postings by company from Greenhouse, Lever, and Ashby.
-
Google, Bing & YouTube Keyword Suggest Scraper — Turn seed keywords into structured long-tail suggestions through Google, Bing, and YouTube autocomplete.
Changelog
1.0.8
- Added a prefilled example input so automated Store health testing runs with a valid search.
- Added empty-dataset health protection: a run collecting zero places without an explicit public no-results state now fails with
EMPTY_RESULTS. - Added dead-selector detection for rendered search pages that expose zero place links unexpectedly.
1.0
- Initial Python and Playwright implementation.
- Added search query and public search URL inputs.
- Added public search and business-detail extraction.
- Added per-query and global limits.
- Added contextual deduplication.
- Added retry, timeout, and block detection.
- Added evidence controls.
- Added dataset views.
- Added structured address extraction.
- Added Unicode and interface-glyph cleanup.
- Added website tracking-parameter cleanup.
- Added decimal CID extraction.
- Added localized review-count parsing.
- Added expanded
STATSquality metrics.
PT-BR — Resumo
Este Actor coleta dados públicos de empresas no Google Maps para prospecção, geração de leads, pesquisa de mercado local, análise de concorrentes, enriquecimento de CRM e criação de bases de localização.
Você pode pesquisar usando:
- consultas em
searchQueries; ou - URLs públicas de busca do Google Maps em
searchUrls.
O Actor encontra as empresas, abre as páginas públicas de detalhes e retorna dados estruturados, quando disponíveis:
- nome;
- categoria;
- endereço completo;
- cidade;
- estado;
- CEP;
- país;
- telefone;
- website;
- avaliação;
- quantidade de avaliações em modo best-effort;
- horários;
- latitude;
- longitude;
- CID;
- URL do Google Maps;
- consulta de origem;
- posição no resultado.
O Actor usa Python, Playwright, Chrome e a configuração oficial de proxy da Apify.
Ele não usa:
- Google Places API;
- conta Google;
- cookies autenticados;
- chave de API.
Também não coleta:
- emails;
- texto de avaliações;
- perfis de avaliadores;
- dados privados ou autenticados.
Campos ausentes são retornados como null em vez de serem inventados.
Preço
A configuração descrita atualmente é:
US$ 0,004 por empresa — aproximadamente US$ 4 por 1.000 registros,
mais qualquer taxa de início de execução exibida na aba Pricing.
Use:
maxPlacesPerQuerymaxTotalPlaces
para controlar o tamanho e o custo das execuções.
Métricas de execução, avisos de qualidade, bloqueios, retentativas e motivos de parada ficam registrados em STATS.
Support
Report issues in the Issues tab of this actor — I respond within 24h. Feature requests welcome.