Local Citation / NAP Consistency Scanner
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Production-ready Apify Actor that audits public local citation surfaces for NAP consistency.
What it does
- Accepts canonical
businessName,address,phone,websiteordomain, plus optionalcity,state,country, andmaxSources. - 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
fixtureModefor 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:
businessNameaddressphonewebsiteordomaincityoptionalstateoptionalcountryoptionalmaxSourcesoptional, default8fixtureModeoptional
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,sourceUrlstatus,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/defaultcp examples/sample-input.json ./apify_storage/key_value_stores/default/INPUT.jsonCRAWLEE_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/