Skip to content
Scrappa Get API key

Google Reviews API

Google Maps reviews API

Fetch Google reviews from public Maps listings as structured JSON

This page is for developers searching for a Google Reviews API, Google Maps reviews API, Google Places reviews endpoint, or Google Business Profile reviews API alternative. Start here when you need paginated review text, ratings, author metadata, images, owner responses, filtering, sorting, and localization without maintaining a Google Maps review scraper.

Google Reviews API documentation for developers who need Google Maps place reviews in structured JSON. Scrappa's GET /api/maps/reviews endpoint fetches review text, star ratings, reviewer profile fields, timestamps, photos, language, review form attributes, review links, likes, and owner responses from public Google Maps business listings.

Google Maps reviews API for business review data

Use this endpoint when you already have a Google Maps business_id and need reviews for reputation monitoring, local SEO research, review analytics, customer sentiment analysis, lead enrichment, or competitive benchmarking. It is built for Google Maps reviews scraping workflows where the output needs to be normalized JSON instead of browser HTML.

Google Places API reviews endpoint documentation

Use this page as Scrappa's Google Places API reviews endpoint documentation when the official Google Places or Google Business Profile APIs do not return the public Maps review fields your workflow needs. The request path is GET /api/maps/reviews, the required identifier is business_id, and the response is ready for review monitoring, local business enrichment, and reputation analytics pipelines.

What the reviews endpoint returns

Each review item can include review_id, review_text, rating, timestamp, review_updated_timestamp, review_link, review_likes, reviewer identifiers, author profile links, author review counts, Local Guide level, review language, images, owner response text, and owner response timestamps. timestamp is the original review creation time when Google exposes it; review_updated_timestamp is the edited/display timestamp used by Google Maps UI when available. The endpoint keeps every valid review returned by Google Maps and removes duplicate review IDs across fetched pages. First-party reviews have review_source: "Google", a numeric Google contributor author_id, and is_google_review: true. Syndicated reviews remain available with their actual provider, such as Jameda, GoLocal, or Trustpilot, and is_google_review: false; an unknown provider is reported as External. The review_count and reviews_per_rating fields from Google Maps Business Details describe Google's listing totals, but they do not guarantee that every review is available through the paginated public feed.

Filtering, sorting, localization, and pagination

Use search to filter reviews by keyword, sort to request most relevant, newest, highest-rated, or lowest-rated reviews, and page or pages to paginate through larger review sets. For deeper collection, prefer a multi-page pages request because Scrappa follows continuation tokens inside one request and starts bounded recovery when a full page unexpectedly omits its token. Google can still stop returning a continuation token before the displayed review count is reached, so nextPage: null does not prove that every displayed review was retrievable. Use termination_reason, feed_exhausted, continuation_retries, and continuation_recovered to diagnose how collection stopped. Use hl and gl when your review monitoring workflow needs localized review text, region-specific behavior, or country-specific Google Maps results.

How to get the business ID before fetching reviews

Start with Google Maps Simple Search when you know a business name, category, or address. Use Google Maps Business Details when you need the business profile, rating summary, review count, hours, photos, and place identifiers before calling the reviews endpoint. For one known review, use Single Review.

Run this endpoint

Google Reviews API 1 credit/page

Endpoint

