Finance Google Maps Lead Intelligence Scraper
Pricing
from $10.00 / 1,000 results
Finance Google Maps Lead Intelligence Scraper
Scrape CA firms, tax consultants & financial advisors from Google Maps with verified emails, lead scores, and instant delivery to Notion, Slack or Airtable.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
Techforce Global
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Finance Google Maps Lead Scraper — CA Firm, Tax, Insurance & Broking Leads with Emails, Website Grades & Pitch Playbooks
Purpose-built finance prospecting: pick from 28 curated finance business types — CA firms, tax and GST consultants, accounting firms, auditors, financial advisors, wealth managers, insurance agencies and brokers, stock brokers, loan and mortgage consultants — and get every practice's phone, address, website, company email scraped from its own site, rating, reviews, hours and Maps URL. Then layer on five optional intelligence blocks (lead overview, pitch strategy, website performance grade, improvement list, tech audit), with website auditing up to 25 pages per site. 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 firm's website is.
| Feature / Capability | Official Google Places API | This Actor (Apify) |
|---|---|---|
| Firm email address | ❌ Not part of the Places data model | ✅ Scraped from the firm's own website (up to 3 pages crawled per site) |
| Finance taxonomy | ⚠️ Generic place types (accounting, insurance_agency, finance) | ✅ 28 curated finance business types, multi-select in one run |
| Website quality / audit | ❌ Not offered | ✅ Letter grade, 7-area breakdown, tech stack, SSL, robots.txt, sitemap — up to 25 pages/site |
| 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 business type |
| 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, from $10.00 / 1,000 results, discounted on higher Apify tiers |
ℹ️ 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/finance-google-maps-lead-scraper"one_line: "Scrape finance practices from Google Maps across 28 curated business types, enrich each with the company email from its website, and optionally generate lead intelligence, a website grade, improvement recommendations, and a deep tech audit."primary_purpose: "extract"secondary_purpose: "enrich"tertiary_purpose: "deliver"entity: "finance practice leads"vertical: "finance (fixed - the category cannot be changed)"supported_platforms:- "google.com/maps"- "the firm's own website (for email + audit)"supported_tasks:- "search-finance-practices-by-type-and-location"- "select-several-business-types-in-one-run"- "find-firm-email-from-its-website"- "extract-phone-address-rating-reviews-hours"- "grade-firm-website-quality"- "deep-audit-up-to-25-pages-per-site"- "generate-sales-pitch-and-lead-priority"- "generate-prioritized-service-recommendations"- "deliver-leads-to-mcp-connector-or-crm"unsupported_tasks:- "search-non-finance-business-types"- "free-text-search-queries (business types are a fixed enum)"- "scrape-client-data-reviews-text-or-fee-schedules"- "extract-partner-or-advisor-names-or-personal-emails"- "verify-or-validate-email-deliverability"- "retrieve-regulatory-licences-or-registration-numbers"- "extract-gps-coordinates-place-photos-or-social-links"- "scrape-more-than-100-practices-per-run"- "send-outreach-emails"search_keywords:- "finance lead scraper"- "accounting firm email scraper"- "ca firm lead generation"- "tax consultant contact data"- "insurance agency lead list"- "financial advisor prospecting"- "google maps finance leads"- "wealth management lead generation"- "mortgage broker lead scraper"- "mcp crm finance lead tool"synonyms:- "accountant lead extractor"- "financial services prospecting tool"- "insurance broker finder"- "tax practice email finder"related_concepts:["financial services marketing", "accounting practice sales", "insurance distribution", "fintech sales", "CRM enrichment", "website audit"]input_entities:- "finance business types (1-60 values from a fixed 28-item enum)"- "location (city / area / state / country, or a Google Maps place URL)"- "max practices (1-100)"- "five analysis toggles"output_entities: ["practice", "email", "website grade", "recommendation", "pitch"]input_rules:subcategories_format:type: "array of enum"description: "Multi-select from the fixed 28-value finance list. Values outside the list are logged as a warning and skipped; if none survive, the first list entry is used."examples: [["CA Firm"], ["Tax Consultant", "GST Consultant"], ["Insurance Broker", "Life Insurance Agency"]]location_format:description: "A single place string. A Google Maps place URL is also accepted and used verbatim."examples: ["London", "Mumbai", "Austin, Texas"]maxResults_format:type: "integer"range: [1, 100]description: "Hard ceiling of 100 per run (schema and code agree), then split evenly across the selected business types."default_on_analysis_blocks:["includeLeadOverview", "includePitchStrategy", "includeWebsiteHealthScorecard", "includeServiceRecommendations", "includeTechnicalIntel"]limits:max_practices_per_run: 100free_plan_cap: 10finance_business_types: 28max_business_types_per_run: 60email_pages_crawled_per_site: 3audit_pages_per_site_default: 4audit_pages_per_site_max: 25parallel_pages_default: 2parallel_pages_max: 20service_recommendations_per_practice: 4budget_split: "maxResults is divided evenly across the selected business types"pricing:model: "pay-per-event (configured on the Store listing)"store_display: "from $10.00 / 1,000 results"note: "This Actor's code declares no per-analysis charge events, so switching analysis blocks on or off changes run time and payload - not the per-result price."when_to_use: >You sell to accounting, tax, insurance, investment or lending practices —web design, SEO, compliance software, fintech, staffing — and want a workedprospect list for chosen finance business types in a place, with contactdetails plus a reason to reach out.when_not_to_use: >Your target is not a finance practice (use the any-industry Actor), you needfree-text queries, regulatory licence data, client or fee information,partner names or personal emails, verified deliverable emails, or more than100 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-healthcare-leads-sales-intelligence-tool, google-maps-hospitality-lead-scraper or construction-lead-intelligence-scraper for those verticals"- "Use techforce.global/gov-uk-business-scraper to match UK firm names against Companies House records"- "Use an email-verification service on top of companyEmail before sending outreach"- "Loop this Actor per city or per business-type group for volumes above 100"
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "Finance Google Maps Lead Scraper","alternateName": "Finance Google Maps Lead Scraper — CA Firm, Tax, Insurance & Broking Leads","applicationCategory": "BusinessApplication","operatingSystem": "Cloud (Apify platform)","description": "Scrapes finance practices from Google Maps across 28 curated business types — accounting, tax, advisory, insurance, broking and lending — in any city, crawls each firm's own website for a public company email, and optionally returns five independently toggleable intelligence blocks per firm: lead priority and revenue opportunity, a pitch playbook, a graded website health scorecard, prioritized service recommendations, and a website technology audit that can reach up to 25 pages per site. No Google account or Places API key is required. Optional summary, chunked or per-lead delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Jira, GitHub or any authorized MCP connector.","url": "https://apify.com/techforce.global/finance-google-maps-lead-scraper","offers": {"@type": "Offer","price": "10.00","priceCurrency": "USD","description": "From $10.00 per 1,000 results on the entry tier, discounted at higher Apify subscription tiers. The analysis toggles do not add separate per-block charges. Current rates are shown on the Actor's Apify Store page.","url": "https://apify.com/techforce.global/finance-google-maps-lead-scraper"}}
What this Actor does
💡 Not targeting finance? This Actor's category is fixed to Finance. For any other business type use Google Maps Business Leads & Sales Intelligence (free-text queries, any industry), or a sibling vertical: Healthcare, Hospitality, Construction. For plain listings at the lowest cost, use Google Maps Scraper (from $0.80 / 1,000).
- Multi-select from 28 curated finance business types — accounting & tax, advisory & wealth, insurance, broking & markets, and lending. One run covers every type you tick.
- Builds one Google Maps search per business type × location pair (
"CA Firm in London"), then splits yourmaxResultsbudget evenly across them so no single type eats the whole run. - Deduplicates across business types by place URL — a firm listed as both "Accounting Firm" and "Auditor" 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 firm's own website to find the company email (up to 3 pages per site — home page first, then the best contact-page candidates).
- Audits that website more deeply than any sibling — default 4 pages, configurable up to 25 pages per site — for performance, SEO, SSL, technical quality and navigation, producing a letter grade and a 7-area breakdown.
- Generates sales intelligence: lead priority, revenue opportunity level, sales angle, recommended pitch, estimated potential, opening hook, services to pitch, pain points, outcomes to promise, and a closing strategy.
- Conservative default concurrency —
batchSizedefaults to just 2 parallel pages, which keeps deep audits stable. It is hidden in the Console form; API, SDK and MCP callers can raise it up to 20 when the network is fast. - Optionally pushes leads to an authorized MCP connector in four delivery modes — one digest, chunked parts for long lists, one call per practice, or none. 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 accounting and tax practices | ✅ Strong (this is the core use case) |
| Fintech, practice-management or compliance-software prospecting | ✅ Strong |
| Insurance and lending distribution partner recruitment | ✅ Strong |
| Finance cold outreach with an email and a reason to call | ✅ Strong |
| Covering a whole sub-vertical (every insurance type in a city) | ✅ Strong — multi-select up to 60 types |
| Deep website audits (up to 25 pages per firm) | ✅ Strong — the deepest audit in the family |
| CRM / Airtable / HubSpot enrichment via connector | ✅ Strong (deliveryMode: "perLead") |
| A business type outside the 28 finance types | ❌ Use the any-industry Actor |
| Free-text search terms | ❌ Business types are a fixed enum — no free text |
| More than 100 practices in one execution | ⚠️ Hard cap of 100 — split by city or type group across runs |
| Guaranteed-deliverable email addresses | ⚠️ Emails are scraped, not verified — validate before sending |
| Regulatory licence / registration numbers (FCA, SEBI, FINRA…) | ❌ Not extracted — pair with a registry source |
| Client lists, fee schedules, AUM figures | ❌ Not extracted |
| Partner / advisor names or personal emails | ❌ Not supported — firm-level public contacts only |
| Review text, reviewer names, place photos, social links | ❌ Not extracted |
⚡ Execution Rules (Avoid Common Agent Failures)
- Nothing is required, and every field has a default.
requiredis empty: an input of{}scrapesCA FirminLondonwith all five analysis blocks ON. It will not raise a validation error. API and MCP callers must always sendsubcategories,locationandmaxResultsexplicitly. subcategoriesis an array of exact enum strings, not free text."ca firm"(lowercase) or"Hedge Fund"(not in the list) are logged as a warning and skipped; if nothing survives, the Actor falls back to the first list entry (CA Firm) and scrapes that instead of failing. Copy values verbatim from the 28-item list below.- The category is fixed to Finance. There is no way to search a non-finance business type here — route those requests to the any-industry Actor.
- All five analysis blocks default to
true. A default run produces the full intelligence payload for every practice. For a fast, lean contacts-only run setincludeLeadOverview,includePitchStrategy,includeWebsiteHealthScorecard,includeServiceRecommendationsandincludeTechnicalIntelall tofalse. maxResultsis capped at 100 per run, matching every sibling Actor. Schema and code agree, so >100 is rejected up front rather than silently clamped.maxResultsis split evenly across your selected business types. Ten types withmaxResults: 100is ~10 practices each, not 100 each. Select fewer types for deeper coverage of each one.maxAuditPagesPerSiteis the biggest run-time lever, and it is API-only. The field is hidden in the Console form, so a Console run always uses the default of 4; API, SDK and MCP callers can send1–25. A 100-practice run at 25 pages each is up to 2,500 page loads on top of the email crawl, so raise it only when you need the depth and expect a much longer run.batchSizeis API-only too, and defaults to 2 — deliberately conservative for deep audits. Hidden in the Console form; raise it (up to 20) from an API/SDK/MCP call for speed on a fast connection, or lower it if pages start timing out.- There is no proxy input. This Actor 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 firm 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. Filter on
businessNamepresence in your consumer. - There is no
socialMediafield in this Actor's output, even though some sibling Actors return one. deliveryModedefaults tosummary, notnone. With a connector selected and nodeliveryModepassed, one digest call fires. For dataset-only runs leavemcpConnectorempty or setdeliveryMode: "none".- Free Apify plans are capped at 10 practices per run with an upgrade banner in the log. That is a successful run, not a failure.
dependencies:- rule: "subcategories values must match the 28-item Finance enum exactly"on_violation: "unknown values are warned and skipped; an all-invalid list falls back to 'CA Firm'"- rule: "each include* toggle controls one output block"note: "all five default to true - switch them off for a contacts-only run"- rule: "maxAuditPagesPerSite and batchSize are hidden in the Console form but accepted from API, SDK and MCP"note: "a Console run always uses the defaults (audit depth 4, 2 parallel pages); maxAuditPagesPerSite is ignored entirely on a contacts-only run"- 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.
Scraping Parameters
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
subcategories | array of string (enum) | ⬜ No (defaults) | ["CA Firm"] | 1–60 exact values from the 28-item list | ["Tax Consultant","GST Consultant"] |
location | string | ⬜ No | London | City / area / state / country, or a Google Maps place URL | Mumbai |
maxResults | integer | ⬜ No | 20 | 1–100, split across types | 100 |
batchSize | integer | ⬜ No | 2 | 1–20 parallel browser pages — hidden in Console, settable via API / SDK / MCP | 6 |
maxAuditPagesPerSite | integer | ⬜ No | 4 | 1–25, only used when a block is on — hidden in Console, settable via API / SDK / MCP | 15 |
includeLeadOverview | boolean | ⬜ No | true | LEAD_OVERVIEW block | false |
includePitchStrategy | boolean | ⬜ No | true | PITCH_STRATEGY block | false |
includeWebsiteHealthScorecard | boolean | ⬜ No | true | WEBSITE_HEALTH_SCORECARD block | false |
includeServiceRecommendations | boolean | ⬜ No | true | SERVICE_RECOMMENDATIONS block | false |
includeTechnicalIntel | boolean | ⬜ No | true | TECHNICAL_INTEL block | false |
subcategory | string | ⬜ No (hidden) | "" | Legacy compatibility field — use subcategories | — |
Finance business type reference — all 28 values
Copy these exactly (Title Case):
| Group | Business types |
|---|---|
| Accounting & tax | CA Firm · Tax Consultant · GST Consultant · Accounting Firm · Auditor · Tax Preparation Service |
| Advisory & wealth | Financial Advisor · Wealth Management Firm · Financial Planner · Portfolio Manager · Investment Consultant |
| Investments & funds | Investment Service · Investment Company · Mutual Fund Distributor |
| Insurance | Insurance Agency · Insurance Broker · Life Insurance Agency · Health Insurance Agency · Vehicle Insurance Agency |
| Broking & markets | Stock Broker · Share Market Consultant · Trading Academy |
| Lending | Loan Agency · Loan Service Provider · Mortgage Broker · Home Loan Consultant · Personal Loan Consultant · Business Loan Consultant |
Anything not on this list is skipped with a warning — there is no Bank, Credit Union, Hedge Fund, Private Equity Firm, Payment Processor, or Crypto Exchange entry.
Toggle → output block map
| Toggle | Output block |
|---|---|
includeLeadOverview | LEAD_OVERVIEW |
includePitchStrategy | PITCH_STRATEGY |
includeWebsiteHealthScorecard | WEBSITE_HEALTH_SCORECARD |
includeServiceRecommendations | SERVICE_RECOMMENDATIONS |
includeTechnicalIntel | TECHNICAL_INTEL |
The practice profile (name, category, address, phone, website, email, hours, rating, reviews, Maps URL, query) is always included.
Examples
Single business type, full intelligence (the default posture):
{"subcategories": ["CA Firm"],"location": "London","maxResults": 50,"deliveryMode": "none"}
Whole tax sub-vertical — contacts only, fastest and leanest:
{"subcategories": ["CA Firm","Tax Consultant","GST Consultant","Accounting Firm","Auditor","Tax Preparation Service"],"location": "Mumbai","maxResults": 100,"includeLeadOverview": false,"includePitchStrategy": false,"includeWebsiteHealthScorecard": false,"includeServiceRecommendations": false,"includeTechnicalIntel": false,"deliveryMode": "none"}
Deep audit on a small, high-value set — the depth this Actor is built for. batchSize and maxAuditPagesPerSite are hidden in the Console form, so this payload can only be sent from the API, an SDK or MCP:
{"subcategories": ["Wealth Management Firm", "Portfolio Manager"],"location": "Singapore","maxResults": 30,"batchSize": 4,"maxAuditPagesPerSite": 20,"includeLeadOverview": true,"includePitchStrategy": true,"includeWebsiteHealthScorecard": true,"includeServiceRecommendations": true,"includeTechnicalIntel": true,"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 | summary | summary (one digest with the full lead list) · chunked (split a long list across calls) · perLead (one call per practice) · none. |
mcpTool | string | "" | Tool name on the connector: send_message, create_page, create_record, 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 — note these differ from the sibling Actors:
| Mode | Placeholders |
|---|---|
summary | {leadCount}, {subcategories}, {location}, {leads} (all leads as text lines), {message} |
chunked | the above, plus {part} and {partCount} — and {leads} holds one part |
perLead | {businessName}, {category}, {address}, {phone}, {website}, {companyEmail}, {emailStatus}, {googleRating}, {totalReviews}, {googleMapsUrl}, {searchQuery}, {message} |
Chunked delivery groups lead lines into parts under ~72,000 characters, so services with per-request block or timeout caps (Notion in particular) never reject the call.
One Slack digest for the whole run:
{"subcategories": ["Insurance Broker", "Life Insurance Agency"],"location": "Manchester","maxResults": 60,"mcpConnector": "<your-authorized-slack-connector>","deliveryMode": "summary","mcpTool": "send_message","mcpArguments": { "channel": "#finance-leads", "text": "{message}" },"mcpMessageTemplate": "{leadCount} {subcategories} leads in {location}:\n\n{leads}"}
One Airtable/CRM record per practice:
{"subcategories": ["Mortgage Broker", "Home Loan Consultant"],"location": "Birmingham","maxResults": 80,"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}"}}}
Chunked into Notion pages for a long list:
{"subcategories": ["Financial Advisor", "Financial Planner", "Investment Consultant"],"location": "London","maxResults": 100,"mcpConnector": "<your-authorized-notion-connector>","deliveryMode": "chunked","mcpTool": "notion-create-pages","mcpArguments": {"parent": { "page_id": "<your-page-id>" },"pages": [{"properties": { "title": "London advisers (part {part}/{partCount})" },"content": "{leads}"}]}}
📤 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 business types 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 | ✅ | Firm name as listed — can be absent; filter these out |
category | string | ✅ | Google Maps category for the firm |
address | string | ✅ | Full address as displayed |
phone | string | ✅ | Phone number as displayed |
website | string | ✅ | Website URL from the listing — absent when the firm has none |
companyEmail | string | ✅ | Email found on the firm's website; the literal string "NA" when the site had none |
emailStatus | string | ✅ | ok · no_email_found · failed · no_website |
workingHours | object | ✅ | Opening hours keyed by day |
googleRating | string | ✅ | Star rating as a string — e.g. "4.8" |
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. "CA Firm in London" |
There is no socialMedia field in this Actor.
LEAD_OVERVIEW — toggle includeLeadOverview
| Key | Type | Meaning |
|---|---|---|
leadPriority | string | Triage label — e.g. High |
revenueOpportunityLevel | string | Opportunity size — e.g. High |
salesAngle | string | Why this firm is worth calling |
recommendedPitch | string | The pitch to lead with |
estimatedMonthlyServicePotential | string | Recurring revenue estimate |
estimatedOneTimeProjectPotential | string | Project revenue estimate |
PITCH_STRATEGY — toggle includePitchStrategy
| Key | Type | Meaning |
|---|---|---|
openingHook | string | Opening line tailored to the firm'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 (up to maxAuditPagesPerSite) |
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; there is no socialMedia; and any of the five analysis blocks is simply absent when its toggle is off.
Example output item
{"businessName": "Thornbury & Co Chartered Accountants","category": "Accountant","address": "18 Finsbury Circus, London EC2M 7EB","phone": "+44 20 7946 0000","website": "https://thornburyaccountants.co.uk","companyEmail": "hello@thornburyaccountants.co.uk","emailStatus": "ok","workingHours": { "Monday": "9:00 AM – 5:30 PM" },"googleRating": "4.8","totalReviews": "96","googleMapsUrl": "https://www.google.com/maps/place/...","searchQuery": "CA Firm in London","LEAD_OVERVIEW": {"leadPriority": "High","revenueOpportunityLevel": "Medium","salesAngle": "Strong reputation but a dated site with no client-portal or lead capture.","recommendedPitch": "Modernise the site and add online enquiry capture to convert existing search traffic.","estimatedMonthlyServicePotential": "$700–$1,400/mo","estimatedOneTimeProjectPotential": "$3,000–$6,000"},"PITCH_STRATEGY": {"openingHook": "You have a 4.8-star rating with 96 reviews - strong social proof.","bestServicesToPitch": ["Website redesign", "Local SEO"],"painPointsToHighlight": ["Performance: slow pages lose enquiry submissions"],"outcomesToPromise": ["More qualified enquiries 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 submit an enquiry.","outcomeAfterFix": "Faster load and more completed enquiry forms.","sellingPoint": "Turn existing search traffic into booked consultations."}],"TECHNICAL_INTEL": {"techStack": "WordPress","sslStatus": "Good (Grade A)","robotsTxtStatus": "200 OK","sitemapUrl": "https://thornburyaccountants.co.uk/sitemap.xml","auditedPages": 4,"auditedUrls": ["https://thornburyaccountants.co.uk/"],"navigationNotes": "Primary navigation is clear; services are buried two levels deep.","keyTechnicalIssues": ["Large uncompressed hero image"]}}
What a successful run looks like
{"status": "SUCCEEDED","defaultDatasetId": "<datasetId>","stats": { "itemCount": 84 }}
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 business types, duplicates are removed, and Google may have fewer matches. itemCount: 0 is a successful run with no matches; check the business types 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 Business type values → enter a Location → set Maximum businesses → switch off any analysis blocks you don't need → tune Audit pages per website if you want depth → 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/finance-google-maps-lead-scraper"
Python (apify-client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.getenv("APIFY_TOKEN"))run = client.actor("techforce.global/finance-google-maps-lead-scraper").call(run_input={"subcategories": ["CA Firm", "Accounting Firm", "Tax Consultant"],"location": "London","maxResults": 90, # 100 is the ceiling, split across the three types"includeLeadOverview": True,"includePitchStrategy": False,"includeWebsiteHealthScorecard": True,"includeServiceRecommendations": True,"includeTechnicalIntel": False,"deliveryMode": "none",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsfirms = [i for i in items if i.get("businessName")] # nameless rows are possibleprint(f"{len(firms)} firms")# Keys are omitted when empty - test presence, never compare to None.emailable = [i for i in firms if i.get("companyEmail", "NA") != "NA"]print(f"{len(emailable)} with a usable email")weak = [i for i in firms if i.get("WEBSITE_HEALTH_SCORECARD", {}).get("finalGrade") in {"C", "D", "F"}]print(f"{len(weak)} with a weak website — best prospects")
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/finance-google-maps-lead-scraper').call({subcategories: ['Insurance Broker', 'Insurance Agency'],location: 'Manchester',maxResults: 100,includeLeadOverview: false,includePitchStrategy: false,includeWebsiteHealthScorecard: false,includeServiceRecommendations: false,includeTechnicalIntel: false, // contacts only - fastest rundeliveryMode: 'none',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const withEmail = items.filter((i) => i.companyEmail && i.companyEmail !== 'NA');console.log(`${items.length} brokers, ${withEmail.length} with an email`);
cURL — synchronous (returns items directly; 300s limit)
curl -X POST \-H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"subcategories":["CA Firm"],"location":"London","maxResults":20,"includeLeadOverview":false,"includePitchStrategy":false,"includeWebsiteHealthScorecard":false,"includeServiceRecommendations":false,"includeTechnicalIntel":false,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~finance-google-maps-lead-scraper/run-sync-get-dataset-items'
Use the async pattern below for anything beyond ~20 practices — deep website auditing 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":["Stock Broker","Share Market Consultant"],"location":"Mumbai","maxResults":100,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~finance-google-maps-lead-scraper/runs?maxTotalChargeUsd=1.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 CA Firms in London you never asked for | No field is required; subcategories/location defaulted | Modify Input: always pass both explicitly from API/MCP/SDK. |
BAD_TYPE | Log Business type 'X' is not supported for Finance. Skipping it. | A value outside the 28-item enum (wrong case, or a non-listed type) | Modify Input: copy exact values from the business type reference. |
ALL_TYPES_INVALID | Results are CA Firm when you selected something else | Every supplied value was invalid, so the first list entry was used | Modify Input: fix the type strings; do not trust the fallback. |
NON_FINANCE_REQUEST | User asked for a non-finance business type | This Actor's category is fixed to Finance | 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 business type and a location. |
EMPTY_RESULTS | SUCCEEDED, itemCount: 0 | Type/location combination has no Google Maps matches | Modify Input: broaden the type set or widen the location. |
CAP_REACHED | itemCount == maxResults == 100 | Per-run maximum of 100 truncated the result set | Reconfigure: partition by city or type group across sequential runs. |
MAX_RESULTS_REJECTED | Input validation rejects maxResults above 100 | The schema maximum is 100 (schema and code agree) | Modify Input: send 100 or less and run repeatedly for more. |
THIN_PER_TYPE | Only a handful of practices per business type | maxResults (≤100) is split evenly across all selected types | Reconfigure: select fewer types, or raise maxResults toward 100. |
FREE_PLAN_CAP | itemCount ≤ 10 with the upgrade banner in the log | Free Apify plan caps at 10 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 3 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 firm's 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 | Modify Input: set the matching include* flag to true. |
NO_SOCIAL | socialMedia missing everywhere | This Actor does not extract social links | Re-route: use the any-industry Actor if you need them. |
NO_LICENCE_DATA | No regulator / registration fields in the output | Licence data is not part of Google Maps listings | Enrich elsewhere: pair with a regulator register or GOV.UK Business Scraper. |
SLOW_RUN | Run approaching the timeout | maxAuditPagesPerSite up to 25 × up to 100 practices | Reconfigure: drop analysis blocks, or from an API/SDK/MCP call lower maxAuditPagesPerSite and raise batchSize. |
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: "perLead" on a large run | Reconfigure: use summary or chunked. |
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 business type 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 accounting firms in London with their emails" | Finance lead gen | {"subcategories":["CA Firm","Accounting Firm"],"location":"London","maxResults":100} |
| "Get me every tax and GST consultant in Mumbai" | Tax sub-vertical sweep | {"subcategories":["Tax Consultant","GST Consultant"],"location":"Mumbai"} |
| "List insurance brokers in Manchester" | Insurance distribution | {"subcategories":["Insurance Broker","Insurance Agency"],"location":"Manchester"} |
| "Which advisers have bad websites?" | Agency prospecting | {"includeWebsiteHealthScorecard":true} then sort on WEBSITE_HEALTH_SCORECARD.finalGrade |
| "Build a prospect list of wealth managers with a pitch each" | Sales enablement | {"subcategories":["Wealth Management Firm","Portfolio Manager"],"includeLeadOverview":true,"includePitchStrategy":true} |
| "Who should I call first?" | Lead triage | read LEAD_OVERVIEW.leadPriority / revenueOpportunityLevel |
| "Audit these firms' sites properly — 20 pages each" | Deep audit | {"maxAuditPagesPerSite":20,"includeTechnicalIntel":true,"maxResults":30} — API/SDK/MCP only |
| "Cover all the lending business types in Birmingham" | Lending sweep | {"subcategories":["Loan Agency","Mortgage Broker","Home Loan Consultant","Personal Loan Consultant","Business Loan Consultant","Loan Service Provider"],"location":"Birmingham"} |
| "Just contact details, keep it fast" | Minimal run | all five toggles false |
| "Push these finance leads into Airtable" | CRM delivery | {"mcpConnector":"airtable","deliveryMode":"perLead","mcpTool":"create_record"} |
| "Post today's new leads to Slack" | Digest delivery | {"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message","mcpArguments":{"channel":"#leads","text":"{message}"}} |
| "Save a long lead list into Notion without it timing out" | Chunked delivery | {"deliveryMode":"chunked","mcpTool":"notion-create-pages"} with {part}/{partCount} in the title |
| "Map the stock-broking landscape in Mumbai" | Market research | {"subcategories":["Stock Broker","Share Market Consultant","Trading Academy"],"location":"Mumbai","maxResults":100} |
| "Find me banks / hedge funds / crypto exchanges" | Unlisted type | ⚠️ Not in the 28-item list — use the any-industry Actor |
| "Find restaurants / clinics / contractors" | Non-finance | ➡️ Route to the matching vertical or any-industry Actor |
| "Is this firm FCA-registered? What's its licence number?" | Regulatory data | ❌ Out of scope — pair with a regulator register |
| "Get the partner's personal email" | Contact discovery | ❌ Out of scope — firm-level public emails only |
Should NOT route here: any non-finance business type (→ any-industry Actor) · banks, credit unions, hedge funds, private equity, payment processors, crypto exchanges (not in the 28-item list) · plain listing data at lowest cost (→ Google Maps Scraper) · regulatory licence or registration data · client lists, fee schedules or AUM · partner names or personal emails · review text or social links · 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 FINANCE practice? NO → Route to the any-industry / matching vertical Actor│ YES▼3. Does it map to one of the 28 enum types? NO → (bank/hedge fund/PE/crypto)│ YES → Route to the any-industry Actor (free text)▼4. Needs regulatory licence / client / fee data? YES → Abort (not extracted; use a register)│ NO▼5. Select business types (exact strings) + location│ remember: maxResults caps at 100 and is SPLIT evenly across the selected types▼6. Volume > 100 practices? YES → Partition by city or type group across runs│ NO▼7. Choose analysis blocks (ALL FIVE DEFAULT TO ON)├── triage only? → includeLeadOverview├── full playbook? → + includePitchStrategy├── site grade? → + includeWebsiteHealthScorecard├── fix list? → + includeServiceRecommendations├── tech audit? → + includeTechnicalIntel└── contacts only? → set ALL FIVE to false▼8. Tune depth vs speed (API/SDK/MCP only - both fields are hidden in Console):maxAuditPagesPerSite (1-25, default 4), batchSize (1-20, default 2)▼9. Deliver to a connector? YES → mcpConnector + mcpTool + {message}│ summary | chunked (long lists) | perLead│ NO → set deliveryMode "none" (it defaults to summary)▼10. Estimated cost within budget? NO → 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
- Priced per result: from $10.00 per 1,000 results on the entry tier, discounted at higher Apify subscription tiers. No monthly subscription.
- Free Apify plans are capped at 10 practices per run.
- Autonomous spend caps: pass
maxTotalChargeUsdas a query parameter on the run endpoint for a hard per-execution ceiling — important for any agent spending on your behalf.
| Practices extracted | Total cost (entry tier) |
|---|---|
| 10 practices (free-plan cap) | $0.10 |
| 20 practices (default run) | $0.20 |
| 50 practices | $0.50 |
| 100 practices (per-run ceiling) | $1.00 |
| 500 practices (5 runs) | $5.00 |
| 1,000 practices (10 runs) | $10.00 |
What the toggles do and don’t affect: unlike the healthcare and any-industry siblings — where each analysis block is a separately-priced billable event — this Actor charges the same per result whichever blocks you enable. Switching blocks off here makes the run faster and the payload smaller, but does not lower the price. The real cost lever is maxResults; the real time lever is maxAuditPagesPerSite.
ℹ️ 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 is a worked example at the entry-tier rate.
🔍 Companion machine-readable files
| File | Purpose |
|---|---|
.actor/actor.json | Identity, version, default run options (2048 MB, 3600s timeout), input/output/dataset wiring |
.actor/input_schema.json | Authoritative typed input contract — the 28-value business type enum, location, maxResults (1–100), five toggles, deliveryMode enum, plus the Console-hidden batchSize and maxAuditPagesPerSite |
.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 | Business-type/query planning, Playwright listing extraction, email crawl, website audit, intelligence generation, MCP delivery |
my_actor/connector.py | MCP connector session handling and {placeholder} rendering |
Note: this Actor has no pay_per_event.json — billing is configured entirely on the Store listing.
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 CA Firms in London 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 Finance | The value isn't in the 28-item enum (wrong case, or an unlisted type) | Copy values verbatim from the business type reference table. |
| 3 | You got CA Firm results when you selected something else | 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 | Payload much bigger than expected | All five analysis blocks default to true | Set every include* flag you don't need to false. |
| 5 | Input rejected for maxResults above 100 | The per-run ceiling is 100 | Send 100 or less; partition bigger jobs across runs. |
| 6 | Only a few practices per business type | maxResults is divided evenly across all selected types | Select fewer types, or raise maxResults toward 100. |
| 7 | Exactly 10 practices every run | Free Apify plan cap | Upgrade the plan; the log prints the upgrade banner. |
| 8 | Fewer items than maxResults | Budget split + cross-type 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 3 pages crawled | Read emailStatus first; fall back to phone. |
| 12 | emailStatus: "no_website" | The firm has no website — nothing to crawl or audit | Expected. Website-based blocks will be thin or absent. |
| 13 | emailStatus: "failed" | The firm's site timed out or refused the connection | Retry later; a single slow site does not fail the run. |
| 14 | No socialMedia field anywhere | This Actor doesn't extract social links | Use the any-industry Actor if you need them. |
| 15 | No licence / regulator fields | Not part of Google Maps listings | Pair with a regulator register, or GOV.UK Business Scraper for UK entities. |
| 16 | Emails bounce when you send outreach | Scraped emails are not verified | Run them through an email-verification service first. |
| 17 | googleRating won't compare numerically | It is a string ("4.8") | Cast to float before comparing. |
| 18 | Run is very slow | Deep audits: up to 25 pages per site plus 3 email pages, at batchSize 2 | Drop analysis blocks. From an API/SDK/MCP call you can also lower maxAuditPagesPerSite and raise batchSize. |
| 19 | Pages time out after raising batchSize | Too many parallel pages for the current network | Lower batchSize back toward the default of 2. |
| 20 | 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. |
| 21 | 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. |
| 22 | 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. |
| 23 | Hundreds of connector calls / connector rate-limited | deliveryMode: "perLead" on a large run | Switch to summary or chunked. |
| 24 | Notion rejects or truncates a long lead list | Single-call payload exceeded block/timeout caps | Use deliveryMode: "chunked" and put {part}/{partCount} in the page title. |
| 25 | Slack / Airtable / Notion received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 26 | Connector fired but the message body is empty | mcpArguments did not reference {message} | Map {message} in mcpArguments and populate mcpMessageTemplate. |
| 27 | 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. |
| 28 | HTTP 401 / 403 | Missing, expired, or malformed APIFY_TOKEN | Regenerate in Apify Console → Settings → API & Integrations. |
| 29 | 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=["CA Firm"],location= a large city,maxResults=5, all five togglesfalse,deliveryMode: "none". - Results returned? If yes, the scraper is fine — re-add types, toggles and volume one step at a time.
- Still zero? Search
"<business type> 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-type budget split — and for anynot supported for Financewarnings. - Confirm which toggles were actually on, and whether the run passed
maxAuditPagesPerSite(Console runs always use the default of 4), before reporting a slow run or a missing 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 and Hospitality Actor expose 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/finance-google-maps-lead-scraper"
Business types & volume
Can I search a business type that isn't finance?
No. The category is fixed to Finance and the business-type list is a closed enum. Use the any-industry Actor for anything else.
What if my target isn't in the list?
Banks, credit unions, hedge funds, private equity firms, payment processors and crypto exchanges are not in the 28-item list. Use the any-industry Actor with a free-text query instead.
How many business types can I select at once?
Up to 60 values (the list has 28). Remember they share one maxResults budget, split evenly.
How many practices can one run return?
Up to 100 — the same ceiling as every sibling Actor. For bigger jobs, partition by city or business-type group across sequential runs and merge on googleMapsUrl.
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 3 crawled pages of that firm'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 regulatory licence or registration numbers?
No. Google Maps listings don't carry them. Pair the output with the relevant regulator's register, or GOV.UK Business Scraper for UK entities.
Do I get partner names or personal emails?
No — firm-level public addresses only (info@, hello@, contact@ and similar).
How deep does the website audit go?
Up to 25 pages per site — the deepest in this Actor family — but it defaults to 4. Raise it only when you need the detail; it is the single biggest driver of run time.
Pricing
How is this billed?
From $10.00 per 1,000 results on the entry tier, less on higher Apify subscription tiers. Unlike the healthcare and any-industry siblings, the analysis toggles here do not add separate per-block charges.
How do I make a run as cheap as possible?
Keep maxResults tight; cost scales with results, not with which blocks you enable. If you don't need emails or analysis at all, Google Maps Scraper is far cheaper per result.
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 finance vertical member of the family — same engine, curated finance business types, and the deepest website audit of the set. 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 finance, your type isn't in the 28-item list, or you need socialMedia (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 Healthcare Leads & Sales Intelligence | Healthcare — 55 preset medical categories | Clinics, dental, diagnostics, wellness instead of finance (from $4.00 / 1,000) |
| Google Maps Hospitality Scraper | Hotels, resorts, restaurants, cafes — 33 mapped types | A hospitality patch instead of finance ($9.09 / 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: accounting/tax/insurance/broking/lending (this Actor) · any other industry → any-industry · listings only, cheapest → Google Maps Scraper · clinics & dental → Healthcare · hotels & restaurants → Hospitality · 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 |
|---|---|
| GOV.UK Business Scraper | Match UK firm names against Companies House records, with PSC / beneficial-ownership enrichment — a natural pairing for finance prospects |
| Advanced Website Crawling Actor | Crawl a firm's whole site from website for clean HTML/Markdown/text context beyond the audited pages |
Suggested pipeline patterns
🎯 Accounting-practice agency engine
All accounting & tax types in a city + includeWebsiteHealthScorecard + includeServiceRecommendations → filter finalGrade ≤ C → deliveryMode: "perLead" into Airtable → work the queue from the fix list.
🏛️ UK firm verification
This Actor for contacts → GOV.UK Business Scraper on businessName → attach company number, incorporation date and PSC data before outreach.
📇 CRM enrichment loop
One run per city on a schedule → perLead delivery into HubSpot → dedupe on googleMapsUrl → verify companyEmail before any sequence.
🧠 Deep-dive on hot firms
Broad triage run at the default audit depth → filter LEAD_OVERVIEW.leadPriority == "High" → re-run just those from the API with maxAuditPagesPerSite: 25 for a proposal-grade audit.
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 finance firms. It does not log into any account, bypass authentication, or access client, account, or transaction data of any kind.
Three points matter before you use the output:
- Firm contact data is still personal data in many jurisdictions — a sole practitioner's practice email or phone number identifies a person. GDPR and CCPA can apply to it.
- Cold outreach is regulated. 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).
- Nothing here is regulatory or financial-suitability data. The output carries no licence, registration or authorisation status. Do not present a scraped listing as evidence that a firm is regulated, and do not use this data to make or imply investment, credit or insurance recommendations.
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 finance business types (banks, hedge funds, payment firms), regulator-register enrichment, 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": "Finance Google Maps Lead Scraper","alternateName": "Finance Google Maps Lead Scraper — CA Firm, Tax, Insurance & Broking Leads","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / Financial Services Lead Generation & Sales Intelligence","operatingSystem": "Cloud (Apify platform)","description": "Scrapes finance practices from Google Maps across 28 curated business types — accounting, tax, advisory, insurance, broking and lending — in any city, crawls each firm's own website for a public company email, and optionally returns five independently toggleable intelligence blocks per firm: lead priority and revenue opportunity, a pitch playbook, a graded website health scorecard, prioritized service recommendations, and a website technology audit that can reach up to 25 pages per site. No Google account or Places API key is required. Optional summary, chunked or per-lead delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Jira, GitHub or any authorized MCP connector.","url": "https://apify.com/techforce.global/finance-google-maps-lead-scraper","author": {"@type": "Organization","name": "Techforce Global","url": "https://www.techforceglobal.com"},"provider": {"@type": "Organization","name": "Apify","url": "https://apify.com"},"offers": {"@type": "Offer","price": "10.00","priceCurrency": "USD","description": "From $10.00 per 1,000 results on the entry tier, discounted at higher Apify subscription tiers. The analysis toggles do not add separate per-block charges. Current rates are shown on the Actor's Apify Store page.","url": "https://apify.com/techforce.global/finance-google-maps-lead-scraper"},"featureList": ["No Google account, Places API key or billing project required","28 preset finance business types, selected from a dropdown rather than typed as free text","Several business types per run, with the result budget split evenly between them","Company email discovered by crawling each firm's own website","Email status flag so unreachable and site-less firms are distinguishable","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","Configurable audit depth of up to 25 pages per site — the deepest in this Actor family","Five independently toggleable intelligence blocks, including separate lead-overview and pitch-strategy switches","Configurable parallel browser pages to trade speed against memory","Summary, chunked or per-lead MCP delivery into Airtable, HubSpot, Notion, Slack, Google Sheets, Jira, GitHub or any authorized connector","Chunked delivery keeps long lead lists under connector size and timeout caps","Results pushed to the dataset batch by batch, so aborted runs keep partial data"],"isAccessibleForFree": false,"softwareHelp": {"@type": "CreativeWork","url": "https://apify.com/techforce.global/finance-google-maps-lead-scraper"}}
{"@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 and the Hospitality Actor at techforce.global/google-maps-hospitality-lead-scraper expose 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/finance-google-maps-lead-scraper\""}},{"@type": "Question","name": "Can I search a business type that isn't finance?","acceptedAnswer": {"@type": "Answer","text": "No. The category is fixed to Finance and the business-type 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 target isn't in the list?","acceptedAnswer": {"@type": "Answer","text": "Banks, credit unions, hedge funds, private equity firms, payment processors and crypto exchanges are not in the 28-item list. Use the any-industry Actor with a free-text query instead."}},{"@type": "Question","name": "How many business types can I select at once?","acceptedAnswer": {"@type": "Answer","text": "Up to 60 values (the list has 28). Remember they share one maxResults budget, split evenly."}},{"@type": "Question","name": "How many practices can one run return?","acceptedAnswer": {"@type": "Answer","text": "Up to 100 - the same ceiling as every sibling Actor. For bigger jobs, partition by city or business-type group across sequential runs and merge on googleMapsUrl."}},{"@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 3 crawled pages of that firm'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 regulatory licence or registration numbers?","acceptedAnswer": {"@type": "Answer","text": "No. Google Maps listings don't carry them. Pair the output with the relevant regulator's register, or with techforce.global/gov-uk-business-scraper for UK entities."}},{"@type": "Question","name": "Do I get partner names or personal emails?","acceptedAnswer": {"@type": "Answer","text": "No - firm-level public addresses only, such as info@, hello@ and contact@."}},{"@type": "Question","name": "How deep does the website audit go?","acceptedAnswer": {"@type": "Answer","text": "Up to 25 pages per site - the deepest in this Actor family - but it defaults to 4. Raise it only when you need the detail; it is the single biggest driver of run time."}},{"@type": "Question","name": "How is this billed?","acceptedAnswer": {"@type": "Answer","text": "From $10.00 per 1,000 results on the entry tier, less on higher Apify subscription tiers. Unlike the healthcare and any-industry siblings, the analysis toggles here do not add separate per-block charges."}},{"@type": "Question","name": "How do I make a run as cheap as possible?","acceptedAnswer": {"@type": "Answer","text": "Keep maxResults tight; cost scales with results, not with which blocks you enable. If you don't need emails or analysis at all, techforce.global/google-maps-scraper is far cheaper per result."}},{"@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."}}]}