# Local Business Leads: Emails, Phones & Socials (`clearfeedlabs/local-business-leads`) Actor

Local business leads from open data (Overture Maps, OpenStreetMap): validated phones, graded emails, socials, hours, city-license and open/closed checks. No Google scraping.

- **URL**: https://apify.com/clearfeedlabs/local-business-leads.md
- **Developed by:** [Clearfeed Labs](https://apify.com/clearfeedlabs) (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

from $2.00 / 1,000 base leads

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/actors/running/actors-in-store.md#pay-per-event

## 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 Leads: Emails, Phones & Socials

Find US local businesses by **category + location** and get verified, scored leads: name, full address, coordinates, validated phone, website, graded emails, social profiles, opening hours, an "is it still open?" check and a 0–100 lead score. No Google data, no 120-result cap, and an open data license on every row.

### What makes these leads different

- **Open-or-closed checks (add-on).** Each business website is pinged; dead domains, closed flags and stale records are dropped (or flagged, your choice). In Los Angeles, San Francisco and Seattle, leads are matched to the city's **active business-license** open data.
- **Validated phones.** E.164 format, NANP plausibility check (bad area codes, fictional 555-01xx numbers removed).
- **Graded emails.** DNS/MX deliverability grade per email: A (business's own domain, mail server found), B (mail server found, other or free-mail domain), C (DNS lookup failed). Domains with no mail server are removed. No SMTP probing.
- **Facts from the business's own site.** Opening hours, services, price range and self-published rating, only where the site publishes them as schema.org JSON-LD.
- **Lead score + filter.** One 0–100 score per lead; set `minLeadScore` to keep only the best.
- **Every match in the area.** Set your own cap. No grid splitting.
- **Licensed data.** Each row lists its sources and their licenses.

Measured on 500 leads (dentists, plumbers, restaurants, auto repair, hair salons in Chicago, Austin, Denver, Atlanta and Seattle; Oct 2026): 97% have a phone, 83% a website, 46% an email, 73% a social profile, and 98% an email or phone. Median lead score was 71. A 500-lead run took about 2.5 minutes.

What you don't get: Google star ratings, review counts and photos. Ratings appear only when the business publishes one on its own site, and are labeled as self-published.

### For AI agents & MCP

**What it does:** given business categories and US locations, returns one JSON record per local business from open data (Overture Maps, optionally OpenStreetMap). It can add emails, social profiles, a city-license and open/closed check, and schema.org hours/services read politely from each business's own website.

**When to call it:** "Find dentists in Austin with emails", "List plumbers near 80202", "Get restaurants in Seattle with active business licenses".

**Input (key fields):**

- `categories` and `locations` (arrays, required)
- `radiusKm`, `maxLeadsPerSearch`, `minLeadScore`, `onlyWithContacts`, `closedHandling`
- Add-on switches: `addEmails` and `addSocials` (on by default), `addLicenseCheck` and `addSiteDetails` (off by default)
- `includeOsm`, `contactEnrichment`, `skipPreviouslySeen`

**Output (one item per business):** `title`, `categoryName`, `address`, `location`, `phone` (E.164, validated), `website`, `emails` and `emailDetails` (grade A/B/C), social arrays, `openingHours`, `businessLicense`, `likelyClosed`, `leadScore`, `sources`, `license`, `attribution`, `billedEvents`.

**Cost control:** pass `maxTotalChargeUsd` on the run. The Actor stops cleanly at the cap and never bills an add-on that returned nothing.

### Popular uses

- [Dentist leads in Austin, TX: emails & phones](https://apify.com/clearfeedlabs/local-business-leads/examples/dentist-leads-austin)

Change the category or city in any example to fit your market.

### How it works

1. **Places:** [Overture Maps Places](https://docs.overturemaps.org/), a monthly open dataset built from Meta, Microsoft, Foursquare, AllThePlaces and other sources, read straight from its public release files.
2. **Locations:** "Austin, TX", "Cook County, IL", a ZIP, or "lat,lng" are placed offline with US Census boundary data.
3. **Optional OpenStreetMap:** adds opening hours, wheelchair access and cuisine from the state's Geofabrik extract.
4. **Website check and contacts:** the Actor visits each business's own homepage. When an email or phone is missing, it also reads up to 2 contact or about pages. It honors robots.txt, waits 1 second between requests to the same site, identifies itself, and stops on 401/403/429 or CAPTCHA pages. No proxies, no logins.
5. **City licenses:** LA (CC0), SF (PDDL) and Seattle (public domain) business-license data.
6. **Final pass:** duplicates are removed, then phones are validated, emails graded and each lead scored.

### Input example

```json
{
  "categories": ["dentist", "plumber"],
  "locations": ["Austin, TX", "80202"],
  "maxLeadsPerSearch": 500,
  "onlyWithContacts": true,
  "minLeadScore": 60
}
```

Built-in categories: dentist, plumber, hvac, restaurant, cafe, bar, auto repair, hair salon, nail salon, lawyer, accountant, real estate agent, gym, electrician, roofer, contractor, veterinarian, pharmacy, doctor, hotel, insurance agency, chiropractor, florist, bakery. Any other word is matched against Overture's category taxonomy (e.g. `pet groomer`).

The search area is a circle sized from the city, county or ZIP land area. Set `radiusKm` to change it.

### Output (one row per business)

| Group | Fields |
|---|---|
| Identity and location | `title`, `categoryName`, `categories`, `address`, `street`, `city`, `postalCode`, `state`, `countryCode`, `location {lat,lng}`, `distanceMeters` |
| Phones | `phone`, `phones` (valid, E.164), `phoneValidation` |
| Web and email | `website`, `websiteCheck`, `emails`, `emailDetails` (grade, MX, source) |
| Social profiles | `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks`, `otherSocials` |
| Business details | `openingHours`, `openingHoursSource`, `services`, `priceRange`, `websiteRating`, `schemaOrgTypes`, `wheelchair`, `cuisine`, `brand` |
| Open and fresh | `businessLicense`, `lastSourceUpdate`, `daysSinceSourceUpdate`, `likelyClosed`, `closedSignals` |
| Quality | `leadScore`, `confidence` |
| Provenance | `sources` (dataset, license, record id, updated), `license`, `attribution`, `overtureId`, `osmId`, `dataRelease`, `scrapedAt` |

### Pricing (pay per event)

You pay for the base lead plus only the add-ons you switch on, and an add-on is charged only when it returns data.

| Event | Price | Default | Charged when |
|---|---|---|---|
| Base lead (name, address, coordinates, category, validated phone, website) | $0.002 | always | every lead returned |
| Email finding with deliverability grade | $0.002 | on | at least one graded email found |
| Social profiles | $0.001 | on | at least one profile found |
| City license match + open/closed check | $0.002 | off | the check returns a result |
| Hours, services & rating from the business's own site | $0.001 | off | schema.org data found |
| Actor start | $0.00005 | always | per run (per GB of memory) |

Example totals: a lead with the default add-ons (base + email + socials) costs $0.005. A fully loaded lead (all four add-ons) costs $0.008.

Leads dropped as likely closed or below your minimum score are free. Set a maximum cost per run in the run options. When the cap is reached, the current lead keeps only the add-ons that were paid for, and the run stops cleanly.

### Licensing and attribution

- **Overture Maps Places:** CDLA-Permissive-2.0, with some records under Apache-2.0 or CC0. Credit "Overture Maps Foundation, overturemaps.org".
- **OpenStreetMap:** rows that include OSM data are ODbL 1.0. Credit "© OpenStreetMap contributors", and share any database you publish from those rows under ODbL.
- **City license data:** Los Angeles (CC0), San Francisco (PDDL) and Seattle (public domain).
- **Website facts:** published by each business on its own public site. Personal-looking emails are withheld by default. Follow CAN-SPAM, GDPR and CCPA when you contact anyone.
- **Not affiliated:** this Actor is not affiliated with Google, the Overture Maps Foundation, OpenStreetMap or any city.

### Freshness

Overture publishes a new release every month, and the Actor always reads the latest. Website and license checks run live on every run. Combine a schedule with "Only new places since my last run" to pay only for new businesses.

### Support

Open an issue in the **Issues** tab.

# Actor input Schema

## `categories` (type: `array`):

What to look for, like on a map search: dentist, plumber, hvac, restaurant, cafe, bar, auto repair, hair salon, nail salon, lawyer, accountant, real estate agent, gym, electrician, roofer, contractor, veterinarian, pharmacy, doctor, hotel, insurance agency, chiropractor, florist, bakery. Other words are matched against the Overture category taxonomy (e.g. "yoga_studio", "pet groomer").

## `locations` (type: `array`):

"City, ST" (Austin, TX), "Name County, ST" (Cook County, IL), a 5-digit ZIP, or "lat,lng". Placed offline with the US Census Gazetteer.

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

Optional. Overrides the automatic radius derived from the city/county/ZIP land area. Required precision for lat,lng searches (default 5 km).

## `maxLeadsPerSearch` (type: `integer`):

Closest to the center first. No 120-result cap: set it high to get every match in the area.

## `addEmails` (type: `boolean`):

Emails from the data and the business's own website, each with a DNS/MX grade (A/B/C). Charged only when at least one graded email is found.

## `addSocials` (type: `boolean`):

Facebook, Instagram, LinkedIn, X, YouTube, TikTok links. Charged only when at least one is found.

## `addLicenseCheck` (type: `boolean`):

Website response check, closed signals, and active business-license match in Los Angeles, San Francisco and Seattle open data. Charged only when the check returns a result.

## `addSiteDetails` (type: `boolean`):

Opening hours, services, price range and self-published rating, only where the site publishes schema.org data. Charged only when found.

## `contactEnrichment` (type: `string`):

Visits each business's own homepage to check it responds and to read schema.org data (hours, services, self-published rating). When email or phone is missing it also reads the best contact/about pages. robots.txt honored, 1 request/s per site, no proxies.

## `maxPagesPerSite` (type: `integer`):

Website pages read per business (home page plus the best contact/about pages).

## `includeOsm` (type: `boolean`):

Downloads the state's OpenStreetMap extract (Geofabrik) during the run: adds 30–90 s. Rows that contain OSM data are licensed ODbL 1.0 (attribution and share-alike).

## `minConfidence` (type: `number`):

Overture's existence-confidence score. Lower it for more (but less certain) places.

## `onlyWithContacts` (type: `boolean`):

Skip (and do not bill) businesses where no email or phone was found.

## `closedHandling` (type: `string`):

A business is 'likely closed' when Overture marks it closed, its own site says permanently closed, or its website no longer exists and no source has updated it in a year (and no active city license was found).

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

Per-lead quality score from source confidence, website response, active city license, valid phone, email grade, data freshness and schema.org data. Leads below it are skipped and not billed.

## `includeAlternateCategories` (type: `boolean`):

Also match places whose secondary category fits (more results, less precise).

## `nameContains` (type: `string`):

Optional text filter on the business name.

## `includeClosed` (type: `boolean`):

Include places Overture marks as temporarily or permanently closed.

## `includePersonalEmails` (type: `boolean`):

Off by default (GDPR/CCPA). Role emails like info@ and sales@ are always included.

## `skipPreviouslySeen` (type: `boolean`):

Remembers delivered places in a key-value store in your account, so scheduled runs bill only new businesses.

## `overtureRelease` (type: `string`):

Leave empty to use the latest monthly release.

## Actor input object example

```json
{
  "categories": [
    "dentist"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxLeadsPerSearch": 200,
  "addEmails": true,
  "addSocials": true,
  "addLicenseCheck": false,
  "addSiteDetails": false,
  "contactEnrichment": "missing",
  "maxPagesPerSite": 3,
  "includeOsm": false,
  "minConfidence": 0.7,
  "onlyWithContacts": false,
  "closedHandling": "drop",
  "minLeadScore": 0,
  "includeAlternateCategories": false,
  "includeClosed": false,
  "includePersonalEmails": false,
  "skipPreviouslySeen": 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 = {
    "categories": [
        "dentist"
    ],
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearfeedlabs/local-business-leads").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 = {
    "categories": ["dentist"],
    "locations": ["Austin, TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("clearfeedlabs/local-business-leads").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 '{
  "categories": [
    "dentist"
  ],
  "locations": [
    "Austin, TX"
  ]
}' |
apify call clearfeedlabs/local-business-leads --silent --output-dataset

```

## MCP server setup

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

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/nMggekhtOW3pUJ0LZ/builds/3FlWLeOWYOfugpA4x/openapi.json
