Get App Reviews
curl --request GET \
--url https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews",
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: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"app_id": "<string>",
"sort": "<string>",
"result_count": 123,
"next_page_token": "<string>",
"reviews": [
{
"review_id": "<string>",
"user_name": "<string>",
"user_image": "<string>",
"score": 123,
"text": "<string>",
"thumbs_up": 123,
"review_created_version": "<string>",
"at_utc": 123,
"at": "<string>",
"reply_author": "<string>",
"reply_content": "<string>",
"replied_utc": 123,
"replied_at": "<string>"
}
]
}Endpoints
Get App Reviews
Paginated Google Play user reviews with developer replies, sorted by newest, rating or helpfulness.
GET
/
v1
/
google-play
/
apps
/
{app_id}
/
reviews
Get App Reviews
curl --request GET \
--url https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews",
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: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/google-play/apps/{app_id}/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"app_id": "<string>",
"sort": "<string>",
"result_count": 123,
"next_page_token": "<string>",
"reviews": [
{
"review_id": "<string>",
"user_name": "<string>",
"user_image": "<string>",
"score": 123,
"text": "<string>",
"thumbs_up": 123,
"review_created_version": "<string>",
"at_utc": 123,
"at": "<string>",
"reply_author": "<string>",
"reply_content": "<string>",
"replied_utc": 123,
"replied_at": "<string>"
}
]
}Paginated user reviews from Play’s own review RPC — up to 150 per page, with
developer replies where they exist. Play paginates by continuation token, not
by page number: pass the previous response’s
next_page_token as page_token.
Credits: 5
Authorization
string
required
Your ScrapeBadger API key.
Path Parameters
string
required
Android package id, e.g.
com.whatsapp.Query Parameters
string
default:"US"
Play storefront (
gl).string
default:"en"
Play content language (
hl) — reviews are returned in this language’s feed.string
default:"newest"
Review ordering:
newest, rating or helpfulness. Each returns a
measurably different first page.integer
default:"40"
Reviews per page,
1–150. Play silently truncates beyond 150, so the
ceiling is enforced rather than letting you pay for results that will not
arrive.string
Continuation token from a previous response’s
next_page_token.Response
string
string
The ordering used.
integer
Reviews in this page.
string
Pass as
page_token for the next page. null on the last page.Review[]
Example
curl "https://scrapebadger.com/v1/google-play/apps/com.whatsapp/reviews?sort=newest&count=40" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch(
"https://scrapebadger.com/v1/google-play/apps/com.whatsapp/reviews?" +
new URLSearchParams({ sort: "newest", count: "40" }),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const { reviews, next_page_token } = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/google-play/apps/com.whatsapp/reviews",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"sort": "newest", "count": 40},
)
page = res.json()
Response
{
"app_id": "com.whatsapp",
"sort": "newest",
"result_count": 40,
"next_page_token": "CpEBCo4BQU9xcFRPRXhhbXBsZVRva2VuQmFzZTY0",
"reviews": [
{
"review_id": "0f2c1a9e-5d31-4a77-9f0c-3b2a1e6d8c44",
"user_name": "Priya S.",
"user_image": "https://play-lh.googleusercontent.com/a/user=mo",
"score": 5,
"text": "Calls are clear even on a weak connection. The new sticker picker is great.",
"thumbs_up": 42,
"review_created_version": "2.26.16.72",
"at_utc": 1754956800.0,
"at": "2026-08-12T00:00:00Z",
"reply_author": null,
"reply_content": null,
"replied_utc": null,
"replied_at": null
},
{
"review_id": "b71d4e02-8c6a-4c19-a0f5-71d9e2f3c118",
"user_name": "Marco R.",
"score": 2,
"text": "Backups keep failing since the last update.",
"thumbs_up": 118,
"review_created_version": "2.26.16.72",
"at_utc": 1754870400.0,
"at": "2026-08-11T00:00:00Z",
"reply_author": "WhatsApp LLC",
"reply_content": "Sorry about that — please contact us in-app so we can look into it.",
"replied_utc": 1754884800.0,
"replied_at": "2026-08-11T04:00:00Z"
}
]
}
Reviews are per-language: the
en and de feeds for one app are different
review sets, not translations of one set.
