Google Play Reviews Scraper - App Reviews by Country avatar

Google Play Reviews Scraper - App Reviews by Country

Pricing

from $0.09 / 1,000 google play reviews

Go to Apify Store
Google Play Reviews Scraper - App Reviews by Country

Google Play Reviews Scraper - App Reviews by Country

Get Google Play reviews for any app, by app ID or URL. Each store has its own reviews, in the language people wrote them. The German listing is not a translated American one. Pick any country and language. Filter by star and by date. Up to 5,000 per app. $0.09 per 1,000 reviews.

Pricing

from $0.09 / 1,000 google play reviews

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

a day ago

Last modified

Share

Google Play Reviews Scraper: reviews for any app, from any storefront, no key

Give it Android package IDs like com.spotify.music, or paste Play Store links, and it pages through that storefront's reviews and writes one row each: star score, text, reviewer, date, thumbs up, the app version reviewed, and the developer's reply when there is one. Filter by star rating and by date, and attach the app's own details to every row.

The thing to know before a long run: one bad app ID stops everything. If a single entry in your list will not parse, the run writes one BAD_INPUT row and scrapes nothing at all, rather than doing the other nine apps. Check the list first.

InputAndroid package IDs, Play Store links, or both
OutputOne row per review
Ceiling5,000 reviews per app, and 100 pages of paging
Account neededNone. No Google account, no Play Console
Price$0.09 per 1,000 reviews, flat on every plan

đŸ›ïž What Google Play Reviews Scraper does

Every Google Play storefront holds its own reviews, in whatever language people wrote them. The German listing is not a translated American one. So you name the storefront with country, the language with language, and you get what that store actually shows.

It pages through the reviews for each app until it has the number you asked for, your date cutoff is crossed, or Google runs out. starRating keeps one rating band. dateCutoff keeps reviews on or after a date. With includeAppMetadata on, one extra lookup per app attaches the title, developer, score, install band, genre, version, icon and price to every review row.

đŸ“„ What you give it

{
"appIds": ["com.spotify.music", "com.whatsapp"],
"country": "us",
"language": "en",
"sort": "newest",
"maxReviewsPerApp": 500,
"starRating": "1",
"dateCutoff": "2026-01-01",
"includeAppMetadata": true
}
FieldDefaultWhat it is
appIdsbox starts at com.spotify.musicPackage IDs, one per line. Play Store links are accepted here too.
appUrlsnonePlay Store details links. Merged with appIds and deduplicated.
countryusTwo-letter storefront code. de, jp, br and the rest.
languageenTwo-letter language for the reviews and the store text.
sortnewestnewest, rating or helpfulness.
starRatingallall, or one value from 1 to 5.
dateCutoffnoneKeep reviews on or after this YYYY-MM-DD UTC date.
maxReviewsPerApp100Rows kept per app after filtering, up to 5,000.
includeAppMetadataonOne extra lookup per app, attaching its details to every review row.
requestsPerSecond3Shared request rate, 1 to 10. Lower it if a big run starts getting refused.
proxyConfigurationoffOptional. Your own servers, if you have a reason to use them.

Nothing is required. An empty run finishes with one row marked _sample: true so you can see the shape, and that row is not charged as a review.

đŸ“€ What you get back

A real review row from a recent run, with the long image links cut short:

{
"ok": true,
"_sample": false,
"appId": "com.spotify.music",
"appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us",
"appTitle": "Spotify: Music and Podcasts",
"appDeveloper": "Spotify AB",
"appScore": 4.3461704,
"appRatings": 36333539,
"appReviewCount": 1853008,
"appInstalls": "1,000,000,000+",
"appMinInstalls": 1000000000,
"appGenre": "Music & Audio",
"appVersion": "VARY",
"appUpdated": "2026-09-18T07:51:07.000Z",
"appIcon": "https://play-lh.googleusercontent.com/IzQgYCcnCFCD08GR-3bdtcT8xz...",
"appPriceText": "Free",
"appContentRating": "Teen",
"reviewId": "83d77596-5f69-4723-9702-b87c370328ea",
"reviewUrl": null,
"userName": "Onwuka Kaiser",
"date": "2026-09-19T07:02:26.842Z",
"score": 5,
"scoreText": null,
"title": null,
"text": "the greatest music app I've ever used",
"thumbsUp": 0,
"version": "9.1.80.2221",
"replyDate": null,
"replyText": null,
"criterias": [],
"country": "us",
"language": "en",
"sort": "newest"
}
FieldWhat it is
score, textThe star rating and the review body. Most Play reviews have no title, so it is usually null.
dateISO timestamp. Google Play gives a real date here, not a relative string.
replyText, replyDateThe developer's public reply, null when there is none.
versionThe app version that reviewer was on, when Google records it.
thumbsUpReads 0 when Google leaves the count out, so a real zero and a missing value look the same. text behaves the same way with an empty string.
app* fieldsOnly filled when includeAppMetadata is on. appTitle is null otherwise.
criteriasGoogle's per-category ratings for the app, an empty array on most reviews.

