# Google Business Profile Audit (English + Spanish) (`tallish_spelt/gbp-audit-es`) Actor

Bilingual (EN/ES) Google Business Profile audit: 0-100 score from 13 deterministic checks (claimed, website, phone, hours, categories, description, photos, reviews, rating, posts, booking, open). Only what Google returned counts. Input: name + city, place ID, or Maps URL. No browser, no AI.

- **URL**: https://apify.com/tallish_spelt/gbp-audit-es.md
- **Developed by:** [Laz Macias](https://apify.com/tallish_spelt) (community)
- **Categories:** SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Google Business Profile Audit (English + Spanish)

**Audit any Google Business Profile in seconds, in English or Spanish.** Give it a business name and city, a Google place ID, or a Google Maps link. You get back a 0-100 score, 13 weighted checks, and the three fixes that matter most.

- **Bilingual EN/ES.** Every check label, impact note and piece of evidence comes back in English or in Latin American Spanish. Set `language` to `es` and the whole report switches.
- **Zero-fabrication scoring.** The score is built only from fields Google actually returned. A field Google did not show is marked `unknown` and left out of the math. It never counts for or against the business.
- **13 checks.** Claimed status, website, phone, hours, categories, description, photos, review volume, rating, recent Google Post, booking link, and open/closed status.
- **Cheap.** No browser and no AI model in this Actor. It runs on 256 MB and finishes in seconds. The only real cost is the Google Maps lookup.
- **Clean output.** One dataset item per business, with the matched place, the score, every check, the top fixes, and alternative candidates when the match is uncertain.

#### How to use

1. Open the **Input** tab.
2. Add one or more businesses under **Business queries**, one per line, as `Business name, City, State`. You can also paste Google place IDs or Google Maps URLs.
3. Pick the output **language**: English or Español.
4. Click **Start**.
5. Open the **Output** tab, or fetch the dataset through the API, to read the audits.

#### Input example

```json
{
  "queries": ["Eve La Cubanita, Kissimmee, FL"],
  "placeIds": [],
  "startUrls": [],
  "language": "en",
  "candidatesPerQuery": 3,
  "includeRawPlace": false
}
```

At least one of `queries`, `placeIds` or `startUrls` is required. A query is split at the first comma: the text before it is the business name, and the rest is the city.

#### Output example

```json
{
  "query": "Eve La Cubanita, Kissimmee, FL",
  "language": "en",
  "matched": true,
  "place": {
    "placeId": "ChIJ...",
    "title": "Eve La Cubanita",
    "address": "Kissimmee, FL",
    "url": "https://www.google.com/maps/...",
    "website": "https://example.com",
    "phone": "+1 407 555 0100",
    "categoryName": "Cuban restaurant",
    "totalScore": 4.7,
    "reviewsCount": 123
  },
  "score": 70,
  "measurable": 11,
  "earnedWeight": 16,
  "totalWeight": 23,
  "checks": [
    {
      "id": "claimed",
      "status": "pass",
      "weight": 3,
      "label": "Profile claimed",
      "impact": "",
      "evidence": "Google shows the profile as claimed."
    }
  ],
  "fixes": [
    {
      "id": "recent_post",
      "title": "Recent Google Post",
      "why": "Google favors profiles that post recently.",
      "evidence": "No recent Google Posts found."
    }
  ],
  "alternatives": [
    { "placeId": "ChIJ...", "title": "Eve La Cubanita II", "address": "Orlando, FL" }
  ],
  "auditedAt": "2026-09-28T21:00:00.000Z",
  "engine": "gbp-audit-es/0.1"
}
```

When a query cannot be matched, the item has `matched: false` and a `reason` of `no_match` (with `alternatives`) or `lookup_unavailable`. The Actor never guesses a place or invents a score.

#### How scoring works

Each check is `pass`, `fail` or `unknown`. The score is the weight of passed checks divided by the weight of all checks Google let us measure, times 100, rounded.

| Check | Weight | Passes when |
|---|---|---|
| Profile claimed | 3 | Google shows the profile as claimed |
| Website linked | 3 | A website is on the profile |
| Business hours | 3 | Hours shown for 5 or more days |
| Phone number | 2 | A phone number is on the profile |
| Primary category | 2 | A primary category is set |
| Business description | 2 | Description is 100 characters or more |
| Photos | 2 | 10 or more photos |
| Review volume | 2 | 25 or more reviews |
| Star rating | 2 | Rating is 4.3 or higher |
| Recent Google Post | 2 | Last post is 30 days old or less |
| Online booking | 2 | A booking or reservation link exists |
| Secondary categories | 1 | Two or more categories listed |
| Open for business | 1 | Not marked closed |

Unknown checks are excluded from both sides of the fraction. If fewer than 5 checks are measurable, the score is `null`, because a number built on a handful of fields would be misleading. The checks and evidence are still returned.

#### Pricing

This Actor uses **pay per usage**: you only pay Apify platform costs. Each business audited triggers one run of `compass/crawler-google-places` at about $0.004 per candidate place. A typical audit costs about $0.01 to $0.02. The Actor itself uses 256 MB of memory for a few seconds.

#### FAQ

**How do I get Spanish output?**
Set `language` to `es`. Labels, impact notes and evidence are all returned in Spanish, and the Google Maps lookup is also requested in Spanish.

**What does "unknown" mean?**
Google did not return that field for this place. The check is excluded from the score instead of being counted as a failure.

**Why was my business not matched?**
Matching compares the name and city you typed against up to 3 Google Maps results. If nothing is close enough, the item comes back as `no_match` with the candidates listed under `alternatives`. Add the city and state, or pass the place ID or Maps URL instead.

**How do I use place IDs or Maps URLs?**
Put Google place IDs (they start with `ChIJ`) in `placeIds`, or Google Maps place links in `startUrls`. These are audited directly, with no name matching.

**Can I use it through the API, on a schedule, or with integrations?**
Yes. Like any Actor on Apify, you can start it from the API, schedule it, or connect it to Zapier, Make, Google Sheets and webhooks.

#### En español

**Audita cualquier Perfil de Negocio de Google en inglés o en español.** Escribe el nombre del negocio y la ciudad (o un ID de lugar, o un enlace de Google Maps) y recibe una puntuación de 0 a 100, 13 verificaciones ponderadas y las tres mejoras más importantes. Las etiquetas, el impacto y la evidencia salen en español latinoamericano. Un dato que Google no muestra se marca como `unknown` y no cuenta ni a favor ni en contra del negocio.

1. Abre la pestaña **Input**.
2. Agrega negocios en **Business queries**, uno por línea, con el formato `Nombre del negocio, Ciudad, Estado`. También puedes usar IDs de lugar o enlaces de Google Maps.
3. Elige el idioma **Español**.
4. Haz clic en **Start**.
5. Lee los resultados en la pestaña **Output** o mediante la API.

Costo: pago por uso, solo pagas los costos de la plataforma Apify. Una auditoría típica cuesta entre $0.01 y $0.02.

***

Built by MainShop — free single-business grader at https://mainshop.ai/gbp · Spanish at https://mainshop.ai/es/gbp

# Actor input Schema

## `queries` (type: `array`):

One business per line, as "Business name, City\[, State]". The text before the first comma is the name; the rest is the city.

## `placeIds` (type: `array`):

Google place IDs (start with ChIJ). Each is audited directly, with no name matching.

## `startUrls` (type: `array`):

Google Maps place URLs. Each is audited directly, with no name matching.

## `language` (type: `string`):

Language of check labels, impact text and evidence. Also sent to Google Maps as the lookup language.

## `candidatesPerQuery` (type: `integer`):

How many Google Maps results to fetch per query (best match is audited, the rest are listed as alternatives).

## `includeRawPlace` (type: `boolean`):

Attach the raw Google Maps record to each audited item.

## Actor input object example

```json
{
  "queries": [
    "Eve La Cubanita, Kissimmee, FL"
  ],
  "language": "en",
  "candidatesPerQuery": 3,
  "includeRawPlace": false
}
```

# Actor output Schema

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

Default dataset: one item per query (audited or unmatched).

# 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 = {
    "queries": [
        "Eve La Cubanita, Kissimmee, FL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tallish_spelt/gbp-audit-es").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 = { "queries": ["Eve La Cubanita, Kissimmee, FL"] }

# Run the Actor and wait for it to finish
run = client.actor("tallish_spelt/gbp-audit-es").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 '{
  "queries": [
    "Eve La Cubanita, Kissimmee, FL"
  ]
}' |
apify call tallish_spelt/gbp-audit-es --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tallish_spelt/gbp-audit-es"
        }
    }
}
```

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/0HFMX7IKC5weAdu33/builds/D4ZedIo9gJpedjw2p/openapi.json
