# Local Business Website Health Monitor (`savannahprime-agency/local-business-website-health-monitor`) Actor

Audit public business websites for health, contact, conversion, and SEO signals. Get uptime, HTTPS, response-time, broken-link, contact-path, booking, and metadata findings, plus transparent agency opportunity scores and repeat-run change detection.

- **URL**: https://apify.com/savannahprime-agency/local-business-website-health-monitor.md
- **Developed by:** [Fredrick Saruni](https://apify.com/savannahprime-agency) (community)
- **Categories:** Lead generation, SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Local Business Website Health Monitor

Audit public business websites for technical health, contact, conversion, and SEO signals, then prioritize the strongest agency opportunities with transparent scores.

### What this Actor does

Local Business Website Health Monitor is designed for local SEO agencies, web-design agencies, reputation-management providers, and sales teams. Give it a list of public business websites and it returns one normalized record per site with reachability, HTTP status, redirect count, HTTPS, response time, page title, meta description, mobile viewport, canonical URL, robots.txt, public business phones and emails, contact paths, forms, booking links, social profiles, sampled broken internal links, and transparent health and opportunity scores.

The Actor is also designed for repeat use. When `changeDetection` is enabled, it stores a compact snapshot in the Actor’s key-value store and reports material changes on later runs. Create an Apify task with the same URL list and schedule it daily or weekly to maintain a lightweight website watchlist.

### Quick start

Provide public website URLs in `websiteUrls`:

```json
{
  "websiteUrls": [
    "https://example-business.com",
    "https://another-business.com"
  ],
  "businessNames": [
    "Example Business",
    "Another Business"
  ],
  "maxUrls": 25,
  "crawlInternalLinks": true,
  "maxInternalLinks": 8,
  "auditContactPages": true,
  "websiteTimeoutSecs": 15,
  "slowResponseMs": 3000,
  "changeDetection": true,
  "maxConcurrency": 3
}
```

For a first run, keep the defaults. Increase `maxUrls` for a batch, reduce `maxInternalLinks` for faster audits, and keep concurrency moderate to be considerate of audited websites. The Actor rejects private, local, and internal network targets.

### Output views

The default dataset includes three useful views.

| View | Use |
|---|---|
| **Health overview** | Sort by reachability, response time, HTTPS, health score, opportunity score, and whether a site changed. |
| **Agency opportunity signals** | Review public phones and emails, contact paths, forms, booking links, metadata, broken links, and issue details. |
| **Changes since prior run** | Focus on websites whose observable status changed since a previous run of the same Actor. |

The output contains both a `healthScore` and an `opportunityScore`. A higher health score means fewer observable issues. A higher opportunity score means the audit found more visible improvement opportunities that may be relevant to web, SEO, or maintenance services. These are prioritization aids, not guarantees of ranking, conversion, deliverability, or technical compliance.

### Scoring

The health score starts at 100 and deducts points for observable issues, including unreachable pages, HTTP-only URLs, missing or weak metadata, missing mobile viewport, missing contact paths, missing public business contact details, missing booking flows, sampled broken internal links, and slow response. The score is bounded to 0–100. The opportunity score is derived from the health score with additional weight for missing contact and conversion paths, then bounded to 0–100.

Each record includes `issueCodes` and `issueSummary` so users can understand why a score was assigned. The monitor does not infer sensitive personal attributes and does not claim that a public contact value is independently verified.

### Recurring monitoring

To use the Actor as a daily or weekly monitor, create a saved Apify task with a stable URL list and leave `changeDetection` enabled. Schedule the task at a frequency appropriate for the sites being checked. The `Changes since prior run` view is most useful after the first baseline run. If the URL list changes substantially, treat the next run as a new baseline for the added websites.

### Responsible use

Audit only public URLs that you are permitted to inspect. Respect each website’s terms, robots guidance where practical, rate limits, privacy law, and applicable anti-spam and marketing rules. The Actor collects only publicly detectable business contact details from the supplied public pages; users remain responsible for verifying data and using it lawfully and responsibly.

### Local development

```bash
npm install
npm test
npm start
```

A local run can use an `INPUT.json` file with the same fields as the Apify input schema. The hosted build uses the included Playwright/Chrome Dockerfile.

### License

MIT

# Actor input Schema

## `websiteUrls` (type: `array`):

Public business website URLs to audit. Do not include private, internal, or login-only URLs.

## `businessNames` (type: `array`):

Optional labels aligned by position with Business website URLs. Labels make reports easier to use in agency workflows.

## `maxUrls` (type: `integer`):

Maximum number of unique public website URLs to audit in this run.

## `crawlInternalLinks` (type: `boolean`):

Check a bounded sample of same-domain internal links for HTTP failures.

## `maxInternalLinks` (type: `integer`):

Maximum number of same-domain links to check per website.

## `auditContactPages` (type: `boolean`):

Follow a small sample of contact, about, team, staff, or location links to find public business contact and conversion signals.

## `websiteTimeoutSecs` (type: `integer`):

Maximum time to wait for each page request.

## `slowResponseMs` (type: `integer`):

Homepage response time above this threshold creates a slow-response issue.

## `changeDetection` (type: `boolean`):

Store a compact prior snapshot and report reachability, score, issue, and link changes on later runs of the same Actor.

## `maxConcurrency` (type: `integer`):

Number of websites audited in parallel. Lower values are gentler on memory and website rate limits.

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

Optional Apify Proxy configuration for larger runs or websites that need a proxy.

## Actor input object example

```json
{
  "websiteUrls": [],
  "businessNames": [],
  "maxUrls": 25,
  "crawlInternalLinks": true,
  "maxInternalLinks": 8,
  "auditContactPages": true,
  "websiteTimeoutSecs": 15,
  "slowResponseMs": 3000,
  "changeDetection": true,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset containing one health and opportunity record per audited public website.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("savannahprime-agency/local-business-website-health-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("savannahprime-agency/local-business-website-health-monitor").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 '{}' |
apify call savannahprime-agency/local-business-website-health-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,savannahprime-agency/local-business-website-health-monitor"
        }
    }
}

```

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/DQrlI2ehpBDSoxywE/builds/iIcUv4Wy1rM9RbTKV/openapi.json
