# Google Maps Leads Scraper

> Get every business on Google Maps for any search in any US city, with phone, website, rating and opening hours, plus emails from their own websites.

Google Maps Leads Scraper finds every business that matches a search, such as “plumber” in “Brooklyn, NY”, and returns one row per business with its name, category, phone, website, address, rating and opening hours. It searches the area piece by piece, so you get more than the 200 places one Google Maps search shows. Emails and social profiles from each business’s own website are an optional add-on.

- Web page: https://keklik.io/scrapers/google-maps-leads-scraper
- Apify Actor: `keklik/google-maps-leads-scraper` (https://apify.com/keklik/google-maps-leads-scraper)
- You enter: What to search for, and one or more cities, postcodes or regions
- You get: Name, category, phone, website, address, rating, reviews, opening hours and coordinates
- Status: working, last tested 11 Nov 2026
- Needs: an Apify account (free is enough to try). No login to the site itself.

## Price per 1,000 businesses

US dollars, on each Apify plan. Apify's platform costs are included. Add-ons are charged only when switched on in the input.

| Charge | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Place: Each place the scraper saves. Places removed by filters are free. | $3.00 | $2.25 | $1.50 | $1.10 |
| Place details (add-on): Reviews by star, review keywords and plus code | $1.50 | $1.50 | $1.10 | $0.80 |
| Emails and social profiles (add-on): Charged only when a website gave something | $1.50 | $1.50 | $1.10 | $0.80 |
| Review (add-on): Each review added to a place with Reviews per place. | $0.40 | $0.35 | $0.28 | $0.20 |
| Images (add-on): Up to 200 photo links per business | $1.50 | $1.00 | $0.75 | $0.55 |

Apify's plans and a calculator: https://keklik.io/pricing.md

## Input

The run input is a JSON object with these keys:

- `searchTerms` (array, optional): 🔍 Search terms. What to search for, one per line, as you would type it on Google Maps: dentist, italian restaurant, plumber.
- `locations` (array, optional): 📍 Locations. Where to search, one per line: Marseille, France or 75011 Paris. Leave it empty to search the terms as typed, which gives at most about 200 places per term.
- `maxPlacesPerSearch` (integer, optional): 💯 Max places per search. Stops each term and location pair after this many places. Leave it empty to cover the whole area.
- `maxResults` (integer, optional): 🛑 Max places in total. Stops the whole run after this many places. Use it to cap what a run can cost.
- `contactDetails` (boolean, optional, default false): 📧 Emails and social profiles ($). Visits each business's website for emails, phone numbers and social profiles. Charged only for places where the website gave something.
- `language` (string, optional, default "en"): 🌍 Language. The language of categories, opening hours, attributes and reviews, such as en, fr or de.
- `categories` (array, optional): 🏷️ Categories. Pick Google Maps categories to keep only places listed under one of them: Orthodontist and Pediatric dentist keep the specialists out of a dentist search. With no search term, each category is searched by its name.
- `websiteFilter` (string, optional, default "any", one of "any", "with", "without"): 🌐 Website. Keep only places with a website, or only places without one (often prospects for web agencies).
- `phoneFilter` (string, optional, default "any", one of "any", "with", "without"): 📞 Phone. Keep only places with a phone number, or only places without one.
- `minRating` (string, optional, default "", one of "", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5"): ⭐ Min rating. Keep only places rated at least this many stars.
- `maxRating` (string, optional, default "", one of "", "1.0", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5"): ⭐ Max rating. Keep only places rated at most this many stars, to find businesses with unhappy customers. Places with no rating yet are kept.
- `minReviews` (integer, optional): Min reviews. Keep only places with at least this many reviews.
- `maxReviews` (integer, optional): Max reviews. Keep only places with at most this many reviews, to find new or small businesses.
- `claimedFilter` (string, optional, default "any", one of "any", "claimed", "unclaimed"): Claimed by owner. Keep only places whose owner manages the Google listing, or only places nobody has claimed yet (often prospects for local marketing).
- `nameFilter` (string, optional, default "any", one of "any", "contains", "exact"): Name filter. Keep only places whose name contains the search term ("Starbucks" finds "Starbucks Coffee"), or matches it exactly. Useful for brands and chains.
- `skipClosed` (boolean, optional, default false): Skip closed places. Leave out places marked temporarily or permanently closed.
- `skipWithoutEmail` (boolean, optional, default false): Skip places without an email. Leave out places whose website gave no email. They are not charged.
- `emailVerifier` (string, optional, default "", one of "", "reoon", "zerobounce", "neverbounce", "millionverifier", "debounce", "truelist", "bouncer", "bounceban"): Email verifier (your own account). Pick your email verification service to check each mailbox. Bouncer and BounceBan also try to answer for catch-all domains (domains that accept every address); the others mark those emails catch_all.
- `emailVerifierApiKey` (string, optional): Email verifier API key. Paste your API key from that service. It is stored encrypted, and checked before the run starts.
- `verifyEmails` (string, optional, default "all", one of "all", "first"): Emails to verify. Check every email found, or only each place's first one to save credits.
- `dropInvalidEmails` (boolean, optional, default true): Leave out invalid emails. Leave out the emails your verifier marks invalid. Turn off to keep them, marked invalid.
- `legalNoticePeople` (boolean, optional, default true): Names in company details. Turn off to leave out the owners' and managing directors' names, for example for GDPR. The company's legal name, registration and VAT numbers stay.
- `reviewsPerPlace` (integer, optional, default 0): Reviews per place ($). Adds up to this many reviews to each place. For every review of a place, use the Google Maps reviews scraper.
- `reviewsSort` (string, optional, default "newest", one of "newest", "most_relevant", "highest_rating", "lowest_rating"): Reviews order. Pick which reviews come first: newest, most relevant, highest or lowest rated. Highest and lowest rated sort each place's latest 600 reviews by stars (all of them when it has fewer), newest first within a star.
- `reviewsNewerThan` (string, optional): Reviews newer than. Pick a date, or a period such as "6 months", to get only recent reviews.
- `reviewKeywords` (array, optional): Reviews mentioning. Add words to get only reviews that mention one of them, such as "parking", "delivery" or "rude". Whole words, in the language each review was written in; a phrase such as "front desk" is matched as a phrase. Capitals don't matter, and a word typed with its accents ("délicieux") is also found without them.
- `reviewsThoroughSearch` (boolean, optional, default false): Thorough search. Also find your words inside longer words ("park" finds "parking") and in Google's translations of reviews written in other languages. Looks through each place's newest 600 reviews. Turn it on for hotels and tourist spots, where many reviews are in other languages.
- `reviewerDetails` (boolean, optional, default true): Reviewer names and profiles. Turn off to leave out who wrote each review (name, profile link, photo), for example for GDPR. Ratings, text and dates stay.
- `placeDetails` (boolean, optional, default false): Place details ($). Adds reviews per star, review keywords, delivery and takeout hours and the plus code. Charged per place.
- `imagesPerPlace` (integer, optional, default 0): Photos per place ($). Set how many photos to add to each place, up to 200. Videos found among them come along on top and are charged like photos. 0 adds none.
- `imageAuthors` (boolean, optional, default false): Photo authors. Turn on to add who posted each photo (name, profile link and picture), when it was uploaded and taken, its size and the app it came from. No extra cost, but slower. Authors' names are personal data, so leave this off unless you need them, for example under GDPR. Needs Photos per place above 0.
- `placesInside` (boolean, optional, default false): Businesses inside each place. Turn on to add every business listed in a mall's or airport's Google Maps directory, one row each, with the section it is listed under (Clothing, Food & Drink...). Your filters apply to them too: Shoe store in Categories gives the shoe shops inside the malls.
- `maxPlacesInside` (integer, optional): Max businesses per place. Set a limit for each mall or airport: a big mall lists over 200 businesses. Leave empty for all.
- `allPlaces` (boolean, optional, default false): Every place in the locations. Turn on to get every business in each location, such as shops, restaurants, offices and clinics, with no search term needed. Big cities have tens of thousands of places: start with a district or postal code, or set Max places per search.
- `radiusCenter` (string, optional): Near. Type an address or coordinates to search around, such as "500 Congress Ave, Austin, TX" or "30.2672, -97.7431". Only places within Radius of it are kept.
- `radiusKm` (number, optional, default 5): Radius. Set how far around Near to search. 1 mile is 1.6 km.
- `country` (string, optional, one of "AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BQ", "BA", "BW", "BV", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "CV", "KH", "CM", "CA", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CK", "CR", "HR", "CU", "CW", "CY", "CZ", "CD", "DK", "DJ", "DM", "DO", "EC", "EG", "SV", "GQ", "ER", "EE", "SZ", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "CI", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "XK", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "AN", "NC", "NZ", "NI", "NE", "NG", "NU", "YU", "NF", "KP", "MK", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "CG", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "CS", "SC", "SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "KR", "SS", "ES", "LK", "SD", "SR", "SJ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "NL", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "VI", "UG", "UA", "AE", "GB", "US", "UM", "UY", "UZ", "VU", "VA", "VE", "VN", "WF", "EH", "YE", "ZM", "ZW"): Country. Pick the country, for a place name that exists in many countries or states (Paris, Texas; Springfield).
- `state` (string, optional): State or region. Type the state, province or region: Texas, Ontario, Bavaria.
- `county` (string, optional): County. Type the county: Travis County, Kings County.
- `city` (string, optional): City. Type the city, town or district: Austin, Brooklyn, Marseille.
- `postalCode` (string, optional): Postal code. Type the postal or ZIP code: 78701, 75011.
- `urls` (array, optional): Google Maps links. Optional. A Google Maps search link is searched over the map area it shows. A place link or Place ID gives that one place.
- `placeIds` (array, optional): Place IDs. Paste Google place IDs (they start with ChIJ), one per line, such as an earlier run's place_id column.
- `geoMatch` (boolean, optional, default true): Only places inside the location. Leave on to keep only places inside the location you typed: a Brooklyn search leaves out Queens next door. Turn off to also keep places around the edges.
- `skipUnrelated` (boolean, optional, default true): Only places of the searched type. Leaves out the places Google adds when an area runs out of real matches, such as osteopaths in a dentist search.
- `customArea` (object, optional): Custom area (GeoJSON). Paste a GeoJSON area (draw one at geojson.io) to search only inside it, such as a sales territory. Each shape is searched as its own area.
- `nameMatch` (boolean, optional, default false): Search term in the name. Replaced by "Name filter"; true still keeps only places whose name contains the search term.

Example input:

```json
{
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "Brooklyn, NY"
  ],
  "placeDetails": true,
  "contactDetails": true,
  "reviewsPerPlace": 2,
  "imagesPerPlace": 5,
  "maxResults": 30,
  "language": "en",
  "websiteFilter": "any",
  "phoneFilter": "any",
  "claimedFilter": "any",
  "geoMatch": true,
  "skipUnrelated": true,
  "reviewsSort": "newest"
}
```

## Output: one row per business

115 fields in 14 groups.

### Business

- `name`: Name. Business name.
- `local_name`: Local name. The business name in the place's own language and script, when Google shows a different name in the run's language (name). Mostly outside English-speaking countries: "一蘭 渋谷店" for ICHIRAN Shibuya in Tokyo, "IONITY-Ladestation" in Germany. Empty when the names are the same.
- `category`: Category. Main Google Maps category.
- `categories`: Categories. All Google Maps categories of the place.
- `description`: Description. The owner's description, or Google's summary of the place.
- `owner_name`: Owner name. Name of the account that manages the profile.
- `owner_id`: Owner ID. Google ID of the account that manages the listing.
- `owner_url`: Owner profile. Google Maps profile of the account that manages the listing, with its posts and photos.
- `is_claimed`: Claimed. True when the owner has claimed the Google Business Profile.
- `is_temporarily_closed`: Temporarily closed. True when Google marks the place temporarily closed.
- `is_permanently_closed`: Permanently closed. True when Google marks the place permanently closed.

### Contact

- `phone`: Phone. Phone number as Google shows it.
- `phone_unformatted`: Phone (international). Phone number in international format, such as +33491524482.
- `website`: Website. The business's website.
- `order_links`: Order links. Order-online links, each with its label.
- `reservation_link`: Reservation link. Link to book a table or appointment.
- `booking_links`: Booking links. Every booking button on the listing, one link per provider: tables (Reserve a table), appointments (Book online) and waitlists.

### Address and location

- `address`: Address. Full address.
- `local_address`: Local address. The address in the place's own language and script, when it differs from address. Mostly in countries with another script (Japan, the Arab world). Empty when they are the same.
- `street`: Street. Street address.
- `city`: City. City.
- `postal_code`: Postal code. Postal or ZIP code.
- `county`: County. The county the place is in, such as "Travis County" (where Google lists one).
- `state`: State or region. State, region or province, when Google gives one.
- `state_code`: State code. Two-letter state code, for places in the United States ("TX").
- `country_code`: Country. Two-letter country code.
- `country_name`: Country. Country name in English ("United States").
- `neighborhood`: Neighborhood. Neighborhood, when Google gives one.
- `is_service_area`: Service-area business. True for a business that serves customers at their address and shows no street address on Google Maps, such as many plumbers and cleaners.
- `located_in`: Located in. The mall, airport, hotel or building the place is inside, as Google names it: Barton Creek Square.
- `located_in_url`: Located in URL. The Google Maps link of the place it is inside.
- `lat`: Latitude. Latitude.
- `lng`: Longitude. Longitude.
- `timezone`: Time zone. Time zone of the place, such as Europe/Paris.

### Ratings

- `rating`: Rating. Average star rating, 1 to 5.
- `reviews_count`: Reviews. Number of reviews.
- `reviews_url`: Reviews URL. Link to the place's reviews.

### Hours and photos

- `opening_hours`: Opening hours. Opening hours per day, Monday first: [{"day": "Monday", "hours": "9 AM-6 PM"}].
- `hours_notices`: Hours notices. Google's notes on the coming week's hours, such as a holiday that might change them: one entry per day with a note. Empty when Google shows none.
- `open_now`: Open now. Whether the place was open when it was scraped (see scraping_time). Empty when Google shows no hours.
- `open_status`: Open status. Google's line for it at scraping time, with when it opens or closes next: "Closed · Opens 8 AM", "Open · Closes 11 PM", "Open 24 hours".
- `about`: About. The About tab: {"Accessibility": {"Wheelchair accessible entrance": true}, "Payments": {...}}.
- `logo_url`: Logo URL. The business's profile picture on Google (its logo when the owner set one), full size.
- `main_image_url`: Main image. The place's main photo.
- `images_count`: Photos. Number of photos on the place.

### Google IDs and links

- `place_id`: Place ID. Google Place ID (ChIJ...). Use it with Google Maps Reviews Scraper or the Google Places API.
- `cid`: CID. Google Maps customer ID (cid).
- `kgmid`: Knowledge Graph ID. Google Knowledge Graph ID, such as /g/11cjg9nkyv.
- `url`: Google Maps URL. Link to the place on Google Maps.

### Hotels and gas stations

- `category`: Category. Main Google Maps category.
- `hotel`
- `fuel_prices`: Fuel prices. Gas stations only: the fuel price Google shows on the map, [{"grade": "Regular", "price": "$3.80"}].

### Emails and social profiles (add-on)

- `emails`: Emails. Emails and social profiles: email addresses found on the website, the site's own domain first.
- `email_details`: Email details. Emails and social profiles: one object per email, in the same order as emails. status is likely_deliverable (found on the business's own website, and its domain has a working mail server), unchecked (the mail server lookup didn't answer) or risky (a domain typo was fixed); with your own email verifier it becomes valid, invalid, catch_all or unknown, with verified_by, verified_at, verifier_result (the service's own answer) and is_catch_all. Also is_own_domain, is_role, is_free_mail, mail_provider (Google Workspace / Gmail, Microsoft 365, Zoho...), found_on (the page it was found on), found_as (mailto link, text, or cloudflare-hidden) and corrected_from when a typo was fixed. No-reply, disposable and dead-domain addresses are left out.
- `website_phones`: Website phones. Emails and social profiles: phone numbers linked on the website.
- `whatsapp`: WhatsApp. Emails and social profiles: the business's WhatsApp chat link found on its website, as https://wa.me/<number>.
- `facebook`: Facebook. Facebook page.
- `instagram`: Instagram. Instagram profile.
- `linkedin`: LinkedIn. LinkedIn page.
- `twitter`: X (Twitter). X (Twitter) profile.
- `tiktok`: TikTok. TikTok profile.
- `youtube`: YouTube. YouTube channel.
- `pinterest`: Pinterest. Pinterest profile.
- `discord`: Discord. An invite to the business's Discord server, linked from its website.
- `yelp`: Yelp. The business's Yelp page, linked from its website.
- `tripadvisor`: Tripadvisor. The business's Tripadvisor page, linked from its website.
- `foursquare`: Foursquare. The business's Foursquare page, linked from its website.

### Company details (add-on)

- `legal_notice.legal_name`. The business's legal name, with its legal form.
- `legal_notice.legal_form`. The legal form: GmbH, UG (haftungsbeschränkt), AG, SARL, SAS, Ltd, LLP, S.L., S.r.l., B.V., SRL, Einzelunternehmen...
- `legal_notice.registration_numbers`. Company registration numbers: HRB, HRA, PR, GnR or VR (Germany), FN (Austria), UID (Switzerland), SIREN and SIRET (France), Company number (UK), Partita IVA and REA (Italy), CIF and, for a sole trader, NIF (Spain), KvK (Netherlands), Enterprise number (Belgium).
- `legal_notice.vat_ids`. VAT IDs with their country prefix and without spaces (DE136695976, ATU13585627, CHE116281710, FR40303265045, GB980780684), each checked against its country's format and check digits.
- `legal_notice.share_capital`
- `legal_notice.people`. People named with a role: owners, managing directors, directors, board members, legal representatives, the person responsible for the content. Academic titles (Dr., Prof.) are kept, Mr, Herr and Mme are dropped. Empty when "Names in company details" is off.
- `legal_notice.page_url`. The page the company details come from.
- `website`: Website. The business's website.

### Extra place details (add-on)

- `reviews_distribution`
- `review_tags`: Review keywords. Place details: keywords Google picks out of the reviews, with how many reviews mention each.
- `price_level`: Price level. Place details: Google's price level ($ to $$$$) when the listing shows one. Google shows it to logged-out visitors for few places (some hotels and gas stations, not restaurants).
- `price_per_person`
- `other_hours`: Other hours. Place details: delivery, takeout, kitchen and other hours, per service.
- `plus_code`: Plus code. Place details: the place's plus code.
- `street_view_url`: Street View. Place details: link that opens Google Street View in front of the place.
- `order_providers`: Order providers. Place details: the delivery and takeout services listed behind "Order online", [{"name": "DoorDash", "url": "..."}].
- `owner_posts`: Owner posts. Place details: the latest updates, events and offers the owner posted on Google (up to 10), newest first, with type, title, text, dates, button link, coupon code and image.

### Latest reviews (add-on)

- `latest_reviews`: Reviews. Reviews per place: the place's reviews, with rating, text, date, owner response and reviewer.

### Photos (add-on)

- `images_count`: Photos. Number of photos on the place.
- `image_categories`
- `images`: Images. Business images: full-size links to the place's photos (360 photos included, videos not), up to "Photos per place", in the order Google's photo gallery shows them. The same photos with their details are in image_details.
- `image_details`: Image details. Business images: every photo and video collected, in gallery order, with its full-size link, type, source, Google's category labels and, with Photo authors on, who posted it and when.

### Search details

- `search_term`: Search term. The search term the place was found with.
- `search_location`: Search location. The location the place was found in.
- `in_location`: In the location. Whether Google lists the place as being in the location you typed. Always true with "Only places inside the location" on; with it off, false marks the places it would have left out. Empty when the location can't be checked (a search URL, a street address, a place URL).
- `matches_search`: Matches the search. Whether the place is of the searched type (its categories or name match the search). Always true with "Only places of the searched type" on; with it off, false marks the places Google added around the real matches. Empty for place URLs.
- `rank`: Rank. Order in which the place was found for its search.
- `source_url`: Input. The input this place came from.
- `scraping_time`: Scraped at. When the row was scraped, ISO 8601 in UTC.

### Places inside (add-on)

- `category`: Category. Main Google Maps category.
- `located_in`: Located in. The mall, airport, hotel or building the place is inside, as Google names it: Barton Creek Square.
- `directory_section`: Directory section. Add-on: Businesses inside each place. For a business found in a mall's or an airport's directory, the section it is listed under (Clothing, Food & Drink...).
- `places_inside_count`: Places inside. Add-on: Businesses inside each place. How many businesses this place's directory lists (0 for a place without one).
- `address`: Address. Full address.
- `phone`: Phone. Phone number as Google shows it.
- `website`: Website. The business's website.
- `rating`: Rating. Average star rating, 1 to 5.
- `reviews_count`: Reviews. Number of reviews.
- `url`: Google Maps URL. Link to the place on Google Maps.

## How it works

1. Type what and where. Add more keywords or cities and each one is searched.
2. Every neighborhood is searched. Google Maps only shows 200 results per search. The scraper goes through the area piece by piece, so you get every business, not just the first 200.
3. Keep only the leads you want. Businesses you filter out are free.
4. Download your list. As a spreadsheet, in Google Sheets, or into HubSpot, Salesforce or Pipedrive.

## Use cases

- Sales prospecting: Local businesses of one type across your cities, with phone numbers, websites and emails for outreach.
- Finding clients for an agency: Businesses without a website, with a low rating or with an unclaimed profile, which are the ones most likely to need help.
- Market sizing: Every business of a type in a city with its rating and review count, to size a market or spot the gaps.
- Local SEO: Categories, claimed status and review counts for the businesses that rank in your area.

## Good to know

The search area is a rectangle around the location, so towns at its edges can appear too: narrow the list with the city or postcode column. Emails come from the businesses' own websites, so expect them for part of the places. They are checked for junk but not verified with a mail server.

## Questions

### Is it legal to scrape Google Maps?

The scraper collects only public business information that Google Maps shows to visitors who are not logged in. Some of it can still be personal data, such as a sole trader's name, phone number or email, the owners and managing directors named in company details, reviewers' names, or the names of the people who posted photos (with Photo authors on). Personal data is protected by laws such as the GDPR in the EU, so make sure you have a lawful reason to collect and use it, especially for cold outreach. If in doubt, ask a lawyer.

### Do I need a Google account or a Google Maps API key?

No. You don't need a Google account, a login, cookies or a Places API key, and there is nothing to set up.

### How many places can I get?

As many as Google Maps has for your search in the area. A single Google Maps search stops at 200 places, but the scraper searches a large area piece by piece, so a city-wide search goes well beyond that. For a whole country, list its cities or regions as locations.

### How do I keep my first run small and cheap?

Set 🛑 Max places in total (for example 50): the run stops there, whatever else you set. 💯 Max places per search limits each search term in each location. Filters are free and places they leave out are not charged, so filtering early (with a website, at least 4 stars, a category) also lowers the cost. Paid options are marked ($) in the form: emails and social profiles, reviews, place details and photos. Emails are charged only for places whose website gave something.

### Can I search several keywords or cities at once?

Yes. Each search term is searched in each location, and a place that several searches find appears once.

### Can I get every business in an area, not just one type?

Yes. Tick Every place in the locations and type the locations; search terms can stay empty. You get every business in the area, each once: shops, offices, clinics, restaurants, schools, parks and the rest. A whole city holds tens of thousands of places: start with a district or postal code, or set Max places per search.

### Can I search around an address, or in an area I draw?

Yes. Type an address or coordinates in Near and a distance in Radius to get every matching place within that circle, such as all dentists within 3 km of your office. For any other shape, a sales territory, a delivery zone or a district Google has no name for, draw it at geojson.io, copy the GeoJSON and paste it into Custom area:

``json
{
    "searchTerms": ["plumber"],
    "customArea": {"type": "Polygon", "coordinates": [[[-97.76, 30.25], [-97.72, 30.25], [-97.72, 30.29], [-97.76, 30.29], [-97.76, 30.25]]]}
}
`

Each polygon of a MultiPolygon or FeatureCollection is searched as its own area. You get only the places inside the shape and pay only for those, unless you turn off Only places inside the location: they are then kept with in_location` set to false. Areas work with search terms, categories and Every place in the locations.

### Can I pick exact Google Maps categories?

Yes. Pick them in Categories, from Google's own list of about 4,000. A search for dentist with Orthodontist and Pediatric dentist picked keeps only those specialists. Pick categories with no search term and each one is searched by its name, or turn on Every place in the locations as well to go through every place in the area and keep the ones with those categories.

A place lists up to about ten categories, and it is kept when any of them is picked, so pick the close ones too (Lawyer, Divorce lawyer, Family law attorney) when businesses file themselves differently. Google Maps also uses names of its own beyond its official list, such as Attorney (its US name for Lawyer), Vacation rental or Subway station: they are in the field, shown next to the category they belong to (Lawyer (Solicitor, Attorney)), and picking Lawyer matches all of them.

Categories match in the run's Language, in 38 languages, including English, Spanish, French, German, Portuguese, Italian, Dutch, Japanese and Chinese. Google Maps' own extra names were collected in English, Spanish, Portuguese, French, German, Italian and Dutch; in the other languages, the official names match.

### How do I set categories through the API?

Pass the category names as the Categories field shows them, in English: "categories": ["Orthodontist", "Pediatric dentist"]. The other names in brackets in the field work too ("Attorney" or "Solicitor" for Lawyer), and the names stay the same whatever the run's Language, so you can copy them from the category and categories columns of an English run. A run with a name that is not a Google Maps category stops at the start and says which one.

### Can I get the shops inside a mall, or the restaurants at an airport?

Yes. Turn on Businesses inside each place and search for the malls, outlet centres or airports (or paste their URLs). Every business in each place's Google Maps directory gets its own row, with located_in set to the mall and directory_section to the part of the directory it is listed in, and the mall's row shows places_inside_count. Barton Creek Square in Austin lists 214 businesses; Austin-Bergstrom airport 256.

Filters and Categories apply to those businesses too, so a shopping mall search with Categories set to Shoe store gives the shoe shops inside the malls. Max places per search counts the malls a search finds, Max businesses per place caps each directory, and Max places in total caps the whole run: set it to stop after a number of shops. Each business is charged as a place. It works for malls, department stores, airports, stations, hospitals and medical centers, markets and food courts, universities, convention centers, stadiums and arenas, casinos, theme parks, hotels, tourist attractions and other large sites. You can leave it on whatever you search for: a dentist or restaurant search runs just as fast.

### Can I find businesses with bad ratings or few reviews?

Yes. Set Max rating (for example up to 3.0) or Max reviews (for example 20) to find businesses with unhappy customers or new and small businesses. "Claimed by owner" finds listings the owner hasn't claimed yet.

### Will I get places outside the city I typed?

No, not with "Only places inside the location" on (the default). Google shows nearby places around the edges of an area, so a search for Brooklyn also brings up Queens. The scraper keeps only the places in the location you typed. A postal code keeps only places with that postal code. Some districts, such as Shoreditch in London, never appear in Google's addresses, and you still get every place in them. Turn it off to keep everything around the area too: the in_location column then shows which places are outside it.

### What is a service-area business?

A business that goes to its customers, such as a plumber, a cleaner or a mobile mechanic, can hide its street address on Google Maps and show the area it serves instead. These places have is_service_area set to true and no street or postal code. A search by postal code doesn't include them, since they have no postal code.

### Can I scrape hotels?

Yes. Search hotel in a city: each hotel has a hotel object with its stars, check-in and check-out times, amenities, the nightly price for the dates Google picks and every booking site's offer (Booking.com, Expedia, the hotel's own site...), each with its price and link. Turn on Place details for the full amenities list.

### Will I get an email for every place?

Only where the business publishes one on its own website. Many small businesses don't. You pay for emails and social profiles only for the places where the website gave something.

### Which email verifier should I pick?

Any of the eight works for finding dead mailboxes. They differ on catch-all domains, which accept mail for every address, so a normal check can't tell a real mailbox from a made-up one. Reoon, ZeroBounce, NeverBounce, MillionVerifier, DeBounce and Truelist return catch_all for those. Bouncer and BounceBan also try to tell whether the address exists on a catch-all domain, at a higher price per check. Catch-all domains are common among businesses on Google Workspace. If your verifier fails mid-run (a timeout, the credits run out), the run carries on and the emails it couldn't check keep their free status.

### What company details do I get?

When 📧 Emails and social profiles is on, each business comes with its company details, in legal_notice:

| Field | What it is |
|---|---|
| legal_name, legal_form | The company's legal name and its form (GmbH, UG (haftungsbeschränkt), AG, e.U., SARL, SAS, Ltd, S.L., S.r.l., B.V., SRL, Einzelunternehmen...) |
| registration_numbers | Each with its type, value and register: HRB or HRA with the Amtsgericht (Germany), FN with the court (Austria), UID (Switzerland), SIREN and SIRET with the RCS city (France), the company number (UK), partita IVA and REA (Italy), CIF (Spain), KvK (Netherlands), the enterprise number (Belgium) |
| vat_ids | VAT IDs such as DE136695976 or ATU13585627, written without spaces |
| share_capital | The amount and currency, with the text as written |
| people | The owners, managing directors, directors and the person responsible for the content, each with their role as the business writes it and a role_type such as owner or managing_director |
| page_url | The page the details come from |

Only the business's own details: not its web designer's, host's or insurer's. It costs nothing extra. If you don't need people's names, for example for GDPR, turn off Names in company details.

### Where are company details strongest?

It depends on what businesses in each country publish. In our tests on dentists, lawyers, plumbers and accountants:

| Where | What to expect |
|---|---|
| Germany, Austria | The best results. Nearly every business gives its legal name, its register or VAT number and the owner or managing director by name. |
| Switzerland | Most businesses give their legal name and UID. Fewer name a person. |
| France, Belgium | About half to two thirds of businesses, usually with the SIREN or enterprise number. Some name the manager or the publication director. |
| Italy, Spain | Often the partita IVA (Italy) or CIF (Spain). Legal names and people are rarer. |
| UK, Netherlands | Fewer places, usually with the company or KvK number. People are rarely named. |
| Outside Europe | Few places: most businesses outside Europe don't publish company details. |

People are listed when the business names them with their role. Group websites with several locations can list a number for each location.

### Can I get all the reviews of the places?

Reviews per place adds a few reviews to each row, filtered by date and keywords if you like. They are Google's own reviews: the partner reviews Google shows for some hotels (Tripadvisor, Booking.com) are not included. For every review, one row per review, feed the url or place_id column into Google Maps Reviews Scraper.

### Can I get the photos of each place?

Yes. Set Photos per place (up to 200) to get each place's photos at full size, in the order Google's photo gallery shows them. From the date shown on the Pricing tab you pay per photo, 360 photo or video delivered (until then, once per place that gets photos); places without photos are free.

- images lists the photo links. 360 photos count as photos. Videos come on top of your number (25 photos gave 25 to 32 items in our tests), are charged like photos, and are listed in image_details.
- image_details has every photo and video collected, each with its full-size link, media_type (photo, video or 360), source_kind (posted on Google Maps by a visitor or the business, a hotel partner's photo, or Street View) and, for a video, its length and MP4 link.
- Labels: Google labels a place's top photos (about 10) Inside, Outside, Food & drink, Team, Vibe or Products, so most photos have none (categories is null, or empty when Google ranked the photo but gave no label); image_categories counts the labels per place. They are included in the photo price.
- Photo authors (off by default, no extra cost): who posted each photo (name, Google Maps profile and picture), whether it was the business itself, when it was uploaded and taken, its original size and the app it came through. Runs are slower with it, and authors' names are personal data: turn it on only if you need them.

Photos come from the place's main gallery; by_owner marks the ones the business posted.

### Can I get popular times, the menu or "People also search"?

No. Google Maps shows visitors who aren't signed in a limited view, and this scraper never signs in to a Google account. As of November 2026 the limited view has no popular times (busy hours or live busyness), menu link or menu, "People also search for", questions and answers, fuel prices for every grade, EV charger details, or the date the hours were last updated. Other scrapers that don't sign in see the same view, so these fields are usually empty there too. What Google still shows, this scraper gets: for prices, the fuel price on the map, hotel prices, and an estimate of the price per person from reviews (Place details).

### What happens when a run fails?

The run's status message says why, and the log names each input that failed. If a mistake in the input stops the run before anything is scraped, the run ends without results and its status message says what to change. Either way the Actor sends us a short error report, so we can fix the cause even if you never open an issue: the Actor's build, the reason, the counts from the end-of-run summary, whether your Apify plan is free or paid and, for an unexpected error, where in our code it happened. Web addresses and @usernames are blanked out first. The report never includes your input, your account, the pages you scraped or your results. Every run, failed or not, also sends one usage line as it ends, so we can see which options people use, what runs cost us and how well the data is filled: how many of each charged event it used (for example 120 full details) and the price your plan paid for them; the run's platform cost by item and its resources (time, memory, proxy traffic); whether it stopped at your maximum cost or maximum items; how it was started (Console, API, schedule, saved task, and for API runs the kind of tool, such as Make, Zapier or the Apify client, never the tool's full identity); our scraper's own retry and timing counts; and for each output field, how many results had it filled (counts only, never the values). That never includes your input, your account, your IP address, the pages you scraped or your results either. If you need help with a run, open an issue on the Issues tab and attach the run, or email support@kekliktech.com with the run's link; the run's log ends with both.

## Run it

- In Apify Console: https://apify.com/keklik/google-maps-leads-scraper
- With the Apify API: POST https://api.apify.com/v2/acts/keklik~google-maps-leads-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN with the input JSON as the body. It returns the rows.
- From an AI agent: connect the Apify MCP server (https://mcp.apify.com), add the Actor `keklik/google-maps-leads-scraper` and call it with the input.
