# GBP Completeness Audit - Score Google Business Profiles (`santamaria-automations/gbp-completeness-audit`) Actor

Score any Google Business Profile against an 8-signal completeness rubric. Flags profiles missing a website or ownership claim as HIGH-priority leads for local SEO agencies. Zero-fetch, zero-LLM. Pay-per-result.

- **URL**: https://apify.com/santamaria-automations/gbp-completeness-audit.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 28 total users, 18 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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/platform/actors/running/actors-in-store#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

## GBP Completeness Audit

Score any Google Business Profile against an 8-signal completeness rubric. Surfaces high-priority local SEO leads: profiles with no website or an unclaimed listing. Zero fetches, zero LLM, zero API keys.

Feed it the output of the [Google Maps Scraper](https://apify.com/santamaria-automations/google-maps-scraper) and get one score row per business, ready to sort in a sheet or push into a CRM.

### What It Does

For every input place record the actor evaluates 8 signals:

| Signal | Weight | Full credit when |
|--------|--------|------------------|
| Website | 1 pt | `website` is set |
| Phone | 1 pt | `phone` is set |
| Hours | 1 pt | `open_hours` is populated |
| Description | 1 pt | `description` is set |
| Category | 1 pt | `category` or `categories` is set |
| Photos | 0 / 0.5 / 1 pt | 0 / 1-4 / 5+ photos |
| Reviews | 0 / 0.5 / 1 pt | 0 / 1-9 / 10+ reviews |
| Claimed | 1 pt | `owner` object present |

Total points are scaled to a 0-100 `gbp_completeness_score`. The actor also returns:

- `sub_scores` - per-signal raw score, so you can rebuild your own weighting
- `missing_fields[]` - the field names that scored 0, ready to hand to the business owner
- `lead_priority_flag` - `HIGH` when the profile has no website OR is unclaimed, `NORMAL` otherwise

`HIGH` profiles are the sweet spot for local SEO agencies: the business exists on Google Maps but has not claimed its listing or built a website.

### Input

Two shapes are accepted, and you can mix them in a single run.

Flat places list (natural shape, just pipe the google-maps-scraper output):

```json
{
  "places": [
    { "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4", "title": "Example Restaurant Ltd.", "website": "..." }
  ]
}
```

Companies shape (with a `company_id` passthrough for join-back to your CRM):

```json
{
  "companies": [
    { "company_id": "acme-42", "place": { "place_id": "ChIJ...", "title": "Acme Widgets GmbH" } }
  ]
}
```

### Output

One row per input place:

```json
{
  "company_id": "acme-42",
  "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "cid": "10281019595535971924",
  "name": "Example Restaurant Ltd.",
  "gbp_completeness_score": 88,
  "sub_scores": {
    "has_website": 1, "has_phone": 1, "has_hours": 1, "has_description": 0,
    "has_category": 1, "photo_count": 0.5, "review_count": 1, "is_claimed": 1
  },
  "missing_fields": ["description"],
  "lead_priority_flag": "NORMAL",
  "scraped_at": "2026-07-17T10:30:00Z"
}
```

### How To Use It

1. Run [Google Maps Scraper](https://apify.com/santamaria-automations/google-maps-scraper) to collect places for a niche and city.
2. Feed the dataset into this actor as `places`.
3. Sort the output by `lead_priority_flag = HIGH` and `gbp_completeness_score` ascending.
4. Pitch those businesses first. They have the most room to improve, which makes them the easiest to close.

### Pricing

Pay-per-result via Apify Pay-Per-Event billing:

| Event | Price | Description |
|-------|-------|-------------|
| Actor start | $0.001 | Charged once per run |
| Place audited | $0.003 | Charged per scored place |

Auditing 1,000 places costs about $3. No monthly fees, no minimums.

### Related Actors

Discovery:

- [Google Maps Scraper](https://apify.com/santamaria-automations/google-maps-scraper) - collect places in bulk

Enrichment:

- [AI Icebreaker Generator](https://apify.com/santamaria-automations/ai-icebreaker) - one personalized cold-outreach line per business
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper) - pull emails and phones from company sites
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor) - LLM-powered people extraction

### Issues & Feature Requests

If a signal is missing or you would score things differently, open an issue on the actor's Issues tab and we will take a look.

# Actor input Schema

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

Array of Google Maps place records to audit. Each element is a full place object as emitted by the google-maps-scraper actor (with `title`, `website`, `phone`, `open_hours`, `description`, `category`, `categories`, `images`, `review_count`, `owner`, etc.).

## `companies` (type: `array`):

Alternative shape. Each entry carries a company\_id that is echoed on the output row, letting you join audit results back to your source data.

## `proxyConfiguration` (type: `object`):

Not used by the audit itself (no HTTP calls). Present for schema consistency with sibling add-ons.

## Actor input object example

```json
{
  "places": [
    {
      "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
      "cid": "10281019595535971924",
      "title": "Example Restaurant Ltd.",
      "category": "Italian restaurant",
      "categories": [
        "Italian restaurant",
        "Pizza restaurant"
      ],
      "website": "https://example-restaurant.example",
      "phone": "+49 89 12345678",
      "description": "Sample Italian restaurant in Munich, family-owned since 1985.",
      "open_hours": {
        "Monday": "11:00-22:00",
        "Tuesday": "11:00-22:00"
      },
      "review_count": 320,
      "review_rating": 4.5,
      "images": [
        {
          "title": "Interior",
          "image": "https://lh5.googleusercontent.com/p/1.jpg"
        },
        {
          "title": "Dish",
          "image": "https://lh5.googleusercontent.com/p/2.jpg"
        },
        {
          "title": "Menu",
          "image": "https://lh5.googleusercontent.com/p/3.jpg"
        },
        {
          "title": "Storefront",
          "image": "https://lh5.googleusercontent.com/p/4.jpg"
        },
        {
          "title": "Terrace",
          "image": "https://lh5.googleusercontent.com/p/5.jpg"
        }
      ],
      "owner": {
        "id": "123",
        "name": "Example Restaurant Ltd.",
        "link": "https://maps.google.com/owner"
      }
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `audits` (type: `string`):

Dataset of scored places

# 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": [
        {
            "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
            "cid": "10281019595535971924",
            "title": "Example Restaurant Ltd.",
            "category": "Italian restaurant",
            "categories": [
                "Italian restaurant",
                "Pizza restaurant"
            ],
            "website": "https://example-restaurant.example",
            "phone": "+49 89 12345678",
            "description": "Sample Italian restaurant in Munich, family-owned since 1985.",
            "open_hours": {
                "Monday": "11:00-22:00",
                "Tuesday": "11:00-22:00"
            },
            "review_count": 320,
            "review_rating": 4.5,
            "images": [
                {
                    "title": "Interior",
                    "image": "https://lh5.googleusercontent.com/p/1.jpg"
                },
                {
                    "title": "Dish",
                    "image": "https://lh5.googleusercontent.com/p/2.jpg"
                },
                {
                    "title": "Menu",
                    "image": "https://lh5.googleusercontent.com/p/3.jpg"
                },
                {
                    "title": "Storefront",
                    "image": "https://lh5.googleusercontent.com/p/4.jpg"
                },
                {
                    "title": "Terrace",
                    "image": "https://lh5.googleusercontent.com/p/5.jpg"
                }
            ],
            "owner": {
                "id": "123",
                "name": "Example Restaurant Ltd.",
                "link": "https://maps.google.com/owner"
            }
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/gbp-completeness-audit").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": [{
            "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
            "cid": "10281019595535971924",
            "title": "Example Restaurant Ltd.",
            "category": "Italian restaurant",
            "categories": [
                "Italian restaurant",
                "Pizza restaurant",
            ],
            "website": "https://example-restaurant.example",
            "phone": "+49 89 12345678",
            "description": "Sample Italian restaurant in Munich, family-owned since 1985.",
            "open_hours": {
                "Monday": "11:00-22:00",
                "Tuesday": "11:00-22:00",
            },
            "review_count": 320,
            "review_rating": 4.5,
            "images": [
                {
                    "title": "Interior",
                    "image": "https://lh5.googleusercontent.com/p/1.jpg",
                },
                {
                    "title": "Dish",
                    "image": "https://lh5.googleusercontent.com/p/2.jpg",
                },
                {
                    "title": "Menu",
                    "image": "https://lh5.googleusercontent.com/p/3.jpg",
                },
                {
                    "title": "Storefront",
                    "image": "https://lh5.googleusercontent.com/p/4.jpg",
                },
                {
                    "title": "Terrace",
                    "image": "https://lh5.googleusercontent.com/p/5.jpg",
                },
            ],
            "owner": {
                "id": "123",
                "name": "Example Restaurant Ltd.",
                "link": "https://maps.google.com/owner",
            },
        }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/gbp-completeness-audit").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 '{
  "places": [
    {
      "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
      "cid": "10281019595535971924",
      "title": "Example Restaurant Ltd.",
      "category": "Italian restaurant",
      "categories": [
        "Italian restaurant",
        "Pizza restaurant"
      ],
      "website": "https://example-restaurant.example",
      "phone": "+49 89 12345678",
      "description": "Sample Italian restaurant in Munich, family-owned since 1985.",
      "open_hours": {
        "Monday": "11:00-22:00",
        "Tuesday": "11:00-22:00"
      },
      "review_count": 320,
      "review_rating": 4.5,
      "images": [
        {
          "title": "Interior",
          "image": "https://lh5.googleusercontent.com/p/1.jpg"
        },
        {
          "title": "Dish",
          "image": "https://lh5.googleusercontent.com/p/2.jpg"
        },
        {
          "title": "Menu",
          "image": "https://lh5.googleusercontent.com/p/3.jpg"
        },
        {
          "title": "Storefront",
          "image": "https://lh5.googleusercontent.com/p/4.jpg"
        },
        {
          "title": "Terrace",
          "image": "https://lh5.googleusercontent.com/p/5.jpg"
        }
      ],
      "owner": {
        "id": "123",
        "name": "Example Restaurant Ltd.",
        "link": "https://maps.google.com/owner"
      }
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call santamaria-automations/gbp-completeness-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santamaria-automations/gbp-completeness-audit",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IFi7YsyBmY9JuTmcf/builds/GcFQcMHvVZdlPDhWo/openapi.json
