POST /v1/maps · /v1/place · /v1/reviews
Google Maps Scraper API
Everything people run a Google Maps scraper for, without running one: search a category in a city, get every business's phone, website, rating, hours and coordinates, then pull details and reviews by place_id. SerpKite handles the browsers, proxies and parsing.
Overview
What the Google Maps Scraper API does
Scraping Google Maps yourself means headless browsers, rotating proxies, infinite scroll and a parser that breaks whenever the layout changes. The Google Maps Scraper API is the same data as a plain HTTP call: POST /v1/maps with a query such as dentist and a location (or ll coordinates) returns the businesses Google Maps lists there, with title, address, phone, website, rating, rating_count, type, opening hours, latitude, longitude and the place_id, cid and fid to look each one up later.
For a full lead record, send the place_id to /v1/place for structured weekly hours, international phone number, time zone and photos, and to /v1/reviews for the reviews, 10 per credit. To cover a whole city, queue one search per neighbourhood or grid point with POST /v1/batches at half the credits and collect the results by webhook. Duplicates are easy to drop by place_id.
Only public, logged-out Maps data is collected, and failed or empty searches cost nothing.
What you get
-
places[]array - position, title, address, country, latitude, longitude, timezone, rating, rating_count, price_level, type, types, website, phone_number, international_phone_number, opening_hours, weekly_hours, description, thumbnail_url, google_maps_url, place_id, cid, fid.
-
requestobject - Echo of the normalized request (endpoint, engine, q, country, language, page…), handy for logging.
-
metaobject - request_id, credits_used, cached, engine, latency_ms, resolved_urls and parse_quality. parse_quality=empty means the call was not billed.
Request
curl https://api.serpkite.com/v1/maps \
-H "Authorization: Bearer $SERPKITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"q":"coffee roasters","location":"Berlin, Germany"}'Response (illustrative, placeholder domains)
{
"request": {
"endpoint": "maps",
"engine": "google",
"q": "coffee roasters",
"location": "Berlin, Germany",
"country": "de",
"language": "en",
"page": 1
},
"results": [
{
"position": 1,
"title": "Example Coffee Roasters",
"address": "Beispielstraße 12, 10115 Berlin, Germany",
"latitude": 52.5321,
"longitude": 13.3849,
"rating": 4.7,
"rating_count": 1284,
"price_level": "€€",
"type": "Coffee roasters",
"types": [
"Coffee roasters",
"Cafe"
],
"website": "https://roasters.example.com",
"phone_number": "030 0000000",
"international_phone_number": "+49 30 0000000",
"country": "DE",
"timezone": "Europe/Berlin",
"opening_hours": {
"Monday": "8 am–6 pm",
"Saturday": "9 am–5 pm",
"Sunday": "Closed"
},
"weekly_hours": {
"monday": [
{
"open": "08:00",
"close": "18:00"
}
],
"saturday": [
{
"open": "09:00",
"close": "17:00"
}
],
"sunday": []
},
"place_id": "ChIJLU7jZClu5kcR4PcOOO6p3I0",
"cid": "10219612364826466528"
}
],
"meta": {
"request_id": "req_01J8ZK4M6Q2V7",
"credits_used": 1,
"engine": "google",
"cached": false,
"latency_ms": 812,
"resolved_urls": true,
"parse_quality": "ok"
}
}
Every response also carries X-Credits-Used, X-Credits-Remaining,
X-Cache and X-Tokens-Estimate headers.
Run this query in the playground
Reference
Parameters
The parameters /v1/maps accepts, in the JSON body or the query string.
| Name | Type | Default | Description |
|---|---|---|---|
q
required
|
string | – | The search query. Required. Up to 2,048 characters. |
country
|
string | us | Country to search from, as a two-letter ISO code (us, gb, de, in…). Defaults to the country a location ends in. |
language
|
string | en | Interface language, as a language code with an optional region (en, de, pt-BR, zh-TW…). |
location
|
string | – | Canonical location for local results, e.g. "Austin, Texas, United States". Ending in a country name also sets country. |
ll
|
string | – | Map point and zoom as "@lat,lng,zoomz", e.g. @52.52,13.40,14z (zoom defaults to 14z). Searches the map there wherever the request comes from. Overrides location. |
page
|
integer | 1 | Results page, 1–10. Each page is billed separately. |
format
|
string | json | Response format. markdown is LLM-ready prose; compact is JSON with only the fields agents need. Values: json, compact, markdown. |
fields
|
string | – | Comma-separated projection, e.g. results.title,results.link,knowledge_graph. Cuts tokens. |
max_age
|
integer | – | Accept a cached result up to this many seconds old. Cache hits cost 50% of the credits. |
Full reference, error codes and headers are in the /v1/maps reference. Queue up to 100 requests at half price with POST /v1/batches.
Use cases
What people build with the Google Maps Scraper API
Lead generation
Build prospect lists by category and city with phone numbers, websites and ratings.
Local market research
Count competitors, compare ratings and map coverage across neighbourhoods.
Reputation monitoring
Track a chain's ratings and new reviews location by location.
Directory enrichment
Fill in missing phones, websites, hours and coordinates for an existing business list.
Pricing
Google Maps Scraper API pricing
Cost per call
1 credit
per page of results
- From $0.60 per 1,000 calls at volume.
- Credits never expire. No subscription.
- Failed, empty and blocked calls are refunded.
- 2,500 free credits = 2,500 calls, then 1,000 credits a month.
For reference: Serper lists Google searches at $1.00 per 1k on its entry tier and $0.30 at its best tier, and its credits expire after 6 months. SerpKite credits cost $1.00 to $0.60 per 1k.
| Pack | Price | Per 1k credits | Per 1k calls | Calls per pack |
|---|---|---|---|---|
| Starter | $10 | $1.00 | $1.00 | 10,000 |
| Growth | $50 | $0.80 | $0.80 | 62,500 |
| Pro | $300 | $0.60 | $0.60 | 500,000 |
FAQ
Google Maps Scraper API: common questions
Keep exploring
Related APIs and integrations
Use it from
Start building
Start with the Google Maps Scraper API
2,500 free credits, then 1,000 every month. No credit card.