Google Maps & Google Business Profile Scraper
Pricing
from $0.01 / 1,000 results
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
Maintained by CommunityActor stats
4
Bookmarked
191
Total users
9
Monthly active users
a day ago
Last modified
Categories
Features
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.
Three ways to read a search
analysisMode | What it does | Speed |
|---|---|---|
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 request | About 10 to 20 seconds per place |
list | Reads 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: null | Up to 120 places per search in about 1 to 2 minutes; 20 places in a few seconds |
local-pack | Top 3 results per search only | A 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 120google_limit: the list ended at Google's cap, so more places likely existreached_max: stopped atmaxCrawledPlacesPerSearchstalled: Google stopped loading more before either of the abovesingle_placeorno_results: the query opened one business page, or Google found nothingconsent_blocked,failed,charge_limitornot_run: the search did not finishstopped_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 modeplacePagesNotRunsays 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.
Google consent pages
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
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
analysisMode | string | "full" | No | full opens every business page, list reads the results list only (fast), local-pack returns the top 3 results per search |
searchStringsArray | array | - | No | List of search queries like 'Bar Fort Lauderdale FL' or 'Plumber Miami'. Used for search mode. |
maxCrawledPlacesPerSearch | integer | 20 | No | Maximum number of places per search (per query and map position), up to 120 |
placeIds | array | - | No | Direct 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. |
maxReviews | integer | 0 | No | Maximum number of reviews to extract per business (0 = no reviews). Reviews include author, rating, text, date, and response. |
reviewsSort | string | "newest" | No | How to sort reviews before extraction |
includeQA | boolean | false | No | Extract Questions & Answers section from the business profile |
language | string | "en" | No | Language code for results |
lat | string | - | No | Center latitude for geo-biased search |
lng | string | - | No | Center longitude for geo-biased search |
zoom | integer | 13 | No | Map zoom level (10=city, 14=neighborhood, 17=street) |
searchLocations | array | - | No | Map positions as "lat,lng" or "lat,lng,zoom"; every query runs once at each. Overrides lat and lng |
proxyConfiguration | object | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]} | No | Proxy settings. Residential proxies recommended. Exits in the United States unless you choose a country |
demoMode | boolean | false | No | Return one labeled sample record (demo: true) instead of scraping. Nothing is charged |
webhookUrl | string | - | No | URL to POST results when scraping completes (Zapier, Make, n8n, custom endpoint) |
webhookPlatform | string | "custom" | No | Platform type for webhook payload formatting |
webhookHeaders | object | - | No | Additional HTTP headers to send with webhook (e.g., authorization tokens) |
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once 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 Scraped | Per result scraped | $0.02 |
| Per Pack Analyzed | Per local pack analyzed | $0.02 |
| Result | Each 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