Google Maps Business Leads Extractor
Pricing
$5.00 / 1,000 lead results
Google Maps Business Leads Extractor
Extract Google Maps businesses, enrich public contact data, remove duplicates, audit websites, and rank actionable leads for agencies and sales teams.
Pricing
$5.00 / 1,000 lead results
Rating
0.0
(0)
Developer
Khoa Nguyen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Turn local-business search results into ranked, sales-ready leads. The Actor discovers Google Maps listings, normalizes and deduplicates business records, enriches public website contact details, audits common local-marketing gaps, and explains why each lead is worth contacting.
What you get
Each output item combines:
- Business identity: name, category, status, place ID, address, coordinates, phone, website, rating, and review count.
- Public contact enrichment: emails displayed on scanned pages, phone links, and supported social profiles.
- Website intelligence: HTTPS, mobile viewport, title/meta/H1, schema markup, forms, calls to action, booking, ordering, analytics, technologies, content depth, and freshness signals.
- Lead intelligence: opportunity, contactability, and data-confidence scores; final 0–100 lead score; A–D tier; recommended service; and evidence-backed reasons.
- Provenance: source URL, query, location, run ID, and ISO timestamp.
- Exports: dataset,
OUTPUT.json, browser-friendly HTML report, CSV, and structured error report.
The default run uses realistic offline fixtures and executes the same normalization, filtering, deduplication, website-audit, scoring, reporting, and schema-validation pipeline as imported or live data. It needs no credentials and returns a non-empty dataset for Store QA.
Best use cases
- Local SEO agencies prioritizing businesses with weak on-page SEO or low review volume.
- Web-design agencies finding businesses without a website, mobile support, forms, or strong calls to action.
- Reputation-management teams finding low-review or rating-improvement opportunities.
- Franchise and multi-location teams building clean prospect datasets without collapsing distinct locations that share one domain.
- Sales operations importing existing lists for normalization, deduplication, enrichment, and scoring.
- Scheduled prospecting runs that output only businesses not seen in earlier runs.
Quick start
Apify Console
- Create or deploy the Actor.
- Keep Run mode set to Demo.
- Click Start.
- Open the Ranked business leads dataset view or the HTML report.
Local default run
npm cinpm start
When the Apify SDK is unavailable outside Apify, the project uses a local storage-compatible adapter. Results are written under:
storage/datasets/default/storage/key_value_stores/default/
Run tests and validation
# Requires npm ci first; the command intentionally rejects a global tscnpm run typechecknpm run lintnpm testnpm run test:coveragenpm run validatenpm run smokenpm run benchmarknpm run security
Input modes
Demo mode
Credential-free and network-free. It uses realistic fixture businesses and website HTML while exercising the production pipeline. Demo records use reserved .test domains and are clearly marked as fixture data.
{"runMode": "demo","includeWebsiteEnrichment": true,"scoringProfile": "general"}
Live mode
Search by business type and location, process direct Google Maps place URLs, or combine both.
{"runMode": "live","searchQueries": ["dentists", "roofing contractors"],"locations": ["Austin, Texas", "Round Rock, Texas"],"maxResultsPerSearch": 50,"maxTotalResults": 500,"includeWebsiteEnrichment": true,"maxWebsitePages": 3,"scoringProfile": "localSeo","proxyConfiguration": {"useApifyProxy": true}}
A proxy is strongly recommended for live discovery. The implementation uses bounded concurrency, bounded scrolling, request-per-minute limits, same-domain delays, timeouts, retries, and transparent partial-failure records. It does not include CAPTCHA solving, authentication bypass, retryOnBlocked, or obfuscated anti-bot bypass code.
Import mode
Use this mode when you already have business data from a licensed source, CRM export, prior dataset, or another Actor.
{"runMode": "import","importedBusinesses": [{"name": "Acme Dental","category": "Dentist","address": "100 Main Street, Austin, TX 78701","phone": "+1 512 555 0123","website": "https://acmedental.example","rating": 4.2,"reviewCount": 37,"placeId": "your-source-place-id","googleMapsUrl": "https://www.google.com/maps/place/..."}],"includeWebsiteEnrichment": true,"scoringProfile": "webDesign"}
Common aliases such as title, businessName, type, categories, reviews, reviewsCount, lat, lng, url, and mapsUrl are normalized by the importer.
Important inputs
| Input | Purpose | Default |
|---|---|---|
runMode | demo, live, or import | demo |
searchQueries | Business types or complete search phrases | dentists |
locations | Cities, ZIP codes, regions, or countries | Austin, Texas |
startUrls | Direct Google Maps place URLs | empty |
maxResultsPerSearch | Per-query discovery cap | 25 |
maxTotalResults | Hard unique-lead cap | 500 |
includeWebsiteEnrichment | Crawl public business websites | true |
maxWebsitePages | Homepage plus selected contact/about/booking pages | 3 |
scoringProfile | general, localSeo, webDesign, or reputation | general |
onlyNewResults | Emit only leads not present in the named history store | false |
maxConcurrency | Browser concurrency cap | 5 |
maxRequestsPerMinute | Request-rate cap per crawl stage | 120 |
sameDomainDelaySecs | Minimum same-domain delay | 0.5 |
maxRequestRetries | Retry cap | 3 |
emitErrorItems | Put structured partial failures in the dataset | true |
The full form includes descriptions, sensible limits, section captions, editor types, and defaults in .actor/input_schema.json.
Lead scoring
The final score is deterministic and evidence-based:
- Opportunity score: business gaps such as no website, inaccessible site, missing mobile viewport, missing meta description/H1/schema, weak CTA, no form, no booking or ordering, thin content, low review volume, or rating opportunity.
- Contactability score: phone, website, public email, and social-profile availability.
- Data-confidence score: identity, address, coordinates, reputation, and contact completeness.
The final score combines these dimensions as 55% opportunity, 30% contactability, and 15% data confidence. Profile multipliers change signal weighting but never hide the underlying evidence.
| Tier | Score | Meaning |
|---|---|---|
| A | 80–100 | High-priority, reachable opportunity |
| B | 65–79 | Strong opportunity |
| C | 45–64 | Moderate opportunity |
| D | 0–44 | Low-priority or low-confidence record |
Scores are prospecting heuristics, not factual claims about business performance or guaranteed sales outcomes.
Deduplication strategy
The Actor uses transitive identity grouping with multiple keys:
- Google place ID or CID.
- Canonical business name plus normalized address.
- Canonical business name plus normalized phone.
- Canonical business name plus website domain.
- Canonical business name plus rounded coordinates.
A domain alone is intentionally not enough to merge records. This prevents separate franchise or multi-location businesses sharing a corporate website from collapsing into one lead. The richest record becomes the base, while categories, identifiers, and provenance are merged deterministically.
Website enrichment behavior
For each unique domain, the Actor:
- Loads the homepage.
- Extracts public contact and website-quality signals.
- Ranks internal links for contact, booking, about, and locations pages.
- Enqueues up to
maxWebsitePages - 1supplemental pages through the same Crawlee request queue. - Applies the same proxy policy, robots rules, request limits, retries, timeouts, and resource blocking to every queued page.
- Shares the merged domain audit across matching business records.
Website enrichment honors robots.txt. Automatic blocked-site bypass is disabled. Public emails are filtered to remove obvious example, no-reply, image-file, and placeholder addresses.
Output example
{"recordType": "business-lead","schemaVersion": "1.0","leadId": "lead_...","name": "North Loop Roofing & Exteriors","category": "Roofing contractor","address": "4812 North Loop Boulevard, Austin, TX 78751","phone": "512-555-0188","website": "https://northlooproofing.test","email": "estimates@northlooproofing.test","rating": 4.1,"reviewCount": 18,"leadScore": 88,"leadTier": "A","recommendedService": "Reputation management","leadIntelligence": {"opportunityScore": 78,"contactabilityScore": 100,"dataConfidenceScore": 100,"opportunityReasons": ["No mobile viewport detected","Rating improvement opportunity","Low review volume"]},"provenance": {"sourceType": "demo-fixture","sourceUrl": "https://www.google.com/maps/place/...","sourceQuery": "roofing contractors","sourceLocation": "Austin, Texas","runId": "local_...","scrapedAt": "2026-07-25T12:00:00.000Z"}}
See sample-output/dataset.json for the complete contract. The dataset schema defines nested business, contact, location, reputation, website-audit, scoring, error, and provenance fields.
Stored artifacts
| Artifact | Storage | Purpose |
|---|---|---|
| Business leads and error items | Default dataset | Machine-readable result stream |
OUTPUT | Default key-value store | Counts, quality metrics, billing info, and run metadata |
REPORT.html | Default key-value store | Human-readable lead report |
LEADS.csv | Default key-value store | CRM/spreadsheet import |
ERRORS | Default key-value store | Error-only JSON array |
SEEN_* records | Named history store | Optional recurring-run deduplication |
Error handling
One failed source does not silently invalidate successful results. Failures produce records such as:
{"recordType": "error","schemaVersion": "1.0","error": {"code": "WEBSITE_ENRICHMENT_FAILED","message": "Navigation timeout exceeded","retriable": true,"attempts": 4},"provenance": {"sourceUrl": "https://business.example","sourceQuery": null,"sourceLocation": null,"runId": "...","occurredAt": "2026-07-25T12:00:00.000Z"}}
Input-contract violations fail early with a clear error. Network and parser failures are retried within configured bounds and then reported without secrets.
Pricing recommendation
The roadmap defines the primary value unit as one business result and proposes pay-per-result pricing:
- Launch: $2.50 per 1,000 raw business results.
- Target after validation: $3.75 per 1,000 raw business results.
Recommended Store configuration:
- Use the synthetic
apify-default-dataset-itemevent for simple one-result/one-charge billing, or configure the roadmap eventgoogle-maps-business-leads-extractor-resultand pass it toActor.pushDataafter cloud PPE validation. - Keep pricing to one primary result event plus the optional synthetic Actor start event.
- Benchmark actual browser, proxy, and memory costs in Apify cloud before enabling the final price.
- Error items are visible work products; decide during Store publication whether they are billable or should be stored only in
ERRORS.
Pricing is intentionally not hardcoded in source code because Store pricing is publication configuration and must be tested against real cloud costs.
Responsible use and limitations
- Website contact enrichment processes public pages only and respects
robots.txt. - The Actor does not log credentials or include API keys, cookies, CAPTCHA solving, login automation, or anti-bot bypass payloads.
- Google Maps pages and selectors change. Live discovery requires maintenance and cloud/browser regression testing.
- Google's current terms include restrictions on scraping and storing Google Maps content. Users must review the applicable Google terms, website terms, privacy laws, marketing laws, and contractual rights before using live mode.
- Import mode is available for data the user is authorized to process.
- No email validity, ownership, deliverability, or consent is guaranteed.
- Technology detection and lead scoring are heuristic.
- Website checks are lightweight lead qualification, not a full accessibility, security, Core Web Vitals, or technical SEO audit.
- No Actor ID is included. Add a real Actor ID only when linking this package to an existing Apify Actor.
Development structure
.actor/ Actor manifest and schemassrc/core/ validation, normalization, identity, scoring, outputsrc/maps/ search URL, result-feed, and place-page extractionsrc/website/ pure HTML audit and merge logicsrc/pipeline/ normalize/filter/deduplicate/finalize stagessrc/runtime/ Apify/local adapters, crawling, demo, reportingscripts/ lint, validation, smoke, benchmark, securityfixtures/ realistic offline business and website fixturestests/ unit, integration, schema, and edge-case testssample-output/ generated example dataset and reports
Architecture and product decisions are documented in ARCHITECTURE.md and PRODUCT_SPEC.md.
Verification status
The source package includes reproducible evidence in BUILD_REPORT.md, VALIDATION.md, and evidence/. A check is marked passed only when its command was run successfully. Docker and Apify cloud results are never inferred from local tests.