agenttoolworks

An Apify Actor live

Google Maps scraper for local business leads

Type a category and a city. Get every place Google Maps shows inside that city's real boundary: name, address, phone, website, rating, review count, the week's opening hours and, if you want them, emails and social profiles from each place's own website. One row per place, never twice, at $1.50 per 1,000 places with everything included.

A search for restaurants in Chicago goes in; the Actor resolves the city's boundary, reads Google Maps tile by tile and returns one row per place with phone, website, rating, hours and emails
The counts and the output row are from a real cloud run, trimmed for space.

What you get

One row per place, every column on every row.

Where Google Maps shows nothing, the field is null rather than guessed, so a CSV export has the same columns whatever the place. Fill rates below are from three cloud runs of 1,000 places each: Lyon restaurants, Berlin dentists, Chicago restaurants.

DataFieldsRows filled
IdentityName, category and all categories, Place ID, CID, Knowledge Graph ID, Google Maps URL100% (CID 71% to 85%)
AddressFull address, street, neighborhood, city, postcode, state, country, coordinates, time zone99% to 100%
PhoneAs displayed, and in E.16488% / 97% / 94%
WebsiteThe place's own site75% / 78% / 73%
Rating and reviewsRating and review countRating 87% to 96%, review count 87% to 96%
Opening hoursThe full week, plus Google's status line and closed flags82% to 92%
Contacts (opt-in)Emails and Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest linksEmail on 27% to 78% of websites
Search contextSearch term, resolved area, rank, read time100%
The Places view of a real run in Apify Console: name, category, address, phone, website, rating, review count and today's opening status for each place
The Places view of a real run, in Apify Console.

How it works

Past the 120-place wall, and only inside your area.

The Contacts view of a real run in Apify Console: phone, website, emails, social profiles, whether the website was read and why not (for example HTTP 403)
The Contacts view: every row says whether its website was read.

Measured in the cloud

1,000 places in under six minutes.

230 sfor 1,000 Lyon restaurants, the densest case, on residential proxy
309 sfor 1,000 Berlin dentists with emails from their websites (78% of sites had one)
0duplicates in 3,000 rows
0Google accounts, cookies or API keys

The proxy matters. Google caps some datacenter addresses at about 20 places per view: earlier builds on datacenter returned 196 to 635 Lyon restaurants while reporting success; the current build on datacenter returned 658 and marks the search partial with the reason. On residential proxy, the default, the same search returned 1,000.

Measured against the leader

The most used Google Maps scraper on Apify, point by point.

compass/crawler-google-places, read on 2026-10-05: its prices from the Apify API, its complaints from its public Issues and Reviews tabs. Ours from our cloud runs the same day. We did not run the leader; it publishes no speed figure, so none is compared.

Pointcompass/crawler-google-placesThis Actor
Price per 1,000 places with hours, review count and contacts$8.00 on its free tier: place $4.00, details add-on $2.00 (opening hours and review count), contacts add-on $2.00; $7.00 on Starter, $3.60 on Gold$1.50, everything included
Filters (rating, website, category...)$1.00 per 1,000 places per filterFree, and filtered places are not charged
Places outside the boundary15 geography issues in 6 monthsTested against the area's real shape before charging
Duplicates across overlapping areasCharged ("I lost $143")One per run: 0 in 3,000 rows
Going past your limit"Over scraped", "went over my 1000 limit"Never past the limit, never past the run's spending limit
Contacts when none are foundAdd-on charged per placeSame price per place, and every row says why its email column is empty
Locations per runOneMany terms times many locations, plus drawn areas
Reviews, images, popular timesAdd-onsNot offered
Price rangeOffered (fill rate not published)Rare: 4 of 4,658 rows
Run success rate97.1% of 3.88M runs in 30 days, 39,329 monthly usersNot measurable until published

Where we lose: the leader sells reviews, images, popular times and leads enrichment, and has years of runs behind its success rate. Where it loses: opening hours, review count, contacts and filters all cost extra there, and its users report places outside the boundary, duplicates and runs past their limit.

A real run

Restaurants in Chicago, 1,000 places with contacts, 346 seconds.

This input returned 1,000 places on Apify on 2026-10-05 (run ChHpIejUmSzTlufrl, $0.056 of platform usage). One row from it, trimmed:

