# Leads Locales de Google Maps — Email, Teléfono, Web y CNPJ (`paulovitor18/google-maps-leads-locales`) Actor

Convierte cualquier búsqueda de Google Maps en una lista de leads lista para llamar: nombre, categoría, teléfono, sitio web, email, dirección completa y GPS. En negocios de Brasil resuelve además el CNPJ y el registro público. Paga por resultado.

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

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Leads Locales de Google Maps — Email, Teléfono, Web y CNPJ

Convierte cualquier búsqueda de Google Maps en una lista lista para llamar. Escribe qué vendes y dónde, y recibes cada negocio local con su teléfono, sitio web oficial, email, dirección completa con código postal y GPS — los datos de contacto que un comercial marca de verdad, no solo un nombre en un mapa.

Funciona en cualquier búsqueda de Google Maps del mundo. Para negocios de Brasil añade una capa que ningún scraper global tiene: el **CNPJ** y el registro público de empresas (razón social, situación registral, tamaño, actividad, socios), leído del propio sitio web de la empresa y resuelto contra el registro federal.

### Leads locales de Google Maps en la práctica: qué devuelve cada negocio

Una agencia que vende a restaurantes busca "restaurantes" en una ciudad y recibe la lista lista para llamar hoy: nombre, categoría, calificación, teléfono, web, correo y redes — y, cuando la web publica el CNPJ, los datos oficiales del registro brasileño en el mismo registro. Un lead real devuelto por el Actor:

Una fila real de la ejecución `E1ZzrDGuot3JkFkn4` (Madrid), recortada a los campos que más se usan:

```json
{
  "nombre": "Los Montes de Galicia",
  "categoria": "Restaurante gallego",
  "direccion": "C. de Azcona, 46, Salamanca, 28028 Madrid, España",
  "codigo_postal": "28028",
  "telefono": "+34 913 55 27 86",
  "telefono_digitos": "34913552786",
  "sitio_web": "https://losmontesdegalicia.es/",
  "correo": "info@losmontesdegalicia.es",
  "instagram": "https://instagram.com/losmontesdegalicia",
  "facebook": "https://www.facebook.com/LosMontesdeGalicia",
  "calificacion": 4.8,
  "numero_resenas": 13937,
  "lat": 40.4346777,
  "lng": -3.668364,
  "hidratado": true,
  "registro_enriquecido": false,
  "nota_registro": "no_cnpj_on_site"
}
```

Y una fila brasileña de la ejecución `4m92nIZLVJ753Ojnr`, donde la capa registral sí dispara — y donde se ve la guardia de cadena en acción:

```json
{
  "nombre": "Drogaria Catarinense",
  "direccion": "R. Bocaiúva, 2375 - Centro, Florianópolis - SC, 88015-530, Brasil",
  "codigo_postal": "88015-530",
  "region": "SC",
  "telefono": "+55 48 3037-4581",
  "sitio_web": "https://www.drogariacatarinense.com.br/",
  "correo": "atendimento@drogariacatarinense.com.br",
  "cnpj": "84.683.481/0151-07",
  "razon_social": "CIA LATINO AMERICANA DE MEDICAMENTOS",
  "nombre_comercial": "DROGARIA CATARINENSE",
  "situacion_registro": "ATIVA",
  "actividad_principal": "4771701 - Comércio varejista de produtos farmacêuticos, sem manipulação de fórmulas",
  "registro_enriquecido": true,
  "confianza_coincidencia": "baja",
  "fuente_registro": "brasilapi"
}
```

`confianza_coincidencia: "baja"` aquí no es un defecto: es el aviso de que ese CNPJ vino de la web corporativa de una cadena y describe al grupo, no a esa sucursal exacta. Por eso mismo se cobró una sola vez.

Cada fila lleva además `place_id`, `ftid`, `gmid`, `url_maps`, `patrocinado`, `rango_precios`, `tamano_empresa`, `capital_social` y `socios`.

### Resumen: cómo funciona la extracción de leads de Google Maps

Le das un término y una ubicación — "restaurantes" en "Madrid, España" — y hace a mano lo que haría un comercial, más rápido. Lee la lista de resultados de Maps, abre la ficha de cada negocio para sacar el teléfono, el sitio web oficial, la dirección completa y las coordenadas exactas, y cuando el negocio tiene web la visita una vez buscando email y perfiles sociales.

Una ejecución con los valores por defecto, medida el 2026-09-07: **25 negocios en 3 minutos**, 22 con teléfono, los 25 con código postal, 14 con email leído de la propia web de la empresa.

La capa brasileña va en la misma pasada. Si el sitio publica un CNPJ, el número se valida por sus dígitos verificadores y se resuelve contra el registro público, de modo que la fila llega con la entidad jurídica que hay detrás del local. En una búsqueda de farmacias en Florianópolis, 6 de 14 negocios se resolvieron — y como algunos compartían el CNPJ de su cadena, **se cobraron 4 y no 6**.

