Google Maps Scraper Turbo: Business Leads, Phones & Emails avatar

Google Maps Scraper Turbo: Business Leads, Phones & Emails

Pricing

Pay per event

Go to Apify Store
Google Maps Scraper Turbo: Business Leads, Phones & Emails

Google Maps Scraper Turbo: Business Leads, Phones & Emails

Scrape Google Maps business leads for $0.40 per 1,000 places: name, phone, website, rating, review count, opening hours and coordinates, plus emails and social links on request. No browser, so 1,000+ places in minutes, past Google's 120-result limit. CSV, Excel, JSON, API.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Azeddine MESKAOUI

Azeddine MESKAOUI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Security

Limited permissions

Share

Google Maps Turbo Scraper — every business in an area, without a browser

Extract Google Maps businesses — name, address, phone, website, rating, reviews count, opening hours, coordinates — as a clean spreadsheet. No browser is launched, so runs finish in a fraction of the compute a browser-based Google Maps scraper needs.

Measured, not promised: 1,312 dentists in Casablanca in one run of 3 min 26 s on Apify, default settings, 510 requests, none failed (October 2026). A plain map search for the same term stops at about 120.

Pricing

$0.40 per 1,000 places ($0.0004 per place delivered), plus $0.00005 per run start. You pay for results, not for compute time or proxies.

You extractYou pay
1,000 places$0.40
10,000 places$4.00
100,000 places$40.00

Contact enrichment (emails and social profiles from the business website) is optional and costs $0.002 per place, charged only when something was found. A run that fails or returns nothing costs you the start event only.

Two things set it apart:

  • Adaptive area tiling. Google returns at most ~120 results for any single map query, no matter how far you scroll. This Actor detects a saturated tile and quarters it, recursively, until the whole area is covered. A dense downtown gets subdivided; empty countryside is covered in one pass.
  • Drift-resistant parsing. Google's payload is a deeply nested untyped array. Most scrapers hardcode index paths and silently start emitting empty phones and websites the day Google shifts an index. Here every field falls back to a shape-based scan (a place ID looks like ChIJ…, a rating is a number between 1 and 5) and the run writes a FIELD_HEALTH_REPORT telling you exactly which fields drifted.

What it extracts

FieldDescription
titleBusiness name
categoryName, categoriesPrimary and full Google category list
address, street, city, postalCode, countryCodeFull and split address
latitude, longitude, plusCodeLocation
phonePhone number as shown on the listing
phoneUnformattedSame number in international form, digits only (+212612345678)
website, domainBusiness website and its bare domain
totalScore, reviewsCountStar rating and number of reviews
priceLevel$ … $$$$ when Google shows it
openingHoursArray of { day, hours[] }
permanentlyClosed, temporarilyClosedBusiness status flags
imageUrlMain listing photo
placeId, ftid, cid, urlStable identifiers and the canonical Maps link
emails, socialsWith contact enrichment on: emails and social profiles from the business website
searchString, scrapedAtProvenance of the row

How to use it

  1. Type a search term — what you would type into Maps, e.g. dentist.
  2. Type a location — simplest form first, e.g. Casablanca, Morocco. A whole region works; the Actor tiles it for you.
  3. Set places per search term, click Start, then export as CSV, Excel, JSON or pull it from the API.

Turn on Extract emails & socials to convert the result into a lead list.

Example input

{
"searchStringsArray": ["dentist"],
"locationQuery": "Casablanca, Morocco",
"countryCode": "ma",
"maxCrawledPlacesPerSearch": 200,
"language": "fr",
"tilingMode": "auto",
"extractContactsFromWebsite": false,
"proxyConfiguration": { "useApifyProxy": true }
}

Example output

