# Small Business Website Opportunity Finder (`metahubb/small-business-website-opportunity-finder`) Actor

Find small business websites with visible opportunity gaps using geography and category searches, then score their website quality and improvement potential.

- **URL**: https://apify.com/metahubb/small-business-website-opportunity-finder.md
- **Developed by:** [Jesper Frilund](https://apify.com/metahubb) (community)
- **Categories:** Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

## Small Business Website Opportunity Finder

Find small businesses with websites that show visible improvement opportunities — useful for freelance web developers, small agencies, SEO consultants, and lead generation teams.

This Actor discovers businesses from a place + category, visits their websites, and scores practical website gaps such as weak booking paths, thin content, missing trust signals, and unclear contact information.

### What it does

1. Searches for businesses by geography and category.
2. Finds each business website when available.
3. Fetches the homepage and priority pages.
4. Extracts website signals.
5. Returns opportunity and trust scores with outreach-friendly summaries.

### Good use cases

- Find local businesses that may need a website refresh.
- Build prospect lists for web design, SEO, CRO, or conversion work.
- Prioritize outreach based on visible website gaps.
- Compare businesses in the same category and city.

### Example inputs

```json
{
  "places": ["Nyköping, Sweden"],
  "categories": ["pizza restaurant"],
  "maxResults": 5,
  "maxPagesPerSite": 1
}
````

```json
{
  "places": ["Norrköping, Sweden"],
  "categories": ["pet groomer"],
  "maxResults": 10,
  "maxPagesPerSite": 2
}
```

```json
{
  "places": ["Manchester, UK"],
  "categories": ["hair salon", "barbershop"],
  "maxResults": 20,
  "maxPagesPerSite": 3
}
```

### Input fields

| Field | Type | Description |
|---|---:|---|
| `places` | array | Cities, regions, or geographies to search in. |
| `categories` | array | Business categories to search for, e.g. `pizza restaurant`, `pet groomer`, `hair salon`. |
| `maxResults` | integer | Maximum number of websites to analyze. |
| `maxPagesPerSite` | integer | Maximum number of pages to fetch per website. |
| `googleMapsMaxCrawledPlacesPerSearch` | integer | How many Google Maps places to inspect per query before filtering. Default is 20. |
| `domains` | array | Optional manual domain list for direct audit mode. Leave empty for discovery mode. |

### Output fields

Each result includes:

- business name
- domain
- discovery source
- contact information when found
- opportunity score (`wpqs`)
- trust score (`trustWpqs`)
- website signals
- small-business fit details
- opportunity types
- suggested fixes
- concise summary

Example output shape:

```json
{
  "businessName": "Pizzeria Mamma Mia",
  "domain": "mammamiapizza.se",
  "discoverySource": "google-maps-scraper",
  "contact": {
    "phone": "...",
    "email": null,
    "address": "..."
  },
  "wpqs": {
    "displayScore": 72,
    "direction": "opportunity",
    "redFlags": ["privacy_signal_weak"]
  },
  "trustWpqs": {
    "displayScore": 41,
    "direction": "trust"
  },
  "smallBusinessExtras": {
    "opportunityTypes": ["trust_hygiene_gap"],
    "topFixes": ["add privacy policy"],
    "outreachAngle": "Lead with trust cleanup..."
  }
}
```

### How to interpret scores

- **Opportunity score**: higher means the website appears to have more visible improvement potential.
- **Trust score**: higher means the website has stronger trust and hygiene signals.
- **Small business fit**: helps separate realistic independent-business prospects from larger chains or platforms.

### Notes and limitations

This is a beta tool. Results are heuristic and should be spot-checked before outreach.

Discovery depends on search/map data availability. Some businesses may only list Facebook, Foodora, booking platforms, or no website at all. The Actor prioritizes real business websites over directories and weak platform pages when possible.

Scores are website-quality signals, not a judgment of the business itself.

### Best workflow

1. Start with one city and one category.
2. Use `maxResults` between 5 and 20 for a quick first pass.
3. Spot-check the top results.
4. Export usable leads into your CRM or outreach sheet.
5. Refine category/place and rerun.

# Actor input Schema

## `places` (type: `array`):

Cities, regions, or place names to search in

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

Small business categories to search for

## `domains` (type: `array`):

Optional direct domains for audit mode; leave empty for discovery mode

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

Maximum businesses to analyze

## `maxPagesPerSite` (type: `integer`):

Maximum pages to fetch per website

## `googleMapsMaxCrawledPlacesPerSearch` (type: `integer`):

How many Google Maps places to pull per query before website scoring

## Actor input object example

```json
{
  "places": [
    "Norrköping, Sweden",
    "Linköping, Sweden"
  ],
  "categories": [
    "hair salon",
    "pet groomer",
    "bed and breakfast"
  ],
  "maxResults": 30,
  "maxPagesPerSite": 4,
  "googleMapsMaxCrawledPlacesPerSearch": 50
}
```

# 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 = {
    "places": [
        "Norrköping, Sweden",
        "Linköping, Sweden"
    ],
    "categories": [
        "hair salon",
        "pet groomer",
        "bed and breakfast"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("metahubb/small-business-website-opportunity-finder").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 = {
    "places": [
        "Norrköping, Sweden",
        "Linköping, Sweden",
    ],
    "categories": [
        "hair salon",
        "pet groomer",
        "bed and breakfast",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("metahubb/small-business-website-opportunity-finder").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 '{
  "places": [
    "Norrköping, Sweden",
    "Linköping, Sweden"
  ],
  "categories": [
    "hair salon",
    "pet groomer",
    "bed and breakfast"
  ]
}' |
apify call metahubb/small-business-website-opportunity-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=metahubb/small-business-website-opportunity-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Small Business Website Opportunity Finder",
        "description": "Find small business websites with visible opportunity gaps using geography and category searches, then score their website quality and improvement potential.",
        "version": "0.1",
        "x-build-id": "v6TClLXrDIfs9bE5f"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/metahubb~small-business-website-opportunity-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-metahubb-small-business-website-opportunity-finder",
                "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/metahubb~small-business-website-opportunity-finder/runs": {
            "post": {
                "operationId": "runs-sync-metahubb-small-business-website-opportunity-finder",
                "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/metahubb~small-business-website-opportunity-finder/run-sync": {
            "post": {
                "operationId": "run-sync-metahubb-small-business-website-opportunity-finder",
                "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",
                "properties": {
                    "places": {
                        "title": "Places / geography",
                        "type": "array",
                        "description": "Cities, regions, or place names to search in",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Business categories",
                        "type": "array",
                        "description": "Small business categories to search for",
                        "items": {
                            "type": "string"
                        }
                    },
                    "domains": {
                        "title": "Manual domains (optional)",
                        "type": "array",
                        "description": "Optional direct domains for audit mode; leave empty for discovery mode",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Maximum businesses to analyze",
                        "default": 30
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum pages to fetch per website",
                        "default": 4
                    },
                    "googleMapsMaxCrawledPlacesPerSearch": {
                        "title": "Google Maps places per search",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "How many Google Maps places to pull per query before website scoring",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
