# Google Maps Rank Tracker: Local Geo-Grid Rankings (`zaiq/google-maps-rank-grid`) Actor

Where a business ranks in Google Maps for a keyword at every point of a grid around it (local SEO geo-grid): the rank at each point, the leaders there, average rank, share of top-3 points, top competitors and a grid image. Any country, no Google account.

- **URL**: https://apify.com/zaiq/google-maps-rank-grid.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (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

from $8.00 / 1,000 grid points

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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 Maps Rank Tracker: local geo-grid rankings for any business and keyword

See **where a business ranks in Google Maps at every point of a grid around it**, for each keyword: the **rank at each point** (top 20), the **three leaders there**, the **average rank**, the **share of points in the top 3 and top 10**, the **competitors that win the most points**, and a **grid image** you can drop into a report. Searches run as a signed-out searcher standing at each point, so you see what nearby customers see.

Built for **local SEO agencies**, **multi-location brands**, **franchise marketers** and **business owners** who want to know whether they show up across their whole service area, not just at their front door, and to prove the effect of their work week by week.

### What you get

| Field | What it holds |
|---|---|
| Grid points | `keyword`, `row`, `col`, `latitude`, `longitude`, `rank` (1-20, or empty when not in the top 20), `inTop3`, `found`, `leaders` (name, rating, reviews, category, place id), `mapsUrl` |
| Summary per keyword | `averageRank` (points outside the top 20 count as 21), `averageRankWhereFound`, `shareOfTop3`, `shareOfTop10`, `pointsFound`, `bestRank`, `worstRank`, `topCompetitors` (points won and average rank), `gridImage` |
| The business | name, place id, cid, address, rating, reviews and coordinates, from Google Maps |

### What people use it for

- **Local SEO reporting:** a grid per client keyword every week or month, with the image for the report
- **Service-area coverage:** find the neighbourhoods where you drop out of the top 3
- **Competitor watch:** which businesses win the most points around you, and their average rank
- **Before and after:** prove the effect of reviews, categories or a new page with the same grid a month later
- **Multi-location brands:** one grid per branch to compare their local reach
- **Prospecting:** show a business how weak its local reach is before you pitch

### How to use it

1. Enter the **business** (a Google Maps link, place id or name and town) and your **keywords**.
2. Pick the **grid size** and the **distance between points** (the grid is centred on the business unless you give a centre).
3. Click **Start**. Each keyword gives one row per point and a summary row with the grid image link.

### Input

