Google Maps Business Leads Scraper
Pricing
from $4.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
- What You Get
- Quick Start
- Input Reference
- Output Reference
- Use Cases
- Pricing & Limits
- FAQ
- Support
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:
| Problem | How This Actor Solves It |
|---|---|
| Scraping Google Maps directly gets you blocked | Uses enterprise-grade infrastructure — no IP bans, no CAPTCHAs, no rate-limit headaches |
| Multi-language searches need native scripts | 18 languages supported via Map: English, 中文, 日本語, 한국어, Deutsch, Français, Español, etc. |
| Duplicate businesses across categories & locations | Three-tier dedup: place_id → cid → text fallback |
| Large radius searches miss suburbs | Per-task auto-pagination (up to 200 results per location) |
| Field bloat in JSON exports | All 10 field groups included; nothing to configure |
| Hard limits on free-tier cost | 200 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: lawyerkeywords: personal injurylocations: Los Angeles,CA,United Stateslanguage: 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:
categories→lawyerlocations→Los Angeles,CA,United Stateskeywords→ (empty — keywords are optional)language→English
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 joinedkeywords.
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 nameBerlin,GermanyTokyo,Japan34.0522,-118.2437,25 // lat,lng,radius_km — radius 1-10000041.9028,12.4964,10
language — Result Language
One setting for the entire run. Accepts English names, ISO 639-1 codes, or local scripts:
| English Name | ISO 639-1 | Local Script | Output Code |
|---|---|---|---|
| English | en | — | en |
| Chinese | zh | 中文, 简体中文, 繁体中文 | zh |
| German | de | Deutsch | de |
| Japanese | ja | 日本語 | ja |
| Korean | ko | 한국어 | ko |
| French | fr | Français | fr |
| Spanish | es | Español | es |
| Portuguese | pt | Português | pt |
| Russian | ru | Русский | ru |
| Arabic | ar | العربية | ar |
| Italian | it | Italiano | it |
| Dutch | nl | Nederlands | nl |
| Polish | pl | Polski | pl |
| Turkish | tr | Türkçe | tr |
| Vietnamese | vi | Tiếng Việt | vi |
| Thai | th | ภาษาไทย | th |
| Indonesian | id | Bahasa | id |
| Hindi | hi | हिन्दी | 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_lawyerlocations: Los Angeles,CA,United StatesNew York,NY,United Stateskeywords: personal injurycar accidentlanguage: English
Restaurant Site Selection
Find busy lunch spots in Tokyo to scout a new branch location:
categories: ramen_restaurantlocations: Tokyo,JapanOsaka,Japankeywords: ramentonkotsulanguage: 日本語
Competitor Pricing Research
Pull menu prices for pizza restaurants in Rome:
categories: pizza_restaurantkeywords: Neapolitan pizzalocations: Rome,ItalyNaples,Italylanguage: Italiano
Multi-City Real Estate Agents
Search real estate agencies across three US metros in one run:
categories: real_estate_agencylocations: New York,NY,United StatesLos Angeles,CA,United StatesChicago,IL,United Stateslanguage: 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 Name | What It Charges For |
|---|---|
query-task | One per search task (= one location × category) |
business-result | One 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, keyfree_runs_YYYY-MM-DD
Support
- Documentation: This README
- Issues: Open an issue on the Actor's GitHub repo
- Apify Support: console.apify.com/support
License
Apache-2.0