input
{
  "searchTerms": ["restaurant"],
  "locations": ["Chicago, USA"],
  "maxPlacesPerSearch": 1000,
  "scrapeContacts": true
}
a placereal
{
  "placeId": "ChIJ08HsADQsDogRho4n0e-e9ws",
  "name": "Antique Taco Bridgeport",
  "category": "Taco restaurant",
  "address": "1000 W 35th St, Chicago, IL 60609",
  "city": "Chicago",
  "postalCode": "60609",
  "countryCode": "US",
  "latitude": 41.8309356,
  "longitude": -87.6512837,
  "phone": "(773) 823-9410",
  "phoneE164": "+17738239410",
  "website": "http://www.antiquetaco.com/",
  "rating": 4.4,
  "reviewsCount": 1206,
  "priceRange": null,
  "openingHours": [
    { "day": "Monday", "hours": "Closed" },
    { "day": "Tuesday", "hours": "11 AM-9 PM" },
    "...",
    { "day": "Sunday", "hours": "11 AM-9 PM" }
  ],
  "hoursStatus": "Closed · Opens 11 AM Tue",
  "timezone": "America/Chicago",
  "description": "Seasonal gourmet tacos, Mexican appetizers & margaritas doled out in a counter-service space.",
  "cid": "6656290578812255711",
  "url": "https://www.google.com/maps/search/?api=1&query=Antique%20Taco%20Bridgeport&query_place_id=ChIJ08HsADQsDogRho4n0e-e9ws",
  "searchTerm": "restaurant",
  "emails": ["info@antiquetaco.com"],
  "socials": {
    "facebook": ["https://www.facebook.com/Antique-Taco-158817610862018"],
    "instagram": ["http://instagram.com/antiquetaco"]
  },
  "contactsStatus": "ok",
  "contactsError": null
}
The Actor's input form in Apify Console: search terms, locations, max places per search, the emails and social profiles switch and the boundary switch
The input form, in Apify Console.

Limits

What it does not do, said up front.

Ready-to-run examples

Open one, change the input, run it.

Each example opens the Actor on Apify with its input filled in. All examples on the Apify Store.

Pricing

Pay per place, no add-ons.

$1.50 per 1,000 places ($0.0015each), with opening hours, review count, emails and social profiles, and every filter included. Billed by Apify with platform usage and residential proxy included. A place outside your area, a duplicate, a place past your maximum or one left out by a filter is never charged. Apify's free plan covers about 3,333 places a month.

For developers

The Apify Actor, in one HTTP call.

Run it and get the places back in the same request through the Apify API. Snippets for Node.js and Python are in the Actor's README.

http
curl -X POST "https://api.apify.com/v2/acts/agenttoolworks~google-maps-places-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["dentist"], "locations": ["Lyon, France"], "maxPlacesPerSearch": 100}'

Questions

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

No. The Actor reads the search results Google Maps shows any logged-out visitor, with no account, no cookie and no API key. If Google ever answers with a challenge or its unusual-traffic page, the run stops and says so: it never tries to solve one.

How many places can it get per search?

Google shows about 120 places per map view. The Actor cuts the area into smaller views and keeps splitting the ones that are still full, so a city search goes far past that: 1,000 restaurants in Lyon, Berlin dentists and Chicago restaurants in our cloud runs, up to 50,000 per search. When it stops short of what the area may hold, the search is marked partial with the reason.

Are places outside my city returned?

No, by default. Google pads its answers with places nearby. Each location is resolved to its real boundary on OpenStreetMap, and a place outside that shape is dropped before it is delivered or charged. You can also draw your own area as GeoJSON.

Does it find emails?

Optionally, at no extra price: the Actor reads each place's own website (the homepage, then up to three contact or imprint pages it links) for emails and social profile links. Measured on 1,000 places: an email on 78% of Berlin dentists' websites and 27% of Chicago restaurants' websites. Every row says whether its website was read and, if not, why.

What does it cost?

$1.50 per 1,000 places ($0.0015 per place), billed by Apify with platform usage and the residential proxy included. Contacts and filters cost nothing extra. Apify's free plan includes $5 of monthly usage, about 3,333 places.

Does it return reviews, photos or the price range?

Not in this version: no reviews, images, popular times or Q&A. The price range is returned only where Google's search answer carries one, which is rare (4 of 4,658 rows across our cloud runs). It is never estimated.

Contact data and GDPR: an email on a sole trader's website is personal data. You are the controller of the contact data you export and of what you do with it; for contacts in the EU, that includes informing them (GDPR Article 14) at your first contact.

Public business listings only: no login, no account, no reviewer data. Area boundaries: Data © OpenStreetMap contributors. Not affiliated with Google or Apify.