MAPS

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

googlemapsreviewsratingslocalbusinessreputationscraping
Try it freeGet an API key

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.

endpoint
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 nextPageToken it returned. Keep sort and 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 maxResults allowed
resolvedFrom
stringrequired — Which input identifier this lookup was resolved from: placeId, cid, featureId or url
nextPageToken
string — Pass back as pageToken to 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.

json — example request body
{
  "cid": "1868053941146338963",
  "sort": "relevance",
  "region": "us",
  "language": "en",
  "maxResults": 20
}
json — example response shape
{
  "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
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
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
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
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
<?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
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
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#
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>("{ \"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.

More Maps APIs

Browse every Maps API →