# Google Maps Leads: No Website, Unclaimed Profiles (`steady-scrape/google-maps-business-segments`) Actor

Filtered Google Maps business lists by category and area: businesses with no website, unclaimed profiles, low ratings, few reviews or recently listed. Server-side filters, so you pay only for matches. Freshness dates on every record, no emails.

- **URL**: https://apify.com/steady-scrape/google-maps-business-segments.md
- **Developed by:** [SteadyScrape](https://apify.com/steady-scrape) (community)
- **Categories:** Lead generation, Marketing, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 businesses

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/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

## Google Maps Leads: No Website, Unclaimed Profiles

Build **filtered Google Maps business lists** in one run: every plumber in Austin **without a website**, every **unclaimed** dentist profile within 15 km, restaurants rated **below 4 stars**, salons with **fewer than 10 reviews**, or listings **first seen in the last 60 days**.

The filters run on the data provider's side, so you only get (and only pay for) the businesses that match. You don't pay to scrape all of Maps and throw most of it away.

Made by **SteadyScrape (steady-scrape)**. Note: we are not the similarly named "steadyscrape" account on Apify.

### What you can do with it

| Segment | Who uses it | Pitch it enables |
|---|---|---|
| **No website** (or only a Facebook/Instagram/Yelp page) | Web design agencies, website builders | "You have no website, and customers search for you on Google." |
| **Unclaimed profile** | Local SEO agencies, GBP management tools | "Your Google profile is unclaimed. Anyone can suggest edits to it." |
| **Rating below X** | Review management and reputation SaaS | "Your 3.6★ rating is costing you calls." |
| **Fewer than Y reviews** | Review-generation tools, local marketers | "Your competitors have 10× more reviews." |
| **First seen recently** | Suppliers, POS/payment vendors, insurers | "Welcome to the neighbourhood." (see the caveat below) |
| **Status** | Market analysts, franchise scouts | Temporarily or permanently closed businesses in an area |

You can combine filters, for example *unclaimed + no website + fewer than 5 reviews*.

### Input

- **Categories:** 1–10 Google Maps categories (`plumber`, `dentist`, `roofing_contractor`, `hair_salon`, `restaurant`, `auto_repair_shop`…). Spaces and capitals are fine. A misspelt category fails right away, with suggestions, and costs nothing.
- **Location:** use one of these:
  - **Coordinates + radius** (recommended): `30.2672,-97.7431` with `15` km. This catches suburbs that a city name misses.
  - **City** (exact name as written in the address; lowercase input is auto-capitalised) plus **country code**.
  - **Postal code**, or a **country code** alone for country-wide lists.
- **Segment filters:** website, claim status, rating below, fewer reviews than, first seen in the last N days.
- **Other filters:** business status (defaults to *operating*, which excludes temporarily and permanently closed businesses), rating at least, minimum reviews, record refreshed in the last N days.
- **Output:** max businesses (up to 10,000 per run), sort order, drop phones, include hours, include attributes.

Example: *Austin plumbers with no website and an unclaimed profile, within 25 km*

```json
{
  "categories": ["plumber"],
  "coordinates": "30.2672,-97.7431",
  "radiusKm": 25,
  "website": "noWebsite",
  "claimStatus": "unclaimed",
  "maxResults": 200
}
```

### Output

One record per business:

- **Business:** name, main and additional categories, description (email addresses masked), price level.
- **Location:** full address and its parts (street, city, postal code, region, country), latitude and longitude, Google `placeId` and `cid`, and a Google Maps link.
- **Website:** URL and domain, `hasWebsite`, and `websiteIsSocialProfile` (true when the "website" is just a Facebook or Instagram page).
- **Business phone:** from the Google profile. Set `dropPhones` to remove it. That also masks phone-like numbers in the description.
- **Profile:** `isClaimed`, rating, review count, 1–5★ distribution, photo count, `hasLogo`.
- **Status and hours:** current status and weekly opening hours.
- **Extras:** Google attributes (delivery, wheelchair access…), review topic keywords, and booking or ordering links.
- **`segmentTags`:** which segments the business falls into, e.g. `no-website`, `unclaimed`, `no-reviews`, `rating-below-4`.
- **Freshness:** `lastUpdatedTime` (when the database last refreshed the record), `firstSeen` (when the provider's crawler first found it), and `dataAgeDays`.

```json
{
  "name": "Example Plumbing Co",
  "category": "Plumber",
  "city": "Austin",
  "postalCode": "78727",
  "countryCode": "US",
  "phone": "+1512-000-0000",
  "website": null,
  "hasWebsite": false,
  "isClaimed": false,
  "rating": 4.8,
  "reviewsCount": 27,
  "businessStatus": "open",
  "segmentTags": ["no-website", "unclaimed"],
  "lastUpdatedTime": "2026-09-12T20:57:59Z",
  "firstSeen": "2024-07-14T17:54:36Z",
  "dataAgeDays": 45,
  "googleMapsUrl": "https://www.google.com/maps?cid=..."
}
```

A run summary (number of matches in the database, filters used, charges) is saved to the `OUTPUT` record in the key-value store. Export the dataset as CSV, Excel or JSON, or pull it over the API.

#### What we deliberately leave out

- **No email addresses.** We drop the provider's contact list (emails and extra phone numbers scraped from other websites) and mask emails found in descriptions.
- **No owner or person names, no reviewer data, no photos.**
- **Phone is optional.** The business phone is the number the business published on its own Google profile. Turn on `dropPhones` if you don't need it. We recommend turning it on if you target sole traders in the EU, UK or Quebec, where a one-person business's phone can count as personal data.

### Data freshness: please read

This Actor queries a **regularly refreshed database of Google Maps listings** (licensed from a data provider). It does **not** load Google Maps live at run time. In our tests (October 2026), most active listings had been refreshed **within the previous 1–2 months**. Records for closed businesses can be a year or more old. Every record carries `lastUpdatedTime` and `dataAgeDays` so you can judge for yourself, and the **"Record refreshed in the last N days"** filter drops stale records.

Other things to know:

- **"First seen" is not an opening date.** It is when the provider's crawler first found the listing, and an established business can be "first seen" recently. To find likely *new* businesses, combine *first seen in the last 60–90 days* with *fewer than 5 reviews*.
- **Coverage is good but not 100% of Google Maps.** Some businesses are missing, and a business can have a website that Google doesn't show. Check a lead on its Google Maps link before you pitch.
- **"close" status** means the business was outside its opening hours at crawl time. It does not mean the business is closed for good. Permanently closed businesses show `closed_forever`.

### Pricing

Pay per event. You pay only for businesses delivered, and businesses that match a premium segment filter (no website, unclaimed, rating below, fewer reviews, first seen) are priced as segment results. Runs that return no businesses, have invalid input or hit provider errors are **not charged**. The Actor respects your **maximum charge per run**: it requests only as many businesses as fit your budget.

| Event | Price | When it's charged |
|---|---|---|
| Run start | $0.015 per run | Once per run, only if at least one business is returned |
| Business | $0.002 per business ($2.00 per 1,000) | Each business delivered when no premium segment filter is used |
| Segment business | $0.005 per business ($5.00 per 1,000) | Each business delivered when a premium segment filter is used (no website, social-only, unclaimed, rating below, fewer reviews, first seen) |
| Actor start (Apify) | $0.00005 per run | Apify's standard start event (one per GB of memory; the default 256 MB is one event) |

Examples: 100 plumbers with no website cost $0.015 + 100 × $0.005 = **$0.515**. 1,000 dentists with no segment filter cost $0.015 + 1,000 × $0.002 = **$2.015**. Apify's $0.00005 start event comes on top. Filters such as category, location, business status, sorting or "updated within N days" don't make a run a segment run.

### Run time and cost examples

Costs use the current list prices on the Apify Free plan, including Apify's $0.00005 start event. Run times are from our own test runs in October 2026 at the default memory; yours depend on the input.

| Run | Run time (our tests) | Cost (Free plan) |
|---|---|---|
| 20 plumbers in Austin, TX with no website and an unclaimed profile | about 4 s | about $0.115 |
| 100 plumbers with no website | not measured yet | about $0.52 |
| 1,000 dentists, no segment filter | not measured yet | about $2.02 |

Business: $0.002 on the Apify Free plan, $0.0018 on Starter (Bronze), $0.0016 on Scale (Silver), $0.0015 on Business (Gold) and above. The discount is applied automatically. Segment business: $0.005 / $0.0045 / $0.004 / $0.00375.

### Tips

- **Covering a big metro:** run a few coordinate circles of 10–25 km rather than one huge radius, then dedupe on `placeId`.
- **Finding category names:** use the Google Maps category in snake_case (`roofing_contractor`, `nail_salon`, `real_estate_agency`). A misspelling returns suggestions.
- **Scheduling:** run it weekly with *first seen in the last 7 days* to get a feed of newly listed businesses in your area.

### Use it from an AI agent (Apify MCP)

Give Claude, Cursor, VS Code or any other MCP client this Actor as a tool through the [Apify MCP server](https://mcp.apify.com). Add this to your client's MCP config; you sign in to Apify with OAuth on first connect:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=steady-scrape/google-maps-business-segments"
    }
  }
}
```

Clients without OAuth can send an `Authorization: Bearer <APIFY_TOKEN>` header instead. Then ask, for example: *"Find plumbers within 25 km of Austin, TX that have no website on their Google Maps profile."* The agent starts a normal run, so the prices above and your maximum charge per run still apply.

### FAQ

**Is this a Google Maps scraper?** No browser and no scraping at run time. It reads a licensed, regularly refreshed database of Google Maps listings, which is why runs are fast and never get blocked, and why records come with freshness dates.

**Why is my list shorter than Google Maps shows?** The filters are strict (for example, "no website" means no URL at all on the profile), and the database doesn't hold every listing. Use a larger radius or fewer filters.

**Can I get emails?** No, by design. This Actor gives business-level data only.

**Is it legal to use this data?** The data covers publicly listed businesses. You are responsible for following the marketing and privacy laws that apply to you (for example the GDPR, PECR, CASL, Quebec's Law 25, the TCPA and do-not-call rules) and for honouring opt-outs.

**How do I find local businesses without a website?** Pick a category and an area, set the website filter to *no website*, and run. You get only businesses whose Google Maps profile has no website, priced as segment results.

**Can I find unclaimed Google Business Profiles?** Yes. Use the unclaimed filter; it's one of the premium segment filters.

**How much does a list of 100 leads cost?** About $0.52 for 100 businesses with a segment filter, or $0.22 without one.

### More from SteadyScrape

- [Company Data by Domain](https://apify.com/steady-scrape/company-profile-by-domain): name, logo, description, industry and social links for a list of domains, from each company's own site. Enrich the leads that do have a website.
- [Google Rank Tracker](https://apify.com/steady-scrape/google-rank-tracker): track where a site ranks on Google for its keywords, with AI Overview flags. Show a local lead where it stands before you pitch SEO.
- [Domain SEO Metrics](https://apify.com/steady-scrape/domain-seo-metrics): organic and paid traffic estimates, ranked keywords, backlinks and spam score for a list of domains.
- [Keyword Search Volume](https://apify.com/steady-scrape/keyword-search-volume): Google search volume, CPC, competition and a 12-month trend for up to 10,000 keywords per run. Size the local demand behind each lead's services.

See every **SteadyScrape (steady-scrape)** Actor on [our Apify profile](https://apify.com/steady-scrape).

Questions or a filter you need? Open an issue on the Issues tab.

### Acceptable use

You may not use results from this service to build or operate a search engine, or any product or service that competes with or harms the business of search engine providers.

— SteadyScrape

# Actor input Schema

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

1-10 Google Maps business categories, e.g. plumber, dentist, roofing_contractor, hair_salon, restaurant. Spaces are fine ('roofing contractor'). Unknown names fail fast with suggestions. Businesses match on their main or additional categories.

## `coordinates` (type: `string`):

Search around a point, e.g. 30.2672,-97.7431. Most complete way to cover a metro area (catches suburbs that a city name misses). Use with radius.

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

Radius around the coordinates, in kilometres.

## `city` (type: `string`):

Alternative to coordinates: exact city name as written in the business address, e.g. Austin (all-lowercase input is capitalised automatically). Add a country code to avoid same-name cities elsewhere.

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

2-letter ISO code, e.g. US, GB, CA, AU. Can be used alone for country-wide lists.

## `postalCode` (type: `string`):

Optional exact postal code, e.g. 78704.

## `website` (type: `string`):

Segment: businesses without a website on their Google profile (web design and local SEO leads).

## `claimStatus` (type: `string`):

Segment: unclaimed Google Business Profiles.

## `ratingBelow` (type: `string`):

Segment: only businesses with a star rating strictly below this value, e.g. 4 or 3.5 (reputation management leads). Unrated businesses are excluded unless you tick the next option.

## `includeUnrated` (type: `boolean`):

Also return businesses that have no rating at all.

## `ratingAtLeast` (type: `string`):

Optional lower bound for the rating, e.g. 2 (combine with 'Rating below' for a band). Not a segment filter.

## `reviewsBelow` (type: `integer`):

Segment: businesses with fewer than this many reviews (businesses with zero reviews are included), e.g. 10.

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

Optional lower bound for the review count. Not a segment filter.

## `firstSeenWithinDays` (type: `integer`):

Segment: listings the data provider's crawler first found in the last N days. This is NOT the business opening date: an old business can be 'first seen' recently. Combine with 'Fewer reviews than' 5 to find likely new businesses.

## `updatedWithinDays` (type: `integer`):

Freshness filter: only records the database refreshed in the last N days (e.g. 60). Not a segment filter.

## `businessStatus` (type: `string`):

Status from the Google profile. Not a segment filter.

## `maxResults` (type: `integer`):

Maximum number of businesses to return (up to 10,000 per run). You are charged only for businesses returned.

## `sortBy` (type: `string`):

Which matching businesses come first when there are more than 'Max businesses'.

## `dropPhones` (type: `boolean`):

Remove the business phone from every record. Recommended if you will contact EU/UK/Quebec sole traders or don't need phones. Phone-like numbers in the business description are masked too.

## `includeHours` (type: `boolean`):

Weekly opening hours per business.

## `includeAttributes` (type: `boolean`):

Google attributes (e.g. has_delivery, wheelchair access), review topic keywords and booking/order links.

## Actor input object example

```json
{
  "categories": [
    "plumber"
  ],
  "coordinates": "30.2672,-97.7431",
  "radiusKm": 15,
  "website": "noWebsite",
  "claimStatus": "any",
  "includeUnrated": false,
  "businessStatus": "operating",
  "maxResults": 50,
  "sortBy": "reviewsDesc",
  "dropPhones": false,
  "includeHours": true,
  "includeAttributes": true
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per business.

## `freshness` (type: `string`):

When each record was last refreshed and first seen.

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

Totals, filters used and charges.

# 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": [
        "plumber"
    ],
    "coordinates": "30.2672,-97.7431",
    "radiusKm": 15,
    "website": "noWebsite",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("steady-scrape/google-maps-business-segments").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": ["plumber"],
    "coordinates": "30.2672,-97.7431",
    "radiusKm": 15,
    "website": "noWebsite",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("steady-scrape/google-maps-business-segments").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": [
    "plumber"
  ],
  "coordinates": "30.2672,-97.7431",
  "radiusKm": 15,
  "website": "noWebsite",
  "maxResults": 50
}' |
apify call steady-scrape/google-maps-business-segments --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steady-scrape/google-maps-business-segments"
        }
    }
}
```

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/2bghNMoi2bwynQhGu/builds/L52ChJ0jqZp912LKg/openapi.json
