Roundup

September 5, 2026 · 20 min read

Best Google Maps APIs in 2026: 8 Tested and Compared

Google Maps business data without running a scraper. We pulled the published pricing of 8 providers on the same day, ran the same local search and the same place lookup through each one, and worked out the cost per 1K places for search, details, and reviews.

Adam Ben-Ayoun

Author

Adam Ben-Ayoun

CTO · OpenWeb Ninja

Google Maps API · Local Business Data · Python · API Comparison

Best Google Maps APIs in 2026, tested and compared

Quick Answer: Best Google Maps APIs at a Glance

Prices are what each provider published on September 5, 2026, monthly billing. "Per 1K places" is the cost of 1,000 businesses returned by a local search on the entry paid plan, assuming the 20 results per page that Google Maps serves (100 for DataForSEO). Per-request providers are divided by 20; per-record providers are quoted as is.

APIBest forEntry paid planPer 1K places (search)Free tierGoogle Maps endpoints
OpenWeb NinjaRichest business record, area search, contacts, pay per object$25 / 20K businesses$1.25500 businesses/mo14 in the OpenAPI spec: search, search in area, radius, bounding box, nearby, details, details plus, reviews, review details, photos, photo details, posts, reverse geocoding, autocomplete
SerpApiTeams already on SerpApi; fastest place lookups$25 / 1K searches$1.25250 searches/mo5 engines: search, place, reviews, photos, autocomplete
SearchAPICheap per-request search and details with a clean schema$40 / 10K requests$0.20100 requests4 data engines: search, place, reviews, photos (plus directions)
DataForSEOLowest cost per place; 100 results per taskPay as you go, $50 minimum$0.02None listedMaps SERP, business info, reviews, owner updates, Q&A
ScrapingdogCheapest per-request search past 200K credits$40 / 200K credits (5 per request)$0.05200 credits (40 requests)4: search and place, reviews, photos, posts
HasDataSimple JSON with stored HTML for every request$49 / 200K credits (5 per request)$0.061,000 credits/mo (200 requests)3: search, place, reviews
ApifyDeepest single record (61 fields), enrichment add-ons$19 + $3 / 1K places$3.00$5 usage/moGoogle Maps Scraper actor; separate reviews and extractor actors
Bright DataBiggest free tier, pay per record, async at scalePAYG $1.50 / 1K records$1.505,000 records/mo6 scrapers: full info by URL, discover by search, by place ID, by CID, reviews, images

The official route gets its own section below: Google Places API (New), billed per SKU from $32 per 1,000 Text Search Pro requests, with reviews only at the $25 per 1,000 Enterprise + Atmosphere tier of Place Details.

How We Evaluated

Every price in this article was read from the provider's own pricing page on September 5, 2026, with JavaScript-rendered pages loaded in a real browser so JavaScript-only tables such as Google's SKU table and Apify's per-plan event pricing were read as rendered, not from the raw HTML. Where a provider bills in credits, records, or per-SKU events we converted to a cost per 1,000 places and, separately, per 1,000 details lookups and per 1,000 reviews, so the numbers are comparable.

Every code example was executed as shown, with only the API key substituted, and every response block is a trimmed copy of the JSON that call returned. Field names, nesting, and values are as received. Where a provider is described from its documentation rather than a live call, the section says so.

