# Google Maps No-Website Leads | 💵$5/1K (`webdata_labs/google-maps-no-website-leads-scraper`) Actor

\[💵 $5.00 / 1K] Find businesses on Google Maps that have NO website or only a Facebook/Instagram page - the ones that actually need web design, SEO, or marketing services. Scored, deduped leads with phone numbers. Not another raw Maps dump.

- **URL**: https://apify.com/webdata\_labs/google-maps-no-website-leads-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Lead generation, Marketing, SEO tools
- **Stats:** 29 total users, 8 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Google Maps No-Website Leads Scraper - Businesses That Need You, Not Raw Dumps

**Find businesses on Google Maps that have NO website - the exact prospects who need web design, SEO, and marketing services.**

A raw Google Maps scrape gives you 200 rows where 170 already have a website and will never buy one from you. This Actor scans Google Maps local results and keeps only the businesses with a **weak web presence**: no website at all, or a Facebook/Instagram page pretending to be one. Each lead comes with phone, rating, review count, years in business, and a **lead score** - so your best prospect is row one, and you pay only for matching leads, not for every business scanned.

### ✅ What you get / ❌ what this isn't

| ✅ This Actor gives you | ❌ This Actor is not |
|---|---|
| Only businesses with no/weak web presence | Not a raw dump padded with websited businesses |
| A lead score + plain-English reasons per row | Not unscored rows you triage by hand |
| Phone, rating, reviews, years in business | Not name-only rows you must re-enrich |
| Charged per matching lead only | Not billed for every listing scanned |
| Social-only detection (Facebook/Instagram-as-website) | Not fooled by a Facebook link in the website field |

### 🔎 Why use this Actor

- **The filter is the product.** "No website" businesses are the highest-intent prospects for web design, SEO, Google Business Profile, and marketing services - and they are invisible in a raw Maps export until you filter it yourself.
- **Social-only counts.** A business whose "website" is `facebook.com/...` needs a real site; the Actor classifies it `social_only` instead of letting it pass as covered.
- **Broken sites too (optional).** Turn on `checkWebsiteStatus` and businesses whose site is dead or unreachable come back as `broken_website` leads.
- **Scored, with reasons.** `leadScore` 0-100 built from presence, phone availability, review count, and rating - `leadReasons` explains each score in plain English.
- **Pay for leads, not scans.** If 60 businesses are scanned and 12 match, you are charged for 12 results.
- **Fresh leads on repeat runs.** Turn on **Only return new leads on repeat runs** in a saved Task. The first run returns leads normally; later runs automatically skip leads that Task already returned.
- **Established businesses, not ghosts.** Review counts and years in business tell you which no-website businesses are real, busy operations that can afford your service.

### 👥 Who it's for

Web designers, SEO freelancers, and digital agencies prospecting local clients. Common jobs:

- Build a call list of businesses in a niche + city that need their first website.
- Find social-only businesses to pitch a proper site + Google Business Profile setup.
- Territory research: which categories in your city are underserved online.
- Feed the phone/name list into your CRM or cold-call workflow.

### Example tasks

- [Weekly New No-Website Leads](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/weekly-new-no-website-leads)
- [Find roofers without websites](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-roofers-without-websites)
- [Find electricians without websites](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-electricians-without-websites)
- [Find plumbers with no website to pitch](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-plumbers-with-no-website)
- [Find restaurants that need a website](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-restaurants-that-need-a-website)
- [Get Google Maps leads for a web design agency](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/google-maps-leads-for-web-design-agencies)
- [Find businesses with no website at all](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-businesses-with-no-website-at-all)
- [Find Brazilian businesses without websites](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-brazilian-businesses-without-websites)
- [Find businesses without websites in Portugal](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-portugal-businesses-without-websites)
- [Find UK tradespeople without websites](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-uk-tradespeople-without-websites)
- [Find Spanish businesses without websites](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/find-spanish-business-leads-without-websites)

### ⚙️ How to find businesses without websites

1. Open the Actor on Apify.
2. Enter `searchQueries` like `plumbers in Austin, TX` or `restaurants in Lisbon` (one category + city per line).
3. Keep the default **No website or social-only** filter (or switch to strict **No website only**).
4. Optionally enable `checkWebsiteStatus` to also catch dead websites.
5. For a recurring saved Task, optionally turn on **Only return new leads on repeat runs**. Nothing else is required.
6. Click **Start**.
7. Open the **No-website leads** view, or download CSV/JSON/Excel or pull from the API.