| Field | Example | Notes |
|---|---|---|
| Business | `Brooklyn Plumber, Brooklyn NY` | A Google Maps link, a place id (ChIJ...) or name and town |
| Keywords | `plumber` | One grid per keyword |
| Grid size | 5 x 5 | 3 x 3 up to 13 x 13 points |
| Distance between points | `1` km | Kilometres or miles |
| Grid centre | `40.6799,-73.9446` | Optional; empty = the business's own location |
| Map zoom | `14` | Zoom of the map at each point |
| Leaders per point | `3` | Top results listed at each point |
| Google country / Language | `us` / `en` | Google's country and language |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "kind": "grid-summary",
  "keyword": "plumber",
  "business": "Sample Plumbing Co",
  "gridSize": 5,
  "spacingKm": 1,
  "points": 25,
  "pointsFound": 23,
  "averageRank": 3.6,
  "averageRankWhereFound": 2.1,
  "shareOfTop3": 0.64,
  "shareOfTop10": 0.84,
  "bestRank": 1,
  "worstRank": 15,
  "topCompetitors": [
    {
      "name": "Sample Plumbing Co",
      "pointsInTop": 16,
      "averageRank": 1.4
    },
    {
      "name": "Another Plumber Ltd",
      "pointsInTop": 11,
      "averageRank": 2.2
    }
  ],
  "gridImage": "https://api.apify.com/v2/key-value-stores/<store>/records/grid-plumber"
}
```

A record named `SUMMARY` in the run's key-value store says what each input returned, with any notes (for example an account that does not exist), what was charged and how much traffic the run used.

### Pricing

- **$0.01 per grid point** (one point = the rank there plus the leaders)
- The summary row and the grid image are free; points Google refuses are free

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| A 5 x 5 grid for one keyword | $0.25 |
| A 7 x 7 grid for one keyword | $0.49 |
| 3 keywords on a 7 x 7 grid, every week for a month | $5.88 |
| A 13 x 13 grid for one keyword | $1.69 |

On Apify's Scale and Business plans the per-event prices are lower (Store discounts). Set **Maximum cost per run** and the Actor stops cleanly when it is reached: you never pay more than that.

### Tips

- Keep the same grid size, spacing and zoom from one run to the next so the reports compare like with like.
- Spacing: about 0.5-1 km in a city, 2-5 km for a business that serves a wide area.
- Google Maps results move a little from hour to hour; read trends over weeks, not single points.
- Schedule a run per client and send the summary rows to a sheet with an integration.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/google-maps-rank-grid").call(run_input={"business": "Brooklyn Plumber, Brooklyn NY", "keywords": ["plumber"], "gridSize": 5, "spacing": 1})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

**JavaScript**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/google-maps-rank-grid').call({"business": "Brooklyn Plumber, Brooklyn NY", "keywords": ["plumber"], "gridSize": 5, "spacing": 1});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~google-maps-rank-grid/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"business": "Brooklyn Plumber, Brooklyn NY", "keywords": ["plumber"], "gridSize": 5, "spacing": 1}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "where does my plumbing business rank in Google Maps for 'plumber' across a 5 x 5 grid around Brooklyn". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- Ranks are within Google Maps' first 20 results at each point; beyond 20 the point shows as not found.
- Results are what a signed-out searcher sees at each point; a signed-in searcher's history can change them.
- The grid image shows ranks without a map underneath; each point row has its own Google Maps link.

### FAQ

**Do I need a Google account or API key?**

No. Each point is a signed-out Google Maps search placed at that point.

**How is the average rank counted?**

`averageRank` counts points where the business is not in the top 20 as 21; `averageRankWhereFound` uses the found points only.

**Can I track several keywords?**

Yes: each keyword is its own grid with its own summary and image.

**Does it work outside the US?**

Yes: set the Google country and language; the grid follows the business's own location anywhere.

**What is a good share of top 3?**

It depends on the area and the competition; most use it to track progress for the same grid over time.

### Related Actors from Zaiq

- [contact-details-extractor](https://apify.com/zaiq/contact-details-extractor): emails and phones from the competitors' websites
- [ai-answer-tracker](https://apify.com/zaiq/ai-answer-tracker): whether ChatGPT and other AI assistants recommend the business

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: google maps rank tracker, geo grid rank tracker, local rank tracker, local seo grid, google maps ranking, map pack rank tracker, local search grid, google business profile rank tracking.

# Actor input Schema

## `business` (type: `string`):

The business to track: a Google Maps link, a place id (ChIJ...), or its name and town.

## `keywords` (type: `array`):

What customers search for in Google Maps, one per line. Each keyword is one grid.

## `gridSize` (type: `string`):

Points along each side of the grid.

## `spacing` (type: `number`):

Gap between neighbouring points.

## `unit` (type: `string`):

Unit of the distance between points.

## `center` (type: `string`):

Optional 'latitude,longitude'. Empty = the business's own location.

## `zoom` (type: `integer`):

Google Maps zoom at each point (13-15 is a neighbourhood).

## `competitorsPerPoint` (type: `integer`):

How many of the top results to list at each point.

## `country` (type: `string`):

Two-letter country code for Google (gl).

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

Language of names and categories (hl).

## Actor input object example

```json
{
  "business": "Brooklyn Plumber, Brooklyn NY",
  "keywords": [
    "plumber"
  ],
  "gridSize": "5",
  "spacing": 1,
  "unit": "km",
  "zoom": 14,
  "competitorsPerPoint": 3,
  "country": "us",
  "language": "en"
}
```

# Actor output Schema

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

Dataset: the results.

## `summary` (type: `string`):

What each input returned, and notes.

# 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 = {
    "business": "Brooklyn Plumber, Brooklyn NY",
    "keywords": [
        "plumber"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/google-maps-rank-grid").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 = {
    "business": "Brooklyn Plumber, Brooklyn NY",
    "keywords": ["plumber"],
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/google-maps-rank-grid").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 '{
  "business": "Brooklyn Plumber, Brooklyn NY",
  "keywords": [
    "plumber"
  ]
}' |
apify call zaiq/google-maps-rank-grid --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaiq/google-maps-rank-grid"
        }
    }
}
```

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/2aEHogxlYaEBJskr0/builds/SvBaIV5KXsDLYX36W/openapi.json
