App Store and Google Play Reviews Scraper

CleanScrape · @cleanscrape

App Store and Google Play reviews in one table, with ratings, text, dates and app versions, plus daily alerts for new low ratings.

About

Collect public reviews from the Apple App Store and Google Play in one consistent dataset. Each row has the review text, rating, date, app version and store, so you can compare iPhone and Android feedback in one spreadsheet.

Use one app per store and one country per run. No store login, cookies or proxy setup is needed. Reviews come from what each store shows publicly, so coverage depends on the store. This is an independent tool, maintained by CleanScrape.

Start with a small run

  1. The form opens with Strava's Google Play and App Store links. Keep them to try the Actor, or paste the apps you want to research. You can also type just the app's name, such as Duolingo.
  2. Choose Store: Both, Google Play or App Store.
  3. Pick a Country and, for Google Play, a Language.
  4. Set Reviews per store. The form starts at 20. With Both, the limit applies to each store, so 20 can return up to 40 reviews.
  5. Start the run, open its dataset, and download CSV, Excel or JSON.

More options holds the Google Play order and two optional filters: Star ratings (for example only 1 and 2 stars) and Reviews since (a start date). You do not need them for a first run.

Example: compare Strava reviews on iPhone and Android

Say you want to know what runners and cyclists complain about in Strava, and whether iPhone and Android users raise the same issues. The form's default input collects up to 20 recent US reviews from each store.

To read only the complaints, select 1 star and 2 stars under Star ratings, or filter the export in your spreadsheet. Keep the store column to compare iPhone and Android side by side. The Actor does not do sentiment analysis.

Three rows from a run on 1 October 2026:

StoreRatingReviewDate (UTC)App version
google_play1does not work offline2026-10-01 13:50:30482.12
app_store1Connection issue: Strava keeps disconnecting from my apple watch2026-10-01 00:06:13483.0.0
app_store4Great: Great just some of the numbers change slightly between apple workout and Strava when importing recordings2026-09-30 00:09:16482.0.0

Your rows will differ because reviews keep coming in. For Apple, the review title is a separate column; it is shown before the colon here.

Choose a store

You wantWhat to enter
Google Play reviewsSelect Google Play and fill in Google Play app.
App Store reviewsSelect App Store and fill in App Store app.
Both storesSelect Both and fill in both fields, or type the app's name once.

Each field takes a store link, an ID or a name:

You enterRead as
play.google.com/store/apps/details?id=com.strava or com.stravaThat Google Play app
apps.apple.com/us/app/strava-run-bike-walk/id426826309, id426826309 or 426826309That App Store app
StravaThe app whose store name starts with the words you typed (spaces are ignored, so tik tok finds TikTok). The run report shows which app was used

A link pasted into the other store's field is still used for its own store. If no app's name matches the words you typed, the run says so instead of guessing; paste the link in that case. The selected Country decides which store country is read, even if an App Store link contains another country. Choose the country by name in the form. For API requests, use a two-letter code such as us, gb or de; uk is read as gb. Reviews are not translated.

For an Apple-only API request:

{
  "store": "app_store",
  "appStoreId": "https://apps.apple.com/us/app/strava-run-bike-walk/id426826309",
  "country": "us",
  "maxReviews": 5
}

For Google Play only:

{
  "store": "google_play",
  "googlePlayAppId": "https://play.google.com/store/apps/details?id=com.strava",
  "country": "us",
  "language": "en",
  "maxReviews": 5
}

In API requests, maxReviews defaults to 200 per store when you leave it out. The form's value of 20 only applies in the form.

Input reference

FieldAPI defaultMeaning
storebothboth, google_play or app_store
googlePlayAppIdNoneGoogle Play link, package name or app name
appStoreIdNoneApp Store link, app number or app name
countryusStorefront country for both stores
languageenGoogle Play language parameter
maxReviews200Upper limit per selected store
sortnewestGoogle Play: newest, rating or helpfulness (shown as Most relevant)
ratingsall fiveStar ratings to keep, for example ["1", "2"]
reviewsSinceNoneKeep reviews dated on or after this day, YYYY-MM-DD (UTC), or from a period back from the start of the run: 7 days, 2 weeks, 1 month
watchNameNoneSave only reviews that earlier runs with this name did not return (for scheduled alerts)

