Google Play Reviews Scraper
Pricing
$0.12 / 1,000 google play reviews
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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
| Field | Type | Default | Description |
|---|---|---|---|
appIds | string array | none | Package IDs such as com.spotify.music. URLs also work here. |
appUrls | string array | none | Google Play details URLs. |
country | string | us | Two-letter Google Play storefront country. |
language | string | en | Two-letter review and store language. |
sort | enum | newest | newest, rating, or helpfulness. |
maxReviewsPerApp | integer | 100 | Maximum saved rows per app after filtering, up to 5,000. |
starRating | enum | all | all, or one value from 1 to 5. Numeric values are also accepted through the API. |
dateCutoff | string | none | Include reviews on or after this YYYY-MM-DD UTC date. |
includeAppMetadata | boolean | true | Add app summary fields to every review. |
requestsPerSecond | integer | 3 | Shared request limit from 1 to 10 requests per second. |
proxyConfiguration | object | disabled | Optional 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:
- Lower
requestsPerSecond. - Retry after the temporary block clears.
- 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.
| Code | Meaning |
|---|---|
BAD_INPUT | An app ID, URL, locale, filter, limit, or proxy setting is invalid. |
NOT_FOUND | The app is unavailable in the selected country. |
RATE_LIMITED | Google Play returned a rate limit after retries. |
BLOCKED | Google Play returned a captcha, consent wall, or access block. |
PARSE_ERROR | The Google Play response format changed unexpectedly. |
NETWORK | The request could not complete. |
NO_RESULTS | No 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 cinpm testnpm run smoke -- com.spotify.music 5npm 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.