What we tested

  • Same 5 local searches through 7 providers: "coffee shops in New York", "dentists in Austin TX", "plumbers in Chicago", "italian restaurants in Boston", "gyms in Denver", one request each, no warm-up. Bright Data was excluded from the search bench because its keyword discovery runs as an asynchronous snapshot rather than a synchronous response.
  • Same 5 place lookups through all 8 providers, using the Google place ID of the first result of each search (La Cabra Bakery, ATX Family Dental, Rescue Plumbing, Carmelina's, THE Athletic Club).
  • One reviews call on each of the six providers with a request-based reviews endpoint (OpenWeb Ninja, SerpApi, SearchAPI, DataForSEO, Scrapingdog, HasData), on La Cabra Bakery, to record the fields and page size. Apify and Bright Data sell reviews as a separate actor or dataset and were not called.
  • Scope: Google Maps only. Yelp, Bing Places, Apple Maps, and TripAdvisor were not tested.

We ranked on cost per place at entry and at scale, field depth of the business record, endpoint coverage (search, details, reviews, photos, posts, autocomplete, area search), free tier, and measured response time. OpenWeb Ninja is our own API. The numbers are reported as measured, including the places where competitors are cheaper.

Same Query, Five Different Top Results

What each provider returned for "coffee shops in New York" on September 5, 2026, from the exact code shown in each section below. Bright Data is listed for the place lookup it does synchronously.

APIResults returnedFields on first resultFirst resultRating / reviewsNote
OpenWeb Ninja2043787 coffee, 245 W 46th St4.9 / 3,557Includes phone, website, hours, price level, rating histogram, owner ID, CID, place ID
SerpApi2030L B Coffee, 454 E 84th St4.9 / 387Viewport set by the ll we passed (Lower Manhattan, 14z)
SearchAPI2025Le Cafe Coffee, 1427 6th Ave4.6 / 281Phone present on 13 of 20 results; details engine has it
DataForSEO10032Le Cafe Coffee, 1427 6th Ave4.6 / 281Cost 0.002 shown in the response; structured work_hours timetable
Scrapingdog2026787 coffee, 245 W 46th St4.9 / 3,557Same list as OpenWeb Ninja; ready-made reviews and posts links
HasData2019Down Under Coffee, 1000 8th Ave4.7 / 75Slimmest record; stored HTML and JSON links in metadata
Apify10 (as requested)61Locals Collective NYC, Arverne, Queens4.5 / 171Without locationQuery the same search string returned one Chicago and two Elmhurst, Illinois results
Bright Data1 (place URL)38La Cabra Bakery, 152 2nd Ave4.6 / 1,628Keyword discovery is asynchronous; place lookups ran in 14 to 40 seconds

Same query text, five different top results. Google Maps ranks by map viewport, and each provider centers that viewport somewhere different when you give it only a text query: OpenWeb Ninja's response echoes default coordinates in the middle of the US at zoom 13, DataForSEO's check_url shows the same centroid at zoom 4, SerpApi used the Manhattan coordinates we passed, and Apify placed itself inside the New York location polygon. None of these is wrong; Google resolves "in New York" from the query text and then ranks by distance and prominence from wherever the map sits. If you need a reproducible list, pass latitude, longitude, and zoom explicitly on every provider that accepts them, or use a radius or bounding-box endpoint.

#1

OpenWeb Ninja Local Business Data

this site

Best for: the richest business record and the widest set of Google Maps endpoints, billed per object returned

The Local Business Data API documents 14 endpoints in its OpenAPI spec: search, search in area, area search by radius, area search by bounding box, search nearby, business details, business details plus, business reviews, review details, business photos, photo details, business posts, reverse geocoding, and autocomplete. The search endpoint documents a limit of 1 to 500 businesses per request, where every other provider here pages at 20 or 100.

Billing is the thing to understand before comparing prices. The pricing page states it plainly: "Billing is per business, review, or photo object returned, not per API request. A Search request returning 20 businesses consumes 20 business credits; a Reviews request returning 100 reviews consumes 100 credits." The free plan is 500 businesses a month with no card. Pro is $25 for 20,000 businesses ($0.002 each beyond that, 5 requests per second), Ultra $75 for 100,000 ($0.001 overage, 8 per second), Mega $150 for 300,000 ($0.0005 overage, 10 per second), and pay as you go is $0.004 per business. Data is fetched from Google Maps in real time on each request with no caching on our side.

Python example: local search

# openwebninja_maps_search.py

import requests

 

response = requests.get(

"https://api.openwebninja.com/local-business-data/search",

headers={"x-api-key": "YOUR_API_KEY"},

params={"query": "coffee shops in New York", "limit": 20, "language": "en", "region": "us"}

)

data = response.json()["data"]

print(len(data), data[0]["name"], data[0]["rating"], data[0]["review_count"])

Response (trimmed)

{

"status": "OK",

"data": [{

"business_id": "0x89c259b6c59db77d:0x57cf5d10e4d1b9a5",

"place_id": "ChIJfbedxbZZwokRpbnR5BBdz1c",

"cid": "6327378328618645925",

"name": "787 coffee",

"phone_number": "+16465967178",

"full_address": "787 coffee, 245 W 46th St, New York, NY 10036",

"latitude": 40.7597441,

"longitude": -73.9875048,

"rating": 4.9,

"review_count": 3557,

"reviews_per_rating": {"1": 49, "2": 32, "3": 31, "4": 87, "5": 3358},

"opening_status": "Open · Closes 9 PM",

"working_hours": {"Saturday": ["7 AM–9 PM"], "Sunday": ["8 AM–9 PM"], ...},

"website": "https://www.787coffee.com",

"verified": true,

"business_status": "OPEN",

"type": "Coffee shop",

"price_level": "$1–10",

"district": "Manhattan",

"city": "New York",

"zipcode": "10036",

"owner_id": "111048500068757981631"

}, ...]

}

20 businesses, 43 fields on the first result: IDs in every Google format (business ID, place ID, CID, knowledge graph MID), phone, website and TLD, structured address down to district and zip, hours, rating histogram, verified flag, price level, owner ID, and links for reviews and booking. A business details call on La Cabra Bakery, the first result of our bench search, returned 53 fields, adding the about section, photo and post samples, menu links, and an emails-and-contacts block; a reviews call returned 28 fields per review including owner-response text and timestamp fields, review photos, and the author's Local Guide level. Search median 2.3 seconds across the five queries, details 1.3 seconds.

Pros

  • +Richest search result in the test: 43 fields per business against 19 to 32 for the other per-request providers, so most workflows never need a second call
  • +Up to 500 businesses per request, plus radius, bounding-box, nearby, and reverse-geocoding endpoints that no other tested provider documents
  • +Per-object billing: a search that returns 3 businesses costs 3, and a details, review, or photo object costs the same unit as a search result
  • +Emails-and-contacts extraction on search and details, and 40+ other APIs on the same key

Cons

  • -A full 20-result page costs $0.025 at Pro, more than a per-request page on SearchAPI ($0.004) or Scrapingdog ($0.001) at their entry tiers; the gap narrows to $0.010 at Mega
  • -Free tier is 500 businesses a month, enough to evaluate but smaller than Bright Data's 5,000 records
  • -Search latency (2.3 seconds median) sat behind SerpApi, SearchAPI, Scrapingdog, and HasData in our sample
#2

SerpApi

Best for: teams already on SerpApi who want Maps search, place, reviews, photos, and autocomplete on one account

SerpApi's Google Maps API is one google_maps engine with type=search or type=place, plus separate google_maps_reviews, google_maps_photos, and google_maps_autocomplete engines. The ll parameter (latitude, longitude, zoom) is optional and applies only to searches; pagination is a start offset in steps of 20, and the docs recommend stopping at 100. Reviews take num from 1 to 20 (default 10) and a next_page_token; photos return 20 per page.

Every engine costs one search. The free plan is 250 searches a month at 50 an hour. Starter is $25 for 1,000 searches (200 an hour), Developer $75 for 5,000, Production $150 for 15,000, Big Data $275 for 30,000, Searcher $725 for 100,000, and the ladder continues to $106,050 for 54 million. Only successful searches count; cached, errored, and failed searches do not, and a response with 100 results and an empty result set both count as one.

Python example: local search

# serpapi_maps_search.py

import serpapi

 

client = serpapi.Client(api_key="YOUR_API_KEY")

results = client.search({

"engine": "google_maps",

"type": "search",

"q": "coffee shops in New York",

"ll": "@40.7455096,-74.0083012,14z"

})

first = results["local_results"][0]

print(len(results["local_results"]), first["title"], first["rating"], first["reviews"])

Response (trimmed)

{

"search_parameters": {"engine": "google_maps", "type": "search", "q": "coffee shops in New York", "ll": "@40.7455096,-74.0083012,14z", ...},

"local_results": [{

"position": 1,

"title": "L B Coffee",

"place_id": "ChIJhcA7rstZwokR2UOjvUcQPkQ",

"data_id": "0x89c259cbae3bc085:0x443e1047bda343d9",

"data_cid": "4917385743445476313",

"gps_coordinates": {"latitude": 40.774620999999996, "longitude": -73.9484401},

"rating": 4.9,

"reviews": 387,

"price": "$1–10",

"type": "Coffee shop",

"address": "454 E 84th St Store Front, New York, NY 10028",

"open_state": "Open · Closes 6 PM",

"operating_hours": {"saturday": "7 AM–6 PM", "sunday": "7 AM–6 PM", ...},

"phone": "(646) 410-2818",

"website": "https://lbcoffeenyc.com/",

"service_options": {"dine_in": true, "takeout": true, "delivery": true},

"user_review": ""The coffee is delicious, and the space has a warm, cozy vibe.""

}, ...]

}

20 results, 30 fields on the first result, with ready-made reviews_link and place_id_search URLs for the follow-up calls. The place lookup returned 35 fields including hours, popular times, images, and a sample of user reviews. Search median 1.6 seconds, though two of the five searches took 8.9 and 11.6 seconds; place lookups were the fastest in the test at 0.75 seconds median, one of them a 0.18-second cache hit on a place we had fetched minutes earlier. Reviews came back 8 to a first page with rating, date, snippet, likes, and user profile.

Pros

  • +Five Maps engines including autocomplete and photos, all billed as one search
  • +Fastest place lookups in the test, and cached repeats are free
  • +Filters for min and max price, min rating, open state, and open-at hour on search

Cons

  • -$25 per 1,000 searches on Starter is the highest per-request rate here; $1.25 per 1K places only because every page holds 20
  • -Two of five searches ran past 8 seconds in our sample
  • -No radius or bounding-box search; the viewport comes from ll
#3

SearchAPI

Best for: cheap per-request search and place lookups with a tidy schema

SearchAPI has four Google Maps data engines (plus two directions engines we did not test): google_maps (search, q required, optional ll and page), google_maps_place (by place ID or data ID, returning photos, reviews, Q&A, posts, and popular times), google_maps_reviews (num default 10, max 20, sortable), and google_maps_photos. We found no Maps autocomplete engine in its documentation.

Developer is $40 for 10,000 requests, Production $100 for 35,000, BigData $250 for 100,000, Scale $500 for 250,000, and Octo plans run from $900 for 500,000 to $5,000 for 5 million. Sign-up comes with 100 free requests and no card. Only successful responses with a 200 status are charged, and the hourly rate limit is 20% of the plan's credits.

Python example: local search

# searchapi_maps_search.py

import requests

 

response = requests.get(

"https://www.searchapi.io/api/v1/search",

headers={"Authorization": "Bearer YOUR_API_KEY"},

params={"engine": "google_maps", "q": "coffee shops in New York"}

)

first = response.json()["local_results"][0]

print(first["title"], first["rating"], first["reviews"], first["address"])

Response (trimmed)

{

"search_parameters": {"engine": "google_maps", "q": "coffee shops in New York", "hl": "en"},

"local_results": [{

"position": 1,

"ludocid": "3766819750231249954",

"place_id": "ChIJ-Y-kFABZwokRIpR1-ZpuRjQ",

"data_id": "0x89c2590014a48ff9:0x34466e9af9759422",

"title": "Le Cafe Coffee",

"address": "1427 6th Ave, New York, NY 10019",

"city": "New York, NY",

"timezone": "America/New_York",

"rating": 4.6,

"reviews": 281,

"review_text": ""Friendly service, great coffee, amazing soy cappuccino!"",

"website": "https://lecafecoffee.com/",

"domain": "lecafecoffee.com",

"gps_coordinates": {"latitude": 40.765291, "longitude": -73.9767121},

"type": "Coffee shop",

"open_state": "Open",

"hours": "Open · Closes 6 PM",

"open_hours": {"saturday": "7 AM–6 PM", "sunday": "7 AM–6 PM", ...},

"extensions": [{"title": "Service options", "items": [...]}, ...]

}, ...]

}

20 results, 25 fields on the first result. The search result carries IDs, address, rating, hours, website, and a review snippet; 13 of the 20 results also carried a phone number, the first one did not. The google_maps_place engine returned 28 fields for the same place including a reviews histogram, reservation links, popular times, and a review_results sample. Reviews came 10 to a page with 11 fields each and no owner-response field. Search median 1.6 seconds (tied fastest in the five-query bench, 0.9 to 2.1 seconds), place lookups 1.2 seconds.

Pros

  • +$4 per 1,000 requests at entry is a fifth of SerpApi's rate for a near-identical engine set
  • +Fastest median search in the bench, tied with SerpApi, with no search above 2.1 seconds
  • +Only 200 responses are billed

Cons

  • -Phone number was missing on 7 of 20 search results, so a lead list needs a place call for those
  • -No owner responses in the reviews engine, no autocomplete engine documented
  • -Free tier is a one-off 100 requests rather than a monthly allowance
#4

DataForSEO

Best for: the lowest cost per place, with 100 results per task and a queue for bulk jobs

DataForSEO splits Google Maps across two products. The SERP API's serp/google/maps endpoint returns the Maps result list and is billed per SERP page of up to 100 results: $0.0006 on the Standard queue, $0.0012 Priority, $0.002 Live, with a documented depth up to 700. The Business Data API adds Google My Business Info ($0.0015 Standard, $0.0054 Live per profile), Google Reviews ($0.00075 per 10 reviews on Standard, $0.0015 Priority, depth up to 4,490), GMB Updates for owner posts ($0.0015 per task plus $0.00075 per 10 updates), and Google Q&A. Pricing is pay as you go with a $50 minimum payment; we found no free tier listed.

Python example: Maps SERP, Live mode

# dataforseo_maps_search.py

import requests

 

response = requests.post(

"https://api.dataforseo.com/v3/serp/google/maps/live/advanced",

auth=("YOUR_LOGIN", "YOUR_PASSWORD"),

json=[{"keyword": "coffee shops in New York", "location_code": 2840, "language_code": "en"}]

)

task = response.json()["tasks"][0]

result = task["result"][0]

print(task["cost"], result["items_count"], result["items"][0]["title"], result["items"][0]["rating"]["value"])

Response (trimmed)

{

"status_code": 20000,

"tasks": [{

"cost": 0.002,

"result": [{

"keyword": "coffee shops in New York",

"location_code": 2840,

"items_count": 100,

"items": [{

"type": "maps_search",

"rank_absolute": 1,

"title": "Le Cafe Coffee",

"domain": "lecafecoffee.com",

"rating": {"rating_type": "Max5", "value": 4.6, "votes_count": 281},

"rating_distribution": {"1": 8, "2": 11, "3": 15, "4": 23, "5": 224},

"address": "1427 6th Ave, New York, NY 10019",

"address_info": {"borough": "Manhattan", "city": "New York", "zip": "10019", ...},

"place_id": "ChIJ-Y-kFABZwokRIpR1-ZpuRjQ",

"cid": "3766819750231249954",

"category": "Coffee shop",

"work_hours": {"timetable": {"sunday": [{"open": {"hour": 7, "minute": 0}, "close": {"hour": 18, "minute": 0}}], ...}},

"is_claimed": true

}, ...]

}]

}]

}

100 places for $0.002, 32 fields on the first result, and the only provider that returns hours as a numeric timetable rather than a display string. The rating histogram, claimed flag, borough-level address, and CID are all in the search result. The GMB Info lookup returned 42 fields including attributes, popular times, and a Q&A count; the Google Reviews endpoint is queue-based (post the task, poll for the result), and our 10-review task completed in under 90 seconds with 25 fields per review including an owner-answer field. Live search median 3.8 seconds, GMB Info 3.3 seconds.

Pros

  • +$0.02 per 1,000 places Live and $0.006 on the Standard queue, the lowest in the roundup by a wide margin
  • +Structured hours, rating distribution, and claimed status in the search result itself
  • +Reviews at $0.075 per 1,000 and owner posts as a dedicated endpoint

Cons

  • -Slowest of the synchronous search APIs at 3.8 seconds median, and reviews are queue-only
  • -Business details Live is $5.40 per 1,000, above OpenWeb Ninja, Scrapingdog, HasData, and SearchAPI
  • -$50 minimum deposit and no photos or autocomplete endpoint for Maps
#5

Scrapingdog

Best for: cheap per-request search, details, reviews, photos, and posts once you clear the 5-credit rule

Scrapingdog's Google Maps API is GET /google_maps with query, optional ll, and a page that increments by 20; place details use the same endpoint with type=place and a place_id. Separate /google_maps/reviews (results 1 to 20, default 10), /google_maps/photos, and /google_maps/posts endpoints take the data_id from a search result.

The pricing table lists Google Maps at 5 credits per request, so the plan math is: Free 200 credits (40 requests), Lite $40 for 200,000 credits ($1.00 per 1,000 Maps requests), Standard $90 for 1 million ($0.45), Pro $200 for 3 million ($0.33), Premium $350 for 6 million ($0.29), Business $500 for 9 million ($0.28), continuing to $30,000 for 1.1 billion credits. The Maps documentation pages do not state a separate credit cost for reviews, photos, or posts, so we assume the same 5.

Python example: local search

# scrapingdog_maps_search.py

import requests

 

response = requests.get(

"https://api.scrapingdog.com/google_maps",

params={"api_key": "YOUR_API_KEY", "query": "coffee shops in New York", "page": 0}

)

first = response.json()["search_results"][0]

print(first["title"], first["rating"], first["reviews"], first["address"])

Response (trimmed)

{

"search_results": [{

"title": "787 coffee",

"place_id": "ChIJfbedxbZZwokRpbnR5BBdz1c",

"data_id": "0x89c259b6c59db77d:0x57cf5d10e4d1b9a5",

"data_cid": "6327378328618645925",

"reviews_link": "https://api.scrapingdog.com/google_maps/reviews?api_key=...&data_id=0x89c259b6c59db77d:0x57cf5d10e4d1b9a5",

"posts_link": "https://api.scrapingdog.com/google_maps/posts?api_key=...&data_id=0x89c259b6c59db77d:0x57cf5d10e4d1b9a5",

"gps_coordinates": {"latitude": 40.7597441, "longitude": -73.9875048},

"rating": 4.9,

"reviews": 3557,

"price": "$1–10",

"type": "Coffee shop",

"extensions": [{"service_options": ["Outdoor seating", "Curbside pickup", "Takeout", "Dine-in", "Delivery", ...]}, ...],

"address": "245 W 46th St, New York, NY 10036",

"open_state": "Open · Closes 9 PM",

"operating_hours": {"saturday": "7 AM–9 PM", "sunday": "8 AM–9 PM", ...},

"phone": "+16465967178",

"website": "https://www.787coffee.com/",

"rank": 1

}, ...]

}

20 results, 26 fields on the first result, with the reviews and posts URLs for each business pre-built (your key included, so treat the response as a secret). The place lookup returned 23 fields including popular times; reviews came 8 to a first page with 12 fields, including a response object reserved for the owner reply (empty for this bakery, which had none). Search median 1.75 seconds, place lookups 1.65 seconds.

Pros

  • +$1.00 per 1,000 requests at Lite, falling to $0.28 at Business, for search, details, reviews, photos, and posts alike
  • +Reviews carry an owner-reply object alongside rating, date, snippet, and user
  • +Fast and consistent: 1.0 to 3.7 seconds on nine of ten calls

Cons

  • -5 credits per Maps request makes the free tier 40 calls and the headline credit counts misleading until you divide
  • -Per-endpoint credit costs for reviews, photos, and posts are not stated in the Maps docs
  • -No autocomplete, no radius search, no contact extraction
#6

HasData

Best for: a simple three-endpoint Maps API that stores the HTML and JSON of every request

HasData exposes GET /scrape/google-maps/search (q, optional ll, and a start offset that requires ll), /scrape/google-maps/place by placeId, and /scrape/google-maps/reviews by dataId or placeId, all with an x-api-key header. We found no photos endpoint. Each successful request costs 5 credits and failed requests are free.

The free plan is 1,000 credits a month (200 Maps requests, concurrency 1). Startup is $49 for 200,000 credits ($1.23 per 1,000 Maps requests, concurrency 5), Basic $99 for 1 million ($0.50, concurrency 15), Growth $208 for 3 million ($0.35, concurrency 50), and Enterprise is custom from 20 million credits.

Python example: local search

# hasdata_maps_search.py

import requests

 

response = requests.get(

"https://api.hasdata.com/scrape/google-maps/search",

headers={"x-api-key": "YOUR_API_KEY"},

params={"q": "coffee shops in New York"}

)

first = response.json()["localResults"][0]

print(first["title"], first["rating"], first["reviews"], first["placeId"])

Response (trimmed)

{

"requestMetadata": {"id": "d19d9c11-2555-4760-adf3-d31576f337c9", "status": "ok", "html": "https://files.hasdata.com/.../d19d9c11-....html", "json": "https://files.hasdata.com/.../d19d9c11-....json", ...},

"localResults": [{

"position": 1,

"title": "Down Under Coffee",

"placeId": "ChIJRQbaGIhZwokR52JdZ_sZISw",

"dataId": "0x89c2598818da0645:0x2c2119fb675d62e7",

"kgmid": "/g/11vfblmz4v",

"address": "1000 8th Ave, New York, NY 10019",

"workingHours": {"timezone": "America/New_York", "days": [{"day": "Saturday", "time": "8:30 AM–6 PM", "date": "2026-9-5"}, ...]},

"openState": "Open · Closes 6 PM",

"rating": 4.7,

"reviews": 75,

"type": "Coffee shop",

"price": "$10–20",

"priceDescription": "$10 to $20",

"gpsCoordinates": {"latitude": 40.767054, "longitude": -73.98297649999999},

"serviceOptions": ["Onsite services", "Takeout", "Dine-in"],

"menu": {"overview": {"menuPhotos": [...]}}

}, ...]

}

20 results, 19 fields on the first result: the slimmest record in the test. The first result had no phone or website; across the page, 13 of 20 carried a phone and 16 a website (the place endpoint returned 22 fields including website, user reviews, and images). Every response links to the stored HTML and JSON of the request. Reviews came 8 to a page with 9 fields and no owner-response field. Search median 2.1 seconds, place lookups 3.1 seconds with two of five at 10 seconds.

Pros

  • +$1.23 per 1,000 requests at entry and $0.35 at Growth, with a monthly free allowance of 200 requests
  • +Hours come with the calendar date for each day, and the raw HTML is kept for audit
  • +Failed requests are not billed

Cons

  • -Phone missing on 7 of 20 search results and website on 4, so lead lists need a place call for those
  • -No photos, posts, or autocomplete endpoint, and no owner responses in reviews
  • -Place lookups were the slowest of the per-request APIs in our sample
#7

Apify

Best for: the deepest single record and pay-per-event enrichment, when 15-second runs are acceptable

Apify's Google Maps Scraper (compass/crawler-google-places, with about 592,000 users listed on its store page) is priced per event with platform usage included. A scraped place costs $4.00 per 1,000 on the Free plan, $3.00 on Starter ($19 a month), $2.00 on Scale ($199), and $1.50 on Business ($999). Add-ons are billed on top: a scraped review $0.50 per 1,000 (Starter), a scraped image $0.50, additional place details $2.00, company contacts enrichment $2.00, a filter applied $1.00, and an actor start $0.00005. A separate Google Maps Reviews Scraper actor runs $0.60 per 1,000 reviews on Free, $0.45 on Starter, and $0.30 on Business. The Free plan includes $5 of usage a month.

One thing our run surfaced: with only searchStringsArray: ["coffee shops in New York"], one of the ten results was a coffee shop in Chicago and two were in Elmhurst, Illinois. Adding locationQuery fixed it, so the example below passes the location separately.

Python example: local search

# apify_maps_search.py

from apify_client import ApifyClient

 

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("compass/crawler-google-places").call(run_input={

"searchStringsArray": ["coffee shops"],

"locationQuery": "New York, USA",

"maxCrawledPlacesPerSearch": 10,

"language": "en"

})

items = list(client.dataset(run.default_dataset_id).iterate_items())

print(len(items), items[0]["title"], items[0]["totalScore"], items[0]["reviewsCount"], items[0]["city"])

Response (trimmed)

[{

"title": "Locals Collective NYC",

"categoryName": "Coffee shop",

"address": "1-90 Beach 69th St, Arverne, NY 11692",

"neighborhood": "Arverne",

"city": "Arverne",

"postalCode": "11692",

"state": "New York",

"countryCode": "US",

"website": "http://localscollectivenyc.com/",

"phone": "(518) 418-0393",

"phoneUnformatted": "+15184180393",

"claimThisBusiness": false,

"location": {"lat": 40.5898465, "lng": -73.7974272},

"totalScore": 4.5,

"permanentlyClosed": false,

"placeId": "ChIJpS60CuyBt4cRMMA4nfpOab0",

"categories": ["Coffee shop", "Bar", "Cafe", "Restaurant"],

"cid": "13648526984009531440",

"reviewsCount": 171,

"reviewsDistribution": {"oneStar": 12, "twoStar": 5, "threeStar": 7, "fourStar": 15, "fiveStar": 132},

"scrapedAt": "2026-09-05T18:55:07.053Z",

"openingHours": [{"day": "Monday", "hours": "7 AM to 3 PM"}, ...],

"wasOpenAtScrapeTime": true,

"additionalInfo": {"Service options": [{"Outdoor seating": true}, {"Delivery": true}, ...], ...},

"searchString": "coffee shops",

"rank": 5,

"isAdvertisement": false

}, ...]

10 places as requested, 61 fields on the first result: the deepest record in the test, with structured address parts, both phone formats, a rating histogram, opening hours, popular-times slots, image count, and an additionalInfo block of amenities. The trade-off is time: 14.0 seconds median for a 10-place run and 13.0 seconds for a single place by URL, because each call starts an actor run on the platform.

Pros

  • +61 fields per place with no second call, including amenities and rating histogram
  • +Reviews, images, contacts, and lead enrichment as priced add-ons on the same run
  • +The Free plan's $5 of monthly usage covers about 1,250 places at the $4.00 rate

Cons

  • -$3.00 per 1,000 places on Starter is the highest per-place rate in the roundup, before add-ons
  • -11 to 22 seconds per run in our sample; not suited to request-response use
  • -Location must be passed separately or some results can land in the wrong state
#8

Bright Data Web Scraper API

Best for: the largest free tier and per-record billing on asynchronous bulk collection

Bright Data lists six Google Maps scrapers: full information by URL, discover records by location search, collect by place ID, discover by customer ID, Google Maps reviews, and Google Maps images. All bill per record: the free tier is 5,000 records a month with no card, pay as you go is $1.50 per 1,000 records, and Scale is $499 a month for 384,000 records with $1.30 per 1,000 beyond. You pay only for successful records.

Calls go through /datasets/v3/scrape, which waits up to about 60 seconds for a synchronous answer and otherwise returns a 202 with a snapshot ID to poll. In our tests, place-URL lookups on the "Google Maps full information" dataset (gd_m8ebnr0q2qlklc02fz) completed synchronously four times out of five, in 14 to 40 seconds; keyword discovery runs as an asynchronous snapshot, which is why Bright Data sits out the search bench.

Python example: place by URL

# brightdata_maps_place.py

import requests

 

response = requests.post(

"https://api.brightdata.com/datasets/v3/scrape",

headers={"Authorization": "Bearer YOUR_API_KEY"},

params={"dataset_id": "gd_m8ebnr0q2qlklc02fz", "format": "json"},

json=[{"url": "https://www.google.com/maps/place/?q=place_id:ChIJT994RulZwokRdgqQX0zc3QY"}]

)

place = response.json()[0]

print(place["name"], place["rating"], place["reviews_count"], place["phone_number"])

Response (trimmed)

[{

"place_id": "ChIJT994RulZwokRdgqQX0zc3QY",

"name": "La Cabra Bakery",

"category": "Coffee shop",

"address": "152 2nd Ave, New York, NY 10003, United States",

"open_hours": {"Sunday": "8 AM–6 PM", "Saturday": "8 AM–6 PM", "Friday": "7 AM–6 PM", ...},

"reviews_count": 1628,

"rating": 4.6,

"lat": 40.7294459,

"lon": -73.9868353,

"services_provided": ["Outdoor seating", "On-site services", "Takeaway", "Dine-in", ...],

"open_website": "https://us.lacabra.com/pages/east-village",

"phone_number": null,

"permanently_closed": false,

"people_also_search": [{"name": "Abraço", "rating": 4.2, "reviews_num": 1102, ...}, ...],

"popular_times": [{"day": "7", "time": [{"hour": "8 AM", "percent": "39"}, ...]}, ...],

"cid": "494793754659523190",

"is_claimed": true,

"fid_location": "0x89c259e94678df4f:0x6dddc4c5f900a76",

"review_distribution": {"1_star_reviews": 34, "2_star_reviews": 40, "3_star_reviews": 73, "4_star_reviews": 168, "5_star_reviews": 1313},

"all_categories": ["Coffee shop", "Bakery"],

"timestamp": "2026-09-05T18:55:59.225Z"

}]

One record, 38 fields, including popular times by hour, the "people also search" carousel with ratings, a review histogram, claimed status, and every Google identifier. Phone number was null for this bakery on Bright Data while OpenWeb Ninja also returned null for it, so that is the listing, not the scraper. Median 38.5 seconds across the four synchronous lookups.

Pros

  • +5,000 free records a month, the largest free tier in the roundup
  • +Popular times, related places, and a review histogram on the base record
  • +Dedicated reviews and images datasets and discovery by search, place ID, or CID for batch jobs

Cons

  • -14 to 40 seconds per synchronous lookup, and one of five fell through to an asynchronous snapshot
  • -Keyword search is asynchronous only; no autocomplete, posts, or radius search
  • -$1.50 per record is above every per-request provider once you divide their price by 20 results

Google Maps Unit Economics: Cost per 1,000 by Data Type

Entry paid plan first, then the lowest listed rate. Search is per 1,000 places returned at 20 per page (100 for DataForSEO). Details is per 1,000 place lookups. Reviews is per 1,000 reviews at the largest documented page size (20 for SerpApi, SearchAPI, and Scrapingdog; 10 per unit for DataForSEO; the 8 we received for HasData). Prices published September 5, 2026.

APIBilling unitSearch, per 1K placesDetails, per 1K lookupsReviews, per 1K reviewsLowest listed rate
OpenWeb NinjaPer business, review, or photo object$1.25 (Pro)$1.25$1.25$0.50 per 1K objects at Mega
SerpApiPer search$1.25 (Starter, $25/1K searches)$25.00$1.25$1.96 per 1K searches at 54M
SearchAPIPer request$0.20 (Developer, $4/1K)$4.00$0.20$1.00 per 1K requests at 5M
DataForSEOPer task$0.02 (Live, $2/1K tasks)$5.40 (Live)$0.075 (Standard)$0.006 per 1K places on Standard queue
Scrapingdog5 credits per request$0.05 (Lite, $1/1K requests)$1.00$0.05$0.28 per 1K requests at Business
HasData5 credits per request$0.06 (Startup, $1.23/1K)$1.23$0.15$0.35 per 1K requests at Growth
ApifyPer place, review, or image event$3.00 (Starter)$3.00$0.45 (reviews actor)$1.50 per 1K places at Business
Bright DataPer record$1.50 (PAYG)$1.50$1.50 (reviews dataset)$1.30 per 1K records on Scale
Google Places API (New)Per request, by SKU$1.60 (Text Search Pro, $32/1K)$5.00 Essentials, $20.00 Enterprise$25 per 1K Place Details requests, 5 reviews as a field$2.40 per 1K Text Search Pro above 5M

Three billing models are hiding in one table. Per-request providers (SerpApi, SearchAPI, Scrapingdog, HasData, Google) charge the same for a page of 20 results as for a page of 2, so they win on dense queries and lose on sparse ones. Per-object providers (OpenWeb Ninja, Apify, Bright Data) charge for what comes back, so a rural query that returns 4 businesses costs 4 units, and a details, review, or photo object costs the same unit as a search result. DataForSEO is per task but returns 100 per task, which is why its per-place number is an order of magnitude below everyone else. Model your actual query mix before choosing on the headline number.

Measured Response Time (Same 5 Searches, Same 5 Places):

Wall-clock seconds from a single client on September 5, 2026, one request per query, no retries. Search: "coffee shops in New York", "dentists in Austin TX", "plumbers in Chicago", "italian restaurants in Boston", "gyms in Denver". Details: the first result of each search, by Google place ID. Small sample; use it as a rough ordering.

APISearch medianSearch rangeDetails medianDetails rangeNote
SerpApi1.6 s1.3 to 11.6 s0.75 s0.2 to 0.9 sTwo slow searches; one details call served from cache
SearchAPI1.6 s0.9 to 2.1 s1.2 s0.7 to 1.3 sNo search above 2.1 s
Scrapingdog1.75 s1.3 to 6.4 s1.65 s1.0 to 3.0 s
OpenWeb Ninja2.3 s2.0 to 3.2 s1.3 s1.1 to 1.7 s43 fields per search result; no caching
HasData2.1 s1.8 to 6.6 s3.1 s3.0 to 10.3 sTwo details calls at 10 s
DataForSEO3.8 s3.1 to 6.2 s3.3 s1.4 to 10.6 s100 results per search; Live mode
Apify14.0 s12.2 to 21.5 s13.0 s11.5 to 13.7 s10 places per search run; actor start included
Bright Datanot testedasync only38.5 s14.0 to 40.3 s4 of 5 synchronous; one 202 snapshot after 60 s

Google Maps Endpoint Coverage

"Yes" means we called it and got data on September 5, 2026. "Docs" means the provider documents it but we did not run it. "Docs (in details)" means the provider documents the data as part of its place-details response rather than as its own endpoint.

APIText searchPlace detailsReviewsPhotosOwner postsAutocompleteRadius / bounding boxContact enrichment
OpenWeb NinjaYesYesYes, owner-response fieldYesDocsDocsDocs (radius, bounding box, nearby)Docs (emails and contacts)
SerpApiYesYesYesDocsDocs (in details)DocsNoNo
SearchAPIYesYesYesDocsDocs (in details)NoNoNo
DataForSEOYesYesYes, owner-answer field (queue)NoDocs (GMB Updates)NoNoNo
ScrapingdogYesYesYes, owner-response fieldDocsDocsNoNoNo
HasDataYesYesYesNoNoNoNoNo
ApifyYesYes (by URL)Docs (add-on or reviews actor)Docs (add-on)NoNoNoDocs (add-on)
Bright DataDocs (async)YesDocs (dataset)Docs (dataset)NoNoNoNo
Google Places (New)DocsDocsDocs (5 as a field)DocsNoDocsDocs (Nearby Search)No

The Official Route: Google Places API (New)

Google's own Places API (New) is the compliance-safe option and, for some field sets, competitive on price. This section is built from Google's published pricing and documentation as read on September 5, 2026; we did not run it in this comparison. It requires a Google Cloud project with billing enabled, and every request must carry a field mask: the Text Search documentation states that "If you omit the field mask, the method returns an error."

Pricing is per request, in tiers by the fields you ask for, and the usage-and-billing page is explicit: "You are then billed at the highest SKU applicable to your request. That means if you select fields in both the Essentials and the Pro SKUs, you are billed based on the Pro SKU." For Place Details, Essentials covers address, location, and types; Pro adds display name, business status, and Maps URI; Enterprise adds phone numbers, rating, review count, website, opening hours, and price level; Enterprise + Atmosphere adds reviews, editorial and generative summaries, and amenities. Since March 1, 2025, per-SKU monthly free caps replace the old $200 credit, and volume discounts apply automatically.

SKUFree cap / monthUp to 100K100K to 500K500K to 1M1M to 5MOver 5M
Text Search Essentials (IDs only)UnlimitedFree
Text Search Pro5,000$32.00$25.60$19.20$9.60$2.40
Text Search Enterprise1,000$35.00$28.00$21.00$10.50$2.63
Text Search Enterprise + Atmosphere1,000$40.00$32.00$24.00$12.00$3.40
Nearby Search Pro5,000$32.00$25.60$19.20$9.60$2.40
Place Details Essentials10,000$5.00$4.00$3.00$1.50$0.38
Place Details Pro5,000$17.00$13.60$10.20$5.10$1.28
Place Details Enterprise1,000$20.00$16.00$12.00$6.00$1.51
Place Details Enterprise + Atmosphere1,000$25.00$20.00$15.00$7.50$2.28
Place Details Photos1,000$7.00$5.60$4.20$2.10$0.53
Autocomplete Requests10,000$2.83$2.27$1.70$0.85$0.21

USD per 1,000 requests, from Google's Maps Platform pricing table as rendered on September 5, 2026. Additional discounts above 10 million events a month are negotiated.

Result limits are tighter than the scrapers. Text Search returns at most 20 results per page and, per the documentation, "a maximum of 60 results across all pages, although this limit is subject to change." Nearby Search takes a maxResultCount between 1 and 20 with no pagination. Reviews are not an endpoint; they are a Place Details field in the Enterprise + Atmosphere SKU, so $25 per 1,000 requests buys the handful Google chooses to show. There is no owner-posts, bulk-area, or contact-enrichment capability.

Where it wins: a Text Search Pro request that returns 20 places costs $1.60 per 1,000 places up to 100,000 requests a month, in line with OpenWeb Ninja and SerpApi at entry, and the free caps (5,000 Pro searches, 10,000 Essentials details, 10,000 autocomplete requests a month) are generous for a small app. Where it loses: phone, hours, rating, and website push every search to the $35 Enterprise SKU, reviews push details to $25, and the 60-result ceiling rules out the area sweeps that lead-generation and local-SEO work depend on.

How to Choose: 4 Common Scenarios

Every business in an area, with contact details

Lead generation or a local SEO audit: you want all the dentists inside a city boundary or a 5 km radius, with phone, website, hours, and email where available, in one pass.

Best choice: OpenWeb Ninja. Radius, bounding-box, and nearby endpoints, up to 500 businesses per request, 43 fields in the search result, and contact extraction on the same call. You pay per business returned, which is what you want when you are collecting businesses. Google Places caps at 60 results per search and has no contact data.

Millions of search pages, lowest cost per place

Rank tracking, category research, or a dataset build where you run the same keyword across many cities and only need the list.

Best choice: DataForSEO on the Standard queue ($0.006 per 1,000 places at 100 per task) if you can work asynchronously, Scrapingdog ($0.05 per 1,000 at Lite, $0.014 at Business) or SearchAPI ($0.20 at entry) if you need synchronous responses. All three return 20 to 100 places for a flat per-request price.

Review monitoring with owner responses

You track new reviews across hundreds of locations and need the text, rating, date, author, and whether the owner has replied.

Best choice: OpenWeb Ninja (28 fields per review including owner-response text and timestamp fields, $1.25 per 1,000 reviews at Pro), Scrapingdog ($0.05 per 1,000 with an owner response object), or DataForSEO ($0.075 per 1,000 with an owner-answer field, queue-based). The reviews we pulled had no owner replies, so we saw the fields, not filled values. SerpApi, SearchAPI, and HasData returned reviews without an owner-response field.

A consumer app that shows Google places to users

Store locator, address autocomplete, or "places near me" inside a product, where terms of service and attribution matter more than field depth.

Best choice: Google Places API (New). Free caps of 5,000 Pro searches and 10,000 autocomplete requests a month, official attribution, and $5 per 1,000 Essentials details lookups. Add a scraping API only for the data Google does not return: owner posts, full review histories, and bulk area coverage.

FAQ

Most common questions and answers

Is there an official Google Maps business data API?

Which Google Maps API is cheapest per business returned?

Why did the same query return different top results on different APIs?

Can I get Google Maps reviews through an API?

Are credits the same as requests for Google Maps APIs?

How many results does one Google Maps search return?

Which API can search a radius or bounding box instead of a text location?

Is scraping Google Maps business data legal?

About the author

Adam Ben-Ayoun

Adam Ben-Ayoun

CTO @ OpenWeb Ninja

Adam leads engineering at OpenWeb Ninja, building the APIs and infrastructure that make public web data accessible to developers and AI agents.

Connect on LinkedIn

One key. 40+ APIs. Start free.

500 free businesses a month, no credit card. Search, area search, details, reviews, photos, posts, and autocomplete from Google Maps, plus SERP, Jobs, Amazon, and 40+ other APIs on the same key.

APIs by Category

Didn't find the API you are looking for? Request an API

© 2026 OpenWeb Ninja. All rights reserved.

G2 LogoTrustpilot LogoGitHub