Google Maps Healthcare Leads & Sales intelligence tool
Pricing
from $4.00 / 1,000 results
Google Maps Healthcare Leads & Sales intelligence tool
Scrape healthcare leads from Google Maps: clinics, dentists & more. Get verified emails, social media links, phone, ratings & website audits with a ready-to-use sales pitch for every lead.
Pricing
from $4.00 / 1,000 results
Rating
5.0
(4)
Developer
Techforce Global
Maintained by CommunityActor stats
2
Bookmarked
12
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Google Maps Healthcare Leads & Sales Intelligence — Clinic Emails, Website Grades & Pitch Playbooks Across 55 Medical Categories
Purpose-built healthcare prospecting: pick from 55 curated medical categories — clinics, dentists, dermatologists, IVF centres, diagnostic labs, physiotherapy, mental health, Ayurveda and more — and get every practice's phone, address, website, company email scraped from its own site, rating, reviews, hours and social links. Then layer on four optional intelligence blocks (sales playbook, website performance grade, prioritized improvement list, tech audit), each a separate pay-per-event charge. 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 practice's website is.
| Feature / Capability | Official Google Places API | This Actor (Apify) |
|---|---|---|
| Practice email address | ❌ Not part of the Places data model | ✅ Scraped from the practice's own website (up to 4 pages crawled per site) |
| Healthcare category taxonomy | ⚠️ Generic place types (doctor, dentist, hospital) | ✅ 55 curated medical categories, multi-select, searched in one run |
| 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, spread across every selected category |
| AI agent / MCP native | ❌ Requires a custom tool wrapper | ✅ Native MCP tool and pushes leads into your own MCP connectors |
| Cost model | Per-request SKU pricing on a GCP bill | Pay-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-healthcare-leads-sales-intelligence-tool"one_line: "Scrape healthcare practices from Google Maps across 55 curated medical categories, 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: "healthcare practice leads"vertical: "healthcare (fixed - the category cannot be changed)"supported_platforms:- "google.com/maps"- "the practice's own website (for email + audit)"supported_tasks:- "search-healthcare-practices-by-category-and-location"- "select-several-medical-categories-in-one-run"- "find-practice-email-from-its-website"- "extract-phone-address-rating-reviews-hours-social"- "grade-practice-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:- "search-non-healthcare-business-types"- "free-text-search-queries (categories are a fixed enum)"- "scrape-patient-data-or-reviews-text"- "extract-doctor-names-or-personal-emails"- "verify-or-validate-email-deliverability"- "extract-gps-coordinates-or-place-photos"- "scrape-more-than-100-practices-per-run"- "send-outreach-emails"search_keywords:- "healthcare lead scraper"- "medical clinic email scraper"- "dentist lead generation"- "google maps healthcare leads"- "medical practice contact data"- "healthcare b2b prospecting"- "clinic website audit leads"- "dental marketing lead list"- "medspa aesthetic clinic leads"- "mcp crm healthcare lead tool"synonyms:- "clinic lead extractor"- "medical practice finder"- "healthcare prospecting tool"- "doctor clinic email finder"related_concepts:["healthcare marketing", "medical practice sales", "clinic SEO", "dental marketing", "CRM enrichment", "website audit"]input_entities:- "healthcare subcategories (1-60 values from a fixed 55-item enum)"- "location (city / area / state / country, or a Google Maps place URL)"- "max practices (1-100 per run, split across the selected categories)"- "four analysis toggles"output_entities: ["practice", "email", "website grade", "recommendation", "pitch"]input_rules:subcategories_format:type: "array of enum"description: "Multi-select from the fixed 55-value healthcare list. Values outside the list are logged as a warning and skipped; if none survive, the first list entry is used."examples: [["Dentist"], ["Dermatologist", "Skin Clinic", "Aesthetic Clinic"], ["IVF Center", "Fertility Clinic"]]location_format:description: "A single place string. A Google Maps place URL is also accepted and used verbatim."examples: ["Ahmedabad", "Austin, Texas", "London"]maxResults_format:type: "integer"range: [1, 100]default: 20description: "Total practices for the whole run, not per category. The budget is split evenly across the selected subcategories."default_off_fields: []default_on_billable_blocks:["includeSalesStrategy", "includeWebsiteHealthScorecard", "includeServiceRecommendations", "includeTechnicalIntel"]limits:max_practices_per_run: 100free_plan_cap: 5healthcare_categories: 55max_categories_per_run: 60email_pages_crawled_per_site: 4audit_pages_crawled_per_site: 5service_recommendations_per_practice: 4budget_split: "maxResults is divided evenly across the selected categories"pricing:model: "pay-per-event"store_display: "from $4.00 / 1,000 results"events:sales-growth-strategy: 0.02website-performance-report: 0.01business-improvements: 0.01website-technology-details: 0.01note: "All four blocks are ON by default. Turning a block off removes both its output and its charge."when_to_use: >You sell to healthcare practices — web design, SEO, marketing, software,equipment, staffing — and want a worked prospect list for chosen medicalcategories in a place, with contact details plus a reason to reach out.when_not_to_use: >Your target is not healthcare (use the any-industry Actor), you needfree-text queries, review text, GPS coordinates, doctor names or personalemails, verified deliverable emails, or more than 100 practices per run.alternatives:- "Use techforce.global/google-maps-leads-sales-intelligence-tool for ANY business type via free-text queries"- "Use techforce.global/google-maps-scraper when you only need plain listing fields at the lowest cost"- "Use techforce.global/google-maps-hospitality-lead-scraper, finance-google-maps-lead-scraper or construction-lead-intelligence-scraper for those verticals"- "Use an email-verification service on top of companyEmail before sending outreach"- "Loop this Actor per city or per category group for volumes above 100"
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "Google Maps Healthcare Leads & Sales Intelligence Tool","alternateName": "Healthcare Lead Scraper — Clinic Emails, Website Grades & Pitch Playbooks","applicationCategory": "BusinessApplication","operatingSystem": "Cloud (Apify platform)","description": "Scrapes Google Maps for healthcare practices across 55 preset medical categories — clinics, dentists, dermatologists, eye care, IVF and gynecology, diagnostic labs, physiotherapy, mental health and alternative medicine — in any city, crawls each practice's own website for a public company email, and optionally returns four sales-intelligence blocks per practice: 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-healthcare-leads-sales-intelligence-tool","offers": {"@type": "Offer","priceCurrency": "USD","category": "Pay per event","description": "Pay-per-event: one event is charged per practice for each analysis block you leave enabled. The practice 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-healthcare-leads-sales-intelligence-tool"}}
What this Actor does
💡 Not targeting healthcare? This Actor's category is fixed to Healthcare. For any other business type use Google Maps Business Leads & Sales Intelligence (free-text queries, any industry), or a sibling vertical: Hospitality, Finance, Construction. For plain listings at the lowest cost, use Google Maps Scraper (from $0.80 / 1,000).
- Multi-select from 55 curated healthcare categories — clinics, dental, skin & aesthetics, eye care, fertility & women's health, diagnostics, physiotherapy & rehab, mental health, and traditional/alternative medicine. One run covers every category you tick.
- Builds one Google Maps search per category × location pair (
"Dentist in Austin, Texas"), then splits yourmaxResultsbudget evenly across them so no single category eats the whole run. - Deduplicates across categories by place URL — a practice listed under both "Dentist" and "Dental Clinic" is scraped once, not twice.
- Collects listings with Playwright using resilient extraction that tolerates Google's rotating markup — name, category, rating, review count, address, phone, website, hours.
- Visits each practice'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 practice — four independent pay-per-event charges, so a contacts-only run incurs no analysis events at all.
- Runs the whole pool at up to 8 practices concurrently, streaming each record to the dataset as it finishes.
- 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
| Scenario | Fit |
|---|---|
| Selling web design / SEO / marketing to clinics and dentists | ✅ Strong (this is the core use case) |
| Healthcare cold outreach with an email and a reason to call | ✅ Strong |
| Covering a whole sub-vertical (all dental categories at once) | ✅ Strong — multi-select up to 60 categories |
| Medical device / SaaS / staffing prospecting by practice type | ✅ Strong |
| CRM / Airtable / HubSpot enrichment via connector | ✅ Strong (deliveryMode: "perLead") |
| Mapping a city's healthcare provider landscape | ✅ Strong |
| A business type outside the 55 healthcare categories | ❌ Use the any-industry Actor |
| Free-text search terms | ❌ Categories are a fixed enum — no free text |
| More than 100 practices in one execution | ⚠️ Hard cap of 100 — split by city or category group |
| Guaranteed-deliverable email addresses | ⚠️ Emails are scraped, not verified — validate before sending |
| Doctor names, personal emails, or staff directories | ❌ Not supported — practice-level public contacts only |
| Patient data, review text, reviewer names, place photos | ❌ Not extracted |
| Sending the outreach itself | ❌ Not supported — read-only Actor |
⚡ Execution Rules (Avoid Common Agent Failures)
- Nothing is required, and every field has a default.
requiredis empty: an input of{}scrapesMedical ClinicinAhmedabadwith all four billable blocks ON. It will not raise a validation error. API and MCP callers must always sendsubcategories,location,maxResults, and the four toggles explicitly. subcategoriesis an array of exact enum strings, not free text."dentist"(lowercase) or"Cardiologist"(not in the list) are logged as a warning and skipped; if nothing survives, the Actor falls back to the first list entry and scrapes that instead of failing. Copy values verbatim from the 55-item list below.- The category is fixed to Healthcare. There is no way to search a non-medical business type here — route those requests to the any-industry Actor.
- All four analysis blocks default to
true, and each one bills per practice. A default 20-practice run charges four events per practice. For a contacts-only run setincludeSalesStrategy,includeWebsiteHealthScorecard,includeServiceRecommendationsandincludeTechnicalIntelall tofalse— that also makes the run much faster. maxResultsis 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 category group.maxResultsis split evenly across your selected categories. Ten categories withmaxResults: 100is ~10 practices each, not 100 each. Select fewer categories for deeper coverage of each one.- There is no proxy input. Unlike the sibling Actors, this one has no
proxyConfigurationfield and always uses the container's direct connection. If Google starts serving empty pages, re-run rather than reconfiguring. - Empty fields are removed from the item, not set to
null. A practice with no website produces an item with nowebsitekey at all. Test key presence ("website" in item), neveritem["website"] is None. - A missing email is the string
"NA", not an empty value. ReademailStatusfirst:ok·no_email_found·failed(site wouldn't load) ·no_website. - Rows with no resolvable business name are still written. Unlike the any-industry sibling, this Actor does not drop them — filter on
businessNamepresence in your consumer. - Analysis blocks are absent when toggled off — no empty
WEBSITE_HEALTH_SCORECARD: {}placeholder. Same rule as 8: check for the key. deliveryModedefaults toperLead, notnone. With a connector selected, a 100-practice run makes 100 connector calls. For dataset-only runs leavemcpConnectorempty or setdeliveryMode: "none".- Free Apify plans are capped at 5 practices per run with an upgrade banner in the log. That is a successful run, not a failure.
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: "subcategories values must match the 55-item enum exactly"on_violation: "unknown values are warned and skipped; an all-invalid list falls back to the first entry"- 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: noneplatform: "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 5).
Scraping Parameters
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
subcategories | array of string (enum) | ⬜ No (defaults) | ["Medical Clinic"] | 1–60 exact values from the 55-item list | ["Dentist","Orthodontist"] |
location | string | ⬜ No | Ahmedabad | City / area / state / country, or a Google Maps place URL | Austin, Texas |
maxResults | integer | ⬜ No | 20 | 1–100 — total for the run, split across categories | 100 |
includeSalesStrategy | boolean | ⬜ No | true | Billable — sales-growth-strategy | false |
includeWebsiteHealthScorecard | boolean | ⬜ No | true | Billable — website-performance-report | false |
includeServiceRecommendations | boolean | ⬜ No | true | Billable — business-improvements | false |
includeTechnicalIntel | boolean | ⬜ No | true | Billable — website-technology-details | false |
subcategory | string | ⬜ No (hidden) | "" | Legacy compatibility field for older saved inputs — use subcategories | — |
Healthcare category reference — all 55 values
Copy these exactly (Title Case, including &):
| Group | Categories |
|---|---|
| General & clinics | Medical Clinic · Family Clinic · Physician Clinic · General Practitioner · Specialty Clinic · Walk-in Clinic |
| Dental | Dentist · Dental Clinic · Cosmetic Dentist · Orthodontist · Dental Implant Clinic · Pediatric Dentist · Endodontist · Prosthodontist |
| Skin & aesthetics | Skin & Aesthetics · Dermatologist · Skin Clinic · Cosmetic Clinic · Aesthetic Clinic · Hair Transplant Clinic · Laser Treatment Clinic · Anti-Aging Clinic |
| Eye care | Eye Care · Ophthalmologist · Eye Clinic · LASIK Center · Optical Store · Vision Care Center |
| Fertility & women's health | IVF Center · Fertility Clinic · Gynecology Clinic · Maternity Hospital · Women's Health Center |
| Diagnostics & labs | Diagnostic Center · Pathology Lab · Blood Testing Laboratory · MRI Center · CT Scan Center · X-Ray Center · Medical Laboratory |
| Physio & rehab | Physiotherapy Center · Rehabilitation Center · Chiropractic Clinic · Sports Injury Clinic · Occupational Therapy Center |
| Mental health | Psychiatrist · Psychologist · Counseling Center · Mental Health Clinic · De-Addiction Center |
| Traditional & wellness | Ayurvedic Clinic · Homeopathy Clinic · Naturopathy Center · Acupuncture Clinic · Wellness Center |
Anything not on this list is skipped with a warning — there is no Cardiologist, Hospital, Pharmacy, or Veterinarian entry.
Toggle → output block → charge map
| Toggle | Output block(s) | Billable event | Price per practice |
|---|---|---|---|
includeSalesStrategy | LEAD_OVERVIEW + PITCH_STRATEGY | sales-growth-strategy | $0.02 |
includeWebsiteHealthScorecard | WEBSITE_HEALTH_SCORECARD | website-performance-report | $0.01 |
includeServiceRecommendations | SERVICE_RECOMMENDATIONS | business-improvements | $0.01 |
includeTechnicalIntel | TECHNICAL_INTEL | website-technology-details | $0.01 |
The practice profile (name, category, address, phone, website, email, hours, rating, reviews, social, Maps URL) is always included and carries no analysis event.
Examples
Single category, full intelligence:
{"subcategories": ["Dentist"],"location": "Austin, Texas","maxResults": 50,"deliveryMode": "none"}
Whole dental sub-vertical — contacts only, fastest and cheapest (no analysis events charged):
{"subcategories": ["Dentist","Dental Clinic","Cosmetic Dentist","Orthodontist","Pediatric Dentist"],"location": "Ahmedabad","maxResults": 100,"includeSalesStrategy": false,"includeWebsiteHealthScorecard": false,"includeServiceRecommendations": false,"includeTechnicalIntel": false,"deliveryMode": "none"}
Aesthetics prospecting — grade plus fix list, no full playbook:
{"subcategories": ["Dermatologist", "Skin Clinic", "Aesthetic Clinic", "Laser Treatment Clinic"],"location": "Mumbai","maxResults": 80,"includeSalesStrategy": false,"includeWebsiteHealthScorecard": true,"includeServiceRecommendations": true,"includeTechnicalIntel": false,"deliveryMode": "none"}
MCP Delivery Configuration (Optional)
| Parameter | Type | Default | Description |
|---|---|---|---|
mcpConnector | string | "" | Authorized MCP connector on your Apify account (Airtable, HubSpot, Notion, Slack, Sheets, Jira, GitHub, Linear, …). Leave empty for dataset-only runs. |
deliveryMode | enum | perLead | perLead (one call per practice — CRM rows/records/issues) · summary (one call with all leads) · none. |
mcpTool | string | "" | 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. |
mcpArguments | object | {} | Arguments passed to the tool. String leaves support {placeholders}. |
mcpMessageTemplate | string | "" | Template rendered and exposed to mcpArguments as {message}. |
Placeholders by mode:
| Mode | Placeholders |
|---|---|
perLead | {businessName}, {category}, {address}, {phone}, {website}, {companyEmail}, {emailStatus}, {googleRating}, {totalReviews}, {googleMapsUrl}, {searchQuery}, {lead} (formatted multi-line practice summary), {message} |
summary | {leadCount}, {subcategories} (your selected categories, comma-separated), {location}, {leads} (all practices as a formatted list), {message} |
One Airtable/CRM record per practice:
{"subcategories": ["IVF Center", "Fertility Clinic"],"location": "Delhi","maxResults": 40,"mcpConnector": "<your-authorized-airtable-connector>","deliveryMode": "perLead","mcpTool": "create_record","mcpArguments": {"fields": {"Name": "{businessName}","Type": "{category}","Phone": "{phone}","Email": "{companyEmail}","Website": "{website}","Rating": "{googleRating}","Address": "{address}","Maps": "{googleMapsUrl}"}}}
One Slack digest for the whole run:
{"subcategories": ["Physiotherapy Center", "Sports Injury Clinic"],"location": "Pune","maxResults": 30,"mcpConnector": "<your-authorized-slack-connector>","deliveryMode": "summary","mcpTool": "send_message","mcpArguments": { "channel": "#healthcare-leads", "text": "{message}" },"mcpMessageTemplate": "{leadCount} {subcategories} leads in {location}:\n\n{leads}"}
One Notion page per practice — Notion's notion-create-pages expects a top-level pages array, a plain-string title, and markdown in content:
{"subcategories": ["Wellness Center"],"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 practice).
Pagination: limit & offset on the dataset items endpoint.
Duplicates: places are deduplicated across categories within a run. Cross-run deduplication is the consumer's responsibility — use googleMapsUrl as the key.
Practice profile — present when non-empty
| Field | Type | Key omitted when empty | Meaning |
|---|---|---|---|
businessName | string | ✅ | Practice name as listed — can be absent; filter these out |
category | string | ✅ | Google Maps category for the practice |
address | string | ✅ | Full address as displayed |
phone | string | ✅ | Phone number as displayed |
website | string | ✅ | Website URL from the listing — absent when the practice has none |
companyEmail | string | ✅ | Email found on the practice's website; the literal string "NA" when the site had none |
emailStatus | string | ✅ | ok · no_email_found · failed · no_website |
socialMedia | object | ✅ | Social profile URLs keyed by network (Facebook, Instagram, LinkedIn, …) |
workingHours | object | ✅ | Opening hours keyed by day |
googleRating | string | ✅ | Star rating as a string — e.g. "4.6" |
totalReviews | string | ✅ | Review count as a string |
googleMapsUrl | string | ✅ | Listing URL — use as the dedupe key |
searchQuery | string | ✅ | The resolved query that produced this record — e.g. "Dentist in Austin, Texas" |
LEAD_OVERVIEW — toggle includeSalesStrategy
| Key | Type | Meaning |
|---|---|---|
leadPriority | string | Triage label — e.g. High |
revenueOpportunityLevel | string | Opportunity size — e.g. High |
salesAngle | string | Why this practice is worth calling |
recommendedPitch | string | The pitch to lead with |
estimatedMonthlyServicePotential | string | Recurring revenue estimate — e.g. "$800–$1,500/mo" |
estimatedOneTimeProjectPotential | string | Project revenue estimate |
PITCH_STRATEGY — toggle includeSalesStrategy
| Key | Type | Meaning |
|---|---|---|
openingHook | string | Opening line tailored to the practice's rating/reviews/site |
bestServicesToPitch | array | Services worth proposing (up to 4) |
painPointsToHighlight | array | Up to 5 concrete weaknesses to raise |
outcomesToPromise | array | Results to promise |
closingStrategy | string | Suggested close |
WEBSITE_HEALTH_SCORECARD — toggle includeWebsiteHealthScorecard
| Key | Type | Meaning |
|---|---|---|
finalGrade | string | Letter grade for the website overall |
finalClassification | string | Plain-language verdict — e.g. Needs Improvement |
gradeBreakdown | array 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:
| Key | Type | Meaning |
|---|---|---|
priority | string | High · Medium · Low |
service | string | Service to sell, in human-readable form |
currentGrade | string | The area's current grade |
whatToFix | string | The concrete work required |
whyItMatters | string | Business rationale |
outcomeAfterFix | string | Expected result once fixed |
sellingPoint | string | The line to use in the proposal |
TECHNICAL_INTEL — toggle includeTechnicalIntel
| Key | Type | Meaning |
|---|---|---|
techStack | string | Detected stack, or Unknown |
sslStatus | string | Status with grade — e.g. "Good (Grade A)" |
robotsTxtStatus | string | HTTP status label for robots.txt |
sitemapUrl | string | Sitemap URL if found |
auditedPages | integer | How many pages of that site were audited (max 5) |
auditedUrls | array | The exact URLs audited |
navigationNotes | string | Navigation-structure summary |
keyTechnicalIssues | array | Notable 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"; nameless rows are possible; 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 new-patient enquiries"],"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 an appointment.","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 — the budget is split across categories, duplicates are removed, and Google may have fewer matches. itemCount: 0 is a successful run with no matches; check the categories 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 → tick one or more Subcategory values → enter a 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-healthcare-leads-sales-intelligence-tool"
Python (apify-client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.getenv("APIFY_TOKEN"))run = client.actor("techforce.global/google-maps-healthcare-leads-sales-intelligence-tool").call(run_input={"subcategories": ["Dentist", "Dental Clinic", "Orthodontist"],"location": "Austin, Texas","maxResults": 90, # 100 per run is the ceiling, split across categories"includeSalesStrategy": True,"includeWebsiteHealthScorecard": True,"includeServiceRecommendations": False,"includeTechnicalIntel": False,"deliveryMode": "none",})items = client.dataset(run["defaultDatasetId"]).list_items().itemspractices = [i for i in items if i.get("businessName")] # nameless rows are possibleprint(f"{len(practices)} practices")# Keys are omitted when empty - test presence, never compare to None.emailable = [i for i in practices 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-healthcare-leads-sales-intelligence-tool').call({subcategories: ['Dermatologist', 'Skin Clinic', 'Aesthetic Clinic'],location: 'Mumbai',maxResults: 60,includeSalesStrategy: false,includeWebsiteHealthScorecard: true,includeServiceRecommendations: true,includeTechnicalIntel: false,deliveryMode: 'none',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const weakSites = items.filter((i) =>['C', 'D', 'F'].includes(i.WEBSITE_HEALTH_SCORECARD?.finalGrade),);console.log(`${items.length} practices, ${weakSites.length} with a weak website`);
cURL — synchronous (returns items directly; 300s limit)
curl -X POST \-H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"subcategories":["Dentist"],"location":"Austin, Texas","maxResults":20,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~google-maps-healthcare-leads-sales-intelligence-tool/run-sync-get-dataset-items'
Use the async pattern below for anything beyond ~20 practices — website crawling makes this Actor far slower per record than a listings-only scraper.
cURL — asynchronous with a spend cap (recommended for production)
# 1. Start execution with a hard spend limitcurl -X POST -H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"subcategories":["Physiotherapy Center","Rehabilitation Center"],"location":"Pune","maxResults":100,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~google-maps-healthcare-leads-sales-intelligence-tool/runs?maxTotalChargeUsd=5.00'# 2. Pollcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/actor-runs/<runId>'# 3. Retrieve when SUCCEEDEDcurl -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 Code | Detection Condition | Underlying Cause | Deterministic Agent Action |
|---|---|---|---|
AUTH_INVALID | HTTP 401 | Missing or malformed APIFY_TOKEN | Abort & Prompt User: request a valid API token. |
RATE_LIMITED | HTTP 429 | Apify API rate / concurrency limits | Retry: exponential backoff (2s, 4s, 8s). |
SYNC_TIMEOUT | HTTP 408 on the sync endpoint | Run exceeded the 300s synchronous ceiling — easy to hit here | Reconfigure: switch to async POST /runs + polling. |
SILENT_DEFAULT | Results are Medical Clinics in Ahmedabad you never asked for | No field is required; subcategories/location defaulted | Modify Input: always pass both explicitly from API/MCP/SDK. |
BAD_CATEGORY | Log Business type 'X' is not supported for Healthcare. Skipping it. | A value outside the 55-item enum (wrong case, or a non-listed specialty) | Modify Input: copy exact values from the category reference. |
ALL_CATEGORIES_INVALID | Results are a category you didn't select | Every supplied value was invalid, so the first list entry was used | Modify Input: fix the category strings; do not trust the fallback. |
NON_HEALTHCARE_REQUEST | User asked for a non-medical business type | This Actor's category is fixed to Healthcare | Re-route: use the any-industry Actor. |
NO_QUERIES | SUCCEEDED, 0 items, log No search queries provided. | Query plan resolved to empty | Modify Input: supply at least one category and a location. |
EMPTY_RESULTS | SUCCEEDED, itemCount: 0 | Category/location combination has no Google Maps matches | Modify Input: broaden the category set or widen the location. |
CAP_CLAMPED | itemCount never exceeds 100 despite a larger request | 100 practices per run is the hard ceiling | Reconfigure: partition by city or category group across runs. |
THIN_PER_CATEGORY | Only a handful of practices per category | maxResults is split evenly across all selected categories | Reconfigure: select fewer categories, or raise maxResults. |
FREE_PLAN_CAP | itemCount ≤ 5 with the upgrade banner in the log | Free Apify plan caps at 5 practices per run | Prompt User: upgrade for full-volume runs. |
NO_EMAIL | emailStatus: "no_email_found" or companyEmail: "NA" | The site published no discoverable email within 4 crawled pages | Not an error. Fall back to phone, or enrich elsewhere. |
NO_WEBSITE | emailStatus: "no_website", no website key | The listing has no website, so no email or audit is possible | Not an error. Analysis blocks will carry no website grades. |
SITE_UNREACHABLE | emailStatus: "failed", log Homepage load failed for … | The practice site timed out or refused the connection | Not an error. Retry later if the email matters. |
NAMELESS_ROW | Item has no businessName key | This Actor writes rows even when the name can't be resolved | Fix Consumer: filter on businessName presence. |
MISSING_KEY | KeyError in your consumer | Empty values are omitted from items entirely | Fix Consumer: use .get() / key-presence checks. |
MISSING_BLOCK | An analysis block is absent from every item | Its toggle was false (or defaulted off in your saved input) | Modify Input: set the matching include* flag to true. |
UNEXPECTED_CHARGES | Bill higher than expected on a contacts-only run | All four blocks default to true | Modify Input: set all four include* flags to false explicitly. |
CHARGE_SKIPPED | Log 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_SKIPPED | Log no tool name was provided | mcpConnector set but mcpTool empty | Modify Input: set mcpTool; the dataset is already saved. |
DELIVERY_TOOL_UNKNOWN | Log Tool 'x' is not available on this connector | Wrong tool name for that connector | Modify Input: pick a name from the Available tools: list in the same log line. |
DELIVERY_EMPTY | Connector called, body empty | mcpArguments omitted the {message} placeholder | Modify Input: map {message} inside mcpArguments. |
DELIVERY_FLOOD | Hundreds of connector calls / connector rate limits | deliveryMode defaults to perLead | Reconfigure: use summary, or lower maxResults. |
MCP_PROXY_MISSING | Log APIFY_MCP_PROXY_URL is not set | Running locally instead of on the platform | Reconfigure: apify push and run on the platform. |
CHARGE_LIMIT | Run aborted before maxResults reached | maxTotalChargeUsd spend threshold reached | Prompt User: confirm a higher spend cap. |
Reading run status:
SUCCEEDEDwithitemCount: 0is a valid outcome — it means the category and location returned no Google Maps matches, not that the run broke. Only aFAILEDstatus is a platform-level failure. Every log-line and field condition in the table above comes from this Actor’s own behavior; the401/408/429rows are standard Apify API responses.
🗣️ Natural Language → Actor Mapping
| User says | Intent | Constructed Actor input |
|---|---|---|
| "Find dentists in Austin with their emails" | Healthcare lead gen | {"subcategories":["Dentist","Dental Clinic"],"location":"Austin, Texas","maxResults":50} |
| "Get me every skin clinic in Mumbai" | Aesthetics prospecting | {"subcategories":["Dermatologist","Skin Clinic","Aesthetic Clinic"],"location":"Mumbai"} |
| "Which clinics have bad websites?" | Agency prospecting | {"includeWebsiteHealthScorecard":true} then sort on WEBSITE_HEALTH_SCORECARD.finalGrade |
| "Build a prospect list of IVF centres with a pitch each" | Sales enablement | {"subcategories":["IVF Center","Fertility Clinic"],"includeSalesStrategy":true} |
| "Who should I call first?" | Lead triage | read LEAD_OVERVIEW.leadPriority / revenueOpportunityLevel |
| "What should I fix on this clinic's site, and how do I sell it?" | Proposal input | {"includeServiceRecommendations":true,"includeTechnicalIntel":true} |
| "Cover all the diagnostic labs and imaging centres in Delhi" | Sub-vertical sweep | {"subcategories":["Diagnostic Center","Pathology Lab","MRI Center","CT Scan Center","X-Ray Center"],"location":"Delhi"} |
| "Just the contact details, keep it cheap" | Minimal cost run | all four include* → false |
| "Push these clinic leads into Airtable" | CRM delivery | {"mcpConnector":"airtable","deliveryMode":"perLead","mcpTool":"create_record","mcpArguments":{"fields":{"Name":"{businessName}","Email":"{companyEmail}"}}} |
| "Post today's new healthcare leads to Slack" | Digest delivery | {"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message","mcpArguments":{"channel":"#leads","text":"{message}"}} |
| "Open a follow-up task per clinic in Linear" | Task delivery | {"mcpConnector":"linear","deliveryMode":"perLead","mcpTool":"create_issue"} |
| "Map the mental-health provider landscape in Bangalore" | Market research | {"subcategories":["Psychiatrist","Psychologist","Counseling Center","Mental Health Clinic"],"location":"Bangalore","maxResults":100} |
| "Find me restaurants / law firms / gyms" | Non-healthcare | ➡️ Route to any-industry Actor |
| "Find cardiologists / hospitals / pharmacies" | Unlisted specialty | ⚠️ Not in the 55-item list — use the any-industry Actor with a free-text query |
| "Get the doctor's personal email" | Contact discovery | ❌ Out of scope — practice-level public emails only |
| "Get patient reviews for this clinic" | Review mining | ❌ Out of scope — review text is not extracted |
Should NOT route here: any non-healthcare business type (→ any-industry Actor) · specialties outside the 55-item list (cardiology, hospitals, pharmacies, veterinary) · plain listing data at lowest cost (→ Google Maps Scraper) · patient data or review text · doctor names or personal emails · email verification/deliverability · sending outreach · more than 100 practices 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. Is the target a HEALTHCARE practice type? NO → Route to the any-industry Actor│ YES▼3. Does it map to one of the 55 enum categories? NO → (cardiology/hospital/pharmacy/vet)│ YES → Route to the any-industry Actor (free text)▼4. Read/scrape only (not sending outreach)? NO → Abort (no outbound sending here)│ YES▼5. Needs patient data / review text / doctor names? YES → Abort (not extracted)│ NO▼6. Select subcategories (exact strings) + location│ remember: maxResults is SPLIT evenly across the selected categories▼7. Choose analysis blocks - EACH ONE BILLS PER PRACTICE├── 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)▼8. Volume > 100 practices? YES → Partition by city or category group│ NO▼9. Deliver to a connector? YES → mcpConnector + mcpTool + {message}│ perLead = one call per practice; prefer summary at scale│ NO → set deliveryMode "none" (it defaults to perLead)▼10. 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; drop nameless rows; test key presence;│ read emailStatus before companyEmail)└──► status == "FAILED" → route to Error Handling Matrix above
💰 Cost Control & Pricing Transparency
Model: pay-per-event. One event is charged per practice for each analysis block you leave enabled — the practice 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 event | Toggle | Price per practice |
|---|---|---|
sales-growth-strategy | includeSalesStrategy | $0.02 |
website-performance-report | includeWebsiteHealthScorecard | $0.01 |
business-improvements | includeServiceRecommendations | $0.01 |
website-technology-details | includeTechnicalIntel | $0.01 |
| All four (default) | — | $0.05 |
| None (contacts only) | all four false | $0.00 in analysis events |
Worked examples at those event prices:
| Run | Blocks on | Analysis cost |
|---|---|---|
| 5 practices (free-plan preview) | all four | $0.25 |
| 20 practices (default run) | all four | $1.00 |
| 100 practices (per-run ceiling) | all four | $5.00 |
| 100 practices | grade + fixes only | $2.00 |
| 100 practices | none | $0.00 |
| 1,000 practices (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
| File | Purpose |
|---|---|
.actor/actor.json | Identity, version, input/output/dataset wiring |
.actor/input_schema.json | Authoritative typed input contract — the 55-value category enum, location, maxResults, four toggles, deliveryMode enum |
.actor/pay_per_event.json | Declares the four billable events, their titles, descriptions and prices |
.actor/dataset_schema.json | Output field types and the Console table view, including labels for the five analysis blocks |
.actor/output_schema.json | Declares where results are stored |
my_actor/main.py | Category/query planning, Playwright listing extraction, email crawl, website audit, intelligence generation, charging, MCP delivery |
my_actor/connector.py | MCP connector session handling and {placeholder} rendering |
If any table on this page disagrees with the schema files, the schema files win.
🛠️ Troubleshooting
| # | Symptom you see | Most likely cause | Fix |
|---|---|---|---|
| 1 | Results are Medical Clinics in Ahmedabad you never asked for | No input field is required; subcategories and location silently defaulted | Always pass both explicitly from API / MCP / SDK calls. |
| 2 | Log: Business type 'X' is not supported for Healthcare | The value isn't in the 55-item enum (wrong case, or an unlisted specialty) | Copy values verbatim from the category reference table. |
| 3 | You got a category you never selected | Every value you sent was invalid, so the Actor fell back to the first list entry | Fix the strings — the fallback is deliberate but silent. |
| 4 | Charged more than expected | All four analysis blocks default to true — four events per practice | Set every include* flag you don't need to false. |
| 5 | Fewer practices than the number you asked for | maxResults is capped at 100 per run | Partition by city or category group across runs. |
| 6 | Only a few practices per category | maxResults is divided evenly across all selected categories | Select fewer categories, or raise maxResults. |
| 7 | Exactly 5 practices every run | Free Apify plan cap | Upgrade the plan; the log prints the upgrade banner. |
| 8 | Fewer items than maxResults | Budget split + cross-category dedupe + Google having fewer matches | Expected. Check the per-query target lines in the log. |
| 9 | Consumer crashes with KeyError | Empty fields are omitted, not set to null | Use .get() or "key" in item. |
| 10 | An item has no businessName | This Actor keeps rows whose name couldn't be resolved | Filter on businessName presence in your consumer. |
| 11 | companyEmail is "NA" | No email was discoverable within the 4 pages crawled | Read emailStatus first; fall back to phone. |
| 12 | emailStatus: "no_website" | The practice has no website — nothing to crawl or audit | Expected. Website-based blocks will be thin or absent. |
| 13 | emailStatus: "failed" | The practice site timed out or refused the connection | Retry later; a single slow site does not fail the run. |
| 14 | An analysis block is missing everywhere | Its toggle is false in your input | Set the matching include* flag to true. |
| 15 | Emails bounce when you send outreach | Scraped emails are not verified | Run them through an email-verification service first. |
| 16 | googleRating won't compare numerically | It is a string ("4.6") | Cast to float before comparing. |
| 17 | Run is slow | Each practice with a website costs up to 4 email pages + 5 audit pages of crawling | Turn analysis blocks off, or lower maxResults. |
| 18 | HTTP 408 on run-sync-get-dataset-items | The synchronous endpoint has a hard 300-second ceiling | Use async: POST /runs → poll → fetch dataset. Recommended above ~20 practices. |
| 19 | Blank or empty listing fields | Google served an empty page to the container's IP | Re-run. This Actor has no proxy input — there is nothing to reconfigure. |
| 20 | Log: Saved outputs to <dir> | The Actor also writes JSON/CSV inside the container for local development | Ignore it on the platform — the dataset is the real output; container files vanish with the run. |
| 21 | Hundreds of connector calls / connector rate-limited | deliveryMode defaults to perLead | Switch to summary, or lower maxResults. |
| 22 | Slack / Airtable / Notion received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 23 | Connector fired but the message body is empty | mcpArguments did not reference {message} | Map {message} in mcpArguments and populate mcpMessageTemplate. |
| 24 | Log: APIFY_MCP_PROXY_URL is not set | You ran locally; connectors only resolve on the platform | Deploy with apify push and run on the platform. |
| 25 | Log: 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. |
| 26 | HTTP 401 / 403 | Missing, expired, or malformed APIFY_TOKEN | Regenerate in Apify Console → Settings → API & Integrations. |
| 27 | HTTP 429 | Apify account concurrency / rate limits — not Google blocking | Retry with exponential backoff (2s → 4s → 8s). |
Diagnostic checklist before opening an issue
- Baseline run.
subcategories=["Medical Clinic"],location= a large city,maxResults=5, all four togglesfalse,deliveryMode: "none". - Results returned? If yes, the scraper is fine — re-add categories, toggles and volume one step at a time.
- Still zero? Search
"<category> in <location>"on Google Maps in a browser. No results there means a valid empty run. - Check the run log for the
Search query: … | Target businesses: …lines — they show the exact per-category budget split. - 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.
Can I configure a proxy?
No — this Actor has no proxy input and uses a direct connection. If you need proxy control, the any-industry sibling exposes a proxyConfiguration field.
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-healthcare-leads-sales-intelligence-tool"
Categories & volume
Can I search a business type that isn't healthcare?
No. The category is fixed to Healthcare and the subcategory list is a closed enum. Use the any-industry Actor for anything else.
What if my specialty isn't in the list?
Cardiology, hospitals, pharmacies and veterinary practices are not in the 55-item list. Use the any-industry Actor with a free-text query instead.
How many categories can I select at once?
Up to 60 values (the list has 55). Remember they share one maxResults budget, split evenly.
Why can’t I ask for more than 100 practices in one run?
maxResults is capped at 100 per run, and that budget is split evenly across every category you select. Split larger jobs across runs — partition by city, or by category group.
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 practice'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 doctor names or personal emails?
No — practice-level public addresses only (info@, hello@, contact@ and similar).
Do I get patient reviews or photos?
No. You get the rating and review count, not review bodies, reviewer names, or images. No patient data of any kind is collected.
Pricing
How is this billed?
Pay-per-event: one event per enabled analysis block per practice. The practice 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.
How do I guarantee an agent never overspends?
Pass maxTotalChargeUsd as a query parameter on the run endpoint — a hard per-execution ceiling.
🔗 Related Actors
Same data family
This Actor is the healthcare vertical member of the family — same engine, curated medical categories. Its siblings cover other verticals, any industry, and a cheap listings-only mode.
| Actor | Best for | Why pick it over this one |
|---|---|---|
| Google Maps Business Leads & Sales Intelligence | Any industry, free-text queries, several unrelated business types in one run | Your target isn't healthcare, or your specialty isn't in the 55-item list (from $6.50 / 1,000) |
| Google Maps Scraper | Plain Google Maps listings — name, address, phone, website, rating, reviews, hours, coordinates, images | You don't need emails or sales intelligence, and want the lowest cost per result (from $0.80 / 1,000) |
| Google Maps Hospitality Scraper | Hotels, resorts, restaurants, cafes | Hospitality patch instead of healthcare ($9.09 / 1,000) |
| Finance Google Maps Lead Intelligence | CA firms, tax & GST consultants, accounting, auditors, advisors, wealth management, insurance & stock brokers, loan and mortgage agencies | Finance practices — deeper per-site auditing (up to 25 pages/business), 10-lead free tier (from $10.00 / 1,000) |
| Construction Lead Intelligence | General contractors, architecture firms, interior designers, roofing contractors, real estate agencies | Trades and property — basic contact scraping is free, analysis billed per event |
Pick by intent: healthcare (this Actor) · any other industry → any-industry · listings only, cheapest → Google Maps Scraper · hotels/restaurants → Hospitality · accounting/insurance → Finance · contractors/real estate → Construction.
ℹ️ 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
| Actor | Use it for |
|---|---|
| Advanced Website Crawling Actor | Crawl a practice's whole site from website for clean HTML/Markdown/text context beyond the 5 audited pages |
| GOV.UK Business Scraper | Match UK practice or group names against Companies House records, with PSC / ownership enrichment |
Suggested pipeline patterns
🎯 Dental agency prospecting engine
All dental categories + 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.
📊 Provider landscape map
Same category set across several cities → compare WEBSITE_HEALTH_SCORECARD.finalGrade distributions → target the weakest market first.
🧠 Deep-dive on hot practices
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 for healthcare organizations. It does not log into any account, scrape behind authentication, or touch patient data of any kind — no patient records, no review text, no health information.
Two compliance points matter more here than for a general lead scraper:
- Practice contact data is still personal data in many jurisdictions — a solo practitioner's clinic email or phone number identifies a person. GDPR and CCPA can apply to it.
- Marketing to healthcare providers is regulated outreach. Before sending anything to a scraped address, satisfy the applicable anti-spam and electronic-marketing rules (GDPR Art. 6/21, ePrivacy/PECR, CAN-SPAM, CASL) and any local restrictions on soliciting medical professionals. Emails here are unverified and unconsented; treat them accordingly.
You are responsible for ensuring your use complies with Google's Terms of Service and all applicable law.
🆘 Support & Custom Pipeline Engineering
Need multi-city scheduled refreshes, extra medical categories, email verification in-pipeline, or a full CRM / data-warehouse integration?
- Email: bhavin.shah@techforceglobal.com
- Custom Enterprise Integrations: Book a 15-Minute Technical Consultation
- Maintained by: Techforce Global — Specialists in High-Performance Web Scrapers and Agentic Workflows.
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 Healthcare Leads & Sales Intelligence Tool","alternateName": "Healthcare Lead Scraper — Clinic Emails, Website Grades & Pitch Playbooks","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / Healthcare Lead Generation & Sales Intelligence","operatingSystem": "Cloud (Apify platform)","description": "Scrapes Google Maps for healthcare practices across 55 preset medical categories — clinics, dentists, dermatologists, eye care, IVF and gynecology, diagnostic labs, physiotherapy, mental health and alternative medicine — in any city, crawls each practice's own website for a public company email, and optionally returns four sales-intelligence blocks per practice: 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-healthcare-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 practice for each analysis block you leave enabled. The practice 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-healthcare-leads-sales-intelligence-tool"},"featureList": ["No Google account, Places API key or billing project required","55 preset healthcare categories, selected from a dropdown rather than typed as free text","Several categories per run, with the result budget split evenly between them","Company email discovered by crawling each practice's own website","Email status flag so unreachable and site-less practices are distinguishable","Social profile links collected from the practice 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","No patient data, review text or reviewer identities are ever collected","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 practice completes, so aborted runs keep partial data"],"isAccessibleForFree": false,"softwareHelp": {"@type": "CreativeWork","url": "https://apify.com/techforce.global/google-maps-healthcare-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": "Can I configure a proxy?","acceptedAnswer": {"@type": "Answer","text": "No - this Actor has no proxy input and uses a direct connection. If you need proxy control, the any-industry sibling at techforce.global/google-maps-leads-sales-intelligence-tool exposes a proxyConfiguration field."}},{"@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-healthcare-leads-sales-intelligence-tool\""}},{"@type": "Question","name": "Can I search a business type that isn't healthcare?","acceptedAnswer": {"@type": "Answer","text": "No. The category is fixed to Healthcare and the subcategory list is a closed enum. Use the any-industry Actor at techforce.global/google-maps-leads-sales-intelligence-tool for anything else."}},{"@type": "Question","name": "What if my specialty isn't in the list?","acceptedAnswer": {"@type": "Answer","text": "Cardiology, hospitals, pharmacies and veterinary practices are not in the 55-item list. Use the any-industry Actor with a free-text query instead."}},{"@type": "Question","name": "How many categories can I select at once?","acceptedAnswer": {"@type": "Answer","text": "Up to 60 values (the list has 55). Remember they share one maxResults budget, split evenly."}},{"@type": "Question","name": "Why can't I ask for more than 100 practices in one run?","acceptedAnswer": {"@type": "Answer","text": "maxResults is capped at 100 per run, and that budget is split evenly across every category you select. Split larger jobs across runs - partition by city, or by category group."}},{"@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 practice'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 doctor names or personal emails?","acceptedAnswer": {"@type": "Answer","text": "No - practice-level public addresses only, such as info@, hello@ and contact@."}},{"@type": "Question","name": "Do I get patient reviews or photos?","acceptedAnswer": {"@type": "Answer","text": "No. You get the rating and review count, not review bodies, reviewer names, or images. No patient data of any kind is collected."}},{"@type": "Question","name": "How is this billed?","acceptedAnswer": {"@type": "Answer","text": "Pay-per-event: one event per enabled analysis block per practice. The practice 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."}},{"@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."}}]}