Google Play Reviews Scraper avatar

Google Play Reviews Scraper

Pricing

$0.12 / 1,000 google play reviews

Go to Apify Store
Google Play Reviews Scraper

Google Play Reviews Scraper

Scrape Google Play reviews by app ID or URL. Paginate, deduplicate, filter by stars or date, choose sort order and locale, and add app metadata. Direct requests by default with optional proxy fallback.

Pricing

$0.12 / 1,000 google play reviews

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Fetch public Google Play reviews by Android package ID or Google Play app URL. The actor paginates through review pages, removes duplicate review IDs, applies optional star and date filters, and saves one structured dataset row per successful review.

No API key, login, cookies, or proxy are required for normal runs.

Features

  • Accepts Android package IDs, Google Play app URLs, or both.
  • Supports country and language localization.
  • Sorts by newest, rating, or helpfulness.
  • Returns up to 5,000 matching reviews per app.
  • Filters by one star rating and an inclusive UTC date cutoff.
  • Deduplicates review IDs across every pagination page.
  • Adds useful app metadata to each review with one extra lookup per app.
  • Uses conservative shared throttling and retries.
  • Uses direct requests by default to avoid unnecessary proxy costs.
  • Supports optional Apify or custom proxy fallback.
  • Returns clear, uncharged diagnostics instead of failing the run.
  • Returns one labeled, uncharged sample row when the input is empty.

Input

FieldTypeDefaultDescription
appIdsstring arraynonePackage IDs such as com.spotify.music. URLs also work here.
appUrlsstring arraynoneGoogle Play details URLs.
countrystringusTwo-letter Google Play storefront country.
languagestringenTwo-letter review and store language.
sortenumnewestnewest, rating, or helpfulness.
maxReviewsPerAppinteger100Maximum saved rows per app after filtering, up to 5,000.
starRatingenumallall, or one value from 1 to 5. Numeric values are also accepted through the API.
dateCutoffstringnoneInclude reviews on or after this YYYY-MM-DD UTC date.
includeAppMetadatabooleantrueAdd app summary fields to every review.
requestsPerSecondinteger3Shared request limit from 1 to 10 requests per second.
proxyConfigurationobjectdisabledOptional Apify or custom proxy fallback.

At least one real app ID or URL is needed for live data. The schema intentionally has no required fields so an empty automated test run succeeds with one _sample: true row.

Example input

{
"appIds": [
"com.spotify.music",
"https://play.google.com/store/apps/details?id=com.whatsapp"
],
"country": "us",
"language": "en",
"sort": "newest",
"maxReviewsPerApp": 500,
"starRating": 1,
"dateCutoff": "2026-01-01",
"includeAppMetadata": true,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Output

Each real dataset row represents one unique review:

{
"ok": true,
"_sample": false,
"appId": "com.spotify.music",
"appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music",
"appTitle": "Spotify: Music and Podcasts",
"appSummary": "Listen to songs, discover music and enjoy podcasts",
"appDeveloper": "Spotify AB",
"appScore": 4.3,
"appRatings": 33000000,
"appReviewCount": 8000000,
"appInstalls": "1,000,000,000+",
"appMinInstalls": 1000000000,
"appGenre": "Music & Audio",
"appVersion": "Varies with device",
"appUpdated": "2026-07-20T00:00:00.000Z",
"appIcon": "https://play-lh.googleusercontent.com/...",
"appPriceText": "Free",
"appContentRating": "Teen",
"reviewId": "gp:...",
"reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=...",
"userName": "Reviewer",
"userImage": "https://play-lh.googleusercontent.com/...",
"date": "2026-07-24T16:10:00.000Z",
"score": 5,
"scoreText": "5",
"title": null,
"text": "The review text.",
"thumbsUp": 12,
"version": "9.0.0",
"replyDate": null,
"replyText": null,
"criterias": [],
"country": "us",
"language": "en",
"sort": "newest"
}

Google Play may omit individual fields. Missing values are returned as null, an empty array, or an empty string where appropriate.

Filtering and pagination

maxReviewsPerApp is the number of rows saved after filters and deduplication. The actor continues through pagination pages until it reaches that limit, Google Play has no more pages, or a safety limit of 100 pages is reached.

With sort: "newest" and a dateCutoff, the actor stops once a page crosses the cutoff because all later pages are older. With rating or helpfulness sorting, it keeps paginating because later pages can still contain dates that match.

Pricing and billing

The intended Store price is $0.00012 per successful review, below the current comparison price of $0.00015 per review.

The actor writes accepted reviews in page-sized batches. Only after a batch is successfully saved does it charge the review event for those rows. These rows are never charged:

  • Empty-input sample rows.
  • Invalid-input diagnostics.
  • Not-found, blocked, rate-limited, network, parsing, and no-results diagnostics.
  • Duplicate reviews.
  • Reviews rejected by the star or date filter.

The direct-request default avoids residential proxy charges. At the intended price, enabling residential proxies can make small or heavily filtered runs unprofitable, so proxy use should remain an explicit fallback for blocked high-volume runs.

Proxy guidance

Google Play normally works without a proxy. Start with the default direct connection and the default request rate. If a high-volume run receives RATE_LIMITED or BLOCKED diagnostics:

  1. Lower requestsPerSecond.
  2. Retry after the temporary block clears.
  3. Enable an Apify proxy only when direct requests remain blocked.

Country-specific data is primarily selected by the country input. A proxy can also affect regional availability, so use a matching proxy country when strict geolocation is required.

Diagnostics

Errors and empty results exit successfully with an uncharged dataset row where ok is false. Check errorCode, error, and details.

CodeMeaning
BAD_INPUTAn app ID, URL, locale, filter, limit, or proxy setting is invalid.
NOT_FOUNDThe app is unavailable in the selected country.
RATE_LIMITEDGoogle Play returned a rate limit after retries.
BLOCKEDGoogle Play returned a captcha, consent wall, or access block.
PARSE_ERRORThe Google Play response format changed unexpectedly.
NETWORKThe request could not complete.
NO_RESULTSNo reviews matched the app, locale, and filters.

One app failure does not stop the remaining app IDs. If a later pagination page fails, the actor keeps earlier successful rows and adds an uncharged diagnostic with partial: true.

Development

npm ci
npm test
npm run smoke -- com.spotify.music 5
npm start

The smoke command uses a real public Google Play app and does not use Apify billing or deploy anything. Running npm start with empty local input writes one labeled sample row.

Data source

This actor uses the actively maintained @mradex77/google-play-scraper package, which provides typed errors, retries, throttling, pagination, and daily live contract tests against Google Play. Google Play has no official public API for review data, so public page and internal endpoint formats can still change.

This actor is not affiliated with Google. Use public data responsibly and comply with applicable terms and laws.