Local Citation / NAP Consistency Scanner avatar

Local Citation / NAP Consistency Scanner

Pricing

Pay per usage

Go to Apify Store
Local Citation / NAP Consistency Scanner

Local Citation / NAP Consistency Scanner

Scans public website and local citation surfaces for NAP and domain consistency using safe shallow fetches and deterministic fixtures.

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

8 days ago

Last modified

Share

Production-ready Apify Actor that audits public local citation surfaces for NAP consistency.

What it does

  • Accepts canonical businessName, address, phone, website or domain, plus optional city, state, country, and maxSources.
  • Scans shallow public sources only: official website, contact/about pages found on the same domain, Google/Bing SERP URLs, Yelp, Yellow Pages, BBB, and Chamber of Commerce search surfaces when feasible.
  • Normalizes phone, address, and domain values enough for MVP comparison.
  • Emits one dataset row per citation/source plus one summary audit row.
  • Flags exact matches, near mismatches, hard mismatches, missing profiles, duplicate-looking listings, and wrong domains with evidence snippets.
  • Supports deterministic fixtureMode for smoke tests and offline runs.

Safety and scope

  • No login flows, private APIs, CAPTCHAs, bypass behavior, or authenticated surfaces.
  • Live crawling stays shallow: homepage, up to two same-domain contact/about/location pages, and a limited set of public search/directory URLs.
  • Some directory/search pages may block or localize aggressively. The actor records those as missing or partial observations instead of failing the whole run.

Input

Top-level single business fields:

  • businessName
  • address
  • phone
  • website or domain
  • city optional
  • state optional
  • country optional
  • maxSources optional, default 8
  • fixtureMode optional

Batch input is also supported with businessRows.

Fixture input is supported via rawFixture on a row or fixtureBusinesses.

Example:

{
"fixtureMode": true,
"businessName": "Northwind Dental",
"address": "123 Main Street Suite 200, Austin, TX 78701",
"phone": "+1 (512) 555-0100",
"website": "https://northwinddental.example",
"city": "Austin",
"state": "TX",
"country": "USA",
"maxSources": 7,
"rawFixture": {
"sources": []
}
}

Output

Each citation row includes:

  • rowType: "citation"
  • sourceName, sourceType, sourceUrl
  • status, severity, flags, confidence
  • canonical NAP/domain
  • observed NAP/domain
  • comparison fields
  • evidenceSnippet

Each business also gets one summary row with:

  • rowType: "summary"
  • aggregate match counts
  • overall status, severity, flags, confidence

Local usage

Install dependencies:

$npm install

Run locally with Apify storage:

mkdir -p ./apify_storage/key_value_stores/default
cp examples/sample-input.json ./apify_storage/key_value_stores/default/INPUT.json
CRAWLEE_STORAGE_DIR=./apify_storage ACTOR_DEFAULT_KEY_VALUE_STORE_ID=default ACTOR_INPUT_KEY=INPUT npm start

Run the deterministic smoke tests:

$npm test

Files

  • Actor metadata: .actor/actor.json
  • Input schema: .actor/input_schema.json
  • Examples: examples/sample-input.json, examples/sample-output.json
  • Source code: src/
  • Smoke tests: tests/smoke/