Google Maps Business Leads Scraper avatar

Google Maps Business Leads Scraper

Pricing

from $4.50 / 1,000 results

Go to Apify Store
Google Maps Business Leads Scraper

Google Maps Business Leads Scraper

Scrape Google Maps business leads: phone, website, rating, hours, popular times, services, and review topics. Search by category, keyword, and location across 18 languages.

Pricing

from $4.50 / 1,000 results

Rating

0.0

(0)

Developer

wang wei

wang wei

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Maps Business Leads Scraper — Google Maps Lead Generation

Find business leads on Google Maps in any country, in any language. Extract phone numbers, websites, ratings, business hours, popular times, services, and review topics for any category, keyword, and location — all in a single run.

This Apify Actor searches Google Maps and turns the results into a one-click lead generation tool for marketers, agencies, and researchers. Search by category, keyword, and GPS coordinate across 18 languages, and export clean JSON to an Apify Dataset ready for CRM import.


Table of Contents


Why Use This Actor

Searching Google Maps manually takes hours. Copy-pasting phone numbers is error-prone. Different languages and currencies break naive scrapers. This Actor solves all of that:

ProblemHow This Actor Solves It
Scraping Google Maps directly gets you blockedUses enterprise-grade infrastructure — no IP bans, no CAPTCHAs, no rate-limit headaches
Multi-language searches need native scripts18 languages supported via Map: English, 中文, 日本語, 한국어, Deutsch, Français, Español, etc.
Duplicate businesses across categories & locationsThree-tier dedup: place_idcid → text fallback
Large radius searches miss suburbsPer-task auto-pagination (up to 200 results per location)
Field bloat in JSON exportsAll 10 field groups included; nothing to configure
Hard limits on free-tier cost200 results/task hard cap, 1500/min rate limit, free users get 5 runs/day

What You Get

Every business in the output includes:

  • Identity: place_id, cid, title, original_title, category, category_ids, additional_categories, address, address_info{borough, address, city, zip, region, country_code}, latitude, longitude, url
  • Contact: phone, domain, contact_info[] (extra phones / emails / websites)
  • Rating: rating{type, value, votes_count, max}, hotel_rating, price_level, rating_distribution{1..5}, is_claimed
  • Hours: work_time{current_status, timetable{sunday..saturday[{open, close}]}}
  • Popular Times: popular_times{popular_times_by_days{sunday..saturday[{hour, minute, popular_index}]}}
  • Services: services[]{category, title, snippet, price{current, regular, max_value, currency, is_price_range, displayed_price}}
  • Attributes: attributes{available_attributes, unavailable_attributes}
  • Topics: place_topics{"keyword": count} — review keyword frequency
  • Media: total_photos, logo, main_image
  • Links: local_business_links[]{type, title, url} (reservation / order / menu / delivery)

Plus a top-level language field for data lineage (which language the search was run in).


Quick Start

1. Run with Example Input

No setup required — credentials are pre-configured. Just paste this into the input form:

categories: lawyer
keywords: personal injury
locations: Los Angeles,CA,United States
language: English

That's it. Results stream into the default dataset in 10–60 seconds.

2. Export Your Results

In the Apify Console, open the Dataset tab → Export → choose JSON, CSV, Excel, or pipe to your CRM via the Apify API. The run summary is also written to the default Key-Value Store as the SUMMARY key.


Auto-fill Defaults (for Apify Automated Tests)

When categories or locations is empty or missing, the Actor auto-fills them with sensible sample values so Apify automated-test runs (which often submit bare payloads) succeed without manual setup:

  • categorieslawyer
  • locationsLos Angeles,CA,United States
  • keywords → (empty — keywords are optional)
  • languageEnglish

The Actor logs which fields were auto-filled and writes them to the run summary under autoFilled. To disable auto-fill and require explicit input, pass:

{
"autoFillDefaults": false,
"categories": "lawyer",
"locations": "Tokyo,Japan"
}

With autoFillDefaults: false, an empty categories or locations will fail validation with a clear error message.

Input Reference

Top-Level Structure

{
"categories": "lawyer\npersonal_injury_lawyer",
"keywords": "personal injury\ncar accident attorney",
"locations": "Los Angeles,CA,United States\n34.0522,-118.2437,25",
"language": "English"
}