Fuera de Brasil esa capa sencillamente no encuentra nada, y **no se te cobra por ella**. Ese es el caso honesto, no un fallo.

### Características: contacto, dirección completa y enriquecimiento por CNPJ

- **Datos de contacto, no solo fichas:** teléfono en formato de visualización y en dígitos, sitio web oficial, email, Instagram, WhatsApp y Facebook cuando la web los publica.
- **Dirección analizada:** calle, código postal y región en campos separados — CP español y latinoamericano, CEP brasileño, ZIP y ZIP+4 de EE. UU., códigos de Canadá y Reino Unido.
- **Enriquecimiento registral brasileño:** CNPJ leído de la web, validado por dígitos verificadores y resuelto a razón social, situación, tamaño, capital, actividad principal y socios.
- **Guardia de cadena:** cuando un mismo CNPJ aparece en varios locales de la misma ejecución, viene de una web corporativa compartida — esas filas se marcan `confianza_coincidencia: baja` y el enriquecimiento se cobra **una vez**, no una por sucursal.
- **Abstención honesta:** sin web, o con una web sin email y sin CNPJ, el campo queda vacío y ese enriquecimiento es **gratis**.
- **Un bloqueo nunca se vende como resultado vacío:** si Google sirve una página bloqueada, la ejecución escala a una ruta residencial y, si esa también viene ciega, **falla diciéndolo** en lugar de entregarte un dataset vacío que se lee como "aquí no hay negocios".
- **Sobrevive a la migración de plataforma:** el progreso se guarda, así que una ejecución movida a otro worker se reanuda en vez de empezar de cero — y nunca entrega ni cobra dos veces el mismo negocio.

### Ejemplo de entrada: término de búsqueda y ubicación

```json
{
  "search_term": "restaurantes",
  "location": "Madrid, España",
  "max_results": 25,
  "hydrate_details": true,
  "max_hydrations": 25,
  "enrich_from_website": true,
  "proxy": { "useApifyProxy": true }
}
```

### Parámetros: término, ubicación, hidratación y enriquecimiento

| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
| `search_term` | string | `"restaurantes"` | Qué buscar, tal como lo escribirías en Maps. |
| `location` | string | `"Madrid, España"` | Ciudad y zona. Cualquier país; la búsqueda sigue lo que escribas. |
| `max_results` | integer | `25` | Límite de negocios entregados (control de coste). Maps lista ~120 por búsqueda; afina término y ciudad para ir más allá. Máx. 150. |
| `hydrate_details` | boolean | `true` | Abre cada ficha para teléfono, web, dirección completa, código postal y GPS. Es el paso que crea el lead. Desactívalo para un barrido rápido de nombre y calificación. |
| `max_hydrations` | integer | `25` | Límite de fichas abiertas. El valor por defecto mantiene la ejecución dentro de la prueba diaria de 5 minutos de Apify. Máx. 100. |
| `enrich_from_website` | boolean | `true` | Visita la web del negocio una vez para email, redes y, en Brasil, el CNPJ, y luego consulta el registro. |
| `proxy` | object | Apify Proxy | Centro de datos rotativo por defecto, medido devolviendo 200 en Maps sin captcha. Cambia a Residencial y un país cercano si ves bloqueo con volumen. |
| `self_test` | boolean | `false` | Solo diagnóstico. Ejecuta la batería de respuestas conocidas en vez de una búsqueda. |

### Consejos para conseguir más leads gastando menos

- **Estrecho gana a amplio.** "clínicas dentales" + "Getafe, Madrid" da una lista que puedes trabajar hoy; "negocios" + "España" da ruido.
- **Desactiva la hidratación para explorar, actívala para vender.** Sin ella la ejecución es rápida y barata y te dice cuántos negocios hay en un nicho; con ella obtienes los teléfonos.
- **Sube `max_hydrations` a conciencia.** El valor por defecto está puesto para caber en 5 minutos, que es lo que exige la prueba automática de Apify — tú ejecutando a mano no tienes esa prisa.
- **La tasa de email varía por sector.** Restaurantes y clínicas publican dirección de contacto; oficios y negocios de una sola persona a menudo solo publican teléfono. Pagas por el negocio en cualquier caso, nunca por un email que no estaba.
- **Lee `confianza_coincidencia` en las filas brasileñas.** `baja` significa que el CNPJ vino de una web compartida y puede describir al grupo y no a ese local.

### Casos de uso: prospección B2B, estudio de mercado y SEO local