#### Get a fresh list every week

Use the [Weekly New No-Website Leads](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/examples/weekly-new-no-website-leads) task, edit the searches to your niches and cities, and schedule it weekly. Its `onlyNew` switch is already on, so each later run skips leads returned by that same Task. If you want the results in Google Sheets, connect the resulting dataset through Make, Zapier, or another Sheets integration.

You do **not** need to manage IDs for a new recurring Task. If you already have an older lead list, paste its Apify dataset ID or URL into **Existing leads dataset (baseline)** once. The Actor imports the IDs and skips those rows too.

### 📥 Input

```json
{
  "searchQueries": ["nail salons in San Antonio, TX"],
  "maxLeadsPerQuery": 50,
  "leadFilter": "weak_presence",
  "checkWebsiteStatus": false,
  "onlyNew": false
}
```

- `searchQueries` - Google Maps searches to mine (category + city works best).
- `maxLeadsPerQuery` - stop after this many **matching leads** per query (0 = no limit).
- `leadFilter` - `weak_presence` (no site or social-only, default), `no_website_only` (strict), or `all` (no filter; every business with its presence classification).
- `checkWebsiteStatus` - live-check websites to classify dead ones as `broken_website` leads.
- `onlyNew` - optional and off by default. When on, each saved Task remembers its own returned leads and only emits unseen ones on later runs.
- `excludePlaceIds` - advanced optional list of Google Maps place IDs, numeric CIDs, or Maps URLs to skip.
- `baselineDatasetId` - advanced optional Apify dataset ID or URL whose existing Place IDs should be skipped.
- `countryCode` / `language` - Google localization (default `us` / `en`).

### 📤 Output

One row per lead, with a ready-made **No-website leads** view.

| name | category | phone | presence | leadScore | rating | reviewsCount | address |
|---|---|---|---|---|---|---|---|
| The Nail Spa | Nail salon | (210) 824-8590 | none | 95 | 4.4 | 1,400 | San Antonio, TX |
| Queens Nails & Spa | Nail salon | (210) 543-1400 | social\_only | 85 | 4.6 | 289 | San Antonio, TX |

Each row also carries `placeId` (the stable Google Maps identifier used for repeat-run deduplication), `leadReasons` (why it scored what it scored), `socialProfile` (the Facebook/Instagram page for social-only leads), `yearsInBusiness`, `openStatus`, `googleMapsUrl`, and the `searchQuery` it came from.

### 💵 How much does it cost?

You pay per **matching lead** (see the pricing on this page) - businesses that already have a working website are scanned but never charged. Platform usage is included in the per-result price. A typical category+city query yields 5-20 leads.

### 🔁 Run it on the Apify platform

Schedule weekly prospecting runs per city, call it from the API, export to CSV/JSON/Excel, or pipe leads into Make, Zapier, webhooks, or your CRM.

### ⚠️ Limits and caveats

- Data comes from Google's public local results. Depth per query is limited by what Google serves (typically up to a few hundred listings per query); split large areas into neighborhoods or nearby towns for more coverage.
- "No website" means no website link on the Google listing. A tiny share of businesses have a site they never linked - those still usually need your help finding customers.
- Ads/sponsored listings are skipped, so you never pay for promoted rows.
- Email addresses are not part of Google local listings; pair this Actor with a contact-extraction Actor for social-only leads' pages.

### 🧩 Related Actors

- **Website Contact Extractor** - turn the websites of `broken_website`/`has_website` rows into verified emails.
- **Lead List Deduplicator & Normalizer** - merge leads from multiple cities/queries into one clean list.
- **Bulk URL Status Checker** - bulk-verify website liveness on very large lists.

### ❓ FAQ

**Am I charged for every business scanned?** No. Only rows that match your `leadFilter` are pushed and charged. Scanning is included.

**What does `social_only` mean?** The business's only web presence is a social page (Facebook, Instagram, Linktree, etc.) - a prime prospect for a real website.

**Does it return emails?** Google local listings don't include emails. You get name, phone, address, rating, reviews, and the social page where present.

