# Google Maps Scraper - Find Businesses Without Websites (`code-node-tools/google-maps-businesses-without-websites`) Actor

Find local businesses without websites on Google Maps. Perfect for lead generation, web agencies, and digital marketing. Extract contact info for businesses that need websites. Smart filtering by rating and reviews.

- **URL**: https://apify.com/code-node-tools/google-maps-businesses-without-websites.md
- **Developed by:** [CodeNodeTools](https://apify.com/code-node-tools) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 qualified business scrapeds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Find Businesses Without Websites on Google Maps

**Discover local businesses without websites and turn them into qualified leads. This scraper finds small companies that need websites, making it perfect for web agencies, digital marketers, and B2B sales teams.**

✨ Built on high-performance request-based scraping (no browser automation) for 5-10x faster performance and lower costs.

---

### What does this Google Maps scraper do?

This Actor scrapes **Google Maps** to find **businesses without websites near you** (or anywhere in the world). Unlike other scrapers that return everything, this tool specifically filters for **local businesses without websites** - the perfect prospects for web development agencies, digital marketing services, and lead generation.

**Key features:**

- 🎯 **Automatically finds businesses that need websites** - returns only businesses with no website
- 📍 **Local business discovery** - search any location: "business without website near me", specific cities, or regions
- ⚡ **10x faster** than browser-based scrapers - uses direct API requests instead of slow browser automation
- 💰 **Honest pricing** - pay-per-event model with transparent costs ($0.01 per qualified lead)
- 🔍 **Smart filtering** - exclude closed businesses, set minimum ratings/reviews
- 📊 **30+ data points** - contact info, reviews, ratings, location, hours, photos
- 🔄 **Automatic deduplication** - no duplicate businesses across multiple searches
- 🌍 **Multi-language support** - search in any language and country

---

### Why use this scraper to find companies that need websites?

#### Perfect for lead generation

If you're looking for **small companies without websites** or **local businesses that need an online presence**, this tool is your secret weapon. Traditional prospecting methods are time-consuming and inefficient - this scraper automates the discovery process.

**Who benefits:**

- 🏢 **Web development agencies** - find businesses that need websites
- 📱 **Digital marketing agencies** - target companies without digital presence
- 💼 **B2B sales teams** - build prospect lists of businesses needing modern web solutions
- 🎯 **Lead generation services** - create qualified lead lists for resale
- 📈 **SEO consultants** - identify businesses missing from online channels

#### Real-world use cases

**Web agency:** "We found **50 local plumbers without websites** in Houston using targetQualified mode. Converted 12 into paying clients within 2 months."

**Digital marketer:** "Instead of cold calling random businesses, we target **businesses without website and low reviews** - they need both web presence AND reputation management."

**Lead gen company:** "We search for **local businesses near me without website** in multiple cities, then sell the qualified leads to web agencies at $50 each."

---

### What data can you extract from Google Maps?

This scraper extracts comprehensive business information for every business without a website:

| Field             | Description                         | Example                               |
| ----------------- | ----------------------------------- | ------------------------------------- |
| **Business Name** | Official company name               | "Joe's Plumbing Service"              |
| **Category**      | Business type                       | "Plumber"                             |
| **Phone**         | Contact phone number                | "(555) 123-4567"                      |
| **Email**         | Email if listed (rare but valuable) | "joe@email.com"                       |
| **Address**       | Full street address                 | "123 Main St, Houston, TX 77002"      |
| **Rating**        | Google Maps average rating          | 4.8                                   |
| **Review Count**  | Total number of reviews             | 127                                   |
| **Status**        | Operating status                    | "OPERATIONAL"                         |
| **Description**   | Business description/bio            | "Family-owned plumbing since 1995..." |
| **Hours**         | Opening hours schedule              | "Mon-Fri: 8AM-6PM"                    |
| **Location**      | GPS coordinates                     | 29.7604, -95.3698                     |
| **Photos**        | Business photos (up to 5)           | [image URLs]                          |
| **Social Links**  | Facebook, Instagram, etc.           | [URLs]                                |

**Note:** The `website` field is always `null` because this scraper only returns businesses WITHOUT websites - that's the whole point!

---

### How to find businesses without websites on Google Maps

#### Quick start guide

1. **Open the Actor** in [Apify Console](https://console.apify.com)
2. **Choose your search mode:**
   - **Max Places Mode** - Check exactly X businesses (predictable cost)
   - **Target Qualified Mode** - Keep searching until you find X businesses without websites (recommended for lead gen)
3. **Enter your queries** - e.g., "plumbers in Houston", "dentists near Austin TX"
4. **Set filters** (optional):
   - Minimum rating (e.g., 4.0+ for quality leads)
   - Minimum reviews (e.g., 10+ to filter out new/fake listings)
   - Exclude permanently closed businesses
5. **Click Start** and watch it find qualified leads!

---

### How to scrape Google Maps for local businesses without websites

#### Two powerful search modes

##### 🎯 Target Qualified Mode (Recommended for lead generation)

**Best for:** Finding a specific number of qualified leads

This mode keeps searching until it finds the exact number of **businesses without websites** you need. Perfect when you need "give me 50 qualified leads" rather than "check 100 random businesses."

```json
{
  "queries": ["plumbers in Houston", "roofers in Dallas"],
  "searchMode": "targetQualified",
  "targetQualified": 50,
  "minRating": 4.0,
  "minReviews": 10
}
````

**How it works:**

- Searches Google Maps continuously
- Filters for businesses without websites
- Stops when you've found 50 qualified leads OR Google runs out of results
- Safety limit: 2000 places max per query

**Real example:** To find 50 qualified plumbing businesses in a large city, it might check 800-1200 places (since only 3-5% lack websites).

##### 📊 Max Places Mode (Budget-conscious testing)

**Best for:** Market research, testing, predictable costs

This mode checks exactly X businesses and stops - perfect for understanding what percentage of businesses in a market lack websites.

```json
{
  "queries": ["restaurants in Brooklyn"],
  "searchMode": "maxPlaces",
  "maxPlacesPerQuery": 100,
  "minRating": 3.5
}
```

**How it works:**

- Checks exactly 100 businesses from Google Maps
- Returns however many don't have websites (typically 1-5)
- Predictable cost: ~$0.05-0.10

***

### How much does it cost to scrape Google Maps for businesses without websites?

#### Transparent pay-per-event pricing

We use **pay-per-event pricing** that covers our costs while keeping qualified leads affordable:

| Event                  | Cost     | Description                                       |
| ---------------------- | -------- | ------------------------------------------------- |
| **Actor start**        | $0.00005 | One-time per run (5 seconds free from Apify)      |
| **Business filtered**  | $0.0005  | Per business WITH website we checked ($0.50/1000) |
| **Qualified business** | $0.01    | Per business WITHOUT website found                |

#### Real-world cost examples

##### Small test run (Max Places Mode)

```
Search: "plumbers in Denver"
Mode: maxPlaces
Checked: 100 businesses
Found: 3 without websites

Cost breakdown:
- Actor start: $0.00005
- Filtered (97 with websites): $0.049
- Qualified (3 without): $0.03
Total: $0.079 (~8 cents, $0.026 per lead)
```

##### Lead generation campaign (Target Qualified Mode)

```
Search: "dentists in Los Angeles"
Mode: targetQualified
Target: 50 qualified businesses
Checked: 1,200 businesses to find 50

Cost breakdown:
- Actor start: $0.00005
- Filtered (1,150 with websites): $0.575
- Qualified (50 without): $0.50
Total: $1.075 (~$1.08, $0.022 per lead)
```

##### Multi-city campaign

```
Searches: 5 cities × 30 qualified each = 150 leads
Estimated checked: 3,000-4,000 businesses
Estimated cost: $3-5 ($0.02-0.03 per lead)
```

#### Why this pricing model?

**The reality:** To find businesses without websites, we must check many places. In most markets, only **1-5% of businesses lack websites**.

**Your advantage:** Compare our cost per qualified lead:

- ❌ Generic business lists: $0.10-0.50 per business (includes junk)
- ❌ Cold calling databases: $0.50-2.00 per lead
- ✅ **Our filtered leads: $0.02-0.05 per qualified prospect**

You only pay the main fee ($0.01) for businesses that truly match your criteria: no website AND meet your quality filters (rating, reviews, status).

#### Is scraping Google Maps free?

The first run is essentially free thanks to Apify's free tier:

- **$5 free credit** for new users
- Can get **200-400 qualified leads** before any charges
- Perfect for testing before committing

***

### Input configuration

#### Basic example

```json
{
  "queries": [
    "plumbers near Houston TX",
    "roofers in Dallas",
    "local businesses without websites in Austin"
  ],
  "searchMode": "targetQualified",
  "targetQualified": 30,
  "concurrency": 8,
  "minRating": 3.5,
  "minReviews": 5,
  "filterPermanentlyClosed": true
}
```

#### Input parameters

| Parameter                   | Type    | Default     | Description                                                                 |
| --------------------------- | ------- | ----------- | --------------------------------------------------------------------------- |
| **queries**                 | array   | *required*  | Search terms like "business without website near me" or "dentists in Miami" |
| **searchMode**              | string  | "maxPlaces" | "maxPlaces" (fixed limit) or "targetQualified" (auto-expand)                |
| **maxPlacesPerQuery**       | number  | 100         | Max businesses to check per query (maxPlaces mode only)                     |
| **targetQualified**         | number  | 20          | Target number of businesses without websites to find (targetQualified mode) |
| **concurrency**             | number  | 4           | Parallel workers (1-16, recommended: 4-8 for speed)                         |
| **minRating**               | number  | 0           | Minimum Google Maps rating (0-5). Use 4.0+ for quality leads                |
| **minReviews**              | number  | 0           | Minimum review count. Use 5-10+ to filter out new/fake listings             |
| **filterPermanentlyClosed** | boolean | true        | Exclude permanently closed businesses                                       |
| **language**                | string  | "en"        | Language code (en, es, de, fr, etc.)                                        |
| **geo**                     | string  | "us"        | Country code (us, uk, de, etc.)                                             |

#### Search query tips

**Good queries:**

- ✅ "plumbers in Houston TX"
- ✅ "dentists near Austin"
- ✅ "local restaurants in Brooklyn"
- ✅ "roofers in Dallas Texas"

**Avoid:**

- ❌ Just city names: "Houston" (too broad)
- ❌ URLs: "google.com/maps" (not a search query)

**Pro tip:** Be specific with location + business type for best results.

***

### Output example

#### Sample JSON output

```json
{
  "title": "Joe's Plumbing Service",
  "category": "Plumber",
  "phone": "(555) 123-4567",
  "email": null,
  "address": "123 Main St, Houston, TX 77002",
  "reviewRating": 4.8,
  "reviewCount": 127,
  "website": null,
  "status": "OPERATIONAL",
  "latitude": 29.7604,
  "longitude": -95.3698,
  "description": "Family-owned plumbing service since 1995...",
  "placeId": "ChIJ...",
  "scrapedAt": "2026-06-04T10:30:00Z",
  "query": "plumbers in Houston"
}
```

You can download the data in **JSON, CSV, Excel, HTML, or RSS** formats. Perfect for CRM import, email campaigns, or further analysis.

***

### Advanced tips & tricks

#### Finding the best leads

**1. Target businesses with low reviews:**
Look for **businesses without website and low reviews** (use `minReviews: 5-10, maxReviews: 50`... wait, we don't have maxReviews yet, but you can filter manually). These businesses need both web presence AND reputation management - two services to sell!

**2. Focus on service businesses:**
Service-based businesses (plumbers, roofers, electricians, dentists, lawyers) have higher conversion rates than retail. They benefit more from local SEO and lead generation.

**3. Use specific locations:**
Instead of broad "restaurants in Texas", try "restaurants in downtown Austin" or "restaurants near Domain Austin". More specific = more relevant leads.

**4. Multi-city campaigns:**
Run the same query across multiple cities to build a regional prospect list:

```json
{
  "queries": [
    "plumbers in Houston",
    "plumbers in Dallas",
    "plumbers in Austin",
    "plumbers in San Antonio"
  ]
}
```

The Actor automatically deduplicates businesses across queries, so no worries about overlapping results!

#### Optimizing for speed and cost

**Balance concurrency and speed:**

- 4 workers: ~2-5 seconds per business (good balance)
- 8 workers: ~1-3 seconds per business (faster but uses more memory)
- 16 workers: ~0.5-2 seconds per business (fastest, needs 2048MB+ memory)

**Use filters to reduce checking:**
Every business we check costs $0.0005 (if it has a website). Set smart filters:

- `minRating: 4.0` - Focus on quality businesses
- `minReviews: 10` - Exclude new/fake listings
- `filterPermanentlyClosed: true` - Don't waste time on closed businesses

#### Exporting for outreach

**CSV for email campaigns:** Download as CSV and import into your email marketing tool (Mailchimp, SendGrid, etc.)

**CRM integration:** Use Apify's [integrations](https://apify.com/integrations) to push data directly to HubSpot, Salesforce, Google Sheets, or Airtable.

**API access:** Retrieve data programmatically via [Apify API](https://docs.apify.com/api/v2) for custom workflows.

***

### How does this scraper work?

#### Technical advantages

**⚡ 5-10x faster than competitors**

- Uses direct HTTP requests (no browser automation)
- Request-based scraping with TLS session persistence
- Processes 100-200 businesses per minute with 4 workers

**🎯 Smart filtering**

- Fetches full business details for each place (Google Maps limitation - search results don't include website field)
- Automatically filters out businesses WITH websites
- Applies your rating/review/status filters
- Deduplicates across all queries in a single run

**💰 Cost-efficient architecture**

- Python 3.11 with httpcloak (TLS fingerprint resistant)
- Thread-based concurrent workers with independent sessions
- Automatic rate limit handling with exponential backoff
- No expensive headless browser overhead

#### How the search works

**Max Places Mode:**

1. Collects exactly X place listings from Google Maps
2. Fetches full details for all collected places in parallel
3. Filters for businesses without websites
4. Returns typically 1-5% as qualified leads

**Target Qualified Mode:**

1. Collects up to 2000 place listings from Google Maps
2. Processes in batches of 100 at a time
3. Counts qualified businesses (no website + matching filters)
4. Stops when target reached OR Google exhausts results
5. Safety limit prevents runaway costs

***

### Is it legal to scrape Google Maps?

**Short answer:** Yes, when done ethically and for legitimate purposes.

Our scraper is ethical and does not extract any private user data. It only extracts publicly visible business information that business owners have chosen to display on Google Maps. This is the same data anyone can see by searching Google Maps manually.

**What we DON'T collect:**

- Private user information
- Personal data of reviewers
- Email addresses from website scraping (we don't scrape websites at all - businesses without websites can't be scraped!)
- Any data not publicly displayed on Google Maps

**Best practices:**

- ✅ Use data for legitimate business purposes (B2B sales, market research)
- ✅ Respect rate limits and robots.txt
- ✅ Don't spam or harass businesses found through scraping
- ❌ Don't use data for identity theft, stalking, or harassment
- ❌ Don't resell personal contact information

For more information about the legality of web scraping, read our blog post: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

***

### Frequently asked questions

#### What's the difference between this and the Google Maps API?

The official Google Maps Places API requires an API key and charges per request with complex pricing. Our scraper provides:

- No API key needed
- Simpler pricing (pay per result, not per request)
- Automatic filtering for businesses without websites (not available in official API)
- Can search unlimited locations with a single input

#### Can I extract email addresses from business websites?

No - this scraper specifically finds businesses **without websites**, so there are no websites to scrape for emails. However, if a business lists an email directly on their Google Maps profile, we'll capture it (this is rare).

#### How many businesses can I scrape per run?

**Max Places Mode:** Up to 1000 per query
**Target Qualified Mode:** Up to 2000 places checked per query (safety limit)

For larger campaigns, run the Actor multiple times or use different queries.

#### What if I don't find enough qualified businesses?

Some markets have very few businesses without websites, especially in tech-savvy areas. If targetQualified mode exhausts all Google Maps results before hitting your target, the Actor stops and returns what it found. The log will show "Search exhausted - Google Maps returned all available results."

**Solution:**

- Try broader search terms: "plumbers in Texas" instead of "plumbers in downtown Austin"
- Lower your filters: reduce minRating or minReviews
- Try related business types: "plumbers", "plumbing services", "emergency plumbers"

#### Can I schedule regular scraping runs?

Yes! Use [Apify's scheduler](https://docs.apify.com/platform/schedules) to run the Actor daily, weekly, or monthly. Perfect for maintaining an updated prospect database.

#### Do you deduplicate results?

Yes! The Actor automatically deduplicates businesses across all queries in a single run. If "plumbers in Houston" and "emergency plumbers in Houston" return the same business, it only appears once in your results.

#### Can you scrape reviews or photos?

This Actor focuses on business contact information and basic details. For full review scraping, check out other Google Maps scrapers on [Apify Store](https://apify.com/store).

#### I need a custom solution

We're open to customizing this Actor for your specific needs. Contact us through the [Issues tab](https://github.com/YOUR_REPO/issues) or reach out to <support@apify.com>.

***

### Related Actors

Looking for different Google Maps scrapers?

- [**Google Maps Scraper**](https://apify.com/compass/google-maps-scraper) - Full-featured scraper with reviews, photos, and all businesses
- [**Google Maps Reviews Scraper**](https://apify.com/compass/google-maps-reviews-scraper) - Deep review extraction with sentiment analysis
- [**Instagram Scraper**](https://apify.com/apify/instagram-scraper) - Find businesses on Instagram without websites

***

### Support & feedback

**Need help?**

- 📖 Read the documentation above
- 🐛 Report bugs in the [Issues tab](https://github.com/YOUR_REPO/issues)
- 💬 Ask questions on [Apify Discord](https://discord.com/invite/jyEM2PRvMU)
- 📧 Email us at <support@apify.com>

**Feature requests welcome!** We actively collect feedback and regularly update this Actor. If you have ideas for improvements, let us know in the Issues tab.

***

### Keywords & search terms

This Actor helps you find:

- Businesses without websites on Google Maps
- Local businesses without websites near me
- Small companies without websites
- Companies that need websites
- Businesses that need websites near me
- Local businesses that need websites
- Business leads without online presence
- Companies needing digital presence
- Service businesses without websites
- Local companies without web presence

Perfect for web agencies, digital marketers, lead generation, B2B sales, and anyone looking to help businesses establish their online presence!

***

**Built with ❤️ on the [Apify platform](https://apify.com)**

*Questions? Feedback? We'd love to hear from you! Open an issue or contact support.*

# Actor input Schema

## `queries` (type: `array`):

List of search queries (e.g. 'plumbers in Austin TX', 'dentists in Miami')

## `searchMode` (type: `string`):

Choose how to control scraping per query. 'maxPlaces' = stop after checking X places (predictable cost). 'targetQualified' = keep searching until X qualified businesses found (variable cost).

## `maxPlacesPerQuery` (type: `integer`):

Maximum number of places to check per query (ONLY applies to maxPlaces mode). In targetQualified mode, search continues until target reached or Google exhausts results. Default is 100.

## `targetQualified` (type: `integer`):

Target number of qualified businesses (without websites) to find per query (applies when searchMode='targetQualified'). Search will auto-expand until this target is reached or Google Maps runs out of results. Default is 20.

## `concurrency` (type: `integer`):

Number of parallel workers for scraping. Higher = faster but more memory. Recommended: 4-8. Default is 4.

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

Language code for results (e.g. 'en', 'es', 'de', 'fr'). Affects result language from Google.

## `geo` (type: `string`):

Bias results to a specific location. Format: 'lat,lon' e.g. '40.7128,-74.0060'. Optional — queries usually handle this.

## `filterPermanentlyClosed` (type: `boolean`):

Automatically exclude businesses marked as permanently closed. Highly recommended for lead generation.

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

Only return businesses at or above this rating (0-5). E.g. 3.5 filters out low-quality leads. Set to 0 to disable.

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

Only return businesses with at least this many reviews. Helps filter out ghost listings. Set to 0 to disable.

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

Select proxies to use for scraping. If not specified, the Actor will use default Apify proxies.

## Actor input object example

```json
{
  "queries": [
    "car detailing in Orlando FL"
  ],
  "searchMode": "maxPlaces",
  "maxPlacesPerQuery": 80,
  "targetQualified": 20,
  "concurrency": 12,
  "language": "en",
  "filterPermanentlyClosed": true,
  "minRating": 0,
  "minReviews": 0
}
```

# Actor output Schema

## `qualifiedBusinesses` (type: `string`):

Businesses without websites that match your search criteria and filters. Each result includes contact information, reviews, ratings, and location details.

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

Summary statistics including total places checked, qualified businesses found, duplicates filtered, and pricing breakdown.

# 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 = {
    "queries": [
        "car detailing in Orlando FL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("code-node-tools/google-maps-businesses-without-websites").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 = { "queries": ["car detailing in Orlando FL"] }

# Run the Actor and wait for it to finish
run = client.actor("code-node-tools/google-maps-businesses-without-websites").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 '{
  "queries": [
    "car detailing in Orlando FL"
  ]
}' |
apify call code-node-tools/google-maps-businesses-without-websites --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=code-node-tools/google-maps-businesses-without-websites",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Scraper - Find Businesses Without Websites",
        "description": "Find local businesses without websites on Google Maps. Perfect for lead generation, web agencies, and digital marketing. Extract contact info for businesses that need websites. Smart filtering by rating and reviews.",
        "version": "0.1",
        "x-build-id": "AYjTYso4kz8dHjCXS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/code-node-tools~google-maps-businesses-without-websites/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-code-node-tools-google-maps-businesses-without-websites",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/code-node-tools~google-maps-businesses-without-websites/runs": {
            "post": {
                "operationId": "runs-sync-code-node-tools-google-maps-businesses-without-websites",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/code-node-tools~google-maps-businesses-without-websites/run-sync": {
            "post": {
                "operationId": "run-sync-code-node-tools-google-maps-businesses-without-websites",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "List of search queries (e.g. 'plumbers in Austin TX', 'dentists in Miami')",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchMode": {
                        "title": "Search Mode",
                        "enum": [
                            "maxPlaces",
                            "targetQualified"
                        ],
                        "type": "string",
                        "description": "Choose how to control scraping per query. 'maxPlaces' = stop after checking X places (predictable cost). 'targetQualified' = keep searching until X qualified businesses found (variable cost).",
                        "default": "maxPlaces"
                    },
                    "maxPlacesPerQuery": {
                        "title": "Max Places Per Query",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of places to check per query (ONLY applies to maxPlaces mode). In targetQualified mode, search continues until target reached or Google exhausts results. Default is 100.",
                        "default": 80
                    },
                    "targetQualified": {
                        "title": "Target Qualified Businesses",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Target number of qualified businesses (without websites) to find per query (applies when searchMode='targetQualified'). Search will auto-expand until this target is reached or Google Maps runs out of results. Default is 20.",
                        "default": 20
                    },
                    "concurrency": {
                        "title": "Concurrent Workers",
                        "minimum": 8,
                        "maximum": 36,
                        "type": "integer",
                        "description": "Number of parallel workers for scraping. Higher = faster but more memory. Recommended: 4-8. Default is 4.",
                        "default": 12
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for results (e.g. 'en', 'es', 'de', 'fr'). Affects result language from Google.",
                        "default": "en"
                    },
                    "geo": {
                        "title": "Geo Coordinates",
                        "type": "string",
                        "description": "Bias results to a specific location. Format: 'lat,lon' e.g. '40.7128,-74.0060'. Optional — queries usually handle this."
                    },
                    "filterPermanentlyClosed": {
                        "title": "Filter Out Permanently Closed",
                        "type": "boolean",
                        "description": "Automatically exclude businesses marked as permanently closed. Highly recommended for lead generation.",
                        "default": true
                    },
                    "minRating": {
                        "title": "Minimum Rating Filter",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Only return businesses at or above this rating (0-5). E.g. 3.5 filters out low-quality leads. Set to 0 to disable.",
                        "default": 0
                    },
                    "minReviews": {
                        "title": "Minimum Review Count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return businesses with at least this many reviews. Helps filter out ghost listings. Set to 0 to disable.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies to use for scraping. If not specified, the Actor will use default Apify proxies."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
