Google Maps Scraper
Under maintenancePricing
from $2.50 / 1,000 record scrapeds
Google Maps Scraper
Under maintenanceMany Google maps scrapers leave discovery gaps that quietly cost you leads. This actor systematically scans entire areas to uncover almost all businesses, reduces duplicates, and generate cleaner, outreach ready datasets with contact details, and pin point coordinates with link & much more
Pricing
from $2.50 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
Mohsen S
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
Primelabs Google Maps Lead Extractor
Scan up to 25 geographic zones per keyword, run multiple keywords in a single execution, and control runtime costs with built-in request budgeting. By automatically dividing target geographic regions into automated search matrix cells, this tool helps discover businesses across different neighborhoods and geographic areas within a target region.
Built for Agency Outcomes and Cost Control
Instead of just dumping raw data, this extractor is built to support outbound operational goals while keeping platform spend under precise control.
- Prevent accidental credit burn. Most scrapers let users accidentally launch hundreds of hidden queries. This actor evaluates your planned search footprint (keywords times grid cells) and checks it against your
max_search_requestscap before spinning up browser instances, blocking cost overruns. - Lead generation agencies can export targeted lists containing only verified, actionable contact data. Use
required_fieldsto filter out incomplete rows at runtime. - Local SEO and web design teams can instantly isolate regional businesses missing an active website or with poor review metrics, ideal for outreach.
- Cold outreach teams get low-quality profiles filtered automatically at runtime so reps spend time on verified leads instead of chasing unverified numbers.
Core Features
Granular data qualification (required_fields)
Most scrapers dump every profile they find and leave filtering to you. This actor includes a pre-qualification engine. Pass configurations like ["phone", "website"] and only fully qualified leads are written to the dataset.
Geographic grid scanning Google Maps search results are often limited within a single viewport, so a broad city search misses part of the market. This tool divides the target area into a search matrix grid and scans neighborhoods and suburbs individually to surface localized business profiles.
Multi-keyword batch processing
The search_queries array input supports batch processing. Passing a list of niches overrides single-keyword execution and runs the full grid sequence across each keyword in one run.
Live run analytics
Every run generates a run_metadata asset in the key-value store, logging the active keyword set, spatial grid configuration, and final data yield metrics.
Coordinates from profile URLs
Latitude and longitude are parsed directly from the business tracking signatures (!3d and !4d) embedded in the profile's routing parameters, keeping data structured for mapping, filtering, and CRM workflows.
Duplicate removal When scanning overlapping neighborhood boundaries, the scraper identifies and filters out duplicate profiles using their unique business signatures, so the final dataset stays clean.
Lead Quality Scoring
Every unique business is graded from 0 to 100 based on its online footprint.
| Signal | Maximum Value | Logic |
|---|---|---|
| Contact phone present | 25 points | Confirms direct contact capability |
| Website URL present | 25 points | Confirms active digital presence |
| Review volume | 25 points | reviews / 10, capped at 25 |
| Star rating | 25 points | rating * 5, capped at 25 |
Output Format Presets
The actor structures data into three layout configurations depending on what you need.
full: Every collected parameter, including grid cell center points, timestamps, and full coordinate data.crm: A clean layout focused on fields essential for prospecting: business name, address, phone, website, operating status, and lead quality score.contact_only: A lightweight directory layout with only name, phone, website, and the keyword that matched.
Data Fields Collected
| Field | Type | Description |
|---|---|---|
name | String | Official listed trade name of the business |
address | String | Full street address with line breaks removed |
phone | String | Cleaned contact phone number |
website | String | Validated external homepage URL |
total_rating | Float | Star rating from 0.0 to 5.0 |
review_count | Integer | Total number of public reviews |
lead_quality_score | Integer | Calculated score from 0 to 100 |
business_status | String | operational, permanently_closed, or temporarily_closed |
Maps_url | String | Direct link to the listing |
latitude | Float | Latitude coordinate |
longitude | Float | Longitude coordinate |
matched_keyword | String | The search query that returned this profile |
target_city | String | The municipality configured for the crawl |
scraped_at | String | ISO timestamp of when extraction completed |
record_id | String | Deterministic fingerprint unique to the entry |
place_key | String | Parameter-stripped unique Google routing key |
source_cell_lat | Float | Latitude of the search grid cell center |
source_cell_lng | Float | Longitude of the search grid cell center |
schema_version | String | Version tag for the output schema |
business_category | String | Profile category, may be null depending on listing layout |
Configuration
Main Settings
target_city(String, required): City or region to scan, for example"Washington DC".target_country(String, optional): Restricts boundary parsing to a country code. Default"US".search_query(String, optional): A single business niche or keyword. Used ifsearch_queriesis empty.search_queries(Array, optional): A list of keywords to process sequentially across the grid. Overridessearch_query.max_results(Integer, optional): Stops the run once this many unique leads are saved.output_format(String, optional):full,crm, orcontact_only.
Spatial Grid Settings
scan_mode(String, optional): How search coordinates distribute across the boundary:city_center,balanced, orfull_coverage.scan_depth(String, optional): Density of the search grid:basic(1),standard(4),deep(9),enterprise(25).max_search_requests(Integer, optional): Caps total planned cells. The run stops if the plan exceeds this limit.
Data Filters
with_website(Boolean, optional): Only save listings that have a website.without_website(Boolean, optional): Only save listings missing a website.min_reviews(Integer, optional): Skip profiles with fewer reviews than this.skip_permanently_closed(Boolean, optional): Filter out businesses flagged as closed.required_fields(Array, optional): Drop listings missing these fields, options arephoneandwebsite.include_lead_scoring(Boolean, optional): Toggles calculation of thelead_quality_scorefield.include_row_metadata(Boolean, optional): Toggles inclusion of backend metadata fields such as grid cell center coordinates and schema version.
Diagnostics in the Key-Value Store
If a search grid point fails to complete due to a page layout or load issue, the actor saves trace files to the default key-value store so you can debug without rerunning the whole job.
- Screenshot (
FEED_FAILURE_*): An image of the browser window at the moment of the timeout. - HTML dump (
FEED_FAILURE_*_HTML): A copy of the page DOM, useful for spotting broken or renamed selectors. - Run metadata (
FEED_FAILURE_*_META): A JSON log with the grid cell coordinates, final redirect URL, HTTP status, and traceback.
Performance
- Runs on 2048 MB of allocated memory, using Crawlee's concurrency controls to stay within safe limits.
- Configured with
CRAWLEE_PURGE_ON_START=1andPYTHONUNBUFFERED=1so each run starts clean and logs stream immediately.
Example Configuration
{"target_city": "Washington DC","target_country": "US","search_query": "Cafe","search_queries": ["Cafe", "Coffee Shop"],"scan_mode": "full_coverage","scan_depth": "deep","max_results": 5,"max_search_requests": 30,"output_format": "full","with_website": false,"min_reviews": 5,"skip_permanently_closed": true,"required_fields": ["phone"],"include_lead_scoring": true,"include_row_metadata": true}
API Usage
Start a Run
curl -X POST "https://api.apify.com/v2/acts/primelabs~google-maps-scraper/runs?token=YOUR_API_TOKEN&memory=2048" \-H "Content-Type: application/json" \-d '{"target_city": "Washington DC","search_queries": ["Cafe", "Coffee Shop"],"scan_depth": "standard","max_results": 5,"output_format": "full"}'
Fetch Results
$curl -X GET "https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?token=YOUR_API_TOKEN"