# Google Maps Scraper France (`badr_xba/google-maps-france`) Actor

Entreprises françaises sur Google Maps : nom, catégorie, adresse, téléphone, site, note, avis et horaires. La couverture nationale interroge 226 villes — métropole, Corse et outre-mer — car chercher « France » d'un bloc ne rend que quelques fiches. Exemple : « plombier », 10 villes, 100 fiches.

- **URL**: https://apify.com/badr\_xba/google-maps-france.md
- **Developed by:** [Badr Bouargan](https://apify.com/badr_xba) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 1,000 place scrapeds

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 France – Entreprises, téléphones et e-mails

![Google Maps France](https://api.apify.com/v2/key-value-stores/paDGjcmD1ZMsRJLZS/records/google-maps-france-banner.png)

Extrayez les **entreprises françaises référencées sur Google Maps**, sans clé API et sans compte Google : nom, adresse, code postal, coordonnées GPS, téléphone, site web, note, nombre d'avis, horaires et catégories — et en option l'**adresse e-mail** et les réseaux sociaux relevés sur leur propre site.

Villes françaises pré-réglées, résultats en français : « Plombier », « Ouvert · Ferme à 18:00 ». Le formulaire est bilingue, français et anglais.

### À quoi ça sert

- **Constituer un fichier de prospection** : tous les plombiers d'une agglomération, avec téléphone, e-mail, et le fait qu'ils aient déjà un site ou non.
- **Étudier un marché local** : combien de restaurants dans le 11e arrondissement, leurs notes, leur nombre d'avis.
- **Enrichir un CRM** : collez vos noms de clients en recherches et récupérez adresses, coordonnées et horaires.
- **Surveiller la concurrence** : une collecte programmée chaque semaine montre les notes, les avis et les ouvertures qui bougent.
- **Préparer des tournées commerciales** : coordonnées GPS de chaque établissement, prêtes pour un calculateur d'itinéraire.

### Comment ça marche

1. La zone que vous tapez devient un rectangle géographique grâce à OpenStreetMap — gratuit, sans clé.
2. L'Actor interroge les données de la carte Google au centre de ce rectangle.
3. Quand un carré renvoie une liste pleine, il est découpé en quatre et chaque morceau est fouillé à son tour : c'est ce qui permet de couvrir une ville entière malgré la limite de 20 résultats par requête.
4. Chaque établissement est dédoublonné sur son identifiant Google, et les lieux hors de la zone demandée sont écartés.
5. En option, le site de chaque entreprise est ouvert pour y relever l'e-mail et les réseaux sociaux.

### Pas à pas

1. Dans **Recherches**, un métier par ligne : `plombier`, `dentiste`, `garage automobile`.
2. Dans **Zones**, écrivez toujours « ville, France » : `Paris, France`, `Lyon 3e, France`. Un département ou une région fonctionne aussi : `Bouches-du-Rhône, France`.
3. Réglez **Nombre maximum de lieux** — 0 pour tout prendre.
4. Pour la prospection, activez **Chercher les e-mails et réseaux sociaux**, et au besoin **Seulement sans site web**.
5. Lancez. Export Excel, CSV ou JSON en un clic.

### Exemple d'entrée

```json
{
  "searchQueries": ["plombier"],
  "locations": ["Paris, France", "Lyon, France", "Marseille, France"],
  "maxPlacesPerSearch": 200,
  "extractContacts": true,
  "skipClosedPlaces": true,
  "languageCode": "fr",
  "countryCode": "fr"
}
```

### Exemple de résultat

![Exemple de résultats](https://api.apify.com/v2/key-value-stores/paDGjcmD1ZMsRJLZS/records/google-maps-france-output.png)

```json
{
  "title": "HB Pro Plomberie",
  "categoryName": "Plombier",
  "address": "12 Rue de Maubeuge, 75009 Paris",
  "city": "75009 Paris",
  "postalCode": "75009",
  "countryCode": "FR",
  "location": { "lat": 48.8761, "lng": 2.3462 },
  "phone": "06 69 45 81 34",
  "phoneUnformatted": "+33669458134",
  "website": "https://hbproplomberie.fr/",
  "email": "contact@hbproplomberie.fr",
  "totalScore": 4.6,
  "reviewsCount": 128,
  "openingHours": [{ "day": "lundi", "hours": "08:00–19:00" }],
  "wasOpenAtScrapeTime": true
}
```

La vue **Prospection** affiche nom, téléphone, e-mail, site, note et adresse — prête à coller dans un CRM.

### Tarif

Paiement au résultat, affiché sur l'onglet tarifs. Les coûts de plateforme — proxy et calcul — sont compris : rien d'autre à payer, et aucune facture Google, puisque aucune API Google n'est utilisée.

### Questions fréquentes

**Faut-il une clé API Google ?** Non, ni la vôtre ni celle de personne.

**Combien de résultats par ville ?** Autant que Google en montre. Augmentez la **profondeur de découpage** à 3 pour les grandes villes ; un département entier se compte en milliers d'établissements.

**Pourquoi certains e-mails manquent ?** Beaucoup de petites entreprises ne publient qu'un formulaire de contact. Sur un test de 40 entreprises, 21 adresses ont été trouvées, soit environ deux tiers de celles qui ont un site.

**Des requêtes sont refusées.** Google limite les adresses partagées : choisissez le groupe de proxy **RESIDENTIAL** et relancez.

**Puis-je viser la Belgique ou la Suisse ?** Oui : « Bruxelles, Belgique » et videz le champ Pays.

### Support

Un bug, un champ manquant, une ville qui échoue : ouvrez un ticket dans l'onglet **Issues**.

**Cet Actor a fait le travail ?** Un court avis sur sa fiche prend une minute, aide d'autres personnes à le trouver, et m'indique quoi construire ensuite.

### Cadre légal

Cet Actor lit des **données publiques**, visibles par n'importe quel visiteur de Google Maps sans être connecté, ainsi que les coordonnées que les entreprises publient sur leur propre site. Il ne se connecte à aucun compte et ne collecte aucune donnée personnelle au-delà des coordonnées professionnelles.

L'accès automatisé peut contrevenir aux conditions d'utilisation de Google. Si vous utilisez les adresses e-mail pour de la prospection, le **RGPD** s'applique : indiquez l'origine des données, proposez un désabonnement et respectez les règles de la prospection B2B. L'usage relève de votre responsabilité.

***

## Google Maps France – Businesses, Phones & E-mails

Extract **French businesses from Google Maps** with **no API key and no Google account**: name, address, postcode, GPS coordinates, phone, website, rating, review count, opening hours and categories — plus, optionally, the **e-mail address** and social profiles read from each company's own website.

French cities are preset and results come back in French by default; set *Results language* to `en` for English categories. The input form is bilingual.

### What you can do with it

- **Build a prospect list**: every plumber in a metro area, with phone, e-mail, and whether they already have a website.
- **Study a local market**: how many restaurants in one district, their ratings and review counts.
- **Enrich a CRM**: paste your customer names as searches and pull back addresses, coordinates and opening hours.
- **Watch competitors**: a weekly scheduled run shows ratings, reviews and new openings moving.
- **Plan field visits**: GPS coordinates for every location, ready for a route planner.

### How it works

1. The area you type is resolved to a bounding box through OpenStreetMap — free, no key.
2. The Actor queries Google's own map data at the centre of that box.
3. When a square comes back full, it is divided into four and each part is searched again — that is how a whole city is covered despite Google's 20-results-per-request limit.
4. Every place is de-duplicated on its Google place ID, and results outside your area are dropped.
5. Optionally, each business website is opened to find contact details.

### Step by step

1. In **Searches**, one trade per line: `plumber`, `dentist`, `car repair`.
2. In **Areas**, always add the country: `Paris, France`, `Lyon 3e, France`. A department or region works too.
3. Set **Max places** — 0 for no limit.
4. For prospecting, switch on **Find e-mails and social profiles**, and optionally **Only places without a website**.
5. Run it, then export as Excel, CSV or JSON.

### Input example

```json
{
  "searchQueries": ["plumber"],
  "locations": ["Paris, France", "Lyon, France"],
  "maxPlacesPerSearch": 200,
  "extractContacts": true,
  "languageCode": "en",
  "countryCode": "fr"
}
```

### FAQ

**Do I need a Google API key?** No.

**How many results per city?** As many as Google shows. Raise **Split depth** to 3 for dense cities.

**Why is an e-mail missing for some businesses?** Many small firms publish only a contact form. In a 40-company test, 21 e-mails were found — roughly two out of three of those that have a website.

**Requests were refused.** Google throttles shared IPs: pick the **RESIDENTIAL** proxy group and run again.

**Can I target Belgium or Switzerland?** Yes — write `Brussels, Belgium` and clear the country field.

### Legal

This Actor reads **public** listing data that anyone can see on Google Maps without signing in, plus the contact details businesses publish on their own websites. It never signs in and collects no personal data beyond business contact information. Automated access may conflict with Google's Terms of Service, and e-mail prospecting in France and the EU is subject to **GDPR** — disclose where the data comes from, offer an opt-out, and follow B2B rules. How you use the data is your responsibility.

# Actor input Schema

## `searchQueries` (type: `array`):

Ce que vous taperiez dans Google Maps : plombier, restaurant, dentiste, garage, coiffeur, agence immobilière. Une recherche par ligne. — What you would type into Google Maps, one search per line.

## `locations` (type: `array`):

Villes, arrondissements, départements ou régions françaises : « Paris, France », « Lyon 3e, France », « Bouches-du-Rhône, France ». Précisez toujours « France » pour éviter les homonymes. — French cities, districts or regions; always add “France” to avoid ambiguous names.

## `maxPlacesPerSearch` (type: `integer`):

0 = sans limite : l'Actor s'arrête quand la zone est épuisée. Une grande ville contient plusieurs milliers d'établissements. — 0 means no limit; a large city holds several thousand places.

## `latitude` (type: `string`):

Pour viser un point précis plutôt qu'une ville : latitude du centre, ex. 48.8566. À utiliser avec Longitude et Rayon. — Centre latitude when you prefer an exact point to a city name.

## `longitude` (type: `string`):

Longitude du centre, ex. 2.3522. — Centre longitude, for example 2.3522.

## `radiusKm` (type: `integer`):

Demi-côté de la zone carrée explorée autour des coordonnées. — Half-width of the square searched around those coordinates.

## `extractContacts` (type: `boolean`):

Ouvre le site de chaque entreprise et y relève l'adresse e-mail publique, Facebook, Instagram, LinkedIn, X, TikTok, YouTube et WhatsApp. Google Maps ne fournit jamais d'e-mail : c'est la seule façon de l'obtenir. Rallonge le run. — Opens each company website to read its public e-mail and social accounts; Google Maps never provides e-mails. Makes runs longer.

## `onlyWithEmail` (type: `boolean`):

Ne garder que les entreprises dont on a trouvé une adresse e-mail. Active automatiquement l'option ci-dessus. — Keeps only places with an e-mail found; switches the option above on automatically.

## `skipClosedPlaces` (type: `boolean`):

Écarte les lieux marqués définitivement ou temporairement fermés par Google. — Drops places Google marks permanently or temporarily closed.

## `strictArea` (type: `boolean`):

Quand un carré de la zone est presque vide, Google élargit tout seul la recherche au pays entier. Activé, l'Actor écarte ces lieux situés ailleurs. — When a square is nearly empty Google widens the search on its own; this drops results outside your area.

## `dedupeAcrossSearches` (type: `boolean`):

Une entreprise trouvée par deux mots-clés différents n'apparaît qu'une fois dans le fichier final. — A business found by two keywords appears only once.

## `minRating` (type: `integer`):

Ne garder que les lieux ayant au moins cette note, de 1 à 5. — Keep only places rated at least this, from 1 to 5.

## `minReviews` (type: `integer`):

Ne garder que les lieux ayant au moins ce nombre d'avis. — Keep only places with at least this many reviews.

## `onlyWithPhone` (type: `boolean`):

Utile pour la prospection : écarte les fiches sans numéro. — Useful for prospecting: drops places without a phone number.

## `onlyWithWebsite` (type: `boolean`):

Ne garder que les lieux qui affichent un site web. — Keep only places that show a website.

## `onlyWithoutWebsite` (type: `boolean`):

L'inverse : les commerces sans site, souvent les meilleurs prospects pour une agence web. — The opposite: businesses with no website, often the best prospects for a web agency.

## `categoryKeywords` (type: `array`):

Ne garder que les lieux dont une catégorie Google contient un de ces mots, ex. pizza, italien. — Keep only places whose Google category contains one of these words.

## `excludeKeywords` (type: `array`):

Exclure les lieux dont le nom contient un de ces mots. — Exclude places whose name contains any of these words.

## `languageCode` (type: `string`):

Langue des catégories et des horaires : « fr » donne « Plombier, Ouvert · Ferme à 18:00 », « en » donne « Plumber, Open · Closes 6 PM ». — Language of categories and opening hours.

## `countryCode` (type: `string`):

« fr » garde la recherche en France ; videz-le pour la Belgique, la Suisse ou le Luxembourg. — “fr” keeps results in France; clear it for Belgium, Switzerland or Luxembourg.

## `maxPagesPerTile` (type: `integer`):

Google rend 20 lieux par page. 5 pages = jusqu'à 100 lieux par carré avant découpage. — Google returns 20 places per page; 5 pages is up to 100 per square before splitting.

## `maxSplitDepth` (type: `integer`):

Quand un carré est saturé, l'Actor le découpe en quatre. 2 = jusqu'à 16 carrés par zone, 3 = jusqu'à 64, plus long mais plus complet. — How many times a saturated square is divided into four.

## `maxConcurrency` (type: `integer`):

Plus élevé = plus rapide, mais Google bloque plus facilement. — Higher is faster, but Google blocks more easily.

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

Le proxy Apify évite que Google bloque les requêtes. En cas de refus, choisissez le groupe « RESIDENTIAL ». — Apify Proxy prevents Google from blocking requests; switch to the RESIDENTIAL group if requests are refused.

## Actor input object example

```json
{
  "searchQueries": [
    "plombier"
  ],
  "locations": [
    "Paris, France",
    "Lyon, France",
    "Marseille, France"
  ],
  "maxPlacesPerSearch": 200,
  "radiusKm": 5,
  "extractContacts": false,
  "onlyWithEmail": false,
  "skipClosedPlaces": false,
  "strictArea": true,
  "dedupeAcrossSearches": false,
  "onlyWithPhone": false,
  "onlyWithWebsite": false,
  "onlyWithoutWebsite": false,
  "languageCode": "fr",
  "countryCode": "fr",
  "maxPagesPerTile": 5,
  "maxSplitDepth": 2,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Tableau des lieux : nom, catégorie, note, avis, téléphone, site web, adresse.

## `allFields` (type: `string`):

Données complètes : coordonnées GPS, horaires, description, identifiants Google.

## `runStats` (type: `string`):

Nombre de lieux, carrés parcourus, requêtes et doublons.

# 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 = {
    "searchQueries": [
        "plombier"
    ],
    "locations": [
        "Paris, France",
        "Lyon, France",
        "Marseille, France"
    ],
    "maxPlacesPerSearch": 200,
    "maxConcurrency": 8,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("badr_xba/google-maps-france").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 = {
    "searchQueries": ["plombier"],
    "locations": [
        "Paris, France",
        "Lyon, France",
        "Marseille, France",
    ],
    "maxPlacesPerSearch": 200,
    "maxConcurrency": 8,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("badr_xba/google-maps-france").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 '{
  "searchQueries": [
    "plombier"
  ],
  "locations": [
    "Paris, France",
    "Lyon, France",
    "Marseille, France"
  ],
  "maxPlacesPerSearch": 200,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call badr_xba/google-maps-france --silent --output-dataset

```

## MCP server setup

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

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/QWwaG0gmblFqmXW8H/builds/fnq2rlW3B7AtyJBdQ/openapi.json
