MAPS

Google Maps Business Search API

Search Google Maps for businesses by text query, optionally centred on coordinates. Returns each place with its name, address, coordinates, category, rating, review count, opening hours, website and phone where Google publishes them, plus the place id you can pass to Google Maps Place Details.

Part of: Google Maps Scraper API

googlemapsplaceslocalbusinessleadsgeoscraping
Try it freeGet an API key

How to call it

Send one POST to api.upapi.io/google-maps-search.post with your key in the X-Api-Key header and the parameters below as a JSON body. Each call spends 6 weighted units of your monthly quota. The operation times out after 25 seconds. Identical requests are served from cache for 1800 seconds, unbilled.

endpoint
POST https://api.upapi.io/google-maps-search.post

Google Maps Business Search API reference

Request parameters

zoom
number — Map zoom for the coordinate search, controlling the radius: 13 is roughly a city (the default), 16 a neighbourhood, 10 a metro area.
query
stringrequired — What to search for, exactly as you would type it into Google Maps (e.g. "coffee shops in Ottawa" or "dentist near Shoreditch London").
region
string — Two-letter country code biasing the results (e.g. "ca", "gb").
language
string — Language for names and hours, as an ISO code (e.g. "en", "fr").
latitude
number — Centre the search on this latitude (e.g. 45.4215). Pass with longitude. Omit to let Google infer the area from the query text.
proxyUrl
string — Route the request through your own proxy (e.g. http://user:pass@host:port). Omit to use upAPI's pool.
longitude
number — Centre the search on this longitude (e.g. -75.6972). Pass with latitude.
maxResults
integer — How many places to return, up to 100 (e.g. 40). Google serves 20 per page, so higher values cost proportionally more time.

Response fields

count
integerrequired
query
stringrequired
places
arrayrequired
places[].cid
string — Google customer id — the decimal form of the feature id
places[].city
string
places[].name
stringrequired
places[].phone
string — Phone as Google displays it locally
places[].domain
string
places[].rating
number
places[].street
string
places[].address
string
places[].placeId
string — Google place id (ChIJ...)
places[].website
string
places[].category
string — Primary Google category
places[].latitude
number
places[].locality
string — Human "City, Region, Country" line
places[].timezone
string
places[].featureId
string — Google feature id (0x<cell>:0x<cid>); pass it to Google Maps Place Details
places[].longitude
number
places[].thumbnail
string
places[].categories
array
places[].countryCode
string
places[].reviewCount
integer — Total Google reviews. Best-effort: Google serves this field inconsistently on the Maps endpoints — the same request returned it one hour and omitted it the next (measured 2026-08-17) — so treat null as 'not published on this response', not as zero reviews.
places[].addressLines
array
places[].openingHours
array — Per weekday, as [{"day": "Monday", "hours": ["8 AM-11 PM"]}]
places[].googleMapsUrl
string
places[].phoneInternational
string — E.164 phone, when Google publishes one
truncated
booleanrequired — True when Google still had more results than maxResults allowed

Example request and response

The example response is generated from this operation’s published output schema — it shows the shape and field names, not values from a recorded call.

json — example request body
{
  "query": "coffee shops in Ottawa",
  "region": "us",
  "language": "en",
  "maxResults": 20
}
json — example response shape
{
  "count": 3,
  "query": "typescript",
  "places": [
    {
      "cid": "example",
      "city": "example",
      "name": "example",
      "phone": "example",
      "domain": "example",
      "rating": 1,
      "street": "example",
      "address": "example",
      "placeId": "example",
      "website": "example",
      "category": "example",
      "latitude": 43.65,
      "locality": "example",
      "timezone": "example",
      "featureId": "example",
      "longitude": -79.38,
      "thumbnail": "example",
      "categories": [
        null
      ],
      "countryCode": "US",
      "reviewCount": 1,
      "addressLines": [
        null
      ],
      "openingHours": [
        null
      ],
      "googleMapsUrl": "example",
      "phoneInternational": "example"
    }
  ],
  "truncated": false
}

Code snippets

cURL
curl
curl -X POST https://api.upapi.io/google-maps-search.post \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: YOUR_API_KEY' \
  -d '{ "query": "coffee shops in Ottawa", "region": "us", "language": "en", "maxResults": 20 }'
JavaScript
javascript
const response = await fetch('https://api.upapi.io/google-maps-search.post', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'YOUR_API_KEY',
  },
  body: JSON.stringify({
  "query": "coffee shops in Ottawa",
  "region": "us",
  "language": "en",
  "maxResults": 20
}),
});

const data = await response.json();
console.log(data);
Python
python
import requests

response = requests.post(
    'https://api.upapi.io/google-maps-search.post',
    headers={
        'Content-Type': 'application/json',
        'x-api-key': 'YOUR_API_KEY',
    },
    json={
  "query": "coffee shops in Ottawa",
  "region": "us",
  "language": "en",
  "maxResults": 20
},
)

print(response.json())
Go
go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

func main() {
	payload := []byte(`{ "query": "coffee shops in Ottawa", "region": "us", "language": "en", "maxResults": 20 }`)

	req, _ := http.NewRequest("POST", "https://api.upapi.io/google-maps-search.post", bytes.NewBuffer(payload))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("x-api-key", "YOUR_API_KEY")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	var result map[string]any
	json.Unmarshal(body, &result)
	fmt.Println(result)
}
PHP
php
<?php

$payload = json_encode([
    'query' => 'coffee shops in Ottawa',
    'region' => 'us',
    'language' => 'en',
    'maxResults' => 20,
]);

$ch = curl_init('https://api.upapi.io/google-maps-search.post');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'x-api-key: YOUR_API_KEY',
    ],
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
var_dump($data);
Ruby
ruby
require 'net/http'
require 'uri'
require 'json'

uri = URI('https://api.upapi.io/google-maps-search.post')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Post.new(uri.path)
request['Content-Type'] = 'application/json'
request['x-api-key'] = 'YOUR_API_KEY'
request.body = { "query": "coffee shops in Ottawa", "region": "us", "language": "en", "maxResults": 20 }.to_json

response = http.request(request)
puts JSON.parse(response.body)
Java
java
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

OkHttpClient client = new OkHttpClient();
ObjectMapper mapper = new ObjectMapper();

String json = "{ \"query\": \"coffee shops in Ottawa\", \"region\": \"us\", \"language\": \"en\", \"maxResults\": 20 }";

RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
    .url("https://api.upapi.io/google-maps-search.post")
    .post(body)
    .addHeader("Content-Type", "application/json")
    .addHeader("x-api-key", "YOUR_API_KEY")
    .build();

try (Response response = client.newCall(request).execute()) {
    Map<?, ?> result = mapper.readValue(response.body().string(), Map.class);
    System.out.println(result);
}
C#
csharp
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var payload = JsonSerializer.Deserialize<object>("{ \"query\": \"coffee shops in Ottawa\", \"region\": \"us\", \"language\": \"en\", \"maxResults\": 20 }");
var response = await client.PostAsJsonAsync("https://api.upapi.io/google-maps-search.post", payload);

var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result);

Frequently asked questions

How much does the Google Maps Business Search API cost per call?

Each call spends 6 weighted units of your plan's monthly quota. Full pricing is at https://upapi.io/pricing.

How do I authenticate to the Google Maps Business Search API?

Send your key in the X-Api-Key header. A free guest key is available without creating an account.

Are Google Maps Business Search API responses cached?

Yes — identical requests are served from cache for 1800 seconds, and a cache hit is not billed.

More Maps APIs

Browse every Maps API →