Google Maps & Google Business Profile Scraper avatar

Google Maps & Google Business Profile Scraper

Pricing

from $0.01 / 1,000 results

Go to Apify Store
Google Maps & Google Business Profile Scraper

Google Maps & Google Business Profile Scraper

The most comprehensive Google Maps & Google Business Profile scraper. Extract business descriptions ("From the business"), reviews with full text, opening hours, photos, Q&A & all standard business data. Uses Camoufox stealth browser with fingerprinting & residential proxies for reliable extraction.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

The Howlers

The Howlers

Maintained by Community

Actor stats

4

Bookmarked

191

Total users

9

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

Google Maps Business Scraper v3.5

Comprehensive Google Maps & GBP scraper with Camoufox stealth browser and residential proxies. Search mode for bulk scraping, Place ID mode for detailed GBP data. Extracts business name, address, phone, website, description ('From the business'), reviews, opening hours, photos, Q&A, and more.

analysisModeWhat it doesSpeed
full (default)Opens every business page from the results: full address with city, state and ZIP, phone, website, hours, description, rating, review count, reviews and Q&A on requestAbout 10 to 20 seconds per place
listReads the Google Maps results list only, without opening each business page: name, category, rating, review count, map pin coordinates, Google place IDs (feature ID, googlePlaceId, cid), and the street address, phone and website when the list shows them. Service-area businesses that hide their address have address: nullUp to 120 places per search in about 1 to 2 minutes; 20 places in a few seconds
local-packTop 3 results per search onlyA few seconds per search

list and full places are billed the same way: one Result Scraped event per place. Google Maps shows at most about 120 places per search, however far the list is scrolled.

Grid searches

searchLocations runs every query once at each map position you list ("lat,lng" or "lat,lng,zoom"), all in one run. Places found by more than one search are returned and charged once. Each saved place says which search found it (searchQuery, searchLocation, rank).

Search outcomes (SEARCH_STATS)

The SEARCH_STATS record in the run's key-value store lists every search with its outcome, so you can tell a full list from a cut-off one:

  • complete: the list ended on its own ("You've reached the end of the list") below Google's cap of about 120
  • google_limit: the list ended at Google's cap, so more places likely exist
  • reached_max: stopped at maxCrawledPlacesPerSearch
  • stalled: Google stopped loading more before either of the above
  • single_place or no_results: the query opened one business page, or Google found nothing
  • consent_blocked, failed, charge_limit or not_run: the search did not finish
  • stopped_before_timeout: the run stopped before its timeout while this search was in progress. In list mode the places loaded so far are saved; in full mode placePagesNotRun says how many place pages were not opened

Each search also has the map view it covered (viewport with north, south, east and west), how many places the list showed, and how many were new. The record also counts Google consent pages seen and passed and any place pages lost.

Apify Proxy exits in the United States unless you pick a country in the proxy settings. Exits in Europe are sent to a Google consent page before Maps, which used to drop places silently. The scraper also sets Google's consent cookie before every page and clicks through a consent page if one still appears; a page that cannot be passed is retried on a new proxy session instead of skipped.


Quick Start

Fast list of businesses for an area (list mode, grid of map positions)

{
"searchStringsArray": ["plumber"],
"analysisMode": "list",
"searchLocations": ["32.7767,-96.7970,14", "32.8453,-96.8443,14"],
"maxCrawledPlacesPerSearch": 60
}

Run with real data

{
"searchStringsArray": ["coffee shops in Austin TX"],
"analysisMode": "full",
"maxCrawledPlacesPerSearch": 20,
"maxReviews": 0,
"reviewsSort": "newest",
"includeQA": false,
"language": "en",
"zoom": 13,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"webhookPlatform": "custom",
"webhookHeaders": {}
}

Input Parameters

ParameterTypeDefaultRequiredDescription
analysisModestring"full"Nofull opens every business page, list reads the results list only (fast), local-pack returns the top 3 results per search
searchStringsArrayarray-NoList of search queries like 'Bar Fort Lauderdale FL' or 'Plumber Miami'. Used for search mode.
maxCrawledPlacesPerSearchinteger20NoMaximum number of places per search (per query and map position), up to 120
placeIdsarray-NoDirect Google Place IDs (ChIJ...) or CIDs for detailed GBP scraping. Use this mode to get comprehensive data including description, reviews, hours, and photos for specific businesses.
maxReviewsinteger0NoMaximum number of reviews to extract per business (0 = no reviews). Reviews include author, rating, text, date, and response.
reviewsSortstring"newest"NoHow to sort reviews before extraction
includeQAbooleanfalseNoExtract Questions & Answers section from the business profile
languagestring"en"NoLanguage code for results
latstring-NoCenter latitude for geo-biased search
lngstring-NoCenter longitude for geo-biased search
zoominteger13NoMap zoom level (10=city, 14=neighborhood, 17=street)
searchLocationsarray-NoMap positions as "lat,lng" or "lat,lng,zoom"; every query runs once at each. Overrides lat and lng
proxyConfigurationobject{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}NoProxy settings. Residential proxies recommended. Exits in the United States unless you choose a country
demoModebooleanfalseNoReturn one labeled sample record (demo: true) instead of scraping. Nothing is charged
webhookUrlstring-NoURL to POST results when scraping completes (Zapier, Make, n8n, custom endpoint)
webhookPlatformstring"custom"NoPlatform type for webhook payload formatting
webhookHeadersobject-NoAdditional HTTP headers to send with webhook (e.g., authorization tokens)

Pricing

This actor uses pay-per-event billing:

EventWhen it is chargedPrice
Actor startOnce when the run starts, one event per GB of memory (minimum one). At the default 2 GB of memory a run starts at $0.20$0.10 per GB
Result ScrapedPer result scraped$0.02
Per Pack AnalyzedPer local pack analyzed$0.02
ResultEach item written to the default dataset$0.00001

Troubleshooting

"API error 429" or "Rate limit"

Too many requests. Wait a minute and try again, or reduce the number of items per run.

No results or empty dataset

Check the run log for error messages. Common causes:

  • Invalid input format (check the examples above)
  • The target data doesn't exist or is too small to track

Fewer places than requested

Check SEARCH_STATS. stalled means Google stopped loading more results for that search; google_limit means Google's own cap of about 120 was reached. Split a large area into several map positions with searchLocations to read more places.

The run stopped before its timeout

About 75 seconds before the run timeout, the scraper stops opening new pages, saves the places it already read, and finishes normally. The OUTPUT record in the run's key-value store lists the searches and place IDs it did not finish (notProcessed). Raise the run timeout, or split the searches across runs, to finish them.

How do I test without an API key?

No API key is needed. Set demoMode to true for one labeled sample record that shows the output format and is not charged.


Built by John Rippy | Actor Arsenal