Every field is a multi-line text box — one value per line. Paste from a spreadsheet, one per row, or just type lines manually. The Actor expands the cartesian product (locations × categories) into individual search tasks, each optionally tagged with the joined keywords.

categories — Business Categories (required)

Multi-line text box. Business category slugs, one per line (max 10). Examples: lawyer, restaurant, real_estate_agency, dental_clinic, marketing_agency, pizza_restaurant.

locations — Target Locations (required)

Multi-line text box. One location per line. Use a city name (e.g. Los Angeles,CA,United States) or GPS coords lat,lng,radius_km (e.g. 34.0522,-118.2437,25). Auto-detected per line.

keywords — Search Keywords (optional)

Multi-line text box. Optional keywords appended to the title / description search, one per line (max 20). Use any language. Keywords are joined with a space and truncated to 200 characters per task.

Need to run more searches? Submit multiple Actor runs with different category / keyword combinations — each run is one search job. There is no nested queries[] array; the form is intentionally flat to match the Apify Console text-area editor.

Location Formats

Each line in the Locations text box is auto-detected. Numeric-only 3-part comma-separated lines are treated as coordinates; everything else is treated as a city name:

Los Angeles,CA,United States // city / region name
Berlin,Germany
Tokyo,Japan
34.0522,-118.2437,25 // lat,lng,radius_km — radius 1-100000
41.9028,12.4964,10

language — Result Language

One setting for the entire run. Accepts English names, ISO 639-1 codes, or local scripts:

English NameISO 639-1Local ScriptOutput Code
Englishenen
Chinesezh中文, 简体中文, 繁体中文zh
GermandeDeutschde
Japaneseja日本語ja
Koreanko한국어ko
FrenchfrFrançaisfr
SpanishesEspañoles
PortugueseptPortuguêspt
RussianruРусскийru
Arabicarالعربيةar
ItalianitItalianoit
DutchnlNederlandsnl
PolishplPolskipl
TurkishtrTürkçetr
VietnameseviTiếng Việtvi
Thaithภาษาไทยth
IndonesianidBahasaid
Hindihiहिन्दीhi

Unrecognized input falls back to English — no errors thrown.


Output Reference

One JSON object per business. Example:

{
"language": "en",
"place_id": "ChIJn2J5_8VhZ0wRkS8xG3cK1uA",
"cid": "12345678901234567890",
"title": "Smith & Jones Personal Injury Law",
"original_title": "Smith & Jones Personal Injury Law",
"category": "Personal injury attorney",
"category_ids": ["1109"],
"additional_categories": ["Lawyer"],
"address": "1234 Sunset Blvd, Los Angeles, CA 90028",
"address_info": {
"borough": "Hollywood",
"address": "1234 Sunset Blvd",
"city": "Los Angeles",
"zip": "90028",
"region": "Los Angeles County",
"country_code": "US"
},
"latitude": 34.098,
"longitude": -118.328,
"url": "https://www.google.com/maps?cid=12345678901234567890",
"domain": "smithjoneslaw.com",
"phone": "+12135551234",
"contact_info": [
{ "type": "phone", "value": "+12135551234", "source": "google" },
{ "type": "website", "value": "https://smithjoneslaw.com", "source": "google" }
],
"rating": { "rating_type": "Max5", "value": 4.8, "votes_count": 327, "rating_max": 5 },
"hotel_rating": null,
"price_level": null,
"rating_distribution": { "1": 2, "2": 1, "3": 5, "4": 23, "5": 296 },
"is_claimed": true,
"work_time": {
"current_status": "open",
"timetable": {
"monday": [{ "open": { "hour": 9, "minute": 0 }, "close": { "hour": 17, "minute": 0 } }],
"tuesday": [{ "open": { "hour": 9, "minute": 0 }, "close": { "hour": 17, "minute": 0 } }],
"wednesday": [{ "open": { "hour": 9, "minute": 0 }, "close": { "hour": 17, "minute": 0 } }],
"thursday": [{ "open": { "hour": 9, "minute": 0 }, "close": { "hour": 17, "minute": 0 } }],
"friday": [{ "open": { "hour": 9, "minute": 0 }, "close": { "hour": 17, "minute": 0 } }],
"saturday": [],
"sunday": []
}
},
"popular_times": {
"popular_times_by_days": {
"monday": [
{ "hour": 9, "minute": 0, "popular_index": 25 },
{ "hour": 10, "minute": 0, "popular_index": 60 }
]
}
},
"services": [
{
"category": "Legal Service",
"title": "Free Case Evaluation",
"snippet": "No fee unless you win",
"price": null
}
],
"attributes": {
"available_attributes": { "wheelchair_accessible": true, "online_appointments": true },
"unavailable_attributes": {}
},
"place_topics": { "attorney": 87, "case": 64, "accident": 52 },
"total_photos": 42,
"logo": "https://lh3.googleusercontent.com/...",
"main_image": "https://lh3.googleusercontent.com/...",
"local_business_links": []
}

