# Local Lead Finder Pro | $4/1K | Lead Score, Tech Stack, Pitch (`apivault_labs/local-business-lead-finder-pro`) Actor

Premium lead finder for web agencies and SDR teams. Scrape YellowPages and auto-enrich every lead with a 0-100 lead score, website tech stack (Wix/WordPress/Shopify), real emails, phone E.164, mobile + SEO audit, and an outreach pitch. CSV export for HubSpot/Pipedrive. 30+ fields per lead.

- **URL**: https://apify.com/apivault\_labs/local-business-lead-finder-pro.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Lead generation, Business, Marketing
- **Stats:** 9 total users, 5 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Local Lead Finder Pro | Lead Score, Tech Stack, Outreach Pitch

> **Find local businesses by category + location, then auto-enrich every lead with a 0-100 lead score, website tech-stack detection, email guesses, social search URLs and a personalised cold-outreach pitch — all for $4 per 1,000 leads.**

The most popular lead-gen actor on Apify Store gets a **major v2.2 upgrade**: every record now arrives sales-ready, sortable by lead score, with a CSV-friendly export ready for HubSpot or Pipedrive.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify)](https://apify.com/apivault_labs/local-business-lead-finder)
[![Pricing](https://img.shields.io/badge/pricing-$4%20per%201,000-orange)](https://apify.com/apivault_labs/local-business-lead-finder)

---

### ✨ What's new in v2.0 (May 2026)

**🎯 Lead score (0-100) on every record** — composite signal computed from no-website / dead-site / DIY-builder, review count, rating, years in business, contact completeness. Plus `leadScoreReasons[]` listing exactly why each score was assigned.

**🪜 Lead tiers** — `cold` (<35) / `warm` (35-54) / `hot` (55-74) / `on-fire` (75+). Sort by tier, filter, prioritise outreach.

**🛠️ Website tech stack detection** — for every lead with a website, the actor does a quick HEAD/GET to detect: alive status, SSL validity, and which platform the site runs on:
- **DIY builders that web agencies replace:** Wix, Weebly, GoDaddy Website Builder, WordPress.com, ClickFunnels, GoHighLevel
- **Mid-tier:** Squarespace, Webflow
- **Pro stacks:** WordPress, Shopify, Joomla, Drupal

**💀 Dead-website detection** — leads with broken or unreachable sites are flagged `websiteAlive: false` and get +25 to lead score (abandoned sites = ripe for replacement).

**📧 Email guesses** — for every business with a website, the actor builds plausible email addresses (`info@domain`, `contact@domain`, `hello@domain`, `office@domain`) so you can verify them with Hunter / NeverBounce in seconds.

**🔗 1-click social search URLs** — every lead gets deep links to:
- Facebook search (with quoted business name + city)
- Instagram via `site:instagram.com`
- LinkedIn via `site:linkedin.com/company`
- Google Maps and Google Search

Verify online presence in seconds, no manual searching.

**✍️ Personalised outreach pitch** — auto-generated 2-sentence cold-outreach opener tailored to whether the business has no website / a dead site / a Wix template / a Squarespace site / a clean modern stack. Names the business, mentions the city, references the rating + review count when impressive.

**📋 CSV export ready for HubSpot / Pipedrive** — set `exportFormat: "csv"` and get records with column names like `Company`, `Industry`, `Lead Score`, `Lead Tier`, `Outreach Pitch`. Drop straight into your CRM.

**📊 Lead-score sorting + filter** — results are sorted by `leadScore` descending so the hottest lead is always first. Set `minLeadScore` to drop cold leads. Set `maxResults` to cap cost.

**📈 Aggregate summary record** — every run ends with a `_summary: true` record containing `totalLeads`, `withoutWebsite`, `withDeadWebsite`, `avgLeadScore`, `leadTierBreakdown`, `topTechStacks`. Drop it into a dashboard for trend-tracking.

---

### Why Businesses Without a Website = Hottest Leads

| Signal | What It Means |
|--------|---------------|
| No website | They NEED your web design / development services |
| Dead website | Site is broken or abandoned — ripe for replacement |
| Wix / Weebly / GoDaddy | DIY template — easy upsell to a custom build |
| Listed on YellowPages | They're actively trying to get customers |
| Phone number available | You can call them directly |
| Has reviews but no site | Established business that just needs online presence |
| Category listed | You know exactly what industry they're in |

A plumber with 50 reviews and no website is losing customers every day to competitors who rank on Google. That's your pitch. That's your `on-fire` lead.

---

### Pricing

| Component | Cost |
|-----------|------|
| Actor start | **$0.00005** (one-time per run) |
| Per result | **$0.004** per business |
| 1,000 results | **~$4** |
| 10,000 results | **~$40** |

Enrichment (website checks, email guesses, social URLs, outreach pitch) is **free** — included in the per-result price.

---

### Input Parameters

#### Search

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `category` | string | ✅ | — | Business type: plumbers, restaurants, dentists, lawyers, etc. |
| `location` | string | ✅ | — | City + state: "New York NY", "Miami FL", "Los Angeles CA" |
| `pages` | integer | ❌ | 1 | Pages to scrape, ~30 businesses per page (max: 10) |
| `onlyWithoutWebsite` | boolean | ❌ | false | Only return businesses that have NO website |
| `maxConcurrency` | integer | ❌ | 3 | Parallel YellowPages pages (1–5) |
| `timeout` | integer | ❌ | 120 | Timeout per page in seconds |

#### Enrichment (NEW in v2.0)

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichWebsites` | boolean | true | Detect alive status + tech stack for every lead with a website |
| `enrichEmailGuesses` | boolean | true | Build `info@`, `contact@`, `hello@`, `office@` from website domain |
| `enrichSocialUrls` | boolean | true | Add 1-click search links for Facebook / Instagram / LinkedIn / Maps |
| `includeOutreachPitch` | boolean | true | Auto-write a personalised cold-outreach opener |
| `minLeadScore` | integer | 0 | Drop leads below this score (0-100). Tiers: cold <35, warm 35-54, hot 55-74, on-fire 75+ |
| `maxResults` | integer | 0 | Hard cap, applied after sorting by leadScore. 0 = no cap |
| `exportFormat` | enum | "default" | `default` (full JSON), `csv` (flat HubSpot/Pipedrive columns), or `both` |

---

### Example Inputs

#### Web agency targeting hot leads in New York

```json
{
    "category": "plumbers",
    "location": "New York NY",
    "pages": 3,
    "onlyWithoutWebsite": true,
    "minLeadScore": 50,
    "exportFormat": "csv"
}
````

#### Find dentists running on Wix or GoDaddy in LA (replacement targets)

```json
{
    "category": "dentists",
    "location": "Los Angeles CA",
    "pages": 5,
    "enrichWebsites": true,
    "minLeadScore": 35
}
```

#### Bulk outreach list — sorted, capped, with pitches

```json
{
    "category": "restaurants",
    "location": "Miami FL",
    "pages": 10,
    "maxResults": 100,
    "exportFormat": "csv"
}
```

***

### Output Example

```json
{
    "Business Name": "Local Plumbing NYC",
    "Phone": "(718) 508-4834",
    "Address": "1 Chase Manhattan Plz, New York, NY 10005",
    "City": "New York",
    "State": "NY",
    "Rating": 4.5,
    "Reviews Count": 12,
    "Category": "Plumbers",
    "Website": "",
    "Email": "",
    "Hours": "Mon-Fri 8am-6pm",
    "Years in Business": "27 Years",
    "Listing URL": "https://www.yellowpages.com/...",

    "hasWebsite": false,
    "websiteAlive": null,
    "websiteStatus": null,
    "websiteTechStack": [],
    "websiteSslValid": null,

    "emailGuesses": [],
    "socialSearchUrls": {
        "facebook":     "https://www.facebook.com/search/top?q=%22Local+Plumbing+NYC%22+New+York",
        "instagram":    "https://www.google.com/search?q=%22Local+Plumbing+NYC%22+New+York+site%3Ainstagram.com",
        "linkedin":     "https://www.google.com/search?q=%22Local+Plumbing+NYC%22+New+York+site%3Alinkedin.com%2Fcompany",
        "googleMaps":   "https://www.google.com/maps/search/Local+Plumbing+NYC+1+Chase+Manhattan+Plz",
        "googleSearch": "https://www.google.com/search?q=%22Local+Plumbing+NYC%22+New+York"
    },

    "leadScore": 73,
    "leadTier": "hot",
    "leadScoreReasons": [
        "no website (highest-value lead for web agencies)",
        "active business (12 reviews)",
        "high rating (4.5★)",
        "27 years in business — stable"
    ],
    "outreachPitch": "Hi Local Plumbing NYC — noticed you're listed on YellowPages as a Plumber in New York with 12 reviews averaging 4.5★, but you don't have a website yet. I help local businesses go from zero to a Google-ranked site in under 2 weeks. Worth a 10-min chat?"
}
```

#### CSV-format output (when `exportFormat: "csv"`)

```json
{
    "Company": "Local Plumbing NYC",
    "Phone": "(718) 508-4834",
    "Email": "info@localplumbingnyc.com",
    "Website": "",
    "Address": "1 Chase Manhattan Plz",
    "City": "New York",
    "State": "NY",
    "Industry": "Plumbers",
    "Lead Score": 73,
    "Lead Tier": "hot",
    "Has Website": "No",
    "Website Alive": "",
    "Tech Stack": "",
    "Rating": 4.5,
    "Review Count": 12,
    "Years in Business": "27 Years",
    "Hours": "Mon-Fri 8am-6pm",
    "Listing URL": "https://www.yellowpages.com/...",
    "Google Search": "...",
    "Google Maps": "...",
    "Facebook Search": "...",
    "Instagram Search": "...",
    "LinkedIn Search": "...",
    "Email Guesses": "info@...; contact@...; hello@...; office@...",
    "Outreach Pitch": "Hi Local Plumbing NYC — noticed you're listed on YellowPages...",
    "Lead Score Reasons": "no website; active business (12 reviews); high rating (4.5★); 27 years in business — stable"
}
```

#### Aggregate summary record (always last)

```json
{
    "_summary": true,
    "totalLeads": 100,
    "withoutWebsite": 47,
    "withDeadWebsite": 8,
    "avgLeadScore": 56.3,
    "leadTierBreakdown": {
        "cold": 12,
        "warm": 31,
        "hot": 39,
        "on-fire": 18
    },
    "topTechStacks": [
        ["Wix", 12],
        ["WordPress", 8],
        ["GoDaddy", 6],
        ["Squarespace", 4]
    ],
    "category": "plumbers",
    "location": "New York NY"
}
```

***

### Use Cases

#### 🌐 Web Design & Development Agencies

Find businesses with no website (`leadScore` typically 60+) or running on DIY templates (Wix / GoDaddy). The `outreachPitch` field gives you a ready-to-send opener; `Tech Stack` tells you what they're stuck on.

#### 📈 SEO & Digital Marketing Services

Filter `minLeadScore: 50` for established businesses with thin online presence. Use `socialSearchUrls` to verify nobody's running their Facebook page either.

#### 📞 Cold Calling & Sales Teams

`exportFormat: "csv"` drops straight into HubSpot or Pipedrive. Sort by `Lead Tier`, work the `on-fire` and `hot` segments first.

#### 🏗️ Lead-Routing Automation

Pipe the dataset to Make / Zapier / n8n. Route `on-fire` (score ≥75) to your top closer, `warm` to junior reps, ignore `cold`.

#### 📊 Market Research

Run with `pages: 10` across multiple cities, then aggregate the `_summary` records to see which markets have the most opportunity (highest % no-website, lowest avg lead score = lowest competition for your services).

#### 🔧 Maintenance & Hosting Pitches

Filter by `websiteAlive: false` — these businesses are paying for a domain but the site is broken. Easy "we'll fix it for $X/mo" close.

***

### How Lead Score Works

A composite 0-100 signal. Higher = hotter for outreach.

| Signal | Points |
|--------|--------|
| **No website** | +40 |
| **Website unreachable / dead** | +25 |
| **DIY builder (Wix / Weebly / GoDaddy / WordPress.com)** | +15 |
| **Squarespace** | +10 |
| **100+ reviews** | +15 |
| **30-99 reviews** | +10 |
| **5-29 reviews** | +5 |
| **Rating ≥ 4.0★** | +10 |
| **Rating 3.0-3.9★** | +5 |
| **Address present** | +3 |
| **Hours present** | +3 |
| **10+ years in business** | +5 |
| **3-9 years in business** | +2 |
| **No phone number** | -20 (penalty) |

Score is clamped to 0-100. Tiers:

- **Cold** (0-34): Skip or batch-send only
- **Warm** (35-54): Standard outreach pace
- **Hot** (55-74): Priority outreach, personalise heavily
- **On-fire** (75+): Same-day call, top closer

***

### How Outreach Pitch Works

Tailored to the strongest signal detected:

| Detected condition | Pitch angle |
|---|---|
| **No website** | "I help local businesses go from zero to a Google-ranked site in under 2 weeks" |
| **Website dead** | "Customers searching for {category}s in {city} are bouncing. I can fix that this week" |
| **Wix / Weebly / GoDaddy / WordPress.com** | "We've helped {category}s in {city} convert 2-3× more leads by moving off DIY templates" |
| **Squarespace** | "Your Squarespace site looks clean, but I noticed a few SEO blockers... Free 5-min audit" |
| **Modern stack** | Generic lead-gen — "I help businesses like yours generate 5-10 extra leads a month" |

Every pitch includes the business name + city, and references rating + review count when ≥20 reviews and ≥4.0★.

***

### How Tech Stack Detection Works

For every lead with a website, the actor:

1. Sends a HEAD request to the URL (8s timeout)
2. Falls back to GET if HEAD is rejected (some servers return 405/501)
3. Reads response headers + first 50 KB of HTML
4. Pattern-matches against 12 platforms

Detected: **Wix, Squarespace, WordPress, Shopify, Webflow, GoDaddy, Weebly, WordPress.com, Joomla, Drupal, ClickFunnels, GoHighLevel**.

Adds ~1-2 seconds per lead with a website. Disable via `enrichWebsites: false` if you want a faster, cheaper run.

***

### Tips for Best Results

- **Start with `onlyWithoutWebsite: true`** — focus on the `+40` no-website bonus
- **Then expand to `minLeadScore: 35`** — pulls in dead sites + DIY builders
- **Use `exportFormat: "csv"`** — instant Pipedrive / HubSpot import
- **Run multiple cities in parallel runs** — each run is one (category, city) pair
- **Combine with email verification** — `emailGuesses[]` are guesses, run them through Hunter or NeverBounce before mass-sending

***

### Popular Categories to Search

| Category | Why It Works |
|----------|-------------|
| Plumbers | High-value services, local SEO is critical |
| Electricians | Emergency services, need to be found fast |
| Restaurants | Online menus and ordering are essential |
| Dentists | Patients search online before booking |
| Lawyers | High-value clients, competitive market |
| Auto Repair | Local trust-based business |
| Landscaping | Seasonal demand, need online visibility |
| Cleaning Services | Growing market, low online competition |
| HVAC | Emergency services, local search dominant |
| Real Estate Agents | Online presence is everything |

***

### FAQ

**Q: How many businesses can I get per run?**
A: Each YellowPages page returns ~30 businesses. With `pages: 10` you get up to 300 raw → ~250-300 after dedup. Use `maxResults` to cap cost.

**Q: Does enrichment add to the cost?**
A: No. The website checks, email guesses, social URLs and outreach pitch are all included in the $4/1K price. You only pay per successfully-returned lead.

**Q: How accurate is tech stack detection?**
A: Very accurate for the 12 supported platforms — they all have unique CDN domains, header signatures, or HTML patterns. Doesn't detect every CMS in the world (no React framework detection, no custom-built sites), but covers ~70% of small-business websites.

**Q: How accurate are the email guesses?**
A: They're guesses, not verified. The patterns (`info@`, `contact@`, `hello@`, `office@`) work on roughly 30-50% of small business domains. Always verify before mass-sending.

**Q: Does it work outside the US?**
A: YellowPages.com covers US businesses. For other countries, check if they have a local YellowPages equivalent.

**Q: Can I disable the new enrichment fields?**
A: Yes — set `enrichWebsites: false`, `enrichEmailGuesses: false`, `enrichSocialUrls: false`, `includeOutreachPitch: false` to get the v1.x output shape exactly.

**Q: How is leadScore calculated when fields are missing?**
A: Each signal is independent. If there's no rating, no review count points. If there's no website, the `+40` bonus fires. Missing data simply doesn't add points — it doesn't break the calculation.

**Q: What's `leadTier: "on-fire"`?**
A: `leadScore >= 75`. Typically: no website + 100+ reviews + 4.0+★ + 10+ years in business + phone present. These are your same-day-call leads.

***

### Integration Ideas

- **CRM import** — `exportFormat: "csv"` → push to HubSpot, Salesforce, Pipedrive, Close
- **Cold calling** — sort by `Lead Tier`, distribute by `Lead Score` to reps
- **Email outreach** — combine `emailGuesses` with Hunter/NeverBounce verification
- **Slack alerts** — webhook on `_summary` records when `withoutWebsite > 50`
- **Make / Zapier / n8n** — route `on-fire` leads to top closers, `warm` to juniors
- **Power BI / Looker** — chart `topTechStacks` over time to spot platform trends

# Actor input Schema

## `category` (type: `string`):

Type of business to search for. Examples: plumbers, restaurants, dentists, auto-repair, lawyers, hair-salons.

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

City and state. Examples: 'New York NY', 'Los Angeles CA', 'Chicago IL', 'Miami FL'.

## `pages` (type: `integer`):

Number of result pages to scrape (each page ~30 businesses).

## `onlyWithoutWebsite` (type: `boolean`):

If true, only return businesses that don't have a website (the hottest leads for web agencies).

## `maxConcurrency` (type: `integer`):

Number of YellowPages pages to scrape in parallel.

## `timeout` (type: `integer`):

Maximum time to wait for each YellowPages page.

## `enrichWebsites` (type: `boolean`):

For every lead with a website, do a quick HEAD/GET to detect: alive status, SSL validity, tech stack (Wix, WordPress, Shopify, Squarespace, GoDaddy, Webflow, Weebly, Joomla, Drupal, ClickFunnels, GoHighLevel), real emails (from mailto: links + page text), and phone numbers (from tel: links + page text). Adds ~1-2 sec per lead with a website.

## `enrichEmailGuesses` (type: `boolean`):

Generate plausible email addresses (info@, contact@, hello@, office@) from the business website domain. Use these as fallback when no real email is scraped. Verify with a tool like Hunter or NeverBounce before sending.

## `enrichSocialUrls` (type: `boolean`):

Add 1-click search links for Facebook, Instagram, LinkedIn, Google Maps and Google search — useful to verify online presence in seconds.

## `includeOutreachPitch` (type: `boolean`):

Auto-write a personalised cold-outreach opener (~2 sentences) tailored to whether the business has no website / a dead site / a Wix template / etc.

## `enrichBrandAge` (type: `boolean`):

For leads with a website, query the Wayback Machine for the earliest archived snapshot. An established brand (5+ years online) with a dead site is a prime replacement target — gets a +10 leadScore bonus.

## `enrichGeocode` (type: `boolean`):

Resolve every business address to lat/lng coordinates via OpenStreetMap Nominatim. Useful for territory routing in CRMs or plotting on a map. Off by default because Nominatim asks for ≤1 req/sec, so this slows runs by ~1s per lead.

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

Drop national chains and franchises (Roto-Rooter, Aamco, Subway, Domino's, Great Clips, Anytime Fitness, RE/MAX, Servpro, Verizon, AT\&T, ~50 brands matched by name). Most agencies skip these because corporate marketing controls the spend.

## `minLeadScore` (type: `integer`):

Drop leads below this composite score. Score combines: no-website bonus, website-on-DIY-builder, dead-website, review count, rating, years in business. Tiers: cold <35, warm 35-54, hot 55-74, on-fire 75+.

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

Hard cap on returned leads, applied after lead-score sorting. 0 = no cap. Use this to keep cost predictable.

## `exportFormat` (type: `string`):

Output shape. 'default' = full JSON. 'csv' = flat record with HubSpot/Pipedrive-friendly column names. 'both' = full JSON plus a nested '\_csv' field.

## Actor input object example

```json
{
  "category": "plumbers",
  "location": "New York NY",
  "pages": 1,
  "onlyWithoutWebsite": false,
  "maxConcurrency": 3,
  "timeout": 120,
  "enrichWebsites": true,
  "enrichEmailGuesses": true,
  "enrichSocialUrls": true,
  "includeOutreachPitch": true,
  "enrichBrandAge": true,
  "enrichGeocode": false,
  "excludeChains": false,
  "minLeadScore": 0,
  "maxResults": 0,
  "exportFormat": "default"
}
```

# 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 = {
    "category": "plumbers",
    "location": "New York NY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/local-business-lead-finder-pro").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 = {
    "category": "plumbers",
    "location": "New York NY",
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/local-business-lead-finder-pro").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 '{
  "category": "plumbers",
  "location": "New York NY"
}' |
apify call apivault_labs/local-business-lead-finder-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=apivault_labs/local-business-lead-finder-pro",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Local Lead Finder Pro | $4/1K | Lead Score, Tech Stack, Pitch",
        "description": "Premium lead finder for web agencies and SDR teams. Scrape YellowPages and auto-enrich every lead with a 0-100 lead score, website tech stack (Wix/WordPress/Shopify), real emails, phone E.164, mobile + SEO audit, and an outreach pitch. CSV export for HubSpot/Pipedrive. 30+ fields per lead.",
        "version": "1.0",
        "x-build-id": "onRruiS4hA1rm6bxm"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apivault_labs~local-business-lead-finder-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apivault_labs-local-business-lead-finder-pro",
                "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/apivault_labs~local-business-lead-finder-pro/runs": {
            "post": {
                "operationId": "runs-sync-apivault_labs-local-business-lead-finder-pro",
                "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/apivault_labs~local-business-lead-finder-pro/run-sync": {
            "post": {
                "operationId": "run-sync-apivault_labs-local-business-lead-finder-pro",
                "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": [
                    "category",
                    "location"
                ],
                "properties": {
                    "category": {
                        "title": "Business Category",
                        "type": "string",
                        "description": "Type of business to search for. Examples: plumbers, restaurants, dentists, auto-repair, lawyers, hair-salons."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City and state. Examples: 'New York NY', 'Los Angeles CA', 'Chicago IL', 'Miami FL'."
                    },
                    "pages": {
                        "title": "Pages to Scrape",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of result pages to scrape (each page ~30 businesses).",
                        "default": 1
                    },
                    "onlyWithoutWebsite": {
                        "title": "Only Without Website",
                        "type": "boolean",
                        "description": "If true, only return businesses that don't have a website (the hottest leads for web agencies).",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of YellowPages pages to scrape in parallel.",
                        "default": 3
                    },
                    "timeout": {
                        "title": "Timeout (seconds)",
                        "minimum": 30,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Maximum time to wait for each YellowPages page.",
                        "default": 120
                    },
                    "enrichWebsites": {
                        "title": "Check websites (alive + tech stack + emails + phones)",
                        "type": "boolean",
                        "description": "For every lead with a website, do a quick HEAD/GET to detect: alive status, SSL validity, tech stack (Wix, WordPress, Shopify, Squarespace, GoDaddy, Webflow, Weebly, Joomla, Drupal, ClickFunnels, GoHighLevel), real emails (from mailto: links + page text), and phone numbers (from tel: links + page text). Adds ~1-2 sec per lead with a website.",
                        "default": true
                    },
                    "enrichEmailGuesses": {
                        "title": "Generate email guesses",
                        "type": "boolean",
                        "description": "Generate plausible email addresses (info@, contact@, hello@, office@) from the business website domain. Use these as fallback when no real email is scraped. Verify with a tool like Hunter or NeverBounce before sending.",
                        "default": true
                    },
                    "enrichSocialUrls": {
                        "title": "Build social search URLs",
                        "type": "boolean",
                        "description": "Add 1-click search links for Facebook, Instagram, LinkedIn, Google Maps and Google search — useful to verify online presence in seconds.",
                        "default": true
                    },
                    "includeOutreachPitch": {
                        "title": "Generate outreach pitch",
                        "type": "boolean",
                        "description": "Auto-write a personalised cold-outreach opener (~2 sentences) tailored to whether the business has no website / a dead site / a Wix template / etc.",
                        "default": true
                    },
                    "enrichBrandAge": {
                        "title": "Detect brand age (via Wayback Machine)",
                        "type": "boolean",
                        "description": "For leads with a website, query the Wayback Machine for the earliest archived snapshot. An established brand (5+ years online) with a dead site is a prime replacement target — gets a +10 leadScore bonus.",
                        "default": true
                    },
                    "enrichGeocode": {
                        "title": "Geocode addresses (lat/lng via OpenStreetMap)",
                        "type": "boolean",
                        "description": "Resolve every business address to lat/lng coordinates via OpenStreetMap Nominatim. Useful for territory routing in CRMs or plotting on a map. Off by default because Nominatim asks for ≤1 req/sec, so this slows runs by ~1s per lead.",
                        "default": false
                    },
                    "excludeChains": {
                        "title": "Exclude corporate chains / franchises",
                        "type": "boolean",
                        "description": "Drop national chains and franchises (Roto-Rooter, Aamco, Subway, Domino's, Great Clips, Anytime Fitness, RE/MAX, Servpro, Verizon, AT&T, ~50 brands matched by name). Most agencies skip these because corporate marketing controls the spend.",
                        "default": false
                    },
                    "minLeadScore": {
                        "title": "Minimum lead score (0-100)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Drop leads below this composite score. Score combines: no-website bonus, website-on-DIY-builder, dead-website, review count, rating, years in business. Tiers: cold <35, warm 35-54, hot 55-74, on-fire 75+.",
                        "default": 0
                    },
                    "maxResults": {
                        "title": "Max results (after enrichment + sorting)",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on returned leads, applied after lead-score sorting. 0 = no cap. Use this to keep cost predictable.",
                        "default": 0
                    },
                    "exportFormat": {
                        "title": "Export format",
                        "enum": [
                            "default",
                            "csv",
                            "both"
                        ],
                        "type": "string",
                        "description": "Output shape. 'default' = full JSON. 'csv' = flat record with HubSpot/Pipedrive-friendly column names. 'both' = full JSON plus a nested '_csv' field.",
                        "default": "default"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
