# No-Website Qualified Leads (`natural_lease/no-website-qualified-leads`) Actor

Phone-first US no-website & bad-website leads for web/SEO agencies. Try free example tasks (Austin dentists / Miami plumbers / Dallas nails), then $0.07/qualified lead; high\_value ≈$0.11. No phone → not charged.

- **URL**: https://apify.com/natural\_lease/no-website-qualified-leads.md
- **Developed by:** [Nika mint3](https://apify.com/natural_lease) (community)
- **Categories:** Lead generation, SEO tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $70.00 / 1,000 qualified 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

## No-Website Qualified Leads

**Phone-first** Google Maps leads for **web design, SEO, and local marketing agencies** (US).

Find businesses that **don’t have a usable website** — empty Maps field, social-only (FB/IG/Yelp), or a **broken / parked / stub** site (`bad_website` mode). You get **name, phone, address**, opportunity score, and a ready call opener.

### Try free demos (Apify trial / credits)

Use platform free trial credits on these **public example Tasks**, then schedule weekly and pay only for **qualified rows** (PPE):

| Demo | Niche | Task URL |
|------|-------|----------|
| **Austin dentists** | Clinics / high LTV | [nw-austin-dentists-demo](https://apify.com/natural_lease/no-website-qualified-leads/examples/nw-austin-dentists-demo) |
| **Miami plumbers** | Home services | [nw-miami-plumbers-demo](https://apify.com/natural_lease/no-website-qualified-leads/examples/nw-miami-plumbers-demo) |
| **Dallas nail salons** | Beauty / dense local | [nw-dallas-nail-salon-demo](https://apify.com/natural_lease/no-website-qualified-leads/examples/nw-dallas-nail-salon-demo) |

**Phone guarantee:** with `requirePhone: true` (default), phoneless places are **not written** → **not charged**.

#### Qualified yield (what you pay for)

- You are charged **only for dataset rows** that pass filters (phone + mode rules).
- Nested Maps scan may see more places than you get back — that is normal; PPE is on **qualified leads**, not raw scrape volume.
- Typical small city demos: expect a **subset** of scanned places to qualify (empty website / social-only / bad site). Tune `minReviews`, `maxReviews`, and `maxResultsPerCity` for denser niches.
- `bad_website` probes are **capped** (`maxBadWebsiteProbes`, default 25) so HTTP checks stay cheap.

### Pricing (current — live PPE)

| Event | Price | Notes |
|-------|-------|--------|
| **Qualified lead** | **$0.07** | Primary — every dataset row |
| **High-value add-on** | **+$0.04** | When `mode=high_value` → **≈$0.11** total |
| Actor start | $0.00005 / GB | Per run |

Nested `compass/crawler-google-places` is billed separately to the run owner.

### Niche focus: US home services

Local **plumber, electrician, HVAC, roofing, landscaping, cleaning** businesses are call-driven and often Maps-only or stuck on a weak free-builder page. Agencies selling a simple mobile site + GBP cleanup convert well here.

**How to run this niche:**

1. Set `nichePreset` to **`home_services`** (fills categories when `categories` is empty), **or** pass categories explicitly: `plumber`, `electrician`, `hvac`, `roofing`, `landscaping`, `cleaning service`.
2. Prefer `mode=no_website` for cheapest qualified phones; use `bad_website` when you want “site exists but fails” pitches.
3. Keep `requirePhone: true`. Start with `maxResultsPerCity: 10–15` and `minReviews: 2` for yield; raise `minRating` / reviews if you want fewer but stronger calls.
4. Try the Miami plumbers demo Task above, then clone for your metro.

| Niche | Why | Suggested mode |
|-------|-----|----------------|
| **Dentists / med spa / clinics** | High LTV, often weak web | `no_website` or `high_value` |
| **Home services** (plumber, HVAC, roofing, electrician, landscaping, cleaning) | Call-driven, many Maps-only | `nichePreset=home_services` |
| **Nail / barber / beauty** | Dense local competition | `no_website` |
| **Broken / parked / stub sites** | “You have a URL but it fails” pitch | `bad_website` |

### Modes

| Mode | Keeps | Nested |
|------|-------|--------|
| **no\_website** | Empty website | `withoutWebsite` |
| **social\_only** | FB/IG/Yelp only | `allPlaces` (+ optional email enrich) |
| **high\_value** | No real site + rating≥4.2 + reviews≥30 + phone | `allPlaces` + PPE add-on |
| **bad\_website** | Real URL that times out / 4xx / parked / free-builder / thin stub / no mobile viewport (weak) | `withWebsite` + light HTTP probe |

### Example inputs

#### 1) Austin dentists

```json
{
  "mode": "no_website",
  "cities": ["Austin, TX"],
  "categories": ["dentist"],
  "maxResultsPerCity": 15,
  "minRating": 3.5,
  "minReviews": 2,
  "maxReviews": 120,
  "requirePhone": true,
  "scrapeContactFromWebsite": false,
  "countryCode": "us"
}
```

#### 2) Miami plumbers (home services)

```json
{
  "mode": "no_website",
  "cities": ["Miami, FL"],
  "categories": ["plumber"],
  "nichePreset": "home_services",
  "maxResultsPerCity": 15,
  "requirePhone": true,
  "countryCode": "us"
}
```

#### 3) Dallas nail salons

```json
{
  "mode": "no_website",
  "cities": ["Dallas, TX"],
  "categories": ["nail salon"],
  "maxResultsPerCity": 15,
  "requirePhone": true,
  "countryCode": "us"
}
```

### Weekly schedule

Save a Task → Console **Schedules** → weekly. Export CSV / webhook to CRM. Standby not required.

### Bad website probe (light)

HTTP HEAD/GET with short timeout (default **3.5s**); flags: timeout, 4xx/5xx, parked/for-sale **titles**, free-builder hosts, empty/thin pages, missing **mobile viewport** meta when the page is also thin. Probe count capped per run. No full browser crawl (keeps cost down).

# Actor input Schema

## `mode` (type: `string`):

no\_website (default, cheapest) | social\_only | high\_value (rating≥4.2, reviews≥30) | bad\_website (light HTTP probe of real sites).

## `nichePreset` (type: `string`):

Used when categories is empty. default = nail salon/barber/plumber. home\_services = plumber/electrician/hvac/roofing/landscaping/cleaning.

## `cities` (type: `array`):

US cities (e.g. Austin, TX).

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

Overrides niche preset when non-empty.

## `minRating` (type: `number`):

high\_value forces ≥4.2.

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

Default 2 for yield; high\_value forces ≥30.

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

Skip oversized listings.

## `maxResultsPerCity` (type: `integer`):

Nested scan depth. Default 10 with withoutWebsite for better qualified %.

## `scrapeContactFromWebsite` (type: `boolean`):

Only applied when mode=social\_only. Ignored in other modes to avoid wasted nested contact fees.

## `enrichEmailsOnSocial` (type: `boolean`):

Same as scrapeContactFromWebsite for social\_only mode.

## `badWebsiteTimeoutMs` (type: `integer`):

Per-URL timeout for bad\_website mode.

## `maxBadWebsiteProbes` (type: `integer`):

Caps HTTP checks to control cost.

## `includeSocialOnly` (type: `boolean`):

Deprecated — use mode.

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

Use us for US.

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

Maps language.

## `skipClosedPlaces` (type: `boolean`):

Skip closed listings.

## `requirePhone` (type: `boolean`):

If true (default), phoneless places are never written — you are not charged PPE for them.

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

Apify Proxy UX; nested Maps uses its own proxies.

## Actor input object example

```json
{
  "mode": "no_website",
  "nichePreset": "default",
  "cities": [
    "Austin, TX",
    "Dallas, TX"
  ],
  "categories": [],
  "minRating": 3.5,
  "minReviews": 2,
  "maxReviews": 120,
  "maxResultsPerCity": 5,
  "scrapeContactFromWebsite": false,
  "enrichEmailsOnSocial": false,
  "badWebsiteTimeoutMs": 3500,
  "maxBadWebsiteProbes": 25,
  "includeSocialOnly": false,
  "countryCode": "us",
  "language": "en",
  "skipClosedPlaces": true,
  "requirePhone": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No-website / social-only business leads

# 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 = {
    "mode": "no_website",
    "cities": [
        "Austin, TX",
        "Dallas, TX"
    ],
    "categories": [],
    "maxResultsPerCity": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("natural_lease/no-website-qualified-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 = {
    "mode": "no_website",
    "cities": [
        "Austin, TX",
        "Dallas, TX",
    ],
    "categories": [],
    "maxResultsPerCity": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("natural_lease/no-website-qualified-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 '{
  "mode": "no_website",
  "cities": [
    "Austin, TX",
    "Dallas, TX"
  ],
  "categories": [],
  "maxResultsPerCity": 5
}' |
apify call natural_lease/no-website-qualified-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,natural_lease/no-website-qualified-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/s0r8K2jB4oMh5F3HY/builds/cj05UfGSjPgZJcaGe/openapi.json
