Google Places Search
Pricing
from $1.50 / 1,000 place scrapeds
Google Places Search
Extract business and place data for any area or free-text query — names, addresses, phones, websites, opening hours, ratings, and review counts.
Pricing
from $1.50 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
Harpoon
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Turn any area — or a plain-English sentence — into a structured list of Google Maps places: name, address, phone, website, opening hours, rating, review count, and coordinates. Clean, complete, and ready to use.
- Reliable, complete data. One row per place with contact details, hours, ratings, and coordinates — no duplicate records.
- Search any shape of area. A rectangle, a circle, a named region, or a custom polygon — or just describe the search in a sentence.
- Filter before you pay. Rating, open-now, price level, and category filters are applied for you, so you don't pay to return places you'll throw away.
- Watch it work. A live map plots each place as it's found while the run is running.
- Any scale. A handful of places or a whole country, exported to JSON, CSV, Excel, or XML.
Built for lead generation, competitor tracking, local market analysis, and place-data enrichment.
What can Google Places Search do?
| Input mode | What it does |
|---|---|
ai_prompt | Describe what you want in one sentence; the actor works out the search terms, area, and filters for you. |
search_terms (+ an area) | Find every place matching each term inside an area; results are merged with no duplicates. |
categories | Restrict to Google place types (restaurant, cafe, hotel, pharmacy, gym, …). |
place_ids | Skip the search and fetch full details for places you already know. |
Every run also gives you export to JSON / CSV / Excel / XML, API and webhook access, scheduled runs, and MCP access for AI agents.
What data can you extract?
One row per place. Grouped by what buyers usually need:
| 📦 Group | 🔎 Fields |
|---|---|
| Identity | name, name_alt, place_id, group.name (category), price (food/drink only) |
| Contact | phone.display, phone.actual, website.url, website.display |
| Location | full_address, address_parts, latitude, longitude, plus_code, maps_url (opens the place in Google Maps), thumbnail_url (map preview image) |
| Reputation | rating, reviews |
| Hours | open_status, is_open, opening_hours[] (day + hours[]) |
| Meta | lang |
How to use Google Places Search
- Create a free Apify account.
- Open Google Places Search in Apify Console.
- Enter an area and either Search terms or a plain-language prompt.
- Set Max results (
limit) and any filters you want. - Click Save & Start. Results stream into the dataset as they're found.
- Download from Storage ▸ Dataset as JSON, CSV, Excel, or XML.
While the run is going, open the live map URL from the run log to watch results appear. A snapshot of the map is saved afterward under the key-value store key live-map.
Input
There are three ways to give the actor work — use one:
- Natural language — set
ai_promptonly, e.g."Cheap hostels within 5 km of Bondi Beach in Sydney". The actor turns it into terms, an area, and filters, and figures out the location for you. - Search — set
search_terms(and/orcategories) plus exactly one area selector. - Direct lookup — set
place_idsto skip searching entirely.
The area (provide exactly one)
| Field | Meaning | Example |
|---|---|---|
bounds | Rectangle, lowLat,lowLng,highLat,highLng | 48.80,2.25,48.90,2.40 |
circle | Point + radius in km | 48.8566,2.3522,5 |
region | Named region as country:ADMtype:shapeID | FRA:ADM1:12345 |
polygon | GeoJSON coordinates array ([lng,lat] rings) as a JSON string | [[[2.25,48.80],[2.40,48.90],[2.25,48.90],[2.25,48.80]]] |
When
ai_promptnames a location, its area wins and any manual area selector is ignored.
Result filters
Narrow the search with min_rating, open_now, price_levels, categories, ranking (relevance / distance), country bias, strict_type, service_area_businesses, future_openings, and language.
Post-request filters
Some conditions are checked against each place's full details rather than the search itself. post_filters maps a detail field to a condition. Both filter groups are free — you're only charged per place returned, never for filtering.
| Fields | Operators | Example |
|---|---|---|
website, phone | {"exists": true|false} | {"website": {"exists": false}} (no website) |
reviews, rating | {"gt"|"gte"|"lt"|"lte": number} | {"reviews": {"gte": 200}} |
is_open | {"eq": true|false} | {"is_open": {"eq": true}} |
price | {"in": [...]} or {"contains": "$$"} | {"price": {"in": ["MODERATE"]}} |
Example input
{"search_terms": ["coffee", "tea", "juice"],"categories": ["cafe"],"bounds": "40.705,-74.020,40.775,-73.930","min_rating": 4,"post_filters": { "website": { "exists": true } },"limit": 100}
See the Input tab above for every parameter and its default.
Output
Results land in the default dataset under Storage ▸ Dataset. Browse the built-in Overview, Contact info, Location, and Full details views, or download JSON, CSV, Excel, or XML.
Full place record
{"place_id": "ChIJ...","name": "Kim's Island","full_address": "175 Main St, Staten Island, NY 10307","latitude": "40.5107736","longitude": "-74.2482624","thumbnail_url": "https://tile.openstreetmap.org/19/154012/197509.png","maps_url": "https://www.google.com/maps/search/?api=1&query=40.5107736,-74.2482624&query_place_id=ChIJ...","name_alt": "","phone": { "display": "(718) 356-5168", "actual": "+17183565168" },"website": { "url": "http://kimsislandsi.com/", "display": "kimsislandsi.com" },"reviews": 91,"rating": 4.3,"price": "$$","plus_code": "XRX4+VQ Staten Island, NY","address_parts": ["175 Main St", "Staten Island", "NY 10307"],"opening_hours": [{ "day": "Monday", "hours": ["10:00–22:00"] },{ "day": "Sunday", "hours": ["12:00–20:00"] }],"open_status": "OPEN","is_open": true,"lang": "en","group": { "uri": "", "id": "0x89c3ca9c11f90c25:0x6cc8dba851799f09", "name": "Kim's Island" }}
Field names are lowercase snake_case.
What can you do with the data?
1. Build a contactable local lead list
- Set
search_terms(e.g.["plumber","electrician"]) and aboundsorcirclefor your target area. - Add
post_filters: { "phone": { "exists": true }, "website": { "exists": true } }to keep only reachable businesses. - Export the Contact info view to CSV and load it into your CRM.
2. Scan competitors in a district
- Set
categories: ["restaurant"]and aboundsacross the district. - Filter
min_rating, and setranking: "distance"to work outward from a point. - Export and compare
ratingandreviewsgrouped bygroup.name.
3. Enrich a list you already have
- Put your known Google place IDs in
place_ids. - Run to fetch
phone,website,opening_hours, and coordinates. - Join the results back onto your records by
place_id.
4. Cover a whole country
- Use an
ai_promptlike"pharmacies in Portugal", or aregionselector. - Set a generous
limitfor the area you're covering. - Export — duplicates are removed automatically.
How much does Google Places Search cost?
The actor is priced per returned place (pay-per-event), plus Apify platform usage. The rate is $2.00 per 1,000 places ($0.002 each), and starting a run is free.
- 1,000 places ≈ $2.00 in actor cost (plus a small platform fee).
- Filtered-out or failed places are not charged.
See the Pricing tab for plan discounts.
FAQ
Do I need a Google account, cookies, or my own API key? No. No login, cookies, or account is needed, and you don't have to supply an API key — everything required to run is configured for you.
Can it get private or restricted data? No. It only returns publicly available place and business data.
How many results can I get?
limit (default 60) caps the whole run across every term and category. There's no fixed platform cap, but very high limits over wide areas take longer and cost more.
What language are the results in?
English by default. Set language to another code (e.g. fr, es) for different text and categories. When you use ai_prompt, the language is taken from your prompt.
Is it legal to extract this data? It returns publicly available business data only. You're responsible for how you use the results and for complying with the terms of the data source and your local laws.
Can I use it from the API, SDKs, or an AI agent? Yes — see the API tab above for JavaScript, Python, REST, and CLI examples, or connect the Apify MCP server to call it from Claude, ChatGPT, or another MCP client.
Something isn't working. Make sure exactly one area selector is set, and that you've provided terms, categories, place IDs, or a prompt. If it still fails, open an issue in the Issues tab with your input JSON.
Notes and limitations
- Results are in English by default — set
languagefor other languages. - One area selector at a time —
bounds,circle,region, andpolygonare mutually exclusive. regionneeds a shape ID (country:ADMtype:shapeID), not a free-text place name. Useai_promptorbounds/circlefor plain names.priceis only available for food-and-drink place types, andopening_hoursmay be missing for some places.ai_promptis authoritative — when it works out terms, area, or filters, it overrides the manual values.
Integrations
Call the actor from your own code or an AI agent — see the API tab for JavaScript, Python, REST, and CLI. MCP clients can add harpoon/google-places-search via the Apify MCP server. Schedule runs or trigger them with webhooks from Apify Console.
Support
Found a bug or have feedback? Open an issue in the Issues tab, or email islam.tazerout@outlook.com.