**Which countries work?** Any country Google Maps covers - set `countryCode` and `language`, and write queries in the local language for best results.

**How does `onlyNew` work?** It is off by default, so existing one-time workflows do not change. Turn it on in a saved or scheduled Task. The first run returns and remembers leads; later runs from that same Task return only unseen Place IDs. Each Task keeps separate history.

**Do I need a baseline dataset?** No. It is only for excluding leads you collected before enabling `onlyNew`. For a new recurring Task, turn on `onlyNew` and run it.

### 🛠️ Support

If a run fails or a field is missing, open an Actor issue with the run URL, the input you used, and the field or behavior you expected.

### ⭐ Rate this Actor

If this Actor saved you time, please take 30 seconds to leave a review on the **Reviews** tab of [Google Maps No-Website Leads Scraper](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper) - reviews are the main trust signal other users see, and they directly decide which features get built next. If something is broken or a field is missing, please [open an issue](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper/issues) first - we typically respond within a day and would love the chance to fix it before you rate.

# Actor input Schema

## `searchQueries` (type: `array`):

Google Maps searches to mine for leads, e.g. "plumbers in Austin, TX" or "restaurants in Lisbon". One category + city per line works best.

## `maxLeadsPerQuery` (type: `integer`):

Stop after this many matching leads per search query. You are only charged for leads that match the filter, not for every business scanned. 0 = no limit.

## `leadFilter` (type: `string`):

Which businesses count as leads. "No website or social-only" (default) returns businesses with no site at all plus those whose only web presence is a Facebook/Instagram/Linktree page. "No website only" is the strictest. "All businesses" disables filtering and returns every listing with its presence classification.

## `onlyNew` (type: `boolean`):

Optional. Keep this off for a normal one-time scrape. Turn it on for a saved or scheduled Task: the first run returns leads normally, then later runs automatically skip leads that this same Task already returned. No IDs or setup required.

## `excludePlaceIds` (type: `array`):

Advanced and optional. Paste Google Maps place IDs, numeric CIDs, or Maps URLs that should never be returned. One per line.

## `baselineDatasetId` (type: `string`):

Advanced and optional. Paste an Apify dataset ID or dataset URL from an older lead run. Every Place ID found there is skipped. You do not need this for a new scheduled Task.

## `checkWebsiteStatus` (type: `boolean`):

For businesses that DO have a website, make a quick HTTP check. Dead or unreachable sites get presence "broken\_website" and are included as leads under the default filter - these businesses need help too.

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

Two-letter country code used for Google localization (gl parameter), e.g. "us", "gb", "de".

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

Interface language for Google results (hl parameter).

## `minHitRate` (type: `number`):

Stop mining a search early if fewer than this fraction of scanned businesses match your filter (default 0.08 = 8%). This keeps cost-per-lead bounded on low-yield searches (e.g. a strict no-website filter in a category where almost everyone has a site). Set to 0 to disable and scan exhaustively.

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

Proxy to use for Google requests. Keep the default (residential proxies) unless you know what you are doing.

## `debugDumpHtml` (type: `boolean`):

Developer option - stores raw Google result pages in the key-value store for debugging.

## Actor input object example

```json
{
  "searchQueries": [
    "nail salons in San Antonio, TX"
  ],
  "maxLeadsPerQuery": 10,
  "leadFilter": "weak_presence",
  "onlyNew": false,
  "excludePlaceIds": [],
  "checkWebsiteStatus": false,
  "countryCode": "us",
  "language": "en",
  "minHitRate": 0.08,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "debugDumpHtml": false
}
```

# Actor output Schema

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

No description

## `OUTPUT` (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 = {
    "searchQueries": [
        "nail salons in San Antonio, TX"
    ],
    "maxLeadsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/google-maps-no-website-leads-scraper").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 = {
    "searchQueries": ["nail salons in San Antonio, TX"],
    "maxLeadsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/google-maps-no-website-leads-scraper").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 '{
  "searchQueries": [
    "nail salons in San Antonio, TX"
  ],
  "maxLeadsPerQuery": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call webdata_labs/google-maps-no-website-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=webdata_labs/google-maps-no-website-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/iA3MNz5R1pILfenz2/builds/rniTw5es4FahKNl27/openapi.json