- **Prospección B2B local:** arma una lista de llamadas con todos los restaurantes, clínicas, gimnasios o instaladores de una ciudad, con teléfono y web ya adjuntos.
- **Listas para agencias:** entrega a tu cliente una lista fresca y verificada de su zona de servicio en vez de revender una base de datos envejecida.
- **Dimensionar territorio y mercado:** cuenta y ubica cuántos negocios de un tipo operan en una zona antes de asignar un comercial o abrir un local.
- **Enriquecer el CRM:** pasa por Maps los nombres que ya tienes para adjuntarles teléfono, web, coordenadas y código postal.
- **KYB y due diligence en Brasil:** pasa del local en el mapa a la entidad jurídica, su situación registral y sus socios, sin preguntarle nada al comerciante.
- **Expansión y franquicia:** mide la densidad de una categoría por barrio antes de elegir la siguiente ubicación.

### Preguntas frecuentes sobre extraer leads locales de Google Maps

**¿Funciona fuera de Brasil?** Sí, es lo normal. El descubrimiento de negocios, los datos de contacto, el análisis de la dirección y el enriquecimiento desde la web funcionan en cualquier búsqueda de Google Maps del mundo. La capa de CNPJ y registro es un extra que solo aplica a empresas brasileñas; en el resto esos campos quedan vacíos y no te cuestan nada.

**¿De dónde sale el email?** De la propia web del negocio, que el Actor visita una vez y lee en las páginas donde las empresas publican datos de contacto. Nunca se adivina, nunca se arma juntando un nombre y un dominio, y nunca se toma de una base de datos de terceros. Si la web no publica dirección, el campo queda vacío.

**¿Por qué `correo` está vacío en algunas filas?** Porque ese negocio no tiene web o no publica una dirección en ella. En la ejecución de Madrid, 14 de 25 filas traían email. Reportar el hueco con honestidad es justamente el punto: pagas por el negocio, no por un contacto inventado.

**¿Qué es `registro_enriquecido`?** Es `true` solo cuando se encontró un CNPJ real en la web de la empresa y de verdad se resolvió en el registro público brasileño. Es además la unidad de cobro: un CNPJ que se encuentra pero no resuelve se entrega como información y **no se cobra**.

**Una cadena tiene 20 sucursales con un solo CNPJ. ¿Pago 20 veces?** No. Un CNPJ que se repite dentro de una ejecución se cobra **una vez**, y todas las filas afectadas se etiquetan `confianza_coincidencia: baja`. En la ejecución de ejemplo, 6 negocios enriquecidos se cobraron como 4.

**¿Y si la búsqueda está legítimamente vacía?** Es una respuesta válida, no un error. La ejecución termina bien con un dataset vacío y no cobra nada. El cero solo se toma por real cuando Google lo dijo: un cartel de "sin resultados", una tarjeta solo de la localidad, o un aviso de coincidencia parcial.

**¿Y si Google bloquea la recogida?** La ejecución escala a una ruta residencial. Si esa también viene ciega, **falla y nombra el motivo** en vez de terminar "con éxito" y sin nada dentro. Un bloqueo vendido como resultado vacío es justo el fallo que este Actor se niega a cometer.

**¿Cuánto tarda?** Unos 3 minutos con los valores por defecto — 25 negocios completamente hidratados, medido en 178 segundos.

### Precio: cuánto cuesta extraer leads de Google Maps

Pago por resultado (PPE). Pagas por negocio entregado y por dato registral realmente resuelto — nunca por una ejecución, un reintento o una búsqueda vacía.

| Evento | Precio | Cuándo se cobra |
|---|---|---|
| `place_scraped` | $0,008 | Cada negocio entregado al dataset, con nombre, categoría, teléfono, web, email, calificación, dirección y GPS. |
| `cnpj_enriquecido` | $0,005 | Cada CNPJ **único** encontrado en la web de un negocio y resuelto en el registro brasileño. Una cadena que comparte CNPJ se cobra una sola vez. |

Una ejecución por defecto de 25 negocios fuera de Brasil cuesta **$0,20**. Los mismos 25 en Brasil con 8 empresas resueltas cuestan **$0,24**.

**NO se te cobra por:** una búsqueda vacía, una ejecución bloqueada o fallida, un negocio cuya web no tiene email ni CNPJ, un CNPJ que no resuelve en el registro, ni el mismo negocio dos veces tras una migración de plataforma.

### MoreLock — la suite de datos de Brasil

Este Actor forma parte de **MoreLock**, una colección de Actors de datos de Brasil pensados para conectarse por el CNPJ. Quien usa este suele combinarlo con:

