# Local Business Lead Enrichment Pack (`isotonic/local-business-lead-enrichment-pack`) Actor

Enriches local business websites by crawling the homepage and likely contact/about pages on the same origin.

- **URL**: https://apify.com/isotonic/local-business-lead-enrichment-pack.md
- **Developed by:** [Brian Keefe](https://apify.com/isotonic) (community)
- **Categories:** Lead generation, Business, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Local Business Lead Enrichment Pack

Production-ready Node.js Apify Actor for bounded local business website enrichment.

This actor is strongest when you provide `startUrls`, `domains`, or `businesses` with a known website. `keywordLocationPairs` are supported only as deterministic seed records when public search discovery is unavailable, so Maps/search-style inputs are optional and best-effort.

### What It Does

- Accepts `startUrls`, `domains`, `businesses`, `keywordLocationPairs`, `maxPagesPerSite`, and `requestTimeoutSecs`
- Enriches each supplied business/site with same-origin bounded crawling
- Fetches the homepage plus likely contact/about pages first
- Extracts:
  - business identity
  - website/homepage/contact page URL
  - visible phones and emails
  - social links
  - schema.org JSON-LD
  - title and meta description
  - schema rating and review count when available
- Computes flags:
  - `noWebsite`
  - `noHttps`
  - `missingContactPage`
  - `missingSocials`
  - `noVisibleEmail`
  - `weakTitleMeta`
  - `outdatedCopyright`
- Writes one output record per input business/site to the default dataset
- Writes aggregate counts to the `SUMMARY` key in the default key-value store

### Files

- `.actor/actor.json`
- `.actor/input_schema.json`
- `src/main.js`
- `src/extractor.js`
- `examples/sample-input.json`
- `examples/sample-output.json`
- `tests/smoke.test.js`

`examples/sample-output.json` is a representative record set produced by the bundled offline fixture used in the smoke test.

### Input

Example:

```json
{
  "startUrls": [{ "url": "https://example.com" }],
  "domains": ["example.org"],
  "businesses": [
    {
      "name": "Acme Dental",
      "domain": "acmedental.test",
      "location": "Springfield, IL"
    }
  ],
  "keywordLocationPairs": [
    { "keyword": "dentist", "location": "Springfield, IL" }
  ],
  "maxPagesPerSite": 4,
  "requestTimeoutSecs": 15
}
````

Input notes:

- `startUrls`: best option when you already know the website
- `domains`: actor tries `https://` first and falls back to `http://`
- `businesses`: accepts string names or objects with `name`, `url`, `domain`, `location`
- `keywordLocationPairs`: produces deterministic seed records if no public search discovery is available
- `maxPagesPerSite`: hard cap on same-origin pages fetched per site
- `requestTimeoutSecs`: per-request timeout

### Output

Each dataset item is one business/site record. Representative fields:

```json
{
  "recordType": "website",
  "sourceType": "startUrl",
  "businessName": "Acme Dental",
  "website": "https://acme.example",
  "homepageUrl": "https://acme.example",
  "contactPageUrl": "https://acme.example/contact",
  "phones": ["+1 555 222 3333"],
  "emails": ["hello@acme.example"],
  "socialLinks": ["https://www.facebook.com/acme"],
  "title": "Acme Dental | Family Dentist in Springfield",
  "metaDescription": "Acme Dental provides family dentistry in Springfield.",
  "schemaOrg": [],
  "ratingValue": 4.8,
  "reviewCount": 127,
  "flags": {
    "noWebsite": false,
    "noHttps": false,
    "missingContactPage": false,
    "missingSocials": false,
    "noVisibleEmail": false,
    "weakTitleMeta": false,
    "outdatedCopyright": false
  },
  "suggestedOutreachAngle": "Lead with a concise website improvement pitch: ..."
}
```

The actor also stores a `SUMMARY` object in the key-value store with totals and flag counts.

### Local Usage

Install:

```bash
npm install
```

Run tests:

```bash
npm test
```

Run smoke test only:

```bash
npm run smoke
```

Run actor locally with Apify local storage:

```bash
APIFY_LOCAL_STORAGE_DIR=./storage npm start -- --input=examples/sample-input.json
```

If you prefer, you can also place the input in `storage/key_value_stores/default/INPUT.json` and run `npm start`.

### Publish Command

When ready to publish to Apify:

```bash
apify push
```

### Limitations

- Website/domain inputs are the robust path
- `keywordLocationPairs` do not use Google login, Maps login, or brittle authenticated scraping
- Pages outside the original origin are ignored
- The actor is intentionally bounded and may miss deep contact details hidden behind complex JS apps or forms
- `outdatedCopyright` is heuristic and based on visible page text

# Actor input Schema

## `startUrls` (type: `array`):

Website URLs to enrich. These are the most reliable inputs.

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

Bare domains to enrich. The actor will try HTTPS first, then HTTP.

## `businesses` (type: `array`):

Optional named businesses to enrich. Each item may include name, url, domain, and location.

## `keywordLocationPairs` (type: `array`):

Optional best-effort seed generation input when a website or domain is not known.

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

Maximum same-origin pages to fetch per website, including the homepage.

## `requestTimeoutSecs` (type: `integer`):

Timeout per HTTP request.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "domains": [],
  "businesses": [],
  "keywordLocationPairs": [],
  "maxPagesPerSite": 4,
  "requestTimeoutSecs": 15
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://example.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("isotonic/local-business-lead-enrichment-pack").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 = { "startUrls": [{ "url": "https://example.com" }] }

# Run the Actor and wait for it to finish
run = client.actor("isotonic/local-business-lead-enrichment-pack").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 '{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ]
}' |
apify call isotonic/local-business-lead-enrichment-pack --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=isotonic/local-business-lead-enrichment-pack",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Local Business Lead Enrichment Pack",
        "description": "Enriches local business websites by crawling the homepage and likely contact/about pages on the same origin.",
        "version": "0.1",
        "x-build-id": "e5qyzkCTKn1LPHMEP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/isotonic~local-business-lead-enrichment-pack/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-isotonic-local-business-lead-enrichment-pack",
                "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/isotonic~local-business-lead-enrichment-pack/runs": {
            "post": {
                "operationId": "runs-sync-isotonic-local-business-lead-enrichment-pack",
                "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/isotonic~local-business-lead-enrichment-pack/run-sync": {
            "post": {
                "operationId": "run-sync-isotonic-local-business-lead-enrichment-pack",
                "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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Website URLs to enrich. These are the most reliable inputs.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "domains": {
                        "title": "Domains",
                        "type": "array",
                        "description": "Bare domains to enrich. The actor will try HTTPS first, then HTTP.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "businesses": {
                        "title": "Businesses",
                        "type": "array",
                        "description": "Optional named businesses to enrich. Each item may include name, url, domain, and location.",
                        "default": []
                    },
                    "keywordLocationPairs": {
                        "title": "Keyword/Location Pairs",
                        "type": "array",
                        "description": "Optional best-effort seed generation input when a website or domain is not known.",
                        "default": []
                    },
                    "maxPagesPerSite": {
                        "title": "Max Pages Per Site",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum same-origin pages to fetch per website, including the homepage.",
                        "default": 4
                    },
                    "requestTimeoutSecs": {
                        "title": "Request Timeout (seconds)",
                        "minimum": 3,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Timeout per HTTP request.",
                        "default": 15
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