{
"placeId": "ChIJreV9aqYWdkgROM_boL6YbwA",
"ftid": "0xda7cd2f0b0b0b0b:0x1234abcd5678ef90",
"cid": "1311768467284833680",
"title": "Cabinet Dentaire Anfa",
"categoryName": "Dentist",
"categories": ["Dentist", "Dental clinic"],
"address": "12 Rue Ahmed Chaouki, Casablanca 20250, Morocco",
"street": "12 Rue Ahmed Chaouki",
"city": "Casablanca",
"postalCode": "20250",
"countryCode": "MA",
"latitude": 33.5731,
"longitude": -7.5898,
"phone": "05 22 12 34 56",
"phoneUnformatted": "+212522123456",
"website": "https://cabinet-dentaire-casa.ma/",
"domain": "cabinet-dentaire-casa.ma",
"totalScore": 4.6,
"reviewsCount": 238,
"priceLevel": "$$",
"permanentlyClosed": false,
"openingHours": [{ "day": "Monday", "hours": ["9:00 AM–6:00 PM"] }],
"url": "https://www.google.com/maps?cid=1311768467284833680",
"emails": ["contact@cabinet-dentaire-casa.ma"],
"socials": { "instagram": ["https://instagram.com/cabinetdentairecasa"] },
"searchString": "dentist",
"scrapedAt": "2026-08-19T10:12:44.001Z"
}

Use cases

  • Local lead generation — build a prospect list with phone, website and email for one trade in one city.
  • Web-design and SEO prospecting — set the website filter to only without a website and get businesses that need one.
  • Market and competitor mapping — count and rank every competitor in a catchment area by rating and review volume.
  • Franchise and retail site selection — export coordinates and density for an area before signing a lease.
  • Data enrichment — feed place IDs or Maps URLs you already hold and get back fresh, structured records.

Choosing a tiling strategy

ModeRequestsCoverageUse when
off1 per termFirst ~120 placesYou just want the top results, fast
auto (default)Splits only saturated tilesHighAlmost always
aggressiveSplits earlier, up to depth 5HighestDense city centres, exhaustive census

FAQ

How do I export the results to Excel? Open the run's Storage → Dataset tab and pick Export → Excel (or CSV / JSON). The API endpoint on the same tab returns the same data for automated pipelines.

Why do I get fewer places than exist in the city? Google caps a single query at ~120 results. Raise maxTileDepth, lower saturationThreshold, or switch tilingMode to aggressive. Also add more distinct search terms — dentist, orthodontist, dental clinic surface partly different sets.

Do I need a proxy? Keep the default (Apify Proxy, automatic group). In our tests datacenter IPs returned 300 places in 13 seconds and 1,312 places in under 4 minutes, with no failed request. Google does slow some datacenter IPs down; the Actor notices within seconds, drops that IP and continues on another one, so you do not pay for the waiting. Switch to the RESIDENTIAL group only if a large run reports many dropped sessions in RUN_HEALTH.

Some places have no email. Why? Emails come from the business website, not from Google. A business with no website, or one that hides its address behind a contact form or an image, yields none. Expect roughly 30–50% coverage on a typical local sector.

Is scraping Google Maps legal? Business names, addresses and phone numbers are public business data, and this Actor collects no personal data by default. Reviewer profiles and named individual contacts are personal data under the GDPR and similar laws — if you process them, make sure you have a lawful basis. This is not legal advice.

How much does 10,000 places cost? $4.00: 10,000 places at $0.0004 each, plus $0.00005 for the run start. With contact enrichment on, add $0.002 for each place where an email or social profile was found.

Can I reuse my existing Google Maps Scraper task JSON? Mostly yes — searchStringsArray, locationQuery, maxCrawledPlacesPerSearch, language, countryCode, city, state, postalCode, startUrls, placeIds, skipClosedPlaces, placeMinimumStars, website, searchMatching and proxyConfiguration keep the same names and meanings. Unknown extra keys are ignored.

Known limits — read before you buy

  • Reviews and photos are not extracted. This Actor is deliberately a places scraper. Review text needs a separate paginated endpoint and would multiply run cost; use a dedicated reviews Actor for that.
  • No browser means no rendering fallback. If Google serves a consent interstitial or a CAPTCHA to your proxy IP, the request fails and is retried on another IP rather than being solved.
  • Popular times, Q&A, menus, hotel and reservation fields are out of scope.
  • Google changes its internal format a few times a year. The Actor is test-run every day against live data. When Google does break it, the run fails with a clear message instead of returning an empty dataset, so you never mistake a broken run for "no results". If you see "Google ignored the requested map area", it is on us: open an issue and it gets fixed.
  • Review counts depend on Google's goodwill. The Actor obtains an anonymous session before searching, which is what makes Google return them; RUN_HEALTH.countRetries tells you if a run had to fight for them.
  • plusCode is usually empty: Google no longer includes it in list results.
  • Geocoding uses OpenStreetMap. Its idea of a city boundary can be tighter than Google's — for metro areas, prefer customGeolocation with a circle.