Use Cases

Lead Generation for Agencies

Scrape personal injury attorneys in LA with 4+ star ratings and 50+ reviews:

categories: personal_injury_lawyer
locations: Los Angeles,CA,United States
New York,NY,United States
keywords: personal injury
car accident
language: English

Restaurant Site Selection

Find busy lunch spots in Tokyo to scout a new branch location:

categories: ramen_restaurant
locations: Tokyo,Japan
Osaka,Japan
keywords: ramen
tonkotsu
language: 日本語

Competitor Pricing Research

Pull menu prices for pizza restaurants in Rome:

categories: pizza_restaurant
keywords: Neapolitan pizza
locations: Rome,Italy
Naples,Italy
language: Italiano

Multi-City Real Estate Agents

Search real estate agencies across three US metros in one run:

categories: real_estate_agency
locations: New York,NY,United States
Los Angeles,CA,United States
Chicago,IL,United States
language: English

Pricing & Limits

Free Tier

  • 5 runs per day (UTC calendar day)
  • 200 results per task
  • 1500 API calls/min (industry-standard safety limit)

Pay-Per-Event (PPE) — Paid Tier

  • No run limit
  • No input caps
  • Charged via Actor.charge() per event:
Event NameWhat It Charges For
query-taskOne per search task (= one location × category)
business-resultOne per business result pushed to dataset

Pricing per event is configured by the Actor owner. Check the Pricing tab in the Apify Console for current rates.

Hard Limits (All Tiers)

  • 200 results per task (locked — prevents runaway costs)
  • 50 pages per task (10,000 item cap via auto-pagination)
  • 1500 API calls/min (token bucket)
  • 3 retries on 5xx / network errors with exponential backoff

Cost Notes

The Actor charges you per event via Apify's Pay-Per-Event model. The underlying search infrastructure cost is included in the event pricing — there is no separate usage fee.


FAQ

Why does my run fail with "API credentials missing"?

Credentials are bundled in the Actor configuration, so this should not happen during normal use. If it does, please open an issue on the Actor's GitHub repo with the full error log.

Why does my run fail with "Payment required"?

Your account balance is empty. Top up via Settings → Billing in the Apify Console.

Why does my run fail with "Authentication failed"?

The bundled credentials have been rejected by the upstream API. Please open an issue on the Actor's GitHub repo.

Why am I getting only 200 results per location?

Hard limit to protect free-tier users from runaway costs. Upgrade to a paid Apify plan to keep this limit, or submit multiple Actor runs with different keyword / category / location combinations.

Can I get more than 200 per location?

Not in this version. Submit multiple Actor runs with different keyword / category / location combinations. The 200 cap is enforced server-side.

How do I find the right category name?

Use the standard Google My Business category naming convention. Examples that work: lawyer, restaurant, pizza_restaurant, real_estate_agency, dental_clinic, marketing_agency, hair_salon, coffee_shop, gym, auto_repair. Lowercase with underscores.

What if I get an unknown language code in my output?

The Actor falls back to en for any unrecognized input. The language field in each output record always reflects the ISO 639-1 code that was actually used.

Where do I see the run summary?

Each run saves a SUMMARY key in the Key-Value Store with totals: tasks run, items fetched, items pushed, duplicates skipped, errors.


Technical Details

  • Data source: Google Maps business listings
  • Runtime: Node.js 20 (Docker)
  • Concurrency: 10 parallel tasks
  • Dedup: 3-tier (place_id → cid → title+address+lat/lng)
  • Auto-pagination: Up to 50 pages
  • Retries: 3 attempts with exponential backoff (5xx, network, 429)
  • Free-tier storage: Apify KV store free-tier-limits, key free_runs_YYYY-MM-DD

Support


License

Apache-2.0