| Actor | Qué le suma a tu flujo |
|---|---|
| [Monitor de Nuevos Negocios en Google Maps — Leads Locales](https://apify.com/paulovitor18/google-maps-monitor-nuevos-negocios) | Avisa cuando abre un negocio nuevo en la zona que vigilas. |
| [Monitor de Precios Mercado Libre — Alerta de Baja y Stock](https://apify.com/paulovitor18/mercado-libre-monitor-precios) | Alerta de baja de precio y quiebre de stock en Mercado Libre. |

🌎 **Mismo producto, otro idioma:** [🇺🇸 Versión en inglés — Google Maps Local Leads — Email, Phone, Website & Brazil CNPJ](https://apify.com/paulovitor18/google-maps-local-leads) · [🇧🇷 Versión en portugués — Google Maps Brasil — Leads Locais com E-mail, Telefone e CNPJ](https://apify.com/paulovitor18/gmaps-brasil-leads)

**[Ver los 26 Actors de MoreLock →](https://apify.com/paulovitor18)**

### Historial de versiones

- **0.1** — primera versión: de una búsqueda de Google Maps a leads con contacto, con hidratación de ficha (teléfono, web, código postal, GPS), enriquecimiento desde la web (email y redes), la capa brasileña de CNPJ y registro con guardia de cadena, manejo con prueba positiva de vacío frente a bloqueo, y cobro idempotente ante migraciones de plataforma.

### Contacto y soporte

Dudas, fallos o una fuente que te gustaría añadir: usa la pestaña Issues del Actor.

# Actor input Schema

## `search_term` (type: `string`):

Qué buscar en Google Maps, tal como lo escribirías tú (p. ej. "restaurantes", "clínicas dentales", "farmacias").

## `location` (type: `string`):

Ciudad y zona donde buscar (p. ej. "Madrid, España", "Bogotá", "Ciudad de México"). Cuanto más específico, más preciso el resultado. Funciona en cualquier búsqueda de Google Maps del mundo.

## `max_results` (type: `integer`):

Límite de negocios entregados en esta ejecución (control de coste). Google Maps suele listar ~120 por búsqueda; afina el término y la ciudad para ir más allá. Para barridos grandes, mejor DESACTIVA el paso de detalle (abajo) — sin él la recogida es rápida aunque haya muchos resultados.

## `hydrate_details` (type: `boolean`):

Abre la ficha de detalle de cada negocio para extraer teléfono, sitio web, dirección completa, código postal y GPS exacto. Es el paso que convierte un nombre en un lead de verdad, y también el más caro (una navegación extra por negocio). Desactívalo para un barrido rápido con nombre, categoría, calificación y ubicación aproximada.

## `max_hydrations` (type: `integer`):

Limita cuántas fichas de detalle se abren (el paso caro de arriba). El valor por defecto (25) está puesto para que una ejecución por defecto quepa dentro de la prueba diaria de 5 minutos de Apify; súbelo hasta 100 para barridos mayores — tú ejecutas sin esa prisa — y por encima de eso ejecuta por lotes de término y ciudad.

## `enrich_from_website` (type: `boolean`):

Cuando el negocio tiene sitio web, lo visita una vez para encontrar email, redes sociales y — en negocios de Brasil — el CNPJ. Con un CNPJ válido consulta el registro público (razón social, situación, tamaño, capital, actividad, socios). Es best-effort: muchos sitios no publican datos de contacto en texto, y fuera de Brasil no hay CNPJ que encontrar. En esos casos el campo queda vacío y NO se te cobra el enriquecimiento.

## `proxy` (type: `object`):

Enrutado de red. El valor por defecto (Apify Proxy, centro de datos rotativo) se midió devolviendo 200 en Google Maps sin captcha. Si ves bloqueo o muro de consentimiento con volumen, selecciona Residencial y un país cercano a tu zona objetivo.

## `self_test` (type: `boolean`):

No usar en producción. Omite la búsqueda y ejecuta la batería de respuestas conocidas (parseo del feed congelado, búsqueda vacía, enriquecimiento, abstención honesta, bloqueo-no-es-vacío) para probar que el parser y la salida de red siguen correctos. Emite un único registro de diagnóstico.

## Actor input object example

```json
{
  "search_term": "restaurantes",
  "location": "Madrid, España",
  "max_results": 25,
  "hydrate_details": true,
  "max_hydrations": 25,
  "enrich_from_website": true,
  "proxy": {
    "useApifyProxy": true
  },
  "self_test": false
}
```

# Actor output Schema

## `leads` (type: `string`):

Negocios entregados en esta ejecución, con el formato descrito en dataset\_schema.json.

## `resumen` (type: `string`):

Contadores de la ejecución: buscados, entregados, hidratados, enriquecidos, abstenciones.

# 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 = {
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("paulovitor18/google-maps-leads-locales").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 = { "proxy": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("paulovitor18/google-maps-leads-locales").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 '{
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call paulovitor18/google-maps-leads-locales --silent --output-dataset

```

## MCP server setup

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

```

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/S5NgPRwmiQfPmfO2N/builds/XdqQVvLewoHZwf29B/openapi.json
