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
- 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.
- Choose Store: Both, Google Play or App Store.
- Pick a Country and, for Google Play, a Language.
- 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.
- 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:
| Store | Rating | Review | Date (UTC) | App version |
|---|
| google_play | 1 | does not work offline | 2026-10-01 13:50:30 | 482.12 |
| app_store | 1 | Connection issue: Strava keeps disconnecting from my apple watch | 2026-10-01 00:06:13 | 483.0.0 |
| app_store | 4 | Great: Great just some of the numbers change slightly between apple workout and Strava when importing recordings | 2026-09-30 00:09:16 | 482.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 want | What to enter |
|---|
| Google Play reviews | Select Google Play and fill in Google Play app. |
| App Store reviews | Select App Store and fill in App Store app. |
| Both stores | Select 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 enter | Read as |
|---|
play.google.com/store/apps/details?id=com.strava or com.strava | That Google Play app |
apps.apple.com/us/app/strava-run-bike-walk/id426826309, id426826309 or 426826309 | That App Store app |
Strava | The 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
| Field | API default | Meaning |
|---|
store | both | both, google_play or app_store |
googlePlayAppId | None | Google Play link, package name or app name |
appStoreId | None | App Store link, app number or app name |
country | us | Storefront country for both stores |
language | en | Google Play language parameter |
maxReviews | 200 | Upper limit per selected store |
sort | newest | Google Play: newest, rating or helpfulness (shown as Most relevant) |
ratings | all five | Star ratings to keep, for example ["1", "2"] |
reviewsSince | None | Keep 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 |
watchName | None | Save 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.
| Field | Meaning |
|---|
source | google_play or app_store |
appId | Resolved app identifier, also when you entered an app-page URL |
reviewId | Source review identifier, when available |
userName | Public reviewer display name |
rating | Star rating, usually 1-5 |
title | Apple review title; null for Google Play |
text | Review text |
date | UTC time: Google Play review time, or Apple's review update time |
thumbsUp | Helpful votes shown by the source |
appVersion | App version the review was written for |
developerReply | Google Play reply text when available; null for Apple |
developerReplyDate | Google Play reply time in UTC; null for Apple |
country | Requested storefront, not the reviewer's verified location |
language | Requested Google Play language, not the detected text language; null for Apple |
url | App 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:
- Enter the app, keep Both stores or pick one, and choose 1 and 2 under Star ratings.
- 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.
- 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
- Google Trends Scraper API for Interest Over Time: search interest over time, by region, related queries and trending searches
- Economic Calendar API for Official Release Dates: release dates and times for CPI, jobs, GDP and central bank decisions in five economies
- Career Page Jobs Scraper for Workday, Greenhouse and Lever: open jobs from company career pages, with salaries and new or closed jobs
- Whatnot Scraper for Listings and Live Shows: Whatnot listings with prices and sellers, live shows, and alerts for new listings
- Whatnot Seller Tracker for Top Sellers and Sales: top Whatnot sellers per category, items sold, sales per day and followers over time
- Google Flights Scraper and Fare Tracker: flight prices, airlines, stops and times for your routes and dates, with only new or cheaper flights
- Shopify Product Reviews Scraper for Judge.me and Okendo: Judge.me and Okendo reviews from Shopify product, collection or store links
- Flashscore Tennis Scraper for Tennis Matches and Stats: tennis results, statistics, point-by-point, form and head-to-head
- ATP and WTA Tennis Rankings Scraper: current ATP and WTA singles, doubles and race rankings with points and movement
- Google News Scraper and RSS Feed Reader: Google News searches, sections and publisher feeds, with only new articles on a schedule
- Google Hotels Scraper for Google Travel Hotel Prices: hotel prices and every booking offer for your dates, adults and currency
- Telegram Channel Messages Scraper with Comments: public Telegram channel posts with views, reactions and comments, and only new posts on a schedule