# Google Maps Phone Number Scraper: Business Phones in E.164 (`sandy_yclept/google-maps-phone-number-scraper`) Actor

Scrape phone numbers from Google Maps: local businesses from any search term and city, each with its phone in international E.164 format, name, category, address, website and rating. Reads Google Maps itself. $1 per 1,000 phone numbers; places without a phone are free.

- **URL**: https://apify.com/sandy_yclept/google-maps-phone-number-scraper.md
- **Developed by:** [Rafal Sav](https://apify.com/sandy_yclept) (community)
- **Categories:** Lead generation, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 phone numbers

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

### What does Google Maps Phone Number Scraper do?

**Google Maps Phone Number Scraper** turns any Google Maps search into a list of **business phone numbers**: every plumber, dentist or restaurant in a city, each with its phone in **international E.164 format**, the business name, category, address, website and rating - one row per place with a phone.

It reads Google Maps itself, so it is **cheap: $1 per 1,000 phone numbers** on the Free and Starter plans. **Places without a phone, and permanently closed ones, are never charged.** No API key, no Google account.

Run it from the Apify Console, through the API, on a schedule, or from an AI agent through Apify's MCP server.

### Why use it?

- **Cold calling and SMS lists** of local businesses by trade and city.
- **CRM enrichment**: one format for numbers from every country, ready to dial.
- **Pay for phones only**: a place without a number is not a lead, and it costs nothing.

### How to use it

1. Open the **Input** tab and type what you would search on Google Maps: "plumber", "electrician" - one term per line.
2. Type the **location**: a city and country work best ("Manchester, United Kingdom").
3. Set **Places per search term**, and click **Start**.
4. Download the results as JSON, CSV, Excel or HTML from the **Output** tab.

### Input

| Field | What it does |
|---|---|
| Search terms | What you would type into Google Maps. Every term is searched in the location. |
| Location | A city and country, as free text. One per run. |
| Places per search term | How many places to look at for each term. One term gives up to about 1,000 places in a big city. |
| Also return places without a phone | Every place found, the ones without a phone too - never charged. |
| Language | The language of names, categories and addresses. |

### Output

From the prefill's search "plumber" in Manchester, as read on October 10, 2026 (some fields left out):

```json
{
  "phone": "+447441425656",
  "name": "24 HOUR PLUMBER MANCHESTER",
  "category": "Plumber",
  "address": "Ringley St, Manchester M9 5UW",
  "city": "Manchester",
  "country_code": "GB",
  "website": "https://localplumber-manchester.lovable.app/",
  "rating": 5,
  "reviews_count": 28,
  "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJnVw-5AZgswoRSG6r4vVoNYU",
  "search_string": "plumber in Manchester, United Kingdom",
  "billed": true
}
```

Every row also carries the address in parts, the opening hours, the coordinates and the Google place ID.

| Field | Meaning |
|---|---|
| `phone` | The phone Google Maps shows, in E.164 (`+441615550100`) where it parses. |
| `name`, `category`, `address`, `website` | The business as Google Maps lists it. |
| `rating`, `reviews_count` | The star rating, and the number of reviews where Google's search results give it. |
| `billed` | Whether this row was charged. |

### How often does a place have a phone?

On 11 searches in seven countries (1,926 places, October 10, 2026), 1,816 places (94%) had a phone on Google Maps, every one of them in E.164. Local trades nearly always list one: 20 of 20 plumbers in the Manchester prefill. A business that serves an area without a shop front is listed with its national number by Google, and read here with its country: "01614103654" becomes +441614103654.

### How much does it cost?

**$1 per 1,000 phone numbers** on the Free and Starter plans, $0.90 on Scale, $0.80 from Business up, plus Apify's start fee of $0.00005 a run. Places without a phone and permanently closed ones cost nothing.

### FAQ

**Can I call or text these numbers?** They are businesses' public numbers. Telemarketing law and do-not-call registers apply where you call; you are responsible for complying with them, with the GDPR and with Google's Terms of Service.

**Do you return mobile numbers or WhatsApp?** The number Google Maps shows for the business, whatever kind it is.

### Related Actors

- [Google Maps Scraper](https://apify.com/sandy_yclept/google-maps-scraper) - every place of a search with hours, coordinates and all fields, priced per place.
- [Google Maps Email Extractor](https://apify.com/sandy_yclept/google-maps-email-extractor) - the same places, each with the email from its own website.
- [Phone Number Extractor](https://apify.com/sandy_yclept/phone-number-extractor) - the phone numbers on any list of websites.

### Support

A number that is wrong or missing? Open an issue on the **Issues** tab with the search term and location.

# Actor input Schema

## `searchStringsArray` (type: `array`):

What you would type into Google Maps, one term per line: "dentist", "coffee shop", "Steuerberater". Every term is searched in the location below. This Actor reads Google Maps itself: no other scraper runs on your account and nothing is billed per search.

## `locationQuery` (type: `string`):

Where to search, as free text: a city and country work best ("Austin, TX, USA", "Köln, Deutschland"). One location per run. Leave it empty when the search terms already say where.

## `maxCrawledPlacesPerSearch` (type: `integer`):

How many places to look at for each search term. Only places with a phone are returned and billed, $1 per 1,000 phone numbers on the Free and Starter plans. One term gives up to about 1,000 places in a big city, its suburbs included; for more, add terms or run each district apart.

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

Language of the place names, categories, addresses and opening hours Google Maps returns. The number of reviews is given for English results; in other languages Google often leaves it out.

## `includeAllPlaces` (type: `boolean`):

Return every place found, the ones without a phone and the permanently closed ones too. Only open places with a phone are ever charged.

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

Google Maps is read through Apify Proxy by default, which is included. Set your own proxies here only if you want the searches to go through them.

## Actor input object example

```json
{
  "searchStringsArray": [
    "plumber",
    "electrician"
  ],
  "locationQuery": "Chicago, USA",
  "maxCrawledPlacesPerSearch": 20,
  "language": "en",
  "includeAllPlaces": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "searchStringsArray": [
        "plumber"
    ],
    "locationQuery": "Manchester, United Kingdom",
    "maxCrawledPlacesPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("sandy_yclept/google-maps-phone-number-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 = {
    "searchStringsArray": ["plumber"],
    "locationQuery": "Manchester, United Kingdom",
    "maxCrawledPlacesPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("sandy_yclept/google-maps-phone-number-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 '{
  "searchStringsArray": [
    "plumber"
  ],
  "locationQuery": "Manchester, United Kingdom",
  "maxCrawledPlacesPerSearch": 20
}' |
apify call sandy_yclept/google-maps-phone-number-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sandy_yclept/google-maps-phone-number-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/uqsX2xbFIzIgRkGwa/builds/EckJmObN8EhIZf6Ia/openapi.json
