# Local Business Lead Qualifier (`iqrashehzad01/local-business-lead-qualifier`) Actor

Finds local service businesses that are busy but still run everything manually. Checks each website for booking software, live chat, and CRM, then scores it against review volume. High scores mean real demand with no automation in place, so you stop pitching people who already bought.

- **URL**: https://apify.com/iqrashehzad01/local-business-lead-qualifier.md
- **Developed by:** [Iqra Shehzad](https://apify.com/iqrashehzad01) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Local Business Lead Qualifier

Find local service businesses that are busy but still running everything by hand.

Most lead scrapers hand you a list of names and phone numbers. That list is the same list everyone else has. This Actor does the part that comes after: it visits each business website and works out whether they have already solved the problem you are about to sell them.

### What it does

1. Pulls businesses from Google Maps for your search term
2. Visits each website
3. Checks for booking software, live chat, CRM tracking pixels, contact forms, click to call, and mobile layout
4. Combines that with review count and rating
5. Gives each business a readiness score from 0 to 100

A high score means two things at once. The business has real demand, and it has no automation in place. Those are the ones worth contacting.

A plumber with 200 reviews and a Calendly booking link scores low. They already bought. A plumber with 200 reviews and a contact form from 2016 scores high.

### What makes this different

Most lead scrapers stop at the website. Two things they miss:

**Franchise locations.** A Mr. Rooter or Roto-Rooter location cannot buy your
software. The franchisor picks the stack. This Actor detects franchises by
brand and by site language, flags them, and drops their score. Turn on
`skipFranchises` to remove them completely.

**The phone line.** Supply a Veriphone key and every lead gets a line type.
A landline means someone sits at a desk. A mobile means the owner answers it
himself. VoIP means they already modernised their phone system. Three
completely different sales conversations, and nothing else on the Store
tells you which one you are walking into. Veriphone's free tier covers 1000
lookups a month.

### Example output

```json
{
  "name": "Riverside Plumbing",
  "website": "https://riversideplumbing.com",
  "phone": "+12565550142",
  "category": "Plumber",
  "reviews": 187,
  "rating": 4.7,
  "readiness_score": 74,
  "demand_score": 0.93,
  "automation_gap": 0.8,
  "why": "187 reviews but no online booking, live chat, a CRM.",
  "booking_tools": [],
  "chat_tools": [],
  "crm_tools": [],
  "has_contact_form": true,
  "has_click_to_call": false,
  "mobile_ready": true,
  "copyright_year": 2019
}
```

### Input

| Field | What it does |
|---|---|
| `searchQuery` | Google Maps search, e.g. `roofers in Nashville TN` |
| `maxResults` | How many businesses to pull and score |
| `minReviews` | Skip anything below this review count |
| `minScore` | Only return businesses at or above this readiness score |
| `businesses` | Optional. Score your own list instead of searching |

### Who this is for

- Agencies selling booking systems, chatbots, or CRM setups
- Software companies selling to home service businesses
- Anyone doing cold outreach who is tired of contacting people who already bought

### Pricing

You are charged per qualified lead returned, not per business checked. If a business does not pass your `minReviews` and `minScore` filters, it costs you nothing.

### Notes

- Websites that do not load are scored as maximum gap. A business with 150 reviews and a dead website is a real signal, not an error.
- Fingerprint detection reads publicly served page markup. It does not log in anywhere or bypass anything.
- Requests are batched with a pause between them so no website gets hammered.

### Support

Open an issue on the Actor page and I will get back to you.

# Actor input Schema

## `searchQuery` (type: `string`):

What to look for on Google Maps. Example: plumbers in Huntsville AL

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

How many businesses to pull and score.

## `minReviews` (type: `integer`):

Skip businesses with fewer reviews than this. Low review counts usually mean low demand.

## `minScore` (type: `integer`):

Only output businesses scoring at or above this. 0 outputs everything.

## `skipFranchises` (type: `boolean`):

Drop Mr. Rooter, Roto-Rooter and similar. A franchise location does not pick its own software, the franchisor does. Left off, franchises still appear but are flagged and ranked down.

## `veriphoneKey` (type: `string`):

Adds phone line type to every lead. A landline means someone sits at a desk. A mobile means the owner answers it himself. VoIP means they already modernised. The free tier at veriphone.io covers 1000 lookups a month. Leave blank to skip this step.

## `businesses` (type: `array`):

Skip the Google Maps step and score your own list. Each item needs title and website.

## Actor input object example

```json
{
  "searchQuery": "plumbers in Huntsville AL",
  "maxResults": 25,
  "minReviews": 10,
  "minScore": 40,
  "skipFranchises": false
}
```

# 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 = {
    "searchQuery": "plumbers in Huntsville AL"
};

// Run the Actor and wait for it to finish
const run = await client.actor("iqrashehzad01/local-business-lead-qualifier").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 = { "searchQuery": "plumbers in Huntsville AL" }

# Run the Actor and wait for it to finish
run = client.actor("iqrashehzad01/local-business-lead-qualifier").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchQuery": "plumbers in Huntsville AL"
}' |
apify call iqrashehzad01/local-business-lead-qualifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,iqrashehzad01/local-business-lead-qualifier"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EtPJPsdPgHPUorXq8/builds/tGeveN1aRwA2kuhyW/openapi.json
