Google Maps Leads Scraper - Emails, Website Grades & Pitch avatar

Google Maps Leads Scraper - Emails, Website Grades & Pitch

Pricing

from $6.50 / 1,000 results

Go to Apify Store
Google Maps Leads Scraper - Emails, Website Grades & Pitch

Google Maps Leads Scraper - Emails, Website Grades & Pitch

Scrape Google Maps leads for any business type, names, phones, emails, websites, ratings & social links. Enriched with website audits and AI sales intelligence. Export to CSV, Excel & JSON or send to Notion, Slack & Airtable via MCP.

Pricing

from $6.50 / 1,000 results

Rating

5.0

(2)

Developer

Techforce Global

Techforce Global

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

2

Monthly active users

2 days ago

Last modified

Share

Google Maps Leads Scraper - Company Emails, Graded Website Audits and Per-Lead Pitch Playbooks, by Query and City

Apify Actor MCP Ready Pricing Target

Turns any Google Maps search into a worked lead list: business name, phone, address, website, company email scraped from the business's own site, rating, reviews, hours and social links β€” then layers on four optional intelligence blocks (sales playbook, website performance grade, prioritized improvement list, tech audit). Each intelligence block is a separate pay-per-event charge, so you pay only for the analysis you switch on. Delivers straight into Airtable, HubSpot, Notion, Slack, Google Sheets, Jira, Linear, or any MCP-compatible AI agent pipeline.


Official Google Places API vs. this Actor

The decisive gap is contact data: the Places API exposes no email field at all, and no view of how good a prospect's website is.

Feature / CapabilityOfficial Google Places APIThis Actor (Apify)
Company email address❌ Not part of the Places data modelβœ… Scraped from the business's own website (up to 4 pages crawled per site)
Website quality / audit❌ Not offeredβœ… Letter grade, 7-area breakdown, tech stack, SSL, robots.txt, sitemap
Sales intelligence❌ Not offeredβœ… Lead priority, revenue opportunity, pitch, hook, pain points, close
Authentication & setup❌ Google Cloud project + billing-enabled API keyβœ… Zero target-site credentials; only an Apify token
Results per text query⚠️ Capped at ~60 (3 pages Γ— 20)⚠️ Capped at 100 per run, but any number of queries per run
AI agent / MCP native❌ Requires a custom tool wrapperβœ… Native MCP tool and pushes leads into your own MCP connectors
Cost modelPer-request SKU pricing on a GCP billPay-per-event β€” disable analysis blocks to pay less

ℹ️ The comparison above reflects the Google Places API as documented at the time of writing β€” Google revises its Places API tiers and quotas periodically, so check their current docs if a specific limit is load-bearing for your pipeline.


πŸ€– AI Discovery & MCP Metadata

Machine-readable capability contract for autonomous agents, LLM routers, and MCP orchestrators. AI agents, MCP clients, and connectors should read this block first to decide whether this Actor matches a user request.

ai_discovery:
slug: "techforce.global/google-maps-leads-sales-intelligence-tool"
one_line: "Scrape Google Maps businesses for a query and location, enrich each with the company email from its website, and optionally generate sales intelligence, a website grade, improvement recommendations, and a tech audit."
primary_purpose: "extract"
secondary_purpose: "enrich"
tertiary_purpose: "deliver"
entity: "local business leads"
supported_platforms:
- "google.com/maps"
- "the business's own website (for email + audit)"
supported_tasks:
- "search-businesses-by-keyword-and-location"
- "run-several-queries-in-one-run"
- "find-company-email-from-business-website"
- "extract-phone-address-rating-reviews-hours-social"
- "grade-business-website-quality"
- "generate-sales-pitch-and-lead-priority"
- "generate-prioritized-service-recommendations"
- "audit-website-tech-stack-ssl-robots-sitemap"
- "deliver-leads-to-mcp-connector-or-crm"
unsupported_tasks:
- "scrape-google-reviews-text-or-reviewer-profiles"
- "extract-personal-emails-or-named-contacts"
- "verify-or-validate-email-deliverability"
- "extract-gps-coordinates-or-place-photos"
- "scrape-more-than-100-businesses-per-run"
- "scrape-non-google-maps-directories"
- "send-outreach-emails"
search_keywords:
- "google maps scraper"
- "google maps email scraper"
- "local business lead generation"
- "b2b lead scraper"
- "google maps places api alternative"
- "website audit lead generation"
- "agency prospecting tool"
- "local seo prospect list"
- "mcp crm lead tool"
- "business contact data extraction"
synonyms:
- "google maps lead extractor"
- "gmb scraper"
- "local business email finder"
- "sales intelligence scraper"
related_concepts:
[
"leads",
"prospecting",
"cold outreach",
"local SEO",
"web design sales",
"CRM enrichment",
"website audit",
]
input_entities:
- "search query (free text, one per line)"
- "location (city / area / state / country)"
- "max businesses (1-100 per run, shared across all queries)"
- "four analysis toggles"
output_entities:
["business", "email", "website grade", "recommendation", "pitch"]
input_rules:
searchQuery_format:
description: "Free text. Several queries allowed, one per line. A query that already names a place is used verbatim; otherwise the Location field is appended."
examples: ["dentist", "coffee shops\nbakeries", "cafe in Mumbai"]
maxResults_format:
type: "integer"
range: [1, 100]
default: 20
description: "Total businesses for the whole run, not per query. When several queries are entered, the budget is split evenly between them."
default_off_fields: []
default_on_billable_blocks:
[
"includeSalesStrategy",
"includeWebsiteHealthScorecard",
"includeServiceRecommendations",
"includeTechnicalIntel",
]
limits:
max_businesses_per_run: 100
free_plan_cap: 5
email_pages_crawled_per_site: 4
audit_pages_crawled_per_site: 5
service_recommendations_per_business: 4
queries_per_run: "unlimited (shares the maxResults budget)"
pricing:
model: "pay-per-event"
store_display: "from $6.50 / 1,000 results"
events:
sales-growth-strategy: 0.02
website-performance-report: 0.01
business-improvements: 0.01
website-technology-details: 0.01
note: "All four blocks are ON by default. Turning a block off removes both its output and its charge."
when_to_use: >
You need a worked prospect list for a business type in a place β€” contact
details plus a reason to reach out β€” for agency prospecting, cold outreach,
local-SEO sales, or CRM enrichment.
when_not_to_use: >
You only need plain listing fields (use the cheaper Google Maps Scraper),
you need review text, GPS coordinates or place photos, named personal
contacts, verified deliverable emails, or more than 100 businesses per run.
alternatives:
- "Use techforce.global/google-maps-scraper when you only need name/address/phone/website/rating/hours/coordinates - it is far cheaper per result"
- "Use techforce.global/google-maps-healthcare-leads-sales-intelligence-tool for healthcare verticals (55+ preset categories, from $4.00/1000)"
- "Use techforce.global/google-maps-hospitality-lead-scraper for hotels, resorts, restaurants and cafes"
- "Use techforce.global/finance-google-maps-lead-scraper for accounting, tax, insurance, broking and wealth-management practices"
- "Use techforce.global/construction-lead-intelligence-scraper for contractors, architects, interior designers and real estate agencies"
- "Use an email-verification service on top of companyEmail before sending outreach"
- "Loop this Actor per city or per query from your orchestration layer for volumes above 100"
vertical_routing_note: >
This Actor is the any-industry entry point. When the request names one of the
four covered verticals (healthcare, hospitality, finance, construction),
prefer that vertical Actor - it ships curated category presets and may be
cheaper per result.

