Local Business Lead Enrichment Pack avatar

Local Business Lead Enrichment Pack

Pricing

Pay per usage

Go to Apify Store
Local Business Lead Enrichment Pack

Local Business Lead Enrichment Pack

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

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Brian Keefe

Brian Keefe

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Share

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:

{
"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:

{
"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:

$npm install

Run tests:

$npm test

Run smoke test only:

$npm run smoke

Run actor locally with Apify local storage:

$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:

$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