GET https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac
Request preview GET
https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac
Auth header x-api-key
Cost 1 credit/page
business_id = 0x60188b88b7d8f7ab:0x2133080e9923eaac
Response preview 200 OK
{
    "items": [
        {
            "review_id": "ChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "review_text": [
                "Great place with excellent service!"
            ],
            "rating": 5,
            "timestamp": 1704067200000,
            "review_updated_timestamp": 1704153600000,
            "review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "review_source": "Google",
            "is_google_review": true,
            "review_likes": 12,
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

1 required parameter needed before sending a request.

7 optional filters available.

business_id string Required

The assigned business id by Google (e.g. 0x60188b88b7d8f7ab:0x2133080e9923eaac).

Example value 0x60188b88b7d8f7ab:0x2133080e9923eaac
sort integer Optional

Sorting order: 1 for Most Relevant, 2 for Newest, 3 for Highest Rating, 4 for Lowest Rating.

Example value relevance
page string Optional

Pagination token.

Example value 1
pages integer Optional

Number of pages to fetch in a single request (1-50). Each successfully fetched page counts as one API credit. Multi-page requests are preferred for deeper pagination. The response includes termination and continuation-recovery diagnostics.

Example value 10
limit integer Optional

Maximum number of reviews to return per page.

Example value 10
hl string Optional

Language code for results. Default: en

Example value en
gl string Optional

Country/region code for geo-filtering. Default: us

Example value us

Request Examples

<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac"
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

items nextPage termination_reason feed_exhausted continuation_retries continuation_recovered

Common items fields

review_id review_text rating timestamp
JSON Response
200 OK
{
    "items": [
        {
            "review_id": "ChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "review_text": [
                "Great place with excellent service!"
            ],
            "rating": 5,
            "timestamp": 1704067200000,
            "review_updated_timestamp": 1704153600000,
            "review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "review_source": "Google",
            "is_google_review": true,
            "review_likes": 12,
            "author_id": "123456789012345678901",
            "author_link": "https://www.google.com/maps/contrib/123456789012345678901?hl=en",
            "author_name": "John Doe",
            "author_profile_photo": "https://lh3.googleusercontent.com/a-/example_photo.jpg",
            "author_review_count": 45,
            "author_reviews_link": "https://www.google.com/maps/contrib/123456789012345678901/reviews",
            "author_photo_count": 12,
            "author_local_guide_level": 3,
            "owner_response_timestamp": null,
            "owner_response_text": null,
            "owner_response_language": null,
            "review_language": [
                "en"
            ],
            "review_form": [],
            "images": []
        }
    ],
    "nextPage": null,
    "termination_reason": "token_missing",
    "feed_exhausted": null,
    "continuation_retries": 0,
    "continuation_recovered": false
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Validation Error

The business ID, pagination, sorting, or locale parameters failed validation.

{
    "message": "The request validation failed",
    "errors": {
        "business_id": [
            "The business ID must be either a google_id or a place_id."
        ]
    }
}
503

Reviews Temporarily Unavailable

No review pages could be fetched after proxy or upstream attempts.

{
    "items": [],
    "nextPage": null,
    "error": "Page 1 failed after 3 attempts: could not obtain valid proxy"
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Related Endpoints

Google Maps API FAQ

Answers for developers comparing Google Reviews APIs, Google Places review access, and Google Maps review scraping workflows.

Is there a Google Reviews API for developers?

Scrappa provides a Google Reviews API endpoint for public Google Maps listings. Send a business_id to GET /api/maps/reviews and the endpoint returns normalized review JSON with ratings, review text, authors, timestamps, images, owner responses, and pagination.

What does the Google Maps reviews endpoint return?

The endpoint returns first-party Google reviews and syndicated reviews exposed by Google Maps, with review_id, review_text, rating, timestamps, reviewer fields, images, owner responses, and pagination. Use review_source for the actual provider. is_google_review: true together with a numeric Google contributor author_id is the stable signal for a genuine Google review.

How do I call the Google Reviews API endpoint?

Send GET /api/maps/reviews with business_id and your x-api-key header. Optional parameters include search, sort, page, pages, limit, hl, and gl for filtering, ordering, pagination, and localization.

Is this official Google Places API reviews documentation?

No. This is Scrappa's Google Places and Google Maps reviews endpoint documentation. It helps developers retrieve public place reviews as structured JSON through Scrappa's API.

Which place identifier does the Google Reviews API use?

Use the Google business_id in 0x...:0x... format. You can get that identifier from Scrappa Google Maps Simple Search or Business Details responses before calling the reviews endpoint.

Can I filter or sort Google Maps reviews?

Yes. Use search to filter reviews by keyword and sort to request most relevant, newest, highest-rating, or lowest-rating review order. Use page or pages when you need more than one page of reviews.

Can I retrieve every review shown in the Google Maps review count?

Not always. Google Maps can stop exposing continuation tokens before the displayed review count is reached. Use a multi-page pages request for the most robust collection path and inspect the pagination diagnostic fields to see why the response stopped.

Related reading

Try It Live

Test this endpoint in our interactive playground with real data.