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. One request returns one page; raise the page parameter until next_page is null.
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": 918,
"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.
One request, one page
The query runs as a logged-out visitor would see it, with a conservative rate limit and a residential exit. Raise the page parameter for the next page and merge on place_id, because consecutive pages overlap slightly.
Coordinates for the long tail
One keyword query runs out after a few hundred results, however big the city. To reach the rest, send lat, lng and radius instead of a location and repeat across the districts you care about, or run the Apify listing, which sweeps the area on a grid for you.
Check for drift yourself
Deep result pages drift to other cities with the same name: page four of a Lagos, Nigeria search returned Lagos, Portugal in our tests. The API returns what the source gave and charges for it, so compare address.country_code and the coordinates against meta.geocoded_location and stop paging when they part company. The Apify listing does this filtering for you.
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 75 credits a month with no card; past that, the same search runs on Apify and is billed per place.
Run it on Apify.
For bigger runs, or without writing any code, the same engine runs on Apify as the two listings below. Apify bills per result, so there is no subscription and nothing to pay us, and Apify's own free plan includes $5 of usage a month with no card.
Google Maps Scraper & Email Extractor
Search by category and city. Every place comes with the email, social profiles and WhatsApp number published on its own website.
Google Maps Scraper
Several categories across many cities in one run, deduplicated into a single lead list with website contacts.
Questions
Things people ask about the Google Maps Scraper API.
How many businesses can I get for one city?
One keyword query pages out after a few hundred places, however big the city. To go further, repeat the search anchored on lat, lng and radius across the city and merge on place_id, or run the Apify listing, which sweeps a grid and deduplicates for you. Every place returned costs one credit, so 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.