Google Maps Reviews API
What is the Google Maps Reviews API on upAPI?
The Google Maps Reviews API on upAPI returns place reviews as JSON: pass a place id, CID, feature id or Maps link and get each rating, text, author, photos and owner reply, sorted and paged by cursor. No Google Places API key of your own is needed, only one upAPI key. The Free plan includes 1,000 weighted units a month.
Read the reviews on any Google Maps place by place id, CID, feature id or a pasted Maps link. Returns each review's rating, full text, author, photos, timestamp and the owner's reply, sorted by relevance, date or rating, with cursor pagination through the whole feed.
Part of: Google Maps Scraper API
How to call it
Send one POST to api.upapi.io/google-maps-reviews.get 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 900 seconds, unbilled.
POST https://api.upapi.io/google-maps-reviews.get
Google Maps Reviews API reference
Request parameters
- cid
- string — Google customer id, the decimal identifier (e.g. "1868053941146338963").
- url
- string — A Google Maps link to the place, pasted as-is from the browser or the share sheet.
- sort
- string — Order Google returns the reviews in: relevance (Google's own "most relevant" ranking, the default), newest, highest_rating or lowest_rating.
- region
- string — Two-letter country code biasing the response (e.g. "ca").
- placeId
- string — Google place id, as returned by Google Maps Business Search (e.g. "ChIJj61dQgK6j4AR4GeTYWZsKWw").
- language
- string — Language for the reviews, as an ISO code (e.g. "en", "fr"). Google uses this to pick and rank which reviews it surfaces, so different languages genuinely return different reviews rather than translations of one set.
- proxyUrl
- string — Route the request through your own proxy (e.g. http://user:pass@host:port). Omit to use upAPI's pool.
- featureId
- string — Google feature id (e.g. "0x4cce05120f81812b:0x19eca9297f4bc693").
- pageToken
- string — Continue a previous call: pass the
nextPageTokenit returned. Keepsortand the place identifier the same, or the token will not line up. - maxResults
- integer — How many reviews to return, up to 200 (e.g. 100). Google serves at most 60 per page, so higher values cost proportionally more time.
Response fields
- sort
- stringrequired
- count
- integerrequired
- reviews
- arrayrequired
- reviews[].text
- string — The review body in full. Null when the author rated without writing anything, which is common — roughly one review in ten on the places measured.
- reviews[].author
- object
- reviews[].photos
- array — Photos the author attached to this review
- reviews[].rating
- integer — Stars the author gave, 1-5
- reviews[].source
- string — Which network published the review — "Google" for the overwhelming majority, but Google also syndicates partner sources on some places
- reviews[].language
- string — Language of the text as delivered, as an ISO code
- reviews[].reviewId
- string
- reviews[].ratingMax
- integer — The scale the rating is on — 5 on every response measured
- reviews[].reviewUrl
- string — Permalink to the review on Google Maps
- reviews[].publishedAt
- string — When the review was posted, as an ISO 8601 UTC timestamp
- reviews[].relativeTime
- string — How Google phrases the age of the review (e.g. "a week ago")
- reviews[].ownerResponse
- object — The business owner's public reply, when there is one
- featureId
- stringrequired — The Google feature id these reviews were read from
- truncated
- booleanrequired — True when Google still had more reviews than
maxResultsallowed - resolvedFrom
- stringrequired — Which input identifier this lookup was resolved from: placeId, cid, featureId or url
- nextPageToken
- string — Pass back as
pageTokento read the next page. Null when Google has no more reviews to give.
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.
{
"cid": "1868053941146338963",
"sort": "relevance",
"region": "us",
"language": "en",
"maxResults": 20
}{
"sort": "example",
"count": 3,
"reviews": [
{
"text": "Hello, world",
"author": {
"name": null,
"photoUrl": null,
"photoCount": null,
"profileUrl": null,
"reviewCount": null
},
"photos": [
null
],
"rating": 1,
"source": "en",
"language": "en",
"reviewId": "example",
"ratingMax": 1,
"reviewUrl": "example",
"publishedAt": "example",
"relativeTime": "example",
"ownerResponse": {
"text": null,
"relativeTime": null
}
}
],
"featureId": "example",
"truncated": false,
"resolvedFrom": "example",
"nextPageToken": "example"
}Code snippets
cURL
curl -X POST https://api.upapi.io/google-maps-reviews.get \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY' \
-d '{ "cid": "1868053941146338963", "sort": "relevance", "region": "us", "language": "en", "maxResults": 20 }'JavaScript
const response = await fetch('https://api.upapi.io/google-maps-reviews.get', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': 'YOUR_API_KEY',
},
body: JSON.stringify({
"cid": "1868053941146338963",
"sort": "relevance",
"region": "us",
"language": "en",
"maxResults": 20
}),
});
const data = await response.json();
console.log(data);Python
import requests
response = requests.post(
'https://api.upapi.io/google-maps-reviews.get',
headers={
'Content-Type': 'application/json',
'x-api-key': 'YOUR_API_KEY',
},
json={
"cid": "1868053941146338963",
"sort": "relevance",
"region": "us",
"language": "en",
"maxResults": 20
},
)
print(response.json())Go
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{ "cid": "1868053941146338963", "sort": "relevance", "region": "us", "language": "en", "maxResults": 20 }`)
req, _ := http.NewRequest("POST", "https://api.upapi.io/google-maps-reviews.get", 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
$payload = json_encode([
'cid' => '1868053941146338963',
'sort' => 'relevance',
'region' => 'us',
'language' => 'en',
'maxResults' => 20,
]);
$ch = curl_init('https://api.upapi.io/google-maps-reviews.get');
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
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.upapi.io/google-maps-reviews.get')
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 = { "cid": "1868053941146338963", "sort": "relevance", "region": "us", "language": "en", "maxResults": 20 }.to_json
response = http.request(request)
puts JSON.parse(response.body)Java
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
OkHttpClient client = new OkHttpClient();
ObjectMapper mapper = new ObjectMapper();
String json = "{ \"cid\": \"1868053941146338963\", \"sort\": \"relevance\", \"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-reviews.get")
.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#
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>("{ \"cid\": \"1868053941146338963\", \"sort\": \"relevance\", \"region\": \"us\", \"language\": \"en\", \"maxResults\": 20 }");
var response = await client.PostAsJsonAsync("https://api.upapi.io/google-maps-reviews.get", payload);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result);Frequently asked questions
How much does the Google Maps Reviews 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 Reviews API?
Send your key in the X-Api-Key header. A free guest key is available without creating an account.
Are Google Maps Reviews API responses cached?
Yes — identical requests are served from cache for 900 seconds, and a cache hit is not billed.