# Google Maps No-Website Leads Finder (`fringed_jebel/google-maps-no-website-leads`) Actor

Find local businesses on Google Maps that have no website. Name, category, address, phone, rating, reviews, Maps URL and a 0-100 lead score.

- **URL**: https://apify.com/fringed_jebel/google-maps-no-website-leads.md
- **Developed by:** [Jamie Fitzgerald](https://apify.com/fringed_jebel) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 lead returneds

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

Find local businesses on Google Maps whose profile lists **no website**, or only a Facebook, Instagram, Yelp or Linktree page. Get name, category, address, phone, rating, review count, Maps link and a 0-100 lead score, ready for web-design, local SEO or Google Business Profile outreach.

### What it does

- Searches one or more business types (e.g. `landscaping`, `roofing`, `handyman`) on a grid of points around any town, address or `lat,lng`, so you see far more than the 20 results one Maps search shows.
- Keeps businesses with no website on their Google profile. Social-only businesses are tagged `websiteType: "social"` with the page in `socialUrl` (turn off with **Include Facebook/Instagram-only businesses**).
- Scores each lead 0-100: has a phone (35), review volume (up to 35, 100+ reviews = full), rating (up to 20, 4.5+ = full), has a category (10). High score = an established, well-liked business that is easy to call and still has no site.

### Example

Input: business types `landscaping, roofing, house painter, handyman, tree service, hvac`, location `West Chester, PA`, grid 5, spacing 5 km. One test run scanned 1,061 businesses and returned 221 without a website on Google (212 none, 9 social-only).

### Output fields

`leadScore`, `scoreReasons`, `name`, `category`, `categories`, `address`, `phone`, `rating`, `reviewCount`, `websiteType` (`none` or `social`), `socialUrl`, `mapsUrl`, `placeId`, `lat`, `lng`, `foundVia`. With the website check on: `siteCheck` (`found`, `none-found` or `unknown`), `foundWebsite`, `siteEvidence`. A `SUMMARY` record in the key-value store counts searches, places scanned and leads.

### Good to know

- "No website" means no website is listed on the business's Google profile. Some of these businesses do have a site elsewhere that they never linked to Google. In a hand check of 9 results, 5 appeared to have a site somewhere on the web. That is still a useful lead for Google Business Profile fixes (a missing website link hurts Maps ranking), but check before pitching a new website.
- Turn on **Check for a website elsewhere (beta)** to have the actor do that first pass for you. For each lead it runs a web search and opens the top non-directory results; a lead is tagged `found` only when the page shows the lead's phone number or its full business name. In a 60-lead test (West Chester PA, 6 trades) it tagged 7 leads `found` (one was a false match on a town name, fixed since), and 2 searches were blocked (`unknown`). It catches some unlinked sites, not all, so `none-found` means "not found", not "proven to have no site". It adds about 5-10 seconds per lead. Use **Drop leads with a website found elsewhere** to remove the `found` ones.
- Use 3-5 business types and grid size 3-5 for a town-sized area. Bigger grids find more businesses on the edges.
- Datacenter proxy (default) works. The GOOGLE_SERP proxy group does not serve this endpoint.

# Actor input Schema

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

Trades or business types to search, e.g. landscaping, roofing, plumber (max 10). Each runs on the full grid.

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

Optional. Same as one entry in Business types.

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

Town, address or lat,lng

## `maxPlaces` (type: `integer`):

Max no-website leads to return

## `gridSize` (type: `integer`):

Searches per side around the location (3 = 9 searches). Bigger finds more.

## `spacingKm` (type: `number`):

Distance between grid points

## `resultsPerSearch` (type: `integer`):

20, 40 or 60

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

Skip businesses with fewer reviews

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

Businesses whose only web link is a social or directory page (Facebook, Instagram, Yelp, Linktree...) count as leads, tagged websiteType=social.

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

Only return businesses with a phone number

## `verifyWebsites` (type: `boolean`):

For each lead, run one web search (two at most) and open the top non-directory results. If a page shows the lead's phone number or full business name, the lead is tagged siteCheck=found with foundWebsite. Slower. Catches some, not all, businesses whose site just isn't linked on Google.

## `dropFoundWebsites` (type: `boolean`):

Only with the check above. Removes leads tagged siteCheck=found instead of returning them.

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

Datacenter proxy works; GOOGLE_SERP does not.

## Actor input object example

```json
{
  "searchQueries": [
    "landscaping"
  ],
  "location": "West Chester, PA",
  "maxPlaces": 20,
  "gridSize": 3,
  "spacingKm": 4,
  "resultsPerSearch": 40,
  "minReviews": 0,
  "includeSocialOnly": true,
  "requirePhone": true,
  "verifyWebsites": false,
  "dropFoundWebsites": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQueries": [
        "landscaping"
    ],
    "location": "West Chester, PA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fringed_jebel/google-maps-no-website-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 = {
    "searchQueries": ["landscaping"],
    "location": "West Chester, PA",
}

# Run the Actor and wait for it to finish
run = client.actor("fringed_jebel/google-maps-no-website-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 '{
  "searchQueries": [
    "landscaping"
  ],
  "location": "West Chester, PA"
}' |
apify call fringed_jebel/google-maps-no-website-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fringed_jebel/google-maps-no-website-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/mKYQp1pOEiC9ELTVh/builds/XYCuOZnUO3Fwfh5Pb/openapi.json
