Google Maps Search API and MCP — Local Businesses by Keyword and Area
Send one or more search terms and an area and this source returns matching places as data: name, categories, full address split into street, city, state and postal code, phone, website, star rating, review count, coordinates, opening hours by day, and whether the place is closed.
- You send
- Search terms plus an area (location, city, postal code, or custom shape)
- You get back
- Places with category, address, phone, website, rating, reviews, coordinates and hours
- Coverage
- Places listed on Google Maps, worldwide.
- Price
- 5 points per returned place, plus 2 per place for each active filter — $5 per 1,000
- Billed per place actually returned, capped by max_items per search term. Each active filter (categories, name matching, minimum rating, website, skip closed) adds 2 points per place. A search that finds nothing costs nothing.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Searching the map by hand | Search, click each pin, copy the details | Free, and slow | Workable for ten places, not for a city |
| The Google Places API | A Google Cloud project, billing account and per-field pricing | Pay per request and per field group | Capable, but you build the pagination, area tiling and field selection yourself |
| NeuralVerge | One request per search | From $5 per 1,000 places, misses not billed | Returns what the listing shows — owner-maintained fields like hours and website can be out of date |
What you get back
Every field in the example response below.
| Field | Type | Description |
|---|---|---|
search_terms | array | The terms searched. |
location | string | The area searched, as given. |
active_filters | array | Which filters were applied — each adds 2 points per place. |
points_per_place | number | What each returned place cost, filters included. |
total_items | number | How many places came back. |
items[].place_id | string | Google's place ID. |
items[].name | string | Business name. |
items[].category | string | Primary category, e.g. Coffee shop. |
items[].categories | array | All listed categories. |
items[].address | string | Full formatted address. |
items[].street | string | Street address. |
items[].neighborhood | string | null | Neighbourhood, where shown. |
items[].city | string | City. |
items[].state | string | State or region. |
items[].postal_code | string | Postal code. |
items[].country_code | string | ISO country code. |
items[].phone | string | null | Phone number as displayed. |
items[].website | string | null | Business website. |
items[].rating | number | Average star rating. |
items[].review_count | number | Number of reviews. |
items[].price | string | null | Price level, where shown. |
items[].latitude | number | Latitude. |
items[].longitude | number | Longitude. |
items[].permanently_closed | boolean | Whether the place is marked permanently closed. |
items[].temporarily_closed | boolean | Whether the place is marked temporarily closed. |
items[].opening_hours | array | Hours for each day of the week. |
items[].url | string | Link to the place on the map. |
items[].rank | number | Position in the map's results for the term. |
Example response
A real response, as returned.
{
"session_id": "1aa2f23b-b749-4f3f-89b7-f6ea59ac24b1",
"kind": "google_maps_search",
"search_terms": ["coffee shop"],
"location": "Austin, USA",
"max_items": 1,
"language": "en",
"active_filters": [],
"points_per_place": 5,
"machine": {
"total_items": 1,
"partial": false,
"items": [
{
"place_id": "ChIJq7RZDGczW4YRyCS5Z0KiiDE",
"name": "Godsent Coffee",
"category": "Coffee shop",
"categories": ["Coffee shop"],
"address": "9817 Anderson Mill Rd, Austin, TX 78750",
"street": "9817 Anderson Mill Rd",
"neighborhood": "Anderson Mill",
"city": "Austin",
"state": "Texas",
"postal_code": "78750",
"country_code": "US",
"phone": null,
"website": "https://www.godsentcoffee.com/",
"rating": 5,
"review_count": 244,
"price": null,
"latitude": 30.4464508,
"longitude": -97.7971457,
"permanently_closed": false,
"temporarily_closed": false,
"opening_hours": [
{ "day": "Monday", "hours": "7 AM to 3 PM" },
{ "day": "Tuesday", "hours": "7 AM to 3 PM" },
{ "day": "Wednesday", "hours": "7 AM to 3 PM" },
{ "day": "Thursday", "hours": "7 AM to 3 PM" },
{ "day": "Friday", "hours": "7 AM to 3 PM" },
{ "day": "Saturday", "hours": "8 AM to 3 PM" },
{ "day": "Sunday", "hours": "Closed" }
],
"url": "https://www.google.com/maps/search/?api=1&query=Godsent%20Coffee&query_place_id=ChIJq7RZDGczW4YRyCS5Z0KiiDE",
"search_term": "coffee shop",
"rank": 11
}
]
},
"total_points": 5
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
This endpoint is synchronous: the call blocks until the search completes and returns the places directly. search_terms is required (comma-separated, up to 5). Area: location (free text), or country, state, county, city and postal_code, or custom_geolocation (GeoJSON with a radiusKm). Optional: max_items (places per search term, 1-1,000, default 20), language. Filters — categories, search_matching (only_includes or only_exact), min_rating (two to fourAndHalf), website (withWebsite or withoutWebsite), skip_closed — each add 2 points per place. If a search hits its time budget, the response comes back with partial: true and the places collected so far.
curl -X POST https://api.neuralverge.ai/functions/v1/run-google-maps-search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "search_terms": "coffee shop, roastery", "location": "Austin, USA", "max_items": 100, "skip_closed": true }'What teams use it for
Where this field shows up in an actual workflow.
List every business of a type in a city or postal code, with phone and website.
Use coordinates and addresses to split a market into routes and territories.
Count competitors or potential customers in an area, filtered by rating or category.
Filter for businesses without a website — a ready list for agencies and site builders.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Places listed on Google Maps, worldwide.
Read at request time.
This source returns business listing information that is publicly shown on the map, stamped with the search it came from and a session id you can trace.
- —Phone, website and hours are maintained by the business owner and can be missing or out of date — the sample above has no phone.
- —Results are ranked by the map, not by distance; rank shows where a place sat in the results.
- —Review text isn't included here — only the rating and review count.
Questions, answered
Yes — the search runs inside the request and the places come back in the same response, no polling. If it hits its time budget first, the response comes back with partial: true and the places collected so far; re-run with a smaller max_items for a complete result.
Related sources
Try google maps search on your own data
One request format across every source in the catalog.