App Store & Google Play Reviews Scraper
Pricing
from $0.50 / 1,000 reviews
App Store & Google Play Reviews Scraper
Scrape Apple App Store and Google Play reviews into one JSON schema. Only-new mode for scheduled monitoring, a clean stop at your budget, no browser.
Pricing
from $0.50 / 1,000 reviews
Rating
0.0
(0)
Developer
Beep Boop
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
π What does this App Store and Google Play reviews scraper do?
Collect Apple App Store reviews from apps.apple.com and Google Play reviews from play.google.com in one JSON schema. Use only-new mode for scheduled monitoring, or treat this as an App Store and Google Play reviews API alternative: it reads public review data over HTTP, requires no store login, and uses no browser. It stops cleanly at your run budget and runs at 256 MB by default.
Price: $0.0005 per review ($0.50 per 1,000) plus $0.00005 per run.
π‘ Use cases
- Track app ratings and store listing performance for ASO.
- Give support teams public reviewer names for reply workflows.
- Compare product feedback by
appVersionafter a release. - Send review text into sentiment analysis or an LLM pipeline.
- Monitor public reviews for competitor apps you are authorized to track.
- Run on an Apify schedule, through the API, with webhooks, or from an integration.
π How to scrape App Store and Google Play reviews
- Open the Actor's Input tab. Find the App Store ID at the end of a link such as
https://apps.apple.com/us/app/name/id324684580; find a Google Play package after?id=, such ascom.spotify.music. - Enter the apps, choose storefront countries, and choose a Google Play language if needed.
- Set
maxReviewsPerAppand the run's maximum cost in Run options. - Click Start. Review records appear in the Output tab; use the API tab to call the Actor programmatically.
- For monitoring, enable
onlyNewSinceLastRunand create a schedule. Keep its first run to establish the baseline.
βοΈ Input
See the Input tab for every option. Each input is one JSON object:
appStoreApps: App Store numeric IDs or supported App Store URLs.googlePlayApps: case-sensitive package names or Google Play URLs.countries: one or more two-letter storefront codes.language: Google Play language code such asenorpt-BR.maxReviewsPerApp: maximum newest reviews per app and country (and language on Google Play).onlyNewSinceLastRun: opt in to account-level review watermarks for monitoring.includeUserImage: opt in to Google Play avatar URLs, which are personal data.
{"appStoreApps": ["324684580"],"googlePlayApps": ["com.spotify.music"],"countries": ["us"],"maxReviewsPerApp": 100}
{"appStoreApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],"googlePlayApps": ["https://play.google.com/store/apps/details?id=com.spotify.music"],"countries": ["us", "gb"],"maxReviewsPerApp": 100}
{"appStoreApps": ["324684580", "389801252"],"googlePlayApps": ["com.spotify.music"],"countries": ["us", "gb", "de"],"maxReviewsPerApp": 200,"onlyNewSinceLastRun": true}
{"googlePlayApps": ["com.spotify.music"],"countries": ["br"],"language": "pt-BR","maxReviewsPerApp": 50}
The country inside an App Store URL is ignored; countries controls the storefront. Google Play package names are case-sensitive. language applies only to Google Play. Invalid input fails before any request, with a message that identifies what to fix, for example Provide at least one app in appStoreApps or googlePlayApps, Invalid country "usa": use a two-letter storefront code such as "us", or maxReviewsPerApp must be a whole number of at least 1.
π¦ Output
The default dataset contains one item per review. Download it as JSON, CSV, Excel, or HTML, or read it through the API. Fields a store does not provide are null, never empty strings. These two records preserve real key order and value types; personal text, names, IDs, and the Play review URL have been anonymized.
[{"store": "apple","appId": "324684580","country": "us","reviewId": "00000000001","author": "Example Reviewer","rating": 1,"title": "Example playlist review","text": "Example review text about using the app.","date": "2026-10-02T17:05:19Z","appVersion": "9.1.88","helpfulVotes": 0,"developerReply": null,"reviewUrl": null,"scrapedAt": "2026-10-03T19:17:29.695Z"},{"store": "google-play","appId": "com.spotify.music","country": "us","reviewId": "00000000-0000-4000-8000-000000000002","author": "Example Reviewer","rating": 1,"title": null,"text": "Example review text about using the app.","date": "2026-10-02T18:35:24.212Z","appVersion": "9.0.82.1032","helpfulVotes": 0,"developerReply": {"text": "Thanks for sharing your feedback.","date": "2026-10-02T19:07:45.423Z"},"reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=00000000-0000-4000-8000-000000000002","scrapedAt": "2026-10-03T19:17:30.259Z"}]
The Output tab also links RUN_SUMMARY, which contains five top-level keys: itemsPushed is the delivered review count; budgetReached says whether the run stopped at its spending limit; completed lists jobs and stop reasons; failed lists jobs with sanitized error details; and skipped lists jobs not started after a budget stop. This anonymized shape came from a real partial-failure run:
{"itemsPushed": 5,"budgetReached": false,"completed": [{"label": "apple 324684580/us","store": "apple","appId": "324684580","country": "us","stopReason": "max-reviews","itemsPushed": 5}],"failed": [{"label": "apple 324684580/zz","store": "apple","appId": "324684580","country": "zz","itemsPushed": 0,"error": {"message": "apple 324684580/zz page 1: Unknown Apple storefront country \"zz\"","status": 400,"attempts": 1}}],"skipped": []}
π What data does it extract?
| Field | Type | App Store | Google Play | Description |
|---|---|---|---|---|
store | string | apple | google-play | Review source. |
appId | string | Numeric app ID | Package name | App requested. |
country | string | Storefront | Storefront | Two-letter storefront code. |
reviewId | string | Review ID | Review ID | Store's identifier for the review. |
author | string or null | Public name | Public name | Reviewer's public display name. |
rating | integer | 1β5 stars | 1β5 stars | Star rating. |
title | string or null | Available | null | App Store title; Google Play has no title field. |
text | string or null | Review body | Review body | Public review text. |
date | string | UTC ISO 8601 | UTC ISO 8601 | Posted or last-edited date. |
appVersion | string or null | When supplied | When supplied | Version the reviewer used. |
helpfulVotes | integer or null | Feed vote sum | Helpful count | Store-provided helpful votes. |
developerReply | object or null | null | Reply or null | Public Google Play reply text and date. |
reviewUrl | string or null | null | Review link | Per-review link when Google Play supplies one. |
userImage | string or null | null | Opt-in avatar URL | Present only when includeUserImage is enabled. |
scrapedAt | string | UTC ISO 8601 | UTC ISO 8601 | Fetch time; with reviewUrl, a provenance field. |
π° How much does it cost to scrape app reviews?
This Actor uses pay-per-event pricing: $0.0005 per review through the default dataset-item event plus Apify's $0.00005 start fee, charged once per run. The Actor is capped at 1 GB and never runs above it, so there is no separate charge for the compute a run uses.
Maximum run cost = $0.00005 + $0.0005 Γ reviews, where reviews are at most (App Store apps Γ countries Γ min(maxReviewsPerApp, 500)) + (Google Play apps Γ countries Γ maxReviewsPerApp).
| Example | Maximum reviews | Maximum event cost |
|---|---|---|
Prefill: 1 App Store app + 1 Google Play app, us, 20 each | 40 | $0.02005 |
3 App Store apps + 2 Google Play apps, us and gb, 100 each | 1,000 | $0.50005 |
1 App Store app, 5 countries, maxReviewsPerApp 1000; Apple caps at 500 per country | 2,500 | $1.25005 |
| Daily only-new schedule: 5 apps Γ 2 countries Γ about 10 new reviews per day | About 3,000 per month | About $1.50 per month plus $0.0015 in start fees |
Set the maximum cost for each run in Run options (maxTotalChargeUsd through the API). The Actor stops before going over; the run still ends SUCCEEDED with Stopped at the charge limit after N reviews. The start fee counts toward the limit, so a $0.01 limit allows up to 19 reviews: floor((0.01 β 0.00005) / 0.0005). In only-new mode, scheduled runs are charged for reviews no earlier run delivered. A budget stop or a failed app does not cause repeats, unless the state store itself fails: the next run skips the reviews already delivered. If the state store keeps failing, that app's job fails with a message that says how many reviews were delivered and billed. Progress is saved after every delivered page, so an aborted, timed-out or migrated run repeats at most the page it was writing; those reviews, and edited reviews that return as new, are charged again.
πΈ Only-new monitoring vs re-scraping: monthly cost
A scraper without only-new mode has to re-download a window of the newest reviews on every run and leave the de-duplication to you. With only-new mode you pay for reviews no earlier run delivered, plus any re-deliveries described in How only-new monitoring works.
Example: 5 apps Γ 2 countries checked daily, about 10 new reviews per app and country per day.
| Approach | Reviews charged per month | Review cost per month |
|---|---|---|
| This Actor, only-new mode | About 3,000 | About $1.50 |
| Re-scrape the newest 100 per app and country daily at $0.10 per 1,000 | About 30,000 | About $3.00, plus your own de-duplication |
| Re-scrape the newest 50 per app and country daily at $0.10 per 1,000 | About 15,000 | About $1.50, plus your own de-duplication, and busy days can overflow the window |
Only-new mode costs less once you would otherwise re-scrape more than about 50 reviews per app and country per run, and it removes the overlap between runs for you. Duplicates are rare; they can follow an aborted, timed-out or migrated run (at most the page it was writing), an edited review, or several countries that share one Google Play language (see How only-new monitoring works and Limits and known gaps). For one-off exports, leave the mode off.
π How only-new monitoring works
The first run delivers up to maxReviewsPerApp newest reviews for each app and country as a baseline. Later runs deliver reviews that no earlier run of this Actor delivered.
- If a run stops at its charge limit or an app fails partway, the Actor remembers which of that app's reviews it already delivered. The next run skips them and continues with the reviews still owed, so a schedule that hits its budget every run keeps moving forward instead of paying for the same reviews again. The record is saved after every delivered page and again when the platform asks the Actor to save its state (a graceful abort or a migration), so a run that is aborted, times out or is migrated repeats at most the page it was writing when it stopped. After a budget stop or a failed app, no review that was already delivered is delivered again and none of the undelivered ones within the Actor's reach are dropped, unless the state store itself fails.
- If more new reviews arrive than
maxReviewsPerApp, the newest are delivered and the rest are skipped for good. The App Store's 500-per-country feed limit has the same effect, so schedule often enough. - Edited reviews can return as new because newness is based on review date.
- State lives in
app-review-monitor-state, in your account, with one record per app and country (and language for Google Play), plus a.pendingrecord while an app's reviews are only partly delivered. Records store only dates and review IDs. Every task and schedule for this Actor in your account shares that state; parallel runs are last-write-wins. - To start over, delete an app's records (its
.pendingrecord too, if there is one) or the whole store in Console Storage. A damaged record fails that app and names the record to delete. - Leave the mode off for one-time exports.
β οΈ Limits and known gaps
- The App Store feed returns only the 500 newest reviews per country (pages 1β10 of 50). It cannot backfill older history.
- App Store records have no per-review link, developer reply, or avatar. Google Play records have no title.
- Google Play serves reviews by language. In a measured Spotify sample, US and GB with
enreturned 20 of 20 identical reviews. Each country copy is delivered and charged; use one country per language when you want to avoid duplicates. - An unknown app ID or an app with no reviews may return no items with a
returned no reviewswarning instead of an error.helpfulVoteson the App Store is the vote sum reported by its feed. - Google Play reviews come through an unofficial endpoint of the Play website. A change there can interrupt runs until an update ships. A rare platform migration restarts a run: without
onlyNewSinceLastRun, reviews delivered before the migration are delivered and charged again; with it, at most the page in flight repeats.
π οΈ Troubleshooting
When one app fails, the run can still end SUCCEEDED. The status message identifies the failed app, RUN_SUMMARY on the Output tab lists its sanitized error, and reviews already delivered remain delivered and charged. Failure details are never added to the dataset because every dataset item is billed. The run ends FAILED when every app job fails, or when input is invalid before a request.
A live partial-failure run returned five US reviews and reported:
Finished: 5 reviews from 2 app/country jobs. Failed 1 of 2: apple 324684580/zz (HTTP 400). See RUN_SUMMARY for details.
HTTP 429, HTTP 5xx, network errors, and timeouts are retried for at most 4 attempts total with exponential backoff waits of 1, 2, and 4 seconds. Each request has a 20-second timeout, and requests are spaced at least 500 ms apart. HTTP 400 unknown storefronts, other permanent 4xx errors, invalid IDs, and malformed responses fail without a retry. Errors include the store, app, country, page, and HTTP status when available.
returned no reviews: check the app ID or package and storefront; there may be no reviews there. Rerun if the source returned a transient empty first page.Stopped at the charge limit: raise the run's maximum cost.- An only-new run with no items may have nothing new to deliver; this is expected.
- For a damaged only-new state record, delete the named record in Console Storage.
- Use the Issues tab to report a problem.
β FAQ
Can I scrape App Store and Google Play reviews in one run?
Yes. Put App Store IDs or URLs in appStoreApps and Google Play packages or URLs in googlePlayApps. Both stores come back in the same JSON schema, so one dataset covers both.
How do I get only new app reviews since the last run?
Enable onlyNewSinceLastRun and run the Actor on a schedule. The first run sets the baseline; later runs deliver reviews no earlier run delivered. After a budget stop or a failed app, the next run continues where it stopped. An aborted, timed-out or migrated run can repeat at most the page it was writing, and edited reviews can return as new; see How only-new monitoring works.
Do I need a login, API key, or proxy?
No. The Actor reads public review data without a store login or developer API key, and it needed no proxy in tests on the Apify platform.
How many reviews can I get per app?
Up to maxReviewsPerApp newest reviews per app and country (and language on Google Play). The App Store feed stops at the 500 newest reviews per country.
Can I filter reviews by star rating?
Not in the input yet. Every record has a rating field from 1 to 5, so filter the dataset in your export, spreadsheet, or integration.
How do I cap what a run can cost?
Set the maximum cost per run in Run options, or maxTotalChargeUsd through the API. The Actor stops before the limit and the run still ends SUCCEEDED.
Can I call it from Python, Node.js, or an AI agent?
Yes. Use the API tab for ready-made calls, the Apify client libraries for Python and JavaScript, or Apify's MCP server to let an AI agent run it.
Can I export app reviews to CSV or Excel?
Yes. Download the dataset as JSON, CSV, Excel, or HTML from the Output tab, or read it through the API.
π Data use and GDPR
This Actor reads public App Store and Google Play reviews and does not extract private data such as email addresses, gender, or location. Results can still contain personal data. Do not collect or process personal data unless you have a legitimate reason; consult your lawyer if you are unsure. Usernames are included because they support review-reply workflows. Avatar URLs are collected only when includeUserImage is enabled. App Store reviewer profile links are never collected. Only-new state stores dates and review IDs. Dataset retention follows your Apify plan; the named state store remains in your account until you delete it.
π Changelog
0.1 update (2026-10-03)
- Only-new mode remembers the reviews a run delivered before it stopped at its charge limit or lost an app to an error, so the next run continues instead of charging them again.
- Invalid input ends the run FAILED with the input error as its status message.
0.1 (2026-10-03)
- Added App Store and Google Play reviews in one schema.
- Added only-new monitoring and a clean stop at the run budget.
- Added per-app failure isolation with
RUN_SUMMARYand bounded retries with request timeouts.