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_link, review_likes, reviewer identifiers, author profile links, author review counts, Local Guide level, review language, images, owner response text, and owner response timestamps. The response also includes nextPage when more reviews are available.

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. 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": 1704067200,
            "review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "review_likes": 12,
            "author_id": "123456789012345678901",
            "author_link": "https://www.google.com/maps/contrib/123456789012345678901?hl=en",
            "author_name": "John Doe",
...

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 string 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 page counts as one API credit. When pages > 1, response includes pages_fetched, pages_requested, and error fields.

Example value 10
limit string 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

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": 1704067200,
            "review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
            "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
}

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 JSON with review_id, review_text, rating, timestamp, reviewer profile fields, review language, images, review form attributes, owner response fields, and nextPage pagination when more reviews are available.

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.

Related reading

Try It Live

Test this endpoint in our interactive playground with real data.