# Google Maps NAP Consistency Checker (`reverenced_garnet/apify-gmaps-nap-checker`) Actor

Checks whether a business's Google Business Profile (name/address/phone) matches its own website, by lightly fetching the homepage and a linked contact/about page. Flags mismatches and GBP fields that are missing but findable on the site.

- **URL**: https://apify.com/reverenced\_garnet/apify-gmaps-nap-checker.md
- **Developed by:** [オレンジ Tb](https://apify.com/reverenced_garnet) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 business checks

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

### What does Google Maps NAP Consistency Checker do?

This Actor takes the output of **any Google Maps scraper** (such as [Google Maps Scraper](https://apify.com/compass/crawler-google-places)) and, for every place that has its own website, lightly fetches the homepage (and a linked contact/about page if one exists) to check whether the **Name, Address (postal code), and Phone** on the business's Google Business Profile actually match what's on their own site.

Unlike directory-based NAP checkers that compare a listing against other directories, this Actor compares against the business's **own** website — the most credible source and the strongest talking point for a sales pitch ("your Google listing doesn't match your own site").

| | This Actor (GBP vs. own website) | Directory-wide citation checkers |
|---|---|---|
| Compares against | The business's own homepage (the source *they* control) | Dozens of third-party directories (e.g. 36+ listing sites) |
| Cost per business | ≈ $0.02 at 1,000 businesses (see Pricing below) | Typically a per-report or subscription fee, often priced per business or per bundle of directories |
| Best for | A single, undeniable talking point in a sales pitch — "your own site says X, but Google says Y" | A broad audit of consistency across the wider directory ecosystem |

### Key features

- **Compares against the business's own site**, not just other directories — the strongest, most credible pitch you can show a prospect.
- **📈 Change tracking between runs**, including a `FIXED` status — re-run on the same list later and see which flagged issues are still unresolved (a strong "we told you two weeks ago" follow-up angle) vs. which prospects fixed it themselves.
- **🚫 Closed businesses excluded automatically** — nothing wasted checking a site that's no longer trading.
- Respects `robots.txt` and identifies itself with a proper User-Agent — fetches at most 2 pages per business.

### Why use this Actor?

Local SEO agencies sell NAP-consistency fixes as a service. A mismatch (or a field GBP is simply missing that the website has) is a concrete, provable problem you can show a prospect in one screenshot. This Actor surfaces those cases automatically instead of manually checking each business's site.

### How to use Google Maps NAP Consistency Checker

1. Run a Google Maps scraper for the area and category you want, and grab its dataset output.
2. Paste that array of place objects into the **Google Maps places** input field.
3. Run it. Only places with a real (non-social-media) website are checked; the rest are skipped automatically.

### Input

| Field | Type | Description |
|---|---|---|
| `places` | array | The place objects from a Google Maps scraper's dataset output |

Example input:

```json
{
  "places": [{ "title": "benchmark TOKYO", "placeId": "ChIJh7CHNpSNGGARCSaXuKdrpF0" }]
}
```

### Output

```json
{
  "title": "benchmark TOKYO",
  "placeId": "ChIJh7CHNpSNGGARCSaXuKdrpF0",
  "fetchedOk": true,
  "postalMatch": true,
  "phoneStatus": "gbp_missing_on_site_found",
  "nameFoundOnSite": true,
  "changeStatus": "NEW",
  "reasons": ["GBP has no phone number, but the website lists one — quick fix opportunity"]
}
```

`phoneStatus` is one of: `match`, `mismatch`, `gbp_missing_on_site_found`, `site_missing_gbp_has`, `both_missing`, or `unknown` (fetch failed). `changeStatus` is `NEW`, `UPDATED`, `UNCHANGED`, or `FIXED` (had issues last run, none now) vs. your previous run on this Actor.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Type | Description |
|---|---|---|
| `title` | string | Business name |
| `placeId` | string | Google Maps place ID |
| `fetchedOk` | boolean | False if the website couldn't be fetched (down, blocked, disallowed by robots.txt) |
| `postalMatch` | boolean | null | Whether the GBP postal code matches one found on the site; null if not comparable |
| `phoneStatus` | string | `match`, `mismatch`, `gbp_missing_on_site_found`, `site_missing_gbp_has`, `both_missing`, or `unknown` |
| `nameFoundOnSite` | boolean | null | Whether the GBP business name is clearly present on the site |
| `changeStatus` | string | `NEW`, `UPDATED`, `UNCHANGED`, or `FIXED` vs. the previous run on this Actor |
| `reasons` | array | Plain-English list of the specific issues found |

### Pricing / cost estimation

Pay-per-event: a small flat fee when a run starts, plus a per-check fee for each business checked ($0.01 run start + $0.01 per business checked). This Actor fetches at most 2 pages per business (homepage + one linked contact/about page if found), so cost stays predictable — it doesn't crawl the whole site. Unlike the zero-fetch Actors in this family, each check does real HTTP requests, which is why it is priced per business checked rather than as a fraction of scraping cost.

**How much does checking 1,000 businesses cost, on top of scraping them?**

| Step | Cost for 1,000 places |
|---|---|
| Scrape 1,000 places with [Google Maps Scraper](https://apify.com/compass/crawler-google-places) | Listed "from $1.50 / 1,000 places" on its Store page; ≈ $4 / 1,000 measured in practice (Aug 2026) |
| NAP-check those same 1,000 businesses with this Actor | $0.01 run start + 1,000 × $0.01 ≈ **$10.01** |

The scraping is already paid for; this Actor adds about $10.01 per 1,000 businesses checked — still far cheaper than manually visiting each site yourself.

### Tips

- Run this after [Google Maps Lead Priority Scorer](https://apify.com/reverenced_garnet/apify-gmaps-lead-priority) or [No-Website & Unclaimed Leads](https://apify.com/reverenced_garnet/apify-gmaps-nosite-unclaimed) to layer NAP findings onto your existing lead list.
- Businesses without a real website are automatically skipped (there's nothing to check against) — use the companion no-website Actor for those instead.
- Want flagged issues pushed to Slack, Telegram, or your own webhook automatically? Set that up under this Actor's **Integrations** tab in Apify Console — no extra code needed.

### FAQ, disclaimers and support

- If the site can't be fetched (down, blocks bots, times out), the result is marked `fetchedOk: false` rather than silently treated as a match.
- If the Google Business Profile has a `postalCode` field (as returned by most Google Maps scrapers), that code is checked against the site's text directly — with or without a 〒 mark, so US ZIP codes and other formats work too. If the GBP has no `postalCode` field, this Actor falls back to extracting 〒-marked postal codes from both the GBP address and the site text and comparing those; if either side has none, the result is `postalMatch: null` (not comparable).
- Found an edge case? Use the Issues tab on this Actor's page.
- **Limitations**: if no postal code can be found anywhere in the site's text, `postalMatch` is reported as `false` (a mismatch), not `null` — the site not showing its postal code at all is itself flagged, rather than treated as unknown.

### Legal & responsible use

This Actor is an independent, unofficial tool. It is not affiliated with, endorsed by, or sponsored by Google. "Google Maps" and "Google Business Profile" are trademarks of Google LLC, used here only to describe compatibility.

The presence of a phone number or address on a public Google Business Profile does not by itself constitute consent to receive marketing calls or messages. Before using this data for outreach you are responsible for complying with the laws that apply to you and your recipients — for example GDPR/UK GDPR, CAN-SPAM and TCPA in the US, and Japan's Act on Regulation of Transmission of Specified Electronic Mail and Act on Specified Commercial Transactions. This Actor does not verify consent or opt-in status.

This Actor fetches at most two pages per business, only where the site's robots.txt allows it, and identifies itself with a descriptive User-Agent. You remain responsible for complying with the terms of service of any site you check and for using the results only for legitimate purposes.

# Actor input Schema

## `places` (type: `array`):

Paste the dataset output (array of place objects) from a Google Maps scraper Actor here — e.g. Compass's "Google Maps Scraper". Only places with a real (non-social-media) website are checked; the rest are skipped.

## Actor input object example

```json
{
  "places": []
}
```

# Actor output Schema

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

No description

# 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 = {
    "places": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("reverenced_garnet/apify-gmaps-nap-checker").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 = { "places": [] }

# Run the Actor and wait for it to finish
run = client.actor("reverenced_garnet/apify-gmaps-nap-checker").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 '{
  "places": []
}' |
apify call reverenced_garnet/apify-gmaps-nap-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reverenced_garnet/apify-gmaps-nap-checker"
        }
    }
}

```

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/BX2E6Uk6sLu9kQMbh/builds/UZmEWF1WrGyQ2eIvJ/openapi.json
