# Google Maps Contact Scraper (`reapx/google-maps-contact-scraper`) Actor

Build a contact file from Google Maps. Start with Google Maps page URLs; each returned contact keeps names, titles, addresses, phone numbers, and email addresses.

- **URL**: https://apify.com/reapx/google-maps-contact-scraper.md
- **Developed by:** [ReapX](https://apify.com/reapx) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.14 / 1,000 businesses

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?

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

## Google Maps Contact Scraper

Build a contact file from Google Maps. Start with Google Maps page URLs; each returned contact keeps names, titles, addresses, phone numbers, and email addresses.

![Google Maps Contact Scraper source page and returned record](https://reapx.dev/assets/products/google-maps-contact-scraper/readme.png?v=20260826)

### What it returns

Each row keeps the Google Maps source record beside the fields needed to use it. The opening set is `name`, `title`, `url`, `address`, `phone`, `website`, `domain`, `email`, `emails`, `socials`, `category`, and `rating`. The complete schema is declared before the run, and dataset views keep related fields together without changing the underlying row.

#### Captured row

```json
{
  "cid": "0x89b9285175146639:0xd3e23e19baa89b20",
  "placeId": "ChIJOWYUdVEouYkRIJuouhk-4tM",
  "rating": 4.9
}
```

### Input

![Google Maps Contact Scraper published input controls](https://reapx.dev/assets/products/google-maps-contact-scraper/schema.png?v=20260826)

![Google Maps Contact Scraper input-to-run walkthrough](https://reapx.dev/assets/products/google-maps-contact-scraper/demo.webp?v=20260826)

Google Maps Contact Scraper accepts source URLs. Run controls stay in the same form.

| Field | What it controls | Starting value |
| --- | --- | --- |
| `startUrls` | Enter Google Maps search terms or identifiers, one per line. | `["plumbers in berlin","bike shops in amsterdam","dentists in prague"]` |
| `maxItems` | Stop after this many dataset rows. | `20` |
| `maxSeconds` | Stop after this many seconds and keep completed rows. | `180` |

#### Example input

```json
{
  "startUrls": [
    "plumbers in berlin",
    "bike shops in amsterdam",
    "dentists in prague"
  ],
  "maxItems": 3,
  "maxSeconds": 180
}
```

No field is required. Start with the filled example, then replace only the target values needed for the job. Run controls can stay at their starting values for the first collection.

### Dataset fields

![Google Maps Contact Scraper declared output schema](https://reapx.dev/assets/products/google-maps-contact-scraper/fields.png?v=20260826)

| Field | Type |
| --- | --- |
| `name` | `string` |
| `title` | `string` |
| `url` | `string` |
| `address` | `string` |
| `phone` | `string` |
| `website` | `string` |
| `domain` | `string` |
| `email` | `string` |
| `emails` | `array` |
| `socials` | `object` |
| `category` | `string` |
| `rating` | `number` |
| `reviewsCount` | `number` |
| `latitude` | `number` |
| `longitude` | `number` |
| `placeId` | `string` |
| `cid` | `string` |
| `requestedInput` | `string` |

### Dataset views

Views are working surfaces for review and export. They select and order fields while leaving the stored row unchanged.

| View | Opening fields |
| --- | --- |
| `overview` | `name`, `title`, `placeId`, `phone`, `website`, `domain`, `email`, and `emails` |
| `identity` | `name`, `title`, `placeId`, and `cid` |
| `contact` | `name`, `title`, `url`, `phone`, `website`, `domain`, `email`, and `emails` |
| `location` | `name`, `title`, `url`, `address`, `latitude`, and `longitude` |
| `engagement` | `name`, `title`, `url`, `rating`, and `reviewsCount` |
| `content` | `name`, `title`, `url`, and `category` |

### Output and exports

| Output | Type | Destination |
| --- | --- | --- |
| `results` | `string` | `{{links.apiDefaultDatasetUrl}}/items` |
| `json` | `string` | `{{links.apiDefaultDatasetUrl}}/items?clean=true&format=json` |
| `csv` | `string` | `{{links.apiDefaultDatasetUrl}}/items?clean=true&format=csv` |
| `excel` | `string` | `{{links.apiDefaultDatasetUrl}}/items?clean=true&format=xlsx` |
| `jsonl` | `string` | `{{links.apiDefaultDatasetUrl}}/items?clean=true&format=jsonl` |

Completed rows are available in the Apify dataset as JSON, CSV, Excel, and JSONL exports. The run output also carries the declared links above for API clients and automations.

### Pricing

$2 per 1,000 dataset items on the Free plan. Other Apify plans use the rates shown in the Pricing tab.

### Console, API, schedules, and MCP

![Google Maps Contact Scraper API and MCP invocation](https://reapx.dev/assets/products/google-maps-contact-scraper/api.png?v=20260826)

Runs can begin in Apify Console, from a saved task, or through the Actor API. A schedule can reuse the same input, and a run-finished webhook can pass the dataset or run ID to the next system.

```text
POST https://api.apify.com/v2/acts/wq8ZQPAuqLBmClp3H/runs
GET  https://api.apify.com/v2/datasets/{datasetId}/items
```

For MCP selection, use **Google Maps Contact Scraper**. Its machine entry carries the same description, input field names, no-required-field contract, output types, dataset fields, views, and pricing facts as this document.

### Saved tasks

Twenty saved-task products cover distinct lookup, comparison, research, operations, automation, and export jobs:

- **Google Maps Contact socials core record view**: buyer-job; opens `overview`.
- **Google Maps Contact place IDs match file**: buyer-job; opens `identity`.
- **Google Maps Contact phone numbers routing file**: buyer-job; opens `contact`.
- **Google Maps Contact addresses location market file**: buyer-job; opens `location`.
- **Google Maps Contact rating and review ranking**: buyer-job; opens `engagement`.
- **Google Maps Contact content name copy review**: buyer-job; opens `content`.
- **Google Maps Contact socials websites core**: buyer-job; opens `overview`.
- **Google Maps Contact place IDs and titles roster**: buyer-job; opens `identity`.
- **Google Maps Contact websites and domain reach list**: buyer-job; opens `contact`.
- **Google Maps Contact latitudes longitudes location**: buyer-job; opens `location`.
- **Google Maps Contact response signal ranking**: buyer-job; opens `engagement`.
- **Google Maps Contact titles content brief**: buyer-job; opens `content`.
- **Google Maps Contact socials full record**: buyer-job; opens `overview`.
- **Google Maps Contact identity place IDs handoff**: buyer-job; opens `identity`.
- **Google Maps Contact domain lead handoff**: buyer-job; opens `contact`.
- **Google Maps Contact location and coordinates map**: buyer-job; opens `location`.
- **Google Maps Contact ratings rating view**: buyer-job; opens `engagement`.
- **Google Maps Contact name titles content**: buyer-job; opens `content`.
- **Google Maps Contact socials and addresses detail handoff**: buyer-job; opens `overview`.
- **Google Maps Contact place IDs identity index**: buyer-job; opens `identity`.

### Integrations

Use the dataset API from any HTTP client, export rows to a spreadsheet, or send the run ID through an Apify webhook. Saved tasks give schedules and automation tools a stable input without changing the Actor contract.

### Related products

- [Google Maps Email Scraper](https://apify.com/reapx/google-maps-email-scraper)
- [Google Maps Lead Scraper](https://apify.com/reapx/google-maps-lead-scraper)
- [Google Maps Place Scraper](https://apify.com/reapx/google-maps-place-scraper)
- [Facebook Contact Scraper](https://apify.com/reapx/facebook-contact-scraper)
- [LinkedIn Profile Scraper](https://apify.com/reapx/linkedin-profile-scraper)

### When a run needs attention

- **No rows:** Open the target in a browser, check spelling and source visibility, then retry the saved example before widening the input.
- **A field is empty:** Check the field beside its source URL. A missing source value stays empty instead of being replaced with a guess.
- **A target fails:** Keep successful targets in the dataset, then retry only the affected input.
- **An automation cannot find results:** Read the dataset ID from the run and request its items endpoint directly.

### FAQ

#### What do I get back from one run?

One row per contact with 20 declared fields, opening on name, title, url and address. The schema is published before the run, so you know the shape before you spend anything.

#### Do I need a google maps account or login?

No. The run works from the google maps sources you supply in the input. Nothing is posted, changed or accessed on your behalf.

#### What does a run cost?

The current rate is shown on the Pricing tab and is charged per row you receive, so a run that finds nothing costs close to nothing. Cap the run with the item limit when you want a predictable ceiling.

#### Can I try it before committing budget?

Yes. Cap the run with the item limit in the input and inspect the first rows. The cap is enforced before charging, so a trial run stays a trial.

#### What do I put in the input?

The staged input is already usable: startUrls, maxItems and maxSeconds. Replace the staged target with your own list when you are ready to run for real.

#### Are any fields required?

No field is required. Every input carries a working default, so the Actor can be started as-is and refined afterwards.

#### How fresh is the data?

Every row is collected during the run you start, not served from a cache. Re-run the same input whenever you need the current state of a google maps contact.

#### Can I use the results commercially?

The Actor collects publicly accessible google maps information. You remain responsible for how you use it, including any privacy or contractual obligations that apply to your business.

#### How do I compare two runs?

Keep name and title as your join key and diff the exports. The identity fields stay stable across runs, which is what makes a comparison meaningful.

#### What happens if a source fails mid-run?

The run continues through the remaining sources and finishes with what it collected. Partial results are still written to the dataset rather than discarded.

#### Can I limit how long a run takes?

Yes. The maxItems input caps the run. Use it when you need a predictable cost and a predictable finish time.

#### How do I report a problem?

Open an issue on the Actor with the run ID, the input you used and the field or row that needs attention. The run ID lets the exact execution be inspected.

#### How is this different from Google Maps Email Scraper?

Google Maps Contact Scraper answers one job: Build a contact file from Google Maps.. Google Maps Email Scraper covers a different question on the same platform. Run both when you need both sides.

#### How do I read the output without scrolling through JSON?

Open the overview view on the Output tab. 6 views ship with the Actor (overview, identity, contact, location, engagement and content), each grouping the fields that belong to one question.

#### How do I get the data into my own tools?

Export the dataset as JSON, CSV, Excel or XML, call the dataset API directly, or attach a run-finished webhook and collect the dataset reference as soon as the run ends.

#### Can an agent or LLM call this?

Yes. Google Maps Contact Scraper is exposed over MCP with the same description, no-required-field input contract and output types shown here, so an agent can select and call it without a human in the loop.

#### Why is a value empty on some rows?

google maps does not expose every field on every contact. An absent value stays empty rather than being filled with a guess, so a row never invents a fact it did not receive.

#### A run returned fewer rows than I expected. Why?

The usual causes are a narrow source list, an item cap still set low, or a source that genuinely holds less than expected. Widen the input or raise the cap and run again.

#### Can I schedule this to run on its own?

Yes. Save the input as an Apify task and attach a schedule. Keep separate tasks when different teams need different targets or delivery paths.

#### Do I need to configure proxies?

No. Network access is handled inside the Actor and needs no proxy configuration from you.

### Support

Use the Actor issue form for product questions, broken source routes, schema mismatches, and feedback. Include the smallest input that reproduces the problem. That is enough to locate the run and its dataset without sharing an entire working list.

Use this Actor only for data you are allowed to collect. Follow source terms, privacy law, and your own retention policy.

# Actor input Schema

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

Enter Google Maps search terms or identifiers, one per line.

## `maxItems` (type: `integer`):

Stop after this many dataset rows.

## `maxSeconds` (type: `integer`):

Stop after this many seconds and keep completed rows.

## Actor input object example

```json
{
  "startUrls": [
    "plumbers in berlin",
    "bike shops in amsterdam",
    "dentists in prague"
  ],
  "maxItems": 20,
  "maxSeconds": 180
}
```

# Actor output Schema

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

Open all returned Google Maps Contact Scraper rows with 20 declared fields and 6 working views.

## `json` (type: `string`):

Retrieve clean Google Maps Contact Scraper records for API, MCP, or webhook use.

## `csv` (type: `string`):

Download the Google Maps Contact Scraper table for spreadsheets and data tools.

## `excel` (type: `string`):

Open the Google Maps Contact Scraper rows as an Excel workbook.

## `jsonl` (type: `string`):

Stream one clean Google Maps Contact Scraper record per line for downstream processing.

# 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 = {
    "startUrls": [
        "plumbers in berlin",
        "bike shops in amsterdam",
        "dentists in prague"
    ],
    "maxItems": 20,
    "maxSeconds": 180
};

// Run the Actor and wait for it to finish
const run = await client.actor("reapx/google-maps-contact-scraper").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 = {
    "startUrls": [
        "plumbers in berlin",
        "bike shops in amsterdam",
        "dentists in prague",
    ],
    "maxItems": 20,
    "maxSeconds": 180,
}

# Run the Actor and wait for it to finish
run = client.actor("reapx/google-maps-contact-scraper").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 '{
  "startUrls": [
    "plumbers in berlin",
    "bike shops in amsterdam",
    "dentists in prague"
  ],
  "maxItems": 20,
  "maxSeconds": 180
}' |
apify call reapx/google-maps-contact-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/wq8ZQPAuqLBmClp3H/builds/wqVkdg0hbGpvoKnfR/openapi.json
