Google Maps scraping with Apify: structured business listings in minutes
Quick answer: Apify's Google Maps Scraper (
compass/crawler-google-places) extracts business names, addresses, phones, reviews, coordinates, and Place IDs from Google Maps — no code required. Pricing is pay-per-event: Free-plan accounts pay $0.004 per place scraped, about $4 per 1,000 places (verified 2026-09-09). Run it from the Apify Store and export CSV or JSON.
Run the Google Maps Scraper now →
Compare best Google Maps scrapers →
What you can extract
| Data | Notes |
|---|---|
| Business name | Primary title |
| Address, city, postal code, country | Geocoding-friendly |
| Phone (formatted + raw) | CRM dialer ready |
| Website URL | Key for email enrichment |
| Rating, review count | Quality signals |
| Categories | ICP filtering |
| Opening hours | Ops / outreach timing |
| Lat/lng, Place ID, Maps URL | Dedupe, deep links |
Emails are usually not in the default Maps payload. Plan a second Actor for email extraction.
What you need
- Apify account: free plan includes $5/month in credits for tests.
- Google Maps Scraper: popular Store Actor compass/crawler-google-places (pay-per-event; see pricing change notes).
Open Google Maps Scraper input form →
Step 1: Open the Actor
Go to the Google Maps Scraper page and click Try for free (or Open Console) to reach the run UI.
Browse alternatives anytime: Google Maps scrapers in the Store.
Step 2: Configure inputs
Typical fields (names can vary slightly by Actor version, so use the in-UI schema as source of truth):
| Input | Example | Tip |
|---|---|---|
| Search queries | Italian restaurants, HVAC repair | Prefer concrete categories over businesses |
| Location | Madrid, Spain / Miami, FL | Tie query + location together for ICP fit |
| Max results | 100–500 | Raise gradually after a successful small run |
Result caps: Broad single queries often hit practical listing limits (commonly around ~120 visible results). Use multiple specific queries, neighborhoods, or grid-style searches for larger coverage. Context: Google Places / Maps limits.
Step 3: Optional settings
- Language / region: match your market.
- Filters: rating thresholds, open-now, etc., if exposed.
- Enrichment: some flows offer add-ons for extra fields; emails usually need a separate enrichment Actor.
Step 4: Run and monitor
Click Start. Watch the Log tab for blocked pages or input errors. When status is Succeeded, open Storage → Dataset.
If runs are blocked or unstable at scale, review the Actor README and consider Apify Proxy.
Step 5: Download output
From the dataset view, export CSV, Excel (XLSX), JSON, or other supported formats. Import to Sheets, your CRM, or a downstream enrichment workflow.
| Field | Description | Example |
|---|---|---|
| title | Business name | La Trattoria di Mario |
| categoryName | Business category | Italian Restaurant |
| address | Full street address | Calle Gran Vía, 42, 28013 Madrid |
| neighborhood | Neighborhood or district | Centro |
| website | Business website URL | https://trattoriamario.es |
| phone | Phone number | +34 912 345 678 |
| totalScore | Average Google rating | 4.6 |
| reviewsCount | Number of Google reviews | 847 |
| openingHours | Weekly opening hours | [{day, hours}, ...] |
| location | GPS coordinates (lat/lng) | {lat: 40.42, lng: -3.70} |
| placeId | Unique Google Place ID | ChIJN1t_tDeu... |
| url | Direct Google Maps link | https://google.com/maps/... |
Each item in your dataset is one JSON object; field names match the Actor version you run.
{
"title": "La Trattoria di Mario",
"categoryName": "Italian Restaurant",
"address": "Calle Gran Vía, 42, 28013 Madrid, Spain",
"neighborhood": "Centro",
"street": "Calle Gran Vía, 42",
"city": "Madrid",
"postalCode": "28013",
"state": "Madrid",
"countryCode": "ES",
"website": "https://trattoriamario.es",
"phone": "+34 912 345 678",
"phoneUnformatted": "+34912345678",
"totalScore": 4.6,
"reviewsCount": 847,
"openingHours": [
{ "day": "Monday", "hours": "12:00 PM – 11:00 PM" },
{ "day": "Tuesday", "hours": "12:00 PM – 11:00 PM" }
],
"location": { "lat": 40.42, "lng": -3.7025 },
"placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"url": "https://www.google.com/maps/place/..."
}
How much does it cost?
The Actor is pay-per-event, priced per place scraped rather than per minute of run time. A Free-plan account pays $0.004/place subject to change · verified 2026-09-09 for the base scrape — about $4 per 1,000 places — and the rate drops automatically as your paid-plan tier goes up:
| Event | Free plan | Diamond tier |
|---|---|---|
| Place scraped (base) | $0.004 | $0.000756 |
| + Filter applied (per filter) | $0.001 | $0.000189 |
| + Extra place details | $0.002 | $0.000378 |
| + Contact/email enrichment | $0.002 | $0.000378 |
| + Review scraped | $0.0005 | $0.0000945 |
| + Image scraped | $0.0005 | $0.0000945 |
Pulled live from the Actor's own pricing API on 2026-09-09 — the same numbers Apify's console shows you before you run it. Add-ons only bill when you turn that field on, so a plain name/address/phone run costs just the base rate. Multiply the base rate by the number of places you expect, add any add-ons you've enabled, and check the Actor's Pricing tab before a large run since rates do change over time.
When this isn't worth automating: if you need a few dozen listings once, copying them by hand from Google Maps is faster than configuring an Actor. This setup earns its keep once you're pulling hundreds of places on a recurring basis, or feeding a pipeline that would otherwise mean a lot of manual copy-paste.
Free credits: Apify free plan covers testing this without a card.
Use cases
| Use case | How Maps data helps |
|---|---|
| Lead generation | Build territory lists, then enrich websites: full pipeline |
| Market research | Density of competitors, ratings, hours |
| Competitive analysis | Compare footprints and review volume by area |
Next steps
- Enrich emails: Extract emails from Google Maps listings (blog)
- Automate: Apify + Make, n8n, or Zapier
- API: Trigger the same Actor via Apify API for scheduled jobs
Public business listings are often treated as public data in many jurisdictions, but laws and Google’s terms vary by use case and volume. Read Is web scraping legal? and restrict to legitimate business purposes.
No. Configure the Actor in the browser, click Start, and download CSV or JSON. Developers can also start runs via the Apify API.
Pay-per-event pricing: Free-plan accounts pay $0.004 per place scraped, about $4 per 1,000 places, verified 2026-09-09 on the Actor's pricing API. Add-ons (filters, extra details, contact enrichment, reviews, images) bill separately and only when enabled. The free tier includes $5/month in credits for experiments.
Usually not directly from the base Maps dataset. Use website URLs from the export with a contact or email extractor Actor, or follow Extract emails from Google Maps listings.
Common exports include CSV, Excel, JSON, JSONL, XML, and RSS. Pick what your CRM or BI tool accepts.
Google Maps often returns a limited window per search. Use narrower queries, multiple locations, or additional runs rather than one giant generic search.
Yes. Use Apify Schedules in the console or call the Actor on a cron via the API so lists stay fresh for lead generation.
Common mistakes and fixes
Fewer results than max results (often ~120 per query).
Split cities or neighborhoods, use specific categories, add multiple queries, or follow Apify docs on Maps listing limits.
Run fails or times out.
Lower max results, retry off-peak, read the run log; enable or upgrade proxies if the Actor recommends it ([Apify Proxy](https://apify.com/proxy?fpr=use-apify)).
No email column in the export.
Emails usually need a separate enrichment Actor or add-on; see [Extract emails from Google Maps listings](/blog/extract-emails-google-maps-2026).