# Google Maps Lead Generator (`dvcontact/google-maps-lead-generator`) Actor

Find local businesses from Google Maps and turn them into AI-scored sales leads with emails, website insights, outreach angles, and CRM-ready exports. Export data, run via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/dvcontact/google-maps-lead-generator.md
- **Developed by:** [Code Culture](https://apify.com/dvcontact) (community)
- **Categories:** Lead generation, SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.75 / 1,000 qualified business saveds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Maps Lead Generator with Emails, Reviews, Website Audit & CRM Export

Find local businesses on Google Maps and turn them into organized, sales-ready opportunities.

Search by business type and location, then collect business details, phones, websites, ratings, review counts, opening hours, and Google Maps URLs. Optional add-ons can find public business emails and social profiles, collect reviews, audit websites, enrich decision-maker contacts, score opportunities, create outreach messages, and prepare imports for Mailchimp, Mailgun, Mailjet, Google Sheets, or your own CRM workflow.

> **Unofficial tool:** This Actor is independently developed and is not affiliated with, endorsed by, or sponsored by Google.

Unlike a basic Google Maps scraper, this Actor helps answer:

1. Which businesses should I contact first?
2. What visible opportunity can I discuss?
3. Which service fits the available evidence?
4. What can I say in an email or cold call?
5. How can I export the results into my sales workflow?

### What this Actor does

- Searches Google Maps by niche, category, location, search URL, or place ID
- Extracts business name, category, address, phone, website, rating, review count, opening hours, coordinates, and source URL
- Removes duplicate businesses and can filter likely chains or franchises
- Optionally finds public website emails and company social profiles
- Optionally verifies discovered business and decision-maker emails
- Optionally collects Google review records and reputation evidence
- Optionally checks websites for visible SEO, trust, contact, and conversion gaps
- Optionally enriches businesses with decision-maker names, titles, work emails, LinkedIn profiles, and direct contact signals
- Scores each business as a sales opportunity using observed data
- Generates evidence-based outreach angles, cold emails, and cold-call scripts
- Saves JSON, CSV, Excel-friendly CSV, webhook payloads, and CRM-ready exports

### Who should use it

- Local SEO and Google Business Profile agencies
- Web design and conversion optimization agencies
- Reputation management providers
- Appointment setters and sales development teams
- Automation, CRM, chatbot, and missed-call follow-up consultants
- Cold email and cold-call teams
- Lead generation freelancers
- Market research and local business intelligence teams
- Agencies building niche lists for dentists, medspas, lawyers, home services, real estate, restaurants, and other local businesses

### Quick start

1. Choose a preset niche, such as `Dentists`, `Roofers`, or `HVAC contractors`.
2. Enter a location, such as `Dallas, Texas`.
3. Choose how many business records you want.
4. Select the services you plan to sell.
5. Enable only the add-ons you need.
6. Click **Start**.
7. Review the dataset or download the CRM-ready CSV.

For your first run, start with 10–50 records in one city. This makes it easier to confirm your search and output settings before running a larger region.

### Example searches

| Goal | Niche or search term | Location | Useful settings |
|---|---|---|---|
| Find dental SEO prospects | `dentists` | `Dallas, Texas` | Website audit, business emails, exclude chains |
| Find businesses without websites | `plumbers` | `Houston, Texas` | Website filter: without website |
| Build a reputation-management list | `restaurants` | `Manchester, United Kingdom` | Reviews, maximum rating 4.2 |
| Find medspa decision makers | `medspas` | `Miami, Florida` | Decision-maker enrichment, C-Suite and Marketing |
| Find established local businesses | `HVAC contractors` | `Atlanta, Georgia` | Minimum 20 reviews, exclude chains |
| Audit a broader territory | `real estate agencies` | `Ontario, Canada` | Start with 50 records, then scale |

You can also enter several targeted search terms:

```text
medspas in Scottsdale, Arizona
laser hair removal clinics in Scottsdale, Arizona
skin care clinics in Scottsdale, Arizona
````

Distinct terms often provide better coverage than repeating nearly identical searches.

### Main input fields

| Field | What it controls | Example | When to use it |
|---|---|---|---|
| Preset niche | Quick business category | `Dentists` | Fast setup without custom search terms |
| Location | City, state, region, or country | `Phoenix, Arizona` | City searches are usually faster and more focused |
| Country | Google localization and country output | `United States` | Helps when a location name could exist in several countries |
| Maximum records | Target number of saved businesses | `50` | Start small, then increase after checking quality |
| Services to sell | Your primary offer | `SEO`, `Website redesign` | Shapes scoring and outreach recommendations |
| Search terms | Custom Google Maps searches | `emergency dentists in Dallas` | Use for precise categories or several related niches |
| Google Maps URLs | Existing search or place URLs | A Maps search URL | Use when you already have the exact Maps page |
| Exclude chains | Filters obvious chains and franchises | Enabled | Useful for independent-SMB prospecting |
| Website presence | Any, with website, or without website | `Only without website` | Match the list to your offer |
| Rating and review filters | Narrows reputation level | Maximum rating `4.2` | Useful for reputation or review services |

If custom search terms or Google Maps URLs are supplied, they become the main search instructions and the preset niche search is not added.

### Add-ons

All optional add-ons are disabled by default. Enable only what your campaign needs.

#### Customize outreach messages

Creates a tailored cold-call script from visible business signals without requiring AI. You can also generate cold-email templates when a website or decision-maker email is available.

It adds fields such as:

- `outreach_angle`
- `cold_email_subject`
- `cold_email_body`
- `call_script_opener`

Provide your name, agency name, website, and offer to personalize the copy. Businesses with similar needs can receive different template variants, while reruns remain consistent.

Best for quick prospecting when you want ready-to-use outreach without paying for AI analysis.

#### Company contacts enrichment

Visits public business websites and selected contact pages to find:

- Website business email
- Contact page
- Booking page
- Facebook
- Instagram
- LinkedIn
- YouTube
- TikTok
- X / Twitter

This add-on can increase runtime because websites must be requested and parsed. Some businesses do not publish an email, and some websites may block automated access.

Best for cold email, company research, social audits, and CRM enrichment. For efficient runs, combine it with **Only businesses with websites**.

#### Business email verification

Checks the discovered website email and reports its status in `email_verification_status`.

Verification may use a paid external service. Decisive results such as valid, invalid, or disposable can be chargeable; inconclusive technical results are not treated as verified.

Best for campaigns where list quality matters more than the lowest possible run cost.

#### Website sales opportunity audit

Checks visible website signals such as:

- HTTPS
- Page title and meta description
- Contact form
- Booking link
- Visible email
- Analytics or tracking signals
- Live chat
- Social links
- Mobile-friendly page signals

It adds an audit score, opportunity tags, a plain-language summary, and a suggested website-related service. It is a lightweight sales audit, not a full Lighthouse or technical SEO crawl.

Best for web design, SEO, booking optimization, conversion, and automation agencies.

#### Business leads and decision-maker enrichment

Attempts to find person-level contacts connected to businesses with valid websites. Depending on public availability and the enrichment provider, results can include:

- Name and job title
- Department and seniority
- Work email
- Email verification result
- Direct or mobile phone
- LinkedIn profile
- Company size and profile links

Set **Maximum leads per place** to `0` to disable it, `1` for a cost-controlled best-contact search, or a higher number when you need several people per company.

This add-on can increase cost because it uses external enrichment. Best for targeted B2B outreach where an owner, executive, marketing leader, operations contact, or sales leader is more valuable than a general company inbox.

#### Reviews and reputation signals

Collects individual Google review records for the final selected businesses. You can:

- Choose the maximum reviews per business
- Sort by newest, relevance, highest rating, or lowest rating
- Limit reviews by date
- Filter review or owner-response text by keywords

Best for reputation management, local SEO audits, complaint analysis, customer-experience research, and evidence-based outreach.

More reviews require more requests, so 3–5 reviews per business is a practical starting point.

#### AI lead scoring and outreach copy

Uses available Google Maps, website, contact, and review evidence to improve:

- Opportunity score
- Lead priority
- Main weakness
- Evidence
- Other recommended service
- Outreach angle
- Cold email
- Cold-call opener

The Actor does not need AI to produce a score. If the AI provider is unavailable, deterministic evidence-based scoring remains available so the run can still complete.

Best for teams that want a prioritized prospect list instead of raw business data.

#### CRM and outreach export pack

Creates a ready-to-download CSV in one of these formats:

- General CRM and outreach CSV
- Mailchimp contacts
- Mailgun mailing-list members
- Mailjet contacts

Choose the email source used by the export:

- Website business email
- Decision-maker email
- Combined

The dataset keeps the original `email` and `decision_maker_email` fields. `all_emails` consolidates unique addresses, and `email_verification_status` reports their verification status. In combined email-platform exports, one business can create two rows when it has two different email addresses because these platforms expect one email per contact row.

Mailgun rows are exported with `subscribed=false`; do not represent scraped prospects as opted-in subscribers.

### Output fields

#### Business profile

`company_name`, `industry`, `categories`, `phone`, `phone_unformatted`, `website`, `address`, `street`, `city`, `state`, `postal_code`, `country`, `country_code`, `opening_hours`, `latitude`, `longitude`

#### Google Maps and reputation

`rating`, `review_count`, `google_maps_url`, `source_url`, `place_id`, `fid`, `cid`, review samples, review records, reviewer details, owner responses, applied review filters

#### Company contacts

`email`, `all_emails`, `email_verification_status`, `contact_page_url`, `booking_page_url`, `facebook`, `instagram`, `linkedin`, `youtube`, `tiktok`, `twitter`

#### Decision-maker enrichment

Decision-maker name, title, department, seniority, email, mobile number, LinkedIn profile, company details, source, confidence score, and all returned decision makers

#### Website opportunity audit

`website_audit_score`, `opportunity_tags`, `opportunity_summary`, `website_audit_recommended_service`

#### Sales analysis and outreach

`opportunity_score`, `lead_priority`, `main_weakness`, `evidence`, `recommended_service`, `confidence_score`, `outreach_angle`, `cold_email_subject`, `cold_email_body`, `call_script_opener`

`recommended_service` is shown as **Other recommended service** in dataset tables. It is an additional evidence-based opportunity and does not replace the services you selected to sell.

Priority ranges:

- Hot: 70–100
- Warm: 45–69
- Medium: 25–44
- Low: 0–24

### Sample output

This illustrative full-enrichment record shows how the Actor turns a business listing into a supported sales opportunity. Fields appear only when their corresponding add-ons are enabled.

```json
{
  "company_name": "Desert View Family Dental",
  "industry": "Dentist",
  "categories": [
    "Dentist",
    "Cosmetic dentist",
    "Emergency dental service"
  ],
  "address": "1234 East Camelback Road, Phoenix, AZ 85016",
  "street": "1234 East Camelback Road",
  "city": "Phoenix",
  "state": "Arizona",
  "postal_code": "85016",
  "country": "United States",
  "country_code": "US",
  "phone": "+16025550100",
  "phone_unformatted": "(602) 555-0100",
  "website": "https://desertviewfamilydental.example/",
  "opening_hours": [
    "Monday: 8:00 AM–5:00 PM",
    "Tuesday: 8:00 AM–5:00 PM",
    "Wednesday: 8:00 AM–5:00 PM",
    "Thursday: 8:00 AM–5:00 PM",
    "Friday: 8:00 AM–2:00 PM"
  ],
  "latitude": 33.5094,
  "longitude": -112.0287,
  "rating": 4.2,
  "review_count": 37,
  "google_maps_url": "https://www.google.com/maps/place/...",
  "source_url": "https://www.google.com/maps/place/...",
  "place_id": "ChIJexamplePlaceId",
  "email": "office@desertviewfamilydental.example",
  "decision_maker_email": "jane@desertviewfamilydental.example",
  "all_emails": [
    "office@desertviewfamilydental.example",
    "jane@desertviewfamilydental.example"
  ],
  "email_verification_status": "office@desertviewfamilydental.example: valid; jane@desertviewfamilydental.example: valid",
  "contact_page_url": "https://desertviewfamilydental.example/contact",
  "booking_page_url": "",
  "facebook": "https://facebook.com/desertviewfamilydental",
  "instagram": "https://instagram.com/desertviewfamilydental",
  "linkedin": "",
  "website_audit_score": 68,
  "opportunity_tags": [
    "No clear online booking link",
    "Missing meta description",
    "No live chat or missed-enquiry capture",
    "Review count below a strong local benchmark"
  ],
  "opportunity_summary": "The business has a functioning HTTPS website and visible contact details, but visitors cannot find a clear online booking path. The site also lacks a meta description and visible enquiry automation.",
  "website_audit_recommended_service": "Website conversion and appointment-booking optimization",
  "review_signal_rating": 4.2,
  "review_signal_review_count": 37,
  "reviews_extracted_count": 3,
  "reviews_sort": "newest",
  "review_sample_stars": 3,
  "review_sample_text": "The dentist was helpful, but it took two calls to arrange my appointment.",
  "review_sample_published_at": "2026-05-18",
  "review_sample_reviewer_name": "Sample Reviewer",
  "review_sample_owner_response": "",
  "reviews": [
    {
      "stars": 3,
      "text": "The dentist was helpful, but it took two calls to arrange my appointment.",
      "published_at": "2026-05-18",
      "reviewer_name": "Sample Reviewer",
      "owner_response": ""
    },
    {
      "stars": 5,
      "text": "Friendly team and a clean office.",
      "published_at": "2026-04-03",
      "reviewer_name": "Another Sample Reviewer",
      "owner_response": "Thank you for your feedback."
    }
  ],
  "decision_maker_full_name": "Jane Smith",
  "decision_maker_job_title": "Owner and Lead Dentist",
  "decision_maker_departments": [
    "c_suite",
    "medical_health"
  ],
  "decision_maker_seniority": [
    "owner"
  ],
  "decision_maker_linkedin_profile": "https://www.linkedin.com/in/jane-smith-example",
  "decision_maker_email_verification": "valid",
  "decision_maker_mobile_number": null,
  "decision_maker_confidence_score": 0.92,
  "decision_maker_source_url": "https://desertviewfamilydental.example/about",
  "decision_maker_outreach_angle": "Discuss reducing appointment friction and improving follow-up for prospective patients.",
  "opportunity_score": 86,
  "lead_priority": "Hot",
  "main_weakness": "The website has no clear online booking path despite appointment-related friction appearing in recent review evidence.",
  "evidence": "No booking link was detected on the inspected website pages. A recent three-star review says the customer needed two calls to arrange an appointment. The profile has 37 reviews and a 4.2 rating.",
  "recommended_service": "Appointment automation and conversion-focused website improvements",
  "confidence_score": 0.89,
  "ai_source": "AI-assisted analysis grounded in collected evidence",
  "outreach_angle": "Lead with the opportunity to make appointment requests easier and reduce follow-up friction without criticizing the quality of care.",
  "cold_email_subject": "Quick appointment-flow idea for Desert View Family Dental",
  "cold_email_body": "Hi Jane,\n\nI noticed Desert View Family Dental has strong positive feedback, but the website does not appear to offer a clear online booking path. One recent review also mentioned needing two calls to arrange an appointment.\n\nWe help dental practices make it easier for prospective patients to request an appointment and receive a prompt follow-up. Would you be open to a short three-point review of the current enquiry flow?\n\nBest,\nAlex\nExample Growth Agency",
  "call_script_opener": "Hi Jane, I found Desert View Family Dental while reviewing dental practices in Phoenix. I noticed the practice has positive patient feedback, but there may be some friction between finding you online and requesting an appointment. Can I take 20 seconds to explain what I noticed?",
  "scraped_at": "2026-06-22T12:00:00.000Z"
}
```

### Downloads and integrations

Every run provides:

- Apify Dataset with table views
- JSON, CSV, Excel-compatible CSV, XML, and HTML through Apify dataset exports
- Ordered CRM-ready CSV
- Selected Mailchimp, Mailgun, or Mailjet CSV
- Apify API access
- Webhook delivery
- Google Sheets delivery through a deployed Google Apps Script Web App

#### Webhook delivery

Enter a public HTTPS webhook URL to receive completed records in batches of 100. This works with n8n, Make, Zapier-style webhook steps, custom CRM endpoints, and internal lead routers.

Each request includes the selected format, batch details, records, and run summary. An unavailable webhook is reported in the export status without discarding the saved dataset.

#### Google Sheets delivery

A normal `docs.google.com/spreadsheets/...` edit URL cannot receive direct writes without OAuth. Use a sheet-bound Google Apps Script deployed as a Web App and paste its URL ending in `/exec`.

Example Apps Script:

```javascript
function doPost(e) {
  const payload = JSON.parse(e.postData.contents);
  const spreadsheet = SpreadsheetApp.getActive();
  const sheet = spreadsheet.getSheetByName(payload.sheetName)
    || spreadsheet.insertSheet(payload.sheetName);

  if (payload.headers?.length && sheet.getLastRow() === 0) {
    sheet.appendRow(payload.headers);
  }
  if (payload.rows?.length) {
    sheet.getRange(
      sheet.getLastRow() + 1,
      1,
      payload.rows.length,
      payload.rows[0].length,
    ).setValues(payload.rows);
  }

  return ContentService
    .createTextOutput(JSON.stringify({ ok: true }))
    .setMimeType(ContentService.MimeType.JSON);
}
```

Deploy the script as a Web App, authorize it to access the sheet, paste the `/exec` URL into the Actor, and choose the worksheet tab name.

### Pricing and cost control

This Actor uses pay-per-event pricing with automatic Apify subscription discounts. Apify selects the correct Free, Bronze, Silver, or Gold price for each user. Inputs marked `($)` enable billable work.

All prices below are per 1,000 events unless marked per run.

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| Actor start per allocated GB | $0.005 | $0.005 | $0.005 | $0.005 |
| Qualified business saved | $4.00 | $3.50 | $3.00 | $2.75 |
| Company contact enrichment | $2.00 | $1.50 | $1.25 | $1.05 |
| Website opportunity audit | $1.00 | $0.75 | $0.60 | $0.50 |
| Business email verification | $7.00 | $7.00 | $7.00 | $7.00 |
| Google review saved | $0.50 | $0.35 | $0.30 | $0.26 |
| Decision-maker search | $3.50 | $3.50 | $3.50 | $3.50 |
| Decision maker found | $12.00 | $12.00 | $12.00 | $12.00 |
| Decision-maker email verification | $7.00 | $7.00 | $7.00 | $7.00 |
| AI sales analysis and outreach | $5.00 | $4.00 | $3.50 | $3.00 |

Filters, duplicate removal, deterministic scoring, template outreach, standard downloads, CRM formatting, webhook delivery, and Google Sheets delivery are included.

#### Example cost profiles

**Quick discovery run**

- 50 dentists in Dallas
- No add-ons
- Estimated total: Free $0.21, Bronze $0.185, Silver $0.16, Gold $0.1475

**Outreach-ready company list**

- 100 plumbers in Houston
- Website emails and selected social profiles
- With 70 accessible websites: Free $0.55, Bronze $0.465, Silver $0.3975, Gold $0.3585

**Decision-maker campaign**

- 100 medspas in Miami
- One decision maker per website, email verification, AI outreach
- Price varies with eligible websites, contacts found, decisive verifications, and successful AI analyses

**Reputation opportunity list**

- 50 restaurants in London
- Five reviews per business, lowest-rating sort
- With 250 reviews saved: Free $0.335, Bronze $0.2725, Silver $0.235, Gold $0.2125

#### Ways to reduce cost

- Test with 10–50 records before scaling
- Use a city or metro area before a whole country
- Enable only the fields your campaign will use
- Filter to businesses with websites before website-based enrichment
- Request one decision maker per business first
- Collect 3–5 reviews rather than large review histories
- Use template outreach when AI copy is unnecessary

### Best practices

- Use a specific category such as `cosmetic dentists` instead of `businesses`.
- Include the city and country in custom terms when the place name is ambiguous.
- Use several distinct category terms for broader niche coverage.
- Keep **Exclude chains** enabled when targeting independent businesses.
- Use **Only businesses without websites** for first-website offers.
- Use **Only businesses with websites** for audits, emails, and decision-maker enrichment.
- Use rating and review filters to align the list with your service.
- Review a small sample before importing contacts into an outreach platform.
- Keep source URLs so your team can verify important claims before outreach.

### Common questions and fixes

#### I received fewer businesses than requested

The selected location may have fewer matching listings, filters may remove records, or several searches may return the same businesses. Broaden the location, add distinct search terms, relax rating/review filters, or disable chain filtering if chains are acceptable.

#### No emails were found

Emails are collected only when publicly visible on accessible websites. Confirm that website email discovery or decision-maker enrichment was enabled and that the website filter allows businesses with websites. Phone outreach can still be used when no email is published.

#### The run is slower than a basic scrape

Website checks, reviews, verification, AI analysis, and decision-maker enrichment require extra work. Reduce the record count or disable add-ons that are not required.

#### Some websites were not audited

A website may be unavailable, too large, unsupported, redirected to a social profile, or may block automated requests. The Actor keeps the business record and uses the available Google Maps evidence.

#### Results do not closely match my niche

Use precise custom search terms that include the location. For example, use `emergency dentists in Dallas, Texas` rather than only `dentists`.

#### My Google Sheets URL was rejected

Use a deployed Google Apps Script Web App URL ending in `/exec`, not the normal spreadsheet edit URL.

### Data quality and limitations

- Results depend on data publicly available from Google Maps, business websites, and selected enrichment sources.
- Business details, ratings, reviews, and websites can change after collection.
- Not every business publishes an email or decision-maker contact.
- Some websites restrict automated access.
- Broad searches can contain overlapping results and may take longer.
- Chain detection is heuristic and may not identify every franchise.
- Website findings are lightweight sales signals, not legal, accessibility, security, or full technical audits.
- AI and deterministic recommendations should be reviewed before making claims to a prospect.

### Responsible use

This Actor collects publicly available business information. It does not require access to private accounts or bypass business logins.

You are responsible for complying with applicable privacy, marketing, anti-spam, telemarketing, and data-protection laws. Verify your lawful basis before contacting a person, honor opt-out requests, and follow the rules of any CRM or email platform you use.

### Support

If a run does not behave as expected, open an issue from the Actor page and include:

- Run ID
- Input used
- Niche and location
- Add-ons enabled
- Expected result
- Actual result
- One or two example businesses
- Screenshot, if the issue is visible in the UI

Including the run ID allows support to inspect the exact execution without asking you to repeat the run.

### Changelog

#### 0.1 — June 22, 2026

- Added faster Google Maps and review collection
- Expanded city and region coverage
- Added website contact and social-profile discovery
- Added website opportunity audits
- Added decision-maker enrichment and optional verification
- Added deterministic and AI-assisted opportunity scoring
- Added tailored cold-call and cold-email templates
- Added Mailchimp, Mailgun, Mailjet, webhook, and Google Sheets exports
- Added combined website and decision-maker email exports

# Actor input Schema

## `niche` (type: `string`):

Choose the type of local business to find. Example: Dentists, Roofers, or HVAC contractors. Use this for a quick search with the Location field. If you add custom Search terms or Google Maps URLs, those become the main search instructions.

## `location` (type: `string`):

Enter a city, metro area, state, region, or country. Example: Austin, Texas; Ontario, Canada; or Manchester, United Kingdom. City-level searches are usually faster and more focused. For custom search terms, include the location in each term.

## `countryCode` (type: `string`):

Choose the country used for Google Maps localization and exported country fields. Example: United States, Canada, Germany, or Nigeria. If the Location clearly includes a country, the Actor uses that location country.

## `language` (type: `string`):

Choose the language for Google Maps results and generated outreach. Example: English, French, German, or Spanish. Keep English if your campaign and recipients use English.

## `maxResults` (type: `integer`):

Maximum number of business records to save. Start with 10–50 to test your search, then increase it for a campaign. Larger runs can take longer and cost more. Duplicate removal and filters may reduce the final count.

## `servicesToSell` (type: `array`):

Choose the services you want to offer. These selections guide opportunity scoring and outreach. Example: SEO + Website redesign + Review generation. The Other recommended service field is an additional observed opportunity and does not replace your chosen offer.

## `excludeChains` (type: `boolean`):

Remove likely chains, franchises, and corporate location pages. Keep this enabled when targeting independent local businesses. Detection is heuristic, so a small number of chains may still appear.

## `minimumRating` (type: `number`):

Return businesses at or above this Google rating. Example: 4.3 for established businesses with strong trust. Leave blank when rating should not limit the search.

## `maximumRating` (type: `number`):

Return businesses at or below this Google rating. Example: 4.2 for reputation management prospects. Leave blank when rating should not limit the search.

## `minimumReviewCount` (type: `integer`):

Return businesses with at least this many Google reviews. Example: 20 to focus on established listings. Leave blank to include businesses with any review count.

## `websitePresenceFilter` (type: `string`):

Choose Any, Only with websites, or Only without websites. Use with websites for email discovery and audits; use without websites for first-website offers.

## `maxCrawledPlacesPerSearch` (type: `integer`):

Legacy API-compatible limit used only when Maximum number of records is omitted. Most users should leave this blank and use Maximum number of records above.

## `searchTerms` (type: `array`):

Enter one or more precise Google Maps searches. Example: medspas in Scottsdale, Arizona; laser hair removal clinics in Scottsdale, Arizona. Distinct categories usually improve coverage. You can also enter a place ID such as place\_id:ChIJ8\_JBApXMDUcRDzXcYUPTGUY. Leave empty to use the preset niche and location.

## `googleMapsUrls` (type: `array`):

Paste Google Maps search, category, or exact business URLs. Example: a Maps search for roofers in Dallas. Exact place URLs are extracted directly. Leave empty when using the preset niche or custom search terms.

## `includeTemplateOutreach` (type: `boolean`):

Create a tailored cold-call script for every saved business. The Actor fills the business name, location, service, visible opportunity, and decision-maker first name when available. Leave disabled when you only need lead data.

## `includeTemplateColdEmails` (type: `boolean`):

Also create a subject and email body when a website or decision-maker email was found. Enable company contact discovery or decision-maker enrichment to supply emails. Records without an email still receive a call script.

## `outreachSenderName` (type: `string`):

Name used in call introductions and email signatures. Example: Alex. Keep the default only when you plan to replace it after export.

## `outreachSenderBusinessName` (type: `string`):

Your agency or company name. Example: Northstar Growth. Leave blank to omit a company name from the message.

## `outreachSenderWebsite` (type: `string`):

Your public website, including https://. Example: https://northstargrowth.com. Leave blank to omit it from the signature.

## `outreachOffer` (type: `string`):

Short offer used in outreach. Example: A free 3-point Google Maps and website audit. Leave blank to use your selected Services to sell.

## `findBusinessEmail` (type: `boolean`):

Find a publicly visible business email on the company website and relevant contact pages. This adds website requests and may increase runtime. Not every business publishes an email.

## `verifyEmails` (type: `boolean`):

Verify the discovered website email and populate Email verification status. This may use a paid verification service. Enable it for cleaner outreach lists; leave it off for faster, lower-cost discovery.

## `findFacebookProfile` (type: `boolean`):

Find the company Facebook profile linked from its website. Share links and tracking URLs are ignored. Enable only if Facebook is useful to your workflow.

## `findInstagramProfile` (type: `boolean`):

Find the company Instagram profile linked from its website. Posts, reels, and share links are ignored.

## `findYouTubeChannel` (type: `boolean`):

Find the company YouTube channel linked from its website. Individual videos, playlists, embeds, and share URLs are ignored.

## `findTikTokProfile` (type: `boolean`):

Find the company TikTok profile linked from its website. Video and share URLs are ignored.

## `findTwitterProfile` (type: `boolean`):

Find the company X/Twitter profile linked from its website. Post, intent, and share URLs are ignored.

## `findLinkedInProfile` (type: `boolean`):

Find the LinkedIn company or public profile linked from the business website. Share URLs are ignored.

## `onlyWithEmail` (type: `boolean`):

Save only businesses where a website or decision-maker email was found. Useful for email campaigns. This can substantially reduce the final record count; leave disabled when phone outreach is acceptable.

## `includeWebsiteAudit` (type: `boolean`):

Create a lightweight, evidence-based website opportunity audit. Example: identify missing HTTPS, contact forms, booking links, title/meta basics, analytics, live chat, or social links. This adds website processing and is not a full Lighthouse or technical SEO audit.

## `maximumLeadsEnrichmentRecords` (type: `integer`):

Maximum person-level contacts to request for each business with a valid website. Use 0 to disable this paid add-on, 1 for a cost-controlled best-contact search, or a higher number when you need several contacts at each company.

## `leadsEnrichmentDepartments` (type: `array`):

Choose departments that are likely to buy your offer. Example: C-Suite and Marketing for SEO; Operations for automation; Sales for appointment setting. Leave empty to allow all departments. Used only when Maximum leads per place is above 0.

## `verifyLeadsEnrichmentEmails` (type: `boolean`):

Verify each returned decision-maker email. Decisive provider results can be chargeable; catch-all, unknown, timeout, and technical-error results are treated as inconclusive. Leave disabled if you verify contacts elsewhere.

## `includeReviews` (type: `boolean`):

Collect individual review records for each saved business. Example: use this for review-generation prospects, reputation repair, complaint analysis, or recent customer feedback. Leave disabled when rating and total review count are enough.

## `maxReviews` (type: `integer`):

Maximum reviews to collect per business. Use 3–5 for lightweight prospecting or 10–20 for deeper reputation analysis. Higher values require more requests and may increase runtime and cost. Use 0 to keep only rating and total review count.

## `reviewsDateFilter` (type: `string`):

Collect only reviews after an exact date or within a recent period. Examples: 2026-01-01, 3 months, or 2 weeks. Leave blank to allow reviews from any date.

## `reviewsSort` (type: `string`):

Choose which reviews to collect first. Newest is best for recent monitoring; Most relevant gives Google's representative selection; Lowest rating isolates complaints; Highest rating highlights positive feedback.

## `reviewsFilterKeywords` (type: `string`):

Only keep reviews or owner responses containing one of these comma-separated terms. Example: appointment, wait time, booking, phone. Leave blank to collect reviews without a keyword filter.

## `includeAiAnalysis` (type: `boolean`):

Generate evidence-based opportunity analysis and outreach fields. Example: turn low reviews and no clear booking path into a prioritized reputation or booking opportunity. If AI is unavailable, deterministic scoring remains available so the run can still complete.

## `includeOutreachCopy` (type: `boolean`):

Generate an AI outreach angle, cold email subject and body, and call opener. This also enables AI analysis so the message stays grounded in collected evidence. Leave disabled when template outreach or raw lead data is sufficient.

## `aiPitchTone` (type: `string`):

Choose the writing style for AI outreach. Friendly works for most local businesses; Direct is concise; Premium suits high-value services; Consultative is advisory; Short is useful for compact campaigns.

## `crmExportFormat` (type: `string`):

Choose the column layout for the platform CSV and Google Sheets delivery. General CRM keeps all records; Mailchimp, Mailgun, and Mailjet exports require an email.

## `crmEmailSource` (type: `string`):

Choose website emails, decision-maker emails, or both. Combined email-platform exports create one row per unique address. The general CRM export also populates all\_emails and the shared email verification status.

## `webhookUrl` (type: `string`):

Optional public HTTPS endpoint for completed records. The Actor sends batches of 100 with format details and the run summary. Works with n8n, Make, Zapier-style webhook steps, and custom CRM endpoints. Leave blank to disable.

## `googleSheetsUrl` (type: `string`):

Paste a deployed Google Apps Script Web App URL ending in /exec. The Actor appends the selected CRM rows. A normal docs.google.com spreadsheet edit URL cannot receive direct writes. Leave blank to disable.

## `googleSheetsSheetName` (type: `string`):

Worksheet tab to create or append to. Example: Leads or Dallas Dentists. Used only when a Google Sheets Web App URL is provided.

## Actor input object example

```json
{
  "niche": "dentists",
  "location": "Phoenix, Arizona",
  "countryCode": "US",
  "language": "en",
  "maxResults": 25,
  "servicesToSell": [
    "SEO"
  ],
  "excludeChains": true,
  "websitePresenceFilter": "any",
  "searchTerms": [],
  "googleMapsUrls": [],
  "includeTemplateOutreach": false,
  "includeTemplateColdEmails": false,
  "outreachSenderName": "Alex",
  "outreachSenderBusinessName": "Example Growth Agency",
  "outreachSenderWebsite": "https://example.com",
  "outreachOffer": "A free 3-point Google Maps and website opportunity audit",
  "findBusinessEmail": false,
  "verifyEmails": false,
  "findFacebookProfile": false,
  "findInstagramProfile": false,
  "findYouTubeChannel": false,
  "findTikTokProfile": false,
  "findTwitterProfile": false,
  "findLinkedInProfile": false,
  "onlyWithEmail": false,
  "includeWebsiteAudit": false,
  "maximumLeadsEnrichmentRecords": 0,
  "leadsEnrichmentDepartments": [],
  "verifyLeadsEnrichmentEmails": false,
  "includeReviews": false,
  "maxReviews": 4,
  "reviewsDateFilter": "3 months",
  "reviewsSort": "newest",
  "reviewsFilterKeywords": "appointment, wait time, booking",
  "includeAiAnalysis": false,
  "includeOutreachCopy": false,
  "aiPitchTone": "friendly",
  "crmExportFormat": "generic",
  "crmEmailSource": "combined",
  "webhookUrl": "",
  "googleSheetsUrl": "",
  "googleSheetsSheetName": "Leads"
}
```

# Actor output Schema

## `salesOpportunities` (type: `string`):

Browse all saved businesses using focused views for contacts, social profiles, website opportunities, reviews, decision makers, and outreach.

## `crmReadyCsv` (type: `string`):

Download the complete ordered lead export with business, contact, opportunity, enrichment, review, and outreach columns enabled for this run.

## `crmReadyExcelCsv` (type: `string`):

Excel-friendly version of the complete ordered CSV with UTF-8 encoding support.

## `crmPlatformCsv` (type: `string`):

Download the import layout selected in the input: General CRM, Mailchimp, Mailgun, or Mailjet.

## `crmPlatformExcelCsv` (type: `string`):

Excel-friendly version of the selected platform export with UTF-8 encoding support.

## `exportPackStatus` (type: `string`):

Review the selected email source and format, exported and skipped counts, and delivery outcome for each configured destination.

## `runSummary` (type: `string`):

Review collected, filtered, enriched, analyzed, and saved counts, including add-on usage details.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Phoenix, Arizona",
    "maxResults": 25,
    "outreachSenderName": "Alex",
    "outreachSenderBusinessName": "Example Growth Agency",
    "outreachSenderWebsite": "https://example.com",
    "outreachOffer": "A free 3-point Google Maps and website opportunity audit",
    "reviewsFilterKeywords": "appointment, wait time, booking",
    "googleSheetsSheetName": "Leads"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dvcontact/google-maps-lead-generator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Phoenix, Arizona",
    "maxResults": 25,
    "outreachSenderName": "Alex",
    "outreachSenderBusinessName": "Example Growth Agency",
    "outreachSenderWebsite": "https://example.com",
    "outreachOffer": "A free 3-point Google Maps and website opportunity audit",
    "reviewsFilterKeywords": "appointment, wait time, booking",
    "googleSheetsSheetName": "Leads",
}

# Run the Actor and wait for it to finish
run = client.actor("dvcontact/google-maps-lead-generator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Phoenix, Arizona",
  "maxResults": 25,
  "outreachSenderName": "Alex",
  "outreachSenderBusinessName": "Example Growth Agency",
  "outreachSenderWebsite": "https://example.com",
  "outreachOffer": "A free 3-point Google Maps and website opportunity audit",
  "reviewsFilterKeywords": "appointment, wait time, booking",
  "googleSheetsSheetName": "Leads"
}' |
apify call dvcontact/google-maps-lead-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dvcontact/google-maps-lead-generator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Lead Generator",
        "description": "Find local businesses from Google Maps and turn them into AI-scored sales leads with emails, website insights, outreach angles, and CRM-ready exports. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
        "version": "0.1",
        "x-build-id": "kSdnuZmQZhFYZXYa1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dvcontact~google-maps-lead-generator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dvcontact-google-maps-lead-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dvcontact~google-maps-lead-generator/runs": {
            "post": {
                "operationId": "runs-sync-dvcontact-google-maps-lead-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dvcontact~google-maps-lead-generator/run-sync": {
            "post": {
                "operationId": "run-sync-dvcontact-google-maps-lead-generator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxResults",
                    "servicesToSell"
                ],
                "properties": {
                    "niche": {
                        "title": "🎯 Preset niche",
                        "enum": [
                            "dentists",
                            "medspas",
                            "roofers",
                            "plumbers",
                            "lawyers",
                            "chiropractors",
                            "gyms",
                            "restaurants",
                            "real estate agencies",
                            "cleaning companies",
                            "electricians",
                            "hvac contractors",
                            "landscapers",
                            "pest control companies",
                            "accountants",
                            "insurance agencies",
                            "auto repair shops",
                            "veterinarians",
                            "physical therapists",
                            "home remodelers"
                        ],
                        "type": "string",
                        "description": "Choose the type of local business to find. Example: Dentists, Roofers, or HVAC contractors. Use this for a quick search with the Location field. If you add custom Search terms or Google Maps URLs, those become the main search instructions.",
                        "default": "dentists"
                    },
                    "location": {
                        "title": "📍 Location",
                        "type": "string",
                        "description": "Enter a city, metro area, state, region, or country. Example: Austin, Texas; Ontario, Canada; or Manchester, United Kingdom. City-level searches are usually faster and more focused. For custom search terms, include the location in each term."
                    },
                    "countryCode": {
                        "title": "🌎 Country",
                        "enum": [
                            "US",
                            "CN",
                            "DE",
                            "JP",
                            "IN",
                            "GB",
                            "FR",
                            "IT",
                            "RU",
                            "BR",
                            "CA",
                            "AU",
                            "ES",
                            "MX",
                            "KR",
                            "ID",
                            "TR",
                            "NL",
                            "SA",
                            "CH",
                            "PL",
                            "TW",
                            "BE",
                            "SE",
                            "AR",
                            "IE",
                            "TH",
                            "AT",
                            "IL",
                            "NO",
                            "AE",
                            "SG",
                            "VN",
                            "BD",
                            "PH",
                            "MY",
                            "HK",
                            "ZA",
                            "DK",
                            "CO",
                            "EG",
                            "PK",
                            "CL",
                            "RO",
                            "CZ",
                            "FI",
                            "PT",
                            "PE",
                            "NZ",
                            "GR"
                        ],
                        "type": "string",
                        "description": "Choose the country used for Google Maps localization and exported country fields. Example: United States, Canada, Germany, or Nigeria. If the Location clearly includes a country, the Actor uses that location country.",
                        "default": "US"
                    },
                    "language": {
                        "title": "🗣️ Language",
                        "enum": [
                            "en",
                            "fr",
                            "de",
                            "es",
                            "it",
                            "pt",
                            "nl",
                            "hi",
                            "ar",
                            "ja",
                            "ko"
                        ],
                        "type": "string",
                        "description": "Choose the language for Google Maps results and generated outreach. Example: English, French, German, or Spanish. Keep English if your campaign and recipients use English.",
                        "default": "en"
                    },
                    "maxResults": {
                        "title": "🔢 Maximum number of records ($)",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of business records to save. Start with 10–50 to test your search, then increase it for a campaign. Larger runs can take longer and cost more. Duplicate removal and filters may reduce the final count.",
                        "default": 10
                    },
                    "servicesToSell": {
                        "title": "💼 Services to sell",
                        "type": "array",
                        "description": "Choose the services you want to offer. These selections guide opportunity scoring and outreach. Example: SEO + Website redesign + Review generation. The Other recommended service field is an additional observed opportunity and does not replace your chosen offer.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Accounting",
                                "Admin support",
                                "AI automation",
                                "AI chatbot",
                                "Appointment booking optimization",
                                "Appointment setting",
                                "Automation",
                                "Blog writing",
                                "Bookkeeping",
                                "Branding",
                                "Business card design",
                                "Citation building",
                                "Cold email outreach",
                                "Content marketing",
                                "Conversion rate optimization",
                                "Copywriting",
                                "CRM setup",
                                "Customer reactivation",
                                "Data entry",
                                "Directory listings",
                                "Ecommerce setup",
                                "Email marketing",
                                "Email setup",
                                "Facebook Ads",
                                "Flyer design",
                                "General agency services",
                                "GoHighLevel setup",
                                "Google Ads",
                                "Google Analytics setup",
                                "Google Business Profile optimization",
                                "Graphic design",
                                "HubSpot setup",
                                "Instagram Ads",
                                "Landing pages",
                                "Lead generation",
                                "Live chat",
                                "Local lead generation",
                                "Local SEO",
                                "Local sponsorship outreach",
                                "Logo design",
                                "Marketing automation",
                                "Missed-call text back",
                                "On-page SEO",
                                "Online booking setup",
                                "Pay-per-call lead generation",
                                "Payment automation",
                                "Photography",
                                "Referral program setup",
                                "Reputation management",
                                "Reputation repair",
                                "Review generation",
                                "Review response management",
                                "Sales development",
                                "Sales pipeline setup",
                                "SEO",
                                "Shopify setup",
                                "SMS marketing",
                                "Social media management",
                                "Technical SEO",
                                "TikTok Ads",
                                "Video marketing",
                                "Virtual assistant",
                                "Web design",
                                "Website maintenance",
                                "Website redesign",
                                "Website speed optimization",
                                "WordPress development",
                                "Workflow automation",
                                "YouTube Ads"
                            ],
                            "enumTitles": [
                                "Accounting",
                                "Admin support",
                                "AI automation",
                                "AI chatbot",
                                "Appointment booking optimization",
                                "Appointment setting",
                                "Automation",
                                "Blog writing",
                                "Bookkeeping",
                                "Branding",
                                "Business card design",
                                "Citation building",
                                "Cold email outreach",
                                "Content marketing",
                                "Conversion rate optimization",
                                "Copywriting",
                                "CRM setup",
                                "Customer reactivation",
                                "Data entry",
                                "Directory listings",
                                "Ecommerce setup",
                                "Email marketing",
                                "Email setup",
                                "Facebook Ads",
                                "Flyer design",
                                "General agency services",
                                "GoHighLevel setup",
                                "Google Ads",
                                "Google Analytics setup",
                                "Google Business Profile optimization",
                                "Graphic design",
                                "HubSpot setup",
                                "Instagram Ads",
                                "Landing pages",
                                "Lead generation",
                                "Live chat",
                                "Local lead generation",
                                "Local SEO",
                                "Local sponsorship outreach",
                                "Logo design",
                                "Marketing automation",
                                "Missed-call text back",
                                "On-page SEO",
                                "Online booking setup",
                                "Pay-per-call lead generation",
                                "Payment automation",
                                "Photography",
                                "Referral program setup",
                                "Reputation management",
                                "Reputation repair",
                                "Review generation",
                                "Review response management",
                                "Sales development",
                                "Sales pipeline setup",
                                "SEO",
                                "Shopify setup",
                                "SMS marketing",
                                "Social media management",
                                "Technical SEO",
                                "TikTok Ads",
                                "Video marketing",
                                "Virtual assistant",
                                "Web design",
                                "Website maintenance",
                                "Website redesign",
                                "Website speed optimization",
                                "WordPress development",
                                "Workflow automation",
                                "YouTube Ads"
                            ]
                        },
                        "default": [
                            "SEO"
                        ]
                    },
                    "excludeChains": {
                        "title": "🏪 Enable chain and franchise filtering",
                        "type": "boolean",
                        "description": "Remove likely chains, franchises, and corporate location pages. Keep this enabled when targeting independent local businesses. Detection is heuristic, so a small number of chains may still appear.",
                        "default": true
                    },
                    "minimumRating": {
                        "title": "⭐ Minimum rating filter",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Return businesses at or above this Google rating. Example: 4.3 for established businesses with strong trust. Leave blank when rating should not limit the search."
                    },
                    "maximumRating": {
                        "title": "⭐ Maximum rating filter",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Return businesses at or below this Google rating. Example: 4.2 for reputation management prospects. Leave blank when rating should not limit the search."
                    },
                    "minimumReviewCount": {
                        "title": "💬 Minimum review count filter",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Return businesses with at least this many Google reviews. Example: 20 to focus on established listings. Leave blank to include businesses with any review count."
                    },
                    "websitePresenceFilter": {
                        "title": "🌐 Website presence filter",
                        "enum": [
                            "any",
                            "with_website",
                            "without_website"
                        ],
                        "type": "string",
                        "description": "Choose Any, Only with websites, or Only without websites. Use with websites for email discovery and audits; use without websites for first-website offers.",
                        "default": "any"
                    },
                    "maxCrawledPlacesPerSearch": {
                        "title": "Advanced record limit (legacy) ($)",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Legacy API-compatible limit used only when Maximum number of records is omitted. Most users should leave this blank and use Maximum number of records above."
                    },
                    "searchTerms": {
                        "title": "🔎 Search terms, categories, or place IDs",
                        "type": "array",
                        "description": "Enter one or more precise Google Maps searches. Example: medspas in Scottsdale, Arizona; laser hair removal clinics in Scottsdale, Arizona. Distinct categories usually improve coverage. You can also enter a place ID such as place_id:ChIJ8_JBApXMDUcRDzXcYUPTGUY. Leave empty to use the preset niche and location.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "googleMapsUrls": {
                        "title": "🔗 Google Maps URLs",
                        "type": "array",
                        "description": "Paste Google Maps search, category, or exact business URLs. Example: a Maps search for roofers in Dallas. Exact place URLs are extracted directly. Leave empty when using the preset niche or custom search terms.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "includeTemplateOutreach": {
                        "title": "Generate tailored call scripts",
                        "type": "boolean",
                        "description": "Create a tailored cold-call script for every saved business. The Actor fills the business name, location, service, visible opportunity, and decision-maker first name when available. Leave disabled when you only need lead data.",
                        "default": false
                    },
                    "includeTemplateColdEmails": {
                        "title": "Also generate cold-email templates",
                        "type": "boolean",
                        "description": "Also create a subject and email body when a website or decision-maker email was found. Enable company contact discovery or decision-maker enrichment to supply emails. Records without an email still receive a call script.",
                        "default": false
                    },
                    "outreachSenderName": {
                        "title": "Sender / caller name",
                        "type": "string",
                        "description": "Name used in call introductions and email signatures. Example: Alex. Keep the default only when you plan to replace it after export.",
                        "default": "Your Name"
                    },
                    "outreachSenderBusinessName": {
                        "title": "Your business or agency name",
                        "type": "string",
                        "description": "Your agency or company name. Example: Northstar Growth. Leave blank to omit a company name from the message.",
                        "default": ""
                    },
                    "outreachSenderWebsite": {
                        "title": "Your website",
                        "type": "string",
                        "description": "Your public website, including https://. Example: https://northstargrowth.com. Leave blank to omit it from the signature.",
                        "default": ""
                    },
                    "outreachOffer": {
                        "title": "Offer or value proposition",
                        "type": "string",
                        "description": "Short offer used in outreach. Example: A free 3-point Google Maps and website audit. Leave blank to use your selected Services to sell.",
                        "default": ""
                    },
                    "findBusinessEmail": {
                        "title": "✉️ Find website business email address ($)",
                        "type": "boolean",
                        "description": "Find a publicly visible business email on the company website and relevant contact pages. This adds website requests and may increase runtime. Not every business publishes an email.",
                        "default": false
                    },
                    "verifyEmails": {
                        "title": "✅ Verify discovered emails ($)",
                        "type": "boolean",
                        "description": "Verify the discovered website email and populate Email verification status. This may use a paid verification service. Enable it for cleaner outreach lists; leave it off for faster, lower-cost discovery.",
                        "default": false
                    },
                    "findFacebookProfile": {
                        "title": "📘 Find Facebook profile link ($)",
                        "type": "boolean",
                        "description": "Find the company Facebook profile linked from its website. Share links and tracking URLs are ignored. Enable only if Facebook is useful to your workflow.",
                        "default": false
                    },
                    "findInstagramProfile": {
                        "title": "📸 Find Instagram profile ($)",
                        "type": "boolean",
                        "description": "Find the company Instagram profile linked from its website. Posts, reels, and share links are ignored.",
                        "default": false
                    },
                    "findYouTubeChannel": {
                        "title": "▶️ Find YouTube channel ($)",
                        "type": "boolean",
                        "description": "Find the company YouTube channel linked from its website. Individual videos, playlists, embeds, and share URLs are ignored.",
                        "default": false
                    },
                    "findTikTokProfile": {
                        "title": "🎵 Find TikTok profile ($)",
                        "type": "boolean",
                        "description": "Find the company TikTok profile linked from its website. Video and share URLs are ignored.",
                        "default": false
                    },
                    "findTwitterProfile": {
                        "title": "𝕏 Find X (Twitter) profile ($)",
                        "type": "boolean",
                        "description": "Find the company X/Twitter profile linked from its website. Post, intent, and share URLs are ignored.",
                        "default": false
                    },
                    "findLinkedInProfile": {
                        "title": "💼 Find LinkedIn profile ($)",
                        "type": "boolean",
                        "description": "Find the LinkedIn company or public profile linked from the business website. Share URLs are ignored.",
                        "default": false
                    },
                    "onlyWithEmail": {
                        "title": "📧 Only businesses with discovered emails",
                        "type": "boolean",
                        "description": "Save only businesses where a website or decision-maker email was found. Useful for email campaigns. This can substantially reduce the final record count; leave disabled when phone outreach is acceptable.",
                        "default": false
                    },
                    "includeWebsiteAudit": {
                        "title": "🧭 Run website sales opportunity audit ($)",
                        "type": "boolean",
                        "description": "Create a lightweight, evidence-based website opportunity audit. Example: identify missing HTTPS, contact forms, booking links, title/meta basics, analytics, live chat, or social links. This adds website processing and is not a full Lighthouse or technical SEO audit.",
                        "default": false
                    },
                    "maximumLeadsEnrichmentRecords": {
                        "title": "👤 Maximum decision makers per business ($)",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum person-level contacts to request for each business with a valid website. Use 0 to disable this paid add-on, 1 for a cost-controlled best-contact search, or a higher number when you need several contacts at each company.",
                        "default": 0
                    },
                    "leadsEnrichmentDepartments": {
                        "title": "🏢 Decision-maker departments",
                        "type": "array",
                        "description": "Choose departments that are likely to buy your offer. Example: C-Suite and Marketing for SEO; Operations for automation; Sales for appointment setting. Leave empty to allow all departments. Used only when Maximum leads per place is above 0.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "c_suite",
                                "product",
                                "engineering_technical",
                                "design",
                                "education",
                                "finance",
                                "human_resources",
                                "information_technology",
                                "legal",
                                "marketing",
                                "medical_health",
                                "operations",
                                "sales",
                                "consulting"
                            ],
                            "enumTitles": [
                                "C-Suite",
                                "Product",
                                "Engineering & Technical",
                                "Design",
                                "Education",
                                "Finance",
                                "Human Resources",
                                "Information Technology",
                                "Legal",
                                "Marketing",
                                "Medical & Health",
                                "Operations",
                                "Sales",
                                "Consulting"
                            ]
                        },
                        "default": []
                    },
                    "verifyLeadsEnrichmentEmails": {
                        "title": "✅ Verify decision-maker emails ($)",
                        "type": "boolean",
                        "description": "Verify each returned decision-maker email. Decisive provider results can be chargeable; catch-all, unknown, timeout, and technical-error results are treated as inconclusive. Leave disabled if you verify contacts elsewhere.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "🌟 Collect review and reputation signals ($)",
                        "type": "boolean",
                        "description": "Collect individual review records for each saved business. Example: use this for review-generation prospects, reputation repair, complaint analysis, or recent customer feedback. Leave disabled when rating and total review count are enough.",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "⭐ Reviews to collect per business ($)",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum reviews to collect per business. Use 3–5 for lightweight prospecting or 10–20 for deeper reputation analysis. Higher values require more requests and may increase runtime and cost. Use 0 to keep only rating and total review count.",
                        "default": 4
                    },
                    "reviewsDateFilter": {
                        "title": "📅 Only reviews posted after (optional)",
                        "pattern": "^$|^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
                        "type": "string",
                        "description": "Collect only reviews after an exact date or within a recent period. Examples: 2026-01-01, 3 months, or 2 weeks. Leave blank to allow reviews from any date.",
                        "default": ""
                    },
                    "reviewsSort": {
                        "title": "🔃 Sort reviews by",
                        "enum": [
                            "most_relevant",
                            "newest",
                            "highest_rating",
                            "lowest_rating"
                        ],
                        "type": "string",
                        "description": "Choose which reviews to collect first. Newest is best for recent monitoring; Most relevant gives Google's representative selection; Lowest rating isolates complaints; Highest rating highlights positive feedback.",
                        "default": "newest"
                    },
                    "reviewsFilterKeywords": {
                        "title": "🔎 Filter reviews by keywords",
                        "type": "string",
                        "description": "Only keep reviews or owner responses containing one of these comma-separated terms. Example: appointment, wait time, booking, phone. Leave blank to collect reviews without a keyword filter.",
                        "default": ""
                    },
                    "includeAiAnalysis": {
                        "title": "🤖 Generate AI opportunity analysis ($)",
                        "type": "boolean",
                        "description": "Generate evidence-based opportunity analysis and outreach fields. Example: turn low reviews and no clear booking path into a prioritized reputation or booking opportunity. If AI is unavailable, deterministic scoring remains available so the run can still complete.",
                        "default": false
                    },
                    "includeOutreachCopy": {
                        "title": "📝 Generate outreach email and call opener ($)",
                        "type": "boolean",
                        "description": "Generate an AI outreach angle, cold email subject and body, and call opener. This also enables AI analysis so the message stays grounded in collected evidence. Leave disabled when template outreach or raw lead data is sufficient.",
                        "default": false
                    },
                    "aiPitchTone": {
                        "title": "🎙️ AI pitch tone",
                        "enum": [
                            "friendly",
                            "direct",
                            "premium",
                            "agency-style",
                            "consultative",
                            "short"
                        ],
                        "type": "string",
                        "description": "Choose the writing style for AI outreach. Friendly works for most local businesses; Direct is concise; Premium suits high-value services; Consultative is advisory; Short is useful for compact campaigns.",
                        "default": "friendly"
                    },
                    "crmExportFormat": {
                        "title": "CRM-ready CSV format",
                        "enum": [
                            "generic",
                            "mailchimp",
                            "mailgun",
                            "mailjet"
                        ],
                        "type": "string",
                        "description": "Choose the column layout for the platform CSV and Google Sheets delivery. General CRM keeps all records; Mailchimp, Mailgun, and Mailjet exports require an email.",
                        "default": "generic"
                    },
                    "crmEmailSource": {
                        "title": "Email source for CRM export",
                        "enum": [
                            "website",
                            "decision_maker",
                            "combined"
                        ],
                        "type": "string",
                        "description": "Choose website emails, decision-maker emails, or both. Combined email-platform exports create one row per unique address. The general CRM export also populates all_emails and the shared email verification status.",
                        "default": "combined"
                    },
                    "webhookUrl": {
                        "title": "🔔 Webhook URL",
                        "type": "string",
                        "description": "Optional public HTTPS endpoint for completed records. The Actor sends batches of 100 with format details and the run summary. Works with n8n, Make, Zapier-style webhook steps, and custom CRM endpoints. Leave blank to disable.",
                        "default": ""
                    },
                    "googleSheetsUrl": {
                        "title": "📊 Google Sheets Web App URL",
                        "type": "string",
                        "description": "Paste a deployed Google Apps Script Web App URL ending in /exec. The Actor appends the selected CRM rows. A normal docs.google.com spreadsheet edit URL cannot receive direct writes. Leave blank to disable.",
                        "default": ""
                    },
                    "googleSheetsSheetName": {
                        "title": "Google Sheets tab name",
                        "type": "string",
                        "description": "Worksheet tab to create or append to. Example: Leads or Dallas Dentists. Used only when a Google Sheets Web App URL is provided.",
                        "default": "Leads"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