{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Google Maps Business Leads & Sales Intelligence Tool",
"alternateName": "Google Maps Business Leads Scraper β€” Emails, Website Grades & Pitch Playbooks",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Cloud (Apify platform)",
"description": "Scrapes Google Maps businesses for any query and location, crawls each business's own website for a public company email, and optionally returns four sales-intelligence blocks per business: lead priority and revenue opportunity, a pitch playbook, a graded website health scorecard, prioritized service recommendations, and a website technology audit. No Google account or Places API key is required. Optional per-lead or digest delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Linear or any authorized MCP connector.",
"url": "https://apify.com/techforce.global/google-maps-leads-sales-intelligence-tool",
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"category": "Pay per event",
"description": "Pay-per-event: one event is charged per business for each analysis block you leave enabled. The business contact profile itself carries no analysis event. Current rates are shown on the Actor's Apify Store page.",
"url": "https://apify.com/techforce.global/google-maps-leads-sales-intelligence-tool"
}
}

What this Actor does

πŸ’‘ Only need plain listing data? If name, address, phone, website, rating, reviews, hours and coordinates are all you want, use Google Maps Scraper β€” from $0.80 / 1,000 results, no analysis layers. Use this Actor when you need the company email plus sales intelligence to go with each listing.

🎯 Working one industry? There are vertical siblings with curated category presets β€” Healthcare (55+ presets, from $4.00/1k), Hospitality, Finance, and Construction. This Actor is the any-industry one: you type the business type yourself, and you can mix several unrelated types in a single run.

  • Builds one Google Maps search per line of searchQuery, appending location to any query that doesn't already name a place.
  • Collects listings with Playwright using resilient extraction that tolerates Google's rotating markup β€” name, category, rating, review count, address, phone, website, hours.
  • Visits each business's own website to find the company email (up to 4 pages per site β€” home page first, then the best contact-page candidates) and collect social profile links.
  • Optionally audits that website (up to 5 pages per site) for performance, SEO, SSL, technical quality and navigation, producing a letter grade and a 7-area breakdown.
  • Optionally generates sales intelligence: lead priority, revenue opportunity level, sales angle, recommended pitch, estimated monthly and one-time potential, opening hook, services to pitch, pain points, outcomes to promise, and a closing strategy.
  • Charges per enabled block per business β€” four independent pay-per-event charges, so a contacts-only run incurs no analysis events at all.
  • Streams each record to the dataset as it finishes, so a long run's early results are safe if a later page fails.
  • Skips listings with no resolvable business name rather than writing junk rows, and drops empty keys from each item.
  • Optionally pushes each lead to an authorized MCP connector (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, or any MCP-compatible connector) as a record per lead or one digest for the run. The dataset is always saved regardless of delivery settings.

When to use it β€” and when not to

ScenarioFit
Agency prospecting β€” find businesses whose websites need workβœ… Strong (this is the core use case)
Cold outreach lists with an email and a reason to callβœ… Strong
Web design / SEO proposals straight from a grade + fix listβœ… Strong
CRM / Airtable / HubSpot enrichment via connectorβœ… Strong (deliveryMode: "perLead")
Local market mapping β€” who operates in a category, how strong onlineβœ… Strong
Several business types in one runβœ… Strong β€” one query per line (the vertical siblings are single-industry)
An industry outside the four vertical Actorsβœ… Strong β€” this is the any-industry entry point
Healthcare, hospitality, finance or construction prospecting⚠️ Works, but the vertical Actors ship curated category presets and may cost less
Plain listing data only, at the lowest cost⚠️ Use Google Maps Scraper instead
More than 100 businesses in one execution⚠️ Hard cap of 100 β€” split by city/query across runs
Guaranteed-deliverable email addresses⚠️ Emails are scraped, not verified β€” validate before sending
Review text, reviewer names, place photos, GPS coordinates❌ Not extracted
Named personal contacts (decision-maker names, direct emails)❌ Not supported β€” company-level public emails only
Sending the outreach itself❌ Not supported β€” read-only Actor
Directories other than Google Maps❌ Not supported

