Google Maps Business Scraper
Pricing
from $0.10 / 1,000 results
Google Maps Business Scraper
Extract business listings from Google Maps — get names, ratings, reviews count, addresses, phone numbers, websites, categories, and GPS coordinates. Perfect for lead generation, market research, and local SEO analysis.
Pricing
from $0.10 / 1,000 results
Rating
0.0
(0)
Developer
theodore
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Google Maps Business Scraper v3.0
Extract 28+ data fields from Google Maps business listings — ideal for lead generation, market research, local SEO analysis, and data enrichment.
Features
- 🔍 Search by keyword + location — e.g.
"plumber new york","restaurant san francisco" - 📊 28 fields across 5 data layers — from basic contact info to AI-powered business intelligence
- 📦 Batch processing — multiple search queries in a single run
- 🌐 Multi-language — English, Chinese, Japanese, Korean, German, French, Spanish
- 🏢 Website enrichment — extract emails and social media links from business websites
- 🧠 AI Business Intelligence — GPT-4o-mini analysis: tier, health, lead score, competitive strength, tags
- ⚡ Fast parallel extraction — concurrent browser contexts for high throughput
- 🗺️ Distance-based filtering — filter results by radius from a search center point
- 🚫 Closed business filter — remove permanently or temporarily closed businesses
Data Layers
The output is organized into 5 layers, ranging from always-present fields to optional AI-powered enrichment.
Layer 1 — Base (always present)
| Field | Type | Description | Source |
|---|---|---|---|
name | string | Business name | Feed card label (preferred); detail panel h1 fallback |
rating | number | Star rating (1.0–5.0) | aria-label on star rating element |
reviewsCount | integer | Number of Google reviews | Text matching /^\(?([\d,]+)\)?\s*reviews?$/i |
address | string | Full formatted address | button[data-item-id*="address"] aria-label |
phone | string | Phone number | button[data-item-id*="phone:tel"] aria-label |
website | string | Website URL | a[data-item-id*="authority"] href attribute |
category | string | Primary business category | button[jsaction*="category"] text content |
coordinates | object | { lat, lng } GPS coordinates | Page scripts, URL pattern, card href (priority order) |
searchQuery | string | The search query that produced this result | Set programmatically |
Layer 2 — Extended (always present)
| Field | Type | Description | Source |
|---|---|---|---|
hours | string[] | Opening hours per day | table.WgFkxc rows in the detail panel |
hoursRaw | string | Hours as compact text (fallback) | [data-item-id*="oh"] button aria-label |
priceLevel | string | Price category | [aria-label*="Price"] aria-label |
description | string | Editorial summary | .PYvSYb or .uxOu7 selector |
closedStatus | string | Permanently/temporarily closed | .dN94De or [class*="closed"] text |
photosCount | integer | Total photos count | [aria-label*="Photo"] aria-label, first number |
plusCode | string | Open Location Code | [data-item-id*="oloc"] aria-label |
distanceKm | number | Straight-line distance from search center | Haversine calculation (requires searchCenterLat, searchCenterLng, radiusKm) |
Layer 3 — Enrichment (requires enrichFromWebsite: true)
| Field | Type | Description |
|---|---|---|
emails | string[] | Email addresses found on the business website |
social | object | Social media links (Instagram, Facebook, Twitter/X, LinkedIn, TikTok, YouTube, Pinterest, Yelp) |
Emails containing noreply, donotreply, spamtrap, mailer-daemon, or postmaster are automatically filtered out. Supported social platforms: instagram, facebook, twitter, x, linkedin, tiktok, youtube, pinterest, yelp.
Layer 4 — AI Intelligence (requires enableAI: true + OpenAI API key)
| Field | Type | Values | Description |
|---|---|---|---|
tier | string | "premium" | "mid" | "budget" | Business pricing tier inferred from rating, reviews, price level, and category |
targetAudience | string | One-sentence summary | Target customer description inferred from name, category, rating, description |
businessHealth | string | "thriving" | "stable" | "struggling" | Business health inferred from rating, reviews, closed status |
leadScore | integer | 0–100 | Outreach priority score — higher = more promising lead |
competitiveStrength | string | "strong" | "moderate" | "weak" | Competitive standing relative to local peers |
tags | string[] | Up to 5 hyphenated tags | e.g. ["specialty-coffee", "remote-work-friendly"] |
Model: gpt-4o-mini with response_format: json_object. Requires an OpenAI API key (passed via input or the OPENAI_API_KEY environment variable).
Layer 5 — Meta (always present, auto-generated)
| Field | Type | Description |
|---|---|---|
latitude | number | Flattened copy of coordinates.lat (for CSV export) |
longitude | number | Flattened copy of coordinates.lng (for CSV export) |
error | string | Error message on failed records (absent on successful ones) |
Failed records are pushed to the dataset with an error field so failures are visible without aborting the run.
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchStrings | string[] | ["plumber new york"] | Search queries (required) |
maxResults | integer | 50 | Max results per query (max 500) |
language | select | en | Interface language |
onlyOpen | boolean | false | Filter out permanently/temporarily closed businesses |
searchCenterLat | number | 40.7128 | Search center latitude (for distance filtering) |
searchCenterLng | number | -74.006 | Search center longitude (for distance filtering) |
radiusKm | number | 10 | Max distance from search center (km) |
enrichFromWebsite | boolean | false | Extract emails + social from business websites |
enableAI | boolean | false | Enable AI-powered business intelligence |
openaiApiKey | string (secret) | — | OpenAI API key (or set OPENAI_API_KEY env var) |
Language Options
en— Englishzh-CN— Chinese (Simplified)ja— Japaneseko— Koreande— Germanfr— Frenches— Spanish
Example
Input:
{"searchStrings": ["coffee shop tokyo", "ramen shinjuku"],"maxResults": 20,"language": "en","onlyOpen": true,"enrichFromWebsite": true,"enableAI": true,"openaiApiKey": "sk-..."}
Output (sample — 1 of 20 results):
{"name": "Blue Bottle Coffee","rating": 4.5,"reviewsCount": 823,"address": "1-4-8 Jingumae, Shibuya, Tokyo","phone": "+81 3-1234-5678","website": "https://bluebottlecoffee.jp","category": "Coffee shop","coordinates": { "lat": 35.6677, "lng": 139.7106 },"searchQuery": "coffee shop tokyo","hours": ["Monday: 8 AM–6 PM", "Tuesday: 8 AM–6 PM", "Wednesday: 8 AM–6 PM", "Thursday: 8 AM–6 PM", "Friday: 8 AM–7 PM", "Saturday: 9 AM–7 PM", "Sunday: 9 AM–6 PM"],"priceLevel": "Moderate","description": "Trendy cafe chain offering specialty coffee, pastries, and a minimalist atmosphere.","photosCount": 348,"plusCode": "VQGP+4F Tokyo, Japan","latitude": 35.6677,"longitude": 139.7106,"emails": ["hello@bluebottlecoffee.jp"],"social": {"instagram": "https://instagram.com/bluebottle","facebook": "https://facebook.com/bluebottlecoffee"},"tier": "premium","targetAudience": "Coffee enthusiasts and remote workers seeking quality espresso.","businessHealth": "thriving","leadScore": 92,"competitiveStrength": "strong","tags": ["specialty-coffee", "remote-work-friendly", "minimalist"]}
Pricing
| Tier | Price | Runs/month |
|---|---|---|
| Free | $0 | 10 runs |
| Pay-as-you-go | $0.05/run | Unlimited |
| Unlimited | $9.99/month | Unlimited runs |
Note: AI analysis (Layer 4) and website enrichment (Layer 3) consume additional tokens/bandwidth and may increase run duration.
Use Cases
- 🏢 Lead generation — collect contact info, emails, and social links for local businesses
- 📈 Market research — analyze competitor density, ratings, pricing tiers, and market positioning
- 🔍 Local SEO — audit business listings, check hours, monitor closed/paused operations
- 🗺️ Data enrichment — add location data, social profiles, and AI insights to your CRM
- 🧠 Sales intelligence — use lead scores, business health, and tags to prioritize outreach
Technical Details
- Stack: Playwright (Chromium) + Node.js + Apify SDK
- Browser: Headless Chrome with anti-detection user agent
- Parallelism: Configurable concurrent browser contexts (default: 5, max: 10)
- Resilience: Auto-retry on failures, error records for failed extractions
- Runtime: Runs on Apify's cloud infrastructure with auto-scaling
- Output: Apify dataset (viewable in Console) + local
storage/results.json
Version History
- v3.0 — 28 fields across 5 layers: AI intelligence, website enrichment, hours, price level, photos count, distance filtering, closed business filter, error records
- v1.2 — Core fields, parallel extraction, multi-language, Apify deployment
- v1.0 — MVP with Playwright-based scraping
Built by theo_12134