đŸ§Ÿ Reading the output

RowHow to spot itCharged
A reviewok: true and _sample: falseyes
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno
CodeWhat it means
BAD_INPUTAn app ID, link, country, language, filter or limit is not valid. The whole run stops here.
NOT_FOUNDThat app is not available in the country you asked for.
NO_RESULTSNothing matched that app, storefront and filter combination.
RATE_LIMITEDGoogle Play throttled the run after retries. Lower requestsPerSecond and try again.
BLOCKEDGoogle Play answered with a consent or access wall instead of reviews.
PARSE_ERRORThe response came back in a shape the parser did not expect.
NETWORKThe request could not complete.

Apart from BAD_INPUT, one app failing does not stop the others. If paging breaks partway, the rows already collected are kept and the diagnostic carries partial: true with how many came back. The Overview table does not show errorCode, so read the dataset as JSON when a run looks empty.

▶ How to run it

  1. Open Google Play Reviews Scraper and click Try for free.
  2. Put your package IDs into App IDs, one per line, replacing the example.
  3. Set Country and Language for the storefront you want.
  4. Set Maximum reviews per app, add a Star filter or Reviews on or after date if you need one, then click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.09 per 1,000 reviews, which is $0.00009 each. The same rate on every Apify plan, no volume tiers.

Rows are saved in page-sized batches and only charged once the batch is safely stored.

Not charged as reviews: the sample row, every diagnostic row, duplicates, and the reviews your star or date filter threw out. You pay for rows that reach your dataset.

💡 What people use it for

  • Watching the 1-star reviews on your own app across a few countries, on a daily schedule.
  • Pulling every review since a release date with dateCutoff, to see what the update actually changed.
  • Reading a category's apps side by side, with includeAppMetadata giving you score and install band on the same row.
  • Feeding review text into your own tagging or sentiment work, with version already attached.

🚧 What it does not do

  • One bad app ID stops the whole run. It writes a single BAD_INPUT row and scrapes nothing.
  • One storefront per run. country and language apply to everything in the list. Run it again for another market.
  • 5,000 reviews per app, and a hard stop at 100 pages. Split a bigger job by dateCutoff or by sort order.
  • maxReviewsPerApp counts rows kept, not rows read. Filtering to 1-star reviews on a well-reviewed app burns a lot of pages, and the 100-page stop can arrive before your quota does.
  • sort changes when it can stop early. With newest and a dateCutoff it stops as soon as a page crosses the date. With rating or helpfulness it cannot, so it keeps paging.
  • If the app's details page cannot be found in that country, the app is skipped, even where reviews might exist. Try another country, or turn includeAppMetadata off.
  • A missing thumbsUp reads as 0 and missing text as an empty string, so you cannot tell those apart from real values.
  • No official API exists for this data. Pages and formats change, and when they do you get a diagnostic row rather than a failed run.

🧭 Which Google scraper do you need?

If you wantUse
Reviews for an Android appThis one
The app listings themselves, by keyword or categoryGoogle Play Apps Scraper
Reviews for a business on Google MapsGoogle Maps Reviews Scraper
Reviews with drafted replies, on a scheduleGoogle Reviews Monitor
The web results page for a keywordGoogle Search Results Scraper

❓ Questions people ask

Do I need a Google account or Play Console access? No. These are public store pages.

Can I get every review an app has? Up to 5,000 per app per run, and paging stops at 100 pages. For more, split the job by date with dateCutoff.

Why are the reviews in a language I did not ask for? Because that is how people wrote them. language picks the storefront's language, not a translation.

Can I scrape several countries at once? Not in one run. country is per run, so schedule one per market.

Does starRating cost me for the reviews it throws away? No. You are charged for rows that land in your dataset.

Is scraping Google Play legal? These are public listings and public reviews. Reviews carry personal data, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers. Not affiliated with Google.

🆘 If something breaks

Open the Issues tab on the actor page. Send the app ID, the country and the run ID. The errorCode on the diagnostic row usually names the problem on its own.