Google Maps Scraper API for any category in any city
Send a keyword and a location and get back a page of business listings as clean JSON: name, categories, split address, phone in E.164, website, rating, review count and coordinates. The API pages through the results and sweeps the city on a grid, then drops anything that sits outside the area you asked for.
GET/v1/places/search
{
"data": [
{
"place_id": "ChIJPy04-ZkzGQ0RvdLuGmOMygg",
"name": "CDL - Dental Clinic Lisbon",
"primary_category": "Dental implants provider",
"address": {
"full": "R. Ferreira da Silva 9B, 1900-228 Lisboa, Portugal",
"city": "Lisbon",
"country_code": "PT"
},
"phone_e164": "+351213540059",
"website": "https://dentistalisboa.com/",
"rating": 4.8,
"review_count": 272,
"status": "open"
},
"… 4 more places"
],
"pagination": {
"page": 1,
"limit": 5,
"returned": 5,
"next_page": 2
},
"meta": {
"request_id": "req_6695a104436c",
"credits_used": 5,
"latency_ms": 1128,
"source": "maps_public",
"geocoded_location": {
"lat": 38.7266,
"lng": -9.1531,
"label": "Lisbon, Portugal"
}
}
}
What you get
Every field in the response.
| Field | Meaning |
|---|---|
place_id, cid | Stable identifiers, shared with the official place ids, so you can diff runs and join other tools |
name, primary_category, categories[] | As listed, localised with the language parameter |
address | full, street, city, region, country_code (ISO 3166-1) |
location | lat, lng |
phone, phone_e164, website | Phone as displayed and normalised; website as listed |
rating, review_count, status, open_now | Rating out of 5, count, open / temporarily_closed / permanently_closed |
service_area_business | True when the business has no storefront address |
How it works
What happens between your request and the response.
Text search first
The query runs as a logged-out visitor would see it, page by page, with a conservative rate limit and a residential exit.
Then a grid sweep
Search results stop at a few hundred; a city has thousands. The area is divided into cells and each cell is searched on coordinates, so the long tail of small businesses comes back too.
Drift removed
Deep result pages drift to other cities with the same name. Every page is checked against the resolved map area and out-of-area places are dropped, not charged.
Stop on any block
A challenge page or a 429 ends the request. Nothing is retried through another address, which is why the service is still answering next year.
Pricing
One credit system for every endpoint.
One credit per place returned. Credits are reserved for the limit you ask for and settled to the number actually returned. The Free plan gives 200 credits a month; paid plans start at $2.99 for 500.
Questions
Things people ask about the Google Maps Scraper API.
How many businesses can I get for one city?
As many as are listed. The text search returns the first few hundred; the grid sweep behind the actor and the coordinate search in the API reach the rest. For a large city expect thousands of places at one credit each; use the free count endpoint first to size the job.
Which countries are supported?
Any. The same request works for Lisbon, Lagos, Karachi or Toronto; 25 countries are covered by the parser tests and 30 cities are checked live every morning on the status page. Always write the location as City, Country.
Is the data scraped legally?
The API reads public, logged-out listing pages at a slow pace and stops on any block. No accounts, no CAPTCHA solving, no session cookies. Business listings are business data, not personal data in most jurisdictions; the removal endpoint honours requests within 7 days.
How fresh are the results?
Searches run live at request time; nothing is served from a stale database. Typical latency is one to three seconds per page.