Google Maps Business Leads Scraper avatar

Google Maps Business Leads Scraper

Pricing

from $4.00 / 1,000 business results

Go to Apify Store
Google Maps Business Leads Scraper

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

Johnn Mottin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

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:

  1. opens the public Google Maps search page;
  2. handles a public consent screen when one appears;
  3. discovers unique /maps/place/ links;
  4. preserves each business's position in the search results;
  5. opens the public business detail page;
  6. extracts evidenced public business information;
  7. applies per-query and global result limits;
  8. removes duplicates within each search context;
  9. records quality checks, retries, warnings, and stop reasons in STATS;
  10. 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, NY
roofing companies in Boston, MA
restaurants in Miami, FL
accounting firms in Chicago, IL
plumbers 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

FieldTypeDefaultRules
searchQueriesstring array[]Search phrases such as "dentists in Albany, NY". Blank and case-insensitive duplicate queries are removed.
searchUrlsrequest-list array[]Accepts URL strings and { "url": "..." }. Only supported public google.com/maps/search routes are accepted.
maxPlacesPerQueryinteger20Minimum 1, maximum 200.
maxTotalPlacesinteger100Minimum 1, maximum 2,000.
languagestringenSupported: en, pt-BR, es, de, fr, it.
proxyCountryCodestringUSTwo-letter country code, normalized to uppercase.
includeOpeningHoursbooleantrueWhen false, openingHours is returned as null.
includeContactDetailsbooleantrueWhen false, phone and website fields are returned as null.
debugbooleanfalseSaves 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

FieldDescription
nameBusiness name.
primaryCategoryMain category shown for the business.
categoriesAvailable business categories.
addressVisible full address after text cleanup.
neighborhoodNeighborhood when evidenced, otherwise null.
cityCity when evidenced or conservatively parsed.
stateState or region when evidenced or conservatively parsed.
postalCodePostal or ZIP code when evidenced or conservatively parsed.
countryCountry name when evidenced.
countryCodeTwo-letter country code when evidenced.
phoneNormalized phone number when available.
phoneUnformattedPhone representation retained by the extractor.
websiteBusiness website with known marketing parameters removed.
ratingRating shown by Google Maps.
reviewCountReview or rating count when reliably identified, otherwise null.
priceLevelPrice level when present, otherwise null.
businessStatusPublic business status when present, otherwise null.
openingHoursStructured opening hours when reliably available, otherwise null.
latitude / longitudeCoordinates parsed from public Maps data.
placeIdGoogle place identifier when explicitly evidenced, otherwise null.
cidDecimal Google CID extracted from a supported public Maps URL pattern.
googleMapsUrlPublic Google Maps business URL.
searchQueryOriginal search query when query input was used.
searchUrlSearch URL used for the record.
rankPosition discovered within the search context.
languageRequested interface language.
scrapedAtUTC 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_source
utm_medium
utm_campaign
utm_term
utm_content
gclid
fbclid
gbraid
wbraid

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:

  1. placeId
  2. cid
  3. canonical Google Maps URL
  4. 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:

maxPlacesPerQuery
maxTotalPlaces

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 STATS records

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 name or googleMapsUrl;
  • 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:

en
pt-BR
es
de
fr
it

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

  1. Save your search input as an Apify Task.
  2. Go to Console → Schedules → Create schedule.
  3. Add the Task.
  4. Choose a recurring schedule.
  5. 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:

latitude
longitude

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:


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 STATS quality 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:

maxPlacesPerQuery
maxTotalPlaces

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.