The rating and date filters apply to the reviews collected within maxReviews per store, so a filtered run can return fewer rows. Reviews without a date are left out when reviewsSince is set. The run's message and report say how many of the checked reviews matched; raise maxReviews to check more. Most relevant uses Google Play's own relevance order, not a ranking by helpful votes. Apple always uses its most-recent feed. With both, a store without an app is marked skipped. A run with no app at all ends without reviews and with a message explaining what to fix.

Output reference

One dataset item is one review. Both stores use the same fields; values a store does not provide stay null.

FieldMeaning
sourcegoogle_play or app_store
appIdResolved app identifier, also when you entered an app-page URL
reviewIdSource review identifier, when available
userNamePublic reviewer display name
ratingStar rating, usually 1-5
titleApple review title; null for Google Play
textReview text
dateUTC time: Google Play review time, or Apple's review update time
thumbsUpHelpful votes shown by the source
appVersionApp version the review was written for
developerReplyGoogle Play reply text when available; null for Apple
developerReplyDateGoogle Play reply time in UTC; null for Apple
countryRequested storefront, not the reviewer's verified location
languageRequested Google Play language, not the detected text language; null for Apple
urlApp listing URL, not a link to the review

Google Play does not provide review titles through this source. Apple's public feed does not include developer replies or a review language. Apple's update time is not guaranteed to be the original posting date. The run report records when the data was collected.

Illustrative Apple record with made-up review content:

{
  "source": "app_store",
  "appId": "426826309",
  "reviewId": "example-review-id",
  "userName": "Example reviewer",
  "rating": 4,
  "title": "Useful app",
  "text": "Illustrative feedback, not an actual customer review.",
  "date": "2026-09-13T13:25:48+00:00",
  "thumbsUp": 0,
  "appVersion": "1.0",
  "developerReply": null,
  "developerReplyDate": null,
  "country": "us",
  "language": null,
  "url": "https://apps.apple.com/us/app/id426826309"
}

Run report and limits

RUN_REPORT (JSON) in the run's key-value store gives the status of each store. Each selected store is marked:

  • ok: reviews were returned without a detected error
  • empty: no reviews and no detected request error
  • partial: some reviews, then a request or paging problem
  • failed: a request error and no reviews
  • skipped: no app was given for that store

ok means the bounded collection finished without an error. It does not mean every historical review was collected. Results from a working store are kept when the other store fails. If every attempted store fails, the run ends with nothing collected, says why, and RUN_REPORT has hasErrors: true. If the app doesn't exist in the chosen store and country, the run ends normally with no reviews and says so.

Apple's feed covers about the 500 most recent reviews per app and country (ten pages). Google Play can go further back, but complete history is not guaranteed. Reviews can be edited or removed between runs.