⚑ Execution Rules (Avoid Common Agent Failures)

  1. Nothing is required, and every field has a default. required is empty: an input of {} scrapes Restaurant in Ahmedabad with all four billable blocks ON. It will not raise a validation error. API and MCP callers must always send searchQuery, location, maxResults, and the four toggles explicitly.
  2. All four analysis blocks default to true, and each one bills per business. A default 20-business run charges four events per business. For a contacts-only run set includeSalesStrategy, includeWebsiteHealthScorecard, includeServiceRecommendations and includeTechnicalIntel all to false β€” that also makes the run much faster.
  3. maxResults is a hard ceiling of 100 per run. Ask for more and you still get 100. Split larger jobs across runs, partitioned by city or by query.
  4. searchQuery is multi-line, and every line shares one maxResults budget. Each line becomes its own Google Maps search, but maxResults is a total for the run, not a per-query figure β€” three queries with maxResults: 30 yield about 10 businesses each, not 30 each.
  5. location is ignored for any query that already names a place. "cafe in Mumbai" with location: "Ahmedabad" searches Mumbai. Mixing both styles in one multi-line input is fine.
  6. The proxy is OFF by default β€” deliberately. A direct connection is the most reliable path for Google Maps here; residential proxies can be slow and time out. Only enable Apify Proxy if you actually start getting blocked.
  7. Empty fields are removed from the item, not set to null. A business with no website produces an item with no website key at all. Test key presence ("website" in item), never item["website"] is None.
  8. A missing email is the string "NA", not an empty value. Read emailStatus first: ok Β· no_email_found Β· failed (site wouldn't load) Β· no_website.
  9. Analysis blocks are absent when toggled off β€” no empty WEBSITE_HEALTH_SCORECARD: {} placeholder. Same rule as 7: check for the key.
  10. deliveryMode defaults to perLead, not none. With a connector selected, a 100-business run makes 100 connector calls. For dataset-only runs leave mcpConnector empty or set deliveryMode: "none".
  11. Free Apify plans are capped at 5 businesses per run with an upgrade banner in the log. That is a successful run, not a failure.
  12. itemCount can legitimately be lower than maxResults β€” listings without a business name are skipped, and Google may simply have fewer matches.
dependencies:
- rule: "each include* toggle controls BOTH an output block and a billable event"
note: "turning it off removes the charge and the data together"
- rule: "includeSalesStrategy drives two output blocks"
note: "LEAD_OVERVIEW and PITCH_STRATEGY are both governed by this single toggle and single charge"
- rule: "delivery requires mcpConnector AND mcpTool"
on_violation: "delivery step is skipped with a warning; the dataset is still written in full"
- rule: "mcpArguments must reference {message} for the rendered template to appear anywhere"
on_violation: "message body is empty; the tool is still called"
- rule: "mcpConnector only resolves when the Actor runs on the Apify platform"
on_violation: "local runs log 'APIFY_MCP_PROXY_URL is not set' and skip delivery; the dataset is unaffected"
- rule: "email and audit crawling only happen when the listing has a website"
on_violation: "emailStatus is 'no_website' and audit blocks carry no website grades"
authentication:
actor_input: none
platform: "Apify API token required for API / SDK / MCP invocation"
target_site: "no Google account, API key, or GCP billing project required (public listings and public website content only)"

πŸ“₯ Input Contract

.actor/input_schema.json is authoritative β€” if any table on this page disagrees with the schema files, the schema files win. The one place the code is stricter than the schema is maxResults (see Rule 3).

Scraping Parameters

FieldTypeRequiredDefaultAllowed Values / FormatExample
searchQuerystring⬜ No (defaults)RestaurantFree text; one query per linedentist\nortodontist
locationstring⬜ NoAhmedabadCity / area / state / countryAustin, Texas
maxResultsinteger⬜ No201–100 β€” total for the run, split across queries100
includeSalesStrategyboolean⬜ NotrueBillable β€” sales-growth-strategyfalse
includeWebsiteHealthScorecardboolean⬜ NotrueBillable β€” website-performance-reportfalse
includeServiceRecommendationsboolean⬜ NotrueBillable β€” business-improvementsfalse
includeTechnicalIntelboolean⬜ NotrueBillable β€” website-technology-detailsfalse
proxyConfigurationobject⬜ No{ "useApifyProxy": false }Apify proxy editor object{ "useApifyProxy": false }
subcategorystring⬜ No (hidden)""Legacy compatibility field for older saved inputs β€” use searchQueryβ€”

Toggle β†’ output block β†’ charge map

ToggleOutput block(s)Billable eventPrice per business
includeSalesStrategyLEAD_OVERVIEW + PITCH_STRATEGYsales-growth-strategy$0.02
includeWebsiteHealthScorecardWEBSITE_HEALTH_SCORECARDwebsite-performance-report$0.01
includeServiceRecommendationsSERVICE_RECOMMENDATIONSbusiness-improvements$0.01
includeTechnicalIntelTECHNICAL_INTELwebsite-technology-details$0.01

The business profile (name, category, address, phone, website, email, hours, rating, reviews, social, Maps URL) is always included and carries no analysis event.

Examples

Basic lead list:

{
"searchQuery": "dentist",
"location": "Austin, Texas",
"maxResults": 50,
"deliveryMode": "none"
}

Contacts only β€” fastest and cheapest (no analysis events charged):

{
"searchQuery": "coffee shops\nbakeries\njuice bars",
"location": "Ahmedabad",
"maxResults": 100,
"includeSalesStrategy": false,
"includeWebsiteHealthScorecard": false,
"includeServiceRecommendations": false,
"includeTechnicalIntel": false,
"deliveryMode": "none"
}

Agency prospecting β€” grade plus fix list, no full playbook:

{
"searchQuery": "law firm",
"location": "Chicago",
"maxResults": 60,
"includeSalesStrategy": false,
"includeWebsiteHealthScorecard": true,
"includeServiceRecommendations": true,
"includeTechnicalIntel": false,
"deliveryMode": "none"
}

MCP Delivery Configuration (Optional)

ParameterTypeDefaultDescription
mcpConnectorstring""Authorized MCP connector on your Apify account (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, …). Leave empty for dataset-only runs.
deliveryModeenumperLeadperLead (one call per business β€” CRM rows/records/issues) Β· summary (one call with all leads) Β· none.
mcpToolstring""Tool name on the connector: create_record, send_message, create_page, create_issue. Run once with a connector selected β€” the log lists the connector's available tools.
mcpArgumentsobject{}Arguments passed to the tool. String leaves support {placeholders}.
mcpMessageTemplatestring""Template rendered and exposed to mcpArguments as {message}.

Placeholders by mode:

ModePlaceholders
perLead{businessName}, {category}, {address}, {phone}, {website}, {companyEmail}, {emailStatus}, {googleRating}, {totalReviews}, {googleMapsUrl}, {searchQuery}, {lead} (formatted multi-line business summary), {message}
summary{leadCount}, {searchQuery}, {location}, {leads} (all businesses as a formatted list), {message}

One Airtable/CRM record per lead:

{
"searchQuery": "florist",
"location": "Mumbai",
"maxResults": 40,
"mcpConnector": "<your-authorized-airtable-connector>",
"deliveryMode": "perLead",
"mcpTool": "create_record",
"mcpArguments": {
"fields": {
"Name": "{businessName}",
"Phone": "{phone}",
"Email": "{companyEmail}",
"Website": "{website}",
"Rating": "{googleRating}",
"Address": "{address}",
"Maps": "{googleMapsUrl}"
}
}
}

One Slack digest for the whole run:

{
"searchQuery": "law firm",
"location": "Chicago",
"maxResults": 30,
"mcpConnector": "<your-authorized-slack-connector>",
"deliveryMode": "summary",
"mcpTool": "send_message",
"mcpArguments": { "channel": "#leads", "text": "{message}" },
"mcpMessageTemplate": "{leadCount} new leads for {searchQuery} in {location}:\n\n{leads}"
}

One Notion page per lead β€” Notion's notion-create-pages expects a top-level pages array, a plain-string title, and markdown in content:

{
"searchQuery": "gym",
"location": "Ahmedabad",
"maxResults": 25,
"mcpConnector": "<your-authorized-notion-connector>",
"deliveryMode": "perLead",
"mcpTool": "notion-create-pages",
"mcpArguments": {
"parent": { "page_id": "<your-page-id>" },
"pages": [
{ "properties": { "title": "{businessName}" }, "content": "{lead}" }
]
}
}

πŸ“€ Output Contract & Data Structure

Storage: Apify Dataset (one JSON object per business). Pagination: limit & offset on the dataset items endpoint. Duplicates: one record per listing within a run. Cross-run deduplication is the consumer's responsibility β€” use googleMapsUrl as the key.

Business profile β€” always present when non-empty

FieldTypeKey omitted when emptyMeaning
businessNamestringnever empty (rows without a name are skipped)Business name as listed
categorystringβœ…Google Maps category
addressstringβœ…Full address as displayed
phonestringβœ…Phone number as displayed
websitestringβœ…Website URL from the listing β€” absent when the business has none
companyEmailstringβœ…Email found on the business's website; the literal string "NA" when the site had none
emailStatusstringβœ…ok Β· no_email_found Β· failed Β· no_website
socialMediaobjectβœ…Social profile URLs keyed by network (Facebook, Instagram, LinkedIn, …)
workingHoursobjectβœ…Opening hours keyed by day
googleRatingstringβœ…Star rating as a string β€” e.g. "4.6"
totalReviewsstringβœ…Review count as a string
googleMapsUrlstringβœ…Listing URL β€” use as the dedupe key
searchQuerystringβœ…The resolved query that produced this record (query + location)

LEAD_OVERVIEW β€” toggle includeSalesStrategy

KeyTypeMeaning
leadPrioritystringTriage label β€” e.g. High
revenueOpportunityLevelstringOpportunity size β€” e.g. High
salesAnglestringWhy this business is worth calling
recommendedPitchstringThe pitch to lead with
estimatedMonthlyServicePotentialstringRecurring revenue estimate β€” e.g. "$800–$1,500/mo"
estimatedOneTimeProjectPotentialstringProject revenue estimate

PITCH_STRATEGY β€” toggle includeSalesStrategy

KeyTypeMeaning
openingHookstringOpening line tailored to the business's rating/reviews/site
bestServicesToPitcharrayServices worth proposing
painPointsToHighlightarrayUp to 5 concrete weaknesses to raise
outcomesToPromisearrayResults to promise
closingStrategystringSuggested close

WEBSITE_HEALTH_SCORECARD β€” toggle includeWebsiteHealthScorecard

KeyTypeMeaning
finalGradestringLetter grade for the website overall
finalClassificationstringPlain-language verdict β€” e.g. Needs Improvement
gradeBreakdownarray of {area, grade, status}Per-area grades. Areas: Technical Quality Β· Technical SEO Β· SSL / Security Β· Navigation Structure Β· Performance Β· SEO Readiness Β· SEO Parameters. Areas with no grade are omitted.

SERVICE_RECOMMENDATIONS β€” toggle includeServiceRecommendations

Array, at most 4 items, sorted High β†’ Medium β†’ Low priority:

KeyTypeMeaning
prioritystringHigh Β· Medium Β· Low
servicestringService to sell, in human-readable form
currentGradestringThe area's current grade
whatToFixstringThe concrete work required
whyItMattersstringBusiness rationale
outcomeAfterFixstringExpected result once fixed
sellingPointstringThe line to use in the proposal

TECHNICAL_INTEL β€” toggle includeTechnicalIntel

KeyTypeMeaning
techStackstringDetected stack, or Unknown
sslStatusstringStatus with grade β€” e.g. "Good (Grade A)"
robotsTxtStatusstringHTTP status label for robots.txt
sitemapUrlstringSitemap URL if found
auditedPagesintegerHow many pages of that site were audited (max 5)
auditedUrlsarrayThe exact URLs audited
navigationNotesstringNavigation-structure summary
keyTechnicalIssuesarrayNotable problems found

Consumer rules: empty values are removed rather than nulled, so test key presence; googleRating and totalReviews are strings; a missing email is the literal "NA"; and any of the five analysis blocks is simply absent when its toggle is off.

Example output item

{
"businessName": "Bright Smile Dental",
"category": "Dental clinic",
"address": "1200 W 6th St, Austin, TX 78703",
"phone": "+1 512-555-0142",
"website": "https://brightsmileaustin.com",
"companyEmail": "hello@brightsmileaustin.com",
"emailStatus": "ok",
"socialMedia": { "facebook": "https://facebook.com/brightsmileaustin" },
"workingHours": { "Monday": "9:00 AM – 5:00 PM" },
"googleRating": "4.6",
"totalReviews": "312",
"googleMapsUrl": "https://www.google.com/maps/place/...",
"searchQuery": "dentist in Austin, Texas",
"LEAD_OVERVIEW": {
"leadPriority": "High",
"revenueOpportunityLevel": "High",
"salesAngle": "Strong reviews but an outdated, slow website losing new-patient bookings.",
"recommendedPitch": "Modernize the site and add online booking to convert more of your 4.6-star reputation.",
"estimatedMonthlyServicePotential": "$800–$1,500/mo",
"estimatedOneTimeProjectPotential": "$3,000–$6,000"
},
"PITCH_STRATEGY": {
"openingHook": "You have a 4.6-star rating with 312 reviews - strong social proof.",
"bestServicesToPitch": ["Website redesign", "Local SEO"],
"painPointsToHighlight": ["Performance: slow pages lose bookings"],
"outcomesToPromise": ["More booked appointments from the same traffic"],
"closingStrategy": "Offer a paid audit that credits toward the redesign."
},
"WEBSITE_HEALTH_SCORECARD": {
"finalGrade": "C",
"finalClassification": "Needs Improvement",
"gradeBreakdown": [
{ "area": "Performance", "grade": "D", "status": "Poor (Grade D)" },
{
"area": "SSL / Security",
"grade": "A",
"status": "Good (Grade A)"
}
]
},
"SERVICE_RECOMMENDATIONS": [
{
"priority": "High",
"service": "Website performance optimization",
"currentGrade": "D",
"whatToFix": "Compress images and defer unused scripts.",
"whyItMatters": "Slow pages lose mobile visitors before they book.",
"outcomeAfterFix": "Faster load and more completed bookings.",
"sellingPoint": "Turn existing traffic into appointments without more ad spend."
}
],
"TECHNICAL_INTEL": {
"techStack": "WordPress",
"sslStatus": "Good (Grade A)",
"robotsTxtStatus": "200 OK",
"sitemapUrl": "https://brightsmileaustin.com/sitemap.xml",
"auditedPages": 5,
"auditedUrls": ["https://brightsmileaustin.com/"],
"navigationNotes": "Primary navigation is clear; no footer sitemap.",
"keyTechnicalIssues": ["Large uncompressed hero image"]
}
}

What a successful run looks like

{
"status": "SUCCEEDED",
"defaultDatasetId": "<datasetId>",
"stats": { "itemCount": 47 }
}

The terminal log line reads Finished <n> companies in <t>s. plus the connector count when delivery ran. itemCount below maxResults is normal β€” nameless listings are skipped and Google may have fewer matches. itemCount: 0 is a successful run with no matches; check the query and location before treating it as a bug.


▢️ Invocation & Integration

Lifecycle: Discover β†’ Understand β†’ Configure β†’ Execute β†’ Retrieve β†’ Validate. Authenticate every call with Authorization: Bearer <APIFY_TOKEN>.

Apify Console

Open the Actor β†’ Input tab β†’ enter Search query (one per line for several) and Location β†’ set Maximum businesses β†’ switch off any analysis blocks you don't want to pay for β†’ (optional) pick an MCP connector, tool and template β†’ Start β†’ export from the Dataset tab (JSON, CSV, Excel, XML).

Model Context Protocol (MCP)

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=techforce.global/google-maps-leads-sales-intelligence-tool"

Python (apify-client)

import os
from apify_client import ApifyClient
client = ApifyClient(os.getenv("APIFY_TOKEN"))
run = client.actor("techforce.global/google-maps-leads-sales-intelligence-tool").call(run_input={
"searchQuery": "dentist",
"location": "Austin, Texas",
"maxResults": 100, # 100 is the effective ceiling
"includeSalesStrategy": True,
"includeWebsiteHealthScorecard": True,
"includeServiceRecommendations": False,
"includeTechnicalIntel": False,
"deliveryMode": "none",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"{len(items)} businesses")
# Keys are omitted when empty - test presence, never compare to None.
emailable = [i for i in items if i.get("companyEmail", "NA") != "NA"]
print(f"{len(emailable)} with a usable email")
for lead in emailable[:5]:
overview = lead.get("LEAD_OVERVIEW", {})
print(lead["businessName"], "|", lead.get("phone", "-"), "|", overview.get("leadPriority", "-"))

JavaScript / TypeScript (apify-client)

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client
.actor("techforce.global/google-maps-leads-sales-intelligence-tool")
.call({
searchQuery: "coffee shops\nbakeries",
location: "Ahmedabad",
maxResults: 60,
includeSalesStrategy: false,
includeWebsiteHealthScorecard: false,
includeServiceRecommendations: false,
includeTechnicalIntel: false, // contacts only - no analysis events charged
deliveryMode: "none",
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const hotLeads = items.filter((i) => i.LEAD_OVERVIEW?.leadPriority === "High");
console.log(`${items.length} businesses, ${hotLeads.length} high priority`);

cURL β€” synchronous (returns items directly; 300s limit)

curl -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
-d '{"searchQuery":"dentist","location":"Austin, Texas","maxResults":20,"deliveryMode":"none"}' \
'https://api.apify.com/v2/acts/techforce.global~google-maps-leads-sales-intelligence-tool/run-sync-get-dataset-items'

Use the async pattern below for anything beyond ~20 businesses β€” website crawling makes this Actor far slower per record than a listings-only scraper.

# 1. Start execution with a hard spend limit
curl -X POST -H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
-d '{"searchQuery":"law firm","location":"Chicago","maxResults":100,"deliveryMode":"none"}' \
'https://api.apify.com/v2/acts/techforce.global~google-maps-leads-sales-intelligence-tool/runs?maxTotalChargeUsd=5.00'
# 2. Poll
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/actor-runs/<runId>'
# 3. Retrieve when SUCCEEDED
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json&limit=1000&offset=0'

⚠️ Autonomous Agent Error Handling & Resolution Matrix

Error CodeDetection ConditionUnderlying CauseDeterministic Agent Action
AUTH_INVALIDHTTP 401Missing or malformed APIFY_TOKENAbort & Prompt User: request a valid API token.
RATE_LIMITEDHTTP 429Apify API rate / concurrency limitsRetry: exponential backoff (2s, 4s, 8s).
SYNC_TIMEOUTHTTP 408 on the sync endpointRun exceeded the 300s synchronous ceiling β€” easy to hit hereReconfigure: switch to async POST /runs + polling.
SILENT_DEFAULTResults are restaurants in Ahmedabad you never asked forNo field is required; searchQuery/location defaultedModify Input: always pass both explicitly from API/MCP/SDK.
NO_QUERIESSUCCEEDED, 0 items, log No search queries provided.Query list resolved to emptyModify Input: provide a non-blank searchQuery.
EMPTY_RESULTSSUCCEEDED, itemCount: 0Query/location combination has no Google Maps matchesModify Input: broaden the keyword or widen the location.
CAP_CLAMPEDitemCount never exceeds 100 despite a larger request100 businesses per run is the hard ceilingReconfigure: partition by city or query across runs.
FREE_PLAN_CAPitemCount ≀ 5 with the upgrade banner in the logFree Apify plan caps at 5 businesses per runPrompt User: upgrade for full-volume runs.
NO_EMAILemailStatus: "no_email_found" or companyEmail: "NA"The site published no discoverable email within 4 crawled pagesNot an error. Fall back to phone, or enrich elsewhere.
NO_WEBSITEemailStatus: "no_website", no website keyThe listing has no website, so no email or audit is possibleNot an error. Analysis blocks will carry no website grades.
SITE_UNREACHABLEemailStatus: "failed", log Homepage load failed for …The business site timed out or refused the connectionNot an error. Retry later if the email matters.
MISSING_KEYKeyError in your consumerEmpty values are omitted from items entirelyFix Consumer: use .get() / key-presence checks.
MISSING_BLOCKAn analysis block is absent from every itemIts toggle was false (or defaulted off in your saved input)Modify Input: set the matching include* flag to true.
UNEXPECTED_CHARGESBill higher than expected on a contacts-only runAll four blocks default to trueModify Input: set all four include* flags to false explicitly.
CHARGE_SKIPPEDLog Could not charge for event …Run is not in pay-per-event mode (e.g. local run)Ignore: the scrape completes; charging is skipped by design.
DELIVERY_SKIPPEDLog no tool name was providedmcpConnector set but mcpTool emptyModify Input: set mcpTool; the dataset is already saved.
DELIVERY_TOOL_UNKNOWNLog Tool 'x' is not available on this connectorWrong tool name for that connectorModify Input: pick a name from the Available tools: list in the same log line.
DELIVERY_EMPTYConnector called, body emptymcpArguments omitted the {message} placeholderModify Input: map {message} inside mcpArguments.
DELIVERY_FLOODHundreds of connector calls / connector rate limitsdeliveryMode defaults to perLeadReconfigure: use summary, or lower maxResults.
MCP_PROXY_MISSINGLog APIFY_MCP_PROXY_URL is not setRunning locally instead of on the platformReconfigure: apify push and run on the platform.
CHARGE_LIMITRun aborted before maxResults reachedmaxTotalChargeUsd spend threshold reachedPrompt User: confirm a higher spend cap.
RUN_ABORTEDRun status ABORTED, dataset non-emptyAborted manually, by a spend cap, or by a run timeoutRead Partial Data: every business is pushed as it completes, so the dataset holds everything finished before the abort. Resume by re-running with the remaining queries.

Reading run status: SUCCEEDED with itemCount: 0 is a valid outcome β€” it means the query and location returned no Google Maps matches, not that the run broke. Only a FAILED status is a platform-level failure. Every log-line and field condition in the table above comes from this Actor's own behavior; the 401/408/429 rows are standard Apify API responses.


πŸ—£οΈ Natural Language β†’ Actor Mapping

User saysIntentConstructed Actor input
"Find dentists in Austin with their emails"Lead generationWorks here: {"searchQuery":"dentist","location":"Austin, Texas","maxResults":50} β€” but prefer Healthcare for medical verticals
"Get me 100 restaurants in Ahmedabad β€” contacts only"Cheap contact listall four include* β†’ false, maxResults: 100
"Which local gyms have bad websites?"Agency prospecting{"searchQuery":"gym","includeWebsiteHealthScorecard":true} then sort on WEBSITE_HEALTH_SCORECARD.finalGrade
"Build me a prospect list with a pitch for each business"Sales enablement{"searchQuery":"<type>","includeSalesStrategy":true}
"Who should I call first?"Lead triageread LEAD_OVERVIEW.leadPriority / revenueOpportunityLevel
"What should I fix on this business's site, and how do I sell it?"Proposal input{"includeServiceRecommendations":true,"includeTechnicalIntel":true}
"Search coffee shops, bakeries and juice bars at once"Multi-query run{"searchQuery":"coffee shops\nbakeries\njuice bars"}
"Push these leads into Airtable"CRM delivery{"mcpConnector":"airtable","deliveryMode":"perLead","mcpTool":"create_record","mcpArguments":{"fields":{"Name":"{businessName}","Email":"{companyEmail}"}}}
"Post today's new leads to Slack"Digest delivery{"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message","mcpArguments":{"channel":"#leads","text":"{message}"}}
"Open a follow-up task per lead in Linear"Task delivery{"mcpConnector":"linear","deliveryMode":"perLead","mcpTool":"create_issue"}
"Map every law firm in Chicago and how strong they are online"Market research{"searchQuery":"law firm","location":"Chicago","maxResults":100,"includeWebsiteHealthScorecard":true}
"Just give me names, phones and ratings as cheaply as possible"Minimal listing pull➑️ Route to Google Maps Scraper
"Build a lead list of clinics / diagnostic labs / physiotherapists"Healthcare vertical➑️ Route to Healthcare Leads & Sales Intelligence (55+ presets)
"Find hotels and restaurants in Goa to pitch"Hospitality vertical➑️ Route to Hospitality Scraper
"Get me CA firms / tax consultants / insurance brokers"Finance vertical➑️ Route to Finance Lead Intelligence
"List contractors, architects and interior designers"Construction vertical➑️ Route to Construction Lead Intelligence
"Get me the reviews people wrote for this place"Review mining❌ Out of scope β€” review text is not extracted
"Find the owner's personal email"Contact discovery❌ Out of scope β€” company-level public emails only

Should NOT route here: plain listing data at lowest cost (β†’ Google Maps Scraper) Β· single-vertical prospecting where a preset Actor exists (β†’ Healthcare Β· Hospitality Β· Finance Β· Construction) Β· review text or reviewer profiles Β· GPS coordinates or place photos Β· named personal contacts or personal emails Β· email verification/deliverability Β· sending outreach Β· directories other than Google Maps Β· more than 100 businesses in one run.


🧭 Agent Execution & Routing Logic

[Input User Query]
β”‚
β–Ό
1. Target is Google Maps business listings? NO β†’ Route to the right platform Actor
β”‚ YES
β–Ό
2. Read/scrape only (not sending outreach)? NO β†’ Abort (no outbound sending here)
β”‚ YES
β–Ό
3. Needs reviews text / photos / GPS / personal names? YES β†’ Abort (not extracted)
β”‚ NO
β–Ό
4. Needs email + sales intelligence? NO β†’ Route to Google Maps Scraper ($0.80/1k, listings only)
β”‚ YES
β–Ό
4b. Is the target ONE of the four preset verticals?
β”œβ”€β”€ healthcare / clinics / dental / labs β†’ Route to Healthcare Leads Actor (from $4.00/1k)
β”œβ”€β”€ hotels / resorts / restaurants / cafes β†’ Route to Hospitality Scraper
β”œβ”€β”€ accounting / tax / insurance / broking β†’ Route to Finance Lead Intelligence
β”œβ”€β”€ contractors / architects / real estate β†’ Route to Construction Lead Intelligence
└── anything else, or several unrelated types β†’ stay here
β–Ό
5. Map the request to searchQuery (one per line) + location
β”‚ (a query naming its own place ignores `location`)
β–Ό
6. Choose analysis blocks - EACH ONE BILLS PER BUSINESS
β”œβ”€β”€ pitch/priority needed? β†’ includeSalesStrategy ($0.02)
β”œβ”€β”€ site grade needed? β†’ includeWebsiteHealthScorecard ($0.01)
β”œβ”€β”€ fix list needed? β†’ includeServiceRecommendations ($0.01)
β”œβ”€β”€ tech audit needed? β†’ includeTechnicalIntel ($0.01)
└── none of the above? β†’ set ALL FOUR to false (they default to true)
β–Ό
7. Volume > 100 businesses? YES β†’ Partition by city/query across runs
β”‚ NO
β–Ό
8. Deliver to a connector? YES β†’ mcpConnector + mcpTool + {message}
β”‚ perLead = one call per business; prefer summary at scale
β”‚ NO β†’ set deliveryMode "none" (it defaults to perLead)
β–Ό
9. Estimated cost within budget? NO β†’ Drop blocks / lower maxResults / set maxTotalChargeUsd
β”‚
β–Ό
[Execute Apify Actor]
β”‚
β”œβ”€β”€β–Ί status == "SUCCEEDED" β†’ itemCount 0 = valid empty result β†’ consume dataset
β”‚ (dedupe on googleMapsUrl; test key presence; emailStatus before companyEmail)
└──► status == "FAILED" β†’ route to Error Handling Matrix above

πŸ’° Cost Control & Pricing Transparency

Model: pay-per-event. One event is charged per business for each analysis block you leave enabled β€” the business contact profile itself carries no analysis event, so a run with every toggle off costs nothing in analysis events. These are the event prices declared in .actor/pay_per_event.json:

Billable eventTogglePrice per business
sales-growth-strategyincludeSalesStrategy$0.02
website-performance-reportincludeWebsiteHealthScorecard$0.01
business-improvementsincludeServiceRecommendations$0.01
website-technology-detailsincludeTechnicalIntel$0.01
All four (default)β€”$0.05
None (contacts only)all four false$0.00 in analysis events

Worked examples at those event prices:

RunBlocks onAnalysis cost
5 businesses (free-plan preview)all four$0.25
20 businesses (default run)all four$1.00
100 businesses (per-run ceiling)all four$5.00
100 businessesgrade + fixes only$2.00
100 businessesnone$0.00
1,000 businesses (10 runs)all four$50.00

Cost levers, in order of impact: turn off blocks you won't read (the biggest lever β€” and it speeds the run up too); keep maxResults tight; set maxTotalChargeUsd on the run endpoint as a hard per-execution ceiling; and use Google Maps Scraper when you only need listing fields.

ℹ️ Always confirm the live rate on the Actor’s Apify Store page before committing to a large run. The Store listing is what bills you; the table above shows the event structure so you can predict which charges a given input will trigger.


πŸ” Companion machine-readable files

FilePurpose
.actor/actor.jsonIdentity, version, input/output/dataset wiring
.actor/input_schema.jsonAuthoritative typed input contract β€” query, location, maxResults, four toggles, proxy, deliveryMode enum
.actor/pay_per_event.jsonDeclares the four billable events, their titles, descriptions and prices
.actor/dataset_schema.jsonOutput field types and the Console table view, including labels for the five analysis blocks
.actor/output_schema.jsonDeclares where results are stored
my_actor/main.pySearch planning, Playwright listing extraction, email crawl, website audit, intelligence generation, charging, MCP delivery
my_actor/connector.pyMCP connector session handling and {placeholder} rendering

If any table on this page disagrees with the schema files, the schema files win.


πŸ› οΈ Troubleshooting

#Symptom you seeMost likely causeFix
1Results are restaurants in Ahmedabad you never asked forNo input field is required; searchQuery and location silently defaultedAlways pass both explicitly from API / MCP / SDK calls.
2Charged more than expectedAll four analysis blocks default to true β€” four events per businessSet every include* flag you don't need to false.
3Fewer businesses than the number you asked formaxResults is capped at 100 per runPartition by city or query across runs.
4Exactly 5 businesses every runFree Apify plan capUpgrade the plan; the log prints the upgrade banner.
5Three queries returned far fewer each than expectedAll queries share one maxResults budgetRaise maxResults, or run one query per execution.
6Location seems ignoredThe query already named a place ("cafe in Mumbai")Expected. Remove the place from the query to use location.
7Consumer crashes with KeyErrorEmpty fields are omitted, not set to nullUse .get() or "key" in item.
8companyEmail is "NA"No email was discoverable within the 4 pages crawledRead emailStatus first; fall back to phone.
9emailStatus: "no_website"The listing has no website β€” nothing to crawl or auditExpected. Website-based blocks will be thin or absent.
10emailStatus: "failed"The business site timed out or refused the connectionRetry later; a single slow site does not fail the run.
11An analysis block is missing everywhereIts toggle is false in your inputSet the matching include* flag to true.
12Emails bounce when you send outreachScraped emails are not verifiedRun them through an email-verification service first.
13googleRating won't compare numericallyIt is a string ("4.6")Cast to float before comparing.
14Fewer items than maxResultsNameless listings are skipped by design, and Google may have fewer matchesExpected. Check the log for Skipping a result with no business name.
15Run is slowEach business with a website costs up to 4 email pages + 5 audit pages of crawlingTurn analysis blocks off, or lower maxResults.
16HTTP 408 on run-sync-get-dataset-itemsThe synchronous endpoint has a hard 300-second ceilingUse async: POST /runs β†’ poll β†’ fetch dataset. Recommended above ~20 businesses.
17Blank or empty listing fields on the platformGoogle served an empty page to that IPTry enabling Apify Proxy β€” but note the default-off setting is deliberate; direct usually works better here.
18Log: Saved outputs to <dir>The Actor also writes JSON/CSV inside the container for local developmentIgnore it on the platform β€” the dataset is the real output; container files vanish with the run.
19Hundreds of connector calls / connector rate-limiteddeliveryMode defaults to perLeadSwitch to summary, or lower maxResults.
20Slack / Airtable / Notion received nothingDelivery needs both mcpConnector and mcpToolSet both. The dataset is still written in full.
21Connector fired but the message body is emptymcpArguments did not reference {message}Map {message} in mcpArguments and populate mcpMessageTemplate.
22Log: APIFY_MCP_PROXY_URL is not setYou ran locally; connectors only resolve on the platformDeploy with apify push and run on the platform.
23Log: Could not charge for event …The run isn't in pay-per-event mode (typically a local run)Harmless by design β€” the scrape still completes.
24HTTP 401 / 403Missing, expired, or malformed APIFY_TOKENRegenerate in Apify Console β†’ Settings β†’ API & Integrations.
25HTTP 429Apify account concurrency / rate limits β€” not Google blockingRetry with exponential backoff (2s β†’ 4s β†’ 8s).

Diagnostic checklist before opening an issue

  1. Baseline run. searchQuery = one common type (restaurant), location = a large city, maxResults = 5, all four toggles false, deliveryMode: "none".
  2. Results returned? If yes, the scraper is fine β€” re-add toggles and volume one step at a time.
  3. Still zero? Search the same term and place on Google Maps in a browser. No results there means a valid empty run.
  4. Check the run log for the resolved queries, the per-business lines, and any Skipping a result with no business name. entries.
  5. Confirm which toggles were actually on in the Input tab before reporting a missing analysis block.

If the issue survives all five steps, open an Issues ticket on the Actor page (or email support) with the run ID, the exact input JSON, and what you expected.

❓ FAQ

Setup & access

Do I need a Google account, API key, or Google Cloud project?

No. The Actor reads public Google Maps listings and public website content. You need an Apify account and API token only.

Is this the official Google Places API?

No. This is an independent Actor, not affiliated with, endorsed by, or sponsored by Google.

Do I need a proxy?

Usually not β€” the proxy is off by default on purpose, because a direct connection is the most reliable path here. Enable Apify Proxy only if you start seeing blocks or empty fields.

Can I plug it into Claude, Cursor, or a LangChain agent?

Yes β€” it is a native MCP tool:

claude mcp add --transport http apify "https://mcp.apify.com?tools=techforce.global/google-maps-leads-sales-intelligence-tool"

Input & volume

How do I search several business types at once?

Put one query per line in searchQuery. Remember they all share the single maxResults budget.

Why can’t I ask for more than 100 businesses in one run?

maxResults is capped at 100 per run, and that budget is shared across every query in the run. Split larger jobs across runs β€” partition by city, or by query.

Does location always apply?

No β€” any query that already names a place ("cafe in Mumbai") is used as-is and ignores location.

Output & data

Why are some fields missing entirely instead of empty?

Empty values are stripped from each item to keep payloads (and LLM token costs) down. Test key presence rather than comparing to null.

Why is companyEmail sometimes "NA"?

Because no email was discoverable on up to 4 crawled pages of that business's site β€” or it has no site at all. Check emailStatus (ok Β· no_email_found Β· failed Β· no_website).

Are the emails verified?

No. They are scraped from public website content. Run them through an email-verification service before any real outreach.

Do I get personal or decision-maker emails?

No β€” company-level public addresses only (info@, hello@, contact@ and similar).

Do I get review text or photos?

No. You get the rating and review count, not review bodies, reviewer names, or images.

Pricing

How is this billed?

Pay-per-event: one event per enabled analysis block per business. The business profile itself carries no analysis event. Turning a block off removes both its data and its charge.

How do I make a run as cheap as possible?

Set all four include* flags to false β€” you then get the full contact profile with no analysis events, and the run finishes much faster. If you don't need emails either, use Google Maps Scraper instead.

How do I guarantee an agent never overspends?

Pass maxTotalChargeUsd as a query parameter on the run endpoint β€” a hard per-execution ceiling.


Same data family

This Actor is the any-industry member of the family: you type the business type yourself. Its siblings split two ways β€” one cheaper Actor without the intelligence layers, and four vertical Actors that ship curated category lists for a specific industry.

ActorBest forWhy pick it over this one
Google Maps ScraperPlain Google Maps listings β€” name, address, phone, website, rating, review count, hours, coordinates, category, imagesYou don't need emails or sales intelligence, and want the lowest cost per result (from $0.80 / 1,000)

Vertical presets β€” same engine, curated categories

Each of these ships a ready-made category list for its industry, so you pick from a dropdown instead of guessing search terms. Output shape and the four analysis blocks match this Actor.

ActorVertical & preset categoriesWhy pick it over this one
Google Maps Healthcare Leads & Sales IntelligenceHealthcare β€” 55+ presets: medical clinic, dentist, orthodontist, dermatologist, IVF centre, physiotherapy, diagnostic lab, wellness centre…Targeting medical/dental/wellness businesses β€” curated coverage of the vertical and a lower rate (from $4.00 / 1,000)
Google Maps Hospitality ScraperHospitality: hotels, resorts, restaurants, cafesWorking a hospitality patch β€” the preset list saves you enumerating query variants ($9.09 / 1,000)
Finance Google Maps Lead Intelligence ScraperFinance: CA firms, tax & GST consultants, accounting firms, auditors, financial advisors, wealth management, investment services, insurance brokers, stock brokers, loan agencies, mortgage brokersSelling to finance practices β€” deeper per-site auditing (up to 25 pages/business) and a 10-lead free tier (from $10.00 / 1,000)
Construction Lead Intelligence ScraperConstruction & property: general contractor, architecture firm, interior designer, roofing contractor, construction company, real estate agencyTrades and property prospecting β€” basic contact scraping is free, with analysis billed per event only

Pick by intent: listings only, cheapest β†’ Google Maps Scraper Β· healthcare β†’ Healthcare Β· hotels/restaurants/cafes β†’ Hospitality Β· accounting/tax/insurance/broking β†’ Finance Β· contractors/architects/real estate β†’ Construction Β· any other industry, or several unrelated types in one run β†’ this Actor.

ℹ️ Pricing and per-run limits differ between siblings (they are separate Store listings on separate tiers). Check the target Actor's own listing before switching a production pipeline over.

Enrichment & downstream pipeline

ActorUse it for
Advanced Website Crawling ActorCrawl a prospect's whole site from website for clean HTML/Markdown/text context beyond the 5 audited pages
GOV.UK Business ScraperMatch UK business names against Companies House records, with PSC / ownership enrichment
Eventbrite ScraperFind event organizers in the same city as an adjacent lead source

Suggested pipeline patterns

🎯 Agency prospecting engine This Actor with includeWebsiteHealthScorecard + includeServiceRecommendations β†’ filter finalGrade ≀ C β†’ deliveryMode: "perLead" into Airtable β†’ work the queue from the fix list.

πŸ“‡ CRM enrichment loop One run per city on a schedule β†’ perLead delivery into HubSpot β†’ dedupe on googleMapsUrl β†’ verify companyEmail before any sequence.

πŸ“Š Local market map Same query across several cities β†’ compare WEBSITE_HEALTH_SCORECARD.finalGrade distributions β†’ target the weakest market first.

🧠 Deep-dive on hot leads This Actor for triage β†’ filter LEAD_OVERVIEW.leadPriority == "High" β†’ Advanced Website Crawling Actor on those sites β†’ build a bespoke proposal.

Browse all Actors by Techforce Global at scraper.techforce.global.


πŸ” Compliance & Data Privacy

This is an independent Actor. It is not affiliated with, endorsed by, or sponsored by Google. Google Mapsβ„’ is a trademark of Google LLC; all trademarks are the property of their respective owners.

This Actor collects publicly available business listing data and publicly published website content. It does not log into any account or scrape behind authentication. Business contact data is still personal data in many jurisdictions β€” a info@/owner-name email or a small business's phone number can identify a person. You are responsible for ensuring your use complies with Google's Terms of Service, applicable data-protection law (GDPR, CCPA), and β€” critically for this Actor's use case β€” anti-spam and electronic-marketing rules (GDPR Art. 6/21, ePrivacy/PECR, CAN-SPAM, CASL) before sending any outreach to scraped addresses. Emails here are unverified and unconsented; treat them accordingly.


πŸ†˜ Support & Custom Pipeline Engineering

Need multi-city scheduled refreshes, deeper enrichment, email verification in-pipeline, or a full CRM / data-warehouse integration?


Made with ❀️ by Techforce Global Specialists in High-Performance Lead Generation Data Extraction and AI Automation.


🏷️ Structured data for search & AI discovery

SoftwareApplication describes the Actor; FAQPage wraps the FAQ above so those answers are eligible for rich results, matching it question-for-question.

{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Google Maps Business Leads & Sales Intelligence Tool",
"alternateName": "Google Maps Business Leads Scraper β€” Emails, Website Grades & Pitch Playbooks",
"applicationCategory": "BusinessApplication",
"applicationSubCategory": "Web Scraping / B2B Lead Generation & Sales Intelligence",
"operatingSystem": "Cloud (Apify platform)",
"description": "Scrapes Google Maps businesses for any query and location, crawls each business's own website for a public company email, and optionally returns four sales-intelligence blocks per business: lead priority and revenue opportunity, a pitch playbook, a graded website health scorecard, prioritized service recommendations, and a website technology audit. No Google account or Places API key is required. Optional per-lead or digest delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Linear or any authorized MCP connector.",
"url": "https://apify.com/techforce.global/google-maps-leads-sales-intelligence-tool",
"author": {
"@type": "Organization",
"name": "Techforce Global",
"url": "https://www.techforceglobal.com"
},
"provider": {
"@type": "Organization",
"name": "Apify",
"url": "https://apify.com"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"category": "Pay per event",
"description": "Pay-per-event: one event is charged per business for each analysis block you leave enabled. The business contact profile itself carries no analysis event. Current rates are shown on the Actor's Apify Store page.",
"url": "https://apify.com/techforce.global/google-maps-leads-sales-intelligence-tool"
},
"featureList": [
"No Google account, Places API key or billing project required",
"Any free-text business type and location, several queries per run",
"Company email discovered by crawling each business's own website",
"Email status flag so unreachable and site-less businesses are distinguishable",
"Social profile links collected from the business website",
"Name, category, address, phone, website, rating, review count and opening hours",
"Lead priority, revenue opportunity level, sales angle and recommended pitch",
"Pitch playbook: opening hook, services to pitch, pain points, outcomes and closing strategy",
"Graded website health scorecard with a full grade breakdown",
"Prioritized service recommendations with what to fix, why it matters and the expected outcome",
"Website technology audit: tech stack, SSL, robots.txt, sitemap, audited pages and key issues",
"Every analysis block is individually toggleable, and turning one off removes its charge",
"Optional MCP delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Linear or any authorized connector",
"Per-lead or single-digest delivery modes, with templated tool arguments",
"Results pushed to the dataset as each business completes, so aborted runs keep partial data"
],
"isAccessibleForFree": false,
"softwareHelp": {
"@type": "CreativeWork",
"url": "https://apify.com/techforce.global/google-maps-leads-sales-intelligence-tool"
}
}
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need a Google account, API key, or Google Cloud project?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. The Actor reads public Google Maps listings and public website content. You need an Apify account and API token only."
}
},
{
"@type": "Question",
"name": "Is this the official Google Places API?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. This is an independent Actor, not affiliated with, endorsed by, or sponsored by Google."
}
},
{
"@type": "Question",
"name": "Do I need a proxy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Usually not - the proxy is off by default on purpose, because a direct connection is the most reliable path here. Enable Apify Proxy only if you start seeing blocks or empty fields."
}
},
{
"@type": "Question",
"name": "Can I plug it into Claude, Cursor, or a LangChain agent?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes - it is a native MCP tool. Add it with: claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/google-maps-leads-sales-intelligence-tool\""
}
},
{
"@type": "Question",
"name": "How do I search several business types at once?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Put one query per line in searchQuery. Remember they all share the single maxResults budget."
}
},
{
"@type": "Question",
"name": "Why can’t I ask for more than 100 businesses in one run?",
"acceptedAnswer": {
"@type": "Answer",
"text": "maxResults is capped at 100 per run, and that budget is shared across every query in the run. Split larger jobs across runs - partition by city, or by query."
}
},
{
"@type": "Question",
"name": "Does location always apply?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No - any query that already names a place (for example \"cafe in Mumbai\") is used as-is and ignores location."
}
},
{
"@type": "Question",
"name": "Why are some fields missing entirely instead of empty?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Empty values are stripped from each item to keep payloads (and LLM token costs) down. Test key presence rather than comparing to null."
}
},
{
"@type": "Question",
"name": "Why is companyEmail sometimes \"NA\"?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Because no email was discoverable on up to 4 crawled pages of that business's site - or it has no site at all. Check emailStatus: ok, no_email_found, failed or no_website."
}
},
{
"@type": "Question",
"name": "Are the emails verified?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. They are scraped from public website content. Run them through an email-verification service before any real outreach."
}
},
{
"@type": "Question",
"name": "Do I get personal or decision-maker emails?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No - company-level public addresses only, such as info@, hello@ and contact@."
}
},
{
"@type": "Question",
"name": "Do I get review text or photos?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. You get the rating and review count, not review bodies, reviewer names, or images."
}
},
{
"@type": "Question",
"name": "How is this billed?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pay-per-event: one event per enabled analysis block per business. The business profile itself carries no analysis event. Turning a block off removes both its data and its charge."
}
},
{
"@type": "Question",
"name": "How do I make a run as cheap as possible?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Set all four include* flags to false - you then get the full contact profile with no analysis events, and the run finishes much faster. If you don't need emails either, use techforce.global/google-maps-scraper instead."
}
},
{
"@type": "Question",
"name": "How do I guarantee an agent never overspends?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pass maxTotalChargeUsd as a query parameter on the run endpoint - a hard per-execution ceiling."
}
}
]
}