# Local Business Lead Finder (`livable_stonework_1wd/local-business-lead-finder`) Actor

Find local businesses worldwide, then verify them: MX emails, live vs parked websites, E.164 phones, 0-100 score. Pay per delivered lead on Apify.

- **URL**: https://apify.com/livable\_stonework\_1wd/local-business-lead-finder.md
- **Developed by:** [Lomo Dev](https://apify.com/livable_stonework_1wd) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does Local Business Lead Finder do?

Turn any **city + niche** into a **verified** list of businesses — phone that formats, website that actually loads, email whose domain can receive mail — ready for outbound, agencies, and investor market maps.

This Actor is a **Google Maps lead API alternative** that does not fight Google. It reads [OpenStreetMap](https://www.openstreetmap.org) (worldwide, no login), **visits each business website** for public emails and socials, then **auto-verifies every row** before you pay for it.

**Austin dentists. Miami HVAC. London gyms. Same run. Dead domains never make the export.**

Export CSV, Excel, JSON, or HTML. Schedule it. Call it from n8n, Make, Clay, or your own API.

***

### How lead verification is automated

Raw lists get refunds. This Actor runs a four-check pipeline on every row **before** it hits your dataset. You are charged only for leads that survive.

| Check | What the Actor does | Why a buyer cares |
| --- | --- | --- |
| **Email** | Syntax + disposable-domain block + **MX lookup** + domain-matches-website | Stops the majority of instant bounces before Instantly / Smartlead ever sees them |
| **Website** | HTTP probe, HTTPS, title, **parking / for-sale / coming-soon** detection | You do not pitch a business that shut down last year |
| **Phone** | Digit rules, NANP / E.164, UK/AU/DE/FR trunk prefixes | SDRs do not waste dials on `555` junk or 4-digit stubs |
| **Score** | Composite **0–100** → `verified` / `likely` / `unverified` / `dead` | Sort hottest first. Filter `onlyVerified` or `minScore: 70` |

**What “verified” means here (honest):**

- `emailMx: true` → the **domain can receive mail**. It is not a mailbox-exists guarantee (SMTP ping looks like spam and is blocked by most hosts).
- `phoneE164` → the number **is a real-world format** for that country. It is not a “this line rings” carrier lookup.
- `websiteStatus: live` → the site **returned a real page**, not a parked / expired / for-sale shell.

That is the same bar agencies use to sell a list at 5–10× a raw Maps dump. Carrier-level phone lookup (Twilio) and mailbox-level email (NeverBounce / ZeroBounce) are optional paid add-ons later — not required to ship a list someone will buy.

#### Toggles that control quality

| Input | Default | Effect |
| --- | --- | --- |
| Verify emails, websites, and phones | **on** | Runs the pipeline above |
| Drop dead leads | **on** | Parked / unreachable rows never leave the dataset (and are not billed) |
| Only verified leads | off | Keep `verificationStatus = verified` only |
| Minimum verification score | 0 | e.g. `70` ≈ verified-only, `45` ≈ likely + verified |

Turn **Visit websites** on (default) so email + parking checks have a real HTML page to read. Verification still MX-checks and probes sites if enrichment was skipped.

***

### Why use Local Business Lead Finder?

Most “Maps scrapers” give you a name and a pin. Your SDRs still have to open 200 tabs to find an email, then bounce half of them. This Actor closes that gap.

**You get outreach-ready, scored rows — not raw HTML.**

- Any city on earth — US, UK, EU, AU, CA, and beyond
- 40+ niches: dentists, HVAC, lawyers, gyms, hotels, salons, clinics, and more
- Public **phones** from OSM + `tel:` links, normalized to **E.164**
- Public **emails** from homepage and contact pages, **MX-checked**
- Instagram, Facebook, LinkedIn, X, YouTube, TikTok when they are linked
- Deduped, scored, filterable (`only with phone` / `only with email` / `only verified`)
- Runs on Apify: **schedules, webhooks, API, integrations, monitoring**

#### Who buys this data

| Buyer | What they do with it |
| --- | --- |
| Marketing / SEO agencies | Resell weekly **verified** local lists |
| SDR / outbound teams | Dial and email a fresh niche in a new metro without bounce spikes |
| Insurance, solar, home services | Call lists by trade that still exist |
| Recruiters | Employers in a city with a live site |
| Founders / operators | Count **live** competitors before opening a location |

If you already sell “leads,” this is your factory. Verification is the reason a client does not churn.

***

### What data can Local Business Lead Finder extract?

| Field | Type | Why it matters |
| --- | --- | --- |
| name | text | Business to contact |
| nicheLabel | text | Human-readable niche |
| phone | text | Original phone string |
| phoneE164 | text | Dialer-ready `+15124747575` |
| email | text | First public inbox found |
| emails | array | All public inboxes on the site |
| emailMx | boolean | Domain has MX records |
| emailDomainMatch | boolean | Inbox is on the same domain as the website |
| website | link | Landing page for personalization |
| websiteStatus | text | `live` / `parking` / `dead` / `unknown` |
| verificationScore | number | 0–100 composite |
| verificationStatus | text | `verified` / `likely` / `unverified` / `dead` |
| verificationNotes | array | Why the score landed there |
| address, city, state, postcode | text | Routing and territory |
| facebook, instagram, linkedin, twitter | link | Social / creative intel |
| lat, lon | number | Maps and distance |
| hasPhone, hasWebsite, hasEmail | boolean | Fast filters in Sheets |
| osmId | text | Stable id for refreshes |

You can download the dataset as **JSON, CSV, Excel, or HTML**. Open the **Verified** view in the Output tab to sort by score.

***

### How to scrape (and verify) local business leads

1. Click **Try for free**
2. Set **City / location** — `Austin, TX, USA` or `Manchester, UK`
3. Pick a **Niche** — Dentist, HVAC, Lawyer, Gym…
4. Set **Max leads** (start with 50)
5. Leave **Visit websites for emails & socials** on
6. Leave **Verify** and **Drop dead leads** on
7. Hit **Start** and wait for the green run
8. Open **Output → Verified** and export CSV

That’s it. No cookies, no Google account, no selector guessing.

#### Typical first runs

- `dentist` + `Austin, TX, USA` + 50 leads
- `hvac` + `Phoenix, AZ, USA` + only with phone
- `lawyer` + `London, UK` + only verified
- `gym` + `Miami, FL, USA` + min score 70

***

### How much will it cost to scrape local businesses?

Pricing is **pay-per-event on Apify** — the customer’s Apify account is billed. You do not need Stripe, invoices, or a separate checkout.

| Event | What it is | Price |
| --- | --- | --- |
| **Verified lead** (`lead`) | One row that survived verification and was written to the dataset | **$0.012** |

Dead / parked / filtered rows are **not billed**. Platform compute is covered by the event price (not charged on top).

| Run | You pay Apify | What you get |
| --- | --- | --- |
| 50 leads (one city sample) | **~$0.60** | Outreach-ready CSV |
| 200 leads | **~$2.40** | A week of SDR dialing |
| 500 leads (metro list) | **~$6.00** | Agency-resellable sheet |

Set a **max total charge** on the run if you want a hard cap. The Actor stops delivering when that cap is hit.

Turn **Only verified** or **Min score 70** on so you never pay for a row you would delete.

The Apify free / trial credits are enough to demo a city. Larger plans unlock weekly schedules.

**Author payout:** Apify keeps 20% of event revenue and subtracts compute from your 80%. Default RAM is 1 GB so compute stays tiny next to the $0.012 lead fee.

***

### Input

See the **Input** tab for the full form. The fields that matter:

- **City / location** — include region and country
- **Niche** — dropdown of 40+ OSM-mapped categories
- **Max leads** — 1 to 1,000
- **Search radius** — default 12 km; use 25–40 for large metros
- **Visit websites** — on by default; this is how emails appear
- **Verify** / **Drop dead leads** / **Only verified** / **Min score** — quality gates
- **Custom OSM tags** — optional power user, e.g. `amenity=clinic`
- **Proxy** — optional, only for website visits

***

### Output

Every run writes one dataset row per business, highest score first. Example:

```json
[
  {
    "name": "Barton Hills Dental",
    "nicheLabel": "Dentist",
    "phone": "+1 512-555-0142",
    "phoneE164": "+15125550142",
    "email": "hello@exampledental.com",
    "emailMx": true,
    "emailDomainMatch": true,
    "website": "https://exampledental.com",
    "websiteStatus": "live",
    "verificationScore": 96,
    "verificationStatus": "verified",
    "address": "2410 Barton Hills Dr",
    "city": "Austin",
    "state": "TX",
    "instagram": "https://www.instagram.com/exampledental",
    "hasPhone": true,
    "hasEmail": true
  }
]
```

Download JSON, CSV, Excel, or HTML from the Output tab, or pull it via the Dataset API.

***

### How to use the leads API

After a run:

```http
GET https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv
```

Or start a run from n8n / Make / Clay with:

```json
{
  "location": "Austin, TX, USA",
  "category": "dentist",
  "maxResults": 50,
  "enrichContacts": true,
  "verifyLeads": true,
  "dropDeadLeads": true,
  "onlyVerified": false,
  "minScore": 0
}
```

Schedule it weekly. Same city, fresh phones. Diff on `osmId`. Pipe the dataset webhook into HubSpot / Clay / a Google Sheet. That is daily distribution: one Actor schedule, every morning, verified rows only.

***

### Tips

- **Coverage follows OpenStreetMap.** Dense US/EU downtowns are excellent. Sparse rural areas return fewer rows — increase radius or pick a larger town.
- **Emails come from public websites**, not from a magic inbox database. No website → no email. Filter with “only with website” when you need inboxes.
- **MX ≠ inbox exists.** A domain with MX can still have a typo local-part. Domain-match emails (`hello@theirdomain.com`) are the hottest.
- **Start without a proxy.** Add Apify Proxy only if website enrichment gets blocked.
- **Deduped by name + address.** Safe to re-run a city next month and diff on `osmId`.
- **Custom tags** let you chase niches not in the dropdown (`shop=hearing_aids`, `amenity=clinic`).

***

### FAQ, disclaimers, and support

#### Is this a Google Maps scraper?

No. It does not open Google Maps. It uses OpenStreetMap plus the businesses’ own public websites. That is why it is stable, worldwide, and cheaper than cookie-heavy Maps Actors.

#### Will every row have an email?

No — only when the business publishes one. Use **Only leads with an email** or **Only verified** if you want a shorter, hotter list.

#### Does verification call the phone or send a test email?

No. Phone is format / E.164. Email is syntax + MX. Website is an HTTP GET. Nothing is placed in a mailbox and no carrier is billed.

#### Can I use this for cold email?

Only with a legitimate interest and in line with CAN-SPAM, GDPR, and local rules. This Actor collects **public business contact details**, not private personal inboxes.

> Our Actors extract what businesses have chosen to publish on OpenStreetMap and on their public websites (name, address, phone, website, public email, public social links). They do not log into accounts, bypass paywalls, or scrape private user profiles. Results may still contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not use this data unless you have a legitimate reason. If you are unsure, consult your lawyers.

#### Something missing in my city?

OpenStreetMap coverage varies. Try a larger radius, a broader niche, or custom tags. If a run fails, open the **Issues** tab on this Actor with the city and niche you used.

#### Need it programmatically?

Use the **API** tab in the Console. Auth with your Apify token, pass the JSON input above, and poll the dataset.

Built for people who sell lists, book calls, or decide where to open next — not for people who want another HTML dump.

# Actor input Schema

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

City to search. Include region and country for best results, e.g. Austin, TX, USA or London, UK.

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

Business type to extract. Each niche maps to OpenStreetMap tags used worldwide.

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

Maximum number of businesses to return (1–1000).

## `radiusKm` (type: `integer`):

How far from the city center to search. 12 km covers most mid-size cities. Use 25–40 for metro areas.

## `customTags` (type: `string`):

Extra OpenStreetMap filters, comma-separated, e.g. amenity=clinic, healthcare=doctor. Combined with the selected niche.

## `enrichContacts` (type: `boolean`):

Open each business website (and contact page when needed) to collect public emails, extra phones, and social profiles. Turn off for a faster Maps-style dump.

## `onlyWithPhone` (type: `boolean`):

Drop businesses that have no phone number.

## `onlyWithWebsite` (type: `boolean`):

Drop businesses that have no website.

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

Keep rows that include a public email. Requires website enrichment.

## `verifyLeads` (type: `boolean`):

MX-check emails, probe websites (live vs parked vs dead), normalize phones to E.164, and score every row 0–100. On by default — this is how dead leads get dropped.

## `dropDeadLeads` (type: `boolean`):

Remove parked domains, dead websites with no valid phone, and unreachable rows. You are not charged for dropped rows.

## `onlyVerified` (type: `boolean`):

Keep rows with verificationStatus = verified (valid phone or MX email, live site, high score). Stricter than Drop dead leads.

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

Drop rows below this 0–100 score. 0 = keep all surviving rows. 70 ≈ verified-only. 45 ≈ likely + verified.

## `proxyConfiguration` (type: `object`):

Optional. Used only when visiting business websites. OpenStreetMap queries do not use a proxy.

## Actor input object example

```json
{
  "location": "Austin, TX, USA",
  "category": "dentist",
  "maxResults": 50,
  "radiusKm": 12,
  "enrichContacts": true,
  "onlyWithPhone": false,
  "onlyWithWebsite": false,
  "onlyWithEmail": false,
  "verifyLeads": true,
  "dropDeadLeads": true,
  "onlyVerified": false,
  "minScore": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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": "Austin, TX, USA",
    "category": "dentist",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("livable_stonework_1wd/local-business-lead-finder").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": "Austin, TX, USA",
    "category": "dentist",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("livable_stonework_1wd/local-business-lead-finder").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 '{
  "location": "Austin, TX, USA",
  "category": "dentist",
  "maxResults": 50
}' |
apify call livable_stonework_1wd/local-business-lead-finder --silent --output-dataset

```

## MCP server setup

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

```

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/MyWeWxLibgwGTohww/builds/o3mIdwek9Y8N5JHgH/openapi.json