When Apple returns an empty feed, the Actor checks Apple's alternative feed for the same app, country and page, then Apple's app record. An app that is not sold in that country gets a plain error; an app with fewer than 50 ratings there is reported as returning no written reviews from that feed (Apple's feed holds written reviews only); for a popular app the run says the reviews could not be confirmed and suggests trying again. It does not switch countries. When Google Play returns nothing, the Actor checks that the app exists and tells you if the link, ID or country looks wrong. Retry waits requested by the store are respected.

Daily alert for new 1- and 2-star reviews

Get each day's new complaints about your app, or a competitor's, without reading every review:

  1. Enter the app, keep Both stores or pick one, and choose 1 and 2 under Star ratings.
  2. Give the check a watch name, for example chatgpt-complaints. Each run then saves only reviews that earlier runs with this name did not return.
  3. Add a daily schedule with this input on Bytewells, and read each run's dataset from the API or your automation tool.
{
  "store": "both",
  "googlePlayAppId": "com.openai.chatgpt",
  "appStoreId": "id6448311069",
  "country": "us",
  "maxReviews": 200,
  "ratings": ["1", "2"],
  "watchName": "chatgpt-complaints"
}

The first run saves the low ratings among the newest reviews; after that you get only new ones, and the run message says how many were new. A watch works better than a date filter here: both stores publish reviews about a day after they are written, so a "past 24 hours" window misses the late ones, while the watch remembers which reviews it has already returned. The list is kept in your own Bytewells account.

Keep Reviews per store above the number of reviews the app gets in a day (200 covers most apps).

Pricing

$12 a month to rent it, after a 7-day free trial. Cancel at any time; access runs to the end of the month you paid for.

Runs use compute, paid from your Bytewells credit at Bytewells' rates, separately from the rental. No proxy is used. In tests on Bytewells, 40 reviews from both stores used $0.0004 of credit, 500 App Store reviews $0.0003, and 600 reviews from the past week $0.0004.

There is no charge per review and no start fee per run, so daily alerts for several apps cost the same rental.

API and recurring exports

The Actor runs through the Bytewells API, which works with Apify's API clients: point the client's base URL at Bytewells (see Bytewells docs) and call cleanscrape/app-store-reviews-scraper with an input from the examples above. Keep your API token in an environment variable or secrets manager.

For recurring imports, (source, appId, country, reviewId) works as a key when reviewId exists. Update edited reviews rather than appending duplicates. Without a watch name, the Actor does not keep history between runs; it never sends notifications itself.

If a run is restarted, reviews already saved are kept and are not exported again.

Public reviews can contain personal information. Check the source terms and your own obligations before sharing the data, and limit who can access it.

Common questions

Is there an API for App Store and Google Play reviews?

Apple and Google only give app owners access to reviews of their own apps. This Actor reads the public reviews of any app and returns the same columns for both stores. You can run it from the Bytewells API or on a schedule.

How do I export Google Play or App Store reviews to Excel or CSV?

Paste the app's store link, run the Actor, then download the run's dataset as CSV, Excel or JSON. With Both, iPhone and Android reviews end up in one table with a store column.

How many reviews can I get?

Apple's public feed covers about the 500 most recent reviews per app and country. Google Play can go further back, but the full history is not guaranteed.

Can I get only 1-star reviews, or only recent ones?

Yes. Choose the star ratings you want and set Reviews since to a date, or to a period such as 7 days. The filters apply to the reviews collected, so a filtered run can return fewer rows.

What does a run cost on top of the rental?

Only the compute it uses, from your Bytewells credit. Test runs used $0.0003 to $0.0004 each.

Support

CleanScrape maintains this Actor for one-off exports and recurring workflows, and updates it when the stores change. If you get fewer reviews than expected, check RUN_REPORT first: the store limits above are the most common reason. If something looks wrong, email [email protected] with the run ID, the app links, the country and the review limit. Never include API tokens or private data.

Disclaimer

This Actor is an independent tool developed by CleanScrape. It is not affiliated with, endorsed by, or sponsored by Apple, Google, or the developers of the apps used in its examples. Apple, App Store, Google Play and all other trademarks are the property of their respective owners. Brand names are used only to identify supported sources and illustrate usage.

More tools from CleanScrape

FAQ

Is there an API for App Store and Google Play reviews?
Apple and Google only give app owners access to reviews of their own apps. This Actor reads the public reviews of any app and returns the same columns for both stores.
How do I get only new 1- and 2-star reviews every day?
Choose 1 and 2 under Star ratings, give the run a watch name and schedule it daily. Each run saves only reviews that earlier runs with that name did not return.
How many reviews can I get?
Apple's public feed covers about the 500 most recent reviews per app and country. Google Play can go further back, but the full history is not guaranteed.
Why a 7-day trial?
A daily alert shows its value over several days, so the trial leaves room for a week of checks.
What does a run cost on top of the rental?
Only the compute it uses, from your Bytewells credit. Test runs used $0.0003 to $0.0004 each.

More Actors from the same publisher.

View